From 7f62b68a3ab8b4d17294444563988b382b9600c5 Mon Sep 17 00:00:00 2001 From: Donghyun Lee Date: Fri, 4 Sep 2015 12:46:26 +0900 Subject: [PATCH] LB reviewed and updated --- .../html/common_tools/certificate_registration.htm | 2 +- .../html/common_tools/connection_explorer.htm | 2 +- org.tizen.devtools/html/common_tools/emulator.htm | 59 +- .../html/common_tools/emulator_features.htm | 23 +- .../html/common_tools/event_injec.htm | 42 +- .../html/common_tools/keyboard_shortcuts.htm | 141 +- org.tizen.devtools/html/common_tools/log_view.htm | 2 +- .../html/common_tools/project_explorer.htm | 2 +- .../html/common_tools/smart_dev_bridge.htm | 2 +- .../html/common_tools/smart_launch.htm | 2 +- .../html/common_tools/tools_common.htm | 24 +- org.tizen.devtools/html/cover_page.htm | 4 +- org.tizen.devtools/html/images/Thumbs.db | Bin 0 -> 3072 bytes .../html/images/fallback_directory.png | Bin 0 -> 28762 bytes .../html/images/fallback_folding.png | Bin 0 -> 817 bytes .../html/images/fallback_hierarchy.png | Bin 0 -> 49835 bytes org.tizen.devtools/html/images/fallback_icon.png | Bin 0 -> 992 bytes org.tizen.devtools/html/images/fallback_lists.png | Bin 0 -> 46542 bytes org.tizen.devtools/html/images/fallback_output.png | Bin 0 -> 15795 bytes .../html/images/fallback_resmanager.png | Bin 0 -> 31353 bytes org.tizen.devtools/html/images/fallback_resxml.png | Bin 0 -> 55011 bytes .../html/images/fallback_tablist.png | Bin 0 -> 984 bytes org.tizen.devtools/html/images/mn_division.png | Bin 113082 -> 163492 bytes org.tizen.devtools/html/images/mobile_s_n.png | Bin 0 -> 2070 bytes org.tizen.devtools/html/images/mobile_s_w.png | Bin 0 -> 2183 bytes org.tizen.devtools/html/images/mobile_s_wn.png | Bin 0 -> 2349 bytes org.tizen.devtools/html/images/mw_division.png | Bin 112882 -> 163486 bytes org.tizen.devtools/html/images/n_division.png | Bin 113082 -> 163502 bytes org.tizen.devtools/html/images/nuib_ui_builder.png | Bin 247667 -> 202039 bytes org.tizen.devtools/html/images/nuib_we_editor.png | Bin 59554 -> 75592 bytes .../html/images/potential_bug_result.png | Bin 188496 -> 152967 bytes .../html/images/properties_go_to_1.png | Bin 29907 -> 53864 bytes .../html/images/properties_specification_1.png | Bin 40914 -> 70824 bytes .../html/images/storyboard_add_new.png | Bin 0 -> 73039 bytes .../html/images/storyboard_codegen.png | Bin 0 -> 75074 bytes .../html/images/storyboard_conn_properties.png | Bin 0 -> 32166 bytes .../html/images/storyboard_contextmenu.png | Bin 0 -> 17437 bytes .../html/images/storyboard_diagram.png | Bin 0 -> 97817 bytes org.tizen.devtools/html/images/storyboard_drag.png | Bin 0 -> 15402 bytes .../html/images/storyboard_properties.png | Bin 0 -> 50209 bytes .../html/images/storyboard_wizard.png | Bin 0 -> 126950 bytes org.tizen.devtools/html/images/w_division.png | Bin 113087 -> 163496 bytes org.tizen.devtools/html/images/wearable_s_n.png | Bin 0 -> 2564 bytes org.tizen.devtools/html/images/wearable_s_w.png | Bin 0 -> 2652 bytes org.tizen.devtools/html/images/wearable_s_wn.png | Bin 0 -> 2826 bytes org.tizen.devtools/html/images/wn_division.png | Bin 26903 -> 163496 bytes org.tizen.devtools/html/images/ww_division.png | Bin 112882 -> 163490 bytes org.tizen.devtools/html/index.htm | 15 +- .../html/native_tools/api_privilege_checker_n.htm | 2 +- .../html/native_tools/call_stack_view_n.htm | 2 +- .../html/native_tools/command_line_interface_n.htm | 78 +- .../html/native_tools/content_assist_n.htm | 2 +- .../html/native_tools/da_checkpoint_n.htm | 9 +- org.tizen.devtools/html/native_tools/da_file_n.htm | 10 +- .../html/native_tools/da_network_n.htm | 7 +- .../html/native_tools/da_opengl_n.htm | 9 +- .../html/native_tools/da_overview_n.htm | 2 +- .../html/native_tools/da_range_info_n.htm | 2 +- .../html/native_tools/da_summary_n.htm | 8 +- .../html/native_tools/da_thread_n.htm | 8 +- .../html/native_tools/da_timeline_n.htm | 8 +- .../html/native_tools/da_views_n.htm | 2 +- .../html/native_tools/enventor_n.htm | 29 +- .../html/native_tools/manifest_elements_n.htm | 20 +- .../html/native_tools/manifest_text_editor_n.htm | 241 ++- .../html/native_tools/po_file_editor_n.htm | 23 +- .../html/native_tools/project_conversion_n.htm | 191 +- .../html/native_tools/project_wizard_n.htm | 2 +- .../html/native_tools/resource_explorer_n.htm | 237 +++ .../html/native_tools/static_analyzer_n.htm | 104 +- .../html/native_tools/storyboard_n.htm | 104 + org.tizen.devtools/html/native_tools/t_trace_n.htm | 25 +- org.tizen.devtools/html/native_tools/tools_n.htm | 38 +- .../html/native_tools/uibuilder_n.htm | 52 +- .../html/native_tools/valgrind_n.htm | 2 +- .../html/web_tools/code_beautifier_w.htm | 2 +- .../html/web_tools/code_minifier_w.htm | 2 +- .../html/web_tools/command_line_interface_w.htm | 57 +- .../html/web_tools/config_editor_w.htm | 298 +-- .../html/web_tools/content_assist_w.htm | 2 +- org.tizen.devtools/html/web_tools/css_editor_w.htm | 2 +- .../html/web_tools/css_preview_w.htm | 2 +- .../html/web_tools/html_editor_w.htm | 2 +- .../html/web_tools/html_preview_w.htm | 2 +- .../html/web_tools/js_analyzer_w.htm | 2 +- org.tizen.devtools/html/web_tools/js_editor_w.htm | 2 +- .../html/web_tools/js_log_console_w.htm | 33 +- .../html/web_tools/live_editing_w.htm | 14 +- .../html/web_tools/privilege_checker_w.htm | 2 +- .../html/web_tools/project_wizard_w.htm | 2 +- .../html/web_tools/rest_viewer_w.htm | 2 +- .../html/web_tools/set_ide_preference_w.htm | 2 +- org.tizen.devtools/html/web_tools/tools_w.htm | 23 +- .../html/web_tools/web_inspector_w.htm | 2 +- .../html/web_tools/web_simulator_features_w.htm | 2 +- .../html/web_tools/web_simulator_w.htm | 8 +- .../html/web_tools/web_unit_test_tool_w.htm | 2 +- org.tizen.devtools/index.xml | 11 +- org.tizen.gettingstarted/META-INF/MANIFEST.MF | 2 +- org.tizen.gettingstarted/html/cover_page.htm | 8 +- .../html/images/mn_division.png | Bin 113082 -> 163492 bytes .../html/images/mobile_s_n.png | Bin 0 -> 2070 bytes .../html/images/mobile_s_w.png | Bin 0 -> 2183 bytes .../html/images/mobile_s_w_optional.png | Bin 0 -> 2021 bytes .../html/images/mobile_s_wn.png | Bin 0 -> 2349 bytes .../html/images/mw_division.png | Bin 112882 -> 163486 bytes .../html/images/n_division.png | Bin 113082 -> 163502 bytes .../html/images/nuib_cadvl_wysiwyg_editor.png | Bin 88045 -> 105268 bytes .../html/images/w_division.png | Bin 113087 -> 163496 bytes .../html/images/wearable_s_n.png | Bin 0 -> 2564 bytes .../html/images/wearable_s_w.png | Bin 0 -> 2652 bytes .../html/images/wearable_s_w_optional.png | Bin 0 -> 2454 bytes .../html/images/wearable_s_wn.png | Bin 0 -> 2826 bytes .../html/images/wn_division.png | Bin 26903 -> 163496 bytes .../html/images/ww_division.png | Bin 112882 -> 163490 bytes org.tizen.gettingstarted/html/index.htm | 4 +- .../html/native/app_model/application_model_n.htm | 4 +- .../html/native/cover_page_n.htm | 2 +- .../html/native/details/app_filtering_n.htm | 419 +++- .../html/native/details/details_n.htm | 2 +- .../html/native/details/error_handling_n.htm | 2 +- .../html/native/details/event_handling_n.htm | 11 +- .../html/native/details/io_overview_n.htm | 2 +- .../html/native/details/sec_privileges_n.htm | 18 +- .../html/native/details/tizen_apis_n.htm | 234 +-- .../html/native/first_app/first_app_n.htm | 6 +- .../html/native/process/app_dev_process_n.htm | 141 +- .../html/native/process/building_app_n.htm | 2 +- .../html/native/process/debugging_app_n.htm | 2 +- .../html/native/process/designing_app_ui_n.htm | 42 +- .../html/native/process/performance_n.htm | 2 +- .../html/native/process/running_app_n.htm | 2 +- .../html/native/process/setting_properties_n.htm | 8 +- org.tizen.gettingstarted/html/preface.htm | 32 +- org.tizen.gettingstarted/html/tizen_websites.htm | 2 +- .../html/web/app_model/application_model_w.htm | 2 +- org.tizen.gettingstarted/html/web/cover_page_w.htm | 2 +- .../html/web/details/app_filtering_w.htm | 157 +- .../html/web/details/details_w.htm | 2 +- .../html/web/details/event_handling_w.htm | 23 +- .../html/web/details/sec_privileges_w.htm | 36 +- .../html/web/details/tizen_apis_w.htm | 12 +- .../html/web/details/web_runtime_w.htm | 2 +- .../html/web/first_app/first_app_w.htm | 2 +- .../html/web/process/app_dev_process_w.htm | 123 +- .../html/web/process/coding_app_w.htm | 2 +- .../html/web/process/creating_app_project_w.htm | 2 +- .../html/web/process/run_debug_app_w.htm | 24 +- .../html/web/process/setting_properties_w.htm | 2 +- org.tizen.gettingstarted/index.xml | 2 +- .../html/images/common_appcontrol_browser.png | Bin 0 -> 43349 bytes .../html/images/common_appcontrol_browser2.png | Bin 0 -> 92718 bytes .../html/images/common_appcontrol_calendar.png | Bin 0 -> 35152 bytes .../html/images/common_appcontrol_calendar2.png | Bin 0 -> 22508 bytes .../html/images/common_appcontrol_calendar3.png | Bin 0 -> 22184 bytes .../html/images/common_appcontrol_calendar4.png | Bin 0 -> 24954 bytes .../html/images/common_appcontrol_call1.png | Bin 0 -> 26179 bytes .../html/images/common_appcontrol_call2.png | Bin 0 -> 34933 bytes .../html/images/common_appcontrol_contact_add.png | Bin 0 -> 27358 bytes .../html/images/common_appcontrol_contact_edit.png | Bin 0 -> 31488 bytes .../images/common_appcontrol_contact_select.png | Bin 0 -> 32989 bytes .../images/common_appcontrol_contact_view1.png | Bin 0 -> 45138 bytes .../images/common_appcontrol_contact_view2.png | Bin 0 -> 27053 bytes .../html/images/common_appcontrol_email.png | Bin 0 -> 40391 bytes .../html/images/common_appcontrol_email2.png | Bin 0 -> 39909 bytes .../html/images/common_appcontrol_email3.png | Bin 0 -> 50796 bytes .../html/images/common_appcontrol_email4.png | Bin 0 -> 38723 bytes .../html/images/common_appcontrol_message.png | Bin 0 -> 7286 bytes .../html/images/common_appcontrol_message2.png | Bin 0 -> 12309 bytes .../html/images/common_appcontrol_message3.png | Bin 0 -> 20685 bytes .../html/images/common_appcontrol_message4.png | Bin 0 -> 12567 bytes .../images/common_appcontrol_system_bluetooth.png | Bin 0 -> 14432 bytes .../images/common_appcontrol_system_bluetooth2.png | Bin 0 -> 14319 bytes .../images/common_appcontrol_system_location.png | Bin 0 -> 19428 bytes .../html/images/common_appcontrol_system_nfc.png | Bin 0 -> 23792 bytes .../images/common_appcontrol_system_setting.png | Bin 0 -> 29905 bytes .../html/images/common_appcontrol_system_wifi.png | Bin 0 -> 18222 bytes org.tizen.guides/html/images/hw_acceleration.png | Bin 0 -> 38895 bytes org.tizen.guides/html/images/key_manager.png | Bin 84486 -> 96388 bytes org.tizen.guides/html/images/mn_division.png | Bin 113082 -> 163492 bytes org.tizen.guides/html/images/mobile_s_n.png | Bin 0 -> 2070 bytes org.tizen.guides/html/images/mobile_s_w.png | Bin 0 -> 2183 bytes .../html/images/mobile_s_w_optional.png | Bin 0 -> 2021 bytes org.tizen.guides/html/images/mw_division.png | Bin 112882 -> 163486 bytes org.tizen.guides/html/images/n_division.png | Bin 113082 -> 163502 bytes org.tizen.guides/html/images/shortcut.png | Bin 0 -> 167461 bytes org.tizen.guides/html/images/w_division.png | Bin 113087 -> 163496 bytes org.tizen.guides/html/images/wearable_s_n.png | Bin 0 -> 2564 bytes org.tizen.guides/html/images/wearable_s_w.png | Bin 0 -> 2652 bytes .../html/images/wearable_s_w_optional.png | Bin 0 -> 2454 bytes org.tizen.guides/html/images/wn_division.png | Bin 26903 -> 163496 bytes org.tizen.guides/html/images/ww_division.png | Bin 112882 -> 163490 bytes org.tizen.guides/html/index.htm | 43 +- .../html/native/account/account_guide_n.htm | 15 +- .../html/native/account/account_manager_n.htm | 356 ++++ org.tizen.guides/html/native/account/oauth2_n.htm | 12 +- .../html/native/account/sync_manager_n.htm | 199 +- org.tizen.guides/html/native/app/alarm_n.htm | 61 + org.tizen.guides/html/native/app/app_guide_n.htm | 13 +- org.tizen.guides/html/native/app/app_manager_n.htm | 2 +- org.tizen.guides/html/native/app/appcontrol_n.htm | 448 +++++ org.tizen.guides/html/native/app/application_n.htm | 756 +------ org.tizen.guides/html/native/app/badge_n.htm | 7 +- org.tizen.guides/html/native/app/bundle_n.htm | 2 +- .../html/native/app/common_appcontrol_n.htm | 1701 ++++++++++++++++ .../html/native/app/data_control_n.htm | 8 +- org.tizen.guides/html/native/app/event_n.htm | 384 ++++ .../html/native/app/internationalization_n.htm | 293 +++ .../html/native/app/message_port_n.htm | 2 +- .../html/native/app/notification_n.htm | 23 +- org.tizen.guides/html/native/app/package_n.htm | 2 +- org.tizen.guides/html/native/app/service_app_n.htm | 12 +- org.tizen.guides/html/native/app/shortcut_n.htm | 23 +- org.tizen.guides/html/native/app/watch_n.htm | 13 +- org.tizen.guides/html/native/app/widget_n.htm | 2 +- org.tizen.guides/html/native/base/base_guide_n.htm | 2 +- org.tizen.guides/html/native/base/i18n_n.htm | 100 +- .../html/native/content/content_guide_n.htm | 2 +- .../html/native/content/download_n.htm | 13 +- .../html/native/content/media_content_n.htm | 2 +- .../html/native/content/mime_type_n.htm | 2 +- .../html/native/context/activity_recognition_n.htm | 2 +- .../html/native/context/context_guide_n.htm | 2 +- .../html/native/context/gesture_recognition_n.htm | 24 +- org.tizen.guides/html/native/context/history_n.htm | 13 +- org.tizen.guides/html/native/context/trigger_n.htm | 19 +- org.tizen.guides/html/native/graphics/cairo_n.htm | 2 +- .../html/native/graphics/graphics_guide_n.htm | 3 +- .../html/native/graphics/hw_acceleration_n.htm | 92 + .../html/native/graphics/opengles_n.htm | 184 +- org.tizen.guides/html/native/graphics/tbm_n.htm | 2 +- org.tizen.guides/html/native/guides_n.htm | 12 +- .../html/native/location/geofence_n.htm | 13 +- .../html/native/location/location_guide_n.htm | 6 +- .../html/native/location/location_n.htm | 62 +- org.tizen.guides/html/native/location/maps_n.htm | 14 +- org.tizen.guides/html/native/messaging/email_n.htm | 13 +- .../html/native/messaging/messages_n.htm | 2 +- .../html/native/messaging/messaging_guide_n.htm | 2 +- org.tizen.guides/html/native/messaging/push_n.htm | 10 +- org.tizen.guides/html/native/migration_guide_n.htm | 145 ++ .../html/native/multimedia/audio_io_n.htm | 2 +- .../html/native/multimedia/camera_n.htm | 2 +- .../html/native/multimedia/image_util_n.htm | 2 +- .../html/native/multimedia/media_codecs_n.htm | 2 +- .../html/native/multimedia/media_controller_n.htm | 2 +- .../html/native/multimedia/media_tools_n.htm | 2 +- .../html/native/multimedia/media_vision_n.htm | 29 +- .../html/native/multimedia/metadata_editor_n.htm | 2 +- .../native/multimedia/metadata_extractor_n.htm | 2 +- .../html/native/multimedia/multimedia_guide_n.htm | 4 +- .../html/native/multimedia/player_n.htm | 2 +- .../html/native/multimedia/radio_n.htm | 2 +- .../html/native/multimedia/recorder_n.htm | 2 +- .../html/native/multimedia/screen_mirroring_n.htm | 23 +- .../html/native/multimedia/sound_manager_n.htm | 2 +- .../html/native/multimedia/thumbnail_util_n.htm | 2 +- .../html/native/multimedia/tone_player_n.htm | 2 +- .../html/native/multimedia/video_util_n.htm | 13 +- .../html/native/multimedia/wav_player_n.htm | 2 +- .../html/native/network/bluetooth_n.htm | 8 +- .../html/native/network/connection_n.htm | 13 +- .../html/native/network/network_guide_n.htm | 15 +- org.tizen.guides/html/native/network/nfc_n.htm | 4 +- .../html/native/network/smartcard_n.htm | 20 +- .../html/native/network/wifi_direct_n.htm | 13 +- org.tizen.guides/html/native/network/wifi_n.htm | 2 +- .../html/native/security/key_manager_n.htm | 6 +- .../html/native/security/privilege_n.htm | 2 +- .../html/native/security/security_guide_n.htm | 2 +- org.tizen.guides/html/native/social/calendar_n.htm | 463 +++-- org.tizen.guides/html/native/social/contact_n.htm | 28 +- .../html/native/social/service_adaptor_n.htm | 5 +- .../html/native/social/social_guide_n.htm | 16 +- org.tizen.guides/html/native/system/device_n.htm | 2 +- org.tizen.guides/html/native/system/dlog_n.htm | 15 +- .../html/native/system/media_keys_n.htm | 2 +- .../html/native/system/runtime_info_n.htm | 2 +- org.tizen.guides/html/native/system/sensors_n.htm | 2 +- org.tizen.guides/html/native/system/settings_n.htm | 9 +- org.tizen.guides/html/native/system/storage_n.htm | 2 +- org.tizen.guides/html/native/system/sysinfo_n.htm | 77 +- .../html/native/system/system_guide_n.htm | 2 +- org.tizen.guides/html/native/system/t-trace_n.htm | 2 +- .../html/native/telephony/phonenumber_util_n.htm | 2 +- .../html/native/telephony/telephony_guide_n.htm | 2 +- .../html/native/telephony/telephony_info_n.htm | 2 +- org.tizen.guides/html/native/ui/eom_n.htm | 2 +- org.tizen.guides/html/native/ui/minicontrol_n.htm | 76 + org.tizen.guides/html/native/ui/ui_guide_n.htm | 5 +- org.tizen.guides/html/native/uix/ime_n.htm | 2 +- org.tizen.guides/html/native/uix/stt_n.htm | 2 +- org.tizen.guides/html/native/uix/tts_n.htm | 2 +- org.tizen.guides/html/native/uix/uix_guide_n.htm | 2 +- .../html/native/uix/voicecontrol_elm_n.htm | 2 +- .../html/native/uix/voicecontrol_guide_n.htm | 2 +- .../html/native/uix/voicecontrol_n.htm | 2 +- org.tizen.guides/html/native/web/web_guide_n.htm | 4 +- org.tizen.guides/html/web/guides_w.htm | 22 +- .../html/web/tizen/application/alarm_w.htm | 14 +- .../html/web/tizen/application/app_guide_w.htm | 4 +- .../html/web/tizen/application/appgroup_w.htm | 15 +- .../html/web/tizen/application/application_w.htm | 110 +- .../html/web/tizen/application/data_w.htm | 13 +- .../html/web/tizen/application/package_w.htm | 14 +- .../html/web/tizen/communication/bluetooth_w.htm | 14 +- .../html/web/tizen/communication/comm_guide_w.htm | 2 +- .../html/web/tizen/communication/messaging_w.htm | 13 +- .../html/web/tizen/communication/nfc_w.htm | 15 +- .../html/web/tizen/communication/push_w.htm | 16 +- .../web/tizen/communication/secure_element_w.htm | 15 +- .../html/web/tizen/content/content_guide_w.htm | 2 +- .../html/web/tizen/content/content_w.htm | 14 +- .../html/web/tizen/content/download_w.htm | 14 +- org.tizen.guides/html/web/tizen/content/exif_w.htm | 15 +- org.tizen.guides/html/web/tizen/guides_tizen_w.htm | 34 +- org.tizen.guides/html/web/tizen/ime/ime_w.htm | 13 +- .../html/web/tizen/input_output/archive_w.htm | 14 +- .../html/web/tizen/input_output/filesystem_w.htm | 14 +- .../html/web/tizen/input_output/io_guide_w.htm | 2 +- .../html/web/tizen/input_output/message_port_w.htm | 15 +- .../html/web/tizen/localization/localization_w.htm | 4 +- .../web/tizen/multimedia/media_controller_w.htm | 14 +- .../html/web/tizen/multimedia/media_key_w.htm | 14 +- .../web/tizen/multimedia/multimedia_guide_w.htm | 2 +- .../html/web/tizen/multimedia/sound_w.htm | 14 +- .../html/web/tizen/service/service_w.htm | 13 +- .../html/web/tizen/social/account_w.htm | 13 +- .../html/web/tizen/social/bookmark_w.htm | 13 +- .../html/web/tizen/social/calendar_w.htm | 13 +- .../html/web/tizen/social/call_history_w.htm | 13 +- .../html/web/tizen/social/contact_w.htm | 13 +- .../html/web/tizen/social/data_sync_w.htm | 29 +- .../html/web/tizen/social/social_guide_w.htm | 13 +- .../html/web/tizen/system/fm_radio_w.htm | 13 +- org.tizen.guides/html/web/tizen/system/ham_w.htm | 14 +- org.tizen.guides/html/web/tizen/system/power_w.htm | 14 +- .../html/web/tizen/system/sensor_w.htm | 14 +- .../html/web/tizen/system/system_guide_w.htm | 2 +- .../html/web/tizen/system/system_info_w.htm | 14 +- .../html/web/tizen/system/system_setting_w.htm | 14 +- org.tizen.guides/html/web/tizen/system/time_w.htm | 15 +- .../html/web/tizen/system/web_setting_w.htm | 13 +- .../html/web/tizen/tizen/tizen_guide_w.htm | 21 +- org.tizen.guides/html/web/tizen/ui/badge_w.htm | 14 +- org.tizen.guides/html/web/tizen/ui/noti_w.htm | 15 +- org.tizen.guides/html/web/tizen/ui/ui_guide_w.htm | 2 +- .../html/web/w3c/communication/comm_guide_w.htm | 4 +- .../html/web/w3c/communication/server_sent_w.htm | 13 +- .../html/web/w3c/communication/web_messaging_w.htm | 2 +- .../html/web/w3c/communication/websocket_w.htm | 2 +- .../web/w3c/communication/xmlhttprequest_w.htm | 8 +- org.tizen.guides/html/web/w3c/device/battery_w.htm | 2 +- .../html/web/w3c/device/browser_state_w.htm | 13 +- .../html/web/w3c/device/device_guide_w.htm | 2 +- .../html/web/w3c/device/device_orientation_w.htm | 2 +- .../html/web/w3c/device/screen_orientation_w.htm | 13 +- org.tizen.guides/html/web/w3c/device/touch_w.htm | 2 +- .../html/web/w3c/device/vibration_w.htm | 2 +- .../html/web/w3c/graphics/canvas_w.htm | 6 +- .../html/web/w3c/graphics/graphics_guide_w.htm | 2 +- org.tizen.guides/html/web/w3c/graphics/svg_w.htm | 2 +- org.tizen.guides/html/web/w3c/guides_w3c_w.htm | 4 +- .../html/web/w3c/location/geolocation_w.htm | 24 +- .../html/web/w3c/location/location_guide_w.htm | 2 +- .../html/web/w3c/media/getusermedia_w.htm | 2 +- .../html/web/w3c/media/media_capture_w.htm | 13 +- .../html/web/w3c/media/media_guide_w.htm | 2 +- .../html/web/w3c/media/video_audio_w.htm | 2 +- org.tizen.guides/html/web/w3c/media/webaudio_w.htm | 13 +- .../perf_opt/jquery_performance_improvement_w.htm | 2 +- .../w3c/perf_opt/js_performance_improvement_w.htm | 2 +- .../html/web/w3c/perf_opt/minify_js_css_w.htm | 2 +- org.tizen.guides/html/web/w3c/perf_opt/page_w.htm | 2 +- .../html/web/w3c/perf_opt/performance_guide_w.htm | 2 +- .../html/web/w3c/perf_opt/timing_control_w.htm | 2 +- .../html/web/w3c/perf_opt/web_workers_w.htm | 24 +- org.tizen.guides/html/web/w3c/security/cors_w.htm | 2 +- .../html/web/w3c/security/iframe_w.htm | 2 +- .../html/web/w3c/security/security_guide_w.htm | 5 +- .../html/web/w3c/storage/appcache_w.htm | 13 +- org.tizen.guides/html/web/w3c/storage/file_w.htm | 2 +- .../html/web/w3c/storage/indexdb_w.htm | 2 +- .../html/web/w3c/storage/storage_guide_w.htm | 2 +- .../html/web/w3c/storage/web_storage_w.htm | 2 +- org.tizen.guides/html/web/w3c/storage/websql_w.htm | 15 +- .../html/web/w3c/supplement/camera_w.htm | 13 +- .../html/web/w3c/supplement/fullscreen_w.htm | 13 +- .../html/web/w3c/supplement/supplement_guide_w.htm | 2 +- .../html/web/w3c/supplement/typedarray_w.htm | 2 +- .../html/web/w3c/supplement/webgl_w.htm | 2 +- .../html/web/w3c/useful/performance_w.htm | 13 +- .../html/web/w3c/useful/sound_policy_w.htm | 4 +- .../html/web/w3c/useful/useful_guide_w.htm | 2 +- org.tizen.guides/index.xml | 39 +- org.tizen.sampledescriptions/META-INF/MANIFEST.MF | 2 +- org.tizen.sampledescriptions/html/cover_page.htm | 2 +- .../html/images/bundle_data_sink_view_sd.png | Bin 15187 -> 16856 bytes .../images/bundle_data_source_basic_view_sd.png | Bin 9165 -> 20302 bytes .../images/bundle_data_source_filled_view_sd.png | Bin 11214 -> 20415 bytes .../html/images/mediacontrol_client_sd.png | Bin 0 -> 191236 bytes .../html/images/mediacontrol_server_sd.png | Bin 0 -> 18068 bytes .../html/images/messageport_data_sink_view_sd.png | Bin 0 -> 24915 bytes .../images/messageport_data_source_view_sd.png | Bin 0 -> 9985 bytes .../messageport_edje_layout_data_sink_sd.png | Bin 0 -> 9748 bytes .../messageport_edje_layout_data_source_sd.png | Bin 0 -> 14545 bytes .../images/messageport_edje_layout_main_sd.png | Bin 0 -> 11807 bytes .../messageport_edje_structure_data_sink_sd.png | Bin 0 -> 18873 bytes .../messageport_edje_structure_data_source_sd.png | Bin 0 -> 22423 bytes .../images/messageport_ui_layout_data_sink_sd.png | Bin 0 -> 3890 bytes .../messageport_ui_layout_data_source_sd.png | Bin 0 -> 4945 bytes .../html/images/messageport_ui_layout_main_sd.png | Bin 0 -> 9407 bytes .../messageport_ui_structure_data_sink_sd.png | Bin 0 -> 3939 bytes .../messageport_ui_structure_data_source_sd.png | Bin 0 -> 6074 bytes .../messageport_workflow_message_structure_sd.png | Bin 0 -> 3867 bytes .../images/messageport_workflow_startup_sd.png | Bin 0 -> 14302 bytes .../messageport_workflow_text_receive_sd.png | Bin 0 -> 24043 bytes .../images/messageport_workflow_text_send_sd.png | Bin 0 -> 18177 bytes .../html/images/mn_division.png | Bin 113082 -> 163492 bytes .../html/images/mobile_s_n.png | Bin 0 -> 2070 bytes .../html/images/mobile_s_w.png | Bin 0 -> 2183 bytes .../html/images/mobile_s_wn.png | Bin 0 -> 2349 bytes .../html/images/mw_division.png | Bin 112882 -> 163486 bytes .../html/images/n_division.png | Bin 113082 -> 163502 bytes .../html/images/uicomponent_mobile.png | Bin 35813 -> 18630 bytes .../html/images/w_division.png | Bin 113087 -> 163496 bytes .../html/images/wearable_s_n.png | Bin 0 -> 2564 bytes .../html/images/wearable_s_w.png | Bin 0 -> 2652 bytes .../html/images/wearable_s_wn.png | Bin 0 -> 2826 bytes .../html/images/wn_division.png | Bin 26903 -> 163496 bytes .../html/images/ww_division.png | Bin 112882 -> 163490 bytes org.tizen.sampledescriptions/html/index.htm | 7 +- .../html/mobile_n/application_control_sd_mn.htm | 28 +- .../html/mobile_n/bluetoothchat_sd_mn.htm | 161 +- .../html/mobile_n/bundle_sd_mn.htm | 2 +- .../html/mobile_n/cairo_basic_sd_mn.htm | 2 +- .../html/mobile_n/cairo_evasgl_sd_mn.htm | 2 +- .../html/mobile_n/calculator_sd_mn.htm | 2 +- .../html/mobile_n/contacts_sd_mn.htm | 12 +- .../html/mobile_n/evas_gl_sd_mn.htm | 53 +- .../html/mobile_n/file_manager_sd_mn.htm | 2 +- .../html/mobile_n/glview11_cube_sd_mn.htm | 14 +- .../html/mobile_n/glview_cube_sd_mn.htm | 26 +- .../html/mobile_n/glview_shader_sd_mn.htm | 38 +- .../html/mobile_n/gps_consumer_sd_mn.htm | 16 +- .../html/mobile_n/gps_service_sd_mn.htm | 6 +- .../html/mobile_n/hybridservice_sd_mn.htm | 2 +- .../html/mobile_n/lockscreen_sd_mn.htm | 89 +- .../html/mobile_n/mediaapp_sd_mn.htm | 299 +-- .../html/mobile_n/mediacontroller_client_sd_mn.htm | 174 ++ .../html/mobile_n/mediacontroller_server_sd_mn.htm | 163 ++ .../html/mobile_n/messageport_sd_mn.htm | 945 +++++++++ .../html/mobile_n/notificationmanager_sd_mn.htm | 2 +- .../html/mobile_n/paint_sd_mn.htm | 4 +- .../html/mobile_n/pedometer_sd_mn.htm | 2 +- .../html/mobile_n/piano_sd_mn.htm | 2 +- .../html/mobile_n/preference_sd_mn.htm | 2 +- .../html/mobile_n/puzzle_sd_mn.htm | 29 +- .../html/mobile_n/scheduler_sd_mn.htm | 2 +- .../html/mobile_n/scroller_index_sd_mn.htm | 14 +- .../html/mobile_n/sd_mn.htm | 22 +- .../html/mobile_n/selfcamera_sd_mn.htm | 30 +- .../html/mobile_n/sensorapp_sd_mn.htm | 6 +- .../html/mobile_n/simple_home_sd_mn.htm | 2 +- .../html/mobile_n/sketch_sd_mn.htm | 106 +- .../html/mobile_n/stopwatch_sd_mn.htm | 28 +- .../html/mobile_n/systeminfo_sd_mn.htm | 57 +- .../html/mobile_n/taskmanager_sd_mn.htm | 2 +- .../html/mobile_n/ui_alignment_sd_mn.htm | 2 +- .../html/mobile_n/ui_animation_sd_mn.htm | 2 +- .../html/mobile_n/ui_animator_sd_mn.htm | 40 +- .../html/mobile_n/ui_app_store_sd_mn.htm | 2 +- .../html/mobile_n/ui_box_sd_mn.htm | 2 +- .../html/mobile_n/ui_calculator_sd_mn.htm | 2 +- .../html/mobile_n/ui_clock_sd_mn.htm | 2 +- .../html/mobile_n/ui_components_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecore_thread_1_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecore_thread_2_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecore_thread_3_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecore_thread_4_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecore_thread_5_sd_mn.htm | 2 +- .../html/mobile_n/ui_ecoreevent_sd_mn.htm | 2 +- .../html/mobile_n/ui_edc_format_sd_mn.htm | 2 +- .../html/mobile_n/ui_edc_map_sd_mn.htm | 2 +- .../html/mobile_n/ui_elmtransit_sd_mn.htm | 2 +- .../html/mobile_n/ui_email_sd_mn.htm | 2 +- .../html/mobile_n/ui_evas_map_mapping_sd_mn.htm | 2 +- .../html/mobile_n/ui_evas_map_rotation_sd_mn.htm | 2 +- .../html/mobile_n/ui_evas_map_sd_mn.htm | 2 +- .../html/mobile_n/ui_evasevent_sd_mn.htm | 2 +- .../html/mobile_n/ui_gallery_sd_mn.htm | 2 +- .../html/mobile_n/ui_idler_sd_mn.htm | 2 +- .../html/mobile_n/ui_image_sd_mn.htm | 2 +- .../html/mobile_n/ui_inlist_sd_mn.htm | 2 +- .../html/mobile_n/ui_job_sd_mn.htm | 2 +- .../html/mobile_n/ui_language_change_sd_mn.htm | 2 +- .../html/mobile_n/ui_layout_samples_sd_mn.htm | 2 +- .../html/mobile_n/ui_layout_signal_sd_mn.htm | 2 +- .../html/mobile_n/ui_list_sd_mn.htm | 2 +- .../html/mobile_n/ui_message_bubble_sd_mn.htm | 2 +- .../html/mobile_n/ui_proxy_object_sd_mn.htm | 2 +- .../html/mobile_n/ui_rectangle_sd_mn.htm | 2 +- .../html/mobile_n/ui_relative_sd_mn.htm | 2 +- .../html/mobile_n/ui_setting_sd_mn.htm | 2 +- .../html/mobile_n/ui_sns_sd_mn.htm | 2 +- .../html/mobile_n/ui_stringshare_sd_mn.htm | 2 +- .../html/mobile_n/ui_theme_extension_sd_mn.htm | 2 +- .../html/mobile_n/ui_timer_sd_mn.htm | 2 +- .../html/mobile_n/volume_sd_mn.htm | 2 +- .../html/mobile_w/archivemanager_mw.htm | 2 +- .../html/mobile_w/bluetoothchat_mw.htm | 2 +- .../html/mobile_w/calculator_mw.htm | 2 +- .../html/mobile_w/calendar_mw.htm | 2 +- .../html/mobile_w/calllog_mw.htm | 21 +- .../html/mobile_w/chatter_mw.htm | 23 +- .../html/mobile_w/compass_mw.htm | 2 +- .../html/mobile_w/contactlist_mw.htm | 2 +- .../html/mobile_w/contactsexchanger_mw.htm | 2 +- .../html/mobile_w/downloadmanager_mw.htm | 2 +- .../html/mobile_w/eventmanager_mw.htm | 2 +- .../html/mobile_w/exerciseplanner_mw.htm | 2 +- .../html/mobile_w/filemanager_mw.htm | 2 +- .../html/mobile_w/fmradio_mw.htm | 2 +- .../html/mobile_w/hellotizen_mw.htm | 4 +- .../html/mobile_w/hybridwebapp_mw.htm | 2 +- .../html/mobile_w/mediacontent_mw.htm | 21 +- .../html/mobile_w/moneybook_mw.htm | 2 +- .../mobile_w/multiprocess_hybrid_package_mw.htm | 2 +- .../html/mobile_w/piano_mw.htm | 2 +- .../html/mobile_w/sd_mw.htm | 26 +- .../html/mobile_w/selfcamera_mw.htm | 25 +- .../html/mobile_w/sensorball_mw.htm | 2 +- .../html/mobile_w/soundmanager_mw.htm | 2 +- .../html/mobile_w/systeminfo_mw.htm | 2 +- .../html/mobile_w/touchpaint_mw.htm | 2 +- .../html/mobile_w/uicomponent_mw.htm | 54 +- .../html/wearable_n/analog_watch_sd_wn.htm | 6 +- .../html/wearable_n/bluetoothchat_sd_wn.htm | 98 +- .../html/wearable_n/cairo_basic_sd_wn.htm | 2 +- .../html/wearable_n/cairo_evasgl_sd_wn.htm | 2 +- .../html/wearable_n/circleemail_sd_wn.htm | 2 +- .../html/wearable_n/circlerotarytimer_sd_wn.htm | 4 +- .../html/wearable_n/circlesettings_sd_wn.htm | 2 +- .../html/wearable_n/circlesettingtime_sd_wn.htm | 2 +- .../html/wearable_n/circleuicomponents_sd_wn.htm | 2 +- .../html/wearable_n/digital_watch_sd_wn.htm | 5 +- .../html/wearable_n/evas_gl_sd_wn.htm | 53 +- .../html/wearable_n/glview11_cube_sd_wn.htm | 12 +- .../html/wearable_n/glview_cube_sd_wn.htm | 26 +- .../html/wearable_n/glview_shader_sd_wn.htm | 38 +- .../html/wearable_n/rectemail_sd_wn.htm | 2 +- .../wearable_n/rectnotificationmanager_sd_wn.htm | 27 +- .../html/wearable_n/rectsettings_sd_wn.htm | 2 +- .../html/wearable_n/rectuicomponents_sd_wn.htm | 2 +- .../html/wearable_n/rectuidialer_sd_wn.htm | 2 +- .../html/wearable_n/sd_wn.htm | 4 +- .../html/wearable_n/widget_animation_sd_wn.htm | 2 +- .../html/wearable_w/altimeter_ww.htm | 2 +- .../html/wearable_w/analogwatch_ww.htm | 2 +- .../html/wearable_w/appcalleecaller_ww.htm | 2 +- .../html/wearable_w/basicwatch_ww.htm | 2 +- .../html/wearable_w/calculator_ww.htm | 2 +- .../html/wearable_w/calendar_ww.htm | 2 +- .../html/wearable_w/camera_ww.htm | 2 +- .../html/wearable_w/compass_ww.htm | 2 +- .../html/wearable_w/digitalwatch_ww.htm | 2 +- .../html/wearable_w/hellotizen_ww.htm | 2 +- .../html/wearable_w/minigallery_ww.htm | 2 +- .../html/wearable_w/moneybook_ww.htm | 2 +- .../html/wearable_w/newsfeed_ww.htm | 2 +- .../html/wearable_w/sd_ww.htm | 2 +- .../html/wearable_w/sensorball_ww.htm | 2 +- .../html/wearable_w/spinning_arrow_ww.htm | 4 +- .../html/wearable_w/stopwatch_ww.htm | 2 +- .../html/wearable_w/sunburnmonitor_ww.htm | 2 +- .../html/wearable_w/touchpaint_ww.htm | 2 +- .../html/wearable_w/voicerecorder_ww.htm | 2 +- .../html/wearable_w/wearableuicomponents_ww.htm | 4 +- .../html/wearable_w/worldclock_ww.htm | 2 +- org.tizen.sampledescriptions/index.xml | 7 +- org.tizen.tutorials/html/images/mn_division.png | Bin 113082 -> 163492 bytes org.tizen.tutorials/html/images/mobile_s_n.png | Bin 0 -> 2070 bytes org.tizen.tutorials/html/images/mobile_s_w.png | Bin 0 -> 2183 bytes .../html/images/mobile_s_w_optional.png | Bin 0 -> 2021 bytes org.tizen.tutorials/html/images/mw_division.png | Bin 112882 -> 163486 bytes org.tizen.tutorials/html/images/n_division.png | Bin 113082 -> 163502 bytes org.tizen.tutorials/html/images/w_division.png | Bin 113087 -> 163496 bytes org.tizen.tutorials/html/images/wearable_s_n.png | Bin 0 -> 2564 bytes org.tizen.tutorials/html/images/wearable_s_w.png | Bin 0 -> 2652 bytes .../html/images/wearable_s_w_optional.png | Bin 0 -> 2454 bytes org.tizen.tutorials/html/images/wn_division.png | Bin 26903 -> 163496 bytes org.tizen.tutorials/html/images/ww_division.png | Bin 112882 -> 163490 bytes org.tizen.tutorials/html/index.htm | 30 +- .../html/native/account/account_tutorial_n.htm | 951 +++++++++ .../html/native/account/account_tutorials_n.htm | 7 +- .../html/native/account/oauth2_tutorial_n.htm | 72 +- .../native/account/sync_manager_tutorial_n.htm | 206 +- .../html/native/app_framework/alarm_tutorial_n.htm | 361 ++++ .../app_framework/app_framework_tutorials_n.htm | 15 +- .../app_framework/app_manager_tutorial_n.htm | 11 +- .../native/app_framework/appcontrol_tutorial_n.htm | 324 +++ .../app_framework/application_tutorial_n.htm | 656 +----- .../html/native/app_framework/badge_tutorial_n.htm | 96 +- .../native/app_framework/bundle_tutorial_n.htm | 25 +- .../app_framework/data_control_tutorial_n.htm | 120 +- .../html/native/app_framework/event_tutorial_n.htm | 266 +++ .../app_framework/message_port_tutorial_n.htm | 24 +- .../app_framework/notification_tutorial_n.htm | 347 +--- .../native/app_framework/package_tutorial_n.htm | 2 +- .../native/app_framework/preference_tutorial_n.htm | 197 ++ .../app_framework/service_app_tutorial_n.htm | 47 +- .../native/app_framework/shortcut_tutorial_n.htm | 63 +- .../html/native/app_framework/watch_tutorial_n.htm | 77 +- .../native/app_framework/widget_tutorial_n.htm | 68 +- .../html/native/base/base_tutorials_n.htm | 2 +- .../html/native/base/i18n_tutorial_n.htm | 286 +-- .../html/native/base/sqlite_tutorial_n.htm | 46 +- .../html/native/content/content_tutorials_n.htm | 2 +- .../html/native/content/download_tutorial_n.htm | 18 +- .../native/content/media_content_tutorial_n.htm | 186 +- .../html/native/content/mime_type_tutorial_n.htm | 2 +- .../html/native/context/activity_tutorial_n.htm | 7 +- .../html/native/context/context_tutorials_n.htm | 2 +- .../html/native/context/gesture_tutorial_n.htm | 9 +- .../html/native/context/history_tutorial_n.htm | 13 +- .../html/native/context/trigger_tutorial_n.htm | 13 +- .../html/native/graphics/cairo_tutorial_n.htm | 32 +- .../native/graphics/graphic_comp_tutorial_n.htm | 2 +- .../html/native/graphics/graphics_tutorials_n.htm | 2 +- .../html/native/graphics/opengl_tutorial_n.htm | 572 +++--- .../html/native/graphics/tbm_tutorial_n.htm | 8 +- .../html/native/location/geofence_tutorial_n.htm | 23 +- .../html/native/location/location_tutorial_n.htm | 29 +- .../html/native/location/location_tutorials_n.htm | 7 +- .../html/native/location/maps_tutorial_n.htm | 65 +- .../html/native/messaging/email_tutorial_n.htm | 30 +- .../native/messaging/messaging_tutorials_n.htm | 2 +- .../html/native/messaging/push_tutorial_n.htm | 105 +- .../html/native/messaging/sms_mms_tutorial_n.htm | 31 +- .../html/native/multimedia/audio_io_tutorial_n.htm | 2 +- .../html/native/multimedia/camera_tutorial_n.htm | 174 +- .../native/multimedia/image_util_tutorial_n.htm | 2 +- .../native/multimedia/media_codec_tutorial_n.htm | 2 +- .../multimedia/media_controller_tutorial_n.htm | 2 +- .../native/multimedia/media_tools_tutorial_n.htm | 2 +- .../native/multimedia/media_vision_tutorial_n.htm | 40 +- .../multimedia/metadata_editor_tutorial_n.htm | 23 +- .../multimedia/metadata_extractor_tutorial_n.htm | 8 +- .../native/multimedia/multimedia_tutorials_n.htm | 4 +- .../html/native/multimedia/player_tutorial_n.htm | 2 +- .../html/native/multimedia/radio_tutorial_n.htm | 2 +- .../html/native/multimedia/recorder_tutorial_n.htm | 2 +- .../multimedia/screen_mirroring_tutorial_n.htm | 25 +- .../native/multimedia/sound_manager_tutorial_n.htm | 2 +- .../multimedia/thumbnail_util_tutorial_n.htm | 2 +- .../native/multimedia/tone_player_tutorial_n.htm | 2 +- .../native/multimedia/video_util_tutorial_n.htm | 14 +- .../native/multimedia/wav_player_tutorial_n.htm | 2 +- .../html/native/network/bluetooth_tutorial_n.htm | 698 +++---- .../html/native/network/connection_tutorial_n.htm | 4 +- .../html/native/network/network_tutorials_n.htm | 4 +- .../html/native/network/nfc_tutorial_n.htm | 274 ++- .../html/native/network/smartcard_tutorial_n.htm | 14 +- .../html/native/network/wifi_direct_tutorial_n.htm | 13 +- .../html/native/network/wifi_tutorial_n.htm | 2 +- .../html/native/security/key_tutorial_n.htm | 14 +- .../html/native/security/privilege_tutorial_n.htm | 2 +- .../html/native/security/security_tutorials_n.htm | 2 +- .../html/native/social/calendar_tutorial_n.htm | 13 +- .../html/native/social/contact_tutorial_n.htm | 40 +- .../native/social/service_adaptor_tutorial_n.htm | 6 +- .../html/native/social/social_tutorials_n.htm | 24 +- .../html/native/system/device_tutorial_n.htm | 2 +- .../html/native/system/dlog_tutorial_n.htm | 2 +- .../html/native/system/media_key_tutorial_n.htm | 2 +- .../html/native/system/runtime_tutorial_n.htm | 2 +- .../html/native/system/sensor_tutorial_n.htm | 2 +- .../html/native/system/storage_tutorial_n.htm | 2 +- .../html/native/system/sysinfo_tutorial_n.htm | 2 +- .../native/system/system_setting_tutorial_n.htm | 2 +- .../html/native/system/system_tutorials_n.htm | 2 +- .../html/native/system/t-trace_tutorial_n.htm | 4 +- .../telephony/phonenumber_util_tutorial_n.htm | 2 +- .../native/telephony/telephony_info_tutorial_n.htm | 4 +- .../native/telephony/telephony_tutorials_n.htm | 2 +- org.tizen.tutorials/html/native/tutorials_n.htm | 4 +- .../html/native/ui/eom_tutorial_n.htm | 4 +- .../html/native/ui/minicontrol_tutorial_n.htm | 145 ++ .../html/native/ui/ui_tutorials_n.htm | 7 +- .../html/native/uix/ime_tutorial_n.htm | 6 +- .../html/native/uix/stt_tutorial_n.htm | 2 +- .../html/native/uix/tts_tutorial_n.htm | 2 +- .../html/native/uix/uix_tutorials_n.htm | 2 +- .../native/uix/voicecontrol_elm_tutorial_n.htm | 4 +- .../html/native/uix/voicecontrol_tutorial_n.htm | 4 +- .../html/native/uix/voicecontrol_tutorials_n.htm | 2 +- .../html/native/web/web_tutorials_n.htm | 12 +- .../web/tizen/application/alarm_tutorial_w.htm | 18 +- .../html/web/tizen/application/app_tutorials_w.htm | 4 +- .../web/tizen/application/appgroup_tutorial_w.htm | 54 +- .../tizen/application/application_tutorial_w.htm | 116 +- .../html/web/tizen/application/data_tutorial_w.htm | 13 +- .../web/tizen/application/package_tutorial_w.htm | 17 +- .../tizen/communication/bluetooth_tutorial_w.htm | 28 +- .../web/tizen/communication/comm_tutorials_w.htm | 2 +- .../tizen/communication/messaging_tutorial_w.htm | 13 +- .../web/tizen/communication/nfc_tutorial_w.htm | 14 +- .../web/tizen/communication/push_tutorial_w.htm | 15 +- .../communication/secure_element_tutorial_w.htm | 16 +- .../tizen/communication/task_bluetoothchat_w.htm | 2 +- .../web/tizen/communication/task_chatter_w.htm | 2 +- .../communication/task_contactsexchanger_w.htm | 2 +- .../html/web/tizen/content/content_tutorial_w.htm | 14 +- .../html/web/tizen/content/content_tutorials_w.htm | 2 +- .../html/web/tizen/content/download_tutorial_w.htm | 14 +- .../html/web/tizen/content/exif_tutorial_w.htm | 14 +- .../web/tizen/content/task_downloadmanager_w.htm | 2 +- .../html/web/tizen/content/task_mediacontent_w.htm | 2 +- .../web/tizen/input_output/archive_tutorial_w.htm | 14 +- .../tizen/input_output/filesystem_tutorial_w.htm | 14 +- .../html/web/tizen/input_output/io_tutorials_w.htm | 2 +- .../tizen/input_output/message_port_tutorial_w.htm | 14 +- .../web/tizen/input_output/task_filemanager_w.htm | 6 +- .../multimedia/media_controller_tutorial_w.htm | 14 +- .../web/tizen/multimedia/media_key_tutorial_w.htm | 14 +- .../tizen/multimedia/multimedia_tutorials_w.htm | 2 +- .../html/web/tizen/multimedia/sound_tutorial_w.htm | 14 +- .../html/web/tizen/service/service_tutorial_w.htm | 13 +- .../html/web/tizen/social/account_tutorial_w.htm | 13 +- .../html/web/tizen/social/bookmark_tutorial_w.htm | 13 +- .../html/web/tizen/social/calendar_tutorial_w.htm | 13 +- .../web/tizen/social/call_history_tutorial_w.htm | 13 +- .../html/web/tizen/social/contact_tutorial_w.htm | 13 +- .../html/web/tizen/social/data_sync_tutorial_w.htm | 13 +- .../html/web/tizen/social/social_tutorials_w.htm | 13 +- .../html/web/tizen/social/task_calllog_w.htm | 2 +- .../html/web/tizen/social/task_eventmanager_w.htm | 2 +- .../html/web/tizen/system/fm_radio_tutorial_w.htm | 13 +- .../html/web/tizen/system/ham_tutorial_w.htm | 14 +- .../html/web/tizen/system/power_tutorial_w.htm | 14 +- .../html/web/tizen/system/sensor_tutorial_w.htm | 14 +- .../web/tizen/system/system_info_tutorial_w.htm | 16 +- .../web/tizen/system/system_setting_tutorial_w.htm | 14 +- .../html/web/tizen/system/system_tutorials_w.htm | 2 +- .../html/web/tizen/system/task_sensorball_w.htm | 2 +- .../html/web/tizen/system/task_systeminfo_w.htm | 2 +- .../html/web/tizen/system/time_tutorial_w.htm | 15 +- .../web/tizen/system/web_setting_tutorial_w.htm | 13 +- .../html/web/tizen/tizen/tizen_tutorials_w.htm | 14 +- .../html/web/tizen/tutorials_tizen_w.htm | 31 +- .../html/web/tizen/ui/badge_tutorial_w.htm | 14 +- .../html/web/tizen/ui/noti_tutorial_w.htm | 14 +- .../html/web/tizen/ui/ui_tutorials_w.htm | 2 +- org.tizen.tutorials/html/web/tutorials_w.htm | 23 +- .../web/w3c/communication/comm_tutorials_w.htm | 4 +- .../w3c/communication/server_sent_tutorial_w.htm | 13 +- .../w3c/communication/web_messaging_tutorial_w.htm | 2 +- .../web/w3c/communication/websocket_tutorial_w.htm | 2 +- .../communication/xmlhttprequest_tutorial_w.htm | 6 +- .../html/web/w3c/device/battery_tutorial_w.htm | 2 +- .../web/w3c/device/browser_state_tutorial_w.htm | 16 +- .../w3c/device/device_orientation_tutorial_w.htm | 2 +- .../html/web/w3c/device/device_tutorials_w.htm | 2 +- .../w3c/device/screen_orientation_tutorial_w.htm | 14 +- .../html/web/w3c/device/task_compass_w.htm | 4 +- .../html/web/w3c/device/task_touch_paint_mw.htm | 2 +- .../html/web/w3c/device/task_touch_paint_ww.htm | 2 +- .../html/web/w3c/device/touch_tutorial_w.htm | 2 +- .../html/web/w3c/device/vibration_tutorial_w.htm | 2 +- .../html/web/w3c/graphics/canvas_tutorial_w.htm | 2 +- .../html/web/w3c/graphics/graphics_tutorials_w.htm | 2 +- .../html/web/w3c/graphics/svg_tutorial_w.htm | 2 +- .../html/web/w3c/graphics/task_basicwatch_w.htm | 2 +- .../web/w3c/location/geolocation_tutorial_w.htm | 2 +- .../html/web/w3c/location/location_tutorials_w.htm | 2 +- .../html/web/w3c/media/getusermedia_tutorial_w.htm | 2 +- .../web/w3c/media/media_capture_tutorial_w.htm | 13 +- .../html/web/w3c/media/media_tutorials_w.htm | 2 +- .../html/web/w3c/media/task_piano_w.htm | 2 +- .../html/web/w3c/media/task_selfcamera_w.htm | 2 +- .../html/web/w3c/media/video_audio_tutorial_w.htm | 2 +- .../html/web/w3c/media/webaudio_tutorial_w.htm | 13 +- .../html/web/w3c/perf_opt/page_tutorial_w.htm | 2 +- .../web/w3c/perf_opt/performance_tutorials_w.htm | 2 +- .../web/w3c/perf_opt/timing_control_tutorial_w.htm | 2 +- .../web/w3c/perf_opt/web_workers_tutorial_w.htm | 2 +- .../html/web/w3c/security/cors_tutorial_w.htm | 2 +- .../html/web/w3c/security/iframe_tutorial_w.htm | 2 +- .../html/web/w3c/security/security_tutorials_w.htm | 2 +- .../html/web/w3c/storage/appcache_tutorial_w.htm | 13 +- .../html/web/w3c/storage/file_tutorial_w.htm | 2 +- .../html/web/w3c/storage/indexdb_tutorial_w.htm | 2 +- .../html/web/w3c/storage/storage_tutorials_w.htm | 2 +- .../html/web/w3c/storage/websql_tutorial_w.htm | 14 +- .../html/web/w3c/storage/webstorage_tutorial_w.htm | 2 +- .../html/web/w3c/supplement/camera_tutorial_w.htm | 13 +- .../web/w3c/supplement/fullscreen_tutorial_w.htm | 13 +- .../web/w3c/supplement/supplement_tutorials_w.htm | 2 +- .../html/web/w3c/supplement/task_camera_w.htm | 2 +- .../web/w3c/supplement/typedarray_tutorial_w.htm | 2 +- .../html/web/w3c/supplement/webgl_tutorial_w.htm | 2 +- .../html/web/w3c/tutorials_w3c_w.htm | 4 +- .../web/w3c/watchface/developing_watch_app.htm | 13 +- org.tizen.tutorials/index.xml | 28 +- org.tizen.ui.guides/.project | 22 - org.tizen.ui.guides/META-INF/MANIFEST.MF | 7 - org.tizen.ui.guides/build.properties | 8 - org.tizen.ui.guides/html/cover_page.htm | 46 - org.tizen.ui.guides/html/css/snippet.css | 52 - org.tizen.ui.guides/html/css/styles.css | 756 ------- org.tizen.ui.guides/html/images/after_resize.png | Bin 14803 -> 0 bytes org.tizen.ui.guides/html/images/before_resize.png | Bin 7428 -> 0 bytes org.tizen.ui.guides/html/images/dali_threads.png | Bin 24880 -> 0 bytes org.tizen.ui.guides/html/images/mn_division.png | Bin 113082 -> 0 bytes org.tizen.ui.guides/html/images/mw_division.png | Bin 112882 -> 0 bytes org.tizen.ui.guides/html/images/n_division.png | Bin 113082 -> 0 bytes org.tizen.ui.guides/html/images/round_footer.png | Bin 14429 -> 0 bytes .../html/images/round_moreoption.png | Bin 22852 -> 0 bytes org.tizen.ui.guides/html/images/round_multibtn.png | Bin 12745 -> 0 bytes .../html/images/round_processing.png | Bin 11011 -> 0 bytes .../html/images/tizen_project_dali.png | Bin 148580 -> 0 bytes org.tizen.ui.guides/html/images/w_division.png | Bin 113087 -> 0 bytes org.tizen.ui.guides/html/images/wn_division.png | Bin 26903 -> 0 bytes org.tizen.ui.guides/html/images/ww_division.png | Bin 112882 -> 0 bytes org.tizen.ui.guides/html/index.htm | 256 --- org.tizen.ui.guides/html/native/dali/actors_n.htm | 211 -- .../html/native/dali/animation_n.htm | 177 -- .../html/native/dali/animation_types_n.htm | 135 -- .../html/native/dali/background_n.htm | 70 - org.tizen.ui.guides/html/native/dali/buttons_n.htm | 217 -- .../html/native/dali/constraints_n.htm | 294 --- .../html/native/dali/control_base_n.htm | 115 -- .../html/native/dali/dali_applications_n.htm | 94 - .../html/native/dali/dali_overview_n.htm | 258 --- .../html/native/dali/event_handling_n.htm | 566 ------ .../html/native/dali/guides_dali_n.htm | 103 - org.tizen.ui.guides/html/native/dali/handle_n.htm | 202 -- .../html/native/dali/imageview_n.htm | 88 - .../html/native/dali/itemview_n.htm | 147 -- org.tizen.ui.guides/html/native/dali/layout_n.htm | 213 -- .../html/native/dali/multi_threaded_n.htm | 143 -- .../html/native/dali/properties_n.htm | 265 --- .../html/native/dali/rendering_effects_n.htm | 155 -- .../html/native/dali/resources_n.htm | 252 --- .../html/native/dali/scrollview_n.htm | 198 -- .../html/native/dali/tableview_n.htm | 105 - .../html/native/dali/textfield_n.htm | 290 --- .../html/native/dali/textlabel_n.htm | 298 --- .../html/native/dali/ui_components_n.htm | 121 -- .../html/native/efl/animation_effects_n.htm | 84 - .../html/native/efl/basic_tutorial_mn.htm | 285 --- .../html/native/efl/button_tutorial_wn.htm | 231 --- .../html/native/efl/component_custom_n.htm | 557 ------ .../html/native/efl/component_focus_n.htm | 174 -- .../html/native/efl/component_infra_n.htm | 69 - .../html/native/efl/containers_n.htm | 608 ------ .../html/native/efl/core_loop_n.htm | 87 - .../html/native/efl/data_types_n.htm | 1696 ---------------- .../html/native/efl/data_types_tools_n.htm | 78 - .../html/native/efl/datetime_tutorial_wn.htm | 111 -- .../html/native/efl/ecore_animation_n.htm | 451 ----- .../html/native/efl/ecore_animation_tutorial_n.htm | 417 ---- .../html/native/efl/edc_optimization_n.htm | 556 ------ .../html/native/efl/edc_part_block_n.htm | 2080 -------------------- .../html/native/efl/edc_positioning_n.htm | 488 ----- .../html/native/efl/edje_animation_n.htm | 535 ----- .../html/native/efl/edje_animation_tutorial_n.htm | 377 ---- .../html/native/efl/edje_color_n.htm | 354 ---- .../html/native/efl/edje_files_n.htm | 213 -- .../html/native/efl/edje_intro_n.htm | 285 --- .../html/native/efl/edje_manage_animation_n.htm | 728 ------- .../html/native/efl/edje_message_signal_n.htm | 457 ----- .../html/native/efl/edje_objects_n.htm | 87 - .../html/native/efl/edje_perspective_n.htm | 486 ----- .../html/native/efl/edje_scaling_n.htm | 794 -------- .../html/native/efl/edje_text_n.htm | 712 ------- .../html/native/efl/efl_overview_n.htm | 135 -- .../html/native/efl/elementary_animation_n.htm | 872 -------- .../native/efl/elementary_animation_tutorial_n.htm | 628 ------ .../efl/elementary_transit_effect_tutorial_n.htm | 213 -- .../html/native/efl/evas_advanced_objects_n.htm | 379 ---- .../html/native/efl/evas_basic_objects_n.htm | 349 ---- .../html/native/efl/evas_map_animation_n.htm | 389 ---- .../html/native/efl/evas_map_effects_n.htm | 253 --- .../html/native/efl/evas_objects_n.htm | 824 -------- .../html/native/efl/evas_optimization_n.htm | 227 --- .../html/native/efl/evas_rendering_n.htm | 288 --- .../html/native/efl/event_handling_n.htm | 119 -- .../html/native/efl/event_types_n.htm | 461 ----- .../html/native/efl/font_setting_n.htm | 440 ----- .../html/native/efl/form_tutorial_n.htm | 316 --- .../html/native/efl/genlist_tutorial_mn.htm | 457 ----- .../html/native/efl/genlist_tutorial_wn.htm | 469 ----- .../html/native/efl/graphical_objects_n.htm | 78 - .../html/native/efl/guides_efl_n.htm | 95 - org.tizen.ui.guides/html/native/efl/hw_input_n.htm | 64 - .../html/native/efl/layout_tutorial_n.htm | 751 ------- .../html/native/efl/main_loop_n.htm | 409 ---- .../html/native/efl/menu_tutorial_mn.htm | 541 ----- .../html/native/efl/multiple_screens_n.htm | 257 --- .../html/native/efl/multipoint_touch_n.htm | 266 --- .../html/native/efl/naviframe_tutorial_n.htm | 252 --- .../html/native/efl/notification_window_n.htm | 420 ---- .../html/native/efl/panes_tutorial_mn.htm | 324 --- .../html/native/efl/popup_tutorial_wn.htm | 244 --- .../html/native/efl/scalability_n.htm | 762 ------- org.tizen.ui.guides/html/native/efl/theme_n.htm | 72 - org.tizen.ui.guides/html/native/efl/threads_n.htm | 507 ----- org.tizen.ui.guides/html/native/efl/tools_n.htm | 243 --- .../html/native/efl/touch_gesture_n.htm | 265 --- .../html/native/efl/ui_components_mn.htm | 1092 ---------- .../html/native/efl/ui_components_n.htm | 694 ------- .../html/native/efl/ui_components_wn.htm | 876 --------- .../html/native/efl/ui_containers_n.htm | 131 -- .../html/native/efl/ui_scalability_n.htm | 69 - org.tizen.ui.guides/html/native/guides_n.htm | 78 - org.tizen.ui.guides/html/scripts/common.js | 1752 ----------------- org.tizen.ui.guides/html/scripts/core.js | 899 --------- org.tizen.ui.guides/html/scripts/jquery.util.js | 1441 -------------- .../html/scripts/jquery.zclip.min.js | 12 - org.tizen.ui.guides/html/scripts/navi.js | 192 -- org.tizen.ui.guides/html/scripts/search.js | 168 -- org.tizen.ui.guides/html/scripts/showhide.js | 204 -- org.tizen.ui.guides/html/web/guides_w.htm | 72 - .../html/web/tau/accessibility_w.htm | 110 -- .../html/web/tau/circle_progressbar_ww.htm | 266 --- .../html/web/tau/circular_ui_ww.htm | 227 --- .../html/web/tau/event_handling_w.htm | 184 -- .../html/web/tau/footerbutton_ww.htm | 191 -- .../html/web/tau/globalization_w.htm | 484 ----- org.tizen.ui.guides/html/web/tau/guides_tau_w.htm | 130 -- org.tizen.ui.guides/html/web/tau/header_ww.htm | 137 -- org.tizen.ui.guides/html/web/tau/helloworld_w.htm | 183 -- org.tizen.ui.guides/html/web/tau/helper_ww.htm | 239 --- .../html/web/tau/indexscrollbar_ww.htm | 213 -- org.tizen.ui.guides/html/web/tau/list_ww.htm | 200 -- .../html/web/tau/managing_page_w.htm | 262 --- .../html/web/tau/moreoptions_ww.htm | 196 -- org.tizen.ui.guides/html/web/tau/notepad_w.htm | 448 ----- org.tizen.ui.guides/html/web/tau/popup_ww.htm | 123 -- org.tizen.ui.guides/html/web/tau/processing_ww.htm | 114 -- org.tizen.ui.guides/html/web/tau/thumbnail_ww.htm | 166 -- .../html/web/tau/ui_component_w.htm | 209 -- org.tizen.ui.guides/html/web/w3c/animation_w.htm | 336 ---- org.tizen.ui.guides/html/web/w3c/background_w.htm | 188 -- org.tizen.ui.guides/html/web/w3c/basic_ui_w.htm | 201 -- org.tizen.ui.guides/html/web/w3c/clipboard_mw.htm | 297 --- org.tizen.ui.guides/html/web/w3c/color_w.htm | 221 --- org.tizen.ui.guides/html/web/w3c/drag_drop_mw.htm | 327 --- org.tizen.ui.guides/html/web/w3c/flexible_w.htm | 355 ---- org.tizen.ui.guides/html/web/w3c/font_w.htm | 214 -- .../html/web/w3c/frame_flattening_mw.htm | 69 - org.tizen.ui.guides/html/web/w3c/guides_w3c_w.htm | 142 -- org.tizen.ui.guides/html/web/w3c/html5forms_w.htm | 432 ---- .../html/web/w3c/html_priority_w.htm | 449 ----- org.tizen.ui.guides/html/web/w3c/media_query_w.htm | 342 ---- org.tizen.ui.guides/html/web/w3c/multi_mw.htm | 620 ------ .../html/web/w3c/multiple_screens_mw.htm | 382 ---- org.tizen.ui.guides/html/web/w3c/selector_w.htm | 214 -- .../html/web/w3c/session_history_w.htm | 204 -- org.tizen.ui.guides/html/web/w3c/text_module_w.htm | 244 --- org.tizen.ui.guides/html/web/w3c/transform_w.htm | 772 -------- org.tizen.ui.guides/html/web/w3c/transition_w.htm | 382 ---- org.tizen.ui.guides/html/web/w3c/ui_layout_ww.htm | 715 ------- org.tizen.ui.guides/html/web/w3c/woff_w.htm | 132 -- org.tizen.ui.guides/index.xml | 164 -- org.tizen.ui.guides/plugin.xml | 8 - org.tizen.ui.practices/.project | 22 + org.tizen.ui.practices/META-INF/MANIFEST.MF | 7 + .../about.html | 0 org.tizen.ui.practices/build.properties | 8 + org.tizen.ui.practices/html/cover_page.htm | 46 + org.tizen.ui.practices/html/css/snippet.css | 52 + org.tizen.ui.practices/html/css/styles.css | 756 +++++++ .../html/images/4_columns.png | Bin .../html/images/9patch.png | Bin .../html/images/9patch_buffer.png | Bin .../html/images/9patch_resource.png | Bin .../html/images/9patch_zoomed.png | Bin .../html/images/accordion_menu.png | Bin .../html/images/actor_coordinates.png | Bin .../html/images/actor_position.png | Bin .../html/images/actor_types.png | Bin .../html/images/after_resize.png | Bin 0 -> 13700 bytes .../html/images/align.png | Bin .../html/images/align_hints.png | Bin .../html/images/anchor_point.png | Bin .../html/images/animation1.png | Bin .../html/images/animation_components.png | Bin .../html/images/application_page_layout.png | Bin .../html/images/application_store_sd.png | Bin .../html/images/applying_color.png | Bin .../html/images/applying_invisibility.png | Bin .../html/images/aspect-control-both.png | Bin .../html/images/aspect-control-horizontal.png | Bin .../html/images/aspect-control-none.png | Bin .../html/images/backWearable.png | Bin .../html/images/background_control_color.png | Bin .../html/images/background_image.png | Bin .../html/images/background_image_color.png | Bin .../html/images/background_order.png | Bin .../html/images/background_textlabel.png | Bin .../html/images/base_layout.png | Bin .../html/images/base_scale.png | Bin .../html/images/base_scales.png | Bin .../html/images/basic_layout_480x800.png | Bin .../html/images/basic_layout_720x1280.png | Bin .../html/images/before_resize.png | Bin 0 -> 5974 bytes .../html/images/bg.png | Bin .../html/images/bg_tree.png | Bin .../html/images/bg_util_bar.gif | Bin .../html/images/bg_wn.png | Bin .../html/images/blue_box.png | Bin .../html/images/border.png | Bin .../html/images/bottom.png | Bin .../html/images/box.png | Bin .../html/images/box_model_properties.png | Bin .../html/images/box_model_properties_struct.png | Bin .../html/images/btn_top.gif | Bin .../html/images/button.png | Bin .../html/images/button_anchor.png | Bin .../html/images/button_bottom_o_wn.png | Bin .../html/images/button_circle.png | Bin .../html/images/button_default.png | Bin .../html/images/button_default_wn.png | Bin .../html/images/button_drawers.png | Bin .../html/images/button_dropdown.png | Bin .../html/images/button_green_wn.png | Bin .../html/images/button_hover_v.png | Bin .../html/images/button_hover_v_entry.png | Bin .../html/images/button_hoversel.png | Bin .../html/images/button_hoversel_entry.png | Bin .../html/images/button_next_wn.png | Bin .../html/images/button_option.png | Bin .../html/images/button_orange_wn.png | Bin .../html/images/button_recorder.png | Bin .../html/images/button_red_wn.png | Bin .../html/images/button_title_cancel.png | Bin .../html/images/button_title_done.png | Bin .../html/images/button_titleicon_wn.png | Bin .../html/images/button_tree.png | Bin .../html/images/button_wn.png | Bin .../html/images/calculator_sd.png | Bin .../html/images/calling_img_sep.png | Bin .../html/images/captured_screen1.png | Bin .../html/images/captured_screen2.png | Bin .../html/images/change_text_globally.png | Bin .../html/images/changed_order.png | Bin .../html/images/changing_opacity.png | Bin .../html/images/check.png | Bin .../html/images/check_default.png | Bin .../html/images/check_default_o_wn.png | Bin .../html/images/check_default_wn.png | Bin .../html/images/check_favorite.png | Bin .../html/images/check_on_off.png | Bin .../html/images/check_onoff_o_wn.png | Bin .../html/images/check_onoff_wn.png | Bin .../html/images/check_small_o_wn.png | Bin .../html/images/check_tree.png | Bin .../html/images/check_wn.png | Bin .../html/images/checkbox_button.png | Bin .../html/images/circle_datetime.png | Bin .../html/images/circle_genlist.png | Bin .../html/images/circle_progressbar.png | Bin .../html/images/circle_scroller.png | Bin .../html/images/circle_slider.png | Bin .../html/images/circle_spinner.png | Bin 0 -> 4138 bytes .../html/images/circular_support.png | Bin .../html/images/coin_flip_effect.png | Bin .../html/images/color_colorplane.png | Bin .../html/images/colorsel.png | Bin .../html/images/colorselector_tree.png | Bin .../html/images/column_break.png | Bin .../html/images/column_gap.png | Bin .../html/images/column_rule.png | Bin .../html/images/column_settings.png | Bin .../html/images/column_span.png | Bin .../html/images/column_width.png | Bin .../html/images/conformant.png | Bin .../html/images/contextual_bottom_o_wn.png | Bin .../html/images/contextual_select_o_wn.png | Bin .../html/images/contextual_top_o_wn.png | Bin .../html/images/contextual_wn.png | Bin .../html/images/copy_pasting.png | Bin .../html/images/css_bg1.png | Bin .../html/images/css_bg_tutorial1.png | Bin .../html/images/css_bg_tutorial2.png | Bin .../html/images/css_color_tutorial1.png | Bin .../html/images/css_result.png | Bin .../html/images/css_transforms1.png | Bin .../html/images/css_transforms2.png | Bin .../html/images/css_transforms5.png | Bin .../html/images/ctxpopup1.png | Bin .../html/images/ctxpopup2.png | Bin .../html/images/ctxpopup3.png | Bin .../html/images/ctxpopup_default.png | Bin .../html/images/ctxpopup_dropdown.png | Bin .../html/images/ctxpopup_dropdown_label.png | Bin .../html/images/ctxpopup_tree.png | Bin .../html/images/ctxpopup_wn.png | Bin .../html/images/dali_component.png | Bin .../html/images/dali_threads.png | Bin 0 -> 52405 bytes .../html/images/date2.png | Bin .../html/images/datetime_date_layout.png | Bin .../html/images/datetime_date_o_wn.png | Bin .../html/images/datetime_date_wn.png | Bin .../html/images/datetime_time_24h.png | Bin .../html/images/datetime_time_layout.png | Bin .../html/images/datetime_time_o_wn.png | Bin .../html/images/datetime_time_wn.png | Bin .../html/images/datetime_tree.png | Bin .../html/images/datetime_wn.png | Bin .../html/images/default_order.png | Bin .../html/images/depth.png | Bin .../html/images/dimension_dependency.png | Bin .../html/images/display_text_classes.png | Bin .../html/images/dragdrop.png | Bin .../html/images/dynamic_layout_480x800.png | Bin .../html/images/dynamic_layout_720x1280.png | Bin .../html/images/edc_masking.png | Bin .../html/images/edje_color.png | Bin .../html/images/edje_message.png | Bin .../html/images/edje_object_scales.png | Bin .../html/images/edje_signal1.png | Bin .../html/images/edje_signal2.png | Bin .../html/images/edje_text_main.png | Bin .../html/images/efl_complex_clock.png | Bin .../html/images/efl_complex_clock_tree.png | Bin .../html/images/efl_layers.png | Bin .../html/images/efl_notilevels.png | Bin .../html/images/efl_phone.png | Bin .../html/images/efl_simple_clock.png | Bin .../html/images/efl_simple_clock_tree.png | Bin .../html/images/efl_windowlayer.png | Bin .../html/images/efllibs.png | Bin .../html/images/elementary.png | Bin .../html/images/elementary_app.png | Bin .../html/images/email_sample.png | Bin .../html/images/empty_window.png | Bin .../html/images/enlarge_low_res_image.png | Bin .../html/images/entry.png | Bin .../html/images/entry2.png | Bin .../html/images/entry2_wn.png | Bin .../html/images/entry_default.png | Bin .../html/images/entry_default_wn.png | Bin .../html/images/entry_tree.png | Bin .../html/images/entry_wn.png | Bin .../html/images/evas_advanced.png | Bin .../html/images/evas_blur1.png | Bin .../html/images/evas_blur2.png | Bin .../html/images/evas_image_loader.png | Bin .../html/images/evas_image_scaling.png | Bin .../html/images/evas_map_1.png | Bin .../html/images/evas_map_10.png | Bin .../html/images/evas_map_11.png | Bin .../html/images/evas_map_2.png | Bin .../html/images/evas_map_3.png | Bin .../html/images/evas_map_4.png | Bin .../html/images/evas_map_5.png | Bin .../html/images/evas_map_6.png | Bin .../html/images/evas_map_7.png | Bin .../html/images/evas_map_8.png | Bin .../html/images/evas_map_9.png | Bin .../html/images/evas_map_effect.png | Bin .../html/images/evas_object_display.png | Bin .../html/images/evas_partial_update.png | Bin .../html/images/evas_scaling1.png | Bin .../html/images/evas_scaling2.png | Bin .../html/images/evas_scaling3.png | Bin .../html/images/evas_smooth_disabled.png | Bin .../html/images/evas_smooth_enabled.png | Bin .../html/images/events.png | Bin .../html/images/events2.png | Bin .../html/images/events3.png | Bin .../html/images/events_flow.png | Bin .../html/images/events_scope.png | Bin .../html/images/events_using_css3.png | Bin .../html/images/events_using_javascript.png | Bin .../html/images/fade_affect_animation.png | Bin .../html/images/fallback_imageset.png | Bin 0 -> 39062 bytes .../html/images/fill_to_parent.png | Bin .../html/images/first_screen_edc.png | Bin .../html/images/fit_to_children.png | Bin .../html/images/fixed.png | Bin .../html/images/flex_container.png | Bin .../html/images/flexcontainer_properties.png | Bin .../html/images/flexible_box_alignment.png | Bin .../html/images/flexible_default_structure.png | Bin .../html/images/flexible_screen_size.png | Bin .../html/images/flexitem_properties.png | Bin .../html/images/flip_tree.png | Bin .../html/images/flipsel_default.png | Bin .../html/images/focal_length.png | Bin .../html/images/font_face.png | Bin .../html/images/font_properties.png | Bin .../html/images/form_contact_layout.png | Bin .../html/images/gengrid.png | Bin .../html/images/gengrid_album_pre.png | Bin .../html/images/gengrid_block.png | Bin .../html/images/gengrid_def.png | Bin .../html/images/gengrid_def_gridtext.png | Bin .../html/images/gengrid_def_gridtext2.png | Bin .../html/images/gengrid_def_style.png | Bin .../html/images/gengrid_default.png | Bin .../html/images/gengrid_grp_index.png | Bin .../html/images/gengrid_tree.png | Bin .../html/images/genlist.png | Bin .../html/images/genlist1_wn.png | Bin .../html/images/genlist2_wn.png | Bin .../html/images/genlist3_wn.png | Bin .../html/images/genlist_1line.png | Bin .../html/images/genlist_1text1icon1_o_wn.png | Bin .../html/images/genlist_1text1icon1_wn.png | Bin .../html/images/genlist_1text1icon_o_wn.png | Bin .../html/images/genlist_1text1icon_wn.png | Bin .../html/images/genlist_1text1icondivider_o_wn.png | Bin .../html/images/genlist_1text1icondivider_wn.png | Bin .../html/images/genlist_1text_o_wn.png | Bin .../html/images/genlist_1text_wn.png | Bin .../html/images/genlist_2text1_wn.png | Bin .../html/images/genlist_2text1icon1_o_wn.png | Bin .../html/images/genlist_2text1icon1_wn.png | Bin .../html/images/genlist_2text_o_wn.png | Bin .../html/images/genlist_2text_wn.png | Bin .../html/images/genlist_def_o_wn.png | Bin .../html/images/genlist_def_wn.png | Bin .../html/images/genlist_edit_o_wn.png | Bin .../html/images/genlist_group_o_wn.png | Bin .../html/images/genlist_group_wn.png | Bin .../html/images/genlist_htree.png | Bin .../html/images/genlist_item.png | Bin .../html/images/genlist_multi.png | Bin .../html/images/genlist_multi1_wn.png | Bin .../html/images/genlist_multi2_wn.png | Bin .../html/images/genlist_title_o_wn.png | Bin .../html/images/genlist_tree.png | Bin .../html/images/genlist_wn.png | Bin .../html/images/gesture_view2.png | Bin .../html/images/gl-default.png | Bin .../html/images/gl-double-label.png | Bin .../html/images/gl-end-icon.png | Bin .../html/images/global_scales.png | Bin .../html/images/globalize_folder_structure.png | Bin .../images/globalize_folder_structure_main.png | Bin .../html/images/glview.png | Bin .../html/images/glview_tree.png | Bin .../html/images/glview_wn.png | Bin .../html/images/google_cardboard.png | Bin .../html/images/grid.png | Bin .../html/images/hello_world_dali.png | Bin .../html/images/ico_arr_hidden.gif | Bin .../html/images/ico_bullet_2_7.gif | Bin .../html/images/icon.png | Bin .../html/images/icon_apps.png | Bin .../html/images/icon_arrowdown.png | Bin .../html/images/icon_arrowleft.png | Bin .../html/images/icon_arrowright.png | Bin .../html/images/icon_arrowup.png | Bin .../html/images/icon_chat.png | Bin .../html/images/icon_clock.png | Bin .../html/images/icon_close.png | Bin .../html/images/icon_delete.png | Bin .../html/images/icon_edit.png | Bin .../html/images/icon_file.png | Bin .../html/images/icon_forward.png | Bin .../html/images/icon_home.png | Bin .../html/images/icon_info.png | Bin .../html/images/icon_menu_apps.png | Bin .../html/images/icon_menu_arrdown.png | Bin .../html/images/icon_menu_arrleft.png | Bin .../html/images/icon_menu_arrright.png | Bin .../html/images/icon_menu_arrup.png | Bin .../html/images/icon_menu_chat.png | Bin .../html/images/icon_menu_clock.png | Bin .../html/images/icon_menu_close.png | Bin .../html/images/icon_menu_delete.png | Bin .../html/images/icon_menu_edit.png | Bin .../html/images/icon_menu_file.png | Bin .../html/images/icon_menu_folder.png | Bin .../html/images/icon_menu_home.png | Bin .../html/images/icon_menu_nophoto.png | Bin .../html/images/icon_menu_refresh.png | Bin .../html/images/icon_next.png | Bin .../html/images/icon_pause.png | Bin .../html/images/icon_photo_nophoto.png | Bin .../html/images/icon_play.png | Bin .../html/images/icon_prev.png | Bin .../html/images/icon_refresh.png | Bin .../html/images/icon_rewind.png | Bin .../html/images/icon_stop.png | Bin .../html/images/icon_toolbar_apps.png | Bin .../html/images/icon_toolbar_arrdown.png | Bin .../html/images/icon_toolbar_arrleft.png | Bin .../html/images/icon_toolbar_arrright.png | Bin .../html/images/icon_toolbar_arrup.png | Bin .../html/images/icon_toolbar_chat.png | Bin .../html/images/icon_toolbar_clock.png | Bin .../html/images/icon_toolbar_close.png | Bin .../html/images/icon_toolbar_delete.png | Bin .../html/images/icon_toolbar_edit.png | Bin .../html/images/icon_toolbar_file.png | Bin .../html/images/icon_toolbar_folder.png | Bin .../html/images/icon_toolbar_moremenu.png | Bin .../html/images/icon_toolbar_refresh.png | Bin .../html/images/icon_tree.png | Bin .../html/images/idlers.png | Bin .../html/images/image.png | Bin .../html/images/image_after.png | Bin .../html/images/image_before.png | Bin .../html/images/image_tree.png | Bin .../html/images/image_wn.png | Bin .../html/images/immediate_mode.png | Bin .../html/images/import_css_area.png | Bin .../html/images/import_linked_in_head.png | Bin .../html/images/index.png | Bin .../html/images/index_circle_o_wn.png | Bin .../html/images/index_default.png | Bin .../html/images/index_default02.png | Bin .../html/images/index_pagecontrol.png | Bin .../html/images/index_tab_wn.png | Bin .../html/images/index_thumb_o_wn.png | Bin .../html/images/index_thumb_wn.png | Bin .../html/images/index_tree.png | Bin .../html/images/index_wn.png | Bin .../html/images/label.png | Bin .../html/images/label_tree.png | Bin .../html/images/label_wn.png | Bin .../html/images/layout_app.png | Bin .../html/images/layout_calculator.png | Bin .../html/images/layout_calculator_absolute.png | Bin .../html/images/layout_calculator_relative.png | Bin .../html/images/layout_fixed_media.png | Bin .../html/images/layout_flexible_media.png | Bin .../html/images/layout_image.png | Bin .../html/images/layout_image_scaled.png | Bin .../html/images/layout_original.png | Bin .../html/images/layout_original_scaled.png | Bin .../html/images/layout_sample.png | Bin .../html/images/layout_sample_ok.png | Bin .../html/images/layout_sample_ugly.png | Bin .../html/images/list.png | Bin .../html/images/list_tree.png | Bin .../html/images/list_wn.png | Bin .../html/images/main_app_layout.png | Bin .../html/images/map_tree.png | Bin .../html/images/mapbuf_tree.png | Bin .../html/images/mascot.gif | Bin .../html/images/media_queries1.png | Bin .../html/images/media_queries3.png | Bin .../html/images/memory.png | Bin .../html/images/memory2.png | Bin .../html/images/memory3.png | Bin .../html/images/memory_using_css3.png | Bin .../html/images/memory_using_javascript.png | Bin .../html/images/menu_skeleton.png | Bin .../html/images/migrate_move_to_top.png | Bin .../html/images/migrate_padding.png | Bin .../html/images/migrate_scrollable_circle.png | Bin .../html/images/migrate_scrollable_rect.png | Bin org.tizen.ui.practices/html/images/mn_division.png | Bin 0 -> 163492 bytes .../html/images/mn_icon.png | Bin org.tizen.ui.practices/html/images/mobile_s_n.png | Bin 0 -> 2070 bytes org.tizen.ui.practices/html/images/mobile_s_w.png | Bin 0 -> 2183 bytes .../html/images/mobile_s_w_optional.png | Bin 0 -> 2021 bytes org.tizen.ui.practices/html/images/more_option.png | Bin 0 -> 39321 bytes .../html/images/more_option_item.png | Bin 0 -> 14169 bytes .../html/images/more_option_main.png | Bin 0 -> 14004 bytes .../html/images/more_option_sub.png | Bin 0 -> 14348 bytes .../html/images/moving1.png | Bin .../html/images/moving2.png | Bin .../html/images/multi_button_default.png | Bin .../html/images/multi_node_selection.png | Bin .../html/images/multi_threading.png | Bin .../html/images/multi_threading2.png | Bin .../html/images/multiple_layout_example.png | Bin .../html/images/multipoint_touch.png | Bin org.tizen.ui.practices/html/images/mw_division.png | Bin 0 -> 163486 bytes .../html/images/mw_icon.png | Bin .../html/images/mw_icon_optional.png | Bin org.tizen.ui.practices/html/images/n_division.png | Bin 0 -> 163502 bytes .../html/images/network.png | Bin .../html/images/network2.png | Bin .../html/images/network3.png | Bin .../html/images/network_speed_sprite.png | Bin .../html/images/nine_patch_dali.9.png | Bin .../html/images/nine_patch_expanded.png | Bin .../html/images/nine_patch_explained.png | Bin .../html/images/notify_tree.png | Bin .../html/images/object_size_16.png | Bin .../html/images/object_size_22.png | Bin .../html/images/object_size_44.png | Bin .../html/images/padding-hints.png | Bin .../html/images/pane_tuto.png | Bin .../html/images/panel_default.png | Bin .../html/images/panel_tree.png | Bin .../html/images/panes.png | Bin .../html/images/parent_origin.png | Bin .../html/images/path_animation.png | Bin .../html/images/perspective_buttons.png | Bin .../html/images/perspective_screen.png | Bin .../html/images/perspective_swallow.png | Bin .../html/images/photo_tree.png | Bin .../html/images/photocam_tree.png | Bin .../html/images/plug_tree.png | Bin .../html/images/popup.png | Bin .../html/images/popup_circle_o_wn.png | Bin .../html/images/popup_default.png | Bin .../html/images/popup_default_wn.png | Bin .../html/images/popup_toast.png | Bin .../html/images/popup_toast_o_wn.png | Bin .../html/images/popup_toast_wn.png | Bin .../html/images/popup_tree.png | Bin .../html/images/popup_wn.png | Bin .../html/images/pos_map_all.png | Bin .../html/images/progressbar.png | Bin .../html/images/progressbar_default.png | Bin .../html/images/progressbar_default_wn.png | Bin .../html/images/progressbar_group_wn.png | Bin .../html/images/progressbar_pending_wn.png | Bin .../html/images/progressbar_process_o_wn.png | Bin .../html/images/progressbar_process_wn.png | Bin .../html/images/progressbar_small_o_wn.png | Bin .../html/images/progressbar_tree.png | Bin .../html/images/progressbar_wheel.png | Bin .../html/images/progressbar_wn.png | Bin .../html/images/pseudo_elements_selector_range.png | Bin .../images/pseudo_elements_selector_required.png | Bin .../html/images/push_button.png | Bin .../html/images/radio.png | Bin .../html/images/radio_button.png | Bin .../html/images/radio_default.png | Bin .../html/images/radio_default_o_wn.png | Bin .../html/images/radio_default_wn.png | Bin .../html/images/radio_state_changes.png | Bin .../html/images/radio_tree.png | Bin .../html/images/radio_wn.png | Bin .../html/images/rectangular_footer.png | Bin .../html/images/rectangular_header.png | Bin .../html/images/rectangular_index.png | Bin .../html/images/rectangular_list.png | Bin .../html/images/rectangular_moreoption.png | Bin .../html/images/rectangular_multibtn.png | Bin .../html/images/rectangular_popup_bottom.png | Bin .../html/images/rectangular_popup_side.png | Bin .../html/images/rectangular_processing.png | Bin .../html/images/rectangular_progress.png | Bin .../html/images/rectangular_thumbnail.png | Bin .../html/images/redrawing01.png | Bin .../html/images/redrawing02.png | Bin .../html/images/redrawing03.png | Bin .../html/images/redrawing04.png | Bin .../html/images/redrawing05.png | Bin .../html/images/rel1_rel2_offsets.png | Bin .../html/images/rel1_rel2_offsets_and_relative.png | Bin .../html/images/removing_padding.png | Bin .../html/images/rendering1.png | Bin .../html/images/retained_mode.png | Bin .../html/images/rotary_event.png | Bin .../html/images/rotary_selector.png | Bin 0 -> 30917 bytes .../html/images/rotary_selector_item.png | Bin 0 -> 14948 bytes .../html/images/rotary_selector_main.png | Bin 0 -> 14932 bytes .../html/images/rotary_selector_main_text.png | Bin 0 -> 14990 bytes .../html/images/rotary_selector_selector.png | Bin 0 -> 16244 bytes .../html/images/rotary_selector_sub.png | Bin 0 -> 14980 bytes .../html/images/rotary_selector_sub_text.png | Bin 0 -> 14976 bytes .../html/images/round_footer.png | Bin 0 -> 30337 bytes .../html/images/round_header.png | Bin .../html/images/round_index.png | Bin .../html/images/round_list.png | Bin .../html/images/round_moreoption.png | Bin 0 -> 20736 bytes .../html/images/round_multibtn.png | Bin 0 -> 25103 bytes .../html/images/round_popup_bottom.png | Bin .../html/images/round_popup_side.png | Bin .../html/images/round_processing.png | Bin 0 -> 23821 bytes .../html/images/round_progress.png | Bin .../html/images/round_thumbnail.png | Bin .../html/images/scalable_group1.png | Bin .../html/images/scalable_group2.png | Bin .../html/images/scale.png | Bin .../html/images/scale_1.3_finger_50.png | Bin .../html/images/scale_1_finger_50.png | Bin .../html/images/scale_1_finger_90.png | Bin .../html/images/scale_align_hint.png | Bin .../html/images/scale_box.png | Bin .../html/images/scale_effect_1.png | Bin .../html/images/scale_effect_10.png | Bin .../html/images/scale_effect_2.png | Bin .../html/images/scale_effect_3.png | Bin .../html/images/scale_effect_4.png | Bin .../html/images/scale_effect_5.png | Bin .../html/images/scale_effect_6.png | Bin .../html/images/scale_effect_7.png | Bin .../html/images/scale_effect_8.png | Bin .../html/images/scale_effect_9.png | Bin .../html/images/scale_example_image.png | Bin .../html/images/scale_example_image_set.png | Bin .../html/images/scale_example_part.png | Bin .../html/images/scale_example_part_aspect.png | Bin .../html/images/scale_example_text.png | Bin .../html/images/scale_example_text_fit.png | Bin .../html/images/scale_fixed.png | Bin .../html/images/scale_fixed_flexible.png | Bin .../html/images/scale_fixed_height.png | Bin .../html/images/scale_flexible_height.png | Bin .../html/images/scale_grid.png | Bin .../html/images/scale_original_image.png | Bin .../html/images/scale_relative.png | Bin .../html/images/scale_relative_scaled.png | Bin .../html/images/scale_testing_app.png | Bin .../html/images/scale_values.png | Bin .../html/images/scale_values2.png | Bin .../html/images/scale_weight_hint.png | Bin .../html/images/scale_weight_hint_multiple.png | Bin .../html/images/scaling.png | Bin .../html/images/screenshot_1.png | Bin .../html/images/screenshot_2.png | Bin .../html/images/scrollview.png | Bin .../html/images/segm_control_default.png | Bin .../html/images/segment.png | Bin .../html/images/segment_control_tree.png | Bin .../html/images/segment_text.png | Bin .../html/images/setting_sd.png | Bin .../html/images/show_frametime.png | Bin .../html/images/signal_slot.png | Bin .../html/images/single_node_selection.png | Bin .../html/images/slider.png | Bin .../html/images/slider_hor.png | Bin .../html/images/slider_hor_center.png | Bin .../html/images/slider_hor_wn.png | Bin .../html/images/slider_tree.png | Bin .../html/images/slider_ver.png | Bin .../html/images/slider_ver_center.png | Bin .../html/images/slider_wn.png | Bin .../html/images/spin.png | Bin .../html/images/spinner_hor.png | Bin .../html/images/spinner_tree.png | Bin .../html/images/spinner_ver.png | Bin .../html/images/spiral.png | Bin .../html/images/stereo_projection.png | Bin .../html/images/styleguide_genlist_def.png | Bin .../html/images/styleguide_genlist_defstyle.png | Bin .../html/images/styleguide_genlist_doublelabel.png | Bin .../html/images/styleguide_genlist_end.png | Bin .../html/images/styleguide_genlist_full.png | Bin .../html/images/styleguide_genlist_group.png | Bin .../html/images/styleguide_genlist_message.png | Bin .../html/images/styleguide_genlist_oneicon.png | Bin .../html/images/tableview.png | Bin .../html/images/tau_animation_1.png | Bin 0 -> 43968 bytes .../html/images/tau_animation_2.png | Bin 0 -> 3758 bytes .../html/images/tau_animation_3.png | Bin 0 -> 9950 bytes .../html/images/tau_animation_4.png | Bin 0 -> 12468 bytes .../html/images/tau_animation_5.png | Bin 0 -> 11621 bytes .../html/images/text_class_list.png | Bin .../html/images/text_class_list_del.png | Bin .../html/images/text_class_properties.png | Bin .../html/images/text_properties.png | Bin .../html/images/text_screen_2.png | Bin .../html/images/textfield.png | Bin .../html/images/textlabel.png | Bin .../html/images/thread_pool_lifecycle_1.png | Bin .../html/images/thread_pool_lifecycle_2.png | Bin .../html/images/thread_pool_lifecycle_3.png | Bin .../html/images/tizen_project_dali.png | Bin 0 -> 196375 bytes .../html/images/toolbar.png | Bin .../html/images/toolbar_default.png | Bin .../html/images/toolbar_navigation.png | Bin .../html/images/toolbar_tabbar.png | Bin .../html/images/toolbar_tree.png | Bin .../html/images/transit_rotation_zoom.png | Bin .../html/images/transitions1.png | Bin .../html/images/transitions2.png | Bin .../html/images/transitions3.png | Bin .../html/images/transitions5.png | Bin .../html/images/ui_control_hierarchy.png | Bin .../html/images/ui_controls.png | Bin .../html/images/uilayout_view2.png | Bin .../html/images/use_natural_size.png | Bin .../html/images/using_clipper.png | Bin .../html/images/using_clipper2.png | Bin .../html/images/using_import_attribute.png | Bin .../html/images/view_main.png | Bin org.tizen.ui.practices/html/images/w_division.png | Bin 0 -> 163496 bytes .../html/images/wearable_s_n.png | Bin 0 -> 2564 bytes .../html/images/wearable_s_w.png | Bin 0 -> 2652 bytes .../html/images/wearable_s_w_optional.png | Bin 0 -> 2454 bytes .../html/images/win_tree.png | Bin org.tizen.ui.practices/html/images/wn_division.png | Bin 0 -> 163496 bytes .../html/images/wn_icon.png | Bin org.tizen.ui.practices/html/images/ww_division.png | Bin 0 -> 163490 bytes .../html/images/ww_icon.png | Bin .../html/images/ww_icon_optional.png | Bin org.tizen.ui.practices/html/index.htm | 327 +++ .../html/native/dali/actors_n.htm | 213 ++ .../html/native/dali/animation_n.htm | 177 ++ .../html/native/dali/animation_types_n.htm | 136 ++ .../html/native/dali/background_n.htm | 72 + .../html/native/dali/buttons_n.htm | 234 +++ .../html/native/dali/constraints_n.htm | 294 +++ .../html/native/dali/control_base_n.htm | 113 ++ .../html/native/dali/dali_applications_n.htm | 94 + .../html/native/dali/dali_overview_n.htm | 248 +++ .../html/native/dali/event_handling_n.htm | 575 ++++++ .../html/native/dali/guides_dali_n.htm | 82 + .../html/native/dali/handle_n.htm | 197 ++ .../html/native/dali/imageview_n.htm | 78 + .../html/native/dali/itemview_n.htm | 148 ++ .../html/native/dali/layout_n.htm | 201 ++ .../html/native/dali/multi_threaded_n.htm | 138 ++ .../html/native/dali/properties_n.htm | 257 +++ .../html/native/dali/rendering_effects_n.htm | 152 ++ .../html/native/dali/resources_n.htm | 253 +++ .../html/native/dali/scrollview_n.htm | 199 ++ .../html/native/dali/tableview_n.htm | 105 + .../html/native/dali/textfield_n.htm | 291 +++ .../html/native/dali/textlabel_n.htm | 299 +++ .../html/native/dali/ui_components_n.htm | 121 ++ .../html/native/efl/animation_effects_n.htm | 84 + .../html/native/efl/basic_tutorial_mn.htm | 294 +++ .../html/native/efl/button_tutorial_wn.htm | 222 +++ .../html/native/efl/circle_components_wn.htm | 0 .../html/native/efl/component_background_mn.htm | 141 ++ .../html/native/efl/component_background_wn.htm | 143 ++ .../html/native/efl/component_button_mn.htm | 199 ++ .../html/native/efl/component_button_wn.htm | 199 ++ .../html/native/efl/component_check_mn.htm | 182 ++ .../html/native/efl/component_check_wn.htm | 174 ++ .../html/native/efl/component_circ_datetime_wn.htm | 116 ++ .../html/native/efl/component_circ_genlist_wn.htm | 126 ++ .../html/native/efl/component_circ_object_wn.htm | 265 +++ .../html/native/efl/component_circ_option_wn.htm | 174 ++ .../native/efl/component_circ_progressbar_wn.htm | 117 ++ .../html/native/efl/component_circ_rotary_wn.htm | 239 +++ .../html/native/efl/component_circ_scroller_wn.htm | 133 ++ .../html/native/efl/component_circ_slider_wn.htm | 164 ++ .../html/native/efl/component_circ_spinner_wn.htm | 117 ++ .../html/native/efl/component_circ_surface_wn.htm | 136 ++ .../html/native/efl/component_colorselector_mn.htm | 161 ++ .../html/native/efl/component_ctxpopup_mn.htm | 187 ++ .../html/native/efl/component_ctxpopup_wn.htm | 179 ++ .../html/native/efl/component_custom_n.htm | 560 ++++++ .../html/native/efl/component_datetime_mn.htm | 171 ++ .../html/native/efl/component_datetime_wn.htm | 142 ++ .../html/native/efl/component_entry_mn.htm | 445 +++++ .../html/native/efl/component_entry_wn.htm | 439 +++++ .../html/native/efl/component_flip_mn.htm | 177 ++ .../html/native/efl/component_focus_n.htm | 174 ++ .../html/native/efl/component_gengrid_mn.htm | 164 ++ .../html/native/efl/component_genlist_mn.htm | 261 +++ .../html/native/efl/component_genlist_wn.htm | 266 +++ .../html/native/efl/component_glview_mn.htm | 173 ++ .../html/native/efl/component_glview_wn.htm | 172 ++ .../html/native/efl/component_icon_mn.htm | 128 ++ .../html/native/efl/component_icon_wn.htm | 126 ++ .../html/native/efl/component_image_mn.htm | 163 ++ .../html/native/efl/component_image_wn.htm | 164 ++ .../html/native/efl/component_index_mn.htm | 168 ++ .../html/native/efl/component_index_wn.htm | 153 ++ .../html/native/efl/component_infra_n.htm | 69 + .../html/native/efl/component_label_mn.htm | 155 ++ .../html/native/efl/component_label_wn.htm | 156 ++ .../html/native/efl/component_list_mn.htm | 253 +++ .../html/native/efl/component_list_wn.htm | 252 +++ .../html/native/efl/component_map_mn.htm | 285 +++ .../html/native/efl/component_notify_mn.htm | 150 ++ .../html/native/efl/component_notify_wn.htm | 146 ++ .../html/native/efl/component_panel_mn.htm | 167 ++ .../html/native/efl/component_photocam_mn.htm | 159 ++ .../html/native/efl/component_plug_mn.htm | 128 ++ .../html/native/efl/component_plug_wn.htm | 127 ++ .../html/native/efl/component_popup_mn.htm | 198 ++ .../html/native/efl/component_popup_wn.htm | 256 +++ .../html/native/efl/component_progressbar_mn.htm | 180 ++ .../html/native/efl/component_progressbar_wn.htm | 165 ++ .../html/native/efl/component_radio_mn.htm | 161 ++ .../html/native/efl/component_radio_wn.htm | 170 ++ .../native/efl/component_segmentcontrol_mn.htm | 152 ++ .../html/native/efl/component_slider_mn.htm | 182 ++ .../html/native/efl/component_slider_wn.htm | 164 ++ .../html/native/efl/component_spinner_mn.htm | 157 ++ .../html/native/efl/component_toolbar_mn.htm | 206 ++ .../html/native/efl/component_tooltip_mn.htm | 136 ++ .../html/native/efl/component_win_mn.htm | 153 ++ .../html/native/efl/component_win_wn.htm | 160 ++ .../html/native/efl/components_mn.htm | 0 .../html/native/efl/components_wn.htm | 0 .../html/native/efl/containers_n.htm | 607 ++++++ .../html/native/efl/core_loop_n.htm | 87 + .../html/native/efl/data_types_n.htm | 1695 ++++++++++++++++ .../html/native/efl/data_types_tools_n.htm | 78 + .../html/native/efl/datetime_tutorial_wn.htm | 102 + .../html/native/efl/ecore_animation_n.htm | 451 +++++ .../html/native/efl/ecore_animation_tutorial_n.htm | 412 ++++ .../html/native/efl/edc_optimization_n.htm | 556 ++++++ .../html/native/efl/edc_part_block_n.htm | 2054 +++++++++++++++++++ .../html/native/efl/edc_positioning_n.htm | 487 +++++ .../html/native/efl/edje_animation_n.htm | 535 +++++ .../html/native/efl/edje_animation_tutorial_n.htm | 459 +++++ .../html/native/efl/edje_color_n.htm | 354 ++++ .../html/native/efl/edje_files_n.htm | 213 ++ .../html/native/efl/edje_intro_n.htm | 305 +++ .../html/native/efl/edje_manage_animation_n.htm | 728 +++++++ .../html/native/efl/edje_message_signal_n.htm | 457 +++++ .../html/native/efl/edje_objects_n.htm | 87 + .../html/native/efl/edje_perspective_n.htm | 486 +++++ .../html/native/efl/edje_scaling_n.htm | 794 ++++++++ .../html/native/efl/edje_text_n.htm | 712 +++++++ .../html/native/efl/efl_overview_n.htm | 135 ++ .../html/native/efl/elementary_animation_n.htm | 872 ++++++++ .../native/efl/elementary_animation_tutorial_n.htm | 662 +++++++ .../efl/elementary_transit_effect_tutorial_n.htm | 232 +++ .../html/native/efl/evas_advanced_objects_n.htm | 379 ++++ .../html/native/efl/evas_basic_objects_n.htm | 349 ++++ .../html/native/efl/evas_map_animation_n.htm | 389 ++++ .../html/native/efl/evas_map_effects_n.htm | 253 +++ .../html/native/efl/evas_objects_n.htm | 824 ++++++++ .../html/native/efl/evas_optimization_n.htm | 227 +++ .../html/native/efl/evas_rendering_n.htm | 288 +++ .../html/native/efl/event_handling_n.htm | 119 ++ .../html/native/efl/event_types_n.htm | 461 +++++ .../html/native/efl/font_resource_n.htm | 94 + .../html/native/efl/font_setting_n.htm | 441 +++++ .../html/native/efl/form_tutorial_n.htm | 342 ++++ .../html/native/efl/genlist_tutorial_mn.htm | 475 +++++ .../html/native/efl/genlist_tutorial_wn.htm | 486 +++++ .../html/native/efl/graphical_objects_n.htm | 78 + .../html/native/efl/guides_efl_n.htm | 95 + .../html/native/efl/hw_input_n.htm | 64 + .../html/native/efl/key_events_mn.htm | 178 ++ .../html/native/efl/key_events_n.htm | 0 .../html/native/efl/key_grab_n.htm | 699 +++++++ .../html/native/efl/layout_tutorial_n.htm | 782 ++++++++ .../html/native/efl/main_loop_n.htm | 409 ++++ .../html/native/efl/menu_tutorial_mn.htm | 612 ++++++ .../html/native/efl/multiple_screens_n.htm | 259 +++ .../html/native/efl/multipoint_touch_n.htm | 266 +++ .../html/native/efl/naviframe_tutorial_n.htm | 259 +++ .../html/native/efl/notification_window_n.htm | 426 ++++ .../html/native/efl/panes_tutorial_mn.htm | 328 +++ .../html/native/efl/popup_tutorial_wn.htm | 235 +++ .../html/native/efl/resource_fallback_n.htm | 164 ++ .../html/native/efl/rotary_events_n.htm | 0 .../html/native/efl/rotary_events_wn.htm | 276 +++ .../html/native/efl/scalability_n.htm | 762 +++++++ org.tizen.ui.practices/html/native/efl/theme_n.htm | 72 + .../html/native/efl/threads_n.htm | 507 +++++ org.tizen.ui.practices/html/native/efl/tools_n.htm | 243 +++ .../html/native/efl/touch_gesture_n.htm | 265 +++ .../html/native/efl/ui_components_mn.htm | 1088 ++++++++++ .../html/native/efl/ui_components_n.htm | 693 +++++++ .../html/native/efl/ui_components_wn.htm | 883 +++++++++ .../html/native/efl/ui_containers_n.htm | 131 ++ .../html/native/efl/ui_scalability_n.htm | 70 + org.tizen.ui.practices/html/native/guides_n.htm | 78 + org.tizen.ui.practices/html/scripts/common.js | 1752 +++++++++++++++++ org.tizen.ui.practices/html/scripts/core.js | 899 +++++++++ org.tizen.ui.practices/html/scripts/jquery.util.js | 1441 ++++++++++++++ .../html/scripts/jquery.zclip.min.js | 12 + org.tizen.ui.practices/html/scripts/navi.js | 192 ++ org.tizen.ui.practices/html/scripts/search.js | 168 ++ org.tizen.ui.practices/html/scripts/showhide.js | 204 ++ .../html/scripts/snippet.js | 0 org.tizen.ui.practices/html/web/guides_w.htm | 72 + .../html/web/tau/accessibility_w.htm | 110 ++ .../html/web/tau/animation_w.htm | 278 +++ .../html/web/tau/circle_progressbar_ww.htm | 257 +++ .../html/web/tau/circular_ui_ww.htm | 218 ++ .../html/web/tau/creating_animation_w.htm | 191 ++ .../html/web/tau/event_handling_w.htm | 185 ++ .../html/web/tau/footerbutton_ww.htm | 182 ++ .../html/web/tau/globalization_w.htm | 484 +++++ .../html/web/tau/guides_tau_w.htm | 131 ++ org.tizen.ui.practices/html/web/tau/header_ww.htm | 128 ++ .../html/web/tau/helloworld_w.htm | 183 ++ org.tizen.ui.practices/html/web/tau/helper_ww.htm | 230 +++ .../html/web/tau/indexscrollbar_ww.htm | 202 ++ org.tizen.ui.practices/html/web/tau/list_ww.htm | 191 ++ .../html/web/tau/managing_page_w.htm | 262 +++ .../html/web/tau/moreoptions_ww.htm | 184 ++ org.tizen.ui.practices/html/web/tau/notepad_w.htm | 448 +++++ org.tizen.ui.practices/html/web/tau/popup_ww.htm | 114 ++ .../html/web/tau/processing_ww.htm | 105 + .../html/web/tau/tau_porting_w.htm | 817 ++++++++ .../html/web/tau/thumbnail_ww.htm | 158 ++ .../html/web/tau/ui_component_w.htm | 211 ++ .../html/web/w3c/animation_w.htm | 336 ++++ .../html/web/w3c/background_w.htm | 188 ++ org.tizen.ui.practices/html/web/w3c/basic_ui_w.htm | 201 ++ .../html/web/w3c/clipboard_mw.htm | 288 +++ org.tizen.ui.practices/html/web/w3c/color_w.htm | 222 +++ .../html/web/w3c/drag_drop_mw.htm | 318 +++ org.tizen.ui.practices/html/web/w3c/flexible_w.htm | 355 ++++ org.tizen.ui.practices/html/web/w3c/font_w.htm | 214 ++ .../html/web/w3c/frame_flattening_mw.htm | 60 + .../html/web/w3c/guides_w3c_w.htm | 142 ++ .../html/web/w3c/html5forms_w.htm | 432 ++++ .../html/web/w3c/html_priority_w.htm | 449 +++++ .../html/web/w3c/media_query_w.htm | 342 ++++ org.tizen.ui.practices/html/web/w3c/multi_mw.htm | 611 ++++++ .../html/web/w3c/multiple_screens_mw.htm | 372 ++++ org.tizen.ui.practices/html/web/w3c/selector_w.htm | 214 ++ .../html/web/w3c/session_history_w.htm | 204 ++ .../html/web/w3c/text_module_w.htm | 244 +++ .../html/web/w3c/transform_w.htm | 772 ++++++++ .../html/web/w3c/transition_w.htm | 382 ++++ .../html/web/w3c/ui_layout_ww.htm | 706 +++++++ org.tizen.ui.practices/html/web/w3c/woff_w.htm | 132 ++ org.tizen.ui.practices/index.xml | 235 +++ org.tizen.ui.practices/plugin.xml | 8 + 1809 files changed, 78122 insertions(+), 58124 deletions(-) create mode 100644 org.tizen.devtools/html/images/Thumbs.db create mode 100644 org.tizen.devtools/html/images/fallback_directory.png create mode 100644 org.tizen.devtools/html/images/fallback_folding.png create mode 100644 org.tizen.devtools/html/images/fallback_hierarchy.png create mode 100644 org.tizen.devtools/html/images/fallback_icon.png create mode 100644 org.tizen.devtools/html/images/fallback_lists.png create mode 100644 org.tizen.devtools/html/images/fallback_output.png create mode 100644 org.tizen.devtools/html/images/fallback_resmanager.png create mode 100644 org.tizen.devtools/html/images/fallback_resxml.png create mode 100644 org.tizen.devtools/html/images/fallback_tablist.png create mode 100644 org.tizen.devtools/html/images/mobile_s_n.png create mode 100644 org.tizen.devtools/html/images/mobile_s_w.png create mode 100644 org.tizen.devtools/html/images/mobile_s_wn.png create mode 100644 org.tizen.devtools/html/images/storyboard_add_new.png create mode 100644 org.tizen.devtools/html/images/storyboard_codegen.png create mode 100644 org.tizen.devtools/html/images/storyboard_conn_properties.png create mode 100644 org.tizen.devtools/html/images/storyboard_contextmenu.png create mode 100644 org.tizen.devtools/html/images/storyboard_diagram.png create mode 100644 org.tizen.devtools/html/images/storyboard_drag.png create mode 100644 org.tizen.devtools/html/images/storyboard_properties.png create mode 100644 org.tizen.devtools/html/images/storyboard_wizard.png create mode 100644 org.tizen.devtools/html/images/wearable_s_n.png create mode 100644 org.tizen.devtools/html/images/wearable_s_w.png create mode 100644 org.tizen.devtools/html/images/wearable_s_wn.png create mode 100644 org.tizen.devtools/html/native_tools/resource_explorer_n.htm create mode 100644 org.tizen.devtools/html/native_tools/storyboard_n.htm create mode 100644 org.tizen.gettingstarted/html/images/mobile_s_n.png create mode 100644 org.tizen.gettingstarted/html/images/mobile_s_w.png create mode 100644 org.tizen.gettingstarted/html/images/mobile_s_w_optional.png create mode 100644 org.tizen.gettingstarted/html/images/mobile_s_wn.png create mode 100644 org.tizen.gettingstarted/html/images/wearable_s_n.png create mode 100644 org.tizen.gettingstarted/html/images/wearable_s_w.png create mode 100644 org.tizen.gettingstarted/html/images/wearable_s_w_optional.png create mode 100644 org.tizen.gettingstarted/html/images/wearable_s_wn.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_browser.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_browser2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_calendar.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_calendar2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_calendar3.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_calendar4.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_call1.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_call2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_contact_add.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_contact_edit.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_contact_select.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_contact_view1.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_contact_view2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_email.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_email2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_email3.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_email4.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_message.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_message2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_message3.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_message4.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_bluetooth.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_bluetooth2.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_location.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_nfc.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_setting.png create mode 100644 org.tizen.guides/html/images/common_appcontrol_system_wifi.png create mode 100644 org.tizen.guides/html/images/hw_acceleration.png create mode 100644 org.tizen.guides/html/images/mobile_s_n.png create mode 100644 org.tizen.guides/html/images/mobile_s_w.png create mode 100644 org.tizen.guides/html/images/mobile_s_w_optional.png create mode 100644 org.tizen.guides/html/images/shortcut.png create mode 100644 org.tizen.guides/html/images/wearable_s_n.png create mode 100644 org.tizen.guides/html/images/wearable_s_w.png create mode 100644 org.tizen.guides/html/images/wearable_s_w_optional.png create mode 100644 org.tizen.guides/html/native/account/account_manager_n.htm create mode 100644 org.tizen.guides/html/native/app/alarm_n.htm create mode 100644 org.tizen.guides/html/native/app/appcontrol_n.htm create mode 100644 org.tizen.guides/html/native/app/common_appcontrol_n.htm create mode 100644 org.tizen.guides/html/native/app/event_n.htm create mode 100644 org.tizen.guides/html/native/app/internationalization_n.htm create mode 100644 org.tizen.guides/html/native/graphics/hw_acceleration_n.htm create mode 100644 org.tizen.guides/html/native/migration_guide_n.htm create mode 100644 org.tizen.guides/html/native/ui/minicontrol_n.htm create mode 100644 org.tizen.sampledescriptions/html/images/mediacontrol_client_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/mediacontrol_server_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_data_sink_view_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_data_source_view_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_edje_layout_data_sink_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_edje_layout_data_source_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_edje_layout_main_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_edje_structure_data_sink_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_edje_structure_data_source_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_ui_layout_data_sink_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_ui_layout_data_source_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_ui_layout_main_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_ui_structure_data_sink_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_ui_structure_data_source_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_workflow_message_structure_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_workflow_startup_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_workflow_text_receive_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/messageport_workflow_text_send_sd.png create mode 100644 org.tizen.sampledescriptions/html/images/mobile_s_n.png create mode 100644 org.tizen.sampledescriptions/html/images/mobile_s_w.png create mode 100644 org.tizen.sampledescriptions/html/images/mobile_s_wn.png create mode 100644 org.tizen.sampledescriptions/html/images/wearable_s_n.png create mode 100644 org.tizen.sampledescriptions/html/images/wearable_s_w.png create mode 100644 org.tizen.sampledescriptions/html/images/wearable_s_wn.png create mode 100644 org.tizen.sampledescriptions/html/mobile_n/mediacontroller_client_sd_mn.htm create mode 100644 org.tizen.sampledescriptions/html/mobile_n/mediacontroller_server_sd_mn.htm create mode 100644 org.tizen.sampledescriptions/html/mobile_n/messageport_sd_mn.htm create mode 100644 org.tizen.tutorials/html/images/mobile_s_n.png create mode 100644 org.tizen.tutorials/html/images/mobile_s_w.png create mode 100644 org.tizen.tutorials/html/images/mobile_s_w_optional.png create mode 100644 org.tizen.tutorials/html/images/wearable_s_n.png create mode 100644 org.tizen.tutorials/html/images/wearable_s_w.png create mode 100644 org.tizen.tutorials/html/images/wearable_s_w_optional.png create mode 100644 org.tizen.tutorials/html/native/account/account_tutorial_n.htm create mode 100644 org.tizen.tutorials/html/native/app_framework/alarm_tutorial_n.htm create mode 100644 org.tizen.tutorials/html/native/app_framework/appcontrol_tutorial_n.htm create mode 100644 org.tizen.tutorials/html/native/app_framework/event_tutorial_n.htm create mode 100644 org.tizen.tutorials/html/native/app_framework/preference_tutorial_n.htm create mode 100644 org.tizen.tutorials/html/native/ui/minicontrol_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/.project delete mode 100755 org.tizen.ui.guides/META-INF/MANIFEST.MF delete mode 100755 org.tizen.ui.guides/build.properties delete mode 100755 org.tizen.ui.guides/html/cover_page.htm delete mode 100755 org.tizen.ui.guides/html/css/snippet.css delete mode 100755 org.tizen.ui.guides/html/css/styles.css delete mode 100755 org.tizen.ui.guides/html/images/after_resize.png delete mode 100755 org.tizen.ui.guides/html/images/before_resize.png delete mode 100644 org.tizen.ui.guides/html/images/dali_threads.png delete mode 100755 org.tizen.ui.guides/html/images/mn_division.png delete mode 100755 org.tizen.ui.guides/html/images/mw_division.png delete mode 100755 org.tizen.ui.guides/html/images/n_division.png delete mode 100644 org.tizen.ui.guides/html/images/round_footer.png delete mode 100644 org.tizen.ui.guides/html/images/round_moreoption.png delete mode 100644 org.tizen.ui.guides/html/images/round_multibtn.png delete mode 100644 org.tizen.ui.guides/html/images/round_processing.png delete mode 100644 org.tizen.ui.guides/html/images/tizen_project_dali.png delete mode 100755 org.tizen.ui.guides/html/images/w_division.png delete mode 100755 org.tizen.ui.guides/html/images/wn_division.png delete mode 100755 org.tizen.ui.guides/html/images/ww_division.png delete mode 100755 org.tizen.ui.guides/html/index.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/actors_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/animation_types_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/background_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/buttons_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/constraints_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/control_base_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/dali_applications_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/dali_overview_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/event_handling_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/guides_dali_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/handle_n.htm delete mode 100644 org.tizen.ui.guides/html/native/dali/imageview_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/itemview_n.htm delete mode 100644 org.tizen.ui.guides/html/native/dali/layout_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/multi_threaded_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/properties_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/rendering_effects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/resources_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/scrollview_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/tableview_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/textfield_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/textlabel_n.htm delete mode 100755 org.tizen.ui.guides/html/native/dali/ui_components_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/animation_effects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/basic_tutorial_mn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/button_tutorial_wn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/component_custom_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/component_focus_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/component_infra_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/containers_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/core_loop_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/data_types_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/data_types_tools_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/datetime_tutorial_wn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ecore_animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ecore_animation_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edc_optimization_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edc_part_block_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edc_positioning_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_animation_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_color_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_files_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_intro_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_manage_animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_message_signal_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_objects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_perspective_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_scaling_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/edje_text_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/efl_overview_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/elementary_animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/elementary_animation_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/elementary_transit_effect_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_advanced_objects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_basic_objects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_map_animation_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_map_effects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_objects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_optimization_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/evas_rendering_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/event_handling_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/event_types_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/font_setting_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/form_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/genlist_tutorial_mn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/genlist_tutorial_wn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/graphical_objects_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/guides_efl_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/hw_input_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/layout_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/main_loop_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/menu_tutorial_mn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/multiple_screens_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/multipoint_touch_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/naviframe_tutorial_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/notification_window_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/panes_tutorial_mn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/popup_tutorial_wn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/scalability_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/theme_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/threads_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/tools_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/touch_gesture_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ui_components_mn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ui_components_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ui_components_wn.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ui_containers_n.htm delete mode 100755 org.tizen.ui.guides/html/native/efl/ui_scalability_n.htm delete mode 100755 org.tizen.ui.guides/html/native/guides_n.htm delete mode 100755 org.tizen.ui.guides/html/scripts/common.js delete mode 100755 org.tizen.ui.guides/html/scripts/core.js delete mode 100755 org.tizen.ui.guides/html/scripts/jquery.util.js delete mode 100755 org.tizen.ui.guides/html/scripts/jquery.zclip.min.js delete mode 100755 org.tizen.ui.guides/html/scripts/navi.js delete mode 100755 org.tizen.ui.guides/html/scripts/search.js delete mode 100755 org.tizen.ui.guides/html/scripts/showhide.js delete mode 100755 org.tizen.ui.guides/html/web/guides_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/accessibility_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/circle_progressbar_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/circular_ui_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/event_handling_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/footerbutton_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/globalization_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/guides_tau_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/header_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/helloworld_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/helper_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/indexscrollbar_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/list_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/managing_page_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/moreoptions_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/notepad_w.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/popup_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/processing_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/thumbnail_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/tau/ui_component_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/animation_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/background_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/basic_ui_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/clipboard_mw.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/color_w.htm delete mode 100644 org.tizen.ui.guides/html/web/w3c/drag_drop_mw.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/flexible_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/font_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/frame_flattening_mw.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/guides_w3c_w.htm delete mode 100644 org.tizen.ui.guides/html/web/w3c/html5forms_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/html_priority_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/media_query_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/multi_mw.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/multiple_screens_mw.htm delete mode 100644 org.tizen.ui.guides/html/web/w3c/selector_w.htm delete mode 100644 org.tizen.ui.guides/html/web/w3c/session_history_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/text_module_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/transform_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/transition_w.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/ui_layout_ww.htm delete mode 100755 org.tizen.ui.guides/html/web/w3c/woff_w.htm delete mode 100755 org.tizen.ui.guides/index.xml delete mode 100755 org.tizen.ui.guides/plugin.xml create mode 100644 org.tizen.ui.practices/.project create mode 100644 org.tizen.ui.practices/META-INF/MANIFEST.MF rename {org.tizen.ui.guides => org.tizen.ui.practices}/about.html (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/build.properties create mode 100644 org.tizen.ui.practices/html/cover_page.htm create mode 100644 org.tizen.ui.practices/html/css/snippet.css create mode 100644 org.tizen.ui.practices/html/css/styles.css rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/4_columns.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/9patch.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/9patch_buffer.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/9patch_resource.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/9patch_zoomed.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/accordion_menu.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/actor_coordinates.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/actor_position.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/actor_types.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/after_resize.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/align.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/align_hints.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/anchor_point.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/animation1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/animation_components.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/application_page_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/application_store_sd.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/applying_color.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/applying_invisibility.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/aspect-control-both.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/aspect-control-horizontal.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/aspect-control-none.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/backWearable.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/background_control_color.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/background_image.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/background_image_color.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/background_order.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/background_textlabel.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/base_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/base_scale.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/base_scales.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/basic_layout_480x800.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/basic_layout_720x1280.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/before_resize.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/bg.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/bg_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/bg_util_bar.gif (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/bg_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/blue_box.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/border.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/bottom.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/box.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/box_model_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/box_model_properties_struct.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/btn_top.gif (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_anchor.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_bottom_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_circle.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_drawers.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_dropdown.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_green_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_hover_v.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_hover_v_entry.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_hoversel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_hoversel_entry.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_next_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_option.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_orange_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_recorder.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_red_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_title_cancel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_title_done.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_titleicon_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/button_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/calculator_sd.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/calling_img_sep.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/captured_screen1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/captured_screen2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/change_text_globally.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/changed_order.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/changing_opacity.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_default_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_favorite.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_on_off.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_onoff_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_onoff_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_small_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/check_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/checkbox_button.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circle_datetime.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circle_genlist.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circle_progressbar.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circle_scroller.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circle_slider.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/circle_spinner.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/circular_support.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/coin_flip_effect.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/color_colorplane.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/colorsel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/colorselector_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_break.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_gap.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_rule.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_settings.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_span.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/column_width.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/conformant.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/contextual_bottom_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/contextual_select_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/contextual_top_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/contextual_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/copy_pasting.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_bg1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_bg_tutorial1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_bg_tutorial2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_color_tutorial1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_result.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_transforms1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_transforms2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/css_transforms5.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup_dropdown.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup_dropdown_label.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ctxpopup_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/dali_component.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/dali_threads.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/date2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_date_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_date_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_date_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_time_24h.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_time_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_time_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_time_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/datetime_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/default_order.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/depth.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/dimension_dependency.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/display_text_classes.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/dragdrop.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/dynamic_layout_480x800.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/dynamic_layout_720x1280.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edc_masking.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_color.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_message.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_object_scales.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_signal1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_signal2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/edje_text_main.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_complex_clock.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_complex_clock_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_layers.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_notilevels.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_phone.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_simple_clock.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_simple_clock_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efl_windowlayer.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/efllibs.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/elementary.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/elementary_app.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/email_sample.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/empty_window.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/enlarge_low_res_image.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry2_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/entry_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_advanced.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_blur1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_blur2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_image_loader.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_image_scaling.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_10.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_11.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_4.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_5.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_6.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_7.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_8.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_9.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_map_effect.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_object_display.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_partial_update.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_scaling1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_scaling2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_scaling3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_smooth_disabled.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/evas_smooth_enabled.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events_flow.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events_scope.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events_using_css3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/events_using_javascript.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/fade_affect_animation.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/fallback_imageset.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/fill_to_parent.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/first_screen_edc.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/fit_to_children.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/fixed.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flex_container.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flexcontainer_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flexible_box_alignment.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flexible_default_structure.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flexible_screen_size.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flexitem_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flip_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/flipsel_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/focal_length.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/font_face.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/font_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/form_contact_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_album_pre.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_block.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_def.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_def_gridtext.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_def_gridtext2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_def_style.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_grp_index.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gengrid_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist1_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist2_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist3_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1line.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icon1_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icon1_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icon_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icon_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icondivider_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text1icondivider_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_1text_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_2text1_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_2text1icon1_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_2text1icon1_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_2text_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_2text_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_def_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_def_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_edit_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_group_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_group_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_htree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_item.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_multi.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_multi1_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_multi2_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_title_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/genlist_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gesture_view2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gl-default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gl-double-label.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/gl-end-icon.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/global_scales.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/globalize_folder_structure.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/globalize_folder_structure_main.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/glview.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/glview_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/glview_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/google_cardboard.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/grid.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/hello_world_dali.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ico_arr_hidden.gif (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ico_bullet_2_7.gif (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_apps.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_arrowdown.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_arrowleft.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_arrowright.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_arrowup.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_chat.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_clock.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_close.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_delete.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_edit.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_file.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_forward.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_home.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_info.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_apps.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_arrdown.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_arrleft.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_arrright.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_arrup.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_chat.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_clock.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_close.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_delete.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_edit.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_file.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_folder.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_home.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_nophoto.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_menu_refresh.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_next.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_pause.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_photo_nophoto.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_play.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_prev.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_refresh.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_rewind.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_stop.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_apps.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_arrdown.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_arrleft.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_arrright.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_arrup.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_chat.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_clock.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_close.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_delete.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_edit.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_file.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_folder.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_moremenu.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_toolbar_refresh.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/icon_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/idlers.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/image.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/image_after.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/image_before.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/image_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/image_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/immediate_mode.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/import_css_area.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/import_linked_in_head.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_circle_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_default02.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_pagecontrol.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_tab_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_thumb_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_thumb_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/index_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/label.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/label_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/label_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_app.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_calculator.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_calculator_absolute.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_calculator_relative.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_fixed_media.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_flexible_media.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_image.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_image_scaled.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_original.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_original_scaled.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_sample.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_sample_ok.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/layout_sample_ugly.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/list.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/list_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/list_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/main_app_layout.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/map_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/mapbuf_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/mascot.gif (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/media_queries1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/media_queries3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/memory.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/memory2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/memory3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/memory_using_css3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/memory_using_javascript.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/menu_skeleton.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/migrate_move_to_top.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/migrate_padding.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/migrate_scrollable_circle.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/migrate_scrollable_rect.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/mn_division.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/mn_icon.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/mobile_s_n.png create mode 100644 org.tizen.ui.practices/html/images/mobile_s_w.png create mode 100644 org.tizen.ui.practices/html/images/mobile_s_w_optional.png create mode 100644 org.tizen.ui.practices/html/images/more_option.png create mode 100644 org.tizen.ui.practices/html/images/more_option_item.png create mode 100644 org.tizen.ui.practices/html/images/more_option_main.png create mode 100644 org.tizen.ui.practices/html/images/more_option_sub.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/moving1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/moving2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multi_button_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multi_node_selection.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multi_threading.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multi_threading2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multiple_layout_example.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/multipoint_touch.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/mw_division.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/mw_icon.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/mw_icon_optional.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/n_division.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/network.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/network2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/network3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/network_speed_sprite.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/nine_patch_dali.9.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/nine_patch_expanded.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/nine_patch_explained.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/notify_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/object_size_16.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/object_size_22.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/object_size_44.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/padding-hints.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/pane_tuto.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/panel_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/panel_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/panes.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/parent_origin.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/path_animation.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/perspective_buttons.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/perspective_screen.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/perspective_swallow.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/photo_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/photocam_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/plug_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_circle_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_toast.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_toast_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_toast_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/popup_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/pos_map_all.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_group_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_pending_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_process_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_process_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_small_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_wheel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/progressbar_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/pseudo_elements_selector_range.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/pseudo_elements_selector_required.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/push_button.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_button.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_default_o_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_default_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_state_changes.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/radio_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_footer.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_header.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_index.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_list.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_moreoption.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_multibtn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_popup_bottom.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_popup_side.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_processing.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_progress.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rectangular_thumbnail.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/redrawing01.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/redrawing02.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/redrawing03.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/redrawing04.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/redrawing05.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rel1_rel2_offsets.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rel1_rel2_offsets_and_relative.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/removing_padding.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rendering1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/retained_mode.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/rotary_event.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/rotary_selector.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_item.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_main.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_main_text.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_selector.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_sub.png create mode 100644 org.tizen.ui.practices/html/images/rotary_selector_sub_text.png create mode 100644 org.tizen.ui.practices/html/images/round_footer.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_header.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_index.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_list.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/round_moreoption.png create mode 100644 org.tizen.ui.practices/html/images/round_multibtn.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_popup_bottom.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_popup_side.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/round_processing.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_progress.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/round_thumbnail.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scalable_group1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scalable_group2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_1.3_finger_50.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_1_finger_50.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_1_finger_90.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_align_hint.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_box.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_10.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_4.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_5.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_6.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_7.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_8.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_effect_9.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_image.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_image_set.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_part.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_part_aspect.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_text.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_example_text_fit.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_fixed.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_fixed_flexible.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_fixed_height.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_flexible_height.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_grid.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_original_image.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_relative.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_relative_scaled.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_testing_app.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_values.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_values2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_weight_hint.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scale_weight_hint_multiple.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scaling.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/screenshot_1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/screenshot_2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/scrollview.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/segm_control_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/segment.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/segment_control_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/segment_text.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/setting_sd.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/show_frametime.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/signal_slot.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/single_node_selection.png (100%) rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_hor.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_hor_center.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_hor_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_ver.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_ver_center.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/slider_wn.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/spin.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/spinner_hor.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/spinner_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/spinner_ver.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/spiral.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/stereo_projection.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_def.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_defstyle.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_doublelabel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_end.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_full.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_group.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_message.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/styleguide_genlist_oneicon.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/tableview.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/tau_animation_1.png create mode 100644 org.tizen.ui.practices/html/images/tau_animation_2.png create mode 100644 org.tizen.ui.practices/html/images/tau_animation_3.png create mode 100644 org.tizen.ui.practices/html/images/tau_animation_4.png create mode 100644 org.tizen.ui.practices/html/images/tau_animation_5.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/text_class_list.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/text_class_list_del.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/text_class_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/text_properties.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/text_screen_2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/textfield.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/textlabel.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/thread_pool_lifecycle_1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/thread_pool_lifecycle_2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/thread_pool_lifecycle_3.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/tizen_project_dali.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/toolbar.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/toolbar_default.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/toolbar_navigation.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/toolbar_tabbar.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/toolbar_tree.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/transit_rotation_zoom.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/transitions1.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/transitions2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/transitions3.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/transitions5.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ui_control_hierarchy.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ui_controls.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/uilayout_view2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/use_natural_size.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/using_clipper.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/using_clipper2.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/using_import_attribute.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/view_main.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/w_division.png create mode 100644 org.tizen.ui.practices/html/images/wearable_s_n.png create mode 100644 org.tizen.ui.practices/html/images/wearable_s_w.png create mode 100644 org.tizen.ui.practices/html/images/wearable_s_w_optional.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/win_tree.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/wn_division.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/wn_icon.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/images/ww_division.png rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ww_icon.png (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/images/ww_icon_optional.png (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/index.htm create mode 100644 org.tizen.ui.practices/html/native/dali/actors_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/animation_types_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/background_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/buttons_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/constraints_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/control_base_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/dali_applications_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/dali_overview_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/event_handling_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/guides_dali_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/handle_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/imageview_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/itemview_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/layout_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/multi_threaded_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/properties_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/rendering_effects_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/resources_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/scrollview_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/tableview_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/textfield_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/textlabel_n.htm create mode 100644 org.tizen.ui.practices/html/native/dali/ui_components_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/animation_effects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/basic_tutorial_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/button_tutorial_wn.htm rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/native/efl/circle_components_wn.htm (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/native/efl/component_background_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_background_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_button_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_button_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_check_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_check_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_datetime_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_genlist_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_object_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_option_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_progressbar_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_rotary_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_scroller_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_slider_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_spinner_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_circ_surface_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_colorselector_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_ctxpopup_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_ctxpopup_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_custom_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_datetime_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_datetime_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_entry_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_entry_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_flip_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_focus_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_gengrid_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_genlist_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_genlist_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_glview_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_glview_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_icon_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_icon_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_image_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_image_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_index_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_index_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_infra_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_label_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_label_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_list_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_list_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_map_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_notify_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_notify_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_panel_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_photocam_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_plug_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_plug_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_popup_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_popup_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_progressbar_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_progressbar_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_radio_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_radio_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_segmentcontrol_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_slider_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_slider_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_spinner_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_toolbar_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_tooltip_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_win_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/component_win_wn.htm rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/native/efl/components_mn.htm (100%) mode change 100755 => 100644 rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/native/efl/components_wn.htm (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/native/efl/containers_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/core_loop_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/data_types_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/data_types_tools_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/datetime_tutorial_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ecore_animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ecore_animation_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edc_optimization_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edc_part_block_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edc_positioning_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_animation_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_color_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_files_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_intro_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_manage_animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_message_signal_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_objects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_perspective_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_scaling_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/edje_text_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/efl_overview_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/elementary_animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/elementary_animation_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/elementary_transit_effect_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_advanced_objects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_basic_objects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_map_animation_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_map_effects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_objects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_optimization_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/evas_rendering_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/event_handling_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/event_types_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/font_resource_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/font_setting_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/form_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/genlist_tutorial_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/genlist_tutorial_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/graphical_objects_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/guides_efl_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/hw_input_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/key_events_mn.htm rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/native/efl/key_events_n.htm (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/native/efl/key_grab_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/layout_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/main_loop_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/menu_tutorial_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/multiple_screens_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/multipoint_touch_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/naviframe_tutorial_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/notification_window_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/panes_tutorial_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/popup_tutorial_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/resource_fallback_n.htm rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/native/efl/rotary_events_n.htm (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/native/efl/rotary_events_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/scalability_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/theme_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/threads_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/tools_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/touch_gesture_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ui_components_mn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ui_components_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ui_components_wn.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ui_containers_n.htm create mode 100644 org.tizen.ui.practices/html/native/efl/ui_scalability_n.htm create mode 100644 org.tizen.ui.practices/html/native/guides_n.htm create mode 100644 org.tizen.ui.practices/html/scripts/common.js create mode 100644 org.tizen.ui.practices/html/scripts/core.js create mode 100644 org.tizen.ui.practices/html/scripts/jquery.util.js create mode 100644 org.tizen.ui.practices/html/scripts/jquery.zclip.min.js create mode 100644 org.tizen.ui.practices/html/scripts/navi.js create mode 100644 org.tizen.ui.practices/html/scripts/search.js create mode 100644 org.tizen.ui.practices/html/scripts/showhide.js rename {org.tizen.ui.guides => org.tizen.ui.practices}/html/scripts/snippet.js (100%) mode change 100755 => 100644 create mode 100644 org.tizen.ui.practices/html/web/guides_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/accessibility_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/animation_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/circle_progressbar_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/circular_ui_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/creating_animation_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/event_handling_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/footerbutton_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/globalization_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/guides_tau_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/header_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/helloworld_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/helper_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/indexscrollbar_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/list_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/managing_page_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/moreoptions_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/notepad_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/popup_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/processing_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/tau_porting_w.htm create mode 100644 org.tizen.ui.practices/html/web/tau/thumbnail_ww.htm create mode 100644 org.tizen.ui.practices/html/web/tau/ui_component_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/animation_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/background_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/basic_ui_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/clipboard_mw.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/color_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/drag_drop_mw.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/flexible_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/font_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/frame_flattening_mw.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/guides_w3c_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/html5forms_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/html_priority_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/media_query_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/multi_mw.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/multiple_screens_mw.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/selector_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/session_history_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/text_module_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/transform_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/transition_w.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/ui_layout_ww.htm create mode 100644 org.tizen.ui.practices/html/web/w3c/woff_w.htm create mode 100644 org.tizen.ui.practices/index.xml create mode 100644 org.tizen.ui.practices/plugin.xml diff --git a/org.tizen.devtools/html/common_tools/certificate_registration.htm b/org.tizen.devtools/html/common_tools/certificate_registration.htm index 38ed441..92dd408 100644 --- a/org.tizen.devtools/html/common_tools/certificate_registration.htm +++ b/org.tizen.devtools/html/common_tools/certificate_registration.htm @@ -22,7 +22,7 @@
-

Mobile Web Wearable Web Mobile native Wearable native

+

Mobile Wearable

Certificate Registration

diff --git a/org.tizen.devtools/html/common_tools/connection_explorer.htm b/org.tizen.devtools/html/common_tools/connection_explorer.htm index 40468d5..27e7fbf 100644 --- a/org.tizen.devtools/html/common_tools/connection_explorer.htm +++ b/org.tizen.devtools/html/common_tools/connection_explorer.htm @@ -18,7 +18,7 @@
-

Mobile Web Wearable Web Mobile native Wearable native

+

Mobile Wearable

Content

diff --git a/org.tizen.devtools/html/common_tools/emulator.htm b/org.tizen.devtools/html/common_tools/emulator.htm index 766bff9..b5b7bc5 100644 --- a/org.tizen.devtools/html/common_tools/emulator.htm +++ b/org.tizen.devtools/html/common_tools/emulator.htm @@ -19,7 +19,7 @@
-

Mobile Web Wearable Web Mobile native Wearable native

+

Mobile Wearable

Content

@@ -226,21 +226,22 @@
  • OpenGL® ES version -

    You can select OpenGL® ES version you want to use in Mac OS®. +

    You can select the OpenGL® ES version you want to use in Mac OS®.

      -
    • v2.0 & v3.0
    • -
    • v1.1 & v2.0
    • +
    • v2.0 & v3.0
    • +
    • v1.1 & v2.0
    + - - - - - - - - -
    Note
    If GPU acceleration is set to OFF or Disable, this option is not available.
    + + + Note + + + If GPU acceleration is set to OFF or Disable, this option is not available. + + +
  • Advanced Option @@ -248,14 +249,14 @@
  • PO File Editor
  • -
  • UI Builder
  • +
  • UI Builder + +
  • Enventor
  • Command Line Interface - +
  • Call Stack View
  • Dynamic Analyzer @@ -102,7 +106,8 @@
  • Static Analyzer
  • Valgrind
  • -
  • T-trace
  • +
  • T-trace
  • +
  • Resource Explorer
  • diff --git a/org.tizen.devtools/html/native_tools/api_privilege_checker_n.htm b/org.tizen.devtools/html/native_tools/api_privilege_checker_n.htm index 542474b..400b70f 100644 --- a/org.tizen.devtools/html/native_tools/api_privilege_checker_n.htm +++ b/org.tizen.devtools/html/native_tools/api_privilege_checker_n.htm @@ -19,7 +19,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    API and Privilege Checker

    diff --git a/org.tizen.devtools/html/native_tools/call_stack_view_n.htm b/org.tizen.devtools/html/native_tools/call_stack_view_n.htm index 779f0e9..23a3e52 100644 --- a/org.tizen.devtools/html/native_tools/call_stack_view_n.htm +++ b/org.tizen.devtools/html/native_tools/call_stack_view_n.htm @@ -19,7 +19,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Call Stack View

    diff --git a/org.tizen.devtools/html/native_tools/command_line_interface_n.htm b/org.tizen.devtools/html/native_tools/command_line_interface_n.htm index e4632b0..38278f3 100644 --- a/org.tizen.devtools/html/native_tools/command_line_interface_n.htm +++ b/org.tizen.devtools/html/native_tools/command_line_interface_n.htm @@ -19,7 +19,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Command Line Interface

    @@ -105,10 +105,11 @@ Sets the default connection timeout value. The default is 60000 milliseconds.

    $ tizen cli-config –g default.profiles.path=/home/workspace/.metadata/.plugins/org.tizen.common.sign/profiles.xml -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
    -
    +> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml" + +
  • List all options for which values are set:

     $ tizen cli-config –l
    @@ -171,10 +172,10 @@ tizen create native-project [-p|--profile <profile name>] [-t|--template &
     $ tizen create native-project –p mobile-2.3 –t basic_ui –n basic -- /home/workspace
     $ cd /home/workspace/basic
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat create native-project –p mobile-2.3 –t basic_ui –n basic -- C:\Users\workspace
    -> cd C:\Users\workspace\basic
    +> tizen.bat create native-project –p mobile-2.3 –t basic_ui –n basic -- C:\Users\workspace
    +> cd C:\Users\workspace\basic
     
  • @@ -204,11 +205,12 @@ tizen build-native [-a|--arch <architecture name>] [-c|--compiler <comp $ tizen build-native -–arch x86 –-compiler llvm –-configuration Debug -- /home/workspace/basic $ ls /home/workspace/basic/Debug/ -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat build-native -–arch x86 –-compiler llvm –-configuration Debug -- C:\Users\workspace\basic
    -> dir C:\Users\workspace\basic\Debug
    -
    +> tizen.bat build-native -–arch x86 –-compiler llvm –-configuration Debug -- C:\Users\workspace\basic +> dir C:\Users\workspace\basic\Debug + +
  • Build the project with the default options:

     $ tizen cli-config –l
    @@ -218,34 +220,35 @@ default.build.configuration=Debug
     $ tizen build-native -- /home/workspace/basic
     $ ls /home/workspace/basic/Debug/
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat build-native -- C:\Users\workspace\basic
    -> dir C:\Users\workspace\basic\Debug
    +> tizen.bat build-native -- C:\Users\workspace\basic
    +> dir C:\Users\workspace\basic\Debug
     
  • - - - tizen clean - + + + + tizen clean +
     tizen clean [--]
     
    - Clean the Tizen native project. - + Clean the Tizen native project. +
    • Clean the project:

       $ tizen clean -- /home/workspace/basic
       
      -

      or for Windows,

      +

      Or for Windows:

      -> tizen.bat clean -- C:\Users\workspace\basic
      +> tizen.bat clean -- C:\Users\workspace\basic
       
    - + tizen package @@ -275,17 +278,18 @@ tizen package [-t | --type <package type>] [-s | --sign <security profi
     $ tizen cli-config –g default.profiles.path=/home/tizen-sdk/tools/ide/conf/profiles.xml
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\tizen-sdk\tools\ide\conf\profiles.xml"
    -
    +> tizen.bat cli-config –g "default.profiles.path=C:\tizen-sdk\tools\ide\conf\profiles.xml" + +
  • Set up the path of the profile.xml file that is created from the IDE:

     $ tizen cli-config –g default.profiles.path=/home/workspace/.metadata/.plugins/org.tizen.common.sign/profiles.xml
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
    +> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
     
  • Package the profile:

    @@ -295,18 +299,20 @@ $ ls /home/workspace/basic/Debug
     
     org.tizen.basic-1.0.0-i386.tpk
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat package –-type tpk –-sign myprofile -- C:\Users\workspace\basic\Debug
    -
  • +> tizen.bat package –-type tpk –-sign myprofile -- C:\Users\workspace\basic\Debug + +
  • Re-sign the package:

     $ tizen package --type tpk --sign myprofile2 -- /home/workspace/basic/Debug/org.tizen.basic-1.0.0-i386.tpk
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat package --type tpk --sign myprofile2 -- C:\Users\workspace\basic\Debug\org.tizen.basic-1.0.0-i386.tpk
    -
  • +> tizen.bat package --type tpk --sign myprofile2 -- C:\Users\workspace\basic\Debug\org.tizen.basic-1.0.0-i386.tpk + + @@ -332,9 +338,9 @@ tizen install <-t | -target <target name>> <-n | --name <packa
     $ tizen install -–target emulator-26101 –-name org.tizen.basic-1.0.0-i386.tpk -- /home/workspace/basic/Debug
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat install -–target emulator-26101 –-name org.tizen.basic-1.0.0-i386.tpk -- C:\Users\workspace\basic\Debug
    +> tizen.bat install -–target emulator-26101 –-name org.tizen.basic-1.0.0-i386.tpk -- C:\Users\workspace\basic\Debug
     
    diff --git a/org.tizen.devtools/html/native_tools/content_assist_n.htm b/org.tizen.devtools/html/native_tools/content_assist_n.htm index 928b0d8..e388284 100644 --- a/org.tizen.devtools/html/native_tools/content_assist_n.htm +++ b/org.tizen.devtools/html/native_tools/content_assist_n.htm @@ -20,7 +20,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content Assist

    diff --git a/org.tizen.devtools/html/native_tools/da_checkpoint_n.htm b/org.tizen.devtools/html/native_tools/da_checkpoint_n.htm index 34ea149..7e1d0a1 100644 --- a/org.tizen.devtools/html/native_tools/da_checkpoint_n.htm +++ b/org.tizen.devtools/html/native_tools/da_checkpoint_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -36,13 +36,16 @@

    CheckPoint Analysis

    The CheckPoint tab of the dynamic analyzer shows the actual value of variables at specific points of code (CheckPoint). You can trace the changes in the variable value to help in the application debugging.

    The CheckPoints can be set in the IDE source editor, and the CheckPoint value is shown in the dynamic analyzer.

    -

    Figure: CheckPoint analysis

    -

    CheckPoint analysis

    +

    The tab consists of the following views:

    1. CheckPoint chart shows the values of all variables.
    2. CheckPoint list shows the values of a specific variable selected on the chart.
    + +

    Figure: CheckPoint analysis

    +

    CheckPoint analysis

    +

    Setting the CheckPoint in the IDE

    To use the CheckPoint Analysis, you must set a CheckPoint in the IDE source editor. The CheckPoint can be set on any valid point, which is a variable in an executable line:

    diff --git a/org.tizen.devtools/html/native_tools/da_file_n.htm b/org.tizen.devtools/html/native_tools/da_file_n.htm index 264b526..eab4f7b 100644 --- a/org.tizen.devtools/html/native_tools/da_file_n.htm +++ b/org.tizen.devtools/html/native_tools/da_file_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -38,15 +38,17 @@

    File Analysis

    The File tab of the dynamic analyzer shows information associated with file operations. The File tab can be enabled or disabled in runtime from the Configuration dialog. If the file analysis capabilities are disables, the file API information is not displayed.

    - -

    Figure: File analysis

    -

    File analysis

    +

    The tab consists of the following views:

    1. File chart shows file operations (open/close, read/write, lock) as a time flow chart.
    2. File API List view shows the file APIs that are associated with the file selected in the file chart.
    3. File Details view shows detail information of the file selected in the file chart.
    + +

    Figure: File analysis

    +

    File analysis

    +

    Together, the views shows the following information:

    • Name and location of the file
    • Current state of the file (closed or open)
    • diff --git a/org.tizen.devtools/html/native_tools/da_network_n.htm b/org.tizen.devtools/html/native_tools/da_network_n.htm index 9dff939..3899547 100644 --- a/org.tizen.devtools/html/native_tools/da_network_n.htm +++ b/org.tizen.devtools/html/native_tools/da_network_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -40,8 +40,6 @@

      The Network tab of the dynamic analyzer displays network information. It only supports the socket APIs of glibc.

      -

      Figure: Network analysis

      -

      Network analysis

      The tab consists of the following views:

        @@ -50,6 +48,9 @@
      1. Network Details view shows detail information of the socket selected in the socket chart.
      +

      Figure: Network analysis

      +

      Network analysis

      +

      Network Chart

      diff --git a/org.tizen.devtools/html/native_tools/da_opengl_n.htm b/org.tizen.devtools/html/native_tools/da_opengl_n.htm index 441b7ad..45dc692 100644 --- a/org.tizen.devtools/html/native_tools/da_opengl_n.htm +++ b/org.tizen.devtools/html/native_tools/da_opengl_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -40,9 +40,7 @@

      The OpenGL (Open Graphics Library) page of the dynamic analyzer displays information about OpenGL® 2.0 and EvasGL.

      -

      Figure: OpenGL® analysis

      -

      OpenGL® analysis

      - +

      The tab consists of the following views:

      • OpenGL® chart shows the elapsed time of the frame.
      • @@ -53,6 +51,9 @@
      • Program list shows all the shader program information.
      • Texture list shows texture information.
      +

      Figure: OpenGL® analysis

      +

      OpenGL® analysis

      +

      OpenGL® Chart

      The OpenGL® chart displays the elapsed frame time with 2 charts:

      diff --git a/org.tizen.devtools/html/native_tools/da_overview_n.htm b/org.tizen.devtools/html/native_tools/da_overview_n.htm index 034da08..5bd41af 100644 --- a/org.tizen.devtools/html/native_tools/da_overview_n.htm +++ b/org.tizen.devtools/html/native_tools/da_overview_n.htm @@ -23,7 +23,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Dynamic Analyzer

      You can monitor the performance and reliability of your Native application on a target device or the Emulator diff --git a/org.tizen.devtools/html/native_tools/da_range_info_n.htm b/org.tizen.devtools/html/native_tools/da_range_info_n.htm index bfae7d1..836fb4d 100644 --- a/org.tizen.devtools/html/native_tools/da_range_info_n.htm +++ b/org.tizen.devtools/html/native_tools/da_range_info_n.htm @@ -21,7 +21,7 @@

      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Range

      diff --git a/org.tizen.devtools/html/native_tools/da_summary_n.htm b/org.tizen.devtools/html/native_tools/da_summary_n.htm index d7f7fdb..59dab2f 100644 --- a/org.tizen.devtools/html/native_tools/da_summary_n.htm +++ b/org.tizen.devtools/html/native_tools/da_summary_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -36,8 +36,7 @@

      Summary

      The Summary tab of the dynamic analyzer provides various information about the application performance.

      -

      Figure: Summary information

      -

      Summary information

      +

      The tab consists of the following views:

        @@ -46,7 +45,8 @@
      1. Function Usage Profiling view shows profiling information of the used methods.
      - +

      Figure: Summary information

      +

      Summary information

      Leaks

      The Leaks view shows data that is recognized as a leak on application runtime, mainly related to memory allocation and file operations.

      diff --git a/org.tizen.devtools/html/native_tools/da_thread_n.htm b/org.tizen.devtools/html/native_tools/da_thread_n.htm index 36af9ea..8b30bab 100644 --- a/org.tizen.devtools/html/native_tools/da_thread_n.htm +++ b/org.tizen.devtools/html/native_tools/da_thread_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -37,8 +37,7 @@

      Thread Analysis

      The Thread tab of the dynamic analyzer displays information about threads and synchronization.

      -

      Figure: Thread analysis

      -

      Thread analysis

      +

      The tab consists of the following views:

      1. Thread chart displays thread and synchronization operations and the thread load as a time flow graph.
      2. @@ -47,6 +46,9 @@
      3. Snapshot view provides additional information in the form of snapshots.
      +

      Figure: Thread analysis

      +

      Thread analysis

      +

      Thread Chart

      The thread chart displays the thread and the related synchronization object in a tree format using a graph.

      You can select either thread or synchronization as a parent of the tree.

      diff --git a/org.tizen.devtools/html/native_tools/da_timeline_n.htm b/org.tizen.devtools/html/native_tools/da_timeline_n.htm index 34ad6ed..60f593b 100644 --- a/org.tizen.devtools/html/native_tools/da_timeline_n.htm +++ b/org.tizen.devtools/html/native_tools/da_timeline_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -35,8 +35,7 @@

      Timeline

      The Timeline tab of the dynamic analyzer shows the data values over time as a graph.

      -

      Figure: Timeline information

      -

      Timeline information

      +

      The tab consists of the following views:

      1. Timeline chart shows the data values in a graph. The chart content can be edited in the Edit chart dialog.
      2. @@ -44,6 +43,9 @@
      3. Call Trace shows the user API calls.
      +

      Figure: Timeline information

      +

      Timeline information

      +

      Timeline Chart

      The timeline chart shows the data values over time as a chart. You can create 12 different charts, which can be selected from the left side of the window.

      diff --git a/org.tizen.devtools/html/native_tools/da_views_n.htm b/org.tizen.devtools/html/native_tools/da_views_n.htm index a29f9b8..8c4f301 100644 --- a/org.tizen.devtools/html/native_tools/da_views_n.htm +++ b/org.tizen.devtools/html/native_tools/da_views_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.devtools/html/native_tools/enventor_n.htm b/org.tizen.devtools/html/native_tools/enventor_n.htm index ea6e775..bad493f 100644 --- a/org.tizen.devtools/html/native_tools/enventor_n.htm +++ b/org.tizen.devtools/html/native_tools/enventor_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native

      @@ -45,13 +45,8 @@

      Enventor

      Tizen SDK provides a useful theme editor tool, Enventor. Enventor supports the text edit function and the preview function for EDC source code. You can edit EDC source code to create your layout using Enventor.

      - -

      For more information about the EDC format, see Edje module and EDC format.

      - -

      Figure: Enventor basic view

      -

      Enventor basic view

      - -

      Before using Enventor, familiarize yourself with the following:

      + +

      Before using Enventor, familiarize yourself with the following:

      + + + + + + + + + +
      Note
      Enventor is supported only in mobile Ubuntu.
      + +

      For more information about the EDC format, see Edje module and EDC format.

      + +

      Figure: Enventor basic view

      +

      Enventor basic view

      + + +

      Enventor Layout

      Basically, the Enventor view is divided into 2 sections, the live view and the text view. The live view is the left pane of the Enventor window and it previews images corresponding to the part objects of EDC source code. The text view is the right pane of the Enventor window and it contains EDC source code.

      diff --git a/org.tizen.devtools/html/native_tools/manifest_elements_n.htm b/org.tizen.devtools/html/native_tools/manifest_elements_n.htm index 0688710..f931f72 100644 --- a/org.tizen.devtools/html/native_tools/manifest_elements_n.htm +++ b/org.tizen.devtools/html/native_tools/manifest_elements_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -340,21 +340,23 @@

      <background-category> Element

      -

      The <background-category> element represents category of the application running on the background.

      +

      The <background-category> element represents the category of the application running on the background.

      - + +
      Note
      <background-category> is not supported for lower than 2.4 version of the API, so an application with <background-category> may failed to be installed on the devices with Tizen lower than version 2.4. In this case, the element can be replaced with <metadata key="http://tizen.org/metadata/bacgkround-category/value"/>
      The <background-category> element is not supported for API versions lower than 2.4. An application with a <background-category> element can fail to be installed on devices with a Tizen version lower than 2.4. In this case, the element can be replaced with <metadata key="http://tizen.org/metadata/bacgkround-category/<value>"/>.
      + - -
      <background-category> element
      -

      Category of the application that is allowed to run on the background

      +
      +

      Category of the application that is allowed to run on the background.

      For more information on the relationship between the elements, see the Element hierarchy.

      Occurrences:

        @@ -372,7 +374,7 @@ value attribute

      Value of background category

      +

      Value of the background category.

      Expected value:

      • String
      • @@ -380,8 +382,10 @@
      -

      For example:

      <background-category value="download"/><!-- for the API version 2.4 or later -->
      -<metadata key="http://tizen.org/metadata/background-category/download"/><!-- for the API version lower than 2.4 -->
      +

      For example:

      +
      +<background-category value="download"/><!--For the API version 2.4 or later-->
      +<metadata key="http://tizen.org/metadata/background-category/download"/><!--For the API version lower than 2.4-->
       
      diff --git a/org.tizen.devtools/html/native_tools/manifest_text_editor_n.htm b/org.tizen.devtools/html/native_tools/manifest_text_editor_n.htm index 5180db2..53f633f 100644 --- a/org.tizen.devtools/html/native_tools/manifest_text_editor_n.htm +++ b/org.tizen.devtools/html/native_tools/manifest_text_editor_n.htm @@ -17,7 +17,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -45,14 +45,7 @@

      A Tizen native application package consists of exactly 1 manifest file, called tizen-manifest.xml, which is used to describe the application information. The manifest file is composed of XML elements, which include the root <manifest> element and its child elements representing application information, such as <version>, and <privileges>. The child elements are organized into a specific hierarchy. The elements can have attributes associated with them, providing more information about the element.

      The manifest file information can be edited using the manifest editor, or you can modify the XML structure directly using the text editor. To open the manifest editor, double-click the tizen-manifest.xml file in the Project Explorer view of the IDE. To use the text editor, right-click the tizen-manifest.xml file in the Project Explorer view and select Open with > Text Editor.

      - - - - - - - -
      Note
      The tizen-manifest.xml file must conform to both the standard XML file format and the Tizen native application specification requirements. Editing the manifest file XML structure with the text editor is intended for advanced users only.
      +

      The following example illustrates the content and structure of a tizen-manifest.xml file:

       <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      @@ -60,8 +53,8 @@
          <author email="email@email.com" href="http://test.com">author</author>
          <description>testdescriptions</description>
          <description xml:lang="en-gb">testdesc</description>
      -   <ui-application appid="org.tizen.uiapp" auto-restart="false" exec="uiapp" launch_mode="single" multiple="false" nodisplay="false"
      -                on-boot="true" taskmanage="true" hw-acceleration="default" type="capp">
      +   <ui-application appid="org.tizen.uiapp" auto-restart="false" exec="uiapp" launch_mode="single" multiple="false" 
      +                   nodisplay="false" on-boot="true" taskmanage="true" hw-acceleration="default" type="capp">
             <label>uiapplication</label>
             <label xml:lang="en-gb">testlang</label>
             <icon>uiapp.png</icon>
      @@ -97,6 +90,14 @@
       </manifest>
       
      + + + + + + + +
      Note
      The tizen-manifest.xml file must conform to both the standard XML file format and the Tizen native application specification requirements. Editing the manifest file XML structure with the text editor is intended for advanced users only.

      Manifest Element Hierarchy

      The Tizen native application manifest file consists of XML elements organized in a hierarchy. The following tree structure shows the relationship between the elements of the tizen-manifest.xml file.

      @@ -114,159 +115,190 @@ <manifest> - +  <author> - +  <description> - +  <service-application> - +  +  <label> - +  +  <icon> - +  +  <app-control> - +  +  +  <operation> - +  +  +  <uri> - +  +  +  <mime> - +  +  <metadata> - +  +  <datacontrol> - +  +  <background-category> - +  <ui-application> - +  +  <label> - +  +  <icon> - +  +  <app-control> - +  +  +  <operation> - +  +  +  <uri> - +  +  +  <mime> - +  +  <metadata> - +  +  <datacontrol> - +  +  <background-category> - +  <account> - +  +  <account-provider> - +  +  +  <icon> - +  +  +  <label> - +  +  +  <capability> @@ -274,67 +306,73 @@ - +  <privileges> - +  +  <privilege> - +  <feature> - +  <profile> - +  <widget-application> - +  +  <icon> - +  +  <label> - +  +  <support-size> - +  <watch-application> - +  +  <icon> - +  +  <label> @@ -460,7 +498,7 @@

      Version number of the application.

      Expected value:

        -
      • Number in the "x.y.z" format, where 0 < x < 255, 0 < y < 255, and 0 < z < 65535
      • +
      • Number in the "x.y.z" format, where 0 <= x <= 255, 0 <= y <= 255, and 0 <= z <= 65535
      @@ -474,10 +512,8 @@

      API version number for the application.

      Expected value:

        -
      • Number in the "x.y.z" format
      • -
      • z is optional
      • -
      • ex) 2.3.1, 2.4
      • -
      +
    • Number in the "x.y.z" format, where z is optional (for example: 2.3.1 or 2.4)
    • +
    @@ -845,24 +881,21 @@ 1 or more (optional) - - - -

    Attributes:

    - - - - - + +

    Attributes:

    + + + +
    @@ -908,30 +941,6 @@
    - - - - - - - - - - - -
    - hw-acceleration attribute

    Application hardware acceleration.

    -

    By default, this value is set to default.

    -

    Expected value:

    -
      -
    • default (Depend on system setting)
    • -
    • on (Use hardware acceleration)
    • -
    • off (Do not use hardware acceleration)
    • -
    -
    - - -
    @@ -978,6 +987,27 @@
    + + + + + + + + + +
    + hw-acceleration attribute

    Indicates the application hardware acceleration status.

    +

    By default, this value is set to default.

    +

    Expected value:

    +
      +
    • default (depends on the system setting)
    • +
    • on (use hardware acceleration)
    • +
    • off (do not use hardware acceleration)
    • +
    +
    + + @@ -213,38 +213,37 @@ tizen build-web [-opt | --optimize] [-euf | --exclude-uifw] [-e | --exclude] [-o $ tizen build-web -- /home/workspace/basic $ cd /home/workspace/basic/.buildResult -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat build-web -- C:\Users\workspace\basic
    -> dir C:\Users\workspace\basic\.buildResult
    -
    - +> tizen.bat build-web -- C:\Users\workspace\basic +> dir C:\Users\workspace\basic\.buildResult + - - + + - + - + @@ -336,9 +335,9 @@ tizen install <-t | -target <target name>> <-n | --name <packa
     $ tizen install --target emulator-26101 --name basic.wgt -- /home/workspace/basic/.buildResult
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat install -–target emulator-26101 –-name basic.wgt -- C:\Users\workspace\basic\.buildResult
    +> tizen.bat install -–target emulator-26101 –-name basic.wgt -- C:\Users\workspace\basic\.buildResult
     
    diff --git a/org.tizen.devtools/html/web_tools/config_editor_w.htm b/org.tizen.devtools/html/web_tools/config_editor_w.htm index e22c169..cb321e1 100644 --- a/org.tizen.devtools/html/web_tools/config_editor_w.htm +++ b/org.tizen.devtools/html/web_tools/config_editor_w.htm @@ -17,7 +17,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Content

    @@ -58,203 +58,203 @@
    - + - - + + - + - - + + - + - - + + - + - + - - + + - + - + - - + + - + - + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - - + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + @@ -491,27 +491,29 @@

    Expected children:

      -
    • src

      -

      Attributes:

      -
        -
      • name

        Mandatory; page handling the requests

      • -
      • reload

        Optional; sets whether the page is reloaded or not when the page already loaded (available values: enable (default), disable)

        Since: 2.4

      • -
    @@ -999,7 +1029,8 @@

    For example:

    <ui-application appid="org.tizen.uiapp" auto-restart="false" exec="uiapp" launch_mode="single" 
    -                multiple="false" hw-acceleration="default" nodisplay="false" on-boot="true" taskmanage="true" type="capp">
    +                multiple="false" nodisplay="false" on-boot="true" taskmanage="true" 
    +                hw-acceleration="default" type="capp">
        <label>uiapplication</label>
        <label xml:lang="en-gb">testlang</label>
        <icon>uiapp.png</icon>
    @@ -1352,7 +1383,7 @@
     

    For more information on the relationship between the elements, see the element hierarchy.

    Occurrences:

      -
    • 1 or more (optional)
    • +
    • 1 (optional)

    Expected children:

    @@ -1362,15 +1393,15 @@ - + - + - +
    <icon>1 or more (optional)1
    <label>1 or more (optional)1
    <support-size>1 or more1

    Attributes:

    @@ -1393,7 +1424,7 @@

    Widget application icon image.

    Occurrences:

      -
    • 1 or more (optional)
    • +
    • 1

    Expected value:

    @@ -1412,7 +1443,7 @@

    Widget application text.

    Occurrences:

      -
    • 1 or more (optional)
    • +
    • 1

    Expected value:

    @@ -1431,7 +1462,7 @@

    Size supported by the widget application.

    Occurrences:

      -
    • 1 or more
    • +
    • 1

    Attributes:

      @@ -1697,4 +1728,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.devtools/html/native_tools/po_file_editor_n.htm b/org.tizen.devtools/html/native_tools/po_file_editor_n.htm index 28cf0b0..34c03b3 100644 --- a/org.tizen.devtools/html/native_tools/po_file_editor_n.htm +++ b/org.tizen.devtools/html/native_tools/po_file_editor_n.htm @@ -21,24 +21,14 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      PO File Editor

      PO file editor is used to edit .po files to generate compiled gettext .mo files, which are used by Tizen native applications to localize the user interface. gettext is GNU Translation Project, an internationalization and localization (i18n) system commonly used for writing multilingual programs on Unix-like computer OS.

      - - - - - - - -
      Note
      There is no specific wizard to create .po files. To create a .po file, go to New > Other > General > File and save the file with the extension .po in the res/po directory. -

      A .po file name usually has the form <ll>_<CC>.po. Here <ll> stands for an ISO 639 2-letter language code, and <CC> stands for an ISO 3166 2-letter country code. For example, for German in Germany, the file name is de_DE.po.

      -

      To open the PO file editor, double-click the .po file in the Project Explorer.

      @@ -62,6 +52,17 @@

      Figure: Removing languages

      Removing languages

      + + + + + + + + +
      Note
      There is no specific wizard to create .po files. To create a .po file, go to New > Other > General > File and save the file with the extension .po in the res/po directory. +

      A .po file name usually has the form <ll>_<CC>.po. Here <ll> stands for an ISO 639 2-letter language code, and <CC> stands for an ISO 3166 2-letter country code. For example, for German in Germany, the file name is de_DE.po.

      +
      diff --git a/org.tizen.devtools/html/native_tools/project_conversion_n.htm b/org.tizen.devtools/html/native_tools/project_conversion_n.htm index eafc395..ba65b4e 100644 --- a/org.tizen.devtools/html/native_tools/project_conversion_n.htm +++ b/org.tizen.devtools/html/native_tools/project_conversion_n.htm @@ -11,39 +11,36 @@ - Project Conversion for CLI + Project Conversion - +
      -
      -

      Mobile native Wearable native

      -
      +
      +

      Mobile native Wearable native

      +
      -

      Project Conversion for CLI

      +

      Project Conversion

      -

      The Tizen SDK provides a method for building an IDE-created project by CLI:

      +

      The Tizen SDK provides a method for building an IDE-created project using the CLI:

        -
      1. Select a Tizen native project in the Project Explorer View of the IDE.
      2. -
      3. Right-click the project, open the context menu, and then click Export to CLI Project.
      4. +
      5. Select a Tizen native project in the Project Explorer view of the IDE.
      6. +
      7. Right-click the project and, in the context menu, click Export to CLI Project.
      -

      When the export is completed, 'make' files in 'Build' folder and 'project_def.prop' file which has many build options, will be added to the converted CLI project.

      +

      During the export, the make files in the Build folder and the project_def.prop file (with many build options) are added to the converted CLI project.

      -

      And then you can build a converted project by the following CLI command.

      -
      -  $ tizen build-native -–arch x86 –-compiler llvm –-configuration Debug -- /home/workspace/basic
      -
      +

      The following table describes the properties in the project_def.prop file.

      @@ -51,131 +48,177 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + +
      - Table: Properties in 'project_def.prop' file + Table: project_def.prop file properties
      Value
      APPNAMEIt is the app name. It must be written in lowercase letters.

      ex) APPNAME = test
      APPNAMEApplication name, which must be written in lowercase letters. +

      For example: APPNAME = test

      typeSelect the application type in app, sharedLib, staticLib

      ex) type = app
      typeApplication type, which can be app, sharedLib, or staticLib. +

      For example: type = app

      profileSelect the profile with version.

      ex) profile = mobile-2.3
      profileProfile with version. +

      For example: profile = mobile-2.3

      USER_SRCSIt is a list of '.c', '.cpp' source files in the current project.
      It can be used with wildcard characters like '*'.
      If more than two files, a separator is a white-space character.

      ex) USER_SRCS = src/*.c
      USER_SRCSList of .c and .cpp source files in the current project. +

      The list can be used with wildcard characters, such as *.

      +

      If there are more than 2 files, a white-space character separator is used.

      +

      For example: USER_SRCS = src/*.c

      USER_DEFSIt is a list of user-defined C files added to the compilation process.
      It must be used without -D characters for C compiler.

      ex) USER_DEFS = ABC DEF
      USER_DEFSList of user-defined C files added to the compilation process. +

      The list must be used without the -D characters for the C compiler.

      +

      For example: USER_DEFS = ABC DEF

      USER_UNDEFSIt is a list of user-defined C files excluded from the compilation process.
      It must be used without -U characters for C compiler.
      USER_UNDEFSList of user-defined C files excluded from the compilation process. +

      The list must be used without the -U characters for the C compiler.

      USER_CPP_DEFSIt is a list of user-defined C++ files added to the compilation process.
      It must be used without -D characters for C++ compiler.
      USER_CPP_DEFSList of user-defined C++ files added to the compilation process. +

      The list must be used without the -D characters for the C++ compiler.

      USER_CPP_UNDEFSIt is a list of user-defined C++ files excluded from the compilation process.
      It must be used without -U characters for C++ compiler.
      USER_CPP_UNDEFSList of user-defined C++ files excluded from the compilation process. +

      The list must be used without the -U characters for the C++ compiler.

      USER_LIBSIt is a list of the library paths added to the linking process.
      It must be used without -l characters.
      USER_LIBSList of library paths added to the linking process. +

      The list must be used without the -l characters.

      USER_OBJSIt is a path list of the '.o' files added to the linking process.USER_OBJSPath list of the .o files added to the linking process.
      USER_OBJS_ABSIt is a absolute path list of the '.o' files added to the linking process.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_OBJS_ABSAbsolute path list of the .o files added to the linking process. +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_INC_DIRSIt is a path list of references for C compiling.
      It must be used without -I characters.

      ex) USER_INC_DIRS = inc
      USER_INC_DIRSPath list of references for C compiling. +

      The list must be used without the -I characters.

      +

      For example: USER_INC_DIRS = inc

      USER_INC_DIRS_ABSIt is an absolute path list of references for C compiling.
      It must be used without -I characters.
      It is recommended to use $(workspace_loc) for IDE compatibility.

      ex) USER_INC_DIRS_ABS = $(workspace_loc)/extlib/lib
      USER_INC_DIRS_ABSAbsolute path list of references for C compiling. +

      The list must be used without the -I characters.

      +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      +

      For example: USER_INC_DIRS_ABS = $(workspace_loc)/extlib/lib

      USER_INC_FILESIt is a path list of '.h' files for C.
      It must be used without -include characters.
      USER_INC_FILESPath list of .h files for C. +

      The list must be used without the -include characters.

      USER_INC_FILES_ABSIt is an absolute path list of '.h' files for C.
      It must be used without -include characters.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_INC_FILES_ABSAbsolute path list of .h files for C. +

      The list must be used without the -include characters.

      +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_CPP_INC_DIRSIt is a path list of references for C++ compiling.
      It must be used without -I characters.
      USER_CPP_INC_DIRSPath list of references for C++ compiling. +

      The list must be used without the -I characters.

      USER_CPP_INC_DIRS_ABSIt is an absolute path list of references for C++ compiling.
      It must be used without -I characters.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_CPP_INC_DIRS_ABSAbsolute path list of references for C++ compiling. +

      The list must be used without the -I characters.

      +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_CPP_INC_FILESIt is a path list of '.h' files for C++.
      It must be used without -include characters.
      USER_CPP_INC_FILESPath list of .h files for C++. +

      The list must be used without the -include characters.

      USER_CPP_INC_FILES_ABSIt is an absolute path list of '.h' files for C++.
      It must be used without -include characters.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_CPP_INC_FILES_ABSAbsolute path list of .h files for C++. +

      The list must be used without the -include characters.

      +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_LIB_DIRSIt is a path list of references for the library linking.
      It must be used without -L characters.
      USER_LIB_DIRSPath list of references for the library linking. +

      The list must be used without the -L characters.

      USER_LIB_DIRS_ABSIt is an absolute path list of references for the library linking.
      It must be used without -L characters.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_LIB_DIRS_ABSAbsolute path list of references for the library linking. +

      The list must be used without the -L characters.

      +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_EDCSIt is a path list of '.edc' files.
      It can be used with wildcard characters like '*'.
      If more than two files, a separator is a white-space character.

      ex) USER_EDCS = res/edje/*.edc
      USER_EDCSPath list of .edc files. +

      The list can be used with wildcard characters, such as *.

      +

      If there are more than 2 files, a white-space character separator is used.

      +

      For example: USER_EDCS = res/edje/*.edc

      USER_EDCS_IMAGE_DIRSIt is a path list of EDC references for compiling like '-id' option of the IDE.USER_EDCS_IMAGE_DIRSPath list of EDC references for compiling, such as the -id option of the IDE.
      USER_EDCS_IMAGE_DIRS_ABSIt is an absolute path list of EDC references for compiling like '-id' option of the IDE.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_EDCS_IMAGE_DIRS_ABSAbsolute path list of EDC references for compiling, such as the -id option of the IDE. +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_EDCS_SOUND_DIRSIt is a path list of EDC references for compiling like '-sd' option of the IDE.USER_EDCS_SOUND_DIRSPath list of EDC references for compiling, such as the -sd option of the IDE.
      USER_EDCS_SOUND_DIRS_ABSIt is an absolute path list of EDC references for compiling like '-sd' option of the IDE.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_EDCS_SOUND_DIRS_ABSAbsolute path list of EDC references for compiling, such as the -sd option of the IDE. +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_EDCS_FONT_DIRSIt is a path list of EDC references for compiling like '-fd' option of the IDE.USER_EDCS_FONT_DIRSPath list of EDC references for compiling, such as the -fd option of the IDE.
      USER_EDCS_FONT_DIRS_ABSIt is an absolute path list of EDC references for compiling like '-fd' option of the IDE.
      It is recommended to use $(workspace_loc) for IDE compatibility.
      USER_EDCS_FONT_DIRS_ABSAbsolute path list of EDC references for compiling, such as the -fd option of the IDE. +

      It is recommended to use $(workspace_loc) for IDE compatibility.

      USER_POSIt is a path list of '.po' files.
      It can be used with wildcard characters like '*'.
      If more than two files, a separator is a white-space character.

      ex) USER_POS = res/po/*.po
      USER_POSPath list of .po files. +

      The list can be used with wildcard characters, such as *.

      +

      If there are more than 2 files, a white-space character separator is used.

      +

      For example: USER_POS = res/po/*.po

      + +

      To build a converted project, use the following CLI command:

      + +
      +$ tizen build-native -–arch x86 –-compiler llvm –-configuration Debug -- /home/workspace/basic
      +
      + - +
      Note
      The converted CLI project cannot be reconverted to the IDE-based project.A converted CLI project cannot be reconverted back to an IDE-based project.
      diff --git a/org.tizen.devtools/html/native_tools/project_wizard_n.htm b/org.tizen.devtools/html/native_tools/project_wizard_n.htm index 6ffe6b1..21dd2a2 100644 --- a/org.tizen.devtools/html/native_tools/project_wizard_n.htm +++ b/org.tizen.devtools/html/native_tools/project_wizard_n.htm @@ -20,7 +20,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.devtools/html/native_tools/resource_explorer_n.htm b/org.tizen.devtools/html/native_tools/resource_explorer_n.htm new file mode 100644 index 0000000..fced898 --- /dev/null +++ b/org.tizen.devtools/html/native_tools/resource_explorer_n.htm @@ -0,0 +1,237 @@ + + + + + + + + + + + + + Resource Explorer + + + + + +
      + +

      Resource Explorer

      + +

      Tizen native applications can run on different types of devices, such as wearable, phone, tablets, and TVs. Tizen also supports various resolutions (WVGA ~ XQXGA) and resources. Regardless of these advantages, remember that you must always polish your work to create an optimal application for each device.

      + +

      Providing Configuration-specific Alternative Resources

      + +

      An application must provide a different UI depending on a specific device configuration, such as the screen size and screen orientation. When developing the application, provide alternative resources for each device display state by grouping them in resource directories.

      + +

      Predefined Resource Directory Hierarchy

      + +

      The res/contents directory contains predefined directories for specific alternative resources, and the res.xml file that is referenced at application runtime.

      + +

      The following example of a BasicUI project shows how to group the resources in your project. Place resources, such as images and sounds, in a specific subdirectory of the project's res/contents directory or the root directory of the contents directory.

      +
      +BasicUI/
      +   res/
      +      contents/
      +         LDPI /
      +               basicui.png
      +         MDPI/
      +            basicui.png
      +         basicui.png
      +         res.xml
      +
      + + + + + + + + + + +
      Note
      Always include default resources in the root directory (not in a subdirectory of the contents directory) to ensure that your application has no dependencies on a specific device configuration.
      + +

      A specific subdirectory is named as configuration-qualifier. The configuration-qualifier is an indicator that represents each device configuration and more content can be appended to it with a dash (-). The following table shows the 2 configuration-qualifier types currently supported by the SDK.

      + + + + + + + + + + + + + + + + + + + + +
      Table: Configuration-qualifiers
      Configuration-qualifier nameType valueDescription
      Language and region codeFor example, en_US or en_UKThe type values have the form ll_CC, where ll stands for an ISO 639 2-letter language code, and the optionally followed CC stands for an ISO 3166 2-upper letter region code.
      DPI (Dot Per Inch) densityLDPI +

      MDPI

      +

      HDPI

      +

      XHDPI

      +

      XXHDPI

      LDPI: low-dpi from 0 to 240 +

      MDPI: medium-dpi from 241 to 300

      +

      HDPI: high-dpi from 301 to 380

      +

      XHDPI: extra-high-dpi from 381 to 480

      +

      XXHDPI: extra-extra-high-dpi from 481 to 600

      + +

      Each application base scale can be applied to each DPI through a relation modification between the DPI and profile factor.

      + + + + + + + + + + + + + + + +
      Table: DPI and profile factor
      DPI type valueSmall screen mobile +

      (profile factor: 0.7)

      Large screen mobile +

      (profile factor: 0.8)

      LDPI +

      MDPI

      +

      HDPI

      +

      XHDPI

      +

      XXHDPI

      0 ~ 1.9 +

      1.9 ~ 2.3

      +

      2.3 ~ 3.0

      +

      3.0 ~ 3.7

      +

      3.7 ~

      0 ~ 2.1 +

      2.1 ~ 2.7

      +

      2.7 ~ 3.4

      +

      3.4 ~ 4.3

      +

      4.3 ~

      + +

      The res.xml file is composed of XML elements and describes where each alternative resource is grouped into a device configuration. The following example shows a res.xml file based on the BasicUI project.

      + +
      +<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      +<res xmlns="http://tizen.org/ns/rm">
      +   <group-image folder="contents">
      +      <node folder="contents/LDPI" screen-dpi-range="from 0 to 240"/>
      +      <node folder="contents/MDPI" screen-dpi-range="from 241 to 300"/>
      +   </group-image>
      +</res>
      +
      + +

      The res.xml file is automatically generated as part of the build packaging process by the IDE. Since editing the res.xml file manually is not easy, the IDE helps to minimize this difficulty by supporting the Resource Explorer view.

      + + + + + + + + + + +
      Note
      You cannot modify the res.xml file manually in IDE. The res.xml file is always overridden by the IDE during the packaging process.
      + +

      Resource Explorer

      +

      The Resource Explorer view helps you to place resources to support specific device configurations, such as different screen densities.

      + +

      In the Resource Explorer view, you can:

      + +
      • Show all resource configurations that the project provides (see the Tab and folding lists figure).
      • +
      • Create multiple configuration-qualifier directories and remove them.
      • +
      • Copy resources to an alternative directory by dragging and dropping into the view area. You can also remove resources.
      • +
      • Generate code snippets by dragging and dropping into the source editor area.
      + + + + + + + + + + +
      Note
      If the Resource Explorer view is not visible, open it by selecting Window > Show View > Other > Resource Explorer from the IDE menu.
      + +

      To place a basicui.png image for LDPI and MDPI ()as shown in the Resource directory hierarchy figure below), use the following steps:

      + +
      1. Open the Resource Configuration dialog by clicking Resource Configuration from the toolbar menu in the Resource Explorer view.
      2. +
      3. Add a configuration by selecting LDPI and MDPI in the DPI combo box.
      4. +
      5. Drag the basicui.png file and drop it into the proper tab list view area in the Resource Explorer view.
      + +

      Figure: Resource directory hierarchy

      +

      Resource directory hierarchy

      + +

      The following figure shows the Tab list view (on the left) and the Folding list view (on the right) of the Resource Explorer view. You can switch between the views using the buttons in the Resource Explorer view toolbar menu (Switch to folding to switch to folding lists and Switch to tabs to switch to tab lists).

      + +

      Figure: Tab and folding lists

      +

      Tab and folding lists

      + +

      Example of Managing Resources in the SDK

      + +

      The following steps provide a quick how-to for managing resources in the SDK:

      + +
      1. Create a BasicUI project.
      2. +
      3. Create a resource directory hierarchy and copy images into it. +

        Resource directory hierarchy and the Resource Explorer

        +
      4. +
      5. Create a res.xml file with the Build Package command.
      6. +
      7. Check the res.xml file. +

        res.xml

        +
      8. +
      9. Add code for loading alternative resources by using the Resource Manager API (in mobile and wearable applications). +

        Resource Manager

        + +
      10. +
      11. Build and run the BasicUI project. +

        Output

      + +

      In case of predefined application layouts (edc), you can use the res.xml file manually.

      + + + + + +
      + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.devtools/html/native_tools/static_analyzer_n.htm b/org.tizen.devtools/html/native_tools/static_analyzer_n.htm index 416027c..df3211d 100644 --- a/org.tizen.devtools/html/native_tools/static_analyzer_n.htm +++ b/org.tizen.devtools/html/native_tools/static_analyzer_n.htm @@ -1,10 +1,10 @@ - - - - - - + + + + + + @@ -12,33 +12,30 @@ Static Analyzer - +
      -

      Mobile nativeWearable native

      +

      Mobile native Wearable native

      - -
      -
      +

      Static Analyzer

      Tizen Static Analyzer is a source code analysis tool that finds bugs in Tizen applications:

        @@ -47,7 +44,7 @@
      • - Checkers selection

        Describes how to select the checkers you want for Static Analysis of your project

        + Selecting Checkers

        Describes how to select the checkers you want for the static analysis of your project.

      • Viewing Static Analyzer Results

        Describes how to view the results analyzed by Tizen Static Analyzer.

        @@ -57,38 +54,39 @@

        Running the Static Analyzer

        To run a static analysis for your application:

          -
        1. -

          Choose the target project in the Project Explorer view, open the context menu, and select Check Potential Bugs with Build.

          -

          Running the Static Analyzer

          +
        2. In the Project Explorer view, right-click the project and select Check Potential Bugs with Build.

          +

          Running the Static Analyzer

        3. View the analysis results in the Potential Bugs view on the right side. -

          Potential Bugs view

          +

          Potential Bugs view

        -

        You can also enable the LLVM Static Analyzer to be run during the build process by changing the setting in the Project Properties: Tizen SDK > Static Analysis.

        +

        You can also enable the LLVM Static Analyzer to be run during the build process by changing the setting in the project properties: Tizen SDK > Static Analysis.

        Figure: Static analysis properties

        -

        Static analysis properties

        +

        Static analysis properties

        + -

        Checkers Selection

        -

        A list of checkers can be selected for Static Analysis. For a new project all the checkers are selected by default.

        +

        Selecting Checkers

        + +

        A list of checkers can be selected for static analysis. For a new project, all the checkers are selected by default.

        To select checkers for your application:

          -
        1. -In the Project Properties view, select Static Analysis. -

          Running the Static Analyzer

          +
        2. In the Project Properties view, select Static Analysis. +

          Running the Static Analyzer

        3. -
        4. -You can selectively set checkers for your project from the list. Selecting/de-selecting a checker will select/de-selct all the sub-checkers. -

          Running the Static Analyzer

          +
        5. You can selectively set checkers for your project from the list. Selecting or clearing a checker selects or clears all the sub-checkers. +

          Selecting the checkers

        6. -
        7. -More info about a checker can be obtained by hovering on it -

          Running the Static Analyzer

          +
        8. To obtain more information on a checker, hover over it. +

          Obtaining checker info

        + + +

        Viewing Static Analyzer Results

        The Tizen Static Analyzer results are displayed in the Potential Bug view after the analysis is completed.

        The Potential Bug view opens automatically, when you make a build or check potential bugs. To open the Potential Bugs explicitly:

        @@ -103,24 +101,40 @@ Type Potential Bugs. Select Potential Bugs and click OK.
      • -

        Figure: Opening the Potential Bug view

        -
        -

        Opening the Potential Bug view

        -

        Opening the Potential Bug view

        -
        +

        Figure: Opening the Potential Bug view

        +

        Opening the Potential Bug view

        +

        Opening the Potential Bug view

        +

        In the Potential Bug view, you can group the warnings based on type or file. You can also select any particular bug and expand it to see the complete flow, which resulted in the issue.

        -

        Figure: Static Analyzer Results

        -

        Static Analyzer Results

        +

        Figure: Static Analyzer results

        +

        Static Analyzer results

        + + + +
      -Go to top +Go to top - + + + + + diff --git a/org.tizen.devtools/html/native_tools/storyboard_n.htm b/org.tizen.devtools/html/native_tools/storyboard_n.htm new file mode 100644 index 0000000..3a2bdc8 --- /dev/null +++ b/org.tizen.devtools/html/native_tools/storyboard_n.htm @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + Storyboard + + + + + +
      +
      + +
      +
      +

      Mobile native Wearable native

      +
      + + +

      Storyboard

      + +

      The purpose of the Tizen Storyboard is to provide an interactive view to help in the design of page transition. Using the Storyboard, you can visualize page transition in the application.

      + +

      The StoryBoard is an additional tab in the WYSIWYG Editor. The StoryBoard view consists of multiple pages of the native UI Builder and a connection which depicts the transition between the pages.

      + +

      Figure: Component diagram

      +

      Component diagram

      + +

      To use the Storyboard:

      +
        +
      1. Create a Storyboard application. +

        To use the Storyboard, you must create a Tizen native project using the template available under the UI Builder Application.

        + +

        Creating a Storyboard application

        +
      2. + +
      3. Add views. +

        When you select the Storyboard tab in the WYSIWYG Editor, the Storyboard graphical viewer opens. If the Naviframe application template is used, the viewer contains 4 views of the application with some default connections between them. Otherwise, the viewer contains no views.

        + +

        A new view can be added by right-clicking the editor or adding a new view in the Navigation view and dragging and dropping the view from the Navigation view to the Storyboard view.

        + +

        Adding a new view in the Storyboard viewer

        + +

        You can move the views in the viewer by selecting the black label containing the view name and dragging it to a new position.

        +
      4. + +
      5. Create connections. +

        You can create connections between 2 views by pressing Ctrl and clicking on the component from which the page transition is to happen and dragging it to the intended page. When the dragging is finished, a context menu opens listing the corresponding events of the object. Select an appropriate event from the menu.

        + +

        Create a connection by dragging

        +

        Select the event in the context menu

        + +

        After you select the event, the new connection is displayed and code is generated in the layout.tuml file. The event handler code is also generated.

        + +

        The following figure shows the code generated for the connection from view4 to view5 for the onclicked event.

        + +

        Code generation

        + +

        When you select a connection, the origin component of that connection is highlighted. If you select a component, the connections originating from it are highlighted with a darker line.

        +
      6. + +
      7. Change the connection properties. +

        When you select a component (left in the figure) or connection (right in the figure) in the Storyboard, the editable properties related to it are displayed in the Properties view. You can view the transition properties and change the connection target view and title.

        + +

        Component properties Connection properties

        + +
      8. +
      + + + + + +
      + +Go to top + + + + + + + + \ No newline at end of file diff --git a/org.tizen.devtools/html/native_tools/t_trace_n.htm b/org.tizen.devtools/html/native_tools/t_trace_n.htm index 16e489b..0056268 100644 --- a/org.tizen.devtools/html/native_tools/t_trace_n.htm +++ b/org.tizen.devtools/html/native_tools/t_trace_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -36,17 +36,7 @@

      The T-trace is a profiling tool that allows you to optimize application performance by measuring and visualizing instrumented function calls in the Tizen platform. It helps you to understand what the system is doing while your application is running.

      - - - - - - - - - -
      Note
      To operate the T-trace, you must first install Python (2.7.x) and Google Chrome™ on your computer.
      - +

      T-trace Dialog

      The following figure illustrates the T-trace dialog elements.

      @@ -82,6 +72,17 @@

      When you run the T-trace, the tracing process gathers traces during a specified time period. After tracing is finished, the T-trace processes the traces and creates a trace report in the HTML format.

      + + + + + + + + + +
      Note
      To operate the T-trace, you must first install Python (2.7.x) and Google Chrome™ on your computer.
      +

      To run the T-trace in the Tizen IDE:

      1. Set up the target device for the debugging mode and connect it to your computer with a USB cable.
      2. diff --git a/org.tizen.devtools/html/native_tools/tools_n.htm b/org.tizen.devtools/html/native_tools/tools_n.htm index eab5d41..4fd57bc 100644 --- a/org.tizen.devtools/html/native_tools/tools_n.htm +++ b/org.tizen.devtools/html/native_tools/tools_n.htm @@ -22,24 +22,13 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        Native Tools

        The Tizen SDK provides the following set of tools for native application development:

        - - - - - - - - - -
        Note
        Some of the IDE tools and views are visible only in specific IDE perspectives. To switch to the applicable perspective, go to Window > Open Perspective > Other and select the perspective you want.
        -
        • Application generation management tools
            @@ -70,7 +59,8 @@
        • Application running and testing tools
        • Analysis and debugging tools @@ -83,12 +73,24 @@
        • Valgrind

          This memory profiling tool can be used to detect memory errors or memory leaks in an application.

        • -
        • T-trace

          This tools allows you to detect and analyze performance issues.

        • +
        • T-trace

          This tools allows you to detect and analyze performance issues.

        • +
        +
      3. Resource Fallback +
          +
        • Resource Explorer

          This tool helps you to place resource easier to support specific device configurations such as different screen densities and languages.

    -
  • Resource Fallback -
      -
    • Resource Explorer

      Resource explorer helps you to place resource easier to support specific device configurations such as different screen densities and languages.

    • -
  • + + + + + + + + + + + +
    Note
    Some of the IDE tools and views are visible only in specific IDE perspectives. To switch to the applicable perspective, go to Window > Open Perspective > Other and select the perspective you want.
    diff --git a/org.tizen.devtools/html/native_tools/uibuilder_n.htm b/org.tizen.devtools/html/native_tools/uibuilder_n.htm index a117727..0ff1e96 100644 --- a/org.tizen.devtools/html/native_tools/uibuilder_n.htm +++ b/org.tizen.devtools/html/native_tools/uibuilder_n.htm @@ -22,22 +22,32 @@
    -

    Mobile native Wearable native

    +

    Mobile native

    UI Builder

    -

    The Tizen native UI Builder is a graphical user interface builder tool that simplifies the creation of Tizen native UIs by allowing you to arrange UI Components using a drag-and-drop WYSIWYG (What You See Is What You Get) editor.

    +

    The Tizen native UI Builder is a graphical user interface builder tool that simplifies the creation of Tizen native UIs by allowing you to arrange UI components using a drag-and-drop WYSIWYG (What You See Is What You Get) editor.

    -

    The UI Builder supports a variety of UI Components and views and editors.

    +

    The UI Builder supports a variety of UI components and views and editors.

    The UI Builder is not only a UI layout code generating tool, it also supports an easy-to-use programming model though the UI Builder project.

    Figure: UI Builder

    UI Builder

    - + + + + + + + + + +
    Note
    The UI Builder is supported only in mobile Ubuntu.
    +

    Supported Views and Editors

    The UI Builder supports the following views and editors:

    @@ -96,37 +106,37 @@

    Outline view

    The Outline view provides the following features:

      -
    • UI Component navigation +
    • UI component navigation
        -
      • You can see the UI Component hierarchy.
      • +
      • You can see the UI component hierarchy.
    • -
    • UI Component management +
    • UI component management
        -
      • You can copy, cut, paste, delete, and rename UI Components.
      • +
      • You can copy, cut, paste, delete, and rename UI components.

    Properties View

    -

    The Properties view displays the properties of the UI Component selected in the WYSIWYG Editor view. If the Properties view is not visible, open it from Window > Show View > Other > General > Properties.

    +

    The Properties view displays the properties of the UI component selected in the WYSIWYG Editor view. If the Properties view is not visible, open it from Window > Show View > Other > General > Properties.

    -

    The Properties helps you to edit UI Component and events.

    +

    The Properties helps you to edit UI components and events.

    Figure: Properties view

    -

    Properties view

    +

    Properties view

    The Properties view consists of Attributes, and Event tabs:

    • Attributes -

      In the Attributes tab, you can edit UI Component attributes. Attributes are categorized into common (common UI Component properties) and UI Component specification (UI Component-specific properties) attributes. The UI Component specification attributes are divided into categories according to the UI Component attributes.

      +

      In the Attributes tab, you can edit UI component attributes. Attributes are categorized into common (common UI component properties) and UI component specification (UI component-specific properties) attributes. The UI component specification attributes are divided into categories according to the UI component attributes.

      • Common -

        The Common category only includes the ID attribute, which is the default UI Component identifier in the code.

        +

        The Common category only includes the ID attribute, which is the default UI component identifier in the code.

      • -
      • UI Component specification -

        The UI Component specification category includes all UI Component-specific attributes.

        +
      • UI component specification +

        The UI component specification category includes all UI component-specific attributes.

      Properties specification

      @@ -157,7 +167,7 @@

      You can import files or folders.

    • Easy editing -

      You can edit the resource property of the UI Components using drag and drop.

      +

      You can edit the resource property of the UI components using drag and drop.

    @@ -171,12 +181,10 @@
    • Palette

      -

      The palette contains EFL UI Components, which you can select and add to the design area.

      +

      The palette contains EFL UI components, which you can select and add to the design area.

        -
      • Supported UI Components for mobile applications: +
      • Supported UI components:

        Scroller, Grid, Table, Box, Panes, Panel, Button, Check, Radio, Colorselector, Entry, Spinner, Slider, Naviframe, List, Genlist, Toolbar, Multibuttonentry, Gengrid, Index, Background, Datetime, Icon, Image, Label, Progressbar, and Layout

      • -
      • Supported UI Components for wearable applications: -

        Scroller, Grid, Table, Box, Panel, Button, Check, Radio, Entry, Spinner, Slider, Naviframe, List, Genlist, Index, Background, Datetime, Icon, Image, Label, Progressbar, and Layout

    • @@ -232,7 +240,7 @@
    • Design area

      -

      You can work with UI Components visually so that you can see what your application looks like as you build it.

      +

      You can work with UI components visually so that you can see what your application looks like as you build it.

    @@ -263,4 +271,4 @@ - + \ No newline at end of file diff --git a/org.tizen.devtools/html/native_tools/valgrind_n.htm b/org.tizen.devtools/html/native_tools/valgrind_n.htm index 9accbc6..d13e4be 100644 --- a/org.tizen.devtools/html/native_tools/valgrind_n.htm +++ b/org.tizen.devtools/html/native_tools/valgrind_n.htm @@ -19,7 +19,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Valgrind

    diff --git a/org.tizen.devtools/html/web_tools/code_beautifier_w.htm b/org.tizen.devtools/html/web_tools/code_beautifier_w.htm index 9df8349..ff2c953 100644 --- a/org.tizen.devtools/html/web_tools/code_beautifier_w.htm +++ b/org.tizen.devtools/html/web_tools/code_beautifier_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Code Beautifier

    diff --git a/org.tizen.devtools/html/web_tools/code_minifier_w.htm b/org.tizen.devtools/html/web_tools/code_minifier_w.htm index 9742316..1e37050 100644 --- a/org.tizen.devtools/html/web_tools/code_minifier_w.htm +++ b/org.tizen.devtools/html/web_tools/code_minifier_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Code Minifier

    diff --git a/org.tizen.devtools/html/web_tools/command_line_interface_w.htm b/org.tizen.devtools/html/web_tools/command_line_interface_w.htm index 24abfa6..255c3a0 100644 --- a/org.tizen.devtools/html/web_tools/command_line_interface_w.htm +++ b/org.tizen.devtools/html/web_tools/command_line_interface_w.htm @@ -23,7 +23,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Command Line Interface

    @@ -102,9 +102,9 @@ Sets the default connection timeout value. The default is 60000 milliseconds.

    $ tizen cli-config -g default.profiles.path=/home/workspace/.metadata/.plugins/org.tizen.common.sign/profiles.xml -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
    +> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
     
  • List all options for which values are set:

    @@ -176,9 +176,9 @@ tizen create web-project [-p|--profile <profile name>] [-t|--template <
     
     $ tizen create web-project -p mobile-2.3 -t BasicBasicApplication -n basic -- /home/workspace
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat create web-project -p mobile-2.3 -t BasicBasicApplication -n basic -- C:\Users\workspace
    +> tizen.bat create web-project -p mobile-2.3 -t BasicBasicApplication -n basic -- C:\Users\workspace
     
  • tizen clean
     tizen clean [--]
     
    Clean the Tizen web project. - Clean the Tizen Web project. +
    • Clean the project:

       $ tizen clean -- /home/workspace/basic
       
      -

      or for Windows,

      +

      Or for Windows:

      -> tizen.bat clean -- C:\Users\workspace\basic
      +> tizen.bat clean -- C:\Users\workspace\basic
       
    tizen package @@ -271,17 +270,17 @@ tizen package [-t | --type <package type>] [-s | --sign <security profi
     $ tizen cli-config –g default.profiles.path=/home/tizen-sdk/tools/ide/conf/profiles.xml
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\tizen-sdk\tools\ide\conf\profiles.xml"
    +> tizen.bat cli-config –g "default.profiles.path=C:\tizen-sdk\tools\ide\conf\profiles.xml"
     
  • Set up the path of the profile.xml file that is created from the IDE:

     $ tizen cli-config –g default.profiles.path=/home/workspace/.metadata/.plugins/org.tizen.common.sign/profiles.xml
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
    +> tizen.bat cli-config –g "default.profiles.path=C:\Users\workspace\.metadata\.plugins\org.tizen.common.sign\profiles.xml"
     
  • Package the profile:

    @@ -291,25 +290,25 @@ $ ls /home/workspace/basic/.buildResult
     
     basic.wgt
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat package --type wgt --sign myprofile -- C:\Users\workspace\basic\.buildResult
    +> tizen.bat package --type wgt --sign myprofile -- C:\Users\workspace\basic\.buildResult
     
  • Re-sign the package:

     $ tizen package --type wgt --sign myprofile2 -- /home/workspace/basic/.buildResult/basic.wgt
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat package --type wgt --sign myprofile2 -- C:\Users\workspace\basic\.buildResult\basic.wgt
    +> tizen.bat package --type wgt --sign myprofile2 -- C:\Users\workspace\basic\.buildResult\basic.wgt
     
  • Re-sign a hybrid application package:

     $ tizen package --type wgt --sign myprofile2 --reference /home/workspace/a.tpk --reference /home/workspace/b.tpk -- /home/workspace/basic/.buildResult/basic.wgt
     
    -

    or for Windows,

    +

    Or for Windows:

    -> tizen.bat package --type wgt --sign myprofile2 --reference C:\Users\workspace\a.tpk --reference C:\Users\workspace\b.tpk -- C:\Users\workspace\basic\.buildResult\basic.wgt
    +> tizen.bat package --type wgt --sign myprofile2 --reference C:\Users\workspace\a.tpk --reference C:\Users\workspace\b.tpk -- C:\Users\workspace\basic\.buildResult\basic.wgt
     
  • <widget>
      <name>
       <span>
      <description>
       <span>
      <author>
       <span>
      <content>
      <feature> (in mobile or wearable)
       <param>
      <icon>
      <license>
       <span>
      <preference>
      <access>
      <tizen:account> (in mobile only)
       <tizen:icon>
       <tizen:display-name>
       <tizen:capability>
      <tizen:app-control> (in mobile or wearable)
       <tizen:src>
       <tizen:operation>
       <tizen:uri>
       <tizen:mime>
      <tizen:application> (in mobile or wearable)
      <tizen:content> (in mobile or wearable)
      <tizen:privilege> (in mobile or wearable)
      <tizen:setting> (in mobile or wearable)
      <tizen:content-security-policy> (in mobile or wearable)
      <tizen:content-security-policy-report-only> (in mobile or wearable)
      <tizen:allow-navigation> (in mobile or wearable)
      <tizen:metadata> (in mobile or wearable)
      <tizen:profile> (in mobile or wearable)
      <tizen:ime> (in wearable only)
       <tizen:uuid>
       <tizen:languages>
        <tizen:language>
      <tizen:category> (in wearable only)
      <tizen:service> (in wearable only)
       <tizen:name>
       <tizen:icon>
       <tizen:content>
       <tizen:description>
       <tizen:metadata>
       <tizen:category>
    - - - - - - - - -
    Note
    The reload attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the reload attribute is used, the application will fail to install.
    - - +
  • src +

    Attributes:

    +
      +
    • name

      Mandatory; page handling the requests

    • +
    • reload

      Optional; sets whether the page is reloaded when it is already loaded (available values: enable (default), disable)

      Since: 2.4

      + + + + + + + + + +
      Note
      The reload attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the reload attribute is used, the application installation fails.
      +
    • +
    +
  • +
  • operation

    Mandatory; string that defines the action to be performed

  • uri and mime

    Optional; additional parameters used for resolving application control requests

  • Example:

    <tizen:app-control>
    -   <tizen:src name="view.html" reload="disable"/>
    +   <tizen:src name="view.html" reload="disable"/>
        <tizen:operation name="http://tizen.org/appcontrol/operation/view"/>
        <tizen:uri name="http"/>
        <tizen:mime name="image/jpeg"/>
    @@ -537,21 +539,27 @@
            
  • id

    Mandatory; Tizen application ID, which is a combination of the Tizen package ID and project name. The application ID is unique in the device.

    The project name is a set of characters (0~9, a~z, A~Z) randomly generated by the SDK. The minimum value is 1 byte and maximum value is 52 bytes.

  • package

    Mandatory; Tizen package ID generated by the SDK, comprises of 10 characters (0~9, a~z, A~Z). The package ID is unique in the Tizen Store.

  • required_version

    Mandatory; Tizen API version required for running the Web application

  • -
  • launch_mode

    Optional; Sets what launch mode can be supported (available values: single(default), group, caller)

    o single: launched as a main application

    o group: launched as a sub application

    o caller: caller application defines the launch mode with the app_control_set_launch_mode() function

    Since: 2.4

  • - - - - - - - - - -
    Note
    The launch_mode attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the launch_mode attribute is used, the application will fail to install.
    -

    Example:

    <tizen:application id="1234abcDEF.projectname"
    +		
  • launch_mode

    Optional; sets which launch mode is supported (available values: single (default), group, caller)

    +
    • single: launched as a main application
    • +
    • group: launched as a sub application
    • +
    • caller: caller application defines the launch mode with the app_control_set_launch_mode() function
    +

    Since: 2.4

    + + + + + + + + + +
    Note
    The launch_mode attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the launch_mode attribute is used, the application installation fails.
    +
  • +

    Example:

    <tizen:application id="1234abcDEF.projectname"
                        package="1234abcDEF"
                        required_version="2.4"
    -                   launch_mode="caller" />

    +                   launch_mode="caller" />
    + @@ -812,37 +820,41 @@
  • id

    Mandatory; Tizen application ID, which is a combination of the Tizen wearable package ID and project name. The application ID is unique in the device.

    The project name is a set of characters (0~9, a~z, A~Z) randomly generated by the SDK. The minimum value is 1 byte and maximum value is 52 bytes.

  • package

    Mandatory; Tizen wearable package ID generated by the SDK, comprises of 10 characters (0~9, a~z, A~Z). The package ID is unique in the Samsung Apps.

  • required_version

    Mandatory; Tizen API version required for running the Web application

  • -
  • launch_mode

    Optional; Sets what launch mode can be supported (available values: single(default), group, caller)

    o single: launched as a main application

    o group: launched as a sub application

    o caller: caller application defines the launch mode with the app_control_set_launch_mode() function

    Since: 2.4
  • - - - - - - - - - -
    Note
    The launch_mode attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the launch_mode attribute is used, the application will fail to install.
    -
  • ambient_support

    Optional; Sets whether the Web application supports the ambient mode (available values: enable, disable (default))

    If this option is enabled, the application can be shown in the ambient mode.

    Since: 2.3.1
  • +
  • launch_mode

    Optional; sets which launch mode is supported (available values: single (default), group, caller)

    +
    • single: launched as a main application
    • +
    • group: launched as a sub application
    • +
    • caller: caller application defines the launch mode with the app_control_set_launch_mode() function
    +

    Since: 2.4

    + + + + + + + + + +
    Note
    The launch_mode attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the launch_mode attribute is used, the application installation fails.
    +
  • +
  • ambient_support

    Optional; sets whether the Web application supports the ambient mode (available values: enable, disable (default))

    If this option is enabled, the application can be shown in the ambient mode.

    Since: 2.3.1 + - - - - - - + + +
    Note
    The ambient_support option is only used for watch applications, and ignored in all non-watch applications.
    The ambient_support attribute is supported from Tizen 2.3.1 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.3.1, and the ambient_support attribute is used, the application will fail to install.
    The ambient_support option is only used for watch applications, and ignored in all non-watch applications. +

    The ambient_support attribute is supported from Tizen 2.3.1 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.3.1, and the ambient_support attribute is used, the application installation fails.

    - +
  • Example:

    <tizen:application id="1234abcDEF.projectname"  
                        package="1234abcDEF"
                        required_version="2.4"
    -                   launch_mode="caller"
                        ambient_support="enable" />

    + @@ -881,27 +893,29 @@

    Expected children:

      -
    • src

      -

      Attributes:

      -
        -
      • name

        Mandatory; page handling the requests

      • -
      • reload

        Optional; sets whether the page is reloaded or not when the page already loaded (available values: enable (default), disable)

        Since: 2.4

      • - - - - - - - - - -
        Note
        The reload attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the reload attribute is used, the application will fail to install.
        -
      -
    • +
    • src +

      Attributes:

      +
        +
      • name

        Mandatory; page handling the requests

      • +
      • reload

        Optional; sets whether the page is reloaded when it is already loaded (available values: enable (default), disable)

        Since: 2.4

        + + + + + + + + + +
        Note
        The reload attribute is supported from Tizen 2.4 onwards. If the required_version in the config.xml file of an application is set to a version before Tizen 2.4, and the reload attribute is used, the application installation fails.
        +
      • +
      +
    • +
    • operation

      Mandatory; string that defines the action to be performed

    • uri and mime

      Optional; additional parameters used for resolving application control requests

    Example:

    <tizen:app-control>
    -   <tizen:src name="view.html" reload="disable"/>
    +   <tizen:src name="view.html" reload="disable"/>
        <tizen:operation name="http://tizen.org/appcontrol/operation/view"/>
        <tizen:uri name="http"/>
        <tizen:mime name="image/jpeg"/>
    @@ -925,12 +939,12 @@
     	 

    Attributes:

      -
    • background-support

      Optional; Sets whether Web Application is suspended when it goes to the background (available values: enable , disable (default))

      If this option is enabled, Web Application is not suspended when it goes to the background.

    • -
    • context-menu

      Optional; Sets whether the context menu is shown (available values: enable (default), disable)

      If this option is enabled, the context menu is visible to the user.

    • +
    • background-support

      Optional; Sets whether Web Application is suspended when it goes to the background (available values: enable, disable (default))

      If this option is enabled, Web Application is not suspended when it goes to the background.

    • +
    • context-menu

      Optional; Sets whether the context menu is shown (available values: enable (default), disable)

      If this option is enabled, the context menu is visible to the user.

    • encryption

      Optional; Sets whether Web Application resources are encrypted (available values: enable , disable (default))

      If this option is enabled, the application resources(HTML, JS and CSS files) are encrypted.

    • -
    • screen-orientation

      Optional; Sets whether it locks orientation of Web Application (available values: portrait (default), landscape, auto-rotation)

      If this option is portrait or landscape, the orientation is locked to portrait or landscape respectively.

      If the option is auto-rotation, it follows device orientation setting.

    • -
    • install-location

      Optional; Sets where Web Application is installed (available values: auto (default), internal-only, prefer-external)

      o auto: the system defined install location.

      o internal-only: the device internal storage.

      o prefer-external: the external storage (if exists).

    • -
    • hwkey-event

      Optional; a hardware key event is sent to the Web application when the user presses the hardware key (available values: enable (default), disable)

      If this option is enabled, the tizenhwkey custom event is sent to the Web application. The tizenhwkey event object has a keyName attribute (available value: back).

    • +
    • screen-orientation

      Optional; Sets whether it locks orientation of Web Application (available values: portrait (default), landscape, auto-rotation)

      If this option is portrait or landscape, the orientation is locked to portrait or landscape respectively.

      If the option is auto-rotation, it follows device orientation setting.

    • +
    • install-location

      Optional; Sets where Web Application is installed (available values: auto (default), internal-only, prefer-external)

      o auto: the system defined install location.

      o internal-only: the device internal storage.

      o prefer-external: the external storage (if exists).

    • +
    • hwkey-event

      Optional; a hardware key event is sent to the Web application when the user presses the hardware key (available values: enable (default), disable)

      If this option is enabled, the tizenhwkey custom event is sent to the Web application. The tizenhwkey event object has a keyName attribute (available value: back).

    Example:

     <tizen:setting background-support="enable" />
    @@ -1380,4 +1394,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
     
     
     
    -
    +
    \ No newline at end of file
    diff --git a/org.tizen.devtools/html/web_tools/content_assist_w.htm b/org.tizen.devtools/html/web_tools/content_assist_w.htm
    index 9068b5e..bf8edf1 100644
    --- a/org.tizen.devtools/html/web_tools/content_assist_w.htm
    +++ b/org.tizen.devtools/html/web_tools/content_assist_w.htm
    @@ -20,7 +20,7 @@
     
     
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Content Assist

    diff --git a/org.tizen.devtools/html/web_tools/css_editor_w.htm b/org.tizen.devtools/html/web_tools/css_editor_w.htm index 9048e6d..9a4ec5f 100644 --- a/org.tizen.devtools/html/web_tools/css_editor_w.htm +++ b/org.tizen.devtools/html/web_tools/css_editor_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    CSS Editor

    diff --git a/org.tizen.devtools/html/web_tools/css_preview_w.htm b/org.tizen.devtools/html/web_tools/css_preview_w.htm index a604250..e712ffa 100644 --- a/org.tizen.devtools/html/web_tools/css_preview_w.htm +++ b/org.tizen.devtools/html/web_tools/css_preview_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    CSS Preview

    diff --git a/org.tizen.devtools/html/web_tools/html_editor_w.htm b/org.tizen.devtools/html/web_tools/html_editor_w.htm index fde9161..2ed5a9a 100644 --- a/org.tizen.devtools/html/web_tools/html_editor_w.htm +++ b/org.tizen.devtools/html/web_tools/html_editor_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Content

    diff --git a/org.tizen.devtools/html/web_tools/html_preview_w.htm b/org.tizen.devtools/html/web_tools/html_preview_w.htm index 0617c1d..6d1ba54 100644 --- a/org.tizen.devtools/html/web_tools/html_preview_w.htm +++ b/org.tizen.devtools/html/web_tools/html_preview_w.htm @@ -21,7 +21,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    HTML Preview

    diff --git a/org.tizen.devtools/html/web_tools/js_analyzer_w.htm b/org.tizen.devtools/html/web_tools/js_analyzer_w.htm index fcc5f56..695a917 100644 --- a/org.tizen.devtools/html/web_tools/js_analyzer_w.htm +++ b/org.tizen.devtools/html/web_tools/js_analyzer_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Content

    diff --git a/org.tizen.devtools/html/web_tools/js_editor_w.htm b/org.tizen.devtools/html/web_tools/js_editor_w.htm index faf2b15..e426143 100644 --- a/org.tizen.devtools/html/web_tools/js_editor_w.htm +++ b/org.tizen.devtools/html/web_tools/js_editor_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.devtools/html/web_tools/js_log_console_w.htm b/org.tizen.devtools/html/web_tools/js_log_console_w.htm index e3c903b..f708d12 100644 --- a/org.tizen.devtools/html/web_tools/js_log_console_w.htm +++ b/org.tizen.devtools/html/web_tools/js_log_console_w.htm @@ -19,22 +19,13 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    JavaScript Log Console View

    -

    The JavaScript Log Console view provides a functionality to view Web application JavaScript logs. The JavaScript Log Console view is automatically opened when a Web application is launched.

    - - - - - - - - - -
    Note
    If no target is connected, a notification dialog appears at the right-bottom section of the IDE and the JavaScript Log Console view is not launched.
    -

    The following table shows the methods supported for logging to the JavaScript log.

    +

    The JavaScript Log Console view provides a functionality to view Web application JavaScript logs.

    + +

    The following table shows the methods supported for logging to the JavaScript log.

    Table: Supported JavaScript log methods @@ -69,10 +60,24 @@

    The JavaScript log methods are shown in the IDE with colors.

    Figure: JavaScript log method colors

    - +

    JavaScript log method colors

    +

    The JavaScript Log Console view is automatically opened when a Web application is launched.

    + + + + + + + + + +
    Note
    If no target is connected, a notification dialog appears at the right-bottom section of the IDE and the JavaScript Log Console view is not launched.
    + + + diff --git a/org.tizen.devtools/html/web_tools/live_editing_w.htm b/org.tizen.devtools/html/web_tools/live_editing_w.htm index c5d7fd2..f9f471f 100644 --- a/org.tizen.devtools/html/web_tools/live_editing_w.htm +++ b/org.tizen.devtools/html/web_tools/live_editing_w.htm @@ -19,13 +19,19 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Live Editing

    Live editing is a special feature, which applies source changes to the running application immediately without building, packaging, and relaunching the application. All changes made in the HTML, CSS, and JavaScript files are automatically and immediately reflected in the running application.

    This feature can be used in the HTML Preview view and when running the application in the Emulator or the Web Simulator.

    + + +

    To enable live editing in the Tizen IDE, go to Run > Run Configuration > Tizen Web Application > <PROJECT NAME> (or in the project's context menu, select Run As > Run Configuration > Tizen Web Application > <PROJECT NAME>) and check Enable live editing at the run configuration. If you are running your application for the first time, you must first create a new configuration.

    + +

    You can set live editing preferences in the IDE.

    + @@ -33,7 +39,7 @@
    - This feature has the following limitations: + The live editing feature has the following limitations:
    • The Tizen Device API does not work on the Emulator.
    • Only specific device APIs are supported by the Web Simulator.
    • @@ -44,10 +50,6 @@
    -

    To enable live editing in the Tizen IDE, go to Run > Run Configuration > Tizen Web Application > <PROJECT NAME> (or in the project's context menu, select Run As > Run Configuration > Tizen Web Application > <PROJECT NAME>) and check Enable live editing at the run configuration. If you are running your application for the first time, you must first create a new configuration.

    - -

    You can set live editing preferences in the IDE.

    -
    diff --git a/org.tizen.devtools/html/web_tools/privilege_checker_w.htm b/org.tizen.devtools/html/web_tools/privilege_checker_w.htm index af341b5..e0419bd 100644 --- a/org.tizen.devtools/html/web_tools/privilege_checker_w.htm +++ b/org.tizen.devtools/html/web_tools/privilege_checker_w.htm @@ -19,7 +19,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Privilege Checker

    diff --git a/org.tizen.devtools/html/web_tools/project_wizard_w.htm b/org.tizen.devtools/html/web_tools/project_wizard_w.htm index 2aabc51..c11022e 100644 --- a/org.tizen.devtools/html/web_tools/project_wizard_w.htm +++ b/org.tizen.devtools/html/web_tools/project_wizard_w.htm @@ -20,7 +20,7 @@
    -

    Mobile web Wearable web

    +

    Mobile web Wearable web

    diff --git a/org.tizen.devtools/html/web_tools/rest_viewer_w.htm b/org.tizen.devtools/html/web_tools/rest_viewer_w.htm index 2658585..9a88ce1 100644 --- a/org.tizen.devtools/html/web_tools/rest_viewer_w.htm +++ b/org.tizen.devtools/html/web_tools/rest_viewer_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.devtools/html/web_tools/set_ide_preference_w.htm b/org.tizen.devtools/html/web_tools/set_ide_preference_w.htm index 2778e1d..52092fa 100644 --- a/org.tizen.devtools/html/web_tools/set_ide_preference_w.htm +++ b/org.tizen.devtools/html/web_tools/set_ide_preference_w.htm @@ -18,7 +18,7 @@

    - Mobile Web Wearable Web

    + Mobile Web Wearable Web

    Content

    diff --git a/org.tizen.devtools/html/web_tools/tools_w.htm b/org.tizen.devtools/html/web_tools/tools_w.htm index caa7261..5c1ab6b 100644 --- a/org.tizen.devtools/html/web_tools/tools_w.htm +++ b/org.tizen.devtools/html/web_tools/tools_w.htm @@ -21,23 +21,13 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Web Tools

    The Tizen SDK provides the following set of features and tools for Web application development:

    - - - - - - - - - -
    Note
    Some of the IDE tools and views are visible only in specific IDE perspectives. To switch to the applicable perspective, go to Window > Open Perspective > Other and select the perspective you want.
    • Application generation management tools @@ -95,6 +85,17 @@
    + + + + + + + + + +
    Note
    Some of the IDE tools and views are visible only in specific IDE perspectives. To switch to the applicable perspective, go to Window > Open Perspective > Other and select the perspective you want.
    +
    diff --git a/org.tizen.devtools/html/web_tools/web_inspector_w.htm b/org.tizen.devtools/html/web_tools/web_inspector_w.htm index d8ef9e4..1edfa8b 100644 --- a/org.tizen.devtools/html/web_tools/web_inspector_w.htm +++ b/org.tizen.devtools/html/web_tools/web_inspector_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.devtools/html/web_tools/web_simulator_features_w.htm b/org.tizen.devtools/html/web_tools/web_simulator_features_w.htm index d690f20..ecf868d 100644 --- a/org.tizen.devtools/html/web_tools/web_simulator_features_w.htm +++ b/org.tizen.devtools/html/web_tools/web_simulator_features_w.htm @@ -17,7 +17,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Content

    diff --git a/org.tizen.devtools/html/web_tools/web_simulator_w.htm b/org.tizen.devtools/html/web_tools/web_simulator_w.htm index 797b723..0943b86 100644 --- a/org.tizen.devtools/html/web_tools/web_simulator_w.htm +++ b/org.tizen.devtools/html/web_tools/web_simulator_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    @@ -32,8 +32,7 @@

    Web Simulator

    The Tizen Web Simulator is a light-weight tool that provides many settings and features to develop Web applications. You can use the simulator features to debug your applications.

    -

    Figure: Tizen Web Simulator

    -

    Tizen Web Simulator

    +

    The Tizen Web Simulator:

    • Supports running and debugging modern HTML5 Web applications.
    • @@ -54,7 +53,8 @@
    - +

    Figure: Tizen Web Simulator

    +

    Tizen Web Simulator

    Web Simulator Settings

    The Web Simulator has several settings for developing Web applications.

    diff --git a/org.tizen.devtools/html/web_tools/web_unit_test_tool_w.htm b/org.tizen.devtools/html/web_tools/web_unit_test_tool_w.htm index fe4556d..42d76b2 100644 --- a/org.tizen.devtools/html/web_tools/web_unit_test_tool_w.htm +++ b/org.tizen.devtools/html/web_tools/web_unit_test_tool_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.devtools/index.xml b/org.tizen.devtools/index.xml index 8faf1ed..c247998 100644 --- a/org.tizen.devtools/index.xml +++ b/org.tizen.devtools/index.xml @@ -50,9 +50,13 @@ - + + + - + + + @@ -67,7 +71,8 @@ - + + diff --git a/org.tizen.gettingstarted/META-INF/MANIFEST.MF b/org.tizen.gettingstarted/META-INF/MANIFEST.MF index 765732d..f8d8b1a 100644 --- a/org.tizen.gettingstarted/META-INF/MANIFEST.MF +++ b/org.tizen.gettingstarted/META-INF/MANIFEST.MF @@ -1,6 +1,6 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 1 -Bundle-Name: Getting Started with Tizen +Bundle-Name: Getting Started Bundle-SymbolicName: org.tizen.gettingstarted;singleton=true Bundle-Version: 2.4.0 Bundle-Vendor: The Linux Foundation diff --git a/org.tizen.gettingstarted/html/cover_page.htm b/org.tizen.gettingstarted/html/cover_page.htm index b3a9939..6539271 100644 --- a/org.tizen.gettingstarted/html/cover_page.htm +++ b/org.tizen.gettingstarted/html/cover_page.htm @@ -11,7 +11,7 @@ - Getting Started with Tizen + Getting Started @@ -21,14 +21,14 @@
    -

    Mobile Web Wearable Web Mobile native Wearable native

    +

    Mobile Wearable

    Tizen
    Getting Started

    -

    The getting started with Tizen documentation provides overall information you need to become familiar with Tizen programming and application model:

    +

    The getting started documentation provides overall information you need to become familiar with Tizen programming and application model:

    • Preface @@ -47,7 +47,7 @@

      For more information about developing Tizen applications, see:

        -
      • Tizen UI Guides
      • +
      • Tizen UI Practices
      • Tizen Tutorials
      • Tizen Guides
      • Tizen API References
      • diff --git a/org.tizen.gettingstarted/html/images/mn_division.png b/org.tizen.gettingstarted/html/images/mn_division.png index 1f7e3377261df202ed0786052218854d5ca34635..faecb283e3b3c3e26eb6c737fc56877d61939a35 100644 GIT binary patch delta 5950 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 T<@VJu*)AP=wqM%rm3RIhb@$<< diff --git a/org.tizen.gettingstarted/html/images/mobile_s_n.png b/org.tizen.gettingstarted/html/images/mobile_s_n.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8c779024230d9188cc4a8ce05fa146b165b2c5 GIT binary patch literal 2070 zcmb7Fdr%YC8jsS7iH6Z43SO&eR31vQn-?K#Qp^(r1OX$U7|W6@5Fy!+T}wV>?< zN_mzM5NkzHaOwjpC?J$xi=x+h8xctR`5Sgy6I|BtdT!(MMX^=`_7g zM33UBK$S^~BkX1yV;)RI4;~1dR zrd04G5&ci6qE%ruDQZS&Jf?z!C@q0LTW|YzCphz|xF3Y-Jd+l`{-7 z1k;-JCR~piX%0p>4o$^Hbi&g=Lok>k^a+VL_LAI)O(%;;8(@V^0E-C%<|!RVd^0GO z>h%bN;iWc)M<9PW|F`^@I?aRt5eSB+nzcj~<5#|7>h*>kiqkPbD%hNa5LHyb$rv(q zp;AE`3Fq}jI9Y~jQw@j_SIR{6)Kt9=5`g}4zE~obvE+Q2oW&Azq#T)qD*!30q7ZffaKV3W-$g$CgMrES8)n7RbeNIa{ibfij6iA)di1jTjCawTQ#01FQcF z%X=*rl9~}1N6l&!O`hqdutXF`u|(8FlS-$$hvprnH|kIe=HnSJgoHEp&v zTirzN?|3V3s=vt^b)A((c6VALZT*1koR{qt;L2TPW_MagFU;zABgD5nR>)nd&kB#@ z%EA{0y9KpWSNGi+-DtfoIm(STeH*>vjalwVLE_1z4TD&hH zTpoYm-y!Y%;mRDu$89lVbBT0C{g8_tUlUOnxdsY!HVgCnvKyVvDwaNZnUent^S9Tyl~sKUaPi z^- zgoXKC4^mTi{Ismn>%AKK!jxM+O?`QRDJdy(`M&QGOXAkqKbq_5X;-(4COX2_Uw)|B z<6KcQ^yEZwzsWtnuC8v?_hr2m0~hXbe0KpOr#E~p_7PqQ|pyzm^2YzQJnbMF@2+pnnF z!V9k7vb$)@x&E;rp223)kF2IrsSU?t=41?RE6T3^1N-H|Ag%k^vl@-(_FDCtMU*F# zJ>QKtR~*bfeJNm*<;27T*^f;zSFfFKdE^xk^1Pu#cYLo%AdK{XIQGb1=erpz+}YOh z?deM+Z!G8!OWj!C;1+tatXo(6@B>B;^#|=gs9v|K3t!|922T7u7vJWcQ*=%7)qmw! zcCD?v=y~C`#$CL5uJ51!U88PIQ2SgybW79Ix%h$C2-UUf`oIs3bx)wA8}QG2xbE|z z%Fr7_zxBAcZ2iKoEaW1E9BBN0DDehQ?4l}c8!GD-^1_exTb62FHif8s^jn?45}1A; zw-54)R`uugCU@GtI8x?RYVz%DY-~JSTU$$>?>jH2yvw=yENOo6$CYlb)-|DDZQrwv zO0q2;pn#owBf0&n@gu_0-J$aQ*h5LA0^rP6Mo;8%Uccq`_?yRap_MN@#FDUY=AXPB z9NDvW*zNJ|_a{DMoQ=9PdEL`#xVgExx*TINuYiNg^N&_lIqkcD|Gv!@QQNWF1^0N| z($Z3qH;)nlH4PM{wWlnIb@vP}u#Kjl4}NQ;yu3U!b9Tkm$e5TG_2`G#;fjD`d3kxt z;Xih@Kf9f|ZpHG-%F55fyfxbWcxvkB1?=Q|yDsTn?!U}MFg!M9J~-$+ sXO3y01kPVsd&dZ@U0V!K2Je|g^3TmExpRK+3CEvWDG!yMki=&G4|aJ%*8l(j literal 0 HcmV?d00001 diff --git a/org.tizen.gettingstarted/html/images/mobile_s_w.png b/org.tizen.gettingstarted/html/images/mobile_s_w.png new file mode 100644 index 0000000000000000000000000000000000000000..f86df299f50fc9facb4af6a847925599a7277c0d GIT binary patch literal 2183 zcmb7Gc~ld39#0i2TOI*%46Z~XR>Xn;PbQ25gF&G< zWzThRGXk;NC=HE(BKQGxkwS(Qnq;tAnG!}L5Sx9qN}(tLgn(EuPAX@hW*eGOfK<#t zeM08r`ARkzFZEAVfg!1aP*G}vh$cq)`T(1?beKQ}LP9_*OO&hWS_W!~mkzH@$2b(Q zBmyNcP`?=!!4Cr13Ka;Dv0fMvp5O^kXjlT-i$bG#07Q6?!&7lYJO)prlSyDd{*|a&j^@nS@oS;&22SjfTS$aYP~pmcXb}q>?HjsX`8z7=^J44a7jfmj32~Oc^YVi-**2$mQzgV8LO-X@yE00gK0}mSjx+ zt)Te)cOzu7H_~b-82sJ%Kjc@3rYJ#NFsN2&R3bQw64$p>y<3q3-1)on3gpHTVg^3)6NFxK~5Rbz^X*5zXorb4!DNGiVL*P<4TmpefVv{&5PZpj- z!*e-!+6uwjKv)-63}cy|ets-AlSyQ;Ndy9y%%pLdTrQFA$H8-0EI;N7mM2$3Lb(Vu zDK%lGzhi0d#M0R+PzWhhp$bLfN;L(=DO7{g9=jqYuw5C?2OYg5FLfm)?X~-JhHdhVF2?-p8QS=b z`Z&Mi-4acMS+;z>ru5!M8<7`L*Aly-#?CP^`q*%U+g$2UfIeox;oJJYPamFQ8W=Bv z$L=@VrF`m6Exv376=eSIvp-**cyvkUt?#}{BMmUp#>$R5EPUOW(^Qc|J7G4nt(Qq| zwa11&o=y4EG4H#|{O*4h)}+RcWG~eBJQ^qJx-uWOKT6d+nGH5RXwywFG(QBfsn@E_zL^$((sU_GH>&%Rv`V7MJmojJ8my*9g`>LyAMD%_6;+(89vbZbrg@Qiw6y7Jm$@5hV{g|#8v7zYcZ;uX zn|c4~RJ4CwOMcBqg9#p;AN@otyX&y|y)74ui+8Rqu@#!nJ`Ib{jLwsXcUfkgXf>3C zq@|^?%WgK`b31;U5RieR+I@c{FB|{j@Z)K#A<^0}7n(EiXGd!wJkL1lEvb!|csbH% zNjlT|L&e0chHXk>I3n`HoC6&P_8z&=Iy>K~x-*skwD&(*1(_QxhxZF!W9@y!;Gc4{ zc!I)Hx8iU6+MTz*QQIq@F%0}@3}L;#cA@#z1C+(}n=>~t+R>iwH3tS`w0!}hoa|_C z<33=>FtSLg9{1%C3&G2b%L9Y;MFN5~Z`3?wG`u*3(BCng*)|h;Jg7%EIgUPRFC^;f z)UGilqx!8qoz|6p!&`#&p4scQnp^H|QPZ@~FAhdtYWVJH*|jh!-u-OZk9qr=#I-xn z-%2h-8p8kf)wVObnxqQ@Q%dTM2`I4lNcC9faFyFHTTi2O&K~pjfmHozi}PRLT^o!1 ztwHPU#4B~FHv148HFSOdmAFm+Ti~FIx31Sbd-m*vv9i)?a8)>JT?F^D%i8In9R~ER zZDv%9g33Z7?-0k~;OcW9G)=7f7|M${S1V{cFw$}x@ZTTP3U%)J_x8QW@M-e-##NKz zqA7`&+pDJ8LyQ^I`%AAe^S#Hr%BD|udnuD4XsW2Ee6`3S-N(mg=%)k+h4o3APR6_hx~Kr!CBL<0go%-RIy^Regy(Dg&_a{ literal 0 HcmV?d00001 diff --git a/org.tizen.gettingstarted/html/images/mobile_s_w_optional.png b/org.tizen.gettingstarted/html/images/mobile_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..0434b73d0359bffb3ac4dee8806df0bba6dd2924 GIT binary patch literal 2021 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 JdSd9?{{@~HF);uD literal 113082 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 SqgwJeVxUHMOnHsWxRQ^4m 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≷eAV~%15bIs`rDls%;&R{Pf*QV2o?{vA}ru#jb9 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 literal 88045 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 diff --git a/org.tizen.gettingstarted/html/images/w_division.png b/org.tizen.gettingstarted/html/images/w_division.png index 88d995959343550d4859767dbfb7c6b5f128b717..443a1ea081ea7eac244b43293a0c17dcafde2c62 100644 GIT binary patch delta 7462 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 literal 113087 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 Z)cNrv|A-saJA*x)+xKX<*l+Ns{|_ZZY83zg diff --git a/org.tizen.gettingstarted/html/images/wearable_s_n.png b/org.tizen.gettingstarted/html/images/wearable_s_n.png new file mode 100644 index 0000000000000000000000000000000000000000..02e37918dbfd4a7100f5ad057e2a4f271071f4c8 GIT binary patch literal 2564 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 LPsTZ?%{%`BtxR|e literal 0 HcmV?d00001 diff --git a/org.tizen.gettingstarted/html/images/wearable_s_w_optional.png b/org.tizen.gettingstarted/html/images/wearable_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..cef460c854b09463be29faffd829bc08890f98a0 GIT binary patch literal 2454 zcmb7Gc~ld39*_El(N1yNQyf^c^zMs$c`uyITj4j@7 z#)g)LC=|+=>kjgfaTD_5moG-XmeDQs$Y7yl2PyqzVafy{4564}Stx|&#t6e9J|q;Y zW3NL_DAbZ#iGPqXi04HY$zpKAIUAfRMvkCSC?^+{Tqufyl;}_>Tq0#)#_H-ZXo;AC z2_*9fJUI)BkhmwpkYA#=zbG+EL=$6NoY77yIzkWwDTQcNOte%%S1~a2ymVwfw~fc3 z=S`GR49p)v1@X3^Suz+xlW`QRh(IKvsWcpsOrg@K_GkxWjVCzb9SB$gjZOyW1PAno z2ZMNn#bIQix!QTq%)B(Q}N#P+6Rkfk7huBZU|_UlJanRD2|tDn1koDH~oTl;epw0v?{X znaghh#p8V*5fk&#TA}1ae+K`T{0e`y9K!P zN&smDHb|f?5PS+meBs0hmP#P8Xdsyb5QtOpS^lt{(01jWX=b|d^q zx*!Bg;vq2ymc^jwD^HjFMGWFF65tpH0aywIKv*(BB4ZsLC{!$kOchZ=g`p%efrR;h z7ysXd!z0n)=hXIz`WChjNzY9`-X&!5@iszIq3Mi77MkLn}PM?Y5!=y z4K&W)dBAyMvC78AMyRm5i8<(`cHK;+t{+mvaG9YqiDc$x$v5tK@nX|kn^n4=-da()4hGC34De3*2H$ivY7cV{j+r6M)*da#O@jsob zs|(JBm*20ftUR@|-f~o9k?KJJ0N|{jpP#PR^pP$l1+_GiWC;}QKY+zzdwYAG>du`5 z*=#n4;}Dd#c+n5R!JaFg?_WP!R8-VRU*-CkxvGHKHK|ss1p>kA(ay_$oTpU+7Hf$| z*QKP*42E^t?a1V+ThE_w%ocB)Sci0W&z>Jg1_r{;P2d(GS`h5qS%2ot?h+4A&qIL4 z%DbVuwziv znTk-aHm3c*Y@;o!lb8~n5rm)H1t zrQ2;q6LewUx$a`ISWQh$eQOR;OHfDl6EEVQ*6;eg!Q^d6*+}DI9bxmT+osnKo~*B} zb@OU_(P%%u&Z%e<#I62Ppbz+>y4bsI2Z-yh39WQ6z}p1?6&EgS*XOU$yc#Z4nLl!` zaSj-70RIMxG%WDyU`q*&{o~IrR#&HXEH@VwXJ%#bS{mf}c0apS)z(s7 zhC5GKJpdC)o~sSV{XO?uwDWDbAx$*taekIOHd;pG*KhSLSYeHdR;X~SJc$L8viA?r&>rQWM z1aBB#d5pi|@b3M+v(tZbC9NsGxS(K*)65T-AMkyBP0jaaH4<4??>2C|$(y3i05pzH zU-=8xs^r)|^fE0am+cK! Ix`yojA5VuCwEzGB literal 0 HcmV?d00001 diff --git a/org.tizen.gettingstarted/html/images/wearable_s_wn.png b/org.tizen.gettingstarted/html/images/wearable_s_wn.png new file mode 100644 index 0000000000000000000000000000000000000000..280245d34ca2d51172b2a3a15e9ec3d308bc3591 GIT binary patch literal 2826 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 literal 0 HcmV?d00001 diff --git a/org.tizen.gettingstarted/html/images/wn_division.png b/org.tizen.gettingstarted/html/images/wn_division.png index 11a787672c8bc6d46378470dca2492a189c59f63..dca667f63938b0ec73963c2e664e4e27eb449cf6 100644 GIT binary patch literal 163496 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 Ksn37;-v0n5Z`YCl literal 112882 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 diff --git a/org.tizen.gettingstarted/html/index.htm b/org.tizen.gettingstarted/html/index.htm index 4f754bf..27918ce 100644 --- a/org.tizen.gettingstarted/html/index.htm +++ b/org.tizen.gettingstarted/html/index.htm @@ -11,7 +11,7 @@ - Getting Started with Tizen + Getting Started @@ -21,7 +21,7 @@

        -

        Getting Started with Tizen

        +

        Getting Started

        Preface

        Web Application

        diff --git a/org.tizen.gettingstarted/html/native/app_model/application_model_n.htm b/org.tizen.gettingstarted/html/native/app_model/application_model_n.htm index d9e1b65..f0ba706 100644 --- a/org.tizen.gettingstarted/html/native/app_model/application_model_n.htm +++ b/org.tizen.gettingstarted/html/native/app_model/application_model_n.htm @@ -18,7 +18,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        @@ -91,7 +91,7 @@ These devices have constraints, such as relatively small screen sizes and lack o

        Starting the Tizen Native Application

        -

        An application can be launched by the user from the Launcher or by another application. Either way, the Application Framework starts the application by creating a new process and calling the application entry point. Like in a conventional Linux application, the application main function is the entry point. For more information about launching native applications, see Launching Applications.

        +

        An application can be launched by the user from the Launcher or by another application. Either way, the Application Framework starts the application by creating a new process and calling the application entry point. Like in a conventional Linux application, the application main function is the entry point. For more information about launching native applications, see App Control.

        Package ID and Application ID

        diff --git a/org.tizen.gettingstarted/html/native/cover_page_n.htm b/org.tizen.gettingstarted/html/native/cover_page_n.htm index d7e0a1c..7cde62a 100644 --- a/org.tizen.gettingstarted/html/native/cover_page_n.htm +++ b/org.tizen.gettingstarted/html/native/cover_page_n.htm @@ -21,7 +21,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        Introduction to Native Applications

        diff --git a/org.tizen.gettingstarted/html/native/details/app_filtering_n.htm b/org.tizen.gettingstarted/html/native/details/app_filtering_n.htm index 9e77836..fb60348 100644 --- a/org.tizen.gettingstarted/html/native/details/app_filtering_n.htm +++ b/org.tizen.gettingstarted/html/native/details/app_filtering_n.htm @@ -18,7 +18,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        Content

        @@ -61,64 +61,76 @@ Feature key Description + Platform version http://tizen.org/feature/screen.size.normal Specify this key, if the application supports all possible current and future resolutions on the normal screen size.

        You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.normal and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.240.400 Specify this key, if the application supports the 240 x 400 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.320.320 Specify this key, if the application supports the 320 x 320 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.3 http://tizen.org/feature/screen.size.normal.320.480 Specify this key, if the application supports the 320 x 480 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.360.480 Specify this key, if the application supports the 360 x 480 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.3 http://tizen.org/feature/screen.size.normal.480.800 Specify this key, if the application supports the 480 x 800 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.540.960 Specify this key, if the application supports the 540 x 960 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.600.1024 Specify this key, if the application supports the 600 x 1024 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.720.1280 Specify this key, if the application supports the 720 x 1280 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.normal.1080.1920 Specify this key, if the application supports the 1080 x 1920 resolution on the normal screen size.

        You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 http://tizen.org/feature/screen.size.all Specify this key, if the application supports all possible current and future screen sizes and all possible current and future resolutions per screen size.

        You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.all and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

        If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

        + 2.2.1 @@ -151,418 +163,595 @@ Feature key Description + Platform version http://tizen.org/feature/camera Specify this key, if the application requires any kind of a camera. + 2.2.1 http://tizen.org/feature/camera.back Specify this key, if the application requires a back-facing camera. + 2.2.1 http://tizen.org/feature/camera.back.flash Specify this key, if the application requires a back-facing camera with a flash. + 2.2.1 http://tizen.org/feature/camera.front Specify this key, if the application requires a front-facing camera. + 2.2.1 http://tizen.org/feature/camera.front.flash Specify this key, if the application requires a front-facing camera with a flash. + 2.2.1 http://tizen.org/feature/fmradio Specify this key, if the application requires an FM radio. + 2.2.1 http://tizen.org/feature/graphics.acceleration Specify this key, if the application requires hardware acceleration for both 2D and 3D graphics. + 2.2.1 http://tizen.org/feature/input.keyboard Specify this key, if the application requires a built-in physical keyboard. + 2.2.1 http://tizen.org/feature/input.keyboard.layout Specify this key with a specific keyboard layout (string type), if the application requires a built-in physical keyboard supporting the specified keyboard layout. + 2.2.1 http://tizen.org/feature/led Specify this key, if the application requires a LED. + 2.3 http://tizen.org/feature/location Specify this key, if the application requires any location positioning features. + 2.2.1 +http://tizen.org/feature/location.geofence + Specify this key, if the application requires the geofence feature. + 2.4 + + http://tizen.org/feature/location.gps Specify this key, if the application requires the Global Positioning System (GPS) feature. + 2.2.1 http://tizen.org/feature/location.wps Specify this key, if the application requires the Wi-Fi-based Positioning System (WPS) feature. + 2.2.1 http://tizen.org/feature/microphone Specify this key, if the application requires a microphone. + 2.2.1 http://tizen.org/feature/multimedia.transcoder Specify this key, if the application requires the multimedia transcoder feature. + 2.3 http://tizen.org/feature/multi_point_touch.pinch_zoom Specify this key, if the application requires a pinch-zoom gesture feature. + 2.2.1 http://tizen.org/feature/multi_point_touch.point_count Specify this key with a specific number (int type), if the application requires the minimum of specified number of simultaneous touches in a multi-point touch. + 2.2.1 http://tizen.org/feature/network.bluetooth Specify this key, if the application requires the Bluetooth feature. + 2.2.1 http://tizen.org/feature/network.bluetooth.audio.call Specify this key, if the application requires the Bluetooth Handsfree feature (HFP). + 2.3 http://tizen.org/feature/network.bluetooth.audio.media Specify this key, if the application requires the Bluetooth Advanced Audio feature (A2DP). + 2.3 http://tizen.org/feature/network.bluetooth.health Specify this key, if the application requires the Bluetooth Health feature (HDP). + 2.3 http://tizen.org/feature/network.bluetooth.hid Specify this key, if the application requires the Bluetooth Human Input Device feature (HID). + 2.3 http://tizen.org/feature/network.bluetooth.le Specify this key, if the application requires the Bluetooth LE feature. + 2.3 http://tizen.org/feature/network.bluetooth.opp Specify this key, if the application requires the Bluetooth Object Push feature (OPP). + 2.3 http://tizen.org/feature/network.nfc Specify this key, if the application requires the use of any API that, in turn, requires the Near Field Communication (NFC) feature. + 2.2.1 http://tizen.org/feature/network.nfc.card_emulation Specify this key, if the application requires the NFC card emulation feature. + 2.3 http://tizen.org/feature/network.nfc.card_emulation.hce Specify this key, if the application requires the NFC host-based card emulation feature. + 2.3.1 +http://tizen.org/feature/network.nfc.p2p + Specify this key, if the application requires the NFC p2p feature. + 2.3.1 + + http://tizen.org/feature/network.nfc.reserved_push - Specify this key, if the application requires the NFC reserved push feature. + Specify this key, if the application requires the NFC reserved push feature.2.2.1 + + +http://tizen.org/feature/network.nfc.tag + Specify this key, if the application requires the NFC tag feature. + 2.3.1 http://tizen.org/feature/network.push - Specify this key, if the application requires the network-based push service. + Specify this key, if the application requires the network-based push service. + 2.2.1 http://tizen.org/feature/network.secure_element Specify this key, if the application requires the secure element feature. + 2.2.1 http://tizen.org/feature/network.secure_element.ese Specify this key, if the application requires the ESE secure element feature. + 2.3 http://tizen.org/feature/network.secure_element.uicc Specify this key, if the application requires the UICC secure element feature. + 2.3 http://tizen.org/feature/network.telephony Specify this key, if the application requires the use of any API that, in turn, requires the telephony feature. + 2.2.1 http://tizen.org/feature/network.telephony.mms Specify this key, if the application requires the MMS feature. + 2.2.1 +http://tizen.org/feature/network.telephony.sms + Specify this key, if the application requires the SMS feature. + 2.4 + + http://tizen.org/feature/network.tethering Specify this key, if the application requires any kind of tethering feature. + 2.3 http://tizen.org/feature/network.tethering.bluetooth Specify this key, if the application requires the tethering over Bluetooth feature. + 2.3 http://tizen.org/feature/network.tethering.usb Specify this key, if the application requires the tethering over USB connection feature. + 2.3 http://tizen.org/feature/network.tethering.wifi Specify this key, if the application requires the tethering over Wi-Fi feature. + 2.3 http://tizen.org/feature/network.wifi Specify this key, if the application requires the use of any API that, in turn, requires the Wi-Fi feature. + 2.2.1 http://tizen.org/feature/network.wifi.direct Specify this key, if the application requires the Wi-Fi Direct™ feature. + 2.2.1 http://tizen.org/feature/network.wifi.direct.display Specify this key, if the application requires the Wi-Fi Direct™ display feature. + 2.3 http://tizen.org/feature/network.wifi.direct.service_discovery Specify this key, if the application requires the Wi-Fi Direct™ service discovery feature. + 2.3 http://tizen.org/feature/opengles.texture_format.3dc Specify this key, if the application requires the 3DC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.atc Specify this key, if the application requires the ATC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.etc Specify this key, if the application requires the ETC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.ptc Specify this key, if the application requires the PTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.pvrtc - Specify this key, if the application requires the PVRTC texture format for OpenGL® ES. + Specify this key, if the application requires the PVRTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.utc Specify this key, if the application requires the UTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.version.1_1 Specify this key, if the application requires OpenGL® ES version 1.1 at minimum.

        You can specify at most 1 openGL® ES version. If you specify multiple versions, only the highest one is considered.

        - + + 2.2.1 http://tizen.org/feature/opengles.version.2_0 Specify this key, if the application requires OpenGL® ES version 2.0.

        You can specify at most 1 openGL® ES version. If you specify multiple versions, only the highest one is considered.

        - + + 2.2.1 http://tizen.org/feature/platform.core.cpu.arch.armv7 Specify this key, if the application requires the ARMv7 CPU architecture. + 2.2.1 + + +http://tizen.org/feature/platform.core.cpu.arch.x86 + Specify this key, if the application requires the x86 CPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.sse2 Specify this key, if the application requires the SSE2 Floating Point Unit (FPU) architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.sse3 Specify this key, if the application requires the SSE3 FPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.ssse3 Specify this key, if the application requires the SSSE3 FPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.vfpv3 Specify this key, if the application requires the VFPv3 FPU architecture. - - -http://tizen.org/feature/platform.core.cpu.arch.x86 - Specify this key, if the application requires the x86 CPU architecture. + 2.2.1 http://tizen.org/feature/screen.auto_rotation Specify this key, if the application requires the automatic screen rotation feature. + 2.2.1 http://tizen.org/feature/screen.size.all Specify this key, if the application supports all possible current and future screen sizes and all possible current and future resolutions per screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal Specify this key, if the application supports all possible current and future resolutions on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.240.400 Specify this key, if the application supports the 240 x 400 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.320.320 Specify this key, if the application supports the 320 x 320 resolution on the normal screen size. + 2.3 http://tizen.org/feature/screen.size.normal.320.480 Specify this key, if the application supports the 320 x 480 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.360.480 Specify this key, if the application supports the 360 x 480 resolution on the normal screen size. + 2.3 http://tizen.org/feature/screen.size.normal.480.800 Specify this key, if the application supports the 480 x 800 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.540.960 Specify this key, if the application supports the 540 x 960 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.600.1024 Specify this key, if the application supports the 600 x 1024 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.720.1280 Specify this key, if the application supports the 720 x 1280 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.1080.1920 Specify this key, if the application supports the 1080 x 1920 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/sensor.accelerometer Specify this key, if the application requires an acceleration sensor. + 2.2.1 http://tizen.org/feature/sensor.accelerometer.wakeup Specify this key, if the application requires the acceleration sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.activity_recognition - Specify this key, if the application requires an activity recognition sensor. + Specify this key, if the application requires an activity recognition sensor. + 2.3 http://tizen.org/feature/sensor.barometer - Specify this key, if the application requires a barometer sensor. + Specify this key, if the application requires a barometer sensor. + 2.2.1 http://tizen.org/feature/sensor.barometer.wakeup Specify this key, if the application requires the barometer sensor wake-up feature. + 2.2.1 +http://tizen.org/feature/sensor.geomagnetic_rotation_vector + Specify this key, if the application requires a geomagnetic-based rotation vector sensor. + 2.4 + + http://tizen.org/feature/sensor.gesture_recognition - Specify this key, if the application requires a gesture recognition sensor. + Specify this key, if the application requires a gesture recognition sensor. + 2.3 http://tizen.org/feature/sensor.gravity Specify this key, if the application requires a gravity sensor. + 2.3 http://tizen.org/feature/sensor.gyroscope Specify this key, if the application requires a gyro sensor. + 2.2.1 + + +http://tizen.org/feature/sensor.gyroscope_rotation_vector + Specify this key, if the application requires a gyroscope-based rotation vector sensor. + 2.4 +http://tizen.org/feature/sensor.gyroscope.uncalibrated + Specify this key, if the application requires an uncalibrated gyroscope sensor. + 2.4 + + http://tizen.org/feature/sensor.gyroscope.wakeup Specify this key, if the application requires the gyro sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.heart_rate_monitor Specify this key, if the application requires a heart rate monitor sensor. + 2.3 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_green + Specify this key, if the application requires the LED green heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_ir + Specify this key, if the application requires the LED infrared heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_red + Specify this key, if the application requires the LED red heart rate monitor sensor. + 2.3.1 http://tizen.org/feature/sensor.humidity Specify this key, if the application requires a humidity sensor. + 2.3 http://tizen.org/feature/sensor.linear_acceleration - Specify this key, if the application requires a linear acceleration sensor. + Specify this key, if the application requires a linear acceleration sensor. + 2.3 http://tizen.org/feature/sensor.magnetometer Specify this key, if the application requires a magnetic sensor. + 2.2.1 +http://tizen.org/feature/sensor.magnetometer.uncalibrated + Specify this key, if the application requires an uncalibrated geomagnetic sensor. + 2.4 + + http://tizen.org/feature/sensor.magnetometer.wakeup Specify this key, if the application requires the magnetic sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.pedometer Specify this key, if the application requires a pedometer sensor. + 2.3 http://tizen.org/feature/sensor.photometer - Specify this key, if the application requires a photometer sensor. + Specify this key, if the application requires a photometer sensor. + 2.2.1 http://tizen.org/feature/sensor.photometer.wakeup Specify this key, if the application requires the photometer sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.proximity Specify this key, if the application requires a proximity sensor. + 2.2.1 http://tizen.org/feature/sensor.proximity.wakeup Specify this key, if the application requires the proximity sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.rotation_vector Specify this key, if the application requires a rotation vector sensor. + 2.3 http://tizen.org/feature/sensor.temperature - Specify this key, if the application requires a temperature sensor. + Specify this key, if the application requires a temperature sensor. + 2.3 http://tizen.org/feature/sensor.tiltmeter - Specify this key, if the application requires a tilt sensor. + Specify this key, if the application requires a tilt sensor. + 2.2.1 http://tizen.org/feature/sensor.tiltmeter.wakeup Specify this key, if the application requires the tilt sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.ultraviolet Specify this key, if the application requires a ultraviolet sensor. + 2.3 http://tizen.org/feature/sensor.wrist_up - Specify this key, if the application requires a wrist up sensor. + Specify this key, if the application requires a wrist up sensor. + 2.3 + + +http://tizen.org/feature/shell.appwidget + Specify this key, if the application requires the AppWidget (Dynamic Box) feature. + 2.2.1 http://tizen.org/feature/sip.voip Specify this key, if the application requires the Voice Over Internet Protocol (VOIP) feature. + 2.2.1 + + +http://tizen.org/feature/speech.control + Specify this key, if the application requires the voice control feature. + 2.4 http://tizen.org/feature/speech.recognition Specify this key, if the application requires the speech recognition (STT) feature. + 2.2.1 http://tizen.org/feature/speech.synthesis Specify this key, if the application requires the speech synthesis (text to speech, TTS) feature. + 2.2.1 http://tizen.org/feature/usb.accessory Specify this key, if the application requires the USB client (or accessory) feature. + 2.2.1 http://tizen.org/feature/usb.host Specify this key, if the application requires the USB host feature. + 2.2.1 + + +http://tizen.org/feature/vision.barcode_detection + Specify this key, if the application requires the barcode detection feature. + 2.4 +http://tizen.org/feature/vision.barcode_generation + Specify this key, if the application requires the barcode generation feature. + 2.4 + + http://tizen.org/feature/vision.face_recognition - Specify this key, if the application requires the face recognition feature. + Specify this key, if the application requires the face recognition feature. + 2.2.1 http://tizen.org/feature/vision.image_recognition - Specify this key, if the application requires the image recognition feature. + Specify this key, if the application requires the image recognition feature. + 2.2.1 http://tizen.org/feature/vision.qrcode_generation Specify this key, if the application requires the QR code generation feature. + 2.2.1 http://tizen.org/feature/vision.qrcode_recognition Specify this key, if the application requires the QR code recognition feature. + 2.2.1 @@ -575,434 +764,610 @@ Feature key Description + Platform version http://tizen.org/feature/camera Specify this key, if the application requires any kind of a camera. + 2.2.1 http://tizen.org/feature/camera.back Specify this key, if the application requires a back-facing camera. + 2.2.1 http://tizen.org/feature/camera.back.flash - Specify this key, if the application requires a back-facing camera with a flash. + Specify this key, if the application requires a back-facing camera with a flash. + 2.2.1 http://tizen.org/feature/camera.front Specify this key, if the application requires a front-facing camera. + 2.2.1 http://tizen.org/feature/camera.front.flash Specify this key, if the application requires a front-facing camera with a flash. + 2.2.1 http://tizen.org/feature/fmradio Specify this key, if the application requires an FM radio. + 2.2.1 http://tizen.org/feature/graphics.acceleration Specify this key, if the application requires hardware acceleration for both 2D and 3D graphics. + 2.2.1 http://tizen.org/feature/input.keyboard Specify this key, if the application requires a built-in physical keyboard. + 2.2.1 http://tizen.org/feature/input.keyboard.layout Specify this key with a specific keyboard layout (string type), if the application requires a built-in physical keyboard supporting the specified keyboard layout. + 2.2.1 http://tizen.org/feature/input.rotating_bezel Specify this key, if the application requires rotating bezel input. + 2.3.1 http://tizen.org/feature/led Specify this key, if the application requires a LED. + 2.3 http://tizen.org/feature/location Specify this key, if the application requires any location positioning features. + 2.2.1 http://tizen.org/feature/location.gps - Specify this key, if the application requires the Global Positioning System (GPS) feature. + Specify this key, if the application requires the Global Positioning System (GPS) feature. + 2.2.1 http://tizen.org/feature/location.wps Specify this key, if the application requires the Wi-Fi-based Positioning System (WPS) feature. + 2.2.1 http://tizen.org/feature/microphone Specify this key, if the application requires a microphone. + 2.2.1 http://tizen.org/feature/multimedia.transcoder Specify this key, if the application requires the multimedia transcoder feature. + 2.3 http://tizen.org/feature/multi_point_touch.pinch_zoom Specify this key, if the application requires a pinch-zoom gesture feature. + 2.2.1 http://tizen.org/feature/multi_point_touch.point_count Specify this key with a specific number (int type), if the application requires the minimum of specified number of simultaneous touches in a multi-point touch. + 2.2.1 http://tizen.org/feature/network.bluetooth Specify this key, if the application requires the Bluetooth feature. + 2.2.1 http://tizen.org/feature/network.bluetooth.audio.call Specify this key, if the application requires the Bluetooth Handsfree feature (HFP). + 2.3 http://tizen.org/feature/network.bluetooth.audio.media Specify this key, if the application requires the Bluetooth Advanced Audio feature (A2DP). + 2.3 http://tizen.org/feature/network.bluetooth.health Specify this key, if the application requires the Bluetooth Health feature (HDP). + 2.3 http://tizen.org/feature/network.bluetooth.hid Specify this key, if the application requires the Bluetooth Human Input Device feature (HID). + 2.3 http://tizen.org/feature/network.bluetooth.le Specify this key, if the application requires the Bluetooth LE feature. + 2.3 http://tizen.org/feature/network.bluetooth.opp Specify this key, if the application requires the Bluetooth Object Push feature (OPP). + 2.3 http://tizen.org/feature/network.internet Specify this key, if the application requires Internet access. + 2.3.1 http://tizen.org/feature/network.nfc Specify this key, if the application requires the use of any API that, in turn, requires the Near Field Communication (NFC) feature. + 2.2.1 http://tizen.org/feature/network.nfc.card_emulation Specify this key, if the application requires the NFC card emulation feature. + 2.3 http://tizen.org/feature/network.nfc.card_emulation.hce Specify this key, if the application requires the NFC host-based card emulation feature. + 2.3.1 +http://tizen.org/feature/network.nfc.p2p + Specify this key, if the application requires the NFC p2p feature. + 2.3.1 + + http://tizen.org/feature/network.nfc.reserved_push - Specify this key, if the application requires the NFC reserved push feature. + Specify this key, if the application requires the NFC reserved push feature.2.2.1 + + +http://tizen.org/feature/network.nfc.tag + Specify this key, if the application requires the NFC tag feature. + 2.3.1 http://tizen.org/feature/network.push Specify this key, if the application requires the network-based push service. + 2.2.1 http://tizen.org/feature/network.secure_element Specify this key, if the application requires the secure element feature. + 2.2.1 http://tizen.org/feature/network.secure_element.ese Specify this key, if the application requires the ESE secure element feature. + 2.3 http://tizen.org/feature/network.secure_element.uicc Specify this key, if the application requires the UICC secure element feature. + 2.3 http://tizen.org/feature/network.telephony Specify this key, if the application requires the use of any API that, in turn, requires the telephony feature. + 2.2.1 http://tizen.org/feature/network.telephony.mms Specify this key, if the application requires the MMS feature. + 2.2.1 +http://tizen.org/feature/network.telephony.sms + Specify this key, if the application requires the SMS feature. + 2.4 + + http://tizen.org/feature/network.tethering Specify this key, if the application requires any kind of tethering feature. + 2.3 http://tizen.org/feature/network.tethering.bluetooth Specify this key, if the application requires the tethering over Bluetooth feature. + 2.3 http://tizen.org/feature/network.tethering.usb Specify this key, if the application requires the tethering over USB connection feature. + 2.3 http://tizen.org/feature/network.tethering.wifi Specify this key, if the application requires the tethering over Wi-Fi feature. + 2.3 http://tizen.org/feature/network.wifi Specify this key, if the application requires the use of any API that, in turn, requires the Wi-Fi feature. + 2.2.1 http://tizen.org/feature/network.wifi.direct Specify this key, if the application requires the Wi-Fi Direct™ feature. + 2.2.1 http://tizen.org/feature/network.wifi.direct.display Specify this key, if the application requires the Wi-Fi Direct™ display feature. + 2.3 http://tizen.org/feature/network.wifi.direct.service_discovery Specify this key, if the application requires the Wi-Fi Direct™ service discovery feature. + 2.3 http://tizen.org/feature/opengles.texture_format.3dc Specify this key, if the application requires the 3DC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.atc Specify this key, if the application requires the ATC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.etc Specify this key, if the application requires the ETC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.ptc Specify this key, if the application requires the PTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.pvrtc Specify this key, if the application requires the PVRTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.texture_format.utc Specify this key, if the application requires the UTC texture format for OpenGL® ES. + 2.2.1 http://tizen.org/feature/opengles.version.1_1 Specify this key, if the application requires OpenGL® ES version 1.1 at minimum.

        You can specify at most 1 openGL® ES version. If you specify multiple versions, only the highest one is considered.

        + 2.2.1 http://tizen.org/feature/opengles.version.2_0 Specify this key, if the application requires OpenGL® ES version 2.0.

        You can specify at most 1 openGL® ES version. If you specify multiple versions, only the highest one is considered.

        + 2.2.1 http://tizen.org/feature/platform.core.cpu.arch.armv7 Specify this key, if the application requires the ARMv7 CPU architecture. + 2.2.1 + + +http://tizen.org/feature/platform.core.cpu.arch.x86 + Specify this key, if the application requires the x86 CPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.sse2 Specify this key, if the application requires the SSE2 Floating Point Unit (FPU) architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.sse3 Specify this key, if the application requires the SSE3 FPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.ssse3 Specify this key, if the application requires the SSSE3 FPU architecture. + 2.2.1 http://tizen.org/feature/platform.core.fpu.arch.vfpv3 Specify this key, if the application requires the VFPv3 FPU architecture. - - -http://tizen.org/feature/platform.core.cpu.arch.x86 - Specify this key, if the application requires the x86 CPU architecture. + 2.2.1 http://tizen.org/feature/screen.auto_rotation Specify this key, if the application requires the automatic screen rotation feature. + 2.2.1 http://tizen.org/feature/screen.shape.circle Specify this key, if the application requires a circle-shaped screen. + 2.3.1 http://tizen.org/feature/screen.shape.rectangle Specify this key, if the application requires a rectangle-shaped screen. + 2.3.1 http://tizen.org/feature/screen.size.all Specify this key, if the application supports all possible current and future screen sizes and all possible current and future resolutions per screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal Specify this key, if the application supports all possible current and future resolutions on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.240.400 Specify this key, if the application supports the 240 x 400 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.320.320 Specify this key, if the application supports the 320 x 320 resolution on the normal screen size. + 2.3 http://tizen.org/feature/screen.size.normal.320.480 Specify this key, if the application supports the 320 x 480 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.360.480 Specify this key, if the application supports the 360 x 480 resolution on the normal screen size. + 2.3 http://tizen.org/feature/screen.size.normal.480.800 Specify this key, if the application supports the 480 x 800 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.540.960 Specify this key, if the application supports the 540 x 960 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.600.1024 Specify this key, if the application supports the 600 x 1024 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.720.1280 Specify this key, if the application supports the 720 x 1280 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/screen.size.normal.1080.1920 Specify this key, if the application supports the 1080 x 1920 resolution on the normal screen size. + 2.2.1 http://tizen.org/feature/sensor.accelerometer Specify this key, if the application requires an acceleration sensor. + 2.2.1 http://tizen.org/feature/sensor.accelerometer.wakeup Specify this key, if the application requires the acceleration sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.activity_recognition Specify this key, if the application requires an activity recognition sensor. + 2.3 http://tizen.org/feature/sensor.barometer Specify this key, if the application requires a barometer sensor. + 2.2.1 http://tizen.org/feature/sensor.barometer.wakeup Specify this key, if the application requires the barometer sensor wake-up feature. + 2.2.1 +http://tizen.org/feature/sensor.geomagnetic_rotation_vector + Specify this key, if the application requires a geomagnetic-based rotation vector sensor. + 2.4 + + http://tizen.org/feature/sensor.gesture_recognition Specify this key, if the application requires a gesture recognition sensor. + 2.3 http://tizen.org/feature/sensor.gravity Specify this key, if the application requires a gravity sensor. + 2.3 http://tizen.org/feature/sensor.gyroscope Specify this key, if the application requires a gyro sensor. + 2.2.1 + + +http://tizen.org/feature/sensor.gyroscope_rotation_vector + Specify this key, if the application requires a gyroscope-based rotation vector sensor. + 2.4 +http://tizen.org/feature/sensor.gyroscope.uncalibrated + Specify this key, if the application requires an uncalibrated gyroscope sensor. + 2.4 + + http://tizen.org/feature/sensor.gyroscope.wakeup Specify this key, if the application requires the gyro sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.heart_rate_monitor Specify this key, if the application requires a heart rate monitor sensor. + 2.3 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_green + Specify this key, if the application requires the LED green heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_ir + Specify this key, if the application requires the LED infrared heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_red + Specify this key, if the application requires the LED red heart rate monitor sensor. + 2.3.1 http://tizen.org/feature/sensor.humidity Specify this key, if the application requires a humidity sensor. + 2.3 http://tizen.org/feature/sensor.linear_acceleration Specify this key, if the application requires a linear acceleration sensor. + 2.3 http://tizen.org/feature/sensor.magnetometer Specify this key, if the application requires a magnetic sensor. + 2.2.1 +http://tizen.org/feature/sensor.magnetometer.uncalibrated + Specify this key, if the application requires an uncalibrated geomagnetic sensor. + 2.4 + + http://tizen.org/feature/sensor.magnetometer.wakeup Specify this key, if the application requires the magnetic sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.pedometer Specify this key, if the application requires a pedometer sensor. + 2.3 http://tizen.org/feature/sensor.photometer Specify this key, if the application requires a photometer sensor. + 2.2.1 http://tizen.org/feature/sensor.photometer.wakeup Specify this key, if the application requires the photometer sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.proximity Specify this key, if the application requires a proximity sensor. + 2.2.1 http://tizen.org/feature/sensor.proximity.wakeup Specify this key, if the application requires the proximity sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.rotation_vector Specify this key, if the application requires a rotation vector sensor. + 2.3 http://tizen.org/feature/sensor.temperature Specify this key, if the application requires a temperature sensor. + 2.3 http://tizen.org/feature/sensor.tiltmeter Specify this key, if the application requires a tilt sensor. + 2.2.1 http://tizen.org/feature/sensor.tiltmeter.wakeup Specify this key, if the application requires the tilt sensor wake-up feature. + 2.2.1 http://tizen.org/feature/sensor.ultraviolet Specify this key, if the application requires a ultraviolet sensor. + 2.3 http://tizen.org/feature/sensor.wrist_up Specify this key, if the application requires a wrist up sensor. + 2.3 + + +http://tizen.org/feature/shell.appwidget + Specify this key, if the application requires the AppWidget (Dynamic Box) feature. + 2.2.1 http://tizen.org/feature/sip.voip Specify this key, if the application requires the Voice Over Internet Protocol (VOIP) feature. + 2.2.1 +http://tizen.org/feature/speech.control + Specify this key, if the application requires the voice control feature. + 2.4 + + http://tizen.org/feature/speech.recognition Specify this key, if the application requires the speech recognition (STT) feature. + 2.2.1 http://tizen.org/feature/speech.synthesis Specify this key, if the application requires the speech synthesis (text to speech, TTS) feature. + 2.2.1 http://tizen.org/feature/usb.accessory Specify this key, if the application requires the USB client (or accessory) feature. + 2.2.1 http://tizen.org/feature/usb.host Specify this key, if the application requires the USB host feature. + 2.2.1 + + +http://tizen.org/feature/vision.barcode_detection + Specify this key, if the application requires the barcode detection feature. + 2.4 +http://tizen.org/feature/vision.barcode_generation + Specify this key, if the application requires the barcode generation feature. + 2.4 + + http://tizen.org/feature/vision.face_recognition Specify this key, if the application requires the face recognition feature. + 2.2.1 http://tizen.org/feature/vision.image_recognition Specify this key, if the application requires the image recognition feature. + 2.2.1 http://tizen.org/feature/vision.qrcode_generation Specify this key, if the application requires the QR code generation feature. + 2.2.1 http://tizen.org/feature/vision.qrcode_recognition Specify this key, if the application requires the QR code recognition feature. + 2.2.1 diff --git a/org.tizen.gettingstarted/html/native/details/details_n.htm b/org.tizen.gettingstarted/html/native/details/details_n.htm index b41321b..a6d8746 100644 --- a/org.tizen.gettingstarted/html/native/details/details_n.htm +++ b/org.tizen.gettingstarted/html/native/details/details_n.htm @@ -18,7 +18,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        diff --git a/org.tizen.gettingstarted/html/native/details/error_handling_n.htm b/org.tizen.gettingstarted/html/native/details/error_handling_n.htm index fa3cc9b..8de7fe3 100644 --- a/org.tizen.gettingstarted/html/native/details/error_handling_n.htm +++ b/org.tizen.gettingstarted/html/native/details/error_handling_n.htm @@ -19,7 +19,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        Error Handling

        diff --git a/org.tizen.gettingstarted/html/native/details/event_handling_n.htm b/org.tizen.gettingstarted/html/native/details/event_handling_n.htm index 251dcf8..df2b60b 100644 --- a/org.tizen.gettingstarted/html/native/details/event_handling_n.htm +++ b/org.tizen.gettingstarted/html/native/details/event_handling_n.htm @@ -18,7 +18,7 @@
    @@ -44,7 +45,7 @@ Note - For more information on using Efl Extension for Menu key, Back key, and rotary events, see the Hardware Input Handling UI guide. + For more information on using Efl Extension for Menu key, Back key, and rotary events, see Hardware Input Handling. @@ -83,6 +84,10 @@

    Tizen supports handling Media key events, such as play, stop, and pause events, from media devices (such as Bluetooth remote controller and earjack).

    To handle the Media key events, use the Media key API (in mobile and wearable applications).

    +

    Ambient Events

    + +

    An ambient mode is available in a low-powered wearable device. For more information about ambient events in the mobile native profile, see the Watch Application guide.

    +
    diff --git a/org.tizen.gettingstarted/html/native/details/io_overview_n.htm b/org.tizen.gettingstarted/html/native/details/io_overview_n.htm index 709cb92..e3a851c 100644 --- a/org.tizen.gettingstarted/html/native/details/io_overview_n.htm +++ b/org.tizen.gettingstarted/html/native/details/io_overview_n.htm @@ -21,7 +21,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    File System Directory Hierarchy

    diff --git a/org.tizen.gettingstarted/html/native/details/sec_privileges_n.htm b/org.tizen.gettingstarted/html/native/details/sec_privileges_n.htm index b353a86..07dbe96 100644 --- a/org.tizen.gettingstarted/html/native/details/sec_privileges_n.htm +++ b/org.tizen.gettingstarted/html/native/details/sec_privileges_n.htm @@ -25,7 +25,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Security and API Privileges

    @@ -213,8 +213,8 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/ime

    public

    -

    Providing input methods -

    The application can provide users with a way to enter characters and symbols into an associated text field. +

    Providing input methods

    +

    The application can provide users with a way to enter characters and symbols into an associated text field.

    http://tizen.org/privilege/imemanager

    @@ -232,7 +232,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/keygrab

    platform

    Capturing special key events

    -

    The application can read actions involving special keys, such as the volume keys on this or other devices (e.g. TV remote controls), even when it is running in the background.

    +

    The application can read actions involving special keys, such as the volume keys on this or other devices (such as TV remote controls), even when it is running in the background.

    http://tizen.org/privilege/keymanager

    @@ -270,7 +270,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/mapservice

    public

    Using map services

    -

    The application can use map services such as Geocoder, Places, and Route (Direction).

    +

    The application can use map services, such as Geocoder, Places, and Route (Direction).

    http://tizen.org/privilege/mediacontroller.client

    @@ -607,8 +607,8 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/ime

    public

    -

    Providing input methods -

    The application can provide users with a way to enter characters and symbols into an associated text field. +

    Providing input methods

    +

    The application can provide users with a way to enter characters and symbols into an associated text field.

    http://tizen.org/privilege/imemanager

    @@ -626,7 +626,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/keygrab

    platform

    Capturing special key events

    -

    The application can read actions involving special keys, such as the volume keys on this or other devices (e.g. TV remote controls), even when it is running in the background.

    +

    The application can read actions involving special keys, such as the volume keys on this or other devices (such as TV remote controls), even when it is running in the background.

    http://tizen.org/privilege/keymanager

    @@ -663,7 +663,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }

    http://tizen.org/privilege/mapservice

    public

    Using map services

    -

    The application can use map services such as Geocoder, Places, and Route (Direction).

    +

    The application can use map services, such as Geocoder, Places, and Route (Direction).

    http://tizen.org/privilege/mediacontroller.client

    diff --git a/org.tizen.gettingstarted/html/native/details/tizen_apis_n.htm b/org.tizen.gettingstarted/html/native/details/tizen_apis_n.htm index 5a35519..b611537 100755 --- a/org.tizen.gettingstarted/html/native/details/tizen_apis_n.htm +++ b/org.tizen.gettingstarted/html/native/details/tizen_apis_n.htm @@ -21,7 +21,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Tizen APIs

    @@ -34,7 +34,7 @@

    There are 2 types of submodules - Tizen native modules and open source modules. The integration of open source modules in the native API structure allows you to add additional features by using well-known open source libraries. This is particularly advantageous for developers who are familiar with certain libraries because they can quickly add features and use previously written code in certain cases.

    -

    The following table define the Tizen native API mobile layout. The table describes the API modules and the functionality of all their submodule APIs within that module. The table also acts as reference sources for when you are planning a new feature for your application and need a way to efficiently compare different API modules to decide which APIs to use.

    +

    The following table defines the Tizen mobile native API layout. The table describes the API modules and the functionality of all their submodule APIs within that module. The table also acts as reference sources for when you are planning a new feature for your application and need a way to efficiently compare different API modules to decide which APIs to use.

    @@ -58,27 +58,30 @@ - - + - + - + - + + + + + - - + @@ -125,7 +128,7 @@ - @@ -141,16 +144,16 @@
  • Tutorials: Base
  • - + - + - + @@ -162,7 +165,7 @@ - + @@ -177,8 +180,8 @@ - - + - - - - - + @@ -232,11 +231,11 @@ - + - + @@ -279,7 +278,7 @@ - + @@ -287,7 +286,7 @@ - + @@ -299,15 +298,15 @@ - + - + - + @@ -323,7 +322,7 @@ - + @@ -331,7 +330,7 @@ - + @@ -363,7 +362,7 @@ - + @@ -394,7 +393,7 @@ - + @@ -407,10 +406,6 @@ - - - - @@ -418,6 +413,10 @@ + + + + - + @@ -460,7 +459,7 @@ - + @@ -479,24 +478,28 @@ - - + + - - + - + + + + + - + @@ -508,19 +511,19 @@ - + - + - + - + @@ -530,33 +533,29 @@
  • Guides: UIX
  • Tutorials: UIX
  • - + - + - + - + - - + - - - - - + @@ -565,7 +564,7 @@
    Functionality
    AccountThe Account API module features include managing various account information, such as receiving sync operation notifications, and obtaining an access token by using the oauth2 authorization. + AccountThe Account API module features include managing various account information, such as receiving sync operation notifications and obtaining an access token by using the OAuth 2.0 authorization.

    Documentation:

    Account ManagerThe Account APIs provide CRUD (Create, Read, Update, Delete) account management functionality.Provides CRUD (Create, Read, Update, Delete) account management functionality.
    OAuth 2.0

    (since 2.4)

    The OAuth 2.0 APIs provide an easy way to gain an access token between server and client.Provides an easy way to gain an access token between a server and client.
    Sync Manager

    (since 2.4)

    The Sync Manager API helps applications in scheduling their data sync operations.Helps applications in scheduling their data sync operations.
    libOAuthProvides a library for using an open standard for secure authorization. This library enables users to securely log into an account on an application by using their logon credentials from another secondary account that they may have with another account provider or application.
    Application Framework The Application Framework API contains submodule APIs for application development. The submodule APIs enable application life-cycle management, usage of functionality that is exported by other applications, and access to a user's application preferences. @@ -105,7 +108,7 @@
    BundleA bundle is a string-based dictionary abstract data type (ADT). A dictionary is an ordered or unordered list of key-element pairs. Keys are used to locate elements in the list. This submodule can be used to create and manage a dictionary.Provides a string-based dictionary abstract data type (ADT). A dictionary is an ordered or unordered list of key-element pairs. Keys are used to locate elements in the list. This submodule can be used to create and manage a dictionary.
    Data Control
    ShortcutAdds application shortcuts to the device home screen, which is the main landing screen of the device. + Adds application shortcuts to the device home screen, the main landing screen of the device.
    C++ Standard LibraryStandard C++ library.Provides a standard C++ library.
    zlib

    (since 2.4)

    zlib is used for in-memory compression and decompression.Used for in-memory compression and decompression.
    GlibcStandard C library.Provides a standard C library.
    Glib
    LibXMLThis library can be used to parse XML documents such as the Application Manifest.Used to parse XML documents such as the Application Manifest.
    MinizipImplements a lightweight SQL relational database. This is widely used for embedded client or local storage.
    ContentThe Content API module contains submodule APIs for managing the most common device media data types, such as image, audio, and video files. It provides operations to search for content, search for content information stored on the device, create playlists, download content from servers through an HTTP connection, and access the EXIF information of an image file. + ContentThe Content API module contains submodule APIs for managing the most common device media data types, such as image, audio, and video files. It provides operations to search for content, search for content information stored on the device, create playlists, download content from servers through an HTTP connection, and access the EXIF information of an image file.

    Documentation:

    • Guides: Content
    • @@ -195,10 +198,6 @@
    Connects and disconnects from the media content service. This connection is required to insert, update and remove media file information in the media content database. Common media data types, such as image, audio, and video can be managed through the database. Other queries, such as searching for content and content information and accessing EXIF information from image files, are also possible.
    Service Adaptor

    (since 2.4)

    The Service Adaptor API provides developer with common interfaces like using local service for various service infra.
    Context The Context API module contains submodule APIs to detect user information such as when a user is running with a device and device information such as gestures when a device is tilted.

    Documentation:

    @@ -218,7 +217,7 @@
    Contextual Trigger

    (since 2.4)

    The Contextual Trigger API provides a way to define rules, each of which can trigger a specified action when the rule is satisfied.Provides a way to define rules, each of which can trigger a specified action when the rule is satisfied.
    Location
    Geofence Manager

    (since 2.4)

    This Geofence Manager API provides service related to geofence(geo-fence).Provides a service related to geofence (geo-fence).
    Maps Service

    (since 2.4)

    Maps API provides a developer with a set of functions, helping to create Maps aware applications.Provides a set of functions, helping to create map-aware applications.
    libEXIFEXIF is an image file format that extends existing formats, such as JPEG and TIFF. Many Tizen devices have a camera and use this format, and libEXIF can be used to read and write EXIF metainformation to and from image files.Supports an image file format that extends existing formats, such as JPEG and TIFF. Many Tizen devices have a camera and use the EXIF format, and libEXIF can be used to read and write EXIF metainformation to and from image files.
    Media Codec
    Media Controller

    (since 2.4)

    The Media Controller API provides functions for communication between the media controller server and the media controller client.Provides functions for communication between the media controller server and the media controller client.
    Media Tool
    Metadata Editor

    (since 2.4)

    The Metadata Editor API provides functions for editing the metadata of several popular audio format.Provides functions for editing the metadata of several popular audio formats.
    Media Vision

    (since 2.4)

    Media Vision library provides functionality for barcodes detection and generation.Provides functionality for barcode detection and generation.
    OpenALEfficiently renders multichannel 3D audio.Renders multichannel 3D audio.
    Player
    Screen Mirroring

    (since 2.4)

    The Screen Mirroring API provides functions for screen mirroring as sink.Provides functions for screen mirroring as a sink.
    Sound Manager
    Thumbnail Util

    (since 2.4)

    The Thumbnail Util API provides functions for creating the thumbnail from an input media file.Provides functions for creating the thumbnail from an input media file.
    Tone Player
    CurlA client-side URL data transfer library supporting http, https, ftp, file URIs, and many other protocols. Allows applications to perform URL-related activities without a Web browser.Provides a client-side URL data transfer library supporting http, https, ftp, file URIs, and many other protocols. Allows applications to perform URL-related activities without a Web browser.
    NFC
    OpenSSLAn open source library that provides basic cryptographic functions and various utility functions.Provides an open source library that provides basic cryptographic functions and various utility functions.
    Privilege InfoAccount ManagerAn account is a collection of information representing the user of a specific account provider. This API submodule creates and manages accounts, retrieves account information, and receives account change notifications.
    Calendar Manages calendars, including events and tasks. It also stores and queries calendar information.
    Contacts Manages phone contact information, such as address books, persons, and phone logs.
    Service Adaptor

    (since 2.4)

    Provides common interfaces, such as using a local service for various service infra.
    System The System API module contains submodule APIs for system management. @@ -431,7 +430,7 @@
    Feedback

    (since 2.4)

    The Feedback API provides functions to play sound or vibration associated with properties.Provides functions to play sound or vibration associated with properties.
    T-trace

    (since 2.4)

    The T-trace API provides functions for writing trace message to the system trace buffer.Provides functions for writing trace messages to the system trace buffer.
    Obtains call, network, and SIM information.
    Phonenumber Utils

    (since 2.4)

    The phonenumber utils API provides methods for parsing and formatting phone numbers.Phonenumber utils

    (since 2.4)

    Provides functions for parsing and formatting phone numbers.
    UI FrameworkThe UI Framework API module contains submodule APIs and open source libraries for 2D and 3D graphics and text. + UI FrameworkThe UI Framework API module contains submodule APIs and open source libraries for 2D and 3D graphics and text.

    Documentation:

    CairoA library for 2D vector graphics drawing. Vector graphics are advantageous because they have small file sizes and can be scaled to any size without any loss of image quality. Cairo EvasGL APIs have been newly added since 2.3.1.Provides a library for 2D vector graphics drawing. Vector graphics are advantageous because they have small file sizes and can be scaled to any size without any loss of image quality. Cairo EvasGL APIs have been newly added since 2.3.1.
    DALiProvides a cross-platform 3D UI Toolkit for embedded systems.
    EFLEFL is a collection of libraries that are independent and can be built on top of each other to provide useful features that complement the existing environment.Provides a collection of libraries that are independent and can be built on top of each other to provide useful features that complement the existing environment.
    EFL UTIL
    External Output Manager

    (since 2.4)

    The External Output Manager provides APIs for external outputs.Provides functions for external outputs.
    Fontconfig and FreetypeA text rendering library and font-handling library to let applications find a font or closely matching font.Provides a text rendering library and font-handling library to let applications find a font or closely matching font.
    Minicontrol

    (since 2.4)

    Provides functions for creating EFL socket window and displaying EFL socket window.Provides functions for creating and displaying an EFL socket window.
    TBM SurfaceThe Tizen Buffer Manager (TBM) surface provides functions for the graphics buffer.Provides functions for the graphics buffer.
    UIX STTThis API submodule provides functions to recognize speech.Provides functions to recognize speech.
    TTSThis API submodule provides functions for synthesizing voice from text and playing synthesized sound data.Provides functions for synthesizing voice from text and playing synthesized sound data.
    Input Method

    (since 2.4)

    The Input Method API provides the functions for starting IME application lifecycle, methods to interact with current UI state of IME, and getting attributes/events.Provides functions for starting the IME application life-cycle, for interacting with the current UI state of the IME, and getting attributes and events.
    Voice control

    (since 2.4)

    The Voice control API provides functions for registering command and getting notification when registered command is recognized.Provides functions for registering commands and getting notifications when a registered command is recognized.
    WebThe Web API module contains submodule APIs for browsing the Internet, tracking browsing history, downloading Web content, and manipulating JavaScript Object Notation (JSON) documents. + WebThe Web API module contains submodule APIs for browsing the Internet, tracking browsing history, downloading Web content, and manipulating JavaScript Object Notation (JSON) documents.

    Documentation:

    Json-GlibThis library allows reading and parsing of JavaScript Object Notation (JSON) documents.
    libOAuthLibrary for using an open standard for secure authorization. This library enables users to securely log into an account on an application by using their logon credentials from another secondary account that they may have with another account provider or application. Allows reading and parsing of JavaScript Object Notation (JSON) documents.
    WebView
    -

    The following table describes the API modules in the wearable profile and the functionality of all their submodule APIs.

    +

    The following table describes the API modules in the wearable profile and the functionality of all their submodule APIs within that module. The table also acts as reference sources for when you are planning a new feature for your application and need a way to efficiently compare different API modules to decide which APIs to use.

    @@ -573,11 +572,11 @@ - +
    Note
    Except as noted, the wearable native APIs are available since Tizen 2.3.1Except as noted, the wearable native APIs are available since Tizen 2.3.1.
    - + @@ -588,23 +587,28 @@ - - + - + - - + + + + + + - + @@ -646,12 +650,11 @@ - - - - - + + + + + @@ -669,15 +672,15 @@
  • Tutorials: Base
  • - + - + - + @@ -689,7 +692,7 @@ - + @@ -716,6 +719,7 @@ + - + @@ -780,15 +784,15 @@ - + - - + + @@ -800,15 +804,15 @@ - + - + - + @@ -828,7 +832,7 @@ - + @@ -856,7 +860,7 @@ - + @@ -882,7 +886,7 @@ - + @@ -893,8 +897,8 @@ +
  • Guides: Social
  • +
  • Tutorials: Social
  • @@ -911,7 +915,7 @@ - + @@ -939,7 +943,7 @@ - + @@ -957,24 +961,28 @@ - - + + - - + - + + + + + - + @@ -986,19 +994,19 @@ - + - + - + - + @@ -1009,34 +1017,30 @@
  • Guides: UIX
  • Tutorials: UIX
  • - + - + - + - + - - + - - - - - + diff --git a/org.tizen.gettingstarted/html/native/first_app/first_app_n.htm b/org.tizen.gettingstarted/html/native/first_app/first_app_n.htm index e57ad86..378d521 100644 --- a/org.tizen.gettingstarted/html/native/first_app/first_app_n.htm +++ b/org.tizen.gettingstarted/html/native/first_app/first_app_n.htm @@ -21,7 +21,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Creating Your First Tizen Application

    @@ -103,7 +103,7 @@ messages_add_address (sms_msg,"01020157919", MESSAGE_RECIPIENT_TO);
  • Creating the Application UI with EFL -

    The EFL is the native graphical toolkit for Tizen.

    +

    The EFL is the native graphical toolkit for Tizen.

    To create the application UI:

      @@ -321,7 +321,7 @@ create_gui(appdata_s *ad)
    1. Exit the GUI

      The clicked_cb() function exits the Elementary; the prototype of the function is common to all callbacks given to evas_object_smart_callback_add(). Put the clicked_cb() function above the create_gui() function.

      -

      For more details on the callbacks, see the Evas Smart Object Events guide.

      +

      For more details on the callbacks, see the Evas Smart Object Events guide.

      static void
       clicked_cb(void *user_data, Evas_Object *obj, void *event_info)
       {
      diff --git a/org.tizen.gettingstarted/html/native/process/app_dev_process_n.htm b/org.tizen.gettingstarted/html/native/process/app_dev_process_n.htm
      index f3d90d7..7e26c30 100644
      --- a/org.tizen.gettingstarted/html/native/process/app_dev_process_n.htm
      +++ b/org.tizen.gettingstarted/html/native/process/app_dev_process_n.htm
      @@ -18,7 +18,7 @@
       
       
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -38,9 +38,8 @@

      Native Application Development Process

      -

      The following figure illustrates the process of developing a Tizen native application. Tizen provides the tools required to manage your application's life-cycle from product conception, through development and release, to end-of-life application retirement.

      -

      Figure: Native application development process

      -

      Native application development process

      +

      Tizen provides the tools required to manage your application's life-cycle from product conception, through development and release, to end-of-life application retirement.

      +

      To develop an application with Tizen:

      Planning and Designing the Application

      @@ -157,102 +156,98 @@
    2. Build and run the UI application.

      The service application or shared library is built and run automatically while the UI application is built and run.

    -
  • Table: Wearable native API modules
    Functionality
    AccountThe Account API module features include managing various account information, such as receiving sync operation notifications, and obtaining an access token by using the oauth2 authorization. + AccountThe Account API module features include managing various account information, such as receiving sync operation notifications and obtaining an access token by using the OAuth 2.0 authorization.

    Documentation:

    Account ManagerThe Account APIs provide CRUD (Create, Read, Update, Delete) account management functionality.Provides CRUD (Create, Read, Update, Delete) account management functionality.
    OAuth 2.0

    (since 2.4)

    The OAuth 2.0 APIs provide easy way to gain access token between server and client.
    Provides easy way to gain access token between server and client.
    libOAuthProvides a library for using an open standard for secure authorization. This library enables users to securely log into an account on an application by using their logon credentials from another secondary account that they can have with another account provider or application.
    Application Framework The Application Framework API contains submodule APIs for application development. The submodule APIs enable application life-cycle management, usage of functionality that is exported by other applications, and access to a user's application preferences. +

    Documentation:

    BundleA bundle is a string-based dictionary abstract data type (ADT). A dictionary is an ordered or unordered list of key-element pairs. Keys are used to locate elements in the list. This submodule can be used to create and manage a dictionary.Provides a string-based dictionary abstract data type (ADT). A dictionary is an ordered or unordered list of key-element pairs. Keys are used to locate elements in the list. This submodule can be used to create and manage a dictionary.
    Data ControlPackage Manager Stores and receives information related to packages installed on the device. This is information can be, for example, the package name, path to the icon image, or the application version. It can also be used to check whether 2 package certificates match. If they match, they have been created by the same developer and can share resources securely.
    ShortcutAdds application shortcuts to the device home screen, which is the main landing screen of the device. -
    ShortcutAdds application shortcuts to the device home screen, the main landing screen of the device.
    Watch Application Handles Tizen watch application state changes and system events. It is also used to start and exit the main event loop of watch applications. C++ Standard LibraryStandard C++ library.Provides a standard C++ library.
    zlib

    (since 2.4)

    zlib is used for in-memory compression and decompression.Used for in-memory compression and decompression.
    GlibcStandard C library.Provides a standard C library.
    Glib
    LibXMLThis library can be used to parse XML documents such as the Application Manifest.Used to parse XML documents such as the Application Manifest.
    Minizip
    Media Content Connects and disconnects from the media content service. This connection is required to insert, update and remove media file information in the media content database. Common media data types, such as image, audio, and video can be managed through the database. Other queries, such as searching for content and content information and accessing EXIF information from image files, are also possible.
    Context The Context API module contains submodule APIs to detect user information such as when a user is running with a device and device information such as gestures when a device is tilted. @@ -742,7 +746,7 @@
    Maps Service

    (since 2.4)

    Maps API provides a developer with a set of functions, helping to create Maps aware applications.Provides a set of functions, helping to create map-aware applications.
    Messaging
    libEXIFEXIF is an image file format that extends existing formats, such as JPEG and TIFF. Many Tizen devices have a camera and use this format, and libEXIF can be used to read and write EXIF metainformation to and from image files.Supports an image file format that extends existing formats, such as JPEG and TIFF. Many Tizen devices have a camera and use the EXIF format, and libEXIF can be used to read and write EXIF metainformation to and from image files.
    Media Codec Provides interfaces for encoding and decoding audio and video data, such as AAC audio or MPEG-4 AVC video.
    Media Controller

    (since 2.4)

    The Media Controller API provides functions for communication between the media controller server and the media controller client.Media Controller

    (since 2.4)

    Provides functions for communication between the media controller server and the media controller client.
    Media Tool
    Metadata Editor

    (since 2.4)

    The Metadata Editor API provides functions for editing the metadata of several popular audio format.Provides functions for editing the metadata of several popular audio formats.
    Media Vision

    (since 2.4)

    Media Vision library provides functionality for barcodes detection and generation.Provides functionality for barcode detection and generation.
    OpenALEfficiently renders multichannel 3D audio.Renders efficiently multichannel 3D audio.
    Player
    Thumbnail Util

    (since 2.4)

    The Thumbnail Util API provides functions for creating the thumbnail from an input media file.Provides functions for creating the thumbnail from an input media file.
    Tone Player
    CurlA client-side URL data transfer library supporting http, https, ftp, file URIs, and many other protocols. Allows applications to perform URL-related activities without a Web browser.Provides a client-side URL data transfer library supporting http, https, ftp, file URIs, and many other protocols. Allows applications to perform URL-related activities without a Web browser.
    NFC
    OpenSSLAn open source library that provides basic cryptographic functions and various utility functions.Provides an open source library that provides basic cryptographic functions and various utility functions.
    Privilege InfoThe Social API module contains submodule APIs to manage personal data, such as contacts on a device.

    Documentation:

    Contacts

    (since 2.4)

    Manages phone contact information, such as address books, persons, and phone logs.
    Feedback

    (since 2.4)

    The Feedback API provides functions to play sound or vibration associated with properties.Provides functions to play sound or vibration associated with properties.
    Media key
    T-trace

    (since 2.4)

    The T-trace API provides functions for writing trace message to the system trace buffer.Provides functions for writing trace messages to the system trace buffer.
    dlogObtains call, network, and SIM information.
    Phonenumber Utils

    (since 2.4)

    The phonenumber utils API provides methods for parsing and formatting phone numbers.Phonenumber utils

    (since 2.4)

    Provides functions for parsing and formatting phone numbers.
    UI FrameworkThe UI Framework API module contains submodule APIs and open source libraries for 2D and 3D graphics and text. + UI FrameworkThe UI Framework API module contains submodule APIs and open source libraries for 2D and 3D graphics and text.

    Documentation:

    CairoA library for 2D vector graphics drawing. Vector graphics are advantageous because they have small file sizes and can be scaled to any size without any loss of image quality. This module also includes Cairo EvasGL APIs which have been designed to support hardware-accelerated rendering.Provides a library for 2D vector graphics drawing. Vector graphics are advantageous because they have small file sizes and can be scaled to any size without any loss of image quality. This module also includes Cairo EvasGL APIs which have been designed to support hardware-accelerated rendering.
    DALiProvides a cross-platform 3D UI Toolkit for embedded systems.
    EFLEFL is a collection of libraries that are independent and can be built on top of each other to provide useful features that complement the existing environment.Provides a collection of libraries that are independent and can be built on top of each other to provide useful features that complement the existing environment.
    EFL UTIL
    External Output Manager

    (since 2.4)

    The External Output Manager provides APIs for external outputs.Provides functions for external outputs.
    Fontconfig and FreetypeA text rendering library and font-handling library to let applications find a font or closely matching font.Provides a text rendering library and font-handling library to let applications find a font or closely matching font.
    Minicontrol

    (since 2.4)

    Provides functions for creating EFL socket window and displaying EFL socket window.Provides functions for creating and displaying an EFL socket window.
    TBM SurfaceThe Tizen Buffer Manager (TBM) surface provides functions for the graphics buffer.Provides functions for the graphics buffer.
    STTThis API submodule provides functions to recognize speech.Provides functions to recognize speech.
    TTSThis API submodule provides functions for synthesizing voice from text and playing synthesized sound data.Provides functions for synthesizing voice from text and playing synthesized sound data.
    Input Method

    (since 2.4)

    The Input Method API provides the functions for starting IME application lifecycle, methods to interact with current UI state of IME, and getting attributes/events.Provides functions for starting the IME application life-cycle, for interacting with the current UI state of the IME, and getting attributes and events.
    Voice control

    (since 2.4)

    The Voice control API provides functions for registering command and getting notification when registered command is recognized.Provides functions for registering commands and getting notifications when a registered command is recognized.
    WebThe Web API module contains submodule APIs for browsing the Internet, tracking browsing history, downloading Web content, and manipulating JavaScript Object Notation (JSON) documents. + WebThe Web API module contains submodule APIs for browsing the Internet, tracking browsing history, downloading Web content, and manipulating JavaScript Object Notation (JSON) documents.

    Documentation:

    Json-GlibThis library allows reading and parsing of JavaScript Object Notation (JSON) documents.
    libOAuthLibrary for using an open standard for secure authorization. This library enables users to securely log into an account on an application by using their logon credentials from another secondary account that they may have with another account provider or application. Allows reading and parsing of JavaScript Object Notation (JSON) documents.
    WebView
    - - - - - - - - - -
    Note
    Tizen has limited combination policy of multi-project application for device usability. If you do not follow the policy, the submission of your applications to the Tizen Store might be rejected. -
    For developer's convenience, some policies can be allowed in the SDK, for example, the STANDALONE service-application or STANDALOE widget-application can be made in the IDE, but these applications might be rejected in the Tizen Store. -
    -

    The following table shows the possible combination for native mulit-project:

    -
      -
    • STANDALONE : If it is marked O, it means that it can be packaged alone or as the main application. If it is marked X, it means that it should not be packaged alone or as the main application.
    • -
    • 1 : Only one application can be packaged as the sub application.
    • -
    • N : Multiple applications can be packaged as the sub applications.
    • -
    + + + + + + + + + +
    Note
    Tizen has limited a multi-project application combination policy for device usability. If you do not follow the policy, the submission of your application to the Tizen Store can be rejected. +

    For your convenience, some policies can be allowed in the SDK only. For example, you can make a STANDALONE service application or STANDALONE widget application in the IDE, but these applications can be rejected in the Tizen Store.

    +
    + +

    The following table shows the possible combinations for a native multi-project. 1 means that only one application can be packaged as a sub application, while M means that multiple applications can be packaged as sub applications. The STANDALONE column defines whether the application can be packaged alone as the main application.

    - + - - - + + + - + - + - - - - + + + + - + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - - + + + + + + + +
    Table: The possible combinationTable: Combinations
    Main ProjectSub Project
    Main projectSub project
    STANDALONESTANDALONE UI SERVICE WATCH WIDGETIMEIME
    UIOXNXYesNoMNo 1XNo
    SERVICEXXXXXXNoNoNoNoNoNo
    WATCHOXNXXXYesNoMNoNoNo
    WIDGETXXXXXXNoNoNoNoNoNo
    IMEONNXXX
    YesMMNoNoNo
    + +

    The following examples illustrate how to read the above table:

    +
      +
    • Main UI project alone: Allowed
    • +
    • Main UI project + 3 service projects packaged together: Allowed
    • +
    • Main UI project + 1 widget project packaged together: Allowed
    • +
    • Main UI project + 2 widget projects packaged together: Not allowed
    • +
    • Main service project alone: Not allowed
    • +
    - - -
  • Example combination -
      -
    • Main UI Project : Allowed
    • -
    • Main UI Project + 3 Service Project : Allowed
    • -
    • Main UI Project + 1 Widget Project : Allowed
    • -
    • Main UI Project + 2 Widget Project : Not Allowed
    • -
    • Main SERVICE Project : Not Allowed
    • -
    -
  • - - + +

    The following figure illustrates the process of developing a Tizen native application.

    +

    Figure: Native application development process

    +

    Native application development process

    + diff --git a/org.tizen.gettingstarted/html/native/process/building_app_n.htm b/org.tizen.gettingstarted/html/native/process/building_app_n.htm index e8f7ea7..2030a00 100644 --- a/org.tizen.gettingstarted/html/native/process/building_app_n.htm +++ b/org.tizen.gettingstarted/html/native/process/building_app_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.gettingstarted/html/native/process/debugging_app_n.htm b/org.tizen.gettingstarted/html/native/process/debugging_app_n.htm index 1a7971e..62a7686 100644 --- a/org.tizen.gettingstarted/html/native/process/debugging_app_n.htm +++ b/org.tizen.gettingstarted/html/native/process/debugging_app_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.gettingstarted/html/native/process/designing_app_ui_n.htm b/org.tizen.gettingstarted/html/native/process/designing_app_ui_n.htm index 5e44037..69e8255 100644 --- a/org.tizen.gettingstarted/html/native/process/designing_app_ui_n.htm +++ b/org.tizen.gettingstarted/html/native/process/designing_app_ui_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -75,7 +75,7 @@

    The following figure illustrates the default project folder structure for Tizen UI Builder applications.

    Figure: Default project folder structure

    -

    Default project folder structure

    +

    Default project folder structure

    The following table describes the content of the default project folders.

    - - + +
    @@ -152,40 +152,40 @@

    Using the WYSIWYG Editor View

    You can configure the design area of the WYSIWYG Editor view by managing the display resolution, changing the orientation, zooming in and out, and scaling the design area to the available screen space.

    -

    You can add a UI Component in the WYSIWYG Editor view and set its properties:

    +

    You can add a UI component in the WYSIWYG Editor view and set its properties:

      -
    1. In the Project Explorer view, double-click the layout.tuml file to which you want to add UI Components. +
    2. In the Project Explorer view, double-click the layout.tuml file to which you want to add UI components.

      A design area is displayed in the WYSIWYG Editor view.

    3. -
    4. Drag the UI Component from the Palette area to the WYSIWYG Editor view. -

      Designing page layout

      +
    5. Drag the UI component from the Palette area to the WYSIWYG Editor view. +

      Designing page layout

    6. -
    7. Select the UI Component in the WYSIWYG Editor or Outline view.
    8. -
    9. In the Properties view, set the UI Component properties.
    10. +
    11. Select the UI component in the WYSIWYG Editor or Outline view.
    12. +
    13. In the Properties view, set the UI component properties.
    -

    You can move the UI Components around in the WYSIWYG Editor.

    +

    You can move the UI components around in the WYSIWYG Editor.

    -

    Placing UI Components

    -

    You can place a variety of UI Components in the WYSIWYG Editor view.

    -

    To place a UI Component, drag the UI Component from the Palette area to the WYSIWYG Editor view. The next empty position in the WYSIWYG Editor view is marked with a dotted rectangle.

    -

    You can add child UI Components in a container, such as a Table. For example, you can add a set of Image UI Components in a Table container UI Component. When adding the Image UI Component, some areas in the Table container change to the blue color, which implies that the UI Component can be placed.

    +

    Placing UI Components

    +

    You can place a variety of UI components in the WYSIWYG Editor view.

    +

    To place a UI component, drag the UI component from the Palette area to the WYSIWYG Editor view. The next empty position in the WYSIWYG Editor view is marked with a dotted rectangle.

    +

    You can add child UI components in a container, such as a Table. For example, you can add a set of Image components in a Table container component. When adding the Image component, some areas in the Table container change to the blue color, which implies that the UI component can be placed.

    Handling Events and Testing

    -

    You can select a UI Component from the design area of the WYSIWYG Editor view and add event handlers to it.

    -

    To add an event handler to a selected UI Component:

    +

    You can select a UI component from the design area of the WYSIWYG Editor view and add event handlers to it.

    +

    To add an event handler to a selected UI component:

    1. In the Properties view, select the Event sub-tab.
    2. In the list, select the event to which you want to add an event handler.
    3. If you want to add a click event, click the + button on the right side of the clicked label.
    4. -
    5. Click the right arrow on the right side of Combo.
      - The UI Builder generates a skeleton code for the event handler, and the event handler for the selected event is displayed.
    6. +
    7. Click the right arrow on the right side of Combo. +

      The UI Builder generates a skeleton code for the event handler, and the event handler for the selected event is displayed.

    8. Enter the application-specific event handler-related code.
    9. -
    10. Press Ctrl+s.
      - The Tizen native application is rendered as it is on the Emulator (target).
    11. +
    12. Press Ctrl+s. +

      The Tizen native application is rendered as it is on the Emulator (target).

    -

    All UI Components have their own unique ID in a specific view, and you can access the UI Components in the event handler code using the ID. You can view and edit the UI Component ID in the Outline view.

    +

    All UI components have their own unique ID in a specific view, and you can access the UI components in the event handler code using the ID. You can view and edit the UI component ID in the Outline view.

    For example, if your view (with the view1 ID) has a button (with the button1 ID), you can create an event handler for the button tap that changes the heading text:

     void view1_button1_onclicked(uib_view1_view_context *vc, Evas_object *obj, void *event_info) 
    @@ -224,4 +224,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
      
         
      
    -
    +
    \ No newline at end of file
    diff --git a/org.tizen.gettingstarted/html/native/process/performance_n.htm b/org.tizen.gettingstarted/html/native/process/performance_n.htm
    index d2fd954..a269cef 100644
    --- a/org.tizen.gettingstarted/html/native/process/performance_n.htm
    +++ b/org.tizen.gettingstarted/html/native/process/performance_n.htm
    @@ -16,7 +16,7 @@
      
      
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.gettingstarted/html/native/process/running_app_n.htm b/org.tizen.gettingstarted/html/native/process/running_app_n.htm index 609424f..ff16549 100644 --- a/org.tizen.gettingstarted/html/native/process/running_app_n.htm +++ b/org.tizen.gettingstarted/html/native/process/running_app_n.htm @@ -22,7 +22,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Running Applications

    You can run Tizen native applications on the Emulator using the Project Explorer view or the Tizen IDE menu.

    diff --git a/org.tizen.gettingstarted/html/native/process/setting_properties_n.htm b/org.tizen.gettingstarted/html/native/process/setting_properties_n.htm index d97b517..2d25616 100644 --- a/org.tizen.gettingstarted/html/native/process/setting_properties_n.htm +++ b/org.tizen.gettingstarted/html/native/process/setting_properties_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -200,13 +200,13 @@
    Note
    The auto-restart and on-boot attributes are not supported in Tizen wearable devices. Since Tizen 2.4, both attributes are not supported in all Tizen devices. Hence, the auto-restart or on-boot attributes used on the lower than 2.4 API version package shall ignored on the devices with Tizen platform version 2.4 or higher.
    The auto-restart and on-boot attributes are not supported in Tizen wearable devices. Since Tizen 2.4, both attributes are not supported in all Tizen devices. Because of this, if they are used in a lower API version package than 2.4, they are ignored in the devices with the Tizen platform version 2.4 or higher.
  • Define application control. -

    You can export the application control functionality of your application. To define an application control used to access the functionality of your application, click Add in the Application Control section of the Advanced tab of the manifest editor.

    +

    You can export the application control functionality of your application. To define an application control used to access the functionality of your application, click Add in the Application Control section of the Advanced tab of the manifest editor.

    Each application control can have multiple operation, mime type, and uri attributes.

  • Add an account (in mobile applications only).

    Account providers, such as Google and Facebook, represent specific service provider-related information or protocol that provides the user accounts. To add, update, or remove accounts, you must register a specific account provider in your application.

    diff --git a/org.tizen.gettingstarted/html/preface.htm b/org.tizen.gettingstarted/html/preface.htm index 3335898..43ecd5c 100644 --- a/org.tizen.gettingstarted/html/preface.htm +++ b/org.tizen.gettingstarted/html/preface.htm @@ -21,7 +21,7 @@
    -

    Mobile Web Wearable Web Mobile native Wearable native

    +

    Mobile Wearable

    Preface

    @@ -34,7 +34,7 @@

    The Tizen platform provides various profiles for application development: the mobile and wearable Web profiles can be used to develop Web applications for mobile and wearable devices, while the mobile and wearable native profile can be used to develop native applications for mobile and wearable devices.

    -

    When using the Tizen documentation, look for the profile icons on the upper right corner of each page. The icons (listed in the following table) indicate which profiles the topic applies to. "N" in the icon stands for the native application profiles and "W" stands for the Web application profiles.

    +

    When using the Tizen documentation, look for the profile icons on the upper right corner of each page. The icons (listed in the following table) indicate which profiles the topic applies to. "W" stands for the Web application profiles and "N" in the icon stands for the native application profiles.

    + + + + + + + + - + - + - - + + - - + +
    @@ -51,20 +51,28 @@
    Icon
    Mobile Web and nativeMobile
    Wearable Web and nativeWearable
    Mobile WebMobile Web or Optional Mobile WebMobile Web or Optional Mobile Web
    Wearable WebWearable Web or Optional Wearable WebWearable Web or Optional Wearable Web
    Mobile NativeMobile NativeMobile nativeMobile Native
    Wearable NativeWearable NativeWearable nativeWearable Native
    @@ -75,7 +83,7 @@ Note - In Tizen Web Device APIs, there are 2 types of APIs: mandatory and optional. The gray profile icon (as shown in the table above) refers to an optional API. + In Tizen Web Device APIs, there are 2 types of APIs: mandatory and optional. The fully gray profile icon (as shown in the table above) refers to an optional API.

    The mandatory APIs are always available on all Tizen devices. The optional APIs provide functionality that depends on the available device hardware or software capabilities, and they may not be available in all Tizen devices.

    @@ -90,10 +98,10 @@
    • Getting Started -

      The getting started with Tizen documentation provides overall information you need to become familiar with Tizen programming and application model. The documentation also walks you through creating your first Tizen application.

      +

      The getting started documentation provides overall information you need to become familiar with Tizen programming and application model. The documentation also walks you through creating your first Tizen application.

    • -
    • UI Guides -

      The Tizen UI guides instruct you in planning and developing a user interface for your application. The guides introduce all the available UI toolkit frameworks.

      +
    • UI Practices +

      The Tizen UI practices instruct you in planning and developing a user interface for your application. The guides introduce all the available UI toolkit frameworks.

    • Tutorials

      The Tizen tutorials teach you how to incorporate Tizen features into your application. The tutorials contain detailed code examples to help you write the required code in practice.

      diff --git a/org.tizen.gettingstarted/html/tizen_websites.htm b/org.tizen.gettingstarted/html/tizen_websites.htm index bc5f83a..f6b517b 100644 --- a/org.tizen.gettingstarted/html/tizen_websites.htm +++ b/org.tizen.gettingstarted/html/tizen_websites.htm @@ -21,7 +21,7 @@
      -

      Mobile Web Wearable Web Mobile native Wearable native

      +

      Mobile Wearable

      Tizen Web Sites

      diff --git a/org.tizen.gettingstarted/html/web/app_model/application_model_w.htm b/org.tizen.gettingstarted/html/web/app_model/application_model_w.htm index af2c0d9..d94864e 100644 --- a/org.tizen.gettingstarted/html/web/app_model/application_model_w.htm +++ b/org.tizen.gettingstarted/html/web/app_model/application_model_w.htm @@ -18,7 +18,7 @@
      -

      Mobile Web Wearable Web

      +

      Mobile Web Wearable Web

      diff --git a/org.tizen.gettingstarted/html/web/cover_page_w.htm b/org.tizen.gettingstarted/html/web/cover_page_w.htm index 5d20f15..4153506 100644 --- a/org.tizen.gettingstarted/html/web/cover_page_w.htm +++ b/org.tizen.gettingstarted/html/web/cover_page_w.htm @@ -21,7 +21,7 @@
      -

      Mobile Web Wearable Web

      +

      Mobile Web Wearable Web

      Introduction to Web Applications

      diff --git a/org.tizen.gettingstarted/html/web/details/app_filtering_w.htm b/org.tizen.gettingstarted/html/web/details/app_filtering_w.htm index 716f0fd..f977bf8 100644 --- a/org.tizen.gettingstarted/html/web/details/app_filtering_w.htm +++ b/org.tizen.gettingstarted/html/web/details/app_filtering_w.htm @@ -18,7 +18,7 @@
      -

      Mobile Web Wearable Web

      +

      Mobile Web Wearable Web

      Content

      @@ -62,64 +62,76 @@ Feature key Description + Platform version http://tizen.org/feature/screen.size.normal Specify this key, if the application supports all possible current and future resolutions on the normal screen size.

      You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.normal and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.240.400 Specify this key, if the application supports the 240 x 400 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.320.320 Specify this key, if the application supports the 320 x 320 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.3 http://tizen.org/feature/screen.size.normal.320.480 Specify this key, if the application supports the 320 x 480 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.360.480 Specify this key, if the application supports the 360 x 480 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.3 http://tizen.org/feature/screen.size.normal.480.800 Specify this key, if the application supports the 480 x 800 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.540.960 Specify this key, if the application supports the 540 x 960 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.600.1024 Specify this key, if the application supports the 600 x 1024 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.720.1280 Specify this key, if the application supports the 720 x 1280 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.1080.1920 Specify this key, if the application supports the 1080 x 1920 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.all Specify this key, if the application supports all possible current and future screen sizes and all possible current and future resolutions per screen size.

      You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.all and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 @@ -130,18 +142,21 @@ Feature key Description + Platform version http://tizen.org/feature/screen.size.normal Specify this key, if the application supports all possible current and future resolutions on the normal screen size.

      You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.normal and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 http://tizen.org/feature/screen.size.normal.320.320 Specify this key, if the application supports the 320 x 320 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.3 @@ -149,12 +164,14 @@ http://tizen.org/feature/screen.size.normal.360.480 Specify this key, if the application supports the 360 x 480 resolution on the normal screen size.

      You can specify multiple http://tizen.org/feature/screen.size.normal.* keys, if your application supports multiple screen resolutions on the normal screen size. However, you cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.3 http://tizen.org/feature/screen.size.all Specify this key, if the application supports all possible current and future screen sizes and all possible current and future resolutions per screen size.

      You cannot specify keys on both screen.size.* and screen.size.normal.* levels simultaneously. If you do, only the most specific resolution key is considered and the less specific resolution keys are ignored. For example, if you specify both http://tizen.org/feature/screen.size.all and http://tizen.org/feature/screen.size.normal.320.480 keys, only the http://tizen.org/feature/screen.size.normal.320.480 key is applied.

      If no screen size key is declared, it is assumed that the application supports only screen.size.normal.720.1280. To avoid this, specify at least 1 screen size key.

      + 2.2.1 @@ -192,111 +209,158 @@ Feature key Description + Platform version http://tizen.org/feature/datasync Specify this key, if the application requires the DataSync feature. + 2.3 http://tizen.org/feature/fmradio Specify this key, if the application requires an FM radio. + 2.2.1 http://tizen.org/feature/humanactivitymonitor Specify this key, if the application requires any of the Human Activity Monitor features. + 2.3 http://tizen.org/feature/location.batch Specify this key, if the application requires the location tracking with a position batch information feature for using the Human Activity Monitor (GPS Type) API. + 2.3 http://tizen.org/feature/network.bluetooth Specify this key, if the application requires the Bluetooth feature. + 2.2.1 http://tizen.org/feature/network.bluetooth.audio.media Specify this key, if the application requires the Bluetooth Advanced Audio feature (A2DP). + 2.3 http://tizen.org/feature/network.bluetooth.health Specify this key, if the application requires the Bluetooth Health feature (HDP). + 2.3 http://tizen.org/feature/network.bluetooth.le Specify this key, if the application requires the Bluetooth Low Energy feature (BLE). + 2.3 http://tizen.org/feature/network.nfc Specify this key, if the application requires the use of any API that, in turn, requires the Near Field Communication (NFC) feature. + 2.2.1 http://tizen.org/feature/network.nfc.card_emulation Specify this key, if the application requires the NFC card emulation feature. + 2.3 http://tizen.org/feature/network.nfc.card_emulation.hce Specify this key, if the application requires the NFC host-based card emulation feature. + 2.3.1 http://tizen.org/feature/network.nfc.p2p Specify this key, if the application requires the NFC P2P feature. + 2.3.1 http://tizen.org/feature/network.nfc.tag Specify this key, if the application requires the NFC tag feature. + 2.3.1 http://tizen.org/feature/network.push Specify this key, if the application requires the network-based push service. + 2.2.1 http://tizen.org/feature/network.secure_element Specify this key, if the application requires the secure element feature. + 2.2.1 http://tizen.org/feature/network.telephony Specify this key, if the application requires the use of any API that, in turn, requires the telephony feature. + 2.2.1 http://tizen.org/feature/network.telephony.mms Specify this key, if the application requires the MMS feature. + 2.2.1 +http://tizen.org/feature/network.telephony.sms + Specify this key, if the application requires the SMS feature. + 2.4 + + http://tizen.org/feature/network.wifi Specify this key, if the application requires the use of any API that, in turn, requires the Wi-Fi feature. + 2.2.1 http://tizen.org/feature/sensor.barometer Specify this key, if the application requires a barometer sensor for using the Sensor (Pressure Type) API. + 2.2.1 http://tizen.org/feature/sensor.heart_rate_monitor Specify this key, if the application requires a heart rate monitor sensor for using the Human Activity Monitor (HRM Type) API. + 2.3 +http://tizen.org/feature/sensor.heart_rate_monitor.led_green + Specify this key, if the application requires the LED green heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_ir + Specify this key, if the application requires the LED infrared heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_red + Specify this key, if the application requires the LED red heart rate monitor sensor. + 2.3.1 + + http://tizen.org/feature/sensor.magnetometer Specify this key, if the application requires a magnetic sensor for using the Sensor (MAGNETIC Type) API. + 2.2.1 http://tizen.org/feature/sensor.pedometer Specify this key, if the application requires a pedometer sensor for using the Human Activity Monitor (PEDOMETER Type) API. + 2.3 http://tizen.org/feature/sensor.photometer Specify this key, if the application requires a photometer sensor for using the Sensor (LIGHT Type) API. + 2.2.1 http://tizen.org/feature/sensor.proximity Specify this key, if the application requires a proximity sensor for using the Sensor (PROXIMITY Type) API. + 2.2.1 http://tizen.org/feature/sensor.ultraviolet Specify this key, if the application requires a ultraviolet sensor for using the Sensor (ULTRAVIOLET Type) API. + 2.3 http://tizen.org/feature/sensor.wrist_up Specify this key, if the application requires a wrist up sensor for using the Human Activity Monitor (WRIST_UP Type) API. + 2.3 @@ -307,35 +371,59 @@ Feature key Description + Platform version http://tizen.org/feature/camera Specify this key, if the application requires any kind of a camera for using the getUserMedia or HTML Media Capture API. + 2.2.1 http://tizen.org/feature/location.gps Specify this key, if the application requires the Global Positioning System (GPS) feature for using the GeoLocation API. + 2.2.1 http://tizen.org/feature/microphone Specify this key, if the application requires a microphone for using the getUserMedia or HTML Media Capture API. + 2.2.1 http://tizen.org/feature/sensor.accelerometer Specify this key, if the application requires an acceleration sensor for using the DeviceOrientation Event Specification API. + 2.2.1 http://tizen.org/feature/sensor.gyroscope Specify this key, if the application requires a gyro sensor for using the DeviceOrientation Event API. + 2.2.1 http://tizen.org/feature/sensor.magnetometer Specify this key, if the application requires a magnetic sensor for using the DeviceOrientation Event Specification or Screen Orientation API. + 2.2.1 http://tizen.org/feature/speech.synthesis Specify this key, if the application requires the speech synthesis (text-to-speech, TTS) feature for using the Web Speech API. + 2.2.1 + + + + + + + + + + + + + + + +
      Table: Available requirements for mobile Web Runtime
      Feature keyDescriptionPlatform version
      http://tizen.org/feature/shell.appwidgetSpecify this key, if the application requires the AppWidget (Dynamic Box) feature.2.2.1
      @@ -347,10 +435,12 @@ Feature key Description + Platform version http://tizen.org/feature/download Specify this key, if the application requires the network connection to access the Internet for using the Download API. + 2.3 http://tizen.org/feature/humanactivitymonitor @@ -363,94 +453,137 @@
    • GPS: http://tizen.org/feature/location.batch
    + 2.3 http://tizen.org/feature/location.batch Specify this key, if the application requires the location tracking with a position batch information feature. + 2.3 http://tizen.org/feature/network.bluetooth Specify this key, if the application requires the Bluetooth feature. + 2.2.1 http://tizen.org/feature/network.bluetooth.audio.media Specify this key, if the application requires the Bluetooth Advanced Audio feature (A2DP) feature for using the Media Key API. + 2.3 http://tizen.org/feature/network.bluetooth.health Specify this key, if the application requires the Bluetooth Health feature (HDP). + 2.3 http://tizen.org/feature/network.bluetooth.le Specify this key, if the application requires the Bluetooth Low Energy feature (BLE). + 2.3 http://tizen.org/feature/network.nfc Specify this key, if the application requires the use of any API that, in turn, requires the Near Field Communication (NFC) feature. + 2.2.1 http://tizen.org/feature/network.nfc.card_emulation Specify this key, if the application requires the NFC card emulation feature. + 2.3 http://tizen.org/feature/network.nfc.card_emulation.hce Specify this key, if the application requires the NFC host-based card emulation feature. + 2.3.1 http://tizen.org/feature/network.nfc.p2p Specify this key, if the application requires the NFC P2P feature. + 2.3.1 http://tizen.org/feature/network.nfc.tag Specify this key, if the application requires the NFC tag feature. + 2.3.1 http://tizen.org/feature/network.push Specify this key, if the application requires the network-based push service. + 2.2.1 http://tizen.org/feature/network.secure_element Specify this key, if the application requires the secure element feature. + 2.2.1 http://tizen.org/feature/network.telephony Specify this key, if the application requires the use of any API that, in turn, requires the telephony feature. + 2.2.1 +http://tizen.org/feature/network.telephony.sms + Specify this key, if the application requires the SMS feature. + 2.4 + + http://tizen.org/feature/network.wifi Specify this key, if the application requires the use of any API that, in turn, requires the Wi-Fi feature (for example, the Download API). + 2.2.1 http://tizen.org/feature/sensor.barometer Specify this key, if the application requires a barometer sensor. + 2.2.1 http://tizen.org/feature/sensor.heart_rate_monitor Specify this key, if the application requires a heart rate monitor sensor. + 2.3 +http://tizen.org/feature/sensor.heart_rate_monitor.led_green + Specify this key, if the application requires the LED green heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_ir + Specify this key, if the application requires the LED infrared heart rate monitor sensor. + 2.3.1 + + +http://tizen.org/feature/sensor.heart_rate_monitor.led_red + Specify this key, if the application requires the LED red heart rate monitor sensor. + 2.3.1 + + http://tizen.org/feature/sensor.magnetometer Specify this key, if the application requires a magnetic sensor. + 2.2.1 http://tizen.org/feature/sensor.pedometer Specify this key, if the application requires a pedometer sensor. + 2.3 http://tizen.org/feature/sensor.photometer Specify this key, if the application requires a photometer sensor. + 2.2.1 http://tizen.org/feature/sensor.proximity Specify this key, if the application requires a proximity sensor. + 2.2.1 http://tizen.org/feature/sensor.ultraviolet Specify this key, if the application requires an ultraviolet sensor. + 2.3 http://tizen.org/feature/sensor.wrist_up Specify this key, if the application requires a wrist up sensor. + 2.3 @@ -461,47 +594,58 @@ Feature key Description + Platform version http://tizen.org/feature/camera Specify this key, if the application requires any kind of a camera for using the getUserMedia API. + 2.2.1 http://tizen.org/feature/input.rotating_bezel Specify this key, if the application requires rotating bezel input. + 2.3.1 http://tizen.org/feature/location.gps Specify this key, if the application requires the Global Positioning System (GPS) feature for using the GeoLocation API. + 2.2.1 http://tizen.org/feature/microphone Specify this key, if the application requires a microphone for using the getUserMedia API. + 2.2.1 http://tizen.org/feature/network.internet Specify this key, if the application requires Internet access for using the WebSocket API, XMLHttpRequest Level 1, or Cross-Origin Resource Sharing API. + 2.3.1 http://tizen.org/feature/screen.shape.circle Specify this key, if the application requires a circle-shaped screen. + 2.3.1 http://tizen.org/feature/screen.shape.rectangle Specify this key, if the application requires a rectangle-shaped screen. + 2.3.1 http://tizen.org/feature/sensor.accelerometer Specify this key, if the application requires an acceleration sensor for using the DeviceOrientation Event Specification API. + 2.2.1 http://tizen.org/feature/sensor.gyroscope Specify this key, if the application requires a gyro sensor for using the DeviceOrientation Event API. + 2.2.1 http://tizen.org/feature/speech.synthesis Specify this key, if the application requires the speech synthesis (text-to-speech, TTS) feature for using the Web Speech API. + 2.2.1 @@ -512,18 +656,22 @@ Feature key Description + Platform version http://tizen.org/feature/media.audio_recording Specify this key, if the application requires the audio recording functionality of the device for using the Camera API (Tizen Extension) (Audio Recording) API. + 2.3 http://tizen.org/feature/media.image_capture Specify this key, if the application requires the image capture functionality of the device for using the Camera API (Tizen Extension) (Image Recording) API. + 2.3 http://tizen.org/feature/media.video_recording Specify this key, if the application requires the video recording functionality of the device for using the Camera API (Tizen Extension) (Video Recording) API. + 2.3 @@ -534,10 +682,17 @@ Feature key Description + Platform version + + +http://tizen.org/feature/shell.appwidget + Specify this key, if the application requires the AppWidget (Dynamic Box) feature. + 2.2.1 http://tizen.org/feature/web.service Specify this key, if the application requires the Web service application feature. + 2.3 diff --git a/org.tizen.gettingstarted/html/web/details/details_w.htm b/org.tizen.gettingstarted/html/web/details/details_w.htm index de7b12f..9e3b280 100644 --- a/org.tizen.gettingstarted/html/web/details/details_w.htm +++ b/org.tizen.gettingstarted/html/web/details/details_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/html/web/details/event_handling_w.htm b/org.tizen.gettingstarted/html/web/details/event_handling_w.htm index 6d3e54b..aef5a8e 100644 --- a/org.tizen.gettingstarted/html/web/details/event_handling_w.htm +++ b/org.tizen.gettingstarted/html/web/details/event_handling_w.htm @@ -18,7 +18,7 @@
    -

    Wearable Web

    +

    Wearable Web

    Content

    @@ -35,16 +35,7 @@

    The Tizen platform supports event handling for user interactions. To provide a full user experience for your application users, you must handle various events in your application.

    - - - - - - - - - -
    Note
    This feature is supported in wearable applications only.
    +

    This feature is supported in wearable applications only.

    Rotary Events

    @@ -75,18 +66,18 @@
     document.addEventListener("rotarydetent", function(ev) 
     {
    -   /* Get direction value from event */
    +   /* Get the direction value from the event */
        var direction = ev.detail.direction;
        
    -   if (direction == "CW")
    +   if (direction == "CW")
        {
           /* Add behavior for clockwise rotation */
    -      console.log("clockwise");
    +      console.log("clockwise");
        }
    -   else if (direction == "CCW")
    +   else if (direction == "CCW")
        {
           /* Add behavior for counter-clockwise rotation */
    -      console.log("counter-clockwise");
    +      console.log("counter-clockwise");
        }
     });
     
    diff --git a/org.tizen.gettingstarted/html/web/details/sec_privileges_w.htm b/org.tizen.gettingstarted/html/web/details/sec_privileges_w.htm index 4eaf884..7366d1c 100644 --- a/org.tizen.gettingstarted/html/web/details/sec_privileges_w.htm +++ b/org.tizen.gettingstarted/html/web/details/sec_privileges_w.htm @@ -25,7 +25,7 @@ tr.partner-level, tr.platform-level { background-color: #cff }
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Security and API Privileges

    @@ -91,34 +91,38 @@ tr.partner-level, tr.platform-level { background-color: #cff } The application can close other applications. - http://tizen.org/privilege/bluetooth - public - Using unrestricted Bluetooth services - The application can perform unrestricted actions using Bluetooth, such as scanning for and connecting to other devices. + http://tizen.org/privilege/bluetooth + public + Using unrestricted Bluetooth services + The application can perform unrestricted actions using Bluetooth, such as scanning for and connecting to other devices. http://tizen.org/privilege/bluetooth.admin public Managing Bluetooth general settings - The application can change Bluetooth settings, such as turning Bluetooth on or off and setting the device name. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can change Bluetooth settings, such as turning Bluetooth on or off and setting the device name. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.gap public Using Bluetooth GAP - The application can use the Bluetooth Generic Access Profile (GAP) to, for example, scan for and pair with devices. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Generic Access Profile (GAP) to, for example, scan for and pair with devices. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.health public Using Bluetooth HDP - The application can use the Bluetooth Health Device Profile (HDP) to, for example, send health information. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Health Device Profile (HDP) to, for example, send health information. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.spp public Using Bluetooth SPP - The application can use the Bluetooth Serial Port Profile (SPP) to, for example, send serial data. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Serial Port Profile (SPP) to, for example, send serial data. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetoothmanager @@ -413,7 +417,7 @@ tr.partner-level, tr.platform-level { background-color: #cff } http://tizen.org/privilege/notification public - The application can display simple notifications using the Web Notifications API. + The application can display simple notifications using the Web Notifications API.

    Privilege behavior:

    • In the local domain, if this privilege is defined, permission is granted. Otherwise, pop-up user prompt is used.
    • In the remote domain, pop-up user prompt is used.
    @@ -496,25 +500,29 @@ tr.partner-level, tr.platform-level { background-color: #cff } http://tizen.org/privilege/bluetooth.admin public Managing Bluetooth general settings - The application can change Bluetooth settings, such as turning Bluetooth on or off and setting the device name. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can change Bluetooth settings, such as turning Bluetooth on or off and setting the device name. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.gap public Using Bluetooth GAP - The application can use the Bluetooth Generic Access Profile (GAP) to, for example, scan for and pair with devices. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Generic Access Profile (GAP) to, for example, scan for and pair with devices. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.health public Using Bluetooth HDP - The application can use the Bluetooth Health Device Profile (HDP) to, for example, send health information. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Health Device Profile (HDP) to, for example, send health information. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetooth.spp public Using Bluetooth SPP - The application can use the Bluetooth Serial Port Profile (SPP) to, for example, send serial data. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + The application can use the Bluetooth Serial Port Profile (SPP) to, for example, send serial data. Deprecated since 2.4. Use http://tizen.org/privilege/bluetooth instead. + http://tizen.org/privilege/bluetoothmanager diff --git a/org.tizen.gettingstarted/html/web/details/tizen_apis_w.htm b/org.tizen.gettingstarted/html/web/details/tizen_apis_w.htm index 1baf132..38aaa19 100644 --- a/org.tizen.gettingstarted/html/web/details/tizen_apis_w.htm +++ b/org.tizen.gettingstarted/html/web/details/tizen_apis_w.htm @@ -21,7 +21,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Tizen APIs

    @@ -153,7 +153,7 @@

    You can create and manage various kinds of UI components.

    @@ -270,7 +270,7 @@

    You can create and manage various kinds of UI components.

    @@ -298,7 +298,7 @@ These APIs enable you to create animations, specify the border and background styles of HTML elements, apply styles to HTML documents, specify the color and opacity of HTML elements, create flexible and multi-column layouts for Web applications, move, rotate, stretch, and scale elements, and add effects using the CSS3 properties. They also enable you to use CSS and JavaScript code effectively with HTML elements, implement Web forms for user input, define media features for specific output devices, select element nodes in the DOM tree, and store the information of the page that the user has viewed. @@ -367,7 +367,7 @@ These APIs enable you to copy content and paste it in an editable area, create and manage draggable elements, and implement drag events.
      -
    • UI Guides: W3C
    • +
    • UI Practices: W3C
    • API Reference: UI
    @@ -426,7 +426,7 @@ These APIs enable you to create animations, specify the border and background styles of HTML elements, apply styles to HTML documents, specify the color and opacity of HTML elements, create flexible layouts for Web applications, move, rotate, stretch, and scale elements, and add effects using the CSS3 properties. They also enable you to use CSS and JavaScript code effectively with HTML elements, implement Web forms for user input, define media features for specific output devices, select element nodes in the DOM tree, and store the information of the page that the user has viewed. diff --git a/org.tizen.gettingstarted/html/web/details/web_runtime_w.htm b/org.tizen.gettingstarted/html/web/details/web_runtime_w.htm index 7d814f0..b723dd7 100644 --- a/org.tizen.gettingstarted/html/web/details/web_runtime_w.htm +++ b/org.tizen.gettingstarted/html/web/details/web_runtime_w.htm @@ -19,7 +19,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/html/web/first_app/first_app_w.htm b/org.tizen.gettingstarted/html/web/first_app/first_app_w.htm index 439bab2..ea37f77 100644 --- a/org.tizen.gettingstarted/html/web/first_app/first_app_w.htm +++ b/org.tizen.gettingstarted/html/web/first_app/first_app_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/html/web/process/app_dev_process_w.htm b/org.tizen.gettingstarted/html/web/process/app_dev_process_w.htm index 89e18da..ec3f644 100644 --- a/org.tizen.gettingstarted/html/web/process/app_dev_process_w.htm +++ b/org.tizen.gettingstarted/html/web/process/app_dev_process_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    @@ -43,9 +43,8 @@

    Web Application Development Process

    -

    The following figure illustrates the process of developing a Tizen Web application. Tizen provides the tools required to manage your application's life-cycle from product conception, through development and release, to end-of-life application retirement.

    -

    Figure: Web application development process

    -

    Web application development process

    +

    Tizen provides the tools required to manage your application's life-cycle from product conception, through development and release, to end-of-life application retirement.

    +

    To develop an application with Tizen:

    Planning and Designing the Application

    @@ -196,31 +195,26 @@

    To modify the build configuration of the service application, see Building the Application.

  • - - - - - - - - - -
    Note
    Tizen has limited combination policy of multi-project application for device usability. If you do not follow the policy, the submission of your applications to the Tizen Store might be rejected. -
    - - -

    The following table shows the possible combination for hybrid mulit-project:

    -
      -
    • 1 : Only one application can be packaged as the sub application.
    • -
    • N : Multiple applications can be packaged as the sub applications.
    • -
    + + + + + + + + + +
    Note
    Tizen has limited a multi-project application combination policy for device usability. If you do not follow the policy, the submission of your application to the Tizen Store can be rejected. +
    + +

    The following table shows the possible combinations for a hybrid multi-project. M means that multiple applications can be packaged as sub applications.

    - + - - + + @@ -230,21 +224,19 @@ - - - - + + + + - - - - + + + + - -
    Table: The possible combinationTable: Combinations
    Main ProjectSub ProjectMain projectSub project
    UI
    WEB UIXNXXNoMNoNo
    WEB SERVICEXXXXNoNoNoNo

    With a hybrid application package, you can register the included applications in the Tizen Store and install, upgrade, and uninstall them using the single hybrid package. When a hybrid application package is installed, the Web application is installed by the Web installer, followed by the native installer installing native service applications.

    @@ -253,32 +245,25 @@

    The Web application and native service applications within a hybrid application package share the same package ID and data folder. Sharing application data between them is easy. Many useful inter-application APIs, such as Message Port and AppControl, can be used in a hybrid application package.

    For more information on hybrid applications and their package structure, see HybridWebApp and HybridServiceApp, and Hybrid Application Package.

    +

    Packaging Web Applications

    -

    Packaging Web Applications

    - -

    A web application package combines a Web application and 1 or more web service applications.

    - - - - - - - - - - -
    Note
    Tizen has limited combination policy of multi-project application for device usability. If you do not follow the policy, the submission of your applications to the Tizen Store might be rejected. -
    - +

    A Web application package combines a Web application and 1 or more Web service applications.

    -

    The following table shows the possible combination for web mulit-project:

    -
      -
    • STANDALONE : If it is marked O, it means that it can be packaged alone or as the main application. If it is marked X, it means that it should not be packaged alone or as the main application.
    • -
    • 1 : Only one application can be packaged as the sub application.
    • -
    • N : Multiple applications can be packaged as the sub applications.
    • -
    + + + + + + + + + +
    Note
    Tizen has limited a multi-project application combination policy for device usability. If you do not follow the policy, the submission of your application to the Tizen Store can be rejected. +
    + +

    The following table shows the possible combinations for a Web multi-project. M means that multiple applications can be packaged as sub applications. The STANDALONE column defines whether the application can be packaged alone as the main application.

    - + @@ -291,21 +276,20 @@ - - - + + + - - - + + + - -
    Table: The possible combinationTable: Combinations
    Main Project
    WEB UIOXNYesNoM
    WEB SERVICEXXXNoNoNo
    - + +

    Certifying and Publishing the Application

    After you have packaged your application, you are ready to certify and publish your application.

    @@ -336,6 +320,9 @@

    Once your application has reached the end of its life-cycle, you can remove it from the Tizen Store or Samsung Galaxy Apps Store.

    +

    The following figure illustrates the process of developing a Tizen Web application.

    +

    Figure: Web application development process

    +

    Web application development process

    @@ -360,4 +347,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.gettingstarted/html/web/process/coding_app_w.htm b/org.tizen.gettingstarted/html/web/process/coding_app_w.htm index 882a048..4e11c12 100644 --- a/org.tizen.gettingstarted/html/web/process/coding_app_w.htm +++ b/org.tizen.gettingstarted/html/web/process/coding_app_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/html/web/process/creating_app_project_w.htm b/org.tizen.gettingstarted/html/web/process/creating_app_project_w.htm index 619a90a..25bcd25 100644 --- a/org.tizen.gettingstarted/html/web/process/creating_app_project_w.htm +++ b/org.tizen.gettingstarted/html/web/process/creating_app_project_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/html/web/process/run_debug_app_w.htm b/org.tizen.gettingstarted/html/web/process/run_debug_app_w.htm index fc77dd6..8d9b8a4 100644 --- a/org.tizen.gettingstarted/html/web/process/run_debug_app_w.htm +++ b/org.tizen.gettingstarted/html/web/process/run_debug_app_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    @@ -43,16 +43,7 @@

    Running Web Applications on the Emulator

    You can debug Tizen Web applications on the Emulator using the Project Explorer view or the Tizen IDE menu.

    - - - - - - - - - -
    Note
    Running an Emulator image requires a minimum free disk space of 20 MB. The image can occupy up to 10 GB of disk space.
    +

    To launch the Emulator, do one of the following:

    To stop the Emulator, right-click the Emulator and click Close.

    + + + + + + + + + +
    Note
    Running an Emulator image requires a minimum free disk space of 20 MB. The image can occupy up to 10 GB of disk space.
    +

    Running Web Applications on a Target Device

    You can run Tizen Web applications on a target device using the Project Explorer view or the Tizen IDE menu.

    To run your application on the target device:

    diff --git a/org.tizen.gettingstarted/html/web/process/setting_properties_w.htm b/org.tizen.gettingstarted/html/web/process/setting_properties_w.htm index ebfd9cc..e311469 100644 --- a/org.tizen.gettingstarted/html/web/process/setting_properties_w.htm +++ b/org.tizen.gettingstarted/html/web/process/setting_properties_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    diff --git a/org.tizen.gettingstarted/index.xml b/org.tizen.gettingstarted/index.xml index a86d27c..5548346 100644 --- a/org.tizen.gettingstarted/index.xml +++ b/org.tizen.gettingstarted/index.xml @@ -2,7 +2,7 @@ - + diff --git a/org.tizen.guides/html/images/common_appcontrol_browser.png b/org.tizen.guides/html/images/common_appcontrol_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe9f6a74c3713f7ce1583d7983833cbced927eb GIT binary patch literal 43349 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_browser2.png b/org.tizen.guides/html/images/common_appcontrol_browser2.png new file mode 100644 index 0000000000000000000000000000000000000000..d789943ba24e1ac7b334f1476688a6ed699a2faf GIT binary patch literal 92718 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%0AW@)^;ew4U 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

    q7_v<{ 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 Dt-`$% literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_calendar2.png b/org.tizen.guides/html/images/common_appcontrol_calendar2.png new file mode 100644 index 0000000000000000000000000000000000000000..bbab557cd299edfe2bd24695bebb8a06fb5e0bc3 GIT binary patch literal 22508 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 AtpET3 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_calendar4.png b/org.tizen.guides/html/images/common_appcontrol_calendar4.png new file mode 100644 index 0000000000000000000000000000000000000000..fa989b0c68f80e57775cd92b5ff47869cdfae3c7 GIT binary patch literal 24954 zcmb5UWmFsA8#NlFc#BK101a-1Qi>HVC3uknMT)fr3MuX+I20&OkrtQY4#C}}xCeKa zA^}3+&F_ET`{91PYh^MySu?YqGv|@L_j$tJX(&A=q9+0X0FRZyZ?rMzILz^n01xy1 zCpvWsbHcTfQ`M8KoUX^mqZa%G_Ibzjd9ozlINo1N?1j_~ z6XfjL5=s<`0*c`i@}SH|SlBq49`<-a?1c7sFL0kPdm|<-7rb8_{b@l?mn|e52%9W> z+c!#z-q$}(iA65$6ct&~%eII=yjkr3eIxv$^@sQQwDgceS5$5u?|%L?=9@^c#^z`>Hes_?&EaY! z$%GwOLQKZnM{&r;eKSLv+*c)Y-hl+DbsVka&Vyiz^U2J2*rm;%TGI{PcHiRKG&-^L zU>iJrM_u&J!jv~SlaM=RY*sCFLM5+J2qCTjx11W9l2T zTz>#UkHaaen7Th9&QR>_AsvI9KsH|DkjZ9t?_HTTLwRq>+uea8j$fve^7ixk`$d!5 z(jN`V-T_pLrrFv@57^csZrDD2=jlzvx?P!N{4>f_>~fUX47vCaB;7os4fFkm;$dd_ zK583sm%BYFC*2piEA#EOx^HVv!u|aIGwe~pGAT9tMbD`FuEa^~ar<%^flA-Te+1~> z1IaZZ0Syqb+DZjmSzOR^T*mg@zS~Pyk!bHvij-L#9`N5u%KreH(XG`c(?s)M7N=nwHF5@ z!+p`Z6P(d{<11+;Su&rJTRj`2q#%Y8-zVs?`H zYt$Nek4}8n%-Xu2Xt$9zFZaOPht=!;G;w9QBIEw+ijCJl?Put{D9VfRoSjD{ZOgtP z<%6Y*zLMyrLKUx-EbZGPSJa;SM{%%kG^BKnJLZpEm5Rdq7~Ha!O8Ix@$!G|3uN(aG z`6*aL0k^%L2rEO1=9R zCU?8^m~(fCecA`>C=bcZw}CEQw_LyKL|=F_Xiiu~o5amA(bDe;x@Y7g8M*T7gu$;e z3jX-^9JHE?XT0#opXm>{AWk(f#f0-}@dX{!zj(a4r<_R5w_@wLj)|&F>pO)LGqZaO zr1C8T-qsN3(9Po^F;?2WwiAhtX(ASgWem@5MDro?6_6&Twe!CDvoRsvAKV2pwT4Z( zge+VxUcYnH@8}8m4D+qbtfMd;U!ks45OnPg`)loa@cGBNUIirU0%BS9AuP0AW*HW) zfh0Mb{vLFg%<4%(EROY3e}!0bW<*3>NFGFut&PB#CvF1Pv!?vJ z$7D%VL``0OXTjTZ7fpB$ekpRY1-`IyPKmz|oO@_d$KSh(sJ#F-jM|s> z4b(oTCe|fjp$?=RYu@tSeK7NLt3{5rnP+bE%T0eKpgE$7fjO-SXH2CvAJTQb0Fyen zdifPkL^pKa9jNztNKdQCNa!mu{A$`mSlNQ$*;#>gmC>+R-ib2!$35p)`V~sNzdddo zvG_vz^@%_v85-suxyzt33M0kVx z(-zkU?sQJ3eA5qso;{*x4|Y3_w@Z=uyBVcRf8%H37k%+tQaWx13!U(`pQH7Uot+01 zy=JpsT>K_k52b4!O|O^rt&ik9UYyly-;<-pR{n{%_t?*7Ps6LRF@?GOYp&^P_(cRS za$L}{_SQm~eW?pDY*Zf)gGL4(tw6qzeOzFrJSJrl$eA{F-2UtPbLZ`}PxgU_hs!jC zS)XyZHgVd048NZ3uXpV1z@wN!oPHijSu8LSx#o9Yn`y1v=Q!sBIZ3-Rkk>uNdjC$LLH2J({`o}jR5L!rL-I(bZ9abN>ND+`q#P;t`@}Mc8y5dd@m%lp z&iW}Sq+;j;Z(WnvT>%=8=C)o88B8btA<8umsPTM(PnHU2h=n?v1zbc1ZhiOjdd3&c zS_V3*3F$Bxpx#QuA8}M{X@5m%d?j@A1$qa53RxdKr_)a?Pc2z5z9A@GZ!Hix_}#e6 zAhmb@C|ymkby46vTV~GV$2~D=ppju?-sll6!}T{BWsxq!5IXwrasvXyV=l52M4i~U z5l>aD3E^Ewd5cy;C~M0bif>&4kv?;Z&32AdNLIrr9#=lBJzsM`SrT6YeBm<>Kr_Tm zQb2Mm=Fvy%~YBUr!DJj+3go2iV?H65t!JL^ic0V$2 zlMbZry_#WmbGI>eHG4peypSqimsY(J&Q7wTY4U`=mn<ed-_4t+DMlLq3p!oKmcoUnZ(`o(s%lQH-6h zsMyvJMA;^9k1hRE4Ts|o1G;x4^F2D#S=0Ob)(PFS47=n1Wp{U3>IwZ|s$c=*df8A?;2(c~tVX9TB4#uPdL;d|YQAO$ zjqma0`8f|=?)LTxy2d9r!jL z9tMe{Eih5j7uYsE;nc!P60ZAHN6Rfn7IX_5sbX@H?#EPPDypiFIEHh!Kgu+fXUiGZ zSZn#{!+ma?Fc#$e`NQ!`# zeUjTSTheS1!%=RMS6HlXL!m80_S=FNa)|@|*H@-k*-!5qURpCvdciH`Mooio4mhb( zfPSHXInSY@>PgM%v+H)zDtOj+$n17fHG<=_o?k2xeU#2ykxK5 z9beUu)8%h!%$;}jx08`ebSgX)oQ82s%21iaHd0__<)c0}x=%)4*%d!ZFH-Uh3N-B^ z!q;%=c_%1s5i>OOf#^L02gO~HH-@_xpz)PnkeHf90CwM%%LT~QcQ^6xivBjxT|CEBX4G~SANLqz1Tn& zJW`X>ZG-!LENDI!K-O9{BP04Y$EWY*+gSn`v0r8lpBmmsCSL%zN zjno##2b_o0)X?wLPzYC?O8HwVnl3`Ml3N(!Bwid;MZGd-Txka_0q%RJ{nUzmYv5;X zZ4oDGx2&cqg%78GzZZ+-kHqk<`1{N4+z* z{>dQXRsv}a_*K}QkC3_{ctUX1l=i>b>MitL{iSKr`uy$TXbgvCN&F~~Q#^rUB^c{n~Tug7dNzO>CwAW!6=Wfc)dEwmz zJAF!Ot`g8Ul^J%ZwZHxu09opdT!j5t@b=yt@jlL?ww-zR2-)(03BCIWLE#`A5ow$l zV^@`h;~>M|yorjh_`vY;Ti9Xmd$Qa$-gse|fT*MdaIiRRA9N({;OFLK+U#~XuW;}R zl8rcNjNtidyEng+k-toiMAZJYoz)(guU_8?;9%++7{sEut%}Zi6{QFh3vn}~h=*w* zt{sP~dwR7YDLL&6bbQ;|^c&JzeDig7mEhCbqdus&i7WqAwO;P_h=zpA9i8jt#aL&a zs`d1OYYlQt&MO5S0vE;G)!^ZNt?Die{yd$u>zJ-;ejh|D8}PQT&$Bf+9>5iM#4Ed& zd{EvBX^Q`9H$tacdZ|!(z>&K74$&JCwp6d;pWEp$wLGgjq+gz$pWz*qSZ1vJT0ucL zsHMVz^=D$z_%RO3X1dW;`{yqS3G300z^T8`Q}?pQ?JrLkcnTZ+Qx!J)yuOg{Shdnz55Q9&G_ zMoD|heqX#nz)ikcX2E8b=T!W4zrX!pna%5C>l+*@2S3em8`OA~xV-$noU~3yluY%e zBK^~c_BM?;LNTM@?wi|=&!Efd?zeO6wq=(3p1OWzZ?so>p_1xr=+oA-``i$bTF(&C zO9%;m`FWoixid|r|BvKzh~$)#Wo4QMUjZ*xTa3ZP zTj8>QE`XI{CwFJDy_xMO)+`S*{ML;i4B%baxFyOwM^G@FElGdYUk=Cp&T%u?=5$1q zb^y%Y`HI-}-Z|Lgwfefpn{V$h4;_ZLWl6sXQ@rJ=vu_xa6`XN>*RxsxcsW9dMW&2R z^-FC{pTVHDt~!Ic=xdgJ!bc6rLt{9SNgP%NPg6m?^)U4q8G3L=iAIJ8c@h`BLw4i7 z{xGTH>s%7I>{jvPn}n{$iG;CGzLXb!MtpC?IcO6%RMyn1)0(}e(tmr07V%%=;RO2?xZ0(*cDc0ve07`t zjJj$~oH`%r;1rVpG_}iJCe-!Nhor`Q@5avFc&%`8Mwx`$i3AebpVv-!i|_QK-AAT% z4t8_fKVfO-$yRmd(mKZ?1VsBomVqAe;?x4EZFS6CIruzA*@UGy_{wAA1lyqZQY5ed zR{592ke$nzL&+Ba8az*#zR$_L4%S_{Uh2+C#>&-L<7##Oml5+JN0JODOyRV}NJm#s zNm3n21nLt7gqNISdn|g0euH((iwog7;QqrP3T-$!#s7Zt$UWOk@z-jY>&~?pbWJz% z$9UFbTHYTmT=DyDg8$Gs1WaTz3XBRtPs$sf+${-@G_}USAwWBwjXBy&^3ZqWWOeAn z+ezwe=9SH`7u%|3JmTiUuoCZg%Lh>Z%Mt+SN(qU?VGNv3ZZn>plsc{H5TTMss9&f1g0@X|neRj#x2A zr+?Re%TI5vR)x-*(p2}uZ=ZN&{fTV#DEjqnJ-H13odbp0*~f~yGmxv6i6pW#%RaR< zM==S({s&rt{;jDudETr^sxLZ(TKqU8D|jxE!C&}iv|{_bsywwU7Si19UgYkS*WP%e z;Ux;8QZ-tC44SsKMWx#?8Y+4r=b_ z_c)9tfk)U?3TaT67a5d(y3;Zs+52Z1#XKVeD`#$FuP$17o>vle8P%M~#pnWT92NRX z{DXK2@bMwGdx?Q>*a2@$w*w8k9aG6b=P+plSvGgRX6YiTI245W$#TsDTh}v?%a^w%>RJaX#&CZ9OR&ukxdBapC~q7U$}EOM4CdF(OZ=@J(Y`_)#~AP4u-&{IAG zyK`m@++|7{mWJY2KB>V(eL=ac6BCqypbWq2)=^YEDM*(x^+jsnU#ZX@A;8_|=9L2J zm7NWl<#|n+Ph!&DsHPvISW!<=t!0%uBZNhx`3-_*-Qvbwj=D?b8HKzAxjmO@T< z3v7Qy!N84A7NJ`F&+VkzE2R4LpUBGFu_F4!=8-DX4Sf34MRY9fVLeVI=Qw2~r&*Wk zX)d&!44h=sN0xmiwe57RaY&~3Ptd2##W!!V=+{2&Gm#gKwqAYQiw>_%E}kV7=QhCa z5?t*(^`nepHRrd-K_#BN*@+LR8TSMEMsbmWj9Ch#F#g#u?is>g^ooa+hiu*N5sgm3 zBa+9*^{X4%-Z6s7{KjcmEV9@>VsDMRlfO~nYhzIpy4&46DIznM_9NYlaWQ748*LjR zyzv&usrPz*clVu?g0N@I^?ZO{yr1@~r$!H9chs{z03Ii?GhM=#6`d%_YXeeetb|=s zA)f*jfUPG~65Ta#SopResO}skV>r#miQ@NRxR0hC%MVQ7R0;kXB38C6sB{tr?U05= zAgN=rve(4EQO6^!B)I^lMm_iH16kG#{vg9fh7(&b>3 zYVa-wK0WYrc(C~+$q32-VgAIVj<1Z+=cInqu8!?wiMFO7YCS0G<9BmZBXdwVHkqS- z&=y^%S*57~K1Mr76?EQKpRKXL9~p_Z#~ZJ{h=gsRNjyp|b{MS89)FS_jVyjvc>% z?h!@+(9e;0c+FKm|Lp-<2t6A9JhZFAt-|*C?K{DnPYl26y?!2-S|^IDTcc-n%mA-s zjSRj2;>Tgi{`Il9td5VF`h~t!*@)F6IrM>lqh zyTgewsJ3+|{^oH`xXa6cssLO`*T0V)lMB{CX7z+E=e)*$N#DcARyU~&rJkgV zfGg@31TUhWt4%wNSlu>Es|BZ8%D}W|-YlH~Q!)8LTuwXrG_Qu;M>W#O>aOLHKC#LL z<}s7lse+52*EI0;U$Ch7Ms{N*7~t#R=>PG)(V${sjZHQRUf%E`6z^@_Fd~RxkhsB? z?cuwy1;tL$N^WtiB)^z`5n7U6(3?mU^bcjk!nHO6 zO44bFSKv5>MzrmD+_Yv28J;&STc8Zp? z(Hz~J9*f7)$YDpeb_O#4d!|4{Z)DXM*XJRzmz9bpoXWMp+8(FG|WAC>l zZ;ivI1V0|5%jy=B?#-3fC4~uE;ic+#**w}@GI0V94nek++1T6gYCDEmS1<5EL0Y9&XK*Juq7EYS6>n9jCOdb#C;QN

    E-Q}b~~b@7x6jq2_}kAETUGpxMjvc)3xWv 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_email.png b/org.tizen.guides/html/images/common_appcontrol_email.png new file mode 100644 index 0000000000000000000000000000000000000000..797383bf243837644654c34ecea818de27bb9791 GIT binary patch literal 40391 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 z%0D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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_email4.png b/org.tizen.guides/html/images/common_appcontrol_email4.png new file mode 100644 index 0000000000000000000000000000000000000000..bb07756f63d0c51f633c0270c4c20f673928931e GIT binary patch literal 38723 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_message2.png b/org.tizen.guides/html/images/common_appcontrol_message2.png new file mode 100644 index 0000000000000000000000000000000000000000..86c7982574b062bd451ba448467c55b49fff6ab5 GIT binary patch literal 12309 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_message3.png b/org.tizen.guides/html/images/common_appcontrol_message3.png new file mode 100644 index 0000000000000000000000000000000000000000..064b2f153258411cc0499ab4b461773beb5511c8 GIT binary patch literal 20685 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 z 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 aQ~_y%L^GR$>X(lg5ENxWGBr|Wq5lhz%r4OY literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_system_bluetooth.png b/org.tizen.guides/html/images/common_appcontrol_system_bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..b364b205ffb1b35e7e4d3e4e2c5122490b3dedda GIT binary patch literal 14432 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 ZPvDJHqtJaI;@^NsZxr6YDw8t}{cmg?&2#_& literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_system_bluetooth2.png b/org.tizen.guides/html/images/common_appcontrol_system_bluetooth2.png new file mode 100644 index 0000000000000000000000000000000000000000..2b09367f7fd86b8a2fecb9f03d432da516ed336d GIT binary patch literal 14319 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

    +5R|505(QBF_r=mHF|n-ywL< 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 P`892IeYMJ`&)@tHku}f& literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_system_setting.png b/org.tizen.guides/html/images/common_appcontrol_system_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..d24ad8497b8abb372f117a2e01af2cef1146cbaf GIT binary patch literal 29905 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ʦNmi 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_system_wifi.png b/org.tizen.guides/html/images/common_appcontrol_system_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3adc19f17938ea0e47736bb15152ce2a88be88 GIT binary patch literal 18222 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/hw_acceleration.png b/org.tizen.guides/html/images/hw_acceleration.png new file mode 100644 index 0000000000000000000000000000000000000000..8da8c28d55096f4f838113e82eb43a90812a8c10 GIT binary patch literal 38895 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

    U}zM3B7(NK4yPh+5j5 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 CQB73< literal 84486 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 diff --git a/org.tizen.guides/html/images/mn_division.png b/org.tizen.guides/html/images/mn_division.png index 1f7e3377261df202ed0786052218854d5ca34635..faecb283e3b3c3e26eb6c737fc56877d61939a35 100644 GIT binary patch delta 5950 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 T<@VJu*)AP=wqM%rm3RIhb@$<< diff --git a/org.tizen.guides/html/images/mobile_s_n.png b/org.tizen.guides/html/images/mobile_s_n.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8c779024230d9188cc4a8ce05fa146b165b2c5 GIT binary patch literal 2070 zcmb7Fdr%YC8jsS7iH6Z43SO&eR31vQn-?K#Qp^(r1OX$U7|W6@5Fy!+T}wV>?< zN_mzM5NkzHaOwjpC?J$xi=x+h8xctR`5Sgy6I|BtdT!(MMX^=`_7g zM33UBK$S^~BkX1yV;)RI4;~1dR zrd04G5&ci6qE%ruDQZS&Jf?z!C@q0LTW|YzCphz|xF3Y-Jd+l`{-7 z1k;-JCR~piX%0p>4o$^Hbi&g=Lok>k^a+VL_LAI)O(%;;8(@V^0E-C%<|!RVd^0GO z>h%bN;iWc)M<9PW|F`^@I?aRt5eSB+nzcj~<5#|7>h*>kiqkPbD%hNa5LHyb$rv(q zp;AE`3Fq}jI9Y~jQw@j_SIR{6)Kt9=5`g}4zE~obvE+Q2oW&Azq#T)qD*!30q7ZffaKV3W-$g$CgMrES8)n7RbeNIa{ibfij6iA)di1jTjCawTQ#01FQcF z%X=*rl9~}1N6l&!O`hqdutXF`u|(8FlS-$$hvprnH|kIe=HnSJgoHEp&v zTirzN?|3V3s=vt^b)A((c6VALZT*1koR{qt;L2TPW_MagFU;zABgD5nR>)nd&kB#@ z%EA{0y9KpWSNGi+-DtfoIm(STeH*>vjalwVLE_1z4TD&hH zTpoYm-y!Y%;mRDu$89lVbBT0C{g8_tUlUOnxdsY!HVgCnvKyVvDwaNZnUent^S9Tyl~sKUaPi z^- zgoXKC4^mTi{Ismn>%AKK!jxM+O?`QRDJdy(`M&QGOXAkqKbq_5X;-(4COX2_Uw)|B z<6KcQ^yEZwzsWtnuC8v?_hr2m0~hXbe0KpOr#E~p_7PqQ|pyzm^2YzQJnbMF@2+pnnF z!V9k7vb$)@x&E;rp223)kF2IrsSU?t=41?RE6T3^1N-H|Ag%k^vl@-(_FDCtMU*F# zJ>QKtR~*bfeJNm*<;27T*^f;zSFfFKdE^xk^1Pu#cYLo%AdK{XIQGb1=erpz+}YOh z?deM+Z!G8!OWj!C;1+tatXo(6@B>B;^#|=gs9v|K3t!|922T7u7vJWcQ*=%7)qmw! zcCD?v=y~C`#$CL5uJ51!U88PIQ2SgybW79Ix%h$C2-UUf`oIs3bx)wA8}QG2xbE|z z%Fr7_zxBAcZ2iKoEaW1E9BBN0DDehQ?4l}c8!GD-^1_exTb62FHif8s^jn?45}1A; zw-54)R`uugCU@GtI8x?RYVz%DY-~JSTU$$>?>jH2yvw=yENOo6$CYlb)-|DDZQrwv zO0q2;pn#owBf0&n@gu_0-J$aQ*h5LA0^rP6Mo;8%Uccq`_?yRap_MN@#FDUY=AXPB z9NDvW*zNJ|_a{DMoQ=9PdEL`#xVgExx*TINuYiNg^N&_lIqkcD|Gv!@QQNWF1^0N| z($Z3qH;)nlH4PM{wWlnIb@vP}u#Kjl4}NQ;yu3U!b9Tkm$e5TG_2`G#;fjD`d3kxt z;Xih@Kf9f|ZpHG-%F55fyfxbWcxvkB1?=Q|yDsTn?!U}MFg!M9J~-$+ sXO3y01kPVsd&dZ@U0V!K2Je|g^3TmExpRK+3CEvWDG!yMki=&G4|aJ%*8l(j literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/mobile_s_w.png b/org.tizen.guides/html/images/mobile_s_w.png new file mode 100644 index 0000000000000000000000000000000000000000..f86df299f50fc9facb4af6a847925599a7277c0d GIT binary patch literal 2183 zcmb7Gc~ld39#0i2TOI*%46Z~XR>Xn;PbQ25gF&G< zWzThRGXk;NC=HE(BKQGxkwS(Qnq;tAnG!}L5Sx9qN}(tLgn(EuPAX@hW*eGOfK<#t zeM08r`ARkzFZEAVfg!1aP*G}vh$cq)`T(1?beKQ}LP9_*OO&hWS_W!~mkzH@$2b(Q zBmyNcP`?=!!4Cr13Ka;Dv0fMvp5O^kXjlT-i$bG#07Q6?!&7lYJO)prlSyDd{*|a&j^@nS@oS;&22SjfTS$aYP~pmcXb}q>?HjsX`8z7=^J44a7jfmj32~Oc^YVi-**2$mQzgV8LO-X@yE00gK0}mSjx+ zt)Te)cOzu7H_~b-82sJ%Kjc@3rYJ#NFsN2&R3bQw64$p>y<3q3-1)on3gpHTVg^3)6NFxK~5Rbz^X*5zXorb4!DNGiVL*P<4TmpefVv{&5PZpj- z!*e-!+6uwjKv)-63}cy|ets-AlSyQ;Ndy9y%%pLdTrQFA$H8-0EI;N7mM2$3Lb(Vu zDK%lGzhi0d#M0R+PzWhhp$bLfN;L(=DO7{g9=jqYuw5C?2OYg5FLfm)?X~-JhHdhVF2?-p8QS=b z`Z&Mi-4acMS+;z>ru5!M8<7`L*Aly-#?CP^`q*%U+g$2UfIeox;oJJYPamFQ8W=Bv z$L=@VrF`m6Exv376=eSIvp-**cyvkUt?#}{BMmUp#>$R5EPUOW(^Qc|J7G4nt(Qq| zwa11&o=y4EG4H#|{O*4h)}+RcWG~eBJQ^qJx-uWOKT6d+nGH5RXwywFG(QBfsn@E_zL^$((sU_GH>&%Rv`V7MJmojJ8my*9g`>LyAMD%_6;+(89vbZbrg@Qiw6y7Jm$@5hV{g|#8v7zYcZ;uX zn|c4~RJ4CwOMcBqg9#p;AN@otyX&y|y)74ui+8Rqu@#!nJ`Ib{jLwsXcUfkgXf>3C zq@|^?%WgK`b31;U5RieR+I@c{FB|{j@Z)K#A<^0}7n(EiXGd!wJkL1lEvb!|csbH% zNjlT|L&e0chHXk>I3n`HoC6&P_8z&=Iy>K~x-*skwD&(*1(_QxhxZF!W9@y!;Gc4{ zc!I)Hx8iU6+MTz*QQIq@F%0}@3}L;#cA@#z1C+(}n=>~t+R>iwH3tS`w0!}hoa|_C z<33=>FtSLg9{1%C3&G2b%L9Y;MFN5~Z`3?wG`u*3(BCng*)|h;Jg7%EIgUPRFC^;f z)UGilqx!8qoz|6p!&`#&p4scQnp^H|QPZ@~FAhdtYWVJH*|jh!-u-OZk9qr=#I-xn z-%2h-8p8kf)wVObnxqQ@Q%dTM2`I4lNcC9faFyFHTTi2O&K~pjfmHozi}PRLT^o!1 ztwHPU#4B~FHv148HFSOdmAFm+Ti~FIx31Sbd-m*vv9i)?a8)>JT?F^D%i8In9R~ER zZDv%9g33Z7?-0k~;OcW9G)=7f7|M${S1V{cFw$}x@ZTTP3U%)J_x8QW@M-e-##NKz zqA7`&+pDJ8LyQ^I`%AAe^S#Hr%BD|udnuD4XsW2Ee6`3S-N(mg=%)k+h4o3APR6_hx~Kr!CBL<0go%-RIy^Regy(Dg&_a{ literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/mobile_s_w_optional.png b/org.tizen.guides/html/images/mobile_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..0434b73d0359bffb3ac4dee8806df0bba6dd2924 GIT binary patch literal 2021 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 JdSd9?{{@~HF);uD literal 113082 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

    @@ -129,7 +130,7 @@ @@ -144,8 +145,8 @@
  • Security
  • Performance and Optimization @@ -186,16 +187,28 @@

    Native Application

  • Location
  • Messaging
  • @@ -276,7 +290,7 @@
  • Connection
  • Bluetooth
  • NFC
  • -
  • SmartCard
  • +
  • Smartcard
  • Wi-Fi
  • Wi-Fi Direct
  • @@ -289,10 +303,9 @@
  • Social
  • System @@ -317,6 +330,7 @@
  • UI Framework
  • UIX @@ -333,11 +347,6 @@
  • Web
  • -
  • Porting - -
  • diff --git a/org.tizen.guides/html/native/account/account_guide_n.htm b/org.tizen.guides/html/native/account/account_guide_n.htm index ac60e65..676d4d7 100644 --- a/org.tizen.guides/html/native/account/account_guide_n.htm +++ b/org.tizen.guides/html/native/account/account_guide_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -33,18 +33,17 @@

    Account

    -

    Account features include managing various account information, such as receiving sync operation notifications, and obtaining an access token by using the oauth2 authorization.

    +

    Account features include managing various account information, such as receiving sync operation notifications, and obtaining an access token by using the OAuth 2.0 authorization.

    The main account features are:

      -
    • oauth2

      -

      Enables you to obtain an access token by using the oauth2 authorization.

    • +
    • Account Manager +

      Allows you to work with accounts in your application by creating, managing and removing individual accounts.

    • +
    • OAuth 2.0

      +

      Enables you to obtain an access token by using the OAuth 2.0 authorization.

    - - - +

    The following guides apply in mobile applications only:

    -
    • Sync Manager

      Enables you to receive notifications in your application about syncing operations between a server and the device.

    • diff --git a/org.tizen.guides/html/native/account/account_manager_n.htm b/org.tizen.guides/html/native/account/account_manager_n.htm new file mode 100644 index 0000000..6c611de --- /dev/null +++ b/org.tizen.guides/html/native/account/account_manager_n.htm @@ -0,0 +1,356 @@ + + + + + + + + + + + + + Account Manager + + + + + +
      + + +

      Account Manager

      + +

      An account is a collection of information representing the user of a specific provider.

      + +

      The main features of the Account Manager API include: +

      +
        +
      • Creating and managing accounts
      • +
      • Retrieving account information
      • +
      • Receiving account change notifications
      • +
      + + + + + + + + + +
      Note
      To add, update, or remove an account, you must register your account provider for all your applications belonging to the same package.
      + +

      The account.h header file handles account-related information. The following table lists the account properties that can be modified.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Account properties +
      Account propertyData typeMandatoryDescription
      User nameStringYesIdentity of an account. +

      If the display name and email address are not set for an account, the user name is shown for the account on the Accounts screen in the Setting application.

      +
      Display nameStringNoDisplay name of an account. +

      Display name is shown for the account on the Accounts screen in the Setting application.

      +
      Email addressStringNoEmail address of an account. +

      If the display name is not set for an account, the email address is shown for the account on the Accounts screen in the Setting application.

      +
      Package nameStringNoOne of an account package IDs, like the app ID. +

      If the package name is not set for an account, the app ID is used as a package name.

      +
      Icon pathStringNoIcon path of an account. +

      The icon is shown through the registered icon path as an account icon on the Accounts screen in the Setting application.

      +
      Domain nameStringNoDomain name of an account. +
      Access tokenStringNoAccess token of an account. +
      Auth typeIntegerNoAuthentication type, such as oauth or xauth. +
      CapabilityKey-value string-integer pairsNoCapability of an account. +
      SecretIntegerNoThe secret value is used to decide whether the account is shown on the Accounts screen in the Setting application. +
      Sync supportIntegerNoCurrent synchronization status.
      SourceStringNoSource of an account. +
      User textStringNoString array which you can use freely. +
      User intIntegerNoInteger array which you can use freely. +
      CustomKey-value string pairsNoKey-value pairs which you can use freely. +
      + +

      Account Providers

      +

      Account providers, such as Google and Facebook, represent specific service provider-related information or protocol that provides the user accounts. To add, update, or remove accounts, you must register a specific account provider in your application.

      +

      To register an account provider, define the account provider information in the Account tab of the manifest editor, as described in the following table, and implement the account application control.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Account provider properties +
      Account propertyData typeMandatoryDescription
      Multiple accounts supportbool YesIndicates whether multiple accounts are supported.
      IconStringYesFile path of the account provider icon. +

      The icon size is:

      +
        +
      • 72 x 72 for Xhigh (HD)
      • +
      • 48 x 48 for High (WVGA)
      • +
      +

      Since the icon is used in Settings > Accounts, place the icon in a shared directory.

      Small iconStringYesFile path of the account provider icon. +

      The icon size is:

      +
        +
      • 45 x 45 for Xhigh (HD)
      • +
      • 30 x 30 for High (WVGA)
      • +
      +

      Since the small icon is used in other applications, place the icon in a shared directory.

      Display nameStringYesDisplay name of the account provider.
      CapabilitiesStringNoCapability of the account provider. +

      Capability can be a liaison between an account application and another application. If an account application registers a capability in the manifest file, other applications know that the account application has the capability. And if an account application gives an account a capability, other applications know that the account has the capability.

      +

      Several service-specific capabilities are defined for the Account Manager in Tizen:

      + +
        +
      • Contact capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_CONTACT or "http://tizen.org/account/capability/contact"

        +

        If you register this capability in the manifest file, the user using the contact application can see a list of accounts with the account of your service in the contact application.

        +
      • +
      • Calendar capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_CALENDAR or "http://tizen.org/account/capability/calendar"

        +

        If you register this capability in the manifest file, the user using the calendar application can see a list of accounts with the account of your service in the calendar application.

        +
      • +
      • Email capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_EMAIL or "http://tizen.org/account/capability/email"

        +
      • +
      • Photo capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_PHOTO or "http://tizen.org/account/capability/photo"

        +
      • +
      • Video capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_VIDEO or "http://tizen.org/account/capability/video"

        +
      • +
      • Music capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_MUSIC or "http://tizen.org/account/capability/music"

        +
      • +
      • Document capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_DOCUMENT or "http://tizen.org/account/capability/document"

        +
      • +
      • Message capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_MESSAGE or "http://tizen.org/account/capability/message"

        +
      • +
      • Game capability: +

        ACCOUNT_SUPPORTS_CAPABILITY_GAME or "http://tizen.org/account/capability/game"

        +
      • +
      +
      + +

      If the application has defined the account provider information and implements the appcontrol for the account provider, the account provider is automatically registered when the application is installed.

      + +

      Account Application Control

      +

      The account application control, which allows the user to add and configure accounts, must be implemented in all applications that define an account provider. You are not required to define the application control information in the Application Control tab of the manifest editor.

      + +

      This application control supports the http://tizen.org/appcontrol/operation/account/add and http://tizen.org/appcontrol/operation/account/configure operations.

      + +

      ACCOUNT_OPERATION_SIGNIN Operation

      +

      The http://tizen.org/appcontrol/operation/account/add operation enables the user to add a new account for a specific account provider. With the operation, the login page for the specific account provider can be displayed. In Settings > Accounts, if the account provider is clicked for adding a new account, this operation is launched.

      + +

      You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

      + +

      The results of the operation are returned in the app_control_get_operation() event handler.

      +

      The following table shows the ACCOUNT_OPERATION_SIGNIN (http://tizen.org/appcontrol/operation/account/add) operation.

      + + + + + + + + + + + + + + +
      + Table: ACCOUNT_OPERATION_SIGNIN operation +
      OperationDescription
      ACCOUNT_OPERATION_SIGNINAccount ID of the added account.
      +

      ACCOUNT_OPERATION_VIEW Operation

      +

      The http://tizen.org/appcontrol/operation/account/configure operation enables the user to set account information, such as synchronization settings. The delete button must be included for removing accounts.

      +

      In Settings > Accounts, if the specific account is clicked for setting the account information, this operation is launched.

      +

      You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

      +

      The results of the operation are returned in the app_control_get_operation() event handler.

      +

      The following table shows the ACCOUNT_OPERATION_VIEW (http://tizen.org/appcontrol/operation/account/configure) operation.

      + + + + + + + + + + + + + + +
      + Table: ACCOUNT_OPERATION_VIEW operation +
      OperationDescription
      ACCOUNT_OPERATION_VIEWAccount ID for setting account information.
      + + + +
      + +Go to top + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/account/oauth2_n.htm b/org.tizen.guides/html/native/account/oauth2_n.htm index 244ba74..013acab 100644 --- a/org.tizen.guides/html/native/account/oauth2_n.htm +++ b/org.tizen.guides/html/native/account/oauth2_n.htm @@ -10,28 +10,28 @@ - oauth2 + OAuth 2.0
      -

      oauth2

      +

      OAuth 2.0

      The OAuth 2.0 authorization framework enables a 3rd party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the 3rd party application to obtain access on its own behalf.

      Figure: Protocol flow

      diff --git a/org.tizen.guides/html/native/account/sync_manager_n.htm b/org.tizen.guides/html/native/account/sync_manager_n.htm index 7a07b9e..0355893 100644 --- a/org.tizen.guides/html/native/account/sync_manager_n.htm +++ b/org.tizen.guides/html/native/account/sync_manager_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native

      +

      Mobile native

      @@ -35,28 +35,20 @@

      Sync Manager

      Tizen provides notifications for a service application to maintain data consistency between a server and the device. You can manage the synchronization schedule for applications.

      - - - - - - - - - -
      Note
      The Sync Manager API domain is supported in mobile applications only.
      Service and UI applications should have package name as same.
      +

      This feature is supported in mobile applications only.

      +

      The service and UI applications must have the same package name.

      The main Sync Manager API features are:

        -
      • Add on-demand sync job schedules.
      • -
      • Add periodic sync job schedules.
      • -
      • Add data change sync job schedules.
      • -
      • Remove registered sync job schedules.
      • -
      • Iterate registered sync job schedules.
      • +
      • Adding on-demand sync job schedules
      • +
      • Adding periodic sync job schedules
      • +
      • Adding data change sync job schedules
      • +
      • Removing registered sync job schedules
      • +
      • Iterating registered sync job schedules
      -


      The sync manager operates sync jobs based on the rules defined in the following table.

      +

      The sync manager operates the sync jobs based on the rules defined in the following table.

      - @@ -64,12 +56,14 @@ - - + + - - + + @@ -77,78 +71,99 @@ - + - +
      Table: Sync job scheduling rules

      +

      Table: Sync job scheduling rules
      Description
      Data changes on serverA server sends a push message to the account provider service and service applications. When the data is changed on a server, a push message is sent from the server. Then, the device which is received the push message can trigger on-demand sync job.Data changes on the serverA server sends a push message to the account provider service and service applications. When the data is changed on the server, a push message is sent from the server. Then, the device which receives the push message can trigger an on-demand sync job.
      Data changes on deviceA subscribed callback function is invoked whenever DB change occurs for the registered capability. The data change listener notices the changes by using the Calendar, Contacts, and Media Content API. If there are any changes in corresponding data, the sync manager notices the changes and schedules a sync job.

      Changing data in the Calendar database includes adding, updating, and deleting books, events, and todos. Changing data in the Contacts database includes adding, removing, and modifying contacts.
      Media content provides notification for the types of changed data such as image, music, sound, and video.
      Data changes on the deviceA subscribed callback function is invoked whenever a database change occurs for a registered capability. The data change listener notices the changes by using the Calendar, Contacts, and Media Content APIs. If there are any changes in the corresponding data, the sync manager notices the changes and schedules a sync job. +

      Changing data in the Calendar database includes adding, updating, and deleting books, events, and todos. Changing data in the Contacts database includes adding, removing, and modifying contacts.

      +

      The media content provides notifications for changes in media types, such as image, music, sound, and video.

      Network availability
      On demand syncThe on-demand sync means that you can schedule a sync job for once. You can use this feature with the sync_manager_on_demand_sync_job() API.The on-demand sync means that you can schedule a sync job once. You can use this feature with the sync_manager_on_demand_sync_job() function.
      Periodic syncThe periodic sync means that you can schedule a sync job to be performed regularly. You can use this feature with the sync_manager_add_periodic_sync_job() API. You can also use the sync intervals as various enumerators which is provided through the Sync Manager API. To use this API, "http://tizen.org/privilege/alarm.set" is required. Because user who use this API can use setting an alarm indirectly.The periodic sync means that you can schedule a sync job to be performed regularly. You can use this feature with the sync_manager_add_periodic_sync_job() function. You can also use the sync intervals through various enumerators provided through the Sync Manager API. +

      When using the Sync Manager API, you can set an alarm indirectly. Consequently, the http://tizen.org/privilege/alarm.set privilege is required.

      - -


      The following table lists the variables and theirs description for using Sync Manager.

      +

      The following table lists the variables used with the sync manager.

      - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table: Sync Manager variables

      Table: Sync manager variables
      Sync Manager variableData typeMandatoryDescription
      Account Handleaccount_s*NoHandle of account module.

      An account handle for managing account related data.

      Sync Job Nameconst char*YesName for managing sync jobs.

      On-demand and periodic sync jobs can be managed by using Sync Job Name. It is user defined value. If sync_manager_add_periodic_sync_job() API is called again with same Sync Job Name, not adding a new sync job but renewing all the data except Sync Job Name and Sync Job ID. That is for mainly resetting of periodic interval.

      Sync Capabilityconst char*YesCapability for a data change sync jobs.

      Data change sync job can provide notification whenever corresponding data change occurs. If sync_manager_add_data_change_sync_job() API is used with a capability, it is operated only for the related capability. In the case of using calendar and contact capability, "http://tizen.org/privilege/calendar.read" and "http://tizen.org/privilege/contact.read" are required for each.

      Available capabilities are below:
      #define    SYNC_SUPPORTS_CAPABILITY_CALENDAR    "http://tizen.org/sync/capability/calendar"
      #define    SYNC_SUPPORTS_CAPABILITY_CONTACT    "http://tizen.org/sync/capability/contact"
      #define    SYNC_SUPPORTS_CAPABILITY_IMAGE    "http://tizen.org/sync/capability/image"
      #define    SYNC_SUPPORTS_CAPABILITY_MUSIC    "http://tizen.org/sync/capability/music"
      #define    SYNC_SUPPORTS_CAPABILITY_SOUND    "http://tizen.org/sync/capability/sound"
      #define    SYNC_SUPPORTS_CAPABILITY_VIDEO    "http://tizen.org/sync/capability/video"

      Sync Periodsync_period_eYesInterval for a periodic sync jobs.

      With it, sync job is provided periodically. In the case of setting periodic interval as 30 minutes, a time interval is set as power of 2 less than 30. Then, the time interval which is 16 minutes will operate the sync job every 16 minutes with skipping the first notification. So, the first will be 32 minutes. That is same for the other cases.
      In other words, it provides periodical sync job with an inexact time. By doing so, coupling various periodic sync jobs with interval as power of 2 is for preventing waking up service application too many times from a device.

      Available period intervals are below:
      SYNC_PERIOD_INTERVAL_30MIN    Sync within 30 minutes
      SYNC_PERIOD_INTERVAL_1H    Sync within 1 hour
      SYNC_PERIOD_INTERVAL_2H    Sync within 2 hours
      SYNC_PERIOD_INTERVAL_3H    Sync within 3 hours
      SYNC_PERIOD_INTERVAL_6H    Sync within 6 hours
      SYNC_PERIOD_INTERVAL_12H    Sync within 12 hours
      SYNC_PERIOD_INTERVAL_1DAY    Sync within 1 day

      Sync Optionsync_option_eYesOption for deciding the behavior of sync jobs.

      The behavior of sync job is decided with corresponding sync option. These options can be used as OR value. For example, the expression of "(SYNC_OPTION_EXPEDITED | SYNC_OPTION_NO_RETRY)" is available. That means "Sync job will be operated just once with priority".

      Available options are below:
      SYNC_OPTION_NONE    Sync job will be operated normally
      SYNC_OPTION_EXPEDITED    Sync job will be operated as soon as possible
      SYNC_OPTION_NO_RETRY    Sync job will not be performed again when it fails

      Sync Job IDint*YesUnique ID for managing sync jobs.

      It is generated when a sync job is added. It is required to remove the sync job. The number of Sync Job ID which can be generated is restricted as a hundred per a package.

      Sync Job User Databundle*NoUser data for sync jobs.

      User data which contains additional information related registered sync jobs.

      User Datavoid*NoUser data for sync_manager_for_each_sync_job().

      User data which contains additional information related foreach jobs.

      VariableData typeMandatoryDescription
      Account handleaccount_s*NoHandle of the account module for managing account-related data.
      Sync job nameconst char*YesSync job name for managing the jobs. +

      The on-demand and periodic sync jobs can be managed by a user-defined name. If the sync_manager_add_periodic_sync_job() function is called again with same sync job name (where all details except the name and sync job ID are changed), the function does not add a new sync job but updates the existing job. This is mainly used to reset the periodic interval.

      Sync capabilityconst char*YesCapability for a data change sync job. +

      A data change sync job can provide a notification whenever a corresponding data change occurs. If the sync_manager_add_data_change_sync_job() function is used with a capability, it is operated for the related capability only. In the case of using the calendar or contact capability, the respective http://tizen.org/privilege/calendar.read or http://tizen.org/privilege/contact.read privilege is required.

      +

      The following capabilities are available:

      +
      +#define SYNC_SUPPORTS_CAPABILITY_CALENDAR "http://tizen.org/sync/capability/calendar" 
      +#define SYNC_SUPPORTS_CAPABILITY_CONTACT "http://tizen.org/sync/capability/contact"
      +#define SYNC_SUPPORTS_CAPABILITY_IMAGE "http://tizen.org/sync/capability/image"
      +#define SYNC_SUPPORTS_CAPABILITY_MUSIC "http://tizen.org/sync/capability/music"
      +#define SYNC_SUPPORTS_CAPABILITY_SOUND "http://tizen.org/sync/capability/sound"
      +#define SYNC_SUPPORTS_CAPABILITY_VIDEO "http://tizen.org/sync/capability/video"
      Sync periodsync_period_eYesInterval for a periodic sync job. +

      If the interval is provided, the sync job is performed periodically. If you set the periodic interval to 30 minutes, a time interval is set as a power of 2 less than 30. This means that a time interval set to 16 minutes operates the sync job every 16 minutes while skipping the first notification (so the first is in 32 minutes). The same logic applies to other cases.

      +

      This variable provides a periodic sync job with an inexact time. Coupling various periodic sync jobs with an interval as a power of 2 prevents the device from waking up the service application too many times.

      +

      The sync_period_e enumerator defines the available period intervals.

      Sync optionsync_option_eYesOption for deciding the sync job behavior. +

      The behavior options can be used as an OR value. For example, the (SYNC_OPTION_EXPEDITED | SYNC_OPTION_NO_RETRY) expression is available, and means that the "Sync job is operated just once with priority".

      +

      The following options are available:

      +
      • SYNC_OPTION_NONE: Sync job is operated normally
      • +
      • SYNC_OPTION_EXPEDITED: Sync job is operated as soon as possible
      • +
      • SYNC_OPTION_NO_RETRY: Sync job is not performed again when it fails
      Sync job IDint*YesUnique ID for managing sync jobs. +

      The ID is generated when a sync job is added. It is required to remove the sync job. The number of ID that can be generated is restricted to a hundred per a package.

      Sync job user databundle*NoUser data for a sync job. +

      The data can contain additional information related to the registered sync jobs.

      User datavoid*NoUser data for the sync_manager_for_each_sync_job() function. +

      The data can contain additional information related to the foreach jobs.

      - - + +

      Sync Adapter

      @@ -157,19 +172,22 @@ - +
      Note
      The Sync Adapter API should be carried out by a service application which will operate data synchronization before using the Sync Manager API.
      The number of service application which can set callbacks is restricted as only one per a package.
      The Sync Adapter API operations must be carried out by a service application (which operates data synchronization) before using the Sync Manager API. +

      The number of service applications that can set callbacks is restricted to only one per a package.

      -

      The Sync Adapter API allows you to:

      +

      The Sync Adapter API allows you to:

      • Register callbacks for notifications about the sync job start and cancellation.
      • -
      • App control is used to start the sync operation, so that the application's daemon does not need to stay awake. Sync Adapter API allows you to use this mechanism without using the App Control API separately.

        In other words, in the case of using Sync Adapter API, you can use the App Control API indirectly.

        -
      • -
      - +
    • Start a sync operation with an app control, so that the application's daemon needs not to stay awake. +

      The Sync Adapter API allows you to use this mechanism without using the App Control API separately. In other words, when using the Sync Adapter API, you can use the App Control API indirectly.

      +
    • +
    + +
    @@ -193,3 +211,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga + diff --git a/org.tizen.guides/html/native/app/alarm_n.htm b/org.tizen.guides/html/native/app/alarm_n.htm new file mode 100644 index 0000000..8079fc9 --- /dev/null +++ b/org.tizen.guides/html/native/app/alarm_n.htm @@ -0,0 +1,61 @@ + + + + + + + + + + + + + Alarm + + + + + +
    +

    Alarm

    + +

    You can launch an application at a specific time using alarms. The mechanism involved in launching the application is the App Control API (in mobile and wearable applications).

    +

    The AppControl API allows launching an application explicitly, giving its package name, or providing certain criteria that the application must meet. For example, the criteria can include the type of data on which the application must be able to operate. The structure containing the criteria is called an appcontrol.

    + + + + +
    + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/app_guide_n.htm b/org.tizen.guides/html/native/app/app_guide_n.htm index 7ee0561..1f1e5bd 100644 --- a/org.tizen.guides/html/native/app/app_guide_n.htm +++ b/org.tizen.guides/html/native/app/app_guide_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -34,22 +34,19 @@

    Application framework features include managing various types of applications and packages, and handling events.

    The main application framework features are:

      -
    • Application

      Enables you to manage application state change or system events and control mechanisms that launch other applications.

    • -
    • Application Group

      Enables you to manage application launch mode and grouping.

    • +
    • Application

      Enables you to manage application state change or system events and control mechanisms that launch other applications. You can also manage application launch mode and grouping, alarms, events, and localization.

    • Application Manager

      Allows you to retrieve information about an application.

    • Badge

      Allows you to create badges.

    • Bundle

      Enables you to manage bundles and their content.

    • -
    • Data Control

      Allows your applications to exchange data.

    • +
    • Data Control

      Allows your applications to exchange data.

    • Message Port

      Enables your applications to communicate with each other using message port communication.

    • Notification

      Allows you to create and manage notifications.

    • Package Manager

      Allows you to install, uninstall, and update packages, and store their information.

    • Service Application

      Allows you to create and manage native service applications.

    • +
    • Shortcut

      Allows you to add a shortcut for the Home application.

    • Widget Application

      Allows you to create and manage widget applications.

    -

    The following guides apply in mobile applications only:

    -
      -
    • Shortcut

      Allows you to add a shortcut for the Home application.

    • -
    +

    The following guides apply in wearable applications only:

    • Watch Application

      Allows you to manage a watch application and display the current date and time accurately.

    • diff --git a/org.tizen.guides/html/native/app/app_manager_n.htm b/org.tizen.guides/html/native/app/app_manager_n.htm index 694532e..8edfeee 100644 --- a/org.tizen.guides/html/native/app/app_manager_n.htm +++ b/org.tizen.guides/html/native/app/app_manager_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.guides/html/native/app/appcontrol_n.htm b/org.tizen.guides/html/native/app/appcontrol_n.htm new file mode 100644 index 0000000..5849b42 --- /dev/null +++ b/org.tizen.guides/html/native/app/appcontrol_n.htm @@ -0,0 +1,448 @@ + + + + + + + + + + + + + App Control + + + + + +
      +

      App Control

      + +

      An application control (app control) is a way of sharing an application's functionality. To use another application's features through application controls reduces your efforts and time to develop your application.

      + +

      An application can be launched by the user from the Launcher or by another application. The application control can be used to describe either an action to be performed by other applications, or the results of the operation performed by a launched application. The application can receive results from the launched application.

      +

      Regardless of how an application is launched, the application framework starts the application by creating a new process and calling the entry point of the application. Like a conventional Linux application, the main function of the application is its entry point. In the Tizen application, the main task is to hand over control to the application framework by calling the ui_app_main() function:

      + +
      +bool app_create(void *user_data)
      +{
      +   // Take necessary actions before the main event loop starts
      +   // Initialize UI resources and application data
      +   // If this function returns true, the application main loop starts
      +   // If this function returns false, the application terminates
      +   return true;
      +}
      +
      +void app_control(app_control_h app_control, void *user_data)
      +{
      +   // Handle the launch request
      +}
      +
      +void app_pause(void *user_data)
      +{
      +   // Take necessary actions when application becomes invisible
      +}
      +
      +void app_resume(void *user_data)
      +{
      +   // Take necessary actions when application becomes visible
      +}
      +
      +void app_terminate(void *user_data)
      +{
      +   // Release all resources
      +}
      +
      +int main(int argc, char *argv[])
      +{
      +   struct appdata ad;
      + 
      +   ui_app_lifecycle_callback_s event_callback;
      +     
      +   event_callback.create = app_create;
      +   event_callback.terminate = app_terminate;
      +   event_callback.pause = app_pause;
      +   event_callback.resume = app_resume;
      +   event_callback.app_control = app_control;
      +
      +   memset(&ad, 0x0, sizeof(struct appdata));
      +
      +   return ui_app_main(argc, argv, &event_callback, &ad);
      +}
      +
      + +

      The ui_app_main() function initializes the application and starts the main loop. It takes 4 parameters and uses them to initialize the application. The argc and argv parameters contain the values from the application framework, and you must never change their values. The third parameter is a state transition handler that is responsible for managing the state transitions the application goes through while it is running. The fourth parameter is application data to be passed to each state handler.

      +

      When the ui_app_main() is first invoked, the application moves from the ready state to the created state. The application has to initialize itself. During this transition, the application framework calls the application's app_create_cb() state transition callback just before the application enters the main loop. Within the registered callback, you must initialize the application resources and create the main window.

      +

      If the app_create_cb() callback function returns false, the application moves to the terminated state. If it returns true, the application enters the main loop.

      + +

      Handling the Launch Options

      +

      The application framework calls the application's app_control_cb() callback just after the application enters the main loop. This callback is passed to the app_control containing the reason why the application was launched. For example, the application can be launched to open a file to handle the request that has been sent by other application. In all of these cases, the application is responsible for checking the content of the app_control and responding appropriately. The content of the app_control can be empty, if the application is launched by the user from the Launcher.

      + +
      static void app_control(app_control_h app_control, void *user_data)
      +{
      +   struct appdata *ad = (struct appdata *)user_data;
      +   char *operation;
      +   char *uri;
      +   char *mime_type;
      + 
      +   app_control_get_operation(app_control, operation);
      + 
      +   if (!strcmp(operation, APP_CONTROL_OPERATION_VIEW))
      +   {
      +      app_control_get_uri(app_control, &uri);
      +      app_control_get_mime(app_control, &mime_type);
      + 
      +      if (uri && !strcmp(mime_type, "image/jpg"))
      +      {
      +         display_image_file(ad, uri); // Display a specific image file
      +      }
      +   }
      + 
      +   if (ad->win)
      +      elm_win_activate(ad->win);
      +}
      +
      +

      Managing Application Controls

      +

      The App Control API provides functions for launching other applications with a specific operation, URI, and MIME type. The requesting application can get a result back from the launched application.

      +

      To launch an application with the App Control API, create an app_control handle and add information to that handle. You can set the following information:

      +
        +
      • Operation: Action to be performed by the app control.
      • +
      • URI: Data itself to be performed.
      • +
      • MIME type: Specific type of the URI.
      • +
      • Application ID: ID of the application to be launched.
      • +
      • Extra data: Key-value pairs to provide additional information for the launch request and the result of the request.
      • +
      +

      The operation is mandatory information for sending the launch request. The App Control API provides several functions to get and set the above information to the app_control handle.

      +

      To launch an application with the App Control API, use one of the following methods:

      + +

      The application launched by the app control can return the result to the caller application.

      + +

      You can take advantage of the Tizen base application functionalities through the app control feature. You can also export your application functionality to allow other applications to launch your application.

      + + + + + + + + + + +
      Note
      Since Tizen 2.4, application controls used to launch service applications outside the current package are not supported. Because of this, the service application is only allowed to be launched explicitly by the application in the same package.
      + + +

      Explicit Launch

      + +

      When you request an explicit launch:

      + +
        +
      • If the underlying application launcher framework finds an application matched with the given application ID in the installed application list, it launches the application in a new process. If the matched application is not found, the framework returns the APP_CONTROL_ERROR_APP_NOT_FOUND result. Additional information (such as operation, URI, or MIME type) is not used to select an application for an explicit launch.
      • +
      • If the operation setting in the app_control handle is set to APP_CONTROL_OPERATION_DEFAULT, the application ID must be set. Otherwise the APP_CONTROL_ERROR_INVALID_PARAMETER result is returned.
      • +
      +

      The following code example launches a calculator application explicitly with the application ID:

      +
      +#include <app.h>
      +#include <dlog.h>
      + 
      +#define TAG "MY_TAG"
      +
      +app_control_h app_control;
      + 
      +app_control_create(&app_control);
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
      +app_control_set_app_id(app_control, "org.tizen.calculator");
      + 
      +if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      +{
      +   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a calculator app.");
      +} 
      +else 
      +{
      +   dlog_print(DLOG_ERROR, TAG, "Failed to launch a calculator app.");
      +}
      + 
      +app_control_destroy(app_control);
      +
      + +

      Implicit Launch

      + +

      When you request an implicit launch:

      + +
        +
      • Only 3 data categories are used to determine which application can be launched: Operation, URI scheme, and MIME type.
      • +
      • The application launcher framework iterates the desktop files of installed applications on the device to find applications where the 3 categories are exactly matched.
      • +
      • If only one application is matched for the given categories, that application is launched. If multiple matching applications are found, the application selector is shown and the user can select the proper application.
      • +
      • Each app control requires a different combination of the 3 categories. For some, only one category is necessary (for example, URI), for others, all 3 can be needed. Check the app control list and required data in the API Reference to determine the needed categories.
      • +
      • If no match is found, an error is returned.
      • +
      +

      To allow the application launcher framework to find and select matching applications, each application must describe its operation, URI, or MIME type correctly.

      + +

      The following code example launches a camera application with the operation and MIME type:

      + +
      +#include <app.h>
      +#include <dlog.h>
      +
      +#define TAG "MY_TAG"
      +
      +app_control_h app_control;
      + 
      +app_control_create(&app_control);
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
      +app_control_set_mime(app_control, "image/jpg");
      +if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      +{
      +   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a viewer app.");
      +} 
      +else 
      +{
      +   dlog_print(DLOG_ERROR, TAG, "Failed to launch a viewer app.");
      +}
      + 
      +app_control_destroy(app_control);
      +
      + +

      The following code example launches a gallery application with the operation, URI, and MIME type:

      + +
      +#include <app.h>
      +#include <dlog.h>
      +
      +#define TAG "MY_TAG"
      + 
      +app_control_h app_control;
      + 
      +app_control_create(&app_control);
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
      +app_control_set_uri(app_control, "file:///home/myhome/Photos/1_photo.jpg");
      +app_control_set_mime(app_control, "image/*");
      + 
      +if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      +{
      +   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a viewer app.");
      +} 
      +else 
      +{
      +   dlog_print(DLOG_ERROR, TAG, "Failed to launch a viewer app.");
      +}
      + 
      +app_control_destroy(app_control);
      +
      + + + + + + + + + + +
      Note
      Since Tizen 2.4, service applications are only allowed to be launched explicitly. All service applications are excluded from matches of implicit launch requests.
      + +

      Getting the App Control Results

      +

      The app control result from the requested application is delivered to the caller application in the app_control handle with extra data. For some cases, the App Control API provides pre-defined extra data keys.

      +

      If you cannot find a proper key, you can define your own key. However, the customized key must be shared between the caller and callee applications.

      + +

      The following code example gets the result of an app control request by implementing an app_control result callback:

      + +
      +#include <app.h>
      +#include <dlog.h>
      + 
      +#define TAG "MY_TAG"
      + 
      +// Callback function to get result
      +static void app_control_result(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) 
      +{
      +   char *value;
      + 
      +   if (result == APP_CONTROL_RESULT_SUCCEEDED) 
      +   {
      +      if (app_control_get_extra_data(reply, APP_CONTROL_DATA_SELECTED, &value) == APP_CONTROL_ERROR_NONE)
      +      {
      +         dlog_print(DLOG_INFO, TAG, "[app_control_result_cb] Succeeded: value(%s)", value);
      +      } 
      +      else 
      +      {
      +         dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] Failed");
      +      }
      + 
      +   } 
      +   else 
      +   {
      +      dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] APP_CONTROL_RESULT_FAILED.");
      +   }
      +}
      +
      + +

      The following code example requests the launch of another application:

      + +
      +#include <app.h>
      +#include <dlog.h>
      +
      +#define TAG "MY_TAG"
      +
      +app_control_h app_control;
      + 
      +app_control_create(&app_control);
      + 
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
      +app_control_set_mime(app_control, "text/plain");
      + 
      +if (app_control_send_launch_request(app_control, app_control_result, NULL) == APP_CONTROL_ERROR_NONE) 
      +{
      +   dlog_print(DLOG_INFO, TAG, "Succeeded: the application is launched.");
      +} 
      +else 
      +{
      +   dlog_print(DLOG_ERROR, TAG, "Failed to launch an application.");
      +}
      + 
      +app_control_destroy(app_control);
      +
      + +

      The following code example implements an app_control callback in the callee application:

      + +
      +static void app_control(app_control_h app_control, void *user_data) 
      +{
      +   struct appdata *ad = (struct appdata *)user_data;
      +   char *operation;
      +   char *mime;
      +   app_control_h reply;
      +   char *app_id;
      + 
      +   app_control_get_operation(app_control, &operation);
      + 
      +   if (!strcmp(operation, APP_CONTROL_OPERATION_CREATE_CONTENT)) 
      +   {
      +      app_control_get_mime(app_control, &mime);
      + 
      +      if (!strcmp(mime, "text/plain")) 
      +      {
      +         app_control_create(&reply);
      + 
      +         app_get_app_id(&app_id);
      +         app_control_add_extra_data(reply, APP_CONTROL_DATA_SELECTED, app_id);
      +         app_control_reply_to_launch_request(reply, app_control, APP_CONTROL_RESULT_SUCCEEDED);
      + 
      +         app_control_destroy(reply);
      +      }
      +   }
      +}
      +
      + + +

      Common Application Controls

      + +

      Tizen provides common application controls that allow you to take advantage of the Tizen base application functionalities. You can use the common application controls to perform some basic tasks, such as selecting a file or taking a picture.

      + +

      The following common application controls are available:

      + + + +

      Exporting AppControl Functionality

      +

      You can advertise your application features to other applications by exporting your application control functionalities. To allow other applications to find and use your application features implicitly without the application ID, declare your application control information in the tizen-manifest.xml file:

      +
      +<app-control>
      +   <mime name="application/xhtml+xml"/>
      +   <operation name="http://tizen.org/appcontrol/operation/view"/>
      +   <uri name="http://test.com"/>
      +</app-control>
      +<app-control>
      +   <operation name="http://tizen.org/appcontrol/operation/call"/>
      +</app-control>
      +
      +

      + The resolution filter is used when resolving the application control. Each entry of the resolution filter has the <app-control> + element and forms an application resolution unit. The additional URI or MIME type information must contain the associated operation ID, and the retrieved application control must have the specified + application ID and operation ID when resolving the application control. +

      +

      + You can specify the application control information of your application in the application project settings in the IDE; an + operation ID must be specified for the application control. +

      + +

      Managing Application Groups

      +

      You can define the application launch mode and group your applications into entities that can be managed together.

      + +

      The main application group features include:

      +
        +
      • Defining the application launch mode +

        When an application is launched through an app control, its launch mode defines its behavior:

        +
        • The single launch mode means that the application is launched as a main application (in a new group).
        • +
        • The caller launch mode means that the application is launched as a sub application belonging to the same group as the caller application who is causing the application to be launched.
        +

        You can set the application launch mode in the manifest file using the launch_mode attribute of the <ui-application> element. If the launch mode is set to caller, the application that calls the app control can define the launch mode for the called application using the app_control_set_launch_mode() function. However, if the called application has set its launch mode in its manifest file to single, that setting overrides the caller application's launch mode request.

        +
      • +
      • Managing the application group +

        Applications in a same group act as if they are in 1 stack. For example, if an application A wants to send an email using an email application B, the application A can launch the email application B, making the email application B a sub application in the same group as the application A. When both applications are running, and the user presses the home button, both applications are hidden. When the user later resumes the caller application (application A), the email application B is shown on top of the caller application.

        +

        If an application is launched in a group, it can be terminated by the main (first) application in the group. If the main application is terminated or killed, the sub applications in the group are terminated automatically (they can be terminated by the framework even if they are hidden).

        + +

        Figure: Group behavior

        +

        Group behavior

        + +
      • +
      + + + +
      + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/application_n.htm b/org.tizen.guides/html/native/app/application_n.htm index e4bce8d..2222f6f 100644 --- a/org.tizen.guides/html/native/app/application_n.htm +++ b/org.tizen.guides/html/native/app/application_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -24,11 +24,8 @@

      Related Info

      + +

      In addition, you can use sub-category APIs to:

      +

      Managing the Event Loop

      In order for an application to operate successfully, it must receive events from the platform. For this, it must start the main event loop - this is mandatory for all Tizen native applications.

      The ui_app_main() function is used to start the event loop. Before calling this function, set up the app_event_callback_s structure variable, which is passed to the function.

      -

      For more information about launching applications, see Launching Applications.

      +

      For more information about launching applications, see App Control.

      Registering Callbacks for Events

      The following table lists the application state change events.

      @@ -125,466 +127,13 @@ APP_EVENT_REGION_FORMAT_CHANGED Event type for the callback function that is responsible for refreshing the display into the new time zone. - - APP_EVENT_SUSPENDED_STATE_CHANGED - Event type for the callback function that is responsible for taking necessary actions before enter to the suspended state or after exit from the state. (Since Tizen 2.4) - + + APP_EVENT_SUSPENDED_STATE_CHANGED + Event type for the callback function that is responsible for taking necessary actions before entering the suspended state or after exiting from the state. (Supported since Tizen 2.4.) + - -

      Launching Applications

      -

      An application can be launched by the user from the Launcher or by another application.

      -

      The App Control can be used to describe either an action to be performed by other applications, or the results of the operation performed by a launched application. The application can receive results from the launched application.

      -

      Regardless of how an application is launched, the application framework starts the application by creating a new process and calling the entry point of the application. Like a conventional Linux application, the main function of the application is its entry point. In the Tizen application, the main task is to hand over control to the application framework by calling the ui_app_main() function:

      - -
      -bool app_create(void *user_data)
      -{
      -   // Take necessary actions before the main event loop starts
      -   // Initialize UI resources and application data
      -   // If this function returns true, the application main loop starts
      -   // If this function returns false, the application terminates
      -   return true;
      -}
      -
      -void app_control(app_control_h app_control, void *user_data)
      -{
      -   // Handle the launch request
      -}
      -
      -void app_pause(void *user_data)
      -{
      -   // Take necessary actions when application becomes invisible
      -}
      -
      -void app_resume(void *user_data)
      -{
      -   // Take necessary actions when application becomes visible
      -}
      -
      -void app_terminate(void *user_data)
      -{
      -   // Release all resources
      -}
      -
      -int main(int argc, char *argv[])
      -{
      -   struct appdata ad;
      - 
      -   ui_app_lifecycle_callback_s event_callback;
      -     
      -   event_callback.create = app_create;
      -   event_callback.terminate = app_terminate;
      -   event_callback.pause = app_pause;
      -   event_callback.resume = app_resume;
      -   event_callback.app_control = app_control;
      -
      -   memset(&ad, 0x0, sizeof(struct appdata));
      -
      -   return ui_app_main(argc, argv, &event_callback, &ad);
      -}
      -
      - -

      The ui_app_main() function initializes the application and starts the main loop. It takes 4 parameters and uses them to initialize the application. The argc and argv parameters contain the values from the application framework, and you must never change their values. The third parameter is a state transition handler that is responsible for managing the state transitions the application goes through while it is running. The fourth parameter is application data to be passed to each state handler.

      -

      When the ui_app_main() is first invoked, the application moves from the ready state to the created state. The application has to initialize itself. During this transition, the application framework calls the application's app_create_cb() state transition callback just before the application enters the main loop. Within the registered callback, you must initialize the application resources and create the main window.

      -

      If the app_create_cb() callback function returns false, the application moves to the terminated state. If it returns true, the application enters the main loop.

      - -

      Handling the Launch Options

      -

      The application framework calls the application's app_control_cb() callback just after the application enters the main loop. This callback is passed to the app_control containing the reason why the application was launched. For example, the application can be launched to open a file to handle the request that has been sent by other application. In all of these cases, the application is responsible for checking the content of the app_control and responding appropriately. The content of the app_control can be empty, if the application is launched by the user from the Launcher.

      - -
      static void app_control(app_control_h app_control, void *user_data)
      -{
      -   struct appdata *ad = (struct appdata *)user_data;
      -   char *operation;
      -   char *uri;
      -   char *mime_type;
      - 
      -   app_control_get_operation(app_control, operation);
      - 
      -   if (!strcmp(operation, APP_CONTROL_OPERATION_VIEW))
      -   {
      -      app_control_get_uri(app_control, &uri);
      -      app_control_get_mime(app_control, &mime_type);
      - 
      -      if (uri && !strcmp(mime_type, "image/jpg"))
      -      {
      -         display_image_file(ad, uri); // Display a specific image file
      -      }
      -   }
      - 
      -   if (ad->win)
      -      elm_win_activate(ad->win);
      -}
      -
      -

      Application Controls

      -

      The App control API provides functions for launching other applications with a specific operation, URI, and MIME type. The requesting application can get a result back from the launched application.

      -

      To launch an application with the App control API, create an app_control handle and add information to that handle. You can set the following information:

      -
        -
      • Operation: Action to be performed by the app control.
      • -
      • URI: Data itself to be performed.
      • -
      • MIME type: Specific type of the URI.
      • -
      • Application ID: ID of the application to be launched.
      • -
      • Extra data: Key-value pairs to provide additional information for the launch request and the result of the request.
      • -
      -

      The operation is mandatory information for sending the launch request. The app control API provides several functions to get and set the above information to the app_control handle.

      -

      To launch an application with the app control API, use one of the following methods:

      - -

      The application launched by the app control can return the result to the caller application.

      - -

      You can take advantage of the Tizen base application functionalities through the app control feature. You can also export your application functionality to allow other applications to launch your application.

      - - - - - - - - - - -
      Note
      Since Tizen 2.4, application controls of service applications over out of packages are not supported; hence the service application is only allowed to be launched explicitly by the application in the same package.
      - - -

      Explicit Launch

      - -

      When you request an explicit launch:

      - -
        -
      • If the underlying application launcher framework finds an application matched with the given application ID in the installed application list, it launches the application in a new process. If the matched application is not found, the framework returns the APP_CONTROL_ERROR_APP_NOT_FOUND result. Additional information (such as operation, URI, or MIME type) is not be used to select an application for an explicit launch.
      • -
      • If the operation setting in the app_control handle is set to APP_CONTROL_OPERATION_DEFAULT, the application ID must be set. Otherwise the APP_CONTROL_ERROR_INVALID_PARAMETER result is returned.
      • -
      -

      The following code example launches a calculator application explicitly with the application ID:

      -
      -#include <app.h>
      -#include <dlog.h>
      - 
      -#define TAG "MY_TAG"
      -
      -app_control_h app_control;
      - 
      -app_control_create(&app_control);
      -app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
      -app_control_set_app_id(app_control, "org.tizen.calculator");
      - 
      -if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      -{
      -   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a calculator app.");
      -} 
      -else 
      -{
      -   dlog_print(DLOG_ERROR, TAG, "Failed to launch a calculator app.");
      -}
      - 
      -app_control_destroy(app_control);
      -
      - -

      Implicit Launch

      - -

      When you request an implicit launch:

      - -
        -
      • Only 3 data categories are used to determine which application can be launched: Operation, URI scheme, and MIME type.
      • -
      • The application launcher framework iterates the desktop files of installed applications on the device to find applications where the 3 categories are exactly matched.
      • -
      • If only one application is matched for the given categories, that application is launched. If multiple matching applications are found, the application selector is shown and the user can select the proper application.
      • -
      • Each app control requires a different combination of the 3 categories. For some, only one category is necessary (for example, URI), for others, all 3 can be needed. Check the app control list and required data in the API Reference to determine the needed categories.
      • -
      -

      To allow the application launcher framework to find and select matching applications, each application must describe its operation, URI, or MIME type correctly.

      - -

      The following code example launches a camera application with the operation and MIME type:

      - -
      -#include <app.h>
      -#include <dlog.h>
      -
      -#define TAG "MY_TAG"
      -
      -app_control_h app_control;
      - 
      -app_control_create(&app_control);
      -app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
      -app_control_set_mime(app_control, "image/jpg");
      -if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      -{
      -   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a viewer app.");
      -} 
      -else 
      -{
      -   dlog_print(DLOG_ERROR, TAG, "Failed to launch a viewer app.");
      -}
      - 
      -app_control_destroy(app_control);
      -
      - -

      The following code example launches a gallery application with the operation, URI, and MIME type:

      - -
      -#include <app.h>
      -#include <dlog.h>
      -
      -#define TAG "MY_TAG"
      - 
      -app_control_h app_control;
      - 
      -app_control_create(&app_control);
      -app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
      -app_control_set_uri(app_control, "file:///home/myhome/Photos/1_photo.jpg");
      -app_control_set_mime(app_control, "image/*");
      - 
      -if (app_control_send_launch_request(app_control, NULL, NULL) == APP_CONTROL_ERROR_NONE) 
      -{
      -   dlog_print(DLOG_INFO, TAG, "Succeeded to launch a viewer app.");
      -} 
      -else 
      -{
      -   dlog_print(DLOG_ERROR, TAG, "Failed to launch a viewer app.");
      -}
      - 
      -app_control_destroy(app_control);
      -
      - - - - - - - - - - -
      Note
      Since Tizen 2.4, service applications are only allowed to be launched explicitly. Any service applications are excluded from matches of implicit launch requests.
      - -

      Getting the App Control Results

      -

      The app control result from the requested application is delivered to the caller application in the app_control handle with extra data. For some cases, the App control API provides pre-defined extra data keys.

      -

      If you cannot find a proper key, you can define your own key. However, the customized key must be shared between the caller and callee applications.

      - -

      The following code example gets the result of an app control request by implementing an app_control result callback:

      - -
      -#include <app.h>
      -#include <dlog.h>
      - 
      -#define TAG "MY_TAG"
      - 
      -// Callback function to get result
      -static void app_control_result(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data) 
      -{
      -   char *value;
      - 
      -   if (result == APP_CONTROL_RESULT_SUCCEEDED) 
      -   {
      -      if (app_control_get_extra_data(reply, APP_CONTROL_DATA_SELECTED, &value) == APP_CONTROL_ERROR_NONE)
      -      {
      -         dlog_print(DLOG_INFO, TAG, "[app_control_result_cb] Succeeded: value(%s)", value);
      -      } 
      -      else 
      -      {
      -         dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] Failed");
      -      }
      - 
      -   } 
      -   else 
      -   {
      -      dlog_print(DLOG_ERROR, TAG, "[app_control_result_cb] APP_CONTROL_RESULT_FAILED.");
      -   }
      -}
      -
      - -

      The following code example requests the launch of another application:

      - -
      -#include <app.h>
      -#include <dlog.h>
      -
      -#define TAG "MY_TAG"
      -
      -app_control_h app_control;
      - 
      -app_control_create(&app_control);
      - 
      -app_control_set_operation(app_control, APP_CONTROL_OPERATION_CREATE_CONTENT);
      -app_control_set_mime(app_control, "text/plain");
      - 
      -if (app_control_send_launch_request(app_control, app_control_result, NULL) == APP_CONTROL_ERROR_NONE) 
      -{
      -   dlog_print(DLOG_INFO, TAG, "Succeeded: the application is launched.");
      -} 
      -else 
      -{
      -   dlog_print(DLOG_ERROR, TAG, "Failed to launch an application.");
      -}
      - 
      -app_control_destroy(app_control);
      -
      - -

      The following code example implements an app_control callback in the callee application:

      - -
      -static void app_control(app_control_h app_control, void *user_data) 
      -{
      -   struct appdata *ad = (struct appdata *)user_data;
      -   char *operation;
      -   char *mime;
      -   app_control_h reply;
      -   char *app_id;
      - 
      -   app_control_get_operation(app_control, &operation);
      - 
      -   if (!strcmp(operation, APP_CONTROL_OPERATION_CREATE_CONTENT)) 
      -   {
      -      app_control_get_mime(app_control, &mime);
      - 
      -      if (!strcmp(mime, "text/plain")) 
      -      {
      -         app_control_create(&reply);
      - 
      -         app_get_app_id(&app_id);
      -         app_control_add_extra_data(reply, APP_CONTROL_DATA_SELECTED, app_id);
      -         app_control_reply_to_launch_request(reply, app_control, APP_CONTROL_RESULT_SUCCEEDED);
      - 
      -         app_control_destroy(reply);
      -      }
      -   }
      -}
      -
      - -

      Exporting AppControl Functionality

      -

      You can export functionalities of your application to be used in another application. However, if the other application uses the application control functionality implicitly without the - application ID, it must declare the application control information in its manifest file:

      -
      -<app-control>
      -   <mime name="application/xhtml+xml"/>
      -   <operation name="http://tizen.org/appcontrol/operation/view"/>
      -   <uri name="http://test.com"/>
      -</app-control>
      -<app-control>
      -   <operation name="http://tizen.org/appcontrol/operation/call"/>
      -</app-control>
      -
      -

      - The resolution filter is used when resolving the application control. Each entry of the resolution filter has the <app-control> - element and forms an application resolution unit. The additional URI or MIME type information must contain the associated operation ID, and the retrieved application control must have the specified - application ID and operation ID when resolving the application control. -

      -

      - You can specify the application control information of your application in the application project settings in the IDE; an - operation ID must be specified for the application control. -

      - -

      Using Platform Application Controls

      - -

      Tizen provides base applications, such as Web browser, image viewer, music player, and video player. Using the App Control module (in mobile and wearable applications), you can take advantage of the Tizen base application functionalities.

      - -

      The Tizen platform provides the platform application controls for the following base applications:

      -
        -
      • FileManager
      • -
      • ImageViewer
      • -
      • Internet
      • -
      • MusicPlayer
      • -
      • VideoPlayer
      • -
      -

      The following table defines the details of each platform application control.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - Table: Tizen base application services -
      ServiceOperationSchemeMIME
      Browsing a Web pagehttp://tizen.org/appcontrol/operation/view -
        -
      • http
      • -
      • https
      • -
      -
      -
      Displaying an image -
        -
      • file
      • -
      • http
      • -
      • https
      • -
      -
      -
        -
      • image/bmp
      • -
      • image/gif
      • -
      • image/jpeg
      • -
      • image/png
      • -
      -
      Playing a sound filefile -
        -
      • audio/aac
      • -
      • audio/amr
      • -
      • audio/mp3
      • -
      • audio/wav
      • -
      -
      Playing a video file -
        -
      • video/mp4
      • -
      • video/3gpp
      • -
      -
      Selecting a filehttp://tizen.org/appcontrol/operation/pick -
        -
      • */*
      • -
      • image/*
      • -
      • video/*
      • -
      • audio/*
      • -
      -
      - - - - - - - - - - - -
      Note
      Tizen provides support for the defined MIME types of the base application services depending on the platform implementation.
      - - - - -

      Handling Alarms

      - -

      The Alarm API (in mobile and wearable applications) provides functions to launch an application at a specific time. The mechanism involved in launching the application is the App Control API (in mobile and wearable applications).

      -

      The AppControl API allows launching an application explicitly, giving its package name, or providing certain criteria that the application must meet. For example, the criteria can include the type of data on which the application must be able to operate. The structure containing the criteria is called an appcontrol.

      -

      For more information, see the Launching Applications guide.

      - +

      Managing Application States and Transitions

      The Tizen native application can be in one of several different states. Typically, the application is launched by the user from the Launcher, or by another application. As the application is starting, the app_create_cb() callback is executed and the main event loop starts. The application now normally becomes the frontmost window, with focus. When the application loses the frontmost or focus status, the app_pause_cb() callback is invoked and your application goes into a pause state. The pause state means that the application is not terminated but is running in the background. The application can go into a pause state because:

      @@ -603,7 +152,7 @@ static void app_control(app_control_h app_control, void *user_data)

      When your application starts exiting, the app_terminate_cb() callback is invoked. Your application terminates because:

        -
      • Your application itself requests to exit by calling ui_app_exit() function to terminate the event loop.
      • +
      • Your application itself requests to exit by calling the ui_app_exit() function to terminate the event loop.
      • The Low Memory Killer is killing your application in a low memory situation.

      The application state changes are managed by the underlying framework. The following figure and table illustrate the application states.

      @@ -653,7 +202,7 @@ static void app_control(app_control_h app_control, void *user_data)

      Since Tizen 2.4, the application is not allowed to run on the background except when it is explicitly declared to do so. The following table lists the background categories that allow the application to run on the background.

      - + @@ -670,7 +219,7 @@ static void app_control(app_control_h app_control, void *user_data) - + @@ -709,7 +258,7 @@ static void app_control(app_control_h app_control, void *user_data)    <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">       <icon>rest.png</icon>       <label>rest</label> -      <!-- for API version 2.4 or higher --> +      <!--For API version 2.4 or higher-->       <background-category value="media"/>       <background-category value="download"/>       <background-category value="background-network"/> @@ -726,264 +275,35 @@ static void app_control(app_control_h app_control, void *user_data) - - - - + + + - - - -
      Table: Allowed Background Application PolicyTable: Allowed background application policy
      Background category
      Download Downloading data with the Tizen Download-manager APIDownload API (in mobile and wearable applications)Download API (in mobile applications) download
      Note

      The <background-category> element is supported for the API version equal or higher than 2.4. An application with <background-category> declared may failed to be installed on the devices with Tizen lower than version 2.4. In this case, for those who work on the API version lower than 2.4 should declare the background category in <metadata key="http://tizen.org/metadata/background-category/value"/> if the application should run on the background in the devices of Tizen 2.4 or higher version.

      +	
      The <background-category> element is supported since the API version 2.4. An application with a <background-category> element declared can fail to be installed on devices with a Tizen version lower than 2.4. In this case, declare the background category as <metadata key="http://tizen.org/metadata/background-category/<value>"/>.
      +
       <?xml version="1.0" encoding="utf-8"?>
       <manifest xmlns="http://tizen.org/ns/packages" api-version="2.3" package="org.tizen.test" version="1.0.0">
          <ui-application appid="org.tizen.test" exec="text" type="capp" multiple="false" taskmanage="true" nodisplay="false">
             <icon>rest.png</icon>
             <label>rest</label>
      -      <!-- for API version lower than 2.4 -->
      -      <metadata key="http://tizen.org/metadata/background-category/media"/>
      -      <metadata key="http://tizen.org/metadata/background-category/download"/>
      -      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
      +      <!--For API version lower than 2.4-->
      +      <metadata key="http://tizen.org/metadata/background-category/media"/>
      +      <metadata key="http://tizen.org/metadata/background-category/download"/>
      +      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
          </ui-application>
          <service-application appid="org.tizen.test-service" exec="test-service" multiple="false" type="capp"/>
      -      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
      -      <metadata key="http://tizen.org/metadata/background-category/location"/>
      +      <metadata key="http://tizen.org/metadata/background-category/background-network"/>
      +      <metadata key="http://tizen.org/metadata/background-category/location"/>
          </service-application>
       </manifest>
      -

      <metadata key="http://tizen.org/metadata/bacgkround-category/value"/> has no effect on Tizen 2.3 devices, but has same effects with <background-category> declared on Tizen 2.4 or higher devices.

      -
      -

      The background category of your application can be specified in the -application project settings in the IDE.

      - -

      Localizing Application Strings

      -

      Tizen provides localized resources to make your application usable for different countries. The localization is based on the Internationalization API (in mobile and wearable applications), which makes strings translatable and places them in .po (portable object) files.

      - - - - - - - - - - -
      Note

      The .po files must be placed in the res/po directory of the application. The files can be edited using the PO File Editor provided by the Tizen SDK.

      - -

      Depending on the device's locale information, your application must load the proper resource set. If no matching resource set is found for the device's current locale, the default resource set is used.

      - -

      To get the localized value of a string, use the MsgID shown in the PO File Editor, prefaced with an underscore _ (for example, _(<MsgID>)). The underlying implementation calls the i18n_get_text() function to retrieve the localized value:

      - -
      -char *hello_text = i18n_get_text("Hello");
      -
      -

      The hello_text variable is set to the localized text for "Hello" for the current locale of the device.

      -

      When you change the language setting on the device, the text changes in the application according to the current language.

      - -

      Marking Text Parts as Translatable

      -

      The most common way to use a translation involves the following APIs:

      - -
      -elm_object_translatable_text_set(Evas_Object *obj, const char *text)
      -elm_object_item_translatable_text_set(Elm_Object_Item *it, const char *text)
      -
      - -

      They set the untranslated string for the "default" part of the given Evas_Object or Elm_Object_Item and mark the string as translatable.

      - -

      Similar functions are available if you wish to set the text for a part that is not "default":

      - -
      -elm_object_translatable_part_text_set(Evas_Object *obj, const char *part, const char *text)
      -elm_object_item_translatable_part_text_set(Elm_Object_Item *it, const char *part, const char *text)
      -
      - -

      It is important to provide the untranslated string to these functions, because the EFLs trigger the translation themselves and re-translate the strings automatically, if the system language changes.

      - - -

      Translating Texts Directly

      - -

      The approach described in the previous section is not applicable all of the time. For instance, it does not work if you are populating a genlist, if you need plurals in the translation or if you want to do something else than put the translation in elementary UI components.

      - -

      It is possible to retrieve the translation for a given text through the i18n_get_text() function from app_i18n.h.

      - -
      -char *i18n_get_text(const char *msgid);
      -
      - -

      This function takes as input a string (that is copied to an msgid field in the .po files) and returns the translation (the corresponding msgstr field).

      - - - - - - - - - - -
      Note
      Do not modify or free the return value of these functions. They are statically allocated.
      - -

      When giving the text for a genlist item, you can use it in a similar manner as in the example below.

      - -
      -#include "app_i18n.h"
      -static char *_genlist_text_get(void *data, Evas_Object *obj, const char *part)
      -{
      -   return strdup(i18n_get_text("Some Text"));
      -}
      -
      - -

      Plurals

      -

      Plurals are handled through the ngettext() function. Its prototype is shown below.

      - -
      -char *ngettext(const char *msgid, const char *msgid_plural, unsigned long int n);
      -
      - -
        -
      • msgid is the same as before, that is, the untranslated string
      • -
      • msgid_plural is the plural form of msgid
      • -
      • the quantity (in English, 1 is singular and anything else is plural)
      • -
      - -

      A matching fr.po file contains the following lines.

      - -
      -msgid "%d Comment"
      -msgid_plural "%d Comments"
      -msgstr[0] "%d commentaire"
      -msgstr[1] "%d commentaires"
      -
      - -

      Several Plurals

      -

      It is possible to have several plural forms. For instance, the .po file for Polish could contain the following lines.

      - -
      -msgid "%d Comment"
      -msgid_plural "%d Comments"
      -msgstr[0] "%d Komentarz"
      -msgstr[1] "%d Komentarze"
      -msgstr[2] "%d Komentarzy"
      -
      - -

      The index values after msgstr are defined in system-wide settings. The ones for Polish are given below:

      - -
      -"Plural-Forms: nplurals = 3; plural = n = = 1 ? 0 : n%10> = 2 && n%10< = 4 && (n%100<10 | | n%100> = 20) ? 1 : 2;\n"
      -
      - -

      There are three forms (including singular). The index is 0 (singular), if the given integer n is 1. Then, if (n % 10 >= 2 && % 10 <= 4 && (n % 100 < 10 | | n % 100 >= 20), the index is 1, otherwise it is 2.

      - -

      Handling Language Changes at Runtime

      - -

      The user can change the system language settings at any time. When that is done, the framework notifies the application, which changes the language used in the Elementary. The UI components receive a "language,changed" signal and reset their text.

      - -

      This is how to handle the framework event:

      - -
      -static void
      -_app_language_changed(void *data)
      -{
      -   char *language;
      -   // Retrieve the current system language
      -   system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language);
      -   // Set the language in elementary
      -   elm_language_set(language);
      -   free(language);
      -}
      -int
      -main(int argc, char *argv[])
      -{
      -   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &ad);
      -}
      -
      - -

      The call to elm_language_set() above triggers the emission of the "language,changed" signal, which is handled the same way as the typical smart event signals.

      - -

      Extracting Messages for Translation

      - -

      The xgettext tool extracts strings to translate to a .pot file (po template), while msgmerge maintains the existing .po files. The typical workflow is as follows:

      -
        -
      • run xgettext once; it generates a .pot file
      • -
      • when adding a new translation, copy the .pot file to <locale>.po and translate that file
      • -
      • new runs of xgettext update the existing .pot file and msgmerge updates the .po files
      • -
      - -

      The following example is a typical call to xgettext.

      - -
      -xgettext --directory = src --output-dir = res/po --keyword = _ --keyword = N_ --keyword = elm_object_translatable_text_set:2 --keyword = elm_object_item_translatable_text_set:2 --add-comments = --from-code = utf-8 --foreign-use
      -
      - -

      This extracts all strings that are used inside the _() function (as an optional short-hand for i18n_get_text()), use UTF-8 as the encoding and add the comments right before the strings to the output files).

      - -

      The following example is a typical call to msgmerge.

      - -
      -msgmerge --width=120 --update res/po/fr.po res/po/ref.pot
       
      +

      The <metadata key="http://tizen.org/metadata/bacgkround-category/<value>"/> element has no effect on Tizen 2.3 devices, but, in Tizen 2.4 or higher devices, it has the same effect as the <background-category> element.

      + + + + -

      Internationalization Tips

      - -

      Do Not Make Assumptions about Languages

      - -

      Languages vary greatly and even if you knew several of them, do not assume there is any common logic to them.

      - -

      For example, with English typography, no character must appear before colons and semicolons (':' and ';'). However, with French typography, there must be "espace fine insécable", that is, a non-breakable space (HTML's &nbsp;) that is narrower that regular spaces.

      - -

      This prevents proper translation in the following construct:

      - -
      -snprintf(buf, some_size, "%s: %s", i18n_get_text(error), i18n_get_text(reason));
      -
      - -

      The correct way to translate it is to use a single string and let the translators manage the punctuation. This means translating the format string instead:

      - -
      -snprintf(buf, some_size, i18n_get_text("%s: %s"), i18n_get_text(error), i18n_get_text(reason));
      -
      - -

      It is not always possible, but aim for this unless a specific issue arises.

      - -

      Translations Are of Different Lengths

      -

      Depending on the language, the translation has a different length on screen. In some cases, a language has a shorter construct than another, while the situation is reversed in another case; a language may have a word for a specific concept, while another does not and requires a circumlocution (designating something by using several words).

      - -

      For Source Control, Do Not Commit .po If Only Line Indicators Have Changed

      - -

      From the example above, a translation block looks like:

      - -
      -#: some_file.c:43 another_file.c:41
      -msgid "Click Here"
      -msgstr "Cliquez ici"
      -
      - -

      In case you insert a new line at the top of "some_file.c", the line indicator changes to look like this:

      - -
      -#: some_file.c:44 another_file.c:41
      -
      - -

      Obviously, on non-trivial projects, such changes often happen. If you use source control and commit such changes even though no actual translation change has happened, each commit probably contains a change to .po files. This hampers readability of the change history, and in case several people are working in parallel and need to merge their changes, this creates huge merge conflicts each time.

      - -

      Only commit changes to .po files when there are actual translation changes, not because line comments have changed.

      - -

      Using _() as Shorthand to the i18n_get_text() Function

      - -

      Since calling i18n_get_text() may often happen, it is abbreviated to _(). The Tizen SDK provides this abbreviation by default.

      - -

      Proper Sorting: strcoll()

      -

      There is a string comparison tailored for sorting data for display: strcoll(). It works the same way as strcmp() but sorts the data according to the current locale settings.

      - -
      -int strcmp(const char *s1, const char *s2);
      -int strcoll(const char *s1, const char *s2);
      -
      - -

      The function prototype is a standard one and indicates how to order strings. A detailed explanation is out of scope for this guide, but use the strcoll() function as the comparison function for sorting the data set you are using.

      - -

      Working with Translators

      -

      The system described above is a common one and is likely to be known to translators, meaning that giving its name (gettext) may be enough to explain how it works. In addition to this documentation, there is extensive additional documentation as well as questions and answers on the topic in the Internet.

      - -

      Do not hesitate to put comments in your code above the strings to be translated, since they can be extracted along with the strings and saved in the .po files for the translator to see them.

      +

      The background category of your application can be specified in the +application project settings in the IDE.

      @@ -1007,4 +327,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/badge_n.htm b/org.tizen.guides/html/native/app/badge_n.htm index 2fd179d..29438c0 100644 --- a/org.tizen.guides/html/native/app/badge_n.htm +++ b/org.tizen.guides/html/native/app/badge_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -34,13 +34,12 @@

      Badge

      A badge is an image displayed on the application icon, which informs the user about notifications and events.

      -

      Figure: Badge

      -

      Badge

      -

      To create a badge, use the badge_new() method. The application that creates the badge can also update and remove it. When applications are signed with the same certificate, they can control each other's badges.

      If an application not signed with the same certificate must be allowed manage a badge, use the badge_new() method with a writable application ID. The writable application ID enables another application to control your application to manage the badge. You can also configure your application to handle the badge itself.

      +

      Figure: Badge

      +

      Badge

      diff --git a/org.tizen.guides/html/native/app/bundle_n.htm b/org.tizen.guides/html/native/app/bundle_n.htm index 513de53..59db5c8 100644 --- a/org.tizen.guides/html/native/app/bundle_n.htm +++ b/org.tizen.guides/html/native/app/bundle_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.guides/html/native/app/common_appcontrol_n.htm b/org.tizen.guides/html/native/app/common_appcontrol_n.htm new file mode 100644 index 0000000..9542403 --- /dev/null +++ b/org.tizen.guides/html/native/app/common_appcontrol_n.htm @@ -0,0 +1,1701 @@ + + + + + + + + + + + + + Common Application Controls + + + + + +
      +

      Common Application Controls

      + +

      The following sections introduce the common application controls provided by the Tizen base applications.

      + +

      Browser

      + +

      Performing a Web Search

      + +

      To find what you are looking for on the Web, use the APP_CONTROL_OPERATION_SEARCH operation.

      +

      Figure: Performing a Web search

      +

      Performing a Web search

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SEARCH

      + +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TEXTThe text to search. This key must be passed as a string.This key is mandatory.
      + +

      Example Code

      +
      +app_control_h app_control;
      +app_control_create(&app_control);
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_SEARCH);
      +app_control_add_extra_data(app_control, APP_CONTROL_DATA_TEXT, "tizen");
      +
      +app_control_send_launch_request(app_control, NULL, NULL);
      +app_control_destroy(app_control);
      +
      + +

      Loading a Web Page

      + +

      To open a web page, use the APP_CONTROL_OPERATION_VIEW operation and specify the Web URL in the URI.

      +

      Figure: Loading a Web page

      +

      Loading a Web page

      + +

      Operation

      +

      APP_CONTROL_OPERATION_VIEW

      +

      URI (Mandatory)

      +
        +
      • http:<path>
      • +
      • https:<path>
      • +
      • file:<path>
      • +
      • javascript:<path>
      • +
      +

      MIME Type (Optional)

      +
        +
      • image/svg+xml
      • +
      • text/html
      • +
      • application/xml
      • +
      • application/xhtml+xml
      • +
      • text/plain
      • +
      + +

      Example Code

      +
      +app_control_h app_control;
      +app_control_create(&app_control);
      +app_control_set_operation(app_control, APP_CONTROL_OPERATION_VIEW);
      +app_control_set_uri(app_control, "https://www.tizen.org");
      +
      +app_control_send_launch_request(app_control, NULL, NULL);
      +app_control_destroy(app_control);
      +
      + +

      Calendar

      + +

      Adding a Calendar Event

      + +

      To add a new event to the user's calendar, use the APP_CONTROL_OPERATION_ADD operation with the application/vnd.tizen.calendar MIME type. To specify various event details, refer to the extras defined below.

      + +

      Figure: Adding a calendar event

      +

      Adding a calendar event

      + +

      Operation

      +

      APP_CONTROL_OPERATION_ADD

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.calendar

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_CALENDAR_ALLDAYThe string to indicate if an event applies to all day. Available values are true or false. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_CALENDAR_START_TIMEThe start time of the event (format: YYYY-MM-DD HH:MM:SS). This key must be passed as a string.
      APP_CONTROL_DATA_CALENDAR_END_TIMEThe end time of the event (format: YYYY-MM-DD HH:MM:SS). This key must be passed as a string.
      APP_CONTROL_DATA_TITLEThe title of the event. This key must be passed as a string.
      APP_CONTROL_DATA_TEXTThe description of the event. This key must be passed as a string.
      +

      Extra Output

      + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_IDThe database record ID of the event (ID in the _calendar_event view). This key must be passed as a string.
      + +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_ADD);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TITLE, "Meeting with Jason");
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Editing a Calendar Event

      + +

      To edit an existing event in the user's calendar, use the APP_CONTROL_OPERATION_EDIT operation with the application/vnd.tizen.calendar MIME type. To specify various event details, refer to the extras defined below.

      + +

      Figure: Editing a calendar event

      +

      Editing a calendar event

      + +

      Operation

      +

      APP_CONTROL_OPERATION_EDIT

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.calendar

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_IDThe database record ID of the event (ID in the _calendar_event view). This key must be passed as a string.This key is mandatory.
      APP_CONTROL_DATA_CALENDAR_ALLDAYThe string to indicate if an event applies to all day. Available values are true or false. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_CALENDAR_START_TIMEThe start time of event (format: YYYY-MM-DD HH:MM:SS). This key must be passed as a string.
      APP_CONTROL_DATA_CALENDAR_END_TIMEThe end time of event (format: YYYY-MM-DD HH:MM:SS). This key must be passed as a string.
      APP_CONTROL_DATA_TITLEThe title of event. This key must be passed as a string.
      APP_CONTROL_DATA_TEXTThe description of event. This key must be passed as a string.
      +

      Extra Output

      + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_IDThe database record ID of the event (ID in the _calendar_event view). This key must be passed as a string.
      +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_EDIT);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_ID, "42");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TITLE, "Meeting with Jason");
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Viewing a Calendar Event

      + +

      To display a specified event in the user's calendar, use the APP_CONTROL_OPERATION_VIEW operation with the application/vnd.tizen.calendar MIME type. To specify various event details, refer to the extras defined below.

      +

      In case of viewing an event from a VCalendar file, the file path URI and text/x-vcalendar MIME type must be specified. In case of viewing an event by an event ID, the event ID (ID in the _calendar_event view) extra data and application/vnd.tizen.calendar MIME type must be specified.

      + +

      Figure: Viewing a calendar event

      +

      Viewing a calendar event

      + +

      Operation

      +

      APP_CONTROL_OPERATION_VIEW

      +

      URI

      +

      file:<path>

      +

      For example: file://<media storage path>/file.vcs

      +

      MIME Type

      +
        +
      • application/vnd.tizen.calendar
      • +
      • text/x-vcalendar
      • +
      +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_IDThe database record ID of the event (ID in the _calendar_event view). This key must be passed as a string.This key is mandatory when the MIME type is set to application/vnd.tizen.calendar.
      +

      Example Code

      +
      +// To view a calendar event from a vcs file
      +app_control_h service;
      +app_control_create(&service);
      +app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
      +app_control_set_uri(service, "file://<app's shared path>/Calendar3.vcs");
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_destroy(service);
      +
      +// To view a calendar event from a calendar event ID
      +app_control_h service;
      +app_control_create(&service);
      +app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
      +app_control_set_mime(service, "application/vnd.tizen.calendar");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_ID, "42");
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_destroy(service);
      +
      + +

      Selecting a Calendar Event

      + +

      To select a specified event in the user's calendar, use the APP_CONTROL_OPERATION_PICK operation with the application/vnd.tizen.calendar MIME type. To specify various event details, refer to the extras defined below.

      +

      Figure: Selecting a calendar event

      +

      Selecting a calendar event

      + +

      Operation

      +

      APP_CONTROL_OPERATION_PICK

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.calendar

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TYPEThe type of items to be delivered. The available values are id and vcs (id is the default, if not presented). This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_SELECTION_MODEThe selection mode of the PICK operation. The available values are single and multiple (single is the default, if not presented). This key must be passed as a string.
      APP_CONTROL_DATA_TOTAL_COUNTThe total number of events to be returned. This key must be passed as a string.
      +

      Extra Output

      + + + + + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_TYPEThe type of items to be delivered. The available values are id and vcs. This key must be passed as a string.
      APP_CONTROL_DATA_SELECTEDThe database record ID of the event (ID in the _calendar_event view) or the paths of the vcs files. This key must be passed as an array.
      +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_PICK);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TYPE, "id");
      +app_control_add_extra_data(service, APP_CONTROL_ SELECTION_MODE, "single");
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Call

      + +

      Making a Phone Call

      +

      To directly initiate a phone call, use the APP_CONTROL_OPERATION_CALL operation with a phone number URI scheme.

      +

      Figure: Making a phone call

      +

      Making a phone call

      + +

      Operation

      +

      APP_CONTROL_OPERATION_CALL

      +

      To request this operation, the http://tizen.org/privilege/call privilege is needed.

      +

      URI (Mandatory)

      +

      tel:<number>

      +

      For example: tel:+821234567890

      +

      Code Example

      +
      +void 
      +launchCall()
      +{
      +   app_control_h request = NULL;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_CALL);
      +   app_control_set_uri(request, "tel:+380665554433");
      +
      +   app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +}
      +
      + + +

      Launching a Call Application with a Phone Number

      + +

      To open a call application and display a predefined a phone number, use the APP_CONTROL_OPERATION_DIAL action with a phone number URI scheme. When the call application opens, it displays the phone number, but the user must press the Call button to initiate the phone call.

      +

      Figure: Launching a Call application

      +

      Launching a Call application

      + +

      Operation

      +

      APP_CONTROL_OPERATION_DIAL

      +

      URI (Optional)

      +

      tel:<number>

      +

      For example: tel:+821234567890

      +

      Example Code

      +
      +void 
      +launchCall()
      +{
      +   app_control_h request = NULL;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_DIAL);
      +   app_control_set_uri(request "tel:+380665554433");
      +
      +   app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +}
      +
      + + +

      Contact

      + +

      Adding a Contact

      + +

      To add a new contact, use the APP_CONTROL_OPERATION_ADD operation with the application/vnd.tizen.contact MIME type. To specify various contact details, refer to the extras defined below.

      +

      Figure: Adding a contact

      +

      Adding a contact

      + +

      Operation

      +

      APP_CONTROL_OPERATION_ADD

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.contact

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_PHONEThe phone number. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_EMAILThe email address. This key must be passed as a string.
      APP_CONTROL_DATA_URLThe homepage URL. This key must be passed as a string.
      APP_CONTROL_DATA_NAMEThe contact's name. This key must be passed as a string.
      +

      Extra Output

      + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_IDThe database record ID of the added person (ID in the _contacts_person view). This key must be passed as a string.
      +

      Example Code

      +
      +int 
      +launchContactCreate(const char *number)
      +{
      +   app_control_h request;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_ADD);
      +   app_control_set_mime(request, "application/vnd.tizen.contact");
      +
      +   if (number) 
      +   {
      +      app_control_add_extra_data(request, APP_CONTROL_DATA_PHONE, number);
      +   }
      +
      +   app_control_set_launch_mode(request, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +   int result = app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +
      +   return result;
      +}
      +
      + + +

      Editing a Contact

      + +

      To edit a known contact, use the APP_CONTROL_OPERATION_EDIT operation with the application/vnd.tizen.contact MIME type. To specify various contact details, refer to the extras defined below.

      + +

      Figure: Editing a contact

      +

      Editing a contact

      + +

      Operation

      +

      APP_CONTROL_OPERATION_EDIT

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.contact

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_IDThe database record ID of the person to be edited (ID in the _contacts_person view). This key must be passed as a string.This key is mandatory.
      APP_CONTROL_DATA_PHONEThe phone number that is added to the contact. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_EMAILThe email address that is added to the contact. This key must be passed as a string.
      APP_CONTROL_DATA_URLThe homepage URL that is added to the contact. This key must be passed as a string.
      + +

      Extra Output

      + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_IDThe database record ID of the person to be edited (ID in the _contacts_person view). This key must be passed as a string.
      +

      Example Code

      +
      +int 
      +launchContactEdit(const char* personId, const char *number)
      +{
      +   app_control_h request;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_EDIT);
      +   app_control_set_mime(request, "application/vnd.tizen.contact");
      +
      +   app_control_add_extra_data(request, APP_CONTROL_DATA_ID, personId);
      +	
      +   if (number) 
      +   {
      +      app_control_add_extra_data(request, APP_CONTROL_DATA_PHONE, number);
      +   }
      +
      +   app_control_set_launch_mode(request, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +   int result = app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +
      +   return result;
      +}
      +
      + +

      Viewing a Contact

      + +

      To display a specified contact in the contact database, use the APP_CONTROL_OPERATION_VIEW operation with the application/vnd.tizen.contact MIME type. To specify various contact details, refer to the extras defined below.

      +

      In case of viewing a contact from a vcard file, the file path URI and text/vcard or text/x-vcard MIME type must be specified. In case of viewing a contact by a person ID, the person ID (ID in the _contact_person view) extra data and application/vnd.tizen.contact MIME type must be specified.

      + +

      Figure: Viewing a contact

      +

      Viewing a contact Viewing a contact

      + +

      Operation

      +

      APP_CONTROL_OPERATION_VIEW

      +

      URI

      +

      file:<path>

      +

      MIME Type

      +
        +
      • application/vnd.tizen.contact
      • +
      • text/vcard
      • +
      • text/x-vcard
      • +
      +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_IDThe database record ID of the edited person (ID in the _contacts_person view). This key must be passed as a string.This key is mandatory when the MIME type is set to application/vnd.tizen.contact.
      + +

      Example Code

      +
      +int 
      +launchContactDetails(const char* personId)
      +{
      +   app_control_h request;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_VIEW);
      +   app_control_set_mime(request, "application/vnd.tizen.contact");
      +   app_control_add_extra_data(request, APP_CONTROL_DATA_ID, personId);
      +
      +   app_control_set_launch_mode(request, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +   int result = app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +
      +   return result;
      +}
      +
      +int launchViewVcard(const char *uri)
      +{
      +   app_control_h request;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_VIEW);
      +   app_control_set_mime(request, "text/vcard");
      +   app_control_set_uri(request, uri);
      +
      +   app_control_set_launch_mode(request, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +   int result = app_control_send_launch_request(request, NULL, NULL);
      +   app_control_destroy(request);
      +
      +   return result;
      +}
      +
      + +

      Selecting a Contact

      + +

      To select a specified contact in the user's contacts, use the APP_CONTROL_OPERATION_PICK operation with the application/vnd.tizen.contact MIME type. To specify various contact details, refer to the extras defined below.

      + +

      Figure: Selecting a contact

      +

      Selecting a contact

      + +

      Operation

      +

      APP_CONTROL_OPERATION_PICK

      +

      MIME Type (Mandatory)

      +

      application/vnd.tizen.contact

      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_SELECTION_MODEThe selection mode of the PICK operation. The available values are single and multiple (single is the default, if not presented). This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_TYPEThe type of items to be delivered. The available values are id, phone, email, and vcf (id is the default, if not presented). This key must be passed as a string.
      APP_CONTROL_DATA_TOTAL_COUNTThe total number of events to be returned. This key must be passed as a string.
      +

      Extra Output

      + + + + + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_TYPEThe type of items to be delivered. The available values are id, phone, email, and vcf. This key must be passed as a string.
      APP_CONTROL_DATA_SELECTEDThe extra field to get the return information. The content of this key depends on its type: +
        +
      • id – The database record ID of the selected person (ID in the _contacts_person view).
      • +
      • phone – The database record ID of the number of the selected person (ID in the _contacts_number view).
      • +
      • email – The database record ID of the email of the selected person (ID in the _contacts_email view).
      • +
      • vcf – The path to the vCard file.
      • +
      +

      This key must be passed as an array.

      +
      + +

      Example Code

      +
      +int 
      +launchContactPick(const char *selectionMode, const char *resultType,
      +                  app_control_reply_cb replyCallback, void *userData)
      +{
      +   app_control_h request;
      +   app_control_create(&request);
      +   app_control_set_operation(request, APP_CONTROL_OPERATION_PICK);
      +   app_control_set_mime(request, "application/vnd.tizen.contact");
      +
      +   app_control_add_extra_data(request, APP_CONTROL_DATA_SELECTION_MODE, selectionMode);
      +   app_control_add_extra_data(request, APP_CONTROL_DATA_TYPE, resultType);
      +
      +   int result = app_control_send_launch_request(request, replyCallback, userData);
      +   app_control_destroy(request);
      +
      +   return result;
      +}
      +
      + +

      Email

      + +

      Composing an Email

      + +

      To launch an email composer with optional recipients, subject, and body text, use the APP_CONTROL_OPERATION_COMPOSE operation.

      + +

      Figure: Composing an email

      +

      Composing an email

      + +

      Operation

      +

      APP_CONTROL_OPERATION_COMPOSE

      +

      URI (Optional)

      +

      mailto:<email address>

      +

      If the mailto: field is empty, it filters out all but email applications in the system, and you can use the extra data only to pass optional parameters.

      + +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TOThe email address list of main recipients, separated by ";".This key is optional.
      APP_CONTROL_DATA_CCThe email address list of secondary (copy) recipients, separated by ";".
      APP_CONTROL_DATA_BCCThe email address list of hidden (blind copy) recipients, separated by ";".
      APP_CONTROL_DATA_SUBJECTThe subject of an email message. This key must be passed as a string.
      APP_CONTROL_DATA_TEXTThe body of the email to be sent. This key must be passed as a string.
      + +

      Example Code

      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_COMPOSE);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TO, "to@test.com");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_CC, "cc@test.com");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_BCC, "bcc@test.com");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_SUBJECT, "test subject");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TEXT, "line1\nline2");
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +app_control_destroy(service);
      +
      + +

      Sharing a Single File in an Email

      + +

      To share a single file of nay MIME type in an email message, use the APP_CONTROL_OPERATION_SHARE operation.

      + +

      Figure: Sharing a single file

      +

      Sharing a single file

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SHARE

      +

      URI (Mandatory)

      +
      • file:<full path to file> or <full path to file> (no scheme) +

        Using a URI with the file: scheme or without any scheme is the default input for this operation. If there is such a URI, all extra data is ignored.

      • +
      • mailto: +

        Only an empty mailto: field is allowed. It filters out all but email applications in the system.

      • +
      + +

      MIME Type (Optional)

      +

      Any MIME type that your application needs, such as image/jpg, video/*, or */*

      + +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_PATHWhen the URI is set to mailto, a path to a single file to be shared must be provided using this key. Otherwise, the key is ignored. This key must be passed as a string.This key is mandatory when the URI is set to mailto.
      + +

      Example Code

      +
      +#define PATH_MAX 128
      +
      +char *shared_res_path = app_get_shared_resource_path();
      +char img_path[PATH_MAX] = {0,};
      +snprintf(img_path, PATH_MAX, "%s/image.jpg", shared_res_path);
      +free(shared_res_path);
      +
      +app_control_h service;
      +app_control_create(&service);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +app_control_set_operation(service, APP_CONTROL_OPERATION_SHARE);
      +app_control_set_uri(service, "mailto:");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_PATH, img_path);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_destroy(service);
      +
      + +

      Sharing Multiple Items in an Email

      + +

      To share multiple files of any MIME type in an email message, use the APP_CONTROL_OPERATION_MULTI_SHARE operation.

      + +

      Figure: Sharing multiple items

      +

      Sharing multiple items

      + +

      Operation

      +

      APP_CONTROL_OPERATION_MULTI_SHARE

      +

      URI (Optional)

      +

      mailto:

      +

      Only an empty mailto: field is allowed. It filters out all but email applications in the system.

      + +

      MIME Type (Optional)

      +

      Any MIME type that your application needs, such as image/jpg, video/*, or */*

      + +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_PATHThe list of multiple file paths to be shared in an email message. This key must be passed as an array.This key is mandatory.
      + +

      Example Code

      +
      +#define PATH_MAX 128
      +
      +char *shared_res_path = app_get_shared_resource_path();
      +char img1_path[PATH_MAX] = {0,};
      +char img2_path[PATH_MAX] = {0,};
      +const char *path_array[2] = {img1_path, img2_path};
      +snprintf(img1_path, PATH_MAX, "%s/image.jpg", shared_res_path);
      +snprintf(img2_path, PATH_MAX, "%s/image2.jpg", shared_res_path);
      +free(shared_res_path);
      +
      +app_control_h service;
      +app_control_create(&service);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +app_control_set_operation(service, APP_CONTROL_OPERATION_MULTI_SHARE);
      +app_control_set_uri(service, "mailto:");
      +app_control_add_extra_data_array(service, APP_CONTROL_DATA_PATH, path_array, 2);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_destroy(service);
      +
      + +

      Sharing Text in an Email

      + +

      To share any text with an email message, use the APP_CONTROL_OPERATION_SHARE_TEXT operation. You can also define the message subject and a list of file attachments.

      + +

      Figure: Sharing text

      +

      Sharing text

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SHARE_TEXT

      +

      URI (Optional)

      +

      mailto:

      +

      Only an empty mailto: field is allowed. It filters out all but email applications in the system.

      + + +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TEXTThe body of the message to be sent. This key must be passed as a string.This key is mandatory.
      APP_CONTROL_DATA_SUBJECTThe subject of an email message. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_PATHThe list of multiple file paths to be shared in an email message. This key must be passed as an array.
      + +

      Example Code

      +
      +#define PATH_MAX 128
      +
      +char *shared_res_path = app_get_shared_resource_path();
      +char img1_path[PATH_MAX] = {0,};
      +char img2_path[PATH_MAX] = {0,};
      +const char *path_array[2] = {img1_path, img2_path};
      +snprintf(img1_path, PATH_MAX, "%s/image.jpg", shared_res_path);
      +snprintf(img2_path, PATH_MAX, "%s/image2.jpg", shared_res_path);
      +free(shared_res_path);
      +
      +app_control_h service;
      +app_control_create(&service);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +app_control_set_operation(service, APP_CONTROL_OPERATION_SHARE_TEXT);
      +app_control_set_uri(service, "mailto:");
      +app_control_add_extra_data_array(service, APP_CONTROL_DATA_PATH, path_array, 2);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_SUBJECT, "test subject");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TEXT, "line1\nline2");
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +app_control_destroy(service);
      +
      + +

      Map

      + +

      Showing a Location on a Map

      + +

      To open a map to show a location, use the APP_CONTROL_OPERATION_VIEW operation with an URI. To specify various map details, refer to the extras defined below.

      + + +

      Operation

      +

      APP_CONTROL_OPERATION_VIEW

      +

      URI (Mandatory)

      +
      • geo:latitude,longitude +

        Show the map with 2 values that represent the latitude and longitude. For example: geo:50.1,-50.1

      • +
      • geo:0,0?q=keyword +

        Show the map at the location of a given keyword (address or POI). For example: geo:0,0?q="Eiffel Tower"

      • +
      +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TYPEThe type of the keyword, in case the URI contains a keyword. The available values are address and poi (poi is the default, if not presented).This key is mandatory only when the location URI is given as a keyword.
      + +

      Example Code

      +
      +#include <app_control.h>
      +#include <dlog.h>
      +
      +int 
      +show_maps_operation(void)
      +{
      +   int ret = 0;
      +
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      +   
      +   if (service == NULL)
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      +   
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_VIEW);
      +   app_control_set_uri(service, "geo:50.1,-50.1"); 
      +  
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      +   
      +   if (ret == APP_CONTROL_ERROR_NONE)
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to request!\n");
      +	  
      +      return 0;
      +   }
      +   else
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to request!\n");
      +	  
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      Picking a Location from the Map

      + +

      To pick a location from the map, use the APP_CONTROL_OPERATION_PICK operation. To specify various map details, refer to the extras defined below.

      + + +

      Operation

      +

      APP_CONTROL_OPERATION_PICK

      +

      URI (Optional)

      +

      geo:0,0?q=keyword

      +

      Show the map at the location of a given keyword (address or POI). For example: geo:0,0?q="Eiffel Tower"

      +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TYPEThe type of the keyword. The available values are address and poi (poi is the default, if not presented).This key is optional.
      + +

      Extra Output

      + + + + + + + + + + + + + + + +
      KeyDescription
      APP_CONTROL_DATA_SELECTEDThe address of the selected location. This key must be passed as a string.
      APP_CONTROL_DATA_PATHThe file path of the image showing the selected location. This key must be passed as a string.
      + +

      Example Code

      +
      +#include <app_control.h>
      +#include <dlog.h>
      +
      +int 
      +pick_location_operation(void)
      +{
      +   int ret = 0;
      +
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      +   
      +   if (service == NULL)
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      +   
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_PICK);
      +   app_control_set_uri(service, "geo:0,0?q=”Eiffel Tower");
      +   app_control_set_extra_data(service, APP_CONTROL_DATA_TYPE, "poi");
      +
      +   app_control_send_launch_request(service, pick_reply_cb, NULL);
      +   app_control_destroy(service);
      +
      +   return 0;
      +}
      +
      +void 
      +pick_reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
      +{
      +   char *address = NULL;
      +   char *path = NULL;
      +
      +   if (result == APP_CONTROL_RESULT_SUCCEEDED)
      +   {
      +      app_control_get_extra_data(reply, APP_CONTROL_DATA_SELECTED, &address);
      +      app_control_get_extra_data(reply, APP_CONTROL_DATA_PATH, &path);
      +
      +      dlog_print(DLOG_INFO, LOG_TAG, "Selected address: %s", address);
      +      dlog_print(DLOG_INFO, LOG_TAG, "Map image path: %s", path);
      +
      +      free(address);
      +      free(path);
      +   }
      +}
      +
      + +

      Message

      + +

      Composing a Message

      + +

      To compose a new message, use the APP_CONTROL_OPERATION_COMPOSE operation. To specify various message details, refer to the extras defined below.

      + +

      Figure: Composing a message

      +

      Composing a message

      + +

      Operation

      +

      APP_CONTROL_OPERATION_COMPOSE

      +

      URI (Optional)

      +
      • sms:<phone-number> +

        For example: sms:+17913331234

      • +
      • mmsto:<phone-number> +

        For example: mmsto:+17913331234

      • +
      +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TOThe phone numbers of recipients. This key must be passed as an array.This key is optional.
      APP_CONTROL_DATA_TEXTThe body of the message to be sent. This key must be passed as a string.
      APP_CONTROL_DATA_SUBJECTThe subject of an MMS message. If this value is set for an SMS message, the message is automatically converted to MMS. This key must be passed as a string.
      + +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_COMPOSE);
      +app_control_set_uri(service, "sms:123456789");         
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Sharing a Single Item in a Message

      + +

      To share a single file in an MMS message, use the APP_CONTROL_OPERATION_SHARE operation.

      + +

      Figure: Sharing a single item

      +

      Sharing a single item

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SHARE

      +

      URI (Mandatory)

      +
      • mmsto:<phone-number> +

        For example: mmsto:+17913331234

      • +
      • file:<path> +

        For example: file://<media storage path>/item.jpg

      • +
      + +

      MIME Type (Optional)

      +

      Any MIME type that your application needs, such as image/jpg, video/*, or */*

      + +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_PATHWhen the URI is set to mmsto, a path to a single file to be shared must be provided using this key. Otherwise, the key is ignored. This key must be passed as a string.This key is mandatory when the URI is set to mmsto.
      + +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_SHARE);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_PATH, IMAGE_PATH);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Sharing Multiple Items in a Message

      + +

      To share multiple files in an MMS message, use the APP_CONTROL_OPERATION_MULTI_SHARE operation.

      + +

      Figure: Sharing multiple items

      +

      Sharing multiple items

      + +

      Operation

      +

      APP_CONTROL_OPERATION_MULTI_SHARE

      +

      URI (Optional)

      +

      mmsto:<phone-number>

      +

      For example: mmsto:+17913331234

      + +

      MIME Type (Optional)

      +

      Any MIME type that your application needs, such as image/jpg, video/*, or */*

      + +

      Extra Input

      + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_PATHThe list of multiple file paths to be shared in a multimedia message. This key must be passed as an array.This key is mandatory.
      + +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +const char* paths[] = {IMAGE_PATH1,IMAGE_PATH2};
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_MULTI_SHARE);
      +app_control_add_extra_data_array(service, APP_CONTROL_DATA_PATH, paths, 2);
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Sharing Text in a Message

      + +

      To share any text with an SMS or MSM message, use the APP_CONTROL_OPERATION_SHARE_TEXT operation.

      + +

      Figure: Sharing text

      +

      Sharing text

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SHARE_TEXT

      +

      URI (Optional)

      +
      • sms:<phone-number> +

        For example: sms:+17913331234

      • +
      • mmsto:<phone-number> +

        For example: mmsto:+17913331234

      • +
      + + +

      Extra Input

      + + + + + + + + + + + + + + + + + + + + + + +
      KeyDescriptionNote
      APP_CONTROL_DATA_TEXTThe body of the message to be sent. This key must be passed as a string.This key is mandatory.
      APP_CONTROL_DATA_SUBJECTThe subject of an MMS message. If it is set for an SMS message, the message is automatically converted to MMS. This key must be passed as a string.This key is optional.
      APP_CONTROL_DATA_PATHThe list of multiple file paths to be shared in a multimedia message. This key must be passed as an array.
      + +

      Example Code

      +
      +#include <app_control.h>
      +
      +app_control_h service;
      +app_control_create(&service);
      +
      +app_control_set_operation(service, APP_CONTROL_OPERATION_SHARE_TEXT);
      +app_control_add_extra_data(service, APP_CONTROL_DATA_TEXT, "How are you?");
      +app_control_add_extra_data(service, APP_CONTROL_DATA_SUBJECT, "Hi");
      +app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_GROUP);
      +
      +app_control_send_launch_request(service, NULL, NULL);
      +
      + +

      Settings for Bluetooth

      + +

      Showing Bluetooth Settings to Activate Bluetooth

      + +

      To launch the Bluetooth setting application to allow the user to activate or deactivate Bluetooth, use the APP_CONTROL_OPERATION_SETTING_BT_ENABLE operation.

      + +

      Figure: Showing Bluetooth activation settings

      +

      Showing Bluetooth activation settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING_BT_ENABLE

      + + +

      Example Code

      +
      +#include <app_control.h>
      + 
      +int 
      +bt_enable_operation(void)
      +{
      +   int ret = 0;
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      + 
      +   if (service == NULL) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      + 
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_SETTING_BT_ENABLE);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      + 
      +   if (ret == APP_CONTROL_ERROR_NONE) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to launch!\n");
      +
      +      return 0;
      +   } 
      +   else 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch!\n");
      +
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      Showing Bluetooth Settings to Configure Visibility

      + +

      To launch the Bluetooth setting application to allow the user to configure the visibility of the device, use the APP_CONTROL_OPERATION_SETTING_BT_VISIBILITY operation.

      + +

      Showing location settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING_BT_VISIBILITY

      + + +

      Example Code

      +
      +#include <app_control.h>
      + 
      +int 
      +bt_visibility_operation(void)
      +{
      +   int ret = 0;
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      + 
      +   if (service == NULL) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      + 
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_SETTING_BT_VISIBILITY);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      + 
      +   if (ret == APP_CONTROL_ERROR_NONE) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to launch!\n");
      +
      +      return 0;
      +   } 
      +   else 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch!\n");
      +
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      Settings for Location

      + +

      Showing Location Settings

      + +

      To launch the location setting application to allow the user to configure the source of the location information, use the APP_CONTROL_OPERATION_SETTING_LOCATION operation.

      +

      If the location service is not active when an application tries to use the Location Manager (in mobile or wearable applications) or Geolocation APIs, an error occurs. To solve the problem, the application can try to launch the location setting application to let the user enable the location service. The user can activate the GPS, network positioning using the Wi-Fi Positioning System (WPS) and cellular network, or both.

      +

      Figure: Showing location settings

      +

      Showing location settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING_LOCATION

      + + +

      Example Code

      +
      +int 
      +location_setting(void)
      +{
      +   int ret = 0;
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      + 
      +   if (service == NULL) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      + 
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_SETTING_LOCATION);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      + 
      +   if (ret == APP_CONTROL_ERROR_NONE) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to launch location settings!\n");
      +
      +      return 0;
      +   } 
      +   else 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch location settings!\\n");
      +
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      Settings for NFC

      + +

      Showing NFC Settings

      + +

      To launch the NFC setting application to allow the user to activate or deactivate NFC, use the APP_CONTROL_OPERATION_SETTING_NFC operation.

      +

      Figure: Showing NFC settings

      +

      Showing NFC settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING_NFC

      + + +

      Example Code

      +
      +#include <app_control.h>
      +#include <dlog.h>
      +
      +int 
      +nfc_setting(void)
      +{
      +   int ret = 0;
      +
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      +   
      +   if (service == NULL)
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +	  
      +      return -1;
      +   }
      +   
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_SETTING_NFC);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      +   
      +   if (ret == APP_CONTROL_ERROR_NONE)
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to launch NFC settings app!\n");
      +	  
      +      return 0;
      +   }
      +   else
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch NFC settings app!\n");
      +	  
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      Settings for Wi-Fi

      + +

      Showing Wi-Fi Settings

      + +

      To launch the Wi-Fi setting application to allow the user to activate and configure (or deactivate) Wi-Fi connections, use the APP_CONTROL_OPERATION_SETTING_WIFI operation.

      +

      Figure: Showing Wi-Fi settings

      +

      Showing Wi-Fi settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING_WIFI

      + + +

      Example Code

      +
      +int 
      +wifi_launch_operation(void)
      +{
      +   int ret = 0;
      +   app_control_h service = NULL;
      +	
      +   ret = app_control_create(&service);
      +	 
      +   if (ret != APP_CONTROL_ERROR_NONE || service == NULL) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      +	
      +   app_control_set_operation(service,  APP_CONTROL_OPERATION_SETTING_WIFI);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      +	   
      +   if (ret != APP_CONTROL_ERROR_NONE) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch Wi-Fi setting application");
      +
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + +

      System Settings

      + +

      Showing System Settings

      + +

      To display various setting menus for, for example, Connections, Devices, and System Information, use the APP_CONTROL_OPERATION_SETTING operation.

      +

      Figure: Showing system settings

      +

      Showing system settings

      + +

      Operation

      +

      APP_CONTROL_OPERATION_SETTING

      + + +

      Example Code

      +
      +int 
      +launch_setting(void)
      +{
      +   int ret = 0;
      +   app_control_h service = NULL;
      +   app_control_create(&service);
      + 
      +   if (service == NULL) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to create app control handler");
      +
      +      return -1;
      +   }
      + 
      +   app_control_set_operation(service, APP_CONTROL_OPERATION_SETTING);
      +
      +   ret = app_control_send_launch_request(service, NULL, NULL);
      +   app_control_destroy(service);
      + 
      +   if (ret == APP_CONTROL_ERROR_NONE) 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Succeeded to launch settings!\n");
      +
      +      return 0;
      +   } 
      +   else 
      +   {
      +      dlog_print(DLOG_INFO, LOG_TAG, "Failed to launch settings!\\n");
      +
      +      return -1;
      +   }
      +
      +   return 0;
      +}
      +
      + + + + + + + + +
      + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/data_control_n.htm b/org.tizen.guides/html/native/app/data_control_n.htm index 8adbb73..e61b8a1 100644 --- a/org.tizen.guides/html/native/app/data_control_n.htm +++ b/org.tizen.guides/html/native/app/data_control_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -40,9 +40,6 @@

      Data Control

      Data control is a standard mechanism for exchanging specific data between applications.

      -

      Figure: Data control mechanism

      -

      Data control mechanism

      -

      All applications can request data shared by other applications using a data control. However, only service applications can provide their own data.

      There are 2 types of data controls:

      • DATA_CONTROL_SQL @@ -62,6 +59,9 @@

        Format:

        • Data ID consists of one or more components, separated by a slash ("/") character.
      + +

      Figure: Data control mechanism

      +

      Data control mechanism

      Using Data Controls

      You can get a datacontrol_h instance from the datacontrol_map_create() or datacontrol_sql_create() function.

      diff --git a/org.tizen.guides/html/native/app/event_n.htm b/org.tizen.guides/html/native/app/event_n.htm new file mode 100644 index 0000000..e39ddd7 --- /dev/null +++ b/org.tizen.guides/html/native/app/event_n.htm @@ -0,0 +1,384 @@ + + + + + + + + + + + + + Event + + + + + +
      + +

      Event

      + +

      The application can broadcast its own events to all listeners, and subscribe to events. The events can be either predefined system events from the platform (only platform modules can broadcast system events) or user-defined events (broadcast by UI and service applications).

      + +

      The main features of the Event API are:

      +
        +
      • Event publication +

        To publish an event, use the event_publish_app_event() and event_publish_trusted_app_event() functions. The event_publish_trusted_app_event() function publishes a trusted event which can only be received by the application that has the same signature as the publishing application.

        +
      • + +
      • Event subscription +

        To subscribe to an event, use the event_add_event_handler() function. When no longer needed, unsubscribe the event with the event_remove_event_handler() function.

        +
      • + +
      • Launch-On-Events +

        Service applications can be launched when a desired target event occurs.

        +

        To register an interest in a Launch-On-Event, define the http://tizen.org/appcontrol/operation/launch_on_event operation in the tizen-manifest.xml file.

        + +

        The following table shows the system events that support Launch-On-Event.

        + + + + + + + + + + + + + + + + + + + + + + + + + +
        + Table: System events supporting Launch-On-Event +
        NameCondition
        tizen.system.event.battery_charger_statusWhen the charger state is "connected".
        tizen.system.event.usb_statusWhen the USB state is "connected".
        tizen.system.event.earjack_statusWhen the earjack status is "connected".
        tizen.system.event.incoming_msgWhen the msg_type and msg_id exist.
        +
      • +
      + +

      The following table lists the platform event types.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + Table: Platform event types +
      ModuleCategoryEvent nameEvent dataNotes
      KeyValue
      capi-system-devicebatterytizen.system.event.battery_charger_statusbattery_charger_status"disconnected" +

      "connected"

      +

      "charging"

      +
      tizen.system.event.battery_level_statusbattery_level_status"empty" +

      "critical"

      +

      "low"

      +

      "high"

      +

      "full"

      +
      empty (0~1%) +

      critical (2~5%)

      +

      low (6~15%)

      +

      high (16~95%)

      +

      full (96~100%)

      +
      devicedusbtizen.system.event.usb_statususb_status"disconnected" +

      "connected"

      +

      "available"

      +
      "connected" means that the cable is connected but USB communication is not available.
      earjacktizen.system.event.earjack_statusearjack_status"disconnected" +

      "connected"

      +
      displaytizen.system.event.display_statedisplay_state"normal" +

      "dim"

      +

      "off"

      +
      systemdsystemtizen.system.event.boot_completedboot_completed"true" +

      => send "true" only

      +
      tizen.system.event.system_shutdownsystem_shutdown"true" +

      => send "true" only

      +
      "true": go to shutdown
      resourcedram memorytizen.system.event.low_memorylow_memory"normal" +

      "soft_warning"

      +

      "hard_warning"

      +
      networkconnectivitytizen.system.event.wifi_statewifi_state"deactivated" +

      "disconnected"

      +

      "connected"

      +
      tizen.system.event.bt_statebt_state"on" +

      "off"

      +
      bt_le_state"on" +

      "off"

      +
      bt_transfering_state"non_transfering" +

      "transfering"

      +
      libslp-locationlocationtizen.system.event.location_enable_statelocation_enable_state"disabled" +

      "enabled"

      +
      gps_enable_state"disabled" +

      "enabled"

      +
      nps_enable_state"disabled" +

      "enabled"

      +
      msg-servicemessagetizen.system.event.incoming_msgmsg_type"sms" +

      "push"

      +

      "cb"

      +
      msg_idString of the unsigned int type value. +
      alarm-managertimetizen.system.event.time_changedtime_changed"true" +

      => send "true" only

      +
      settingtimetizen.system.event.time_zonetime_zoneThe value of this key is the time zone value of the time zone database, for example, "Asia/Seoul", "America/New_York". For more information, see the IANA Time Zone Database. +
      localetizen.system.event.hour_formathour_format"12" +

      "24"

      +
      tizen.system.event.language_setlanguage_setThe value of this key is full name of locale, for example, ko_KR.UTF8 in case of Korean and en_US.UTF8 in case of American English. For more information, see the Linux locale information. +
      tizen.system.event.region_formatregion_formatThe value of this key is the full name of the locale, for example, ko_KR.UTF8 in case of the Korean region format and en_US.UTF8 in case of the USA region format. For more information, see the Linux locale information. +
      soundtizen.system.event.silent_modesilent_mode"on" +

      "off"

      +
      vibrationtizen.system.event.vibration_statevibration_state"on" +

      "off"

      +
      screentizen.system.event.screen_autorotate_statescreen_autorotate_state"on" +

      "off"

      +
      mobiletizen.system.event.mobile_data_statemobile_data_state"on" +

      "off"

      +
      tizen.system.event.data_roaming_statedata_roaming_state"on" +

      "off"

      +
      fonttizen.system.event.font_setfont_setThe value of this key is the font name of the string type by font-config. +
      + + + + + + +
      + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/internationalization_n.htm b/org.tizen.guides/html/native/app/internationalization_n.htm new file mode 100644 index 0000000..4b0e451 --- /dev/null +++ b/org.tizen.guides/html/native/app/internationalization_n.htm @@ -0,0 +1,293 @@ + + + + + + + + + + + + + Internationalization + + + + + +
      +

      Internationalization

      + +

      Tizen provides localized resources to make your application usable for different countries. The localization is based on the Internationalization API (in mobile and wearable applications), which makes strings translatable and places them in .po (portable object) files.

      + + + + + + + + + + +
      Note

      The .po files must be placed in the res/po directory of the application. The files can be edited using the PO File Editor provided by the Tizen SDK.

      + +

      Depending on the device's locale information, your application must load the proper resource set. If no matching resource set is found for the device's current locale, the default resource set is used.

      + +

      To get the localized value of a string, use the MsgID shown in the PO File Editor, prefaced with an underscore _ (for example, _(<MsgID>)). The underlying implementation calls the i18n_get_text() function to retrieve the localized value:

      + +
      +char *hello_text = i18n_get_text("Hello");
      +
      +

      The hello_text variable is set to the localized text for "Hello" for the current locale of the device.

      +

      When you change the language setting on the device, the text changes in the application according to the current language.

      + +

      Marking Text Parts as Translatable

      +

      The most common way to use a translation involves the following APIs:

      + +
      +elm_object_translatable_text_set(Evas_Object *obj, const char *text)
      +elm_object_item_translatable_text_set(Elm_Object_Item *it, const char *text)
      +
      + +

      They set the untranslated string for the "default" part of the given Evas_Object or Elm_Object_Item and mark the string as translatable.

      + +

      Similar functions are available if you wish to set the text for a part that is not "default":

      + +
      +elm_object_translatable_part_text_set(Evas_Object *obj, const char *part, const char *text)
      +elm_object_item_translatable_part_text_set(Elm_Object_Item *it, const char *part, const char *text)
      +
      + +

      It is important to provide the untranslated string to these functions, because the EFLs trigger the translation themselves and re-translate the strings automatically, if the system language changes.

      + + +

      Translating Texts Directly

      + +

      The approach described in the previous section is not applicable all of the time. For instance, it does not work if you are populating a genlist, if you need plurals in the translation or if you want to do something else than put the translation in elementary UI components.

      + +

      It is possible to retrieve the translation for a given text through the i18n_get_text() function from app_i18n.h.

      + +
      +char *i18n_get_text(const char *msgid);
      +
      + +

      This function takes as input a string (that is copied to an msgid field in the .po files) and returns the translation (the corresponding msgstr field).

      + + + + + + + + + + +
      Note
      Do not modify or free the return value of these functions. They are statically allocated.
      + +

      When giving the text for a genlist item, you can use it in a similar manner as in the example below.

      + +
      +#include "app_i18n.h"
      +static char *_genlist_text_get(void *data, Evas_Object *obj, const char *part)
      +{
      +   return strdup(i18n_get_text("Some Text"));
      +}
      +
      + +

      Plurals

      +

      Plurals are handled through the ngettext() function. Its prototype is shown below.

      + +
      +char *ngettext(const char *msgid, const char *msgid_plural, unsigned long int n);
      +
      + +
        +
      • msgid is the same as before, that is, the untranslated string
      • +
      • msgid_plural is the plural form of msgid
      • +
      • the quantity (in English, 1 is singular and anything else is plural)
      • +
      + +

      A matching fr.po file contains the following lines.

      + +
      +msgid "%d Comment"
      +msgid_plural "%d Comments"
      +msgstr[0] "%d commentaire"
      +msgstr[1] "%d commentaires"
      +
      + +

      Several Plurals

      +

      It is possible to have several plural forms. For instance, the .po file for Polish could contain the following lines.

      + +
      +msgid "%d Comment"
      +msgid_plural "%d Comments"
      +msgstr[0] "%d Komentarz"
      +msgstr[1] "%d Komentarze"
      +msgstr[2] "%d Komentarzy"
      +
      + +

      The index values after msgstr are defined in system-wide settings. The ones for Polish are given below:

      + +
      +"Plural-Forms: nplurals = 3; plural = n = = 1 ? 0 : n%10> = 2 && n%10< = 4 && (n%100<10 | | n%100> = 20) ? 1 : 2;\n"
      +
      + +

      There are three forms (including singular). The index is 0 (singular), if the given integer n is 1. Then, if (n % 10 >= 2 && % 10 <= 4 && (n % 100 < 10 | | n % 100 >= 20), the index is 1, otherwise it is 2.

      + +

      Handling Language Changes at Runtime

      + +

      The user can change the system language settings at any time. When that is done, the framework notifies the application, which changes the language used in the Elementary. The UI components receive a "language,changed" signal and reset their text.

      + +

      This is how to handle the framework event:

      + +
      +static void
      +_app_language_changed(void *data)
      +{
      +   char *language;
      +   // Retrieve the current system language
      +   system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language);
      +   // Set the language in elementary
      +   elm_language_set(language);
      +   free(language);
      +}
      +int
      +main(int argc, char *argv[])
      +{
      +   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, _app_language_changed, &ad);
      +}
      +
      + +

      The call to elm_language_set() above triggers the emission of the "language,changed" signal, which is handled the same way as the typical smart event signals.

      + +

      Extracting Messages for Translation

      + +

      The xgettext tool extracts strings to translate to a .pot file (po template), while msgmerge maintains the existing .po files. The typical workflow is as follows:

      +
        +
      • run xgettext once; it generates a .pot file
      • +
      • when adding a new translation, copy the .pot file to <locale>.po and translate that file
      • +
      • new runs of xgettext update the existing .pot file and msgmerge updates the .po files
      • +
      + +

      The following example is a typical call to xgettext.

      + +
      +xgettext --directory = src --output-dir = res/po --keyword = _ --keyword = N_ --keyword = elm_object_translatable_text_set:2 --keyword = elm_object_item_translatable_text_set:2 --add-comments = --from-code = utf-8 --foreign-use
      +
      + +

      This extracts all strings that are used inside the _() function (as an optional short-hand for i18n_get_text()), use UTF-8 as the encoding and add the comments right before the strings to the output files).

      + +

      The following example is a typical call to msgmerge.

      + +
      +msgmerge --width=120 --update res/po/fr.po res/po/ref.pot
      +
      + +

      Internationalization Tips

      + +

      Do Not Make Assumptions about Languages

      + +

      Languages vary greatly and even if you knew several of them, do not assume there is any common logic to them.

      + +

      For example, with English typography, no character must appear before colons and semicolons (':' and ';'). However, with French typography, there must be "espace fine insécable", that is, a non-breakable space (HTML's &nbsp;) that is narrower that regular spaces.

      + +

      This prevents proper translation in the following construct:

      + +
      +snprintf(buf, some_size, "%s: %s", i18n_get_text(error), i18n_get_text(reason));
      +
      + +

      The correct way to translate it is to use a single string and let the translators manage the punctuation. This means translating the format string instead:

      + +
      +snprintf(buf, some_size, i18n_get_text("%s: %s"), i18n_get_text(error), i18n_get_text(reason));
      +
      + +

      It is not always possible, but aim for this unless a specific issue arises.

      + +

      Translations Are of Different Lengths

      +

      Depending on the language, the translation has a different length on screen. In some cases, a language has a shorter construct than another, while the situation is reversed in another case; a language may have a word for a specific concept, while another does not and requires a circumlocution (designating something by using several words).

      + +

      For Source Control, Do Not Commit .po If Only Line Indicators Have Changed

      + +

      From the example above, a translation block looks like:

      + +
      +#: some_file.c:43 another_file.c:41
      +msgid "Click Here"
      +msgstr "Cliquez ici"
      +
      + +

      In case you insert a new line at the top of "some_file.c", the line indicator changes to look like this:

      + +
      +#: some_file.c:44 another_file.c:41
      +
      + +

      Obviously, on non-trivial projects, such changes often happen. If you use source control and commit such changes even though no actual translation change has happened, each commit probably contains a change to .po files. This hampers readability of the change history, and in case several people are working in parallel and need to merge their changes, this creates huge merge conflicts each time.

      + +

      Only commit changes to .po files when there are actual translation changes, not because line comments have changed.

      + +

      Using _() as Shorthand to the i18n_get_text() Function

      + +

      Since calling i18n_get_text() may often happen, it is abbreviated to _(). The Tizen SDK provides this abbreviation by default.

      + +

      Proper Sorting: strcoll()

      +

      There is a string comparison tailored for sorting data for display: strcoll(). It works the same way as strcmp() but sorts the data according to the current locale settings.

      + +
      +int strcmp(const char *s1, const char *s2);
      +int strcoll(const char *s1, const char *s2);
      +
      + +

      The function prototype is a standard one and indicates how to order strings. A detailed explanation is out of scope for this guide, but use the strcoll() function as the comparison function for sorting the data set you are using.

      + +

      Working with Translators

      +

      The system described above is a common one and is likely to be known to translators, meaning that giving its name (gettext) may be enough to explain how it works. In addition to this documentation, there is extensive additional documentation as well as questions and answers on the topic in the Internet.

      + +

      Do not hesitate to put comments in your code above the strings to be translated, since they can be extracted along with the strings and saved in the .po files for the translator to see them.

      + + + +
      + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/message_port_n.htm b/org.tizen.guides/html/native/app/message_port_n.htm index 4197041..5ae8669 100644 --- a/org.tizen.guides/html/native/app/message_port_n.htm +++ b/org.tizen.guides/html/native/app/message_port_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.guides/html/native/app/notification_n.htm b/org.tizen.guides/html/native/app/notification_n.htm index 223c61d..2e1f9c0 100644 --- a/org.tizen.guides/html/native/app/notification_n.htm +++ b/org.tizen.guides/html/native/app/notification_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -48,14 +48,15 @@

      Notification Types

      Tizen provides notifications by using a combination of any of the following notification types:

      -
        -
      • Quick panel
      • -
      • Active notification
      • +
        • Quick panel
        • +
        • Active notification
        • Indicator
        -

        You can specify the message for the indicator or quick panel, active notification.

        -

        Notifications on quick panel

        +

        You can specify the message for the quick panel, active notification, or indicator.

        + +

        Notifications on the Quick Panel

        +

        The display area for quick panel notifications can be one of the following:

        • Notification area

          The notification area is the reserved space for displaying all notifications, except the on-going notifications.

        • @@ -65,13 +66,13 @@

          Figure: Notification and on-going areas

          Notification and on-going areas

          -

          Active Notification

          -

          Active notification can be used to show a notification on upper side of screen.

          -

          You can add several buttons for getting user interaction.

          +

          Active Notifications

          +

          Active notifications can be used to show a notification on the upper side of the screen.

          +

          You can add several buttons for user interaction.

          Figure: Active notification

          Active notification

          - +

          Notification Layouts

          The following notification layouts are provided:

          • NOTIFICATION_LY_NOTI_EVENT_SINGLE @@ -87,7 +88,7 @@

            Figure: Notification layouts

            Notification layouts

            - + diff --git a/org.tizen.guides/html/native/app/package_n.htm b/org.tizen.guides/html/native/app/package_n.htm index a4192be..2671335 100644 --- a/org.tizen.guides/html/native/app/package_n.htm +++ b/org.tizen.guides/html/native/app/package_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/app/service_app_n.htm b/org.tizen.guides/html/native/app/service_app_n.htm index d7aad3e..e3a1323 100644 --- a/org.tizen.guides/html/native/app/service_app_n.htm +++ b/org.tizen.guides/html/native/app/service_app_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            @@ -159,8 +159,8 @@ Note - This attribute is not supported in Tizen wearable devices. Since Tizen 2.4, this attribute is not supported in all Tizen devices. Hence, the auto-restart attribute used on the lower than 2.4 API version package shall ignored on the devices with Tizen platform version 2.4 or higher. - + This attribute is not supported in Tizen wearable devices. Since Tizen 2.4, this attribute is not supported in all Tizen devices. Because of this, the auto-restart attribute used in a lower API version package than 2.4 is ignored in the devices with the Tizen platform version 2.4 or higher. +
          • on-boot @@ -171,8 +171,8 @@ Note - This attribute is not supported in Tizen wearable devices. Since Tizen 2.4, this attribute is not supported in all Tizen devices. Hence, the on-boot attribute used on the lower than 2.4 API version package shall ignored on the devices with Tizen platform version 2.4 or higher. - + This attribute is not supported in Tizen wearable devices. Since Tizen 2.4, this attribute is not supported in all Tizen devices. Because of this, the on-boot attribute used in a lower API version package than 2.4 is ignored in the devices with the Tizen platform version 2.4 or higher. +
          @@ -254,4 +254,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/native/app/shortcut_n.htm b/org.tizen.guides/html/native/app/shortcut_n.htm index c0fdfb2..e9d8d43 100644 --- a/org.tizen.guides/html/native/app/shortcut_n.htm +++ b/org.tizen.guides/html/native/app/shortcut_n.htm @@ -16,7 +16,7 @@ @@ -33,19 +34,13 @@

          You can add your shortcut for the Home application. The Tizen Shortcut API requires the http://tizen.org/privilege/shortcut privilege.

          - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          To use the shortcut feature:

          -
          • To add a shortcut, use the shortcut_add_to_home() function, which requests the Home application to add a new shortcut.
          • +

            To add a shortcut, use the shortcut_add_to_home() function, which requests the Home application to add a new shortcut.

            +

            Figure: Shortcuts

            +

            Shortcuts

            +

            There are 2 types of shortcuts:

            +
              +
            • LAUNCH_BY_APP: Creates a shortcut to launch an application by a given application ID.
            • +
            • LAUNCH_BY_URI: Creates a shortcut to launch an application by a given URI. The URI is passed to the app_control_set_uri() function. For example, if you want to create a shortcut to open an image file, set the uri with file:///home/myhome/Photos/1_photo.jpg.
            diff --git a/org.tizen.guides/html/native/app/watch_n.htm b/org.tizen.guides/html/native/app/watch_n.htm index 2f0e86c..b443d73 100644 --- a/org.tizen.guides/html/native/app/watch_n.htm +++ b/org.tizen.guides/html/native/app/watch_n.htm @@ -16,7 +16,7 @@
            -

            Wearable native

            +

            Wearable native

            @@ -38,16 +38,7 @@

            Watch Application

            Tizen allows you to create a watch application and manage its life-cycle to display the current date and time accurately on the screen.

            - - - - - - - - - -
            Note
            This feature is supported in wearable applications only.
            +

            This feature is supported in wearable applications only.

            The main features of the Watch Application API include:

              diff --git a/org.tizen.guides/html/native/app/widget_n.htm b/org.tizen.guides/html/native/app/widget_n.htm index 4417f4e..58cb66b 100644 --- a/org.tizen.guides/html/native/app/widget_n.htm +++ b/org.tizen.guides/html/native/app/widget_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/base/base_guide_n.htm b/org.tizen.guides/html/native/base/base_guide_n.htm index fd4f83a..dbf8cda 100644 --- a/org.tizen.guides/html/native/base/base_guide_n.htm +++ b/org.tizen.guides/html/native/base/base_guide_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/base/i18n_n.htm b/org.tizen.guides/html/native/base/i18n_n.htm index 2446296..046360b 100644 --- a/org.tizen.guides/html/native/base/i18n_n.htm +++ b/org.tizen.guides/html/native/base/i18n_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              @@ -74,7 +74,7 @@

              When computing a Udate from the time fields, 2 special circumstances can arise. The information can be insufficient to compute the Udate (you have only the year and the month, but not the day of the month), or the information can be inconsistent (such as "Tuesday, July 15, 1996" even though July 15, 1996 is actually a Monday).

                -
              • Insufficient information

                The calendar uses the default information to specify the missing fields. This can vary by calendar: for the Gregorian calendar, the default for a field is the same as that of the start of the epoch, such as I18N_UCALENDAR_YEAR = 1970, I18N_UCALENDAR_ MONTH = JANUARY, I18N_UCALENDAR_ DATE = 1.

              • +
              • Insufficient information

                The calendar uses the default information to specify the missing fields. This can vary by calendar: for the Gregorian calendar, the default for a field is the same as that of the start of the epoch, such as I18N_UCALENDAR_YEAR = 1970, I18N_UCALENDAR_MONTH = JANUARY, I18N_UCALENDAR_DATE = 1.

              • Inconsistent information

                If the fields conflict, the calendar prefers the most recently set fields. For example, when determining the day, the calendar looks for one of the following field combinations listed in the following table. The most recent combination, as determined by the most recently set single field, is used.

              @@ -129,6 +129,100 @@

              For more information, see About the Unicode Character Database and ICU User Guide chapter on Properties.

              +

              The following table describes the details of script codes that you can get using the i18n_uchar_get_int_property_value() function. +

              +
              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
              + Table: Script codes +
              ValueCodeEnglish nameValueCodeEnglish name
              0 Zyyy Code for undetermined script 80 Latf Latin (Fraktur variant)
              1 Zinh Code for inherited script 81 Latg Latin (Gaelic variant)
              2 Arab Arabic 82 Lepc Lepcha (Rong)
              3 Armn Armenian 83 Lina LinearA
              4 Beng Bengali 84 Mand Mandaic, Mandaean
              5 Bopo Bopomofo 85 Maya Mayan hieroglyphs
              6 Cher Cherokee 86 Mero Meroitic hieroglyphs
              7 Copt Coptic 87 Nkoo N’Ko
              8 Cyrl Cyrillic 88 Orkh Old Turkic, Orkhon Runic
              9 Dsrt Deseret (Mormon) 89 Perm Old Permic
              10 Deva Devanagari (Nagari) 90 Phag Phags-pa
              11 Ethi Ethiopic (Geʻez) 91 Phnx Phoenician
              12 Geor Georgian (Mkhedruli) 92 Plrd Miao (Pollard)
              13 Goth Gothic 93 Roro Rongorongo
              14 Grek Greek 94 Sara Sarati
              15 Gujr Gujarati 95 Syre Syriac (Estrangelo variant)
              16 Guru Gurmukhi 96 Syrj Syriac (Western variant)
              17 Hani Han (Hanzi, Kanji, Hanja) 97 Syrn Syriac (Eastern variant)
              18 Hang Hangul (HangÅ­l, Hangeul) 98 Teng Tengwar
              19 Hebr Hebrew 99 Vaii Vai
              20 Hira Hiragana 100 Visp Visible Speech
              21 Knda Kannada 101 Xsux Cuneiform, Sumero-Akkadian
              22 Kana Katakana 102 Zxxx Code for unwritten documents
              23 Khmr Khmer 103 Zzzz Code for uncoded script
              24 Laoo Lao 104 Cari Carian
              25 Latn Latin 105 Jpan Japanese (alias for Han+Hiragana+Katakana)
              26 Mlym Malayalam 106 Lana TaiTham (Lanna)
              27 Mong Mongolian 107 Lyci Lycian
              28 Mymr Myanmar (Burmese) 108 Lydi Lydian
              29 Ogam Ogham 109 Olck Ol Chiki (Ol Cemet’, Ol Santali)
              30 Ital Old Italic (Etruscan, Oscan) 110 Rjng Rejang (Redjang, Kaganga)
              31 Orya Oriya 111 Saur Saurashtra
              32 Runr Runic 112 Sgnw SignWriting
              33 Sinh Sinhala 113 Sund Sundanese
              34 Syrc Syriac 114 Moon Moon (Mooncode, Moonscript, Moontype)
              35 Taml Tamil 115 Mtei Meitei Mayek (Meithei, Meetei)
              36 Telu Telugu 116 Armi Imperial Aramaic
              37 Thaa Thaana 117 Avst Avestan
              38 Thai Thai 118 Cakm Chakma
              39 Tibt Tibetan 119 Kore Korean (alias for Hangul+Han)
              40 Cans Unified Canadian Aboriginal Syllabics 120 Kthi Kaithi
              41 Yiii Yi 121 Mani Manichaean
              42 Tglg Tagalog (Baybayin, Alibata) 122 Phli Inscriptional Pahlavi
              43 Hano Hanunoo (Hanunoo) 123 Phlp Psalter Pahlavi
              44 Buhd Buhid 124 Phlv Book Pahlavi
              45 Tagb Tagbanwa 125 Prti Inscriptional Parthian
              46 Brai Braille 126 Samr Samaritan
              47 Cprt Cypriot 127 Tavt TaiViet
              48 Limb Limbu 128 Zmth Mathematical notation
              49 Linb LinearB 129 Zsym Symbols
              50 Osma Osmanya 130 Bamu Bamum
              51 Shaw Shavian (Shaw) 131 Lisu Lisu (Fraser)
              52 Tale TaiLe 132 Nkgb Nakhi Geba ('Na-'Khi ²Ggŏ-¹baw, Naxi Geba)
              53 Ugar Ugaritic 133 Sarb Old South Arabian
              54 Hrkt Japanese syllabaries (alias for Hiragana+Katakana) 134 Bass BassaVah
              55 Bugi Buginese 135 Dupl Duployan shorthand, Duployan stenography
              56 Glag Glagolitic 136 Elba Elbasan
              57 Khar Kharoshthi 137 Gran Grantha
              58 Sylo Syloti Nagri 138 Kpel Kpelle
              59 Talu New Tai Lue 139 Loma Loma
              60 Tfng Tifinagh (Berber) 140 Mend Mende Kikakui
              61 Xpeo Old Persian 141 Merc Meroitic Cursive
              62 Bali Balinese 142 Narb Old North Arabian (Ancient North Arabian)
              63 Batk Batak 143 Nbat Nabataean
              64 Blis Blissymbols 144 Palm Palmyrene
              65 Brah Brahmi 145 Sind Khudawadi, Sindhi
              66 Cham Cham 146 Wara Warang Citi (Varang Kshiti)
              67 Cirt Cirth 147 Afak Afaka
              68 Cyrs Cyrillic (Old Church Slavonic variant) 148 Jurc Jurchen
              69 Egyd Egyptian demotic 149 Mroo Mro, Mru
              70 Egyh Egyptian hieratic 150 Nshu Nushu
              71 Egyp Egyptian hieroglyphs 151 Shrd Sharada, Śāradā
              72 Geok Khutsuri (Asomtavruli and Nuskhuri) 152 Sora Sora Sompeng
              73 Hans Han (Simplified variant) 153 Takr Takri, Ṭākrī, Ṭāṅkrī
              74 Hant Han (Traditional variant) 154 Tang Tangut
              75 Hmng Pahawh Hmong 155 Wole Woleai
              76 Hung Old Hungarian (Hungarian Runic) 156 Hluw Anatolian hieroglyphs (Luwian hieroglyphs, Hittite hieroglyphs)
              77 Inds Indus (Harappan) 157 Khoj Khojki
              78 Java Javanese 158 Tirh Tirhuta
              79 Kali KayahLi -1 Invalid code
              + +

              Ucollator

              The Ucollator API (in mobile and wearable applications) performs locale-sensitive string comparison. It builds searching and sorting routines for natural language text and provides correct sorting orders for most supported locales. If specific data for a locale is not available, the order eventually falls back to the CLDR root sort order. The sorting order can be customized by providing your own set of rules. For more information, see the ICU Collation Customization section of the User Guide.

              @@ -210,7 +304,7 @@

              The Unumber API (in mobile and wearable applications) helps you to format and parse numbers for any locale. Your code can be completely independent of the locale conventions for decimal points, thousands-separators, or even the particular decimal digits used, or whether the number format is even decimal. There are different number format styles like decimal, currency, percent and spellout.

              Usearch

              -

              The Usearch API (in mobile and wearable applications) provides language-sensitive text searching based on the comparison rules defined in a Ucollator data struct.

              +

              The Usearch API (in mobile and wearable applications) provides language-sensitive text searching based on the comparison rules defined in a Ucollator data struct. This ensures that language eccentricity can be handled. For example, for the German collator, characters ß and SS are matched if case is chosen to be ignored. That is why it can be important to pass a locale when creating the usearch with the i18n_usearch_create_new() function.

              Uset

              Uset is a mutable set of Unicode characters and multicharacter strings. The sets represent character classes used in regular expressions. A character specifies a subset of the Unicode code points. The legal code points are U+0000 to U+10FFFF, inclusive.

              diff --git a/org.tizen.guides/html/native/content/content_guide_n.htm b/org.tizen.guides/html/native/content/content_guide_n.htm index 68b8e75..559c4b2 100644 --- a/org.tizen.guides/html/native/content/content_guide_n.htm +++ b/org.tizen.guides/html/native/content/content_guide_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/content/download_n.htm b/org.tizen.guides/html/native/content/download_n.htm index e85e247..0e853e8 100644 --- a/org.tizen.guides/html/native/content/download_n.htm +++ b/org.tizen.guides/html/native/content/download_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native

              +

              Mobile native

              @@ -38,16 +38,7 @@

              Download

              You can create and manage one or more download requests. Tizen allows you to create a new download process, configure the download URL or destination, and launch the process.

              - - - - - - - - - -
              Note
              This feature is supported in mobile applications only.
              +

              This feature is supported in mobile applications only.

              Download States

              diff --git a/org.tizen.guides/html/native/content/media_content_n.htm b/org.tizen.guides/html/native/content/media_content_n.htm index f739372..4e016bb 100644 --- a/org.tizen.guides/html/native/content/media_content_n.htm +++ b/org.tizen.guides/html/native/content/media_content_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/content/mime_type_n.htm b/org.tizen.guides/html/native/content/mime_type_n.htm index 5c37a57..0f62f66 100644 --- a/org.tizen.guides/html/native/content/mime_type_n.htm +++ b/org.tizen.guides/html/native/content/mime_type_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/context/activity_recognition_n.htm b/org.tizen.guides/html/native/context/activity_recognition_n.htm index 0c24403..2bd3d82 100644 --- a/org.tizen.guides/html/native/context/activity_recognition_n.htm +++ b/org.tizen.guides/html/native/context/activity_recognition_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/context/context_guide_n.htm b/org.tizen.guides/html/native/context/context_guide_n.htm index e51fe3f..be7ba1d 100644 --- a/org.tizen.guides/html/native/context/context_guide_n.htm +++ b/org.tizen.guides/html/native/context/context_guide_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              diff --git a/org.tizen.guides/html/native/context/gesture_recognition_n.htm b/org.tizen.guides/html/native/context/gesture_recognition_n.htm index 1b38559..1c4fd54 100644 --- a/org.tizen.guides/html/native/context/gesture_recognition_n.htm +++ b/org.tizen.guides/html/native/context/gesture_recognition_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              @@ -36,17 +36,6 @@

              With gesture recognition, you can receive notifications about different device movement patterns, identify device states, and trigger events when the sensor data meets predefined conditions. In some cases, you can also listen to different states (started, in-progress, and ended).

              - - - - - - - - - -
              Note
              You can test the gesture recognition functionality only on a target device. The Emulator does not support this feature.
              -

              The following gesture events are supported in Tizen devices:

                @@ -99,6 +88,17 @@

                Wrist-up event

              + + + + + + + + + +
              Note
              You can test the gesture recognition functionality only on a target device. The Emulator does not support this feature.
              +
              diff --git a/org.tizen.guides/html/native/context/history_n.htm b/org.tizen.guides/html/native/context/history_n.htm index 4c17180..5932043 100644 --- a/org.tizen.guides/html/native/context/history_n.htm +++ b/org.tizen.guides/html/native/context/history_n.htm @@ -16,7 +16,7 @@
              -

              Mobile native

              +

              Mobile native

              @@ -39,16 +39,7 @@

              The Tizen platform collects data on the device usage. Based on this data, the applications can take advantage of the user's application usage patterns through statistical analysis.

              - - - - - - - - - -
              Note
              This feature is supported in mobile applications only.
              +

              This feature is supported in mobile applications only.

              The Contextual History API provides history data about application usage, media playback, communications, and device settings. When an application reads each type of history data, the application can set filters to specify the necessary statistics. The following example shows how to get information about the 5 most frequently used applications from the last 30 days.

              diff --git a/org.tizen.guides/html/native/context/trigger_n.htm b/org.tizen.guides/html/native/context/trigger_n.htm
              index 00c6560..8b4916d 100644
              --- a/org.tizen.guides/html/native/context/trigger_n.htm
              +++ b/org.tizen.guides/html/native/context/trigger_n.htm
              @@ -16,7 +16,7 @@
               
               
              -

              Mobile native

              +

              Mobile native

              @@ -39,18 +39,9 @@

              Tizen enables you to define rules as a combination of a contextual event, conditions, and an action. When the rule is enabled, the system starts to monitor the device status or user activities corresponding to the event defined in the rule. When the event is detected, the conditions are evaluated, and if the conditions are met, the action is triggered.

              - - - - - - - - - -
              Note
              This feature is supported in mobile applications only.
              +

              This feature is supported in mobile applications only.

              -

              The action can be an application launching request using an App Control, or a notification posting. For example, every day at 10:00 PM, if the battery level is low, the application can post a notification to remind the user to charge the battery.

              +

              The action can be an application launching request using an App Control, or a notification posting. For example, every day at 10:00 PM, if the battery level is low, the application can post a notification to remind the user to charge the battery.

              The main features of the Contextual Trigger API include:

              @@ -85,7 +76,7 @@
            • Condition

              A condition denotes a contextual state or fact that can be recognized by the device. For example, the current device status or the historical pattern of the device usage can be used as conditions. In a rule, the application can define 1 condition, multiple conditions, or even no condition. If you define multiple conditions in a rule, the application can choose the way of combining the conditions using logical conjunctions or disjunctions. In case of the logical conjunction, the rule is true only if all the conditions are met. Otherwise, the rule can be true if at least 1 condition is met. If no condition is given, the rule is satisfied instantly when the corresponding event occurs.

            • Action -

              An action is triggered when the rule is satisfied. Each rule must basically contain 1 action only. However, because the action itself can be defined as an App Control, if necessary, you can implement an application that executes a series of tasks to create a complex context-aware service.

            +

            An action is triggered when the rule is satisfied. Each rule must basically contain 1 action only. However, because the action itself can be defined as an App Control, if necessary, you can implement an application that executes a series of tasks to create a complex context-aware service.

          The following figure illustrates the rule components and their relations.

          @@ -565,7 +556,7 @@ context_trigger_rule_entry_add_comparison_int(time_condition, CONTEXT_TRIGGER_TI
          • Application launch request: -

            The contextual trigger allows you to set an App Control as an action. You can utilize the app control functionalities by developing an application with the corresponding app controls to execute a series of tasks when a rule is satisfied.

          • +

            The contextual trigger allows you to set an App Control as an action. You can utilize the app control functionalities by developing an application with the corresponding app controls to execute a series of tasks when a rule is satisfied.

          • Notification posting:

            A basic form of notification can be set as an action. A notification can contain a title, content body text, an icon, and an app control to be executed. For more information, see the Notification guide.

          diff --git a/org.tizen.guides/html/native/graphics/cairo_n.htm b/org.tizen.guides/html/native/graphics/cairo_n.htm index a49f437..9cd2a42 100644 --- a/org.tizen.guides/html/native/graphics/cairo_n.htm +++ b/org.tizen.guides/html/native/graphics/cairo_n.htm @@ -16,7 +16,7 @@
          -

          Mobile native Wearable native

          +

          Mobile native Wearable native

          diff --git a/org.tizen.guides/html/native/graphics/graphics_guide_n.htm b/org.tizen.guides/html/native/graphics/graphics_guide_n.htm index d84feb9..50e1a42 100644 --- a/org.tizen.guides/html/native/graphics/graphics_guide_n.htm +++ b/org.tizen.guides/html/native/graphics/graphics_guide_n.htm @@ -16,7 +16,7 @@
          -

          Mobile native Wearable native

          +

          Mobile native Wearable native

          @@ -38,6 +38,7 @@
        • OpenGL ES

          Enables you to create OpenGL ES applications in Tizen with the EGL layer.

        • TBM Surface

          Provides Tizen Buffer Manager (TBM) surface functions for the graphic buffer in Tizen.

        • Cairo

          Allows you to use Cairo to draw on the image surface and Evas objects to get the image data.

        • +
        • Hardware Acceleration

          Allows you to enable hardware acceleration to increase rendering performance and use OpenGL ES.

        diff --git a/org.tizen.guides/html/native/graphics/hw_acceleration_n.htm b/org.tizen.guides/html/native/graphics/hw_acceleration_n.htm new file mode 100644 index 0000000..960390e --- /dev/null +++ b/org.tizen.guides/html/native/graphics/hw_acceleration_n.htm @@ -0,0 +1,92 @@ + + + + + + + + + + + + + Hardware Acceleration + + + +
        +
        + +
        +
        +

        Mobile native Wearable native

        +
        + +

        Hardware Acceleration

        + +

        Tizen supports hardware acceleration since Tizen 2.3.1. If hardware acceleration is enabled, it increases rendering performance and allows you to use OpenGL ES.

        + +

        You can enable hardware acceleration in the tizen-manifest file, using the manifest editor's Advanced tab.

        + +

        Figure: Hardware acceleration option

        +

        Hardware acceleration option

        + +

        In the tizen-manifest file, the option is shows as follows:

        +
        +<ui-application appid="example" hw-acceleration="on">
        +
        + +

        The possible values are on (enabled) and off (disabled). If the value is not defined, the default system policy determines whether the hardware acceleration is enabled.

        + +

        Normally, it is enough to modify the manifest file to enable hardware acceleration. In the following special cases, however, additional actions are required:

        + +
        • OpenGL ES application +

          In addition to enabling hardware acceleration in the manifest file, you must also call the elm_config_accel_preference_set() function before creating an elm window.

          + +

          In an indirect rendering mode:

          +
          +elm_config_accel_preference_set("opengl");
          +win = elm_win_util_standard_add(name, "OpenGL example");
          +
          +

          This function and option are supported since Tizen 2.3.

          + +

          In a direct rendering mode, if you want to use depth and stencil buffers or multisample, you have to specify them in the elm_config_accel_preference_set() function:

          +
          +elm_config_accel_preference_set("opengl:depth24:stencil8:msaa_high");
          +win = elm_win_util_standard_add(name, "OpenGL example");
          +
          +

          In the above example, the depth buffer size is 24 bit, stencil buffer size is 8 bit and MSAA is on with a high bit.

          +

          These special options are supported since Tizen 2.3.1. For more information, see OpenGL ES Tutorial.

          +
        • +
        • EFL WebKit (EWK) application +

          In addition to enabling hardware acceleration in the manifest file, you must also call the elm_config_accel_preference_set() function before creating an elm window. Because EWK uses a 24-bit depth buffer and a 8-bit stencil buffer, you must also specify them in the elm_config_accel_preference_set() function:

          +
          +elm_config_accel_preference_set("opengl:depth24:stencil8");
          +win = elm_win_util_standard_add(name, "EWK example");
          +
          +

          These special options are supported since Tizen 2.3.1. For more information, see Web Tutorial.

          +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/graphics/opengles_n.htm b/org.tizen.guides/html/native/graphics/opengles_n.htm index 2c62eea..84c2860 100644 --- a/org.tizen.guides/html/native/graphics/opengles_n.htm +++ b/org.tizen.guides/html/native/graphics/opengles_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        @@ -48,7 +48,7 @@

        OpenGL ES in Tizen

        -

        Building an OpenGL ES application in Tizen requires knowledge about designing UI applications with EFL.

        +

        Building an OpenGL ES application in Tizen requires knowledge about designing UI applications with EFL.

        Tizen native applications do not depend on the Window system, because the Window system is an internal Tizen module, which can be enhanced or replaced. EFL provides a method that draws the OpenGL ES content and encapsulates the EGL and the native Window system.

        @@ -73,28 +73,26 @@

        GLView is a simple Elementary UI component that sets up an OpenGL ES target surface and a context, and allows you to embed it in any Tizen application. GLView is basically a wrapper around EvasGL, the OpenGL ES/EGL abstraction layer of EFL.

        -

        To create a basic application:

        +

        Creating a Basic Application

        -

        First, you can declare the global variable using ELEMENTARY_GLVIEW_GLOBAL_DEFINE(), then create a GLView object and use ELEMENTARY_GLVIEW_GLOBAL_USE(glview). These macro help that you can call GL functions directly. Now, you can call GL functions. If you want to know that detail, refer Elementary_GL_Helpers.h, please.

        +

        Declare the global variable using the ELEMENTARY_GLVIEW_GLOBAL_DEFINE() function. Create a GLView object and use the ELEMENTARY_GLVIEW_GLOBAL_USE(glview) function. These macros help you to call the GL functions directly.

        +

        Now, you can call the GL functions. For more detailed information, see the Elementary_GL_Helpers.h file.

         #include <app.h>
         #include <Elementary_GL_Helpers.h>
         
        -/*
        - * This code to place at the beginning of any function using GLES 2.0 APIs.
        - * When using this macro, developers can then call all glFunctions without changing their code.
        - * If you want to know that detail, refer Elementary_GL_Helpers.h.
        - */
        +// This code is to be placed at the beginning of any function using GLES 2.0 APIs
        +// When using this macro, you can call all glFunctions without changing their code
        +// For details, see Elementary_GL_Helpers.h
         
         ELEMENTARY_GLVIEW_GLOBAL_DEFINE()
         
          -
        1. HW acceleration
        2. -

          To develop a GL application, you have to call elm_config_accel_preference_set before creating a window. It makes an application to use GPU. This function is supported since Tizen 2.3.

          -

          To use the Direct Rendering mode of EvasGL or EFL WebKit(EWK), you have to set the same option values (depth, stencil and MSAA) to a rendering engine and a GLView object. EWK's options are depth24 and stencil8. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function and to a GLView object using the elm_glview_mode_set() function. If the GLView object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled or abnormal rendering occurs. These special options will be supported since Tizen 2.3.1.

          - +
        3. Manage HW acceleration. +

          To develop a GL application, call the elm_config_accel_preference_set() function before creating a window. This makes an application to use GPU. The function is supported since Tizen 2.3.

          +

          To use the Direct Rendering mode of EvasGL or EFL WebKit (EWK), set the same option values (depth, stencil, and MSAA) to a rendering engine and a GLView object. The EWK options are depth24 and stencil8. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function and to a GLView object using the elm_glview_mode_set() function. If the GLView object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled or abnormal rendering occurs. These special options are supported since Tizen 2.3.1.

           static bool app_create(void *data) 
          @@ -104,19 +102,17 @@ static bool app_create(void *data)
              ad->win = elm_win_util_standard_add("GLView example", "GLView example");
              evas_object_show(ad->win);
              ad->glview = ad->glview_create(ad->win);
          -/*
          - * This macro will set the global variable holding the GL API,
          - * so that it's available to the application.
          - * It should be used right after setting up the GL context object.
          - * If you want to know that detail, refer Elementary_GL_Helpers.h
          - */
          +
          +   // This macro sets the global variable holding the GL API,
          +   // so that it is available to the application
          +   // Use it right after setting up the GL context object
          +   // For details, see Elementary_GL_Helpers.h
              ELEMENTARY_GLVIEW_GLOBAL_USE(ad->glview);
              glview_start(ad->glview);
           
              return true;
          -}
          - -
        4. Add the OpenGL ES view to the application
        5. +}

    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 z z`&38k&nNbZve;s+aGR*jSN(eXtrc5=Ft@wwH;I_k))$$m$~StAoX3~1SrTZ( zW0Rn$BYhF;!t)Ec^L{FRj=Hk3w~r#lfnw@yZTcffHi=Wb|5$!LAX!Tzilg1XY?WSz zXEE?Vw#6>ji-9EjV$X=|mDZ>4p?BX{ReSlhe#ke@`Z=|iCD|uuAFR@ms-w_&CR*n6 zA%!6?IEb2l?WWSW1ig;n$__OwNL-m?IXV1m4eZ|M{hp&9I6NaYs}$@(+J-5*OxCHt zc$OJK;`CUz0oU~zaNx6HFoGu4)QaI^=onR@EJPzUW!B3lR%SO2G@#HWYb*)$utyu= zTM5tw=wL5$qS2R`(?ON0{8;DTkpVXN640t#Itu)RNw)l!33N@d;=*>j6L-Ha3QXyJ zd*6ENe2;v)`+Z4@rN0X0n&xe>;WFv=pH>6U->sLjN)%`#$yf*@`MqY@EGA24cLeou z%Mtv`B({#~Z$Zx%K$CMp!84+=Cw>zT%U0y%`dpvw1n+biu!Ebk=#W~vTe1GH*ZKRl zVTP0)-Z@>?YRh9o5^`Xj+HZcq1a<8^sd#=w-4b>6yzy)V0<5s3fOP(5v;y{xw~0IK z(xQJ~F`kN}$Q0XtAD80(&gH2CCao!bIgqrOkn~}D3wMLCXn?|lh?1xH3Wi7GWhr5r z^Ue_>U40xsU1M5hw@0OeelcQ3^V#Z3vc#{Bqem;>A=OIBQG=%AfS}FqMVX)kJ>n^kpODC4t{(|uF$=; zsTRPbXiJH8ipBm zs@WOR3J*9EfrDKFC=Y-2i+-c}d75lAA`zU>Fn#5!9T-=W>kf^oHFM)G)>_LqsLbfO z$gBj&u(a_msP+OaP9=e*1av8UPh2&WSp2tfM`+#p-&T_m7ZGX!2zjv5WEo9w2_=jvVj}A8QHl{KuayziFFnk zXKPB&R31z@x4(2iS&Lj->gxu zyT|3IqtMmiJ6dPl%->wxYA-#TxlwJt$zjD3rpznJ>gW83{cv(G2QSjUqp|b#8BUMve8g4CSLlC|DV(-#mzO@bSCY}Hl25p3>hQ-0)6&RENzq9hgg!-+q$A` zPOEjhb@$txegCREgq;F!|GbR3sqF}pglakySm%9|WVDl& zDl2C+?PGN&rN&aX!CER=e-A9@-tsd%4D-%lv8?u8CVk{e*eR_Oi0791M&Ecn>SWDq zi6a^v-DBTRDo0L>l_g^9DotRGwF<-C>VS=xW$2;hB&q#gA4sw?mb9Cn%&5{h<;>Iz zS!Kyl0noZ zM)YE6ktOwb%+B#x_BAOfNFvzX>6Hj(4JLYi4^JZDXis+qgX;FjQN^+1HB@uOaZ&U^u5d01 z%Mkskj^=W+c?$Z5w`@lBr*}m#;Ji?a^0g}F0uyQW&|#%VM> zGS8z@K>vm43>B^w6DwE?cbr!3D_35J5i1~&EQf|0+2Yo}g~C26cqd6SOJf=sIV!o3 zxIkoYh@nwZuYq{2)#VaoBtwvj9>=1K|cSq%b0%3sLA7Kz5DF&qWJU8JVQF~ zuj;U}{RX*JaezGI?Hogj}fBM?8=q7qndju#dkQY7@iM5c+X0 z^d?@R{R>cZG6bkJ=#a_#>pszC;FqR)%;j7}Rx6+_wX^;>*3xEw)EuhFkQ|#3nG!dM z)~6dYTDFtV2II@E3mpZ*ld$~-lmQd~(m!sowcC=`eyC(_3r_rUu)%4lImUIPK7Swg zW4)1tahxBk2X26ofX8o453*v$QeYj3*y3lGloBjDEq2KA{FHdY$=IK3-)q-C>J2H* zzuDTi|IrC@XNmtFz}QWzYuZ8DrIf#1w;tYiTqpTV*010mFJ6IhA@pgslN;%0(biyq z{)A4gkaLlNo4Nxrw_SoXu$e4Kn%pof?=3`*K0a8gF{x58$|M{3&6eck(h+lk9?c+G z&c*&V=2v8;rJziWnc5;Qchejk`1`mg+eN@kMJhbEZjQ1xF>3m6;8b#zAfc zlJ<~8C5IXB`cnKHVQncrpl0rGmB%+}{BWy%Jy~=X3CQb^P`+R{C*8nc29L2Bg^g!* z#l>Te0i-r{VS7h0JfylrrWu2bN>Qe0LCsr*bXcn`D zcCys)sOfAiPYZe4CMg<0$#UY3dqaeKYaXcYwoQh%+4h-6 z5iQz{I$Xrh3L6|?Kgq4YiRZ;SsUzldG~D~iJVNnqJwWB> zmMF;&#>|X`j@G4IF`g8Ej(2Gq%*hxlhT4*3(M?D;!B99uCO#e8P`29<0-%mi@leM` zVxi=8VCocTG_K$(Z6Nxrh@92NTO;8ZY+|Q*27A}~>e>P6F>IYBf4E{hGggg!sw?P6 z>{r$>?$WI~(RxhE2)XH>1}Kx>)bHk+o0d8kn*D)*A1s=*KNVh~Qff@LeLbARhvIPH z#Hm-v_<`*B@-WppI4ybT28k^=7v08tVrx)`7;fy2a{uQ`x9B=EDJw~Bn4&xn*`AVvrqPe`X% ztu}N4*nQOexNK_(sV!?(on2t8_!QLQG70?^80g<=}h8buxAJn)qMi zIsmX(E+vv=`+lZT={infeL897FOGj1ojLk|;B=b2QsO7Jx4iS%h4tC*pQ7v{J2HOn z8BDkN2J^+zIqAQf3Oe!+N|nU$^Oh73^WW*1dv|`ie=0d|FMcHdsp$VyS=!}BNZX6w z4r}cR(1MDBCp_459*EedEG*h_Cd^+8mtxR1@QD*1DHlG+Y>(_e`>%~3HXSi1UHeOa zXe!>AhRi6KkCmCf89iVjTV_VplA>9|!E~juyTQ85H;Y@n{zdE&$PsVToiLGtP#RVN zYhF6cC8#fv4JE`Jy-)2eJ~;aBW~SC*p^)H)g^jDcoM@j2_{=R}h@_U>8ppTrEj_Nu zS*Cw?J#0A!j|ndg#|XnhXpwR?T-a}riwT|mVr1hZa!<0q&QQccZyRc4685?2C;Jvu zkH{(xZj_HYK+8m(#F_%quTz`O^6Uz8RcZr&46>;x{0A$M_W3gr7&`@H6wA4akMME{ z_z3#khc|U)%^HPA#MZ!|eO}Py*TPL-TR{?kd$x@X5)~AkQ|9*CDAq#`5RtgD))Z3d zg!Oz8{aJm4a=Yt-*uCQDFrLK^j0U%v3Jn%>0u4EyZ7hS!Bus3u3b_@I;~OU>q(FL) zZ=!YiTA`wU2FsdlwXIf^na^9TUZ~ z#CR@wy2@}-@TY>JvI255BLFxPiEX*VYBU?w@0Do2SW>hfS!V07qMrKWdPuMfVaE^I z_q;M6G)T-J9@Lo=;7aBRAfpA@7(tkWER57>F7 zC9=^;?No{-wN#N&B)vGvFB7dN;qW`qrEg41W&_M(OMWQKTdUApozQ{jXOmO%?qtFe z^6LTPZ$RhgY4&j-Fz4L0MRRDI=}tj_Vsk=t36rW1;x-b}s5F@q%NpmjZ>0cG)*8Pd6)MmoO6C9mh6=IN3{N(2RX2Y*8Lxnki8-FI>?thc%Hh z9&`}IFjv>*zM;9U>lmcMGj)%C%pMmzg$sr&Kr-8Gd(;NoTuk8C(A>tKLST%68WFqt z%2C4!tz7+;6rN;`DYB?T{l0yI68&~^U-#HUf-&;94lARYTNQ@NpN82v*^jY?68R1p zhsghyc(+^aD2OifzS`AC8~NHSfbKV?Ln!EICtopKg2jkFGFuymWR}?(+xe+60-!`L4HNQ>%-3a_JdW;iHBn9T7XMfHlH+2&F`Uv> z8$MT-@^(QGdG>vVG=&{{&&m}sM0Lu=N7JvsS~VTe zL+`0+G9{*vEH}`$DBNXnX0BJwxrLO|1ps00@ypY^MD%Te3OgR%n3;>|kBH%I>> z8P2;@cxx(<6a|gDW@s{PGR-*?5KIU24+sw;EJAiYRKTkCigUGZRwN6MM60D%(3c(J z+NDRtbvWSbUIREO>92{c>r5WiU(uoDE!6_d(EwF zR3b+XgAOLQuU%M$L4UTq2w?9=D@)xU}a@dxNia52VW)aEt&h*GQ+avzqhEPJ2*(?|yu1<~P6 z+^fp@h|eL=%?M`&`1X?hG+IsqT5!{)Khf|;PKxwLdex!DD%NMmg8b>%@yoh?#HG<`a>rJUO=p$g?dsUk8~a&7I%768B0hGt6g)DSHFT_J$dzs4F%^_Suv z%HFZC9Ozc%9-rTHH2DCW=HlBI_(xQO!(FFlg%c=BF zIwU6G;N=gw``o0k%`pG{4#JI3oNIN`tLi+&+)fF|?7KN)%;Znvo;jE{to_rULEnus zEhNLgNZ<1Dxfn}u@j8PtDF!M8X!lk9h1(CJ{n24!hy4G-9p?G}ML6A)=Hb!DEC(*e z{pL$SFn18lsiAr#t7W8y-|Lq`qjY^iHn6PgvRuHRRsSpakbMUZeZeE+L|XOZTlk9o z)AtdKPEp9z+4R^7^f_^dbzbGG-Q25;@z7j8>pFm&irHoVb=hH9|M1WKu%g$7fWzX6 zC-ct9p^kX6Ys%@sDy~v~J^v}WpZ>CPt-sf$^BsPDtPKsup!Z!X{~A;3Cn)43ZYO6& zl|0>f(A+f5V1eSl+-a#NTbLRn%|YrV^bgC8rkIhrUnfPAZVYzg@X2 zV$^bx_p#*|VOF3c98-D(4YD|Fh;m8%n=%&izyIXj)aWD&qZ>-rP)rQ{5N5ecjWbfw zSNOeKR|9KR(HXU&ynrkTM!*r4Un;``%G?|H{R5qSOdeqU&OKQb&Tkqsr71@y*Y|tn zxvt5~JmSBiNZ4P>@EpN)o7p7qJG$)o%^%Vs^Ns{z=0^t8XXb|n0Ny0 zeM=jdBCw5SgzSdUnvVr55_Y7$Ae~O9gzj!*9rGpTs{}(Z=ql2D26tUtAI}({&qe^#Xi#+@o&t&$5Z65PT%Vvojhh$CGA1S$d zemUX(1zf+HS{xQT+aBtlP}V@Wxg1duTRot4tZdaN)68~n+sex~afep7r95@>?KgucBLFil-PUtmmA8(cT{ESQbAS|b z{B&R`$^xaRHqvSG)-dpyvL80@tH-b|KvDYE zfeNhal>BxffzPtaNv#_FBlfoY8|^%PqFndez`vLWOx|TQ=;^h9&Xzz>I0Hj1nEd ze^O+LnZMmfey(XPi!{oW{^O>GL%uI$jPuFJ9xeu0mUJ&TL#U3wRb~wg ziYatpWITgB{?mZY(8BsbXE*h+JQFHFz_LJ0HcRh*MJ7R81@YIbc-xOS9sHS=6p1yN zmIH;nY(-pzzW}h)2&ew+^g%@OOILceADA9-2GFEb3JH+4>}DRia%~TVig!}2zAu3oP5PP9O7Y%JUmqSH3^U6 z&ZOF6mMD?u9Z_dz6ps?E=5$qmE(gvgE7vdRSh)r>rrpwEyUlzNdf*r-G4AMWq8d5T z{1iWyos+n=qScXtOFQrDqc2t^4kdJ@Jl$2(fy)tbvN-}7yxmj0s7o=tZ4?2S9K92Z zY@<1T7S!|Bc-UR+!baaXb3Ymr*YXGwe2K;V%F~{g5-@}NYD&Q!s4-7}ffLWQ<*b5J zQY_Cg%kxoL!;9z@R-crXB|Nv8a}azR9CwEGhz)l98`J%=FzU7$avVwM6&< zyw#)l$=(~v=3}qY;;K2fG-P*TGB5@HeNo0WVNbp#&Gx!F99LeZFpwdSjCo?VYovP> zHK%M>R1n6d+@9p>>!mkQ<)Vl2Yt|gG%(>G0#w`JW-n?I2tRz1lRxA;$!B{};fPEJf zr_V5#O$OFHcuRFnAw!1E{gk!wiQF?YE#gb+U)hm3dqT7vn|y7B8RN~g_pNRPtVR1# znXJA2%qXP6og&J=_T$qHaGw)6i!791oqu9OT6KB(|6=hh0?$nnKZgl2KbbE(ZkN$J z`{mbSHc_p+&!6YwK;$6wE)emoo-j)!ZBpKRR>H$yrfd@*F&xPy`v{Tcehk1W(jwl@?$1C@p`dnRJ3NI!csmV;yiSHW1@efw3ZnTxtZg4Si)fbaW2x>r9OsRnW@Rk zqR0KDNqF!^aY|&Bx6{?fu|3~{YB@H4JcEUD&@3h+L)B?FTbycF%+RFw;x-E@RedCb6NRJIl{>BC)7nC2(XBWd*E z4XE)KPvaNFngCAP85|s9(5E^hnJWwDGinA=S?z5dn9ez%ZsSmu#eKR^1JLfMeH?Pq z{!0Px2(W(eiaw2$BQ zBk3|$V+#8xDU(@$GVR0hAGH_uC8}I~W}i{|yb3KCujI3m@{w0F46FF@$v!r=nlp7C zJ0+_~iW}%kB=1RInpZNPnYx7pB22$E-Qy6>?rmLv@u?36_e=AiugF(2#`wQZf^&Ik*12 z5lyn0D#*PqW|b@YZ(4y~)O zI2*VGWDnNdh9kw=*3uzmR_hbjIf+mmOr_LhMQ}NhWB}Zd*;-MLT9MiKU8ZNko%Rs+ z7~*X^XKg5nljl%w@Qhv&lLh00Cq9+5lo7;w9kHLIs*sE_Q%Uwiys5!$G!vu^{ zrStQDF@JMpM`7+bwZAqN%gv#u(5+45f@3+nti2*pQqjCsjJhAGuTsW**#T`J_!qv4 zC6RZs1FbRhpJN3-MFb}E8EPM}U>UI`vdZDz74XJ}Jg%|;4f%H~%^rLhdKK^)TngD> zt#p}uPID?T5_NXSZU=RDveUKClq+e4%W{kL1rM zFNzdiKsvm!52_9f7v4ow57ZbZFR*|mT!EC6V^v>C@0cuZjV- z+_%DooMy@8Zh#A+FbL-fgA@rJ`Lgh23B9oFt2|>R5xG{le=w)DIfk0UOtS$c(uW%H zM^r0gE0F6ys8SW4IIV0jUv(hBw=VBsbanUkzV_G5BMxW1yF-&}$jiVV?n1yA> z0GBjx^a0+*2M;FdCSIbCRVrGR8=>S~fBeNjX81mOMsk zo9*m04A-D%+tF*DiFzkEOF5Z%-as zk`bFUM*JoEAoq&{8t|wadnK9bnVKTC$c8fF*H-FLI9s3;H3mwqYnPOI)xqzz$n%Z< zcS$>&9`%)peuZ@JUv@_yWUOCoktQ+ScFV@%X78DC9%;Lknaz#8sUm2wH?W1^ze4*! z&SmCSK$G^wycgHDS8)ExHbqBIzAWKnIy3>2NZqvXRYK@pw%NO&g)NrWU?NVFLX>%7 zVXtA;ZgjWHB=~n64+Z}b7DIHMB1EqoEd?sh1aIB`q_bk2>FyG)3kBF&FT~EQbkx7> zh$H%1l|8L*1Rc^&aXRNRHa}eNy#wL3M4B{^MAQtqfEAKdG)Ud2oo04m=Gxc$cKqp+ zUP=Y_(tLSMuTpKrDt5$YUAwC|xb5QP1z$yzq#uHCTc2{V3wn3eHJ7jY|Cd;3v?~l@ zjx>>)hp%h^i#la#fyBOKXn{q;NtHFtd=8KxBujCM`W8lCCybhMRK_+Ne`@6q%Qmsd znD+6f@HjvxJM}FIVwj)@c8Ve6eiwv;x6UwhTq6YTEszWW$ zFiF+`VM}|*C5%a_B~}#L^w+M2d@-Jy$-)(-q;ZG{nOOUzIkh!;bRK@weTWMpiCuNU73|)DEl8Xlw(F{RPMls!pYQr@&a{C9L zc2xs2K@~@EWnQy+^gRfmaB9_HUb6FzB?Yj^OV=~hSu^DToSSFgPUd6SS^YWZI2-*3ovSOFY#epW%tul)-6~K=m*2`)E3FxqwqgWJ z$2c51B}40zRNtBU2hMKwnJSJShOl3lRxu@+t6%9&v4(%LdL91n;#fTrB%_{n*5udp zep)CevQvqv?PZm;xeq$c=}?5V^7QBY>2bv$dD{lRj-En2^||JZ%&Z;5!3>n02kqf` zn?+cv#s-Tz>&Q4T}gb0mf-?p zmKPW^Bof?;=(k2uh^UavMJo+yQZyif8&xbN<;o7@2W>Kq8>1LALIKw%zU3+w(lb7A z{X-p%2r3h26I8#@*4a38QxfvQ9EI~AOR8ybb= z+Q9p#nOXjmg2jngCr2Uc0dNm_0gZB+ei^Jofj_j!@8qgp)TP|pFx6n=Ui~n>BA5lc z0hBx<)bJLeQI|2MxA}cfIN!MRIu)<#0C z*TktpJQwe}kpnx9X$Z;URe>g4m&!-8)TGy?Y)fJK9r3DqGSuiSl|+E*Fv{~CjF0-c zR&X)PMmEq8k#*A2JEKgV#A&dk>;WY6*QQBL8=e;LZy_D+-32@aJwaIoO2sedS>>Nc z$6*LKmBU78-+iQJ+XdUWOB-p;;v)Ir3k@msu8%4yDq9^m`Q0rGz{`|_XQ0GS+nbKZNX3=chzRxG;cTm zs7T0ZiiPnD6IYv-RQ4}#RW=~-4lx4}05aJM^h;w+ zQp9j9ki39*CYp>qNVDB15*Ij06W*#3qymwz&U9ha(r!+9GuaT~t4BU)2{G>ssyY8VvDAu>W2Ci|GK*hpD z0^PU&SlJQac${7#Lik>nNp6lQ+fyN60ReXW`Cb+;n9#C<_oo3)1!u((^)Df&%Dos6 zo0-%Mm^UzutZHFL+%+}{I=hv=3TNA* zSsl5EaOLk-zBF_`4k0#t0*utp*g=f-qHG=mgEb`_R0_pKJajR0^G;eSW3v%7@i)7e z?5H;`ll_GBJNQKVrDD;bf^mjb)IhdXtGqs6ae6ewo4Rszlv$SU5LrvvBeA$Rc{Qz> zoNCk6$qQ3vqmDj+*hpFn1eMEvGV#e^z2=72Jq-3`tZxR$)k>H%(wy8xTFNmQmH@7sjX#^m1)$ze^0}w z{pLYd_!&E$#@tvI09NRPk_RPf6)gYGet~e0?YSHXge%;sjwX3{^htTgm_CI6@86p9 zbL#UmNh>en5~JK%1~}0Hv3DrWS-Fpcc_`W*o#~{mDt=^@LB?=_UYoQK5pz=W*d4y6 zt9?LouIO7fK*WK&UFd5$b91x(DasL?wx#+ayj7E_CdkUyC^UAF?t3c>_09@$bG>6h z!?0p1uk^RI5ucNGNf_3>a;q8*15K^Sn!y7-J+OW7munIXFz_y^5(3rU}}U zyC2q8fmtdXst(Hv;gzl86k}bCSXJnKu*kDX0Jya0f?g3onuNfB)n}ao4q~C#&YH-C z^v8`bg0%kM&I#kUs$hNek3NTSYO;=L!y;xU`{~hXH+8!)`fc-)4NL@l5&qa5$B}Nj z_L!rJUP6HMa#v?IQXPPnLl@rw(^$7~4Y$60Ic4~NGcmql)~7%N^QtB@(s$DW{8bxK$wO#p>*mveQIZE+xn{^Xlus zk0JzOM%0ucsfceTe&y1+I#-rVC^79N5>Yc#v$r~bBjw>vE!xCEf1Cey7pamfti+D@o`Ee9{JR#PP2d=fEDK*3FP^ z?@bFo(ml}*3;+LUpbGIb55vN}9bOgC%x94b%Q}4Opi@?MWx1JN#XV=aX4uRUTR7#V z2*E)Ev6nfG%yS~5tig^Zf(M4|E6n%t1+7pbSM&bDHK1Q8r(&)qChrell}w#|9hC&& zZ=g_+K8vvle+jQ~zaJ!Z$&<(spVwmw`&%`jUT4S(&K$2FCBBpc9)nI=Pbd1MglejM z8n%-*Y@xeEAPE~mYZs9n?fdL+QO0@%zp+?IkpPwA+j2bP6$O)Q;`?@YPRbu%>G-v* zGop~WQGJ(A^O>oS$^=@L)G(>hDctSQ4T{rMJEcd@RJ>oJ+zHwBGa1d{GZfCP5diYY$knO`Vj4 z{)5odQW+J`SUeA(x#XpKI#)V`#xHh;G&8-1n>@JSS>Wd2r80~Hla)H$cx8M0I6R|S zo{cu#5*$#NT3X87!Mw0Z&>*zISlx=_+ZIu}SwxT*7MV@NVk?94hs>6pHQ7dZpFybw zBF6>FEKvy+v9rztLyP)E_H?+!r{{nll5vvnb>Jo6zJ{_PDY^bay;t?S)s4hJQ& zWf;e}tF7`UDx*gZM?QMg>sQ3#M4G2U*qH472tkdE^g&OZgHs{_OX_uaK?0dSW0W_n zt!Teo#+uWc`>KatSqUG0d9`mp-62N73C9;p)TX=dG-4(5s-;u*cQg4i9Ss8Eyh-=Z zr3P7-!Yo)LezNI?Y0?_A*z|WM7N<(ci&Om)4^L3;ogmy`J4Q3 z&2(Y9N_;cVkQ6&2{R1asn!#d3V6?l5yM?FrpZetl4h}|Y=oE~73O&qOG_UAm9lb=| zt#nc`w5t1_M9=E}`_~C7%(m>Bk*jin5)L*`yj7JUeEYv>%b@`7ljE_vqjs@U2gEf9 z*90Y6VeFTTLM{3(-X9Ut!NbMV#nGUhlUKWO6f80Qzi6t;EwrPwnV`GliZenZt+H8t460!6LlJ*h7uEBHW(Q<E%Gdy{N?NJLQA$^ircEu$f5vdGE=2&! z(aKIvRu8SV)cNQJOh;?RV)qwWQbW~XHjUExWHt-57J2#U<{XKvu*HNKaFW5wm ze@f(}7L63s7-+)8$HihJy`zd^C%QU0=>$*CF2mkq0mxn;N_&l0AU_~KQC~X z23!$ox_z-gf#2~g+!8B-$E;N+HOm%6CY88xUvsFUI*m&KHl`ZxqRGWe|S%wR8DBZ zB~Tj9wn#`LlM#{wM zIq6`Yj8HNHbSH`A7g;Mk*H7>ZH(^ZGC)gGoQn}GbDB4GSk?upe$bNq^C>`zlsh~ON z8;7+>U2CZG?A2UIKOFGr&Znu-*&-%(`+0d~PEt9}+wpsvzj*?%x;g2kcxY@1`P)xB zxco^9X!I#s0d72*B+<0bme<|-(7d>62?IC)!kdn&ZTCN|ic`kD17StVo0Cu@BCvCf zQjk$XJ{dy&*}wRW^E}X`sM&=Vy$Xj_9BL-O2SSt8sPxItx~s4)$*eGDgIbvQfI8A7 z4EEGFw*_{cH=`NIq#5B6kVq-CS-QUK`Krl?d;s6**WJ%&j!;@igN##u2CcbYYBd?C zm?9@$yVd}ihM?;ttJF#01XNwMc2ZHzX1JRCleJ&k?&{M?a;c@tUNBABHYTS$Yybsbqe|jNEmg|rj+C)=+ed;!sG3ffg%)GKjFGtOA2G!2*c#Z~{ zAS4=v-RS5r(;`N4!V*aXGF5VnnFyr%Xcr19d8kr?td9 z6i7zb&OJ03b>HRw8rHQauQJG@!ErH%m?-VCw%T%9MoA;?2hjacq;Lxam|0m0~^1=aY+uqVs1Dm=iUqLQfw3}@BW*KmA1 z?R1qW{fm}7=6rff(6*iaw1!H!z!=|2u}&t!W^@i9{xzjO(GL1XcHE2+f=!jCuhw(K zcHK~{CSxi6V-YV%2X8vGCgTJ-(}uK3N-T|RS%0yK7sqj~jssvKAuy}G4sXfx9UViN z&5neWZ5RGo?6WkP?10&oAl0XEmglgp(A4SdZNFqjZM~S&gC`S7injp`fgD^Zq90bU zIg(uJM&8M%pJv+$5c)aX^>0Ow++9JqeBfuT*6DSMRmB?Ww9js@|MQ)Qvp>h_tQA6M z+BCO`up=cyPYGJZ66B+hlcQve@apw&{RQq~=W(Q!X4LjD!E0Or1Sb6klBkDxb_qGy zaN5zVlo2LInEpOSOs*lt*shi`|`Oyf5{3$=^* z^NtefB`JQ|#$1NKsFYg61!<_Vj;?pIC{tb|Zwm_cl?}Dxj+{l7yD`=YP0-p1I46f2 zT35M!)7Z{cxEsLEHT?FV&?yWgSEU(hv+4rF3eg*h+9*|&NjXB<>)&zzq4)?<`P_bq zsZ#$O8$nQdT)?J2(Rg5u#%}}fi{chj7abs?8tQs4u=q!TL^ELTlgZBd*Fe)XjbbJDdT$nqHrb-Oq$2K%i zT2xo)&M(dYz^)eC;8h-6K6pVEbC=0oSx%tafmu+;wqI!5iS@OSCK1Se@0KK`{*NgZ14m7Jo zv1kL9#YPsN6((X|lLzEID9wuoN*H&u8A7cONm4WGt5~3p@f`UvZXNXtog-)}tUoV7 z52ETEx#$B@RPk3)LT($y*Lk0z6&T(#lN^Ml|4pHK!AqT|F$ERwewSr$Z~K+b+M)hc zh|lIpVKTJPhvzPmhNZqtQb1m^TNYdHF7iRn_9VJ>qhOiJX_?B6J zGeEnKi06QH%4k5CE@PpV2BN7q#q^V;>!%m`^1Jk^MT7%l9LgHlYF{-cqbD|kbQD}z z^ahRL%|}-_9Oa5*!{Z0Aj`4(@hZ`Ab>E{qZ?~J2jRoJDO!k}%#N+3QwwogD2sk5=1 zEP=h7Npd&~pZXI)iEf{Brc5W4^7FvQe$n-RgcND$8j?gG=@q#WBnewasY`)%+;*#E z-7HE%e1>lH?U*ogS)e8!ZXA!V9eB->DhE$|#J$e&=v&kbcn-N$dclQP|#^O2=p+?;hL-9f?Y6NT>&C} zv;ZeHp2gUh!DsCH9b7J#067IVrFGCy3X02*5@u?5wwd#*zK&E+tA+x-MHc{4;ic> z+8rgcS8KQ#v}&Qw;pQt#K5B|Wn!kVGG!qsls~;Uu3H222I=DN40CD{B#f2Rz;al^F z+h0^n{{E}K%{Pp3I89^7N_4-duINh7W(&0TxnvD}B#Xe5LZpm^McknbyTY<7GjKR> za?s0l&%by`9Dn9r6H!aDFaF7xDitzxbU_?0v)`7(FsFDQz><^5JcndUfaVxWwlAkX zgTO7iz3xZg~i zqe0<8Rdey)2(Hmi7)Z9!ghoQ-(nH^Ht*N6z%`ZZ;IyhuTz34ZOX>y%w))ECtpWfe3 zZQq(d*v!eqGYzVbFFc2fr&@@Tpv<^iiUW5{8Wt_`H29Ki5~|I(Q1fUG7{WcXv}lRt z0z&{{wHxPR4c)}rBa^mXuA3TlvOl^uBF=%P992H{duioXXSOhdOv z_aQC_h`({<26c8md%(Q)1SA6D^!h>}8Or6Wk3LW|k5Jo&f35UE<}dd9>v6)~JPWX2 zKt!P(bc~?b?!2RPOA$<(^pzm}Ow_RyEKd@|$AFOpgmGKIUD}W>H3btI)PT4I0QoYryW4Z@Y3|zJIu_ZRvS^xElMKm~YEV zTXeQS_zOv_o#^p$awo#|-*MDfhZ;Y5uOojTc?BC#Qb3Y$K$2P%V1yc$6HYq z=-|$7=+5B4kiS!(zBJ^^ZEJ0q-d)m7?`%SR2{Z$QFE;bMF96$|scnJ6zrKP1d>oF( ziT7jQCAXYyjT5I&^r*iGVNT5$%$uHJl59+UpE%xY6*%E67P~Scyu0m^B%>0^k<88T ziw49M_Q!z`)j6EC!+?Nu9yiSINfC-eSUN++tAm2`CfTahkHrj{0=Izy|^Zgegq^N?{&5C$6H7-n{XnynTFmGYm8qM7D@}sOtW=e#Sphuwy)A z49f)l!eK9^R$*nRpFrMHG&M#h+U&>a5>GRP#u*p!*j+)m&1J%I(sogM!cLCmkyK(A zH$uM{hICwCnM1S3gTi;HMW7{@+QK)B;vIPk9)aC{v#o;swa@XVlDA&#ow@pY)O!{M zRDR0O*tQ-bAxL4g=26C8^Dur$<1lAX+-FF}*UsYW=YwX`1^LBTar*F$Vnk&_#mi=x z7mw6k8YTRw6Kt_w9oHrV@B%XzB^`m&ey%=ZO3i_;BFS{US9JkUgj$R=8>BR(h+NyB zexah|f+C%TU1q+^5qFU|HBqa`x4(gVgIh%v!(R*X>n4iL{RDdR8JWoL0E6=d`DflZ zZ_e#=u`@EN^cNJP9>uxN%g57jwupQiL7gz*fk6oDtZF(_)b|Ta1eYDx$HOgW@i#yB$LkYluk;`(p5u+aoWyZE zQ}IheoH8-D@mn^jpiApz`3};DX&09b@{I(xEmNtM@AcQ|L<#L?sHsTwL_$bP}F+e);Uwv(eY{yw(bi+QD^h*-L=g-_t4N z%V{9BZ*k2h#QnR`VoLqC^FYH51j|vMN!Hk{V$9k`OGKQQJI_y{n%h~=z?IXPJ%;FP z3(lO=_T`eg*sycLa7>o8&l_sj9HH%X1qCd_C=UB|xgf-wk=F^or-hTnc=|Eg0D4l% zQMoo$!FwEC=yMRj38g?EJVc2ao}ZmEk2Gl6+&>q!oK$r6qU21qdxOpE3_H%XhZ)tc zAHdjBne(`CERlD|Oqd196S%M=2w%K+k?DcT`c0ih6=wO>1pRalDvWc^jvz<35Jkl+ zqL5leh;Z?DMwTb%*=7PgPrS$d-zN|_Ol+(BCE#VpMyS;{`2K3==K6MFV|Z+AI5yjR z4nutF^*Qmy^k2}wQ*pAO$k_Muhug19`9ahMK_ya46B~!8FKX#66h#- zP}9ObuztfF5E;&7#HjzheP)+;Pzs=c|wA9HESGIoR>WNrFe&|P-!iCQ{+(5 zI+M1o9RyM5WmeR3%?vqYCvP0n-j#ET)FDT|cYux?-)Z&*#04rd$q2z129}P5e&x6y zgL;@wn6!~4XA*PBe;`io%*sfFoD-*fkV4v?lVXVcZZF*AOz9B1t9h^KvvcK+bE60= z{q(W!C0TdE;@7pyX8I(9fmN%X{Ih$?3R?lydj#!Xz{YH{_OFjAuX|+Guy2;6Ne=Y0 z7cy(}KQqx;>m^M4^`>rSlZa<6kd`@Obc!`X+v9;bUKRX+Np3_DT$v7zuU~8#b*kYp z<+kx{abH9;^qtnZ>D0Ho`Hn~TOgvG|yyu*R;SbjxV*<+pdCxXcv*!wVNi)*l4s^EK zNsgvl>`Z~uj=2^+#NAI~ebvM-zjx)_ zRY1`9H-s)t#qz`hI>Glk;#(Tuk8dZa6U5g=I(z&cuMeu9^BV?qHR;2sI}`^X6(=G z3BrDuM$axE@vdhXB%;5;uaQ)DPmo3we$HbrHiU3t*ki2jpvN>|W0$u$`19Swbl=mO zYxca4tuflfah+(`VVhg1)t|a~xnERW@w0&oR6gdGT{j7{ngrHb9 zP_qq!Xk5&AL6ocPpC1M)#Nn8=kzY{OL`~PycJ>?$ z=uxKFym-Wgw{MhPB`}%ihaCWyTAmZg2;*T=Shp|dyqswLl7=5?^;X)8Q=z4MbQR{I zDuN0BiZeZyg;TcY+3K{NGD7@ubV0P93Ou(vVyr+Nhs3C;>QP9ea|DBMYw5{%*A@0e z|JQQUT#r(XvRUunU0!X6SE4rHL%yxAv2V>>XAAUillQhVR3c(M`9|w%HRNUdiCSlu zo2DDxJ?*~U-^4?$e2!n#mLBtKck&BI$+z=^JKp|Wwut|G!$*F-Udm4F`Ot#*2Rj5t zzLBqS^Q&FNg8aP;y`6;1OU3W!Rv!F$(-F5%cW<;(ya6w;$gj>qgJhR4p$f40ejaKl zf__WI7x%3&RVEnItNbuRpx6F*>7X9$fss7U&wHI)B?xd1@xxs9$}jjn_On0ab62BV zmHUbb1p>AX{8+(r7VS=r0mGwSs|{R~B%bV1d`JBvhe>543XjMTG6UxjOmLObq#*L` zdf#^8HI8Ewgb#g{vkZx9~x&t@m)=N zeK7wBg#Ks8;8a$q%eI9e(ok+|d_*8&K#AGzNCe$hN2QDanm2^YtYx*%&}C5D2R2SH zV_&jt`P@acjPJzWa^Fz?Xl>A$dCpnZ(5r3*x#g^6&f3~1`r4* zAMd6^pnxaBWax?_hJI?D+EV1Uy*`MaQz9Q5z2{0mnMiDas zgMX%ZPo=fYx^4xrB`MS}4}9*_EUI!i?luW*j&*b&TXKXm^eRxC*s}ElPHHGXD}n`RGaA7KKU zP1#5qjiwO|jjtN=*&*xCLe(_Z~MDO<2#$6*%2u>ge}D`R+Y@!6@!@=dPGK zsVU71FVQ;_E`@Sl!w2Qw)ES<5M@S-I0SR^Ka-U@}6x{$b-NceD>||^gV#a}g?;k## z+a)GQ971Ng(OJgh|MG4T;ouB{ba1+O-oC%i)$;eezM&KSz5I85l^87gIvm{fvJ~9) zZ#Y=&9ToM%)L*o`WaocHxMW*>Jd9t%!fkaG^l+x(C1FdzS$rQo@ z7;BF5BvCGFr|_i1OZNUwXETQLHazAMhzKZ{my`1y(!(3hC2LU+$y`%}K>q7+KVq+5 zdl0bKPmu@5&s+*-ux`-``| zxm@oojZFpjyq}YM_h5&7Me6$Z^l@-=3iM;n(Zyo4s1Ad7C6Mn0A__UT%?F z(wT`Q3ur=w&BDaMOZc#LCzbE}!uN_T32*b9>_XG~LQM&LuJhku{>AY?JxxsQ6NKU) zMcRPW==^0-l>`PjLa<;M=@D!(cT^)Xx>TAfGxMdSm%_84i~$&|>xGi{o=MBOt>*(2 zBj`V}Bv&@!mEBPMTNXSPW`GxdIPWV;OM z!se`2Rb<4DIQr|*Q6V;A>>m&9zPgBZhSCOk2i*&_1&H(n1qa=l``tSu3rO15NPa%%p?&GKEXzlyB?37GFR@IKo#!ktHVPwR)?kD_%~>Me>7 zz>uqhcyTY<4dz&PqBu8ms|wFK(US@gFkUw7O0#w6x#qmWk3UCxQLj~$ea7c7 zJ!_IxcpL2PEb&wl11UR(45R!mx&)_Rmg$k(Vyq`z&`XSM zr{Vi6lkMcQyU;>kP4#TP!@NIu5BKHF7;{-|8VX>4XV4noN^3?Ii`2U!6;^hkQcpIT2hE zJ^Zx>|B~a)QWBy;{I@DG=XqN9`GY9uIo)qU-n5YE4hl{K{oSQtN8pRNY#GC4xT4uH z{Y=#H!=4wXS`KwW?vM}SMIG@@m9Lx-M`uSlCNs^NzaYX33|X&FuqL%V$g{YpTXE?)nvj!+wIZW;CsB_(DAq<6L!fFMInmvgho9Uv)qWT(~hAX2oFWgy4ilM_(gx8+fppxYU_@%{c-{ zCng>tI{T}C!f${pIW5iUBvVdQw|1B{x1P0mZoh+X%SkH2osTyM%5Ly|`V7%Kx7B zRs2;dMfp<9bSoeyfsDROnDD?g#oColvQfG; zLcbX6tG-oi`A5(I=(NUpX2ZE zlCe8)8H)sjAe!!k^dD|qL3clsu3tW#e;l<>Eh&toCt88nUEhN|e8uxN(QC;tAHGs2dwkWoFG!5Hj%#oidnvH(MhNAU_WtEal)K4QtnNOCcm(H0RhD<5@3! zbi&pz)*l)IiS3vf+}PhW7oi(Kr+OSs&9>l$1VnUcMM8ULKQ(9ms+O6H$-H;jK%7679E;%rhPEG9 zWmxImXw3ns`3|45n{So9in2o4YeL*zL;vG z<2lJM@-v@+%N=7**a~V4*(!JJLf46F+K;)eO+0&k`m219mg(CkO_cv9xr2l8JKS%H(Mt*D^G5@)jGR4a+Dml)S_ z!eRS28G2z4i>xx;@HiekGQ)Rx4FOH>s{jajrwo`sg{lx*vJd$( zZwFvC6S1v;;8RrpKbpQetm(M@nilB>36WGrcZVPik^>naU89jMK}u2t2GZq#F-F5k z>FyZa(k0#K%kO!g=l}iny>{K7`ZAQl;ANmFtY^!a0xmk2yr(QT_Xz4tt zja0y1R|o1R=O?-WQ-T@#TzyJRmcUFiqs;Ivm}nl>%C-{@u2I@X`IZ3P_{X?sHx@sv zyO*VnR+H%rY;ur4!>*&FEX>=)3^UhawQ1*b8#%S~36Um8Q-3%ZI{ z6DB(tyR~fvH&44l?u8EdmgpLsFshv0mknN)H#oCrT$aGP`1+j5dyQ$)k`n}~@>d)d z0iFoU3L{#f?zakzNIJa?87P_`HpB7mj=ibPMs4|W z^2fYC?gGY1{Kv~gcRu5-e|J{P|Ni-RzyA60Pt?DMiu=zG=Ty6`_ip@6bV5AMsC+^v zKIdfj#P-a|JB|f0a7y{=AXZFQ!>lC^#)HWQrzPKSqzOHQeMfHK)<;A1UKiv!u z(f)xoE$t#Wk=%Y?j1stPR$8-x1t8+9(Gr7asDriO&G|*naf<7GB!)AKtzPPt@$~$! z$QSh*V*F;Up|i|KSVsoow(Rt|%NJ|Q##FBeWw-01E0+m5mjuq=D;(C5EOvjanR8wn zv+M(0^B*sEHgFR;J1nL4GWcPk$@NK`Rhk|zM7-xjukxZ@%H!6Qm_eCeh&B1j?n!He z=bJ_v5I-eFz~pv$BoejFi_``1pED4>jLgoo*zw+7`Zl(TSru}8gTZvZe6x-D{Lfa@ zKu^@f#q#d<GLQ{i-_OHY02xSt>SvRZ?NDsS4=UPj?^ zze#KMv1xl2B?y#;YzYFzfxuafTrKb!4A3lu{ra2Dt(?Jn4-utfn=M1BeQ#A6@m>mbnonLXYWaTmkG{T3HsIY?{*)LCYYY(?)|D}xoj3@ zI&p3hl5zBjrI!kBY6zlV{`?~_{PW*$2mdbrNj*_IE3&~YG%FVtK_gWx7a8eAIhE6i zu*m)PFtX~(S*ys58qa#u9gtF$jhi$4P^i?@lJjuu7vkHiO6mJAU--H1E`r^zT`o>6 zq+0*Pxn>P`?K~8TwjP+u61lvLn*9?g)(|Ax5noG6Mc4rY44_tnB%3;PoBdZux@{v@nQI+fz?zJ8TTB|FFx||&H3{=W z1L1EVeEVuGL+OltxFg9^abD&Nq4V&`WN$9GGSIJ$`6zZ$gx9&cPV@Z=)#hWVzc%oD zI5Bvi^ukEzmk_miMTuS0zKBqq5YnMxe<8p8W$Au?(bnkL|JH)H_<7i#q4a>am^v?$ z)W8V$v7WDz)NGxv@qNv%Hlkt9)m@=j z%tOFF=@HPexuDtm=|#F=SfDz0oltpx zWfAjS(@IU#)F=v*Ppa{=>@Po>k4sldhS?pp(hY7(Q^%XM^2@CaduA(Fqpn$hYnSPf z+zng73V$+UtmG0$(8F785;A)8@-MlBaI5ELP;U!m9ALkT#GGOtakkbI(w%A7n~o>m zCg_u&lF5FdR~6T)y+eNv!xZz9PcD2+Z;T}UW7{yOLalu7*g8+@tp{XKL)^p(q} zPTJRH)ZxH{Rj%imfi`U*aTrhvEL<|%8A&FBs${y~7tV#=YL3{!KB`N?Sps3Vrziit z=<>ihE>jrXck6fK{h3Ijfmi#p)@7V2lw7Xvf$)iud37n*MNqpRN@YQY7RiWn^@Zrj z9ol9Sxj;ohiE&(4rbll2w~n+N&9<4;&34TP)bR4}3yg%J1kc|g+jMBYEr!xdd?Yq3 zMO02Sp+zs9XMWd1JU|*q;4A6{>t>NfAG}AAsTw_RmKDB2TWM?N#&jJpT4@h)M*rkP zC8hH&x+&Cl?>l>ErIDM4#at~<^JDYG?ft~jSTgayhQAkMaN@SN=Ddu-y&WT66^65n zyvi5Nxxv@AAteL~0ba6qCxRDO$Bh4)?jNoX_I{hYP0_7-SNwTG0e@t(KmWZvn{6|D zyt`Hpd9YjBJQx0uCw+fQ`lBF76l{7uGW0QM0j@_nB!Z*aYW0?;C*dhz90xPT@LD?W zV!vFp>6nP8Df?4#?2@E=R{m4jP}9!)KLt~=eX?GWQ^zL-g1?+Fo3ww!`_MO=eD;K* zo?4}9J7{b6-dIhR<|0S%`?9?EsS_kZ;jX~G8dd?P4VrcNUF6#Sd3}!8ess~xY03&f z?nq0OvK~fJWbqD)(oj>JOTBMyh_#*vxSR&TRFzIqd9U>jE zZXm8%q?qlr-6bijHMqFa!MEYtsF$_K-;{L@5SdQ<*k0zS&L|(Ynq61 zPp+JSY4|DKmB5Lh)>CB4@is$@FU*tRR@kH{;mLbu-;gv6Xgm53V~d3hIj>pb z-WV#mz35fVjzNtZZ`$GVMjWx9i4eW<$Q8~TFdI)uvp0_s8vfLrQ*}^PL<*)^x0MFZ z>Lm=wMLk2vx25l)L4}|cU~oQrS=}+ebp_Ki4dJ=*u*B6O2-e!O_ZDl`&3xeo!;{I* z@bQ}SWhw<|S*n!#A-rSFLh6yP@y?AXSqj~x;;w6P{qjCmJ^|dLqSA4#wcJRHn{o$PM z^0a|@`3}ur&`C2B13lxyp*9(yd}vyRQX|X|)HI1eDj_;*1A?U+n&>{ReydB$3;E|8urXngJT0go zGqGi*DURMoi}%$HN5{&b52Jvt4+7DQn@Mb6=%N$|cUTSVE_D2K0n$g)jlp^^7LPcKeWn~V8GgI8Mm~P!$c&NgLy?CNU%)g@*Sq-N3D4;dtuO| z$eC&NjBx*iO>w}Y>}Pt@Hb%|k`*;pChqNgDi*5f@{`zLa(H;e2K9}KCzy88hDVHIu z5~E^q#ZTiJDoc%1Vo2jDgZt`v3FJN|IqrA*LJ7`?)J0k=4skur^d~9{BZIz-j!dVMl z>H$J^%4t_Oc=t0W1;W4NSY57pC7o4{yHf+apmu;DxQL^E$3AUcIg_|QY66;|^F$gE zlp}UB!KFN}HN`FRIo$OU=sY?T-AO`W6RcW<4h9R<@a8YR`jCWfz=DIOgidKOm{4J> z#9)~mAZa6nAcHj|BpOWmoZtS0U zC+ivhc&Z`q?LC4YH2;q}_Fyd}W?iH5_r-gOO-ft6IK7ri`mWVJ6){#Cx@yDsik}tWbBdS%iE8cd(vw-;8X=Y;gZ@dJ> zob&gEdxU=;`m~WlhEnM#)0(BQk(!%?=%B{gH3@@q=k0}fA^lnYsV9x`m-(E=!lgC7 z&WpKn<$hDg)1vP#zhwyP9oazsoilp%-`$5T+oEsm$U>ear!y*HYAau3?vxtm);>Ki zpXM7I{;UM$t?!;^;-WWaHiy zkK}f{E`95^eE}jhQw?RXm5?Bb*($G&s70yuy~1A>ZXm*lP5l&CM)*t5%1ivGej!Mh zKg@G35d$Z$q?5H-xTl!YMNuO8xvz`q6%F1a9CWDyA+M@7gV7rRlndOLfhKh^>Qq{e z?JW&vh(p}1psK)d*)714<3<%%PX9*7p_vxN-KS>Vc>w;R{EPc|T?d58d(Wo-(#6R^ zQl}Zdc`AJpjl1Ls?*cVG!FTC`W>{2GWdqNcK}T|>I_~n!jJU*sWpMlA+F9wEd4}C1 zr{4Y(p|vLTg-ANmSqzy2J1TK-1~77Jrk2-BfIdw4)x^nUXcMVOe4@iUgn#!W88^$p z52NCo$lnpQ8UDQ@_zd_|8G9mnPnmjhhVgDgC!z;y8FKhWtwi8@_4JCXv;lc){!!C z?rWdi*HhQOCm!9-_?iMmn;yl2|J^Z1bcqeG~+7r`sp%K+zH$j zDFLRfWrZ*2dPmLH?5z%6t&x3R$bOFDRwL{D&E8-jeZ`yiPr&ST5E{+D1sV~dug=Dp zmZ8Sx4Kp(rAD4I2LCA7%;noVrM}LHIlxB(Nx@T>m@mT$|zFu@E#v4ebE_&qeOVCnT z&#NI#$_;vcuudHY@7RpQYY67>w`ygI~% zIHUJ-{fWVt{_^!#g0hZeBAc!i0l-Km{IkK<<9xdG^ZN2?Q|=1GaO>-*SKlq5n)5`` z^2OKz+RqY$Zz%ww7e%-DhLq;XdP5fySe=2;5j8L4l#`v85)Mzt_=C(NZ&Cnsfj0QrAkumOWEt?I zVY~C5HYS&yj3O6$N7qCw-~xWF@~#x`n8InrQ7=|3V*{T4~;l0IR;P%lo< z5jC1g8~V=hF*V`*E&gbMcd2eqPvLCfcybd({ie{cGcu?LZED?+SFF3aR{yE#_v-nkYzeuGOl%_&Td$qKmJVPJ997V>z+(<6Ur$bj|go} z8!98-X^7jaFqslKK(sY+4gA_ZoT;+;#QUg!(L&r@g0-Wx)q{mvaaeQpRpYO*ExrW` zUkWP`wflYP$N4RSZ`qtws|Ts?UMTu1od9p9F%%}~SqKF%l-$%L?FV6=FuG_F{lv?Q zJ$+YapRPnnH2z+n)|yWw05$j);a@`1No@T+GF$$cZ^JVHAJ?J&(4wVZ4Zx{`1=Z~w zednM+A_9P*Jp3Z4MX)MiwJZaYsD)Iytt?da*LodN(GKi_1_RPrMfYbXsinraAhk>F zk1 zfzVn(P!U#;f?F`#!kB!OT0rCv30z^mp<3x3>5H zPIC>P931^x<3T&qH=gW{h~;LqNNzhU7364s`=2|*KXudEgE{uGV%U`wm0?He$gl zRss(WqnN`KaVX(`!h!EJ*>oywjMaXzQPbAx>b?EIjiewgqDDu}DE1}#dj)B`#_c1b zvFANUEi#`hh5d)-F*Hl`n#RdPGZ#hiQc?{r#I6gE2i{hb1rhWLvGmo2hRsR{JC&fX z2m||>Y6D@5uMX;i!lfEDy|tSrdIKLkO7pF0!PPJ&k}zS8SB9;^6PS5mGL4Gn_rGwo z$WA2DTLEV!Dce9P3MHgnrR zyUtbBgZP}#NgOF}Xv^zVV!*@Ocv+nY=_(3W6X z^6b0-G*DR4o)23%d7fc5>Y5U3El4qcsQ|6r+Fgra#QDYF)OE)KUf7Cn8RxSMjEBSg zyNE~KUe%T=txuwu68qxh?+yTw0XOEu4SZB^{>y9s;c^x$*gvT|MeCM1& znJTWNY?&%9BVc`{@7pA6_LT*VWTr0_FlWPXg|ft_r%fsU043#ridug|-yIaPBG{xO zGx6+Cu_XMVAY7!^BfKco?V`6Q3VCwO-nL=kXa;T4JjqVpYVQSYX?bVhhfBxDs z5f58DzHRQf>|^qD_4s2V<*npX|7qU-d|EA?X$3NM&{XP zh}d(!-_HMZy}Q)<>3GG*^`+$Ox9owsWm?n$Cb{MjYAYfCdLUG^kMNUqI?ELOni-+B zd7W#gRa%AzRc=QL#|15_gh{Cu?@&%2VNJkqqfg=^?a^aOp7741jhSAx(*Y=!j76Nm z)!<0^jrmT0LW?KE_BXmOlFJ`##vbFyr0{%}@^dSdJy=GHTwR=hlf@J#ZsH0Uy+Qef zhToNPf&kqY--3|;!=~P7vUdn)h8J^}o(8C1QB zJN9)PVwzZ0-oVwfIQihrvO7KDb_li)O-*;ow3tH64B_>Di{%T^UoKNw1k#i99xC9W znd%jbWOhVSw3|j{_!n8JkvDryIV^jk&Z&k!_41zy@j{c^K|XXIpV1qYN2) zk&I)!vKs8)3P-)Di<;JcpyMC1Gt!-f8Y~0h_es95qLo8<_+Ax2T0z1lY0Un@KlSBx z#r5IgK>nWw=!b3!YC@Y%>O2y{<$B5VD4H4L9a~2eWS^Ivo3)H!CfR#HYmV5eday&n+ z^@vNd8W5lxv`X=R0wRU@p#2ti=xS*SG3y|*8JL%0%u8t)+vAn9Sc;q3UrWCOHdy{RMvDTbzuZWs-a<{XS)lZk$kV@u|rTH@3*YQdCQ1lGCeC877O?-=*l(7D~3bxM#J`Qw=ITJIWoUK^P8~ zOqos7v)~|8hLX_;;YNpe-o?bF^UUqt>iIS&qV=o_=d2edLIKH2|5`%N3ms}?9rl90 zf)P%fZljkvT^T|LEJHMCwe}<*fd`IY!`UVff}5H<(20Mlq~|iGxc3%rqCqZ@N+AgN zMe8<{tKTRHJ51#)X8x?doq+YXvhygqM>xx0=w0Yeg4Ma44b_I6ED|hIV-J-YYe4`6zRiz0Q_5es@djoS7>0ubwUd4_0^jJ-tRM`$neH<@OAN2TogaZ>WxxcRiKmJ6AeBKQ zu<5I(C2m_ZWqwbX6a2w&M}lfm=(c{qhxXQ6dQs%exp1!hleg(%=FGHrxg=u9``>6| z;A-=&P{ZAL^WX92+qu^JrM`}vnLUlg!T$Fm2VYtFCJ$OFb;_Jl!!f_x%J^_XO+wQQS?Of%@cnUXA7lEmj5+sgp=ra=3IA6JplK)OTC`$JOH1O_6Yu z%O&~(Oc=|*B4f^ny-1jEy1bOw6EpI*#i3oCICK2zzz8F0D~HExy0oxgTJvbn(s(4D znJ4K znA@s3nmEK#dvm;wg$LSTKKnWXIWxfS=RHFCwg)#e)4$nxj*H3*{{%|Y+PBUmy%i~) zER}=d98-%wb8u58T`wT!=c?VW0=%5+xr?^(%~TpMFJ3grUtD{}oj*HR&o$#P!_II} z?fB7a6Q=iaeyI{jBNU4XpGMB{Anwew{PP`)vi*l=3Z11Fbl1Z%BR9Wn6_LI99A~AD zZPP$^@-XgZQDLx9aT*1_oh!+jW(&lzt})kpE=(c&AocLcl*kB7bG(owpGxyoFr!52 zH^zo11I?%gYbcD0I-2N}FJy?<`Wud3{%j8TjtoF!4rQt@L*~ipccWV!tn^>EGwXdIiF`4bG;UZ zE$Nb49-SKmELFco%=p2D^NpZS73}lAF&B;wL6{s!@h^7e2jeFRx^<2aTTLgO-(25? zBXsr3#DpilZXS-hNh4zSOordE#d&CO-c$Z9Gmz=Qq*!+qH;k90ifIl+ ze=2}a<8`5KB1!T``hI zhF_Ik0*et3U?wD}Um?`c$Tni2V%?oGz5mG@-nW>{-S3*-6KrUX^z}~XL~G65VovcZ z)&=d%YsOUyH0xLz#&XfP^Y`&=;>RjB5m-4A8ex}l6r5&K1}l@<)@Y)_j0TrObB0hy zr41a>bOn{BlzHo7--LXvr*T(kdC1>;p7xVm3%e61&aj%)yiP@8yVMMKtaOe2X(!ST z|4nPeh2**ADpm2*V0GKW0+a$ng&OpTf6nQ*5Z<-w*E&?2f_Pz?Sx)MOdz#A6>XYk7 zJrAIvMlXfI)ZCYoJnJ!4AqJwVQE>P!_xdNDab7 zkGDP^%vdxn5~=Ato^ofqlJuC=0NlK4II}PkqpIAwzCH7PF%h=9dAr5j)(OdP3f6ot zbP~406cuL(Oz-NTJ+QhDjMB||K%mm&%LxMQT2j9JAvKn3r6Xs8yf&un4AW9dc{?gVDgk>-y z(TpRcvD&fm0>o2iq~gpspea%}QY1PzjFYxX5d(XF|6d4MZ5GDcDaPrV7S50}I3X!- zQ}HFa(^hegN#o zup9@y0CbAh^G2J}$HpCQFc0hSW$75~i}WaA`Zf8jp7fhTm8YpJg6?(cJ__{}`&7T$ zS$x&NgMpAF1_`$R9=R#})2cO+Ca_@kiqZlOVoqdNLdd6*xZz^-UPa5zxFDNRDBezs*7LYdyOoUv1mV4BiL6a#_mmaI; zi+I`;vk{4)D;2g1lNj2qpG;V#Y~R{%d&rbTB7H&BlVEW~3ORr=CB|L{qLoQmgifHp zMrTRc(!2`w*zki@b(`l|=`tFzw?kPV*#H{H<%AJT%=gr%{i$_PSuFpp6Uq?t>*B4Ap6dJN1 ze4c)a+c@R%SH(PGFrv%D#jyVm1V6LqkT!F9v)UMXNR_(^pcHA8B55!kWQdJx>y1QN z%JKNJUA?ouQg0lw3?`=v0|2qDmw^ePp!VzayKG&T=3ytur_4Yiq}t-hf3K3BGe6UJ z$&OOpo)LGc>2`H{pfX!|!_=2*k%VLe;Ef`CBAe?tq9sda8gntdd6QXA}d!m}2CEXzaZSwEJQjEnz4%JyN zm1!x(t5$mgLc@H6ZVu7YLWwG> zV7^l~5}-Ecw#A$>(p$=UreaE$|KC}w_x|H{E`>>DFq4&Vj zsPPZc0>pK+h@!|O#(_@QM{&5}Slm9-TlG#^XVuO~+!OM@Og|)b9n6a6{C)yow_IuMg|T)9Lovd`j$_l658SMT5q2 zo{LLeYX6cGh8F{sODH^NHhcXRaF2pIX*Wxw2iD8{TVhadrSbad(#*-lTql#+g-W14 zjIXHda`?3F@#NR%PpbzBnf``5=8SQJFL#OYOn97Qp$GuN6!QgxJ@YTpQ77Fn8O#;> zv!R!6y4>`Jcq?G0QVOf~Z%o~Fx@x@8I$aRQb{v`G8PqnyHA!Xrz!GLOb+5G3GA}M# zSFT$H3_oXn1JfD$0W4xWch)@IMdf_lgUKteFVtlLRd)mRe|HJ|`92q7f(Hmxd3(2o zPnbVlvUvav{}?x|u9K`K%Bc$9fW$-vUL}q>f0{qiwS^~|4nWfc_fQ&O;p7iP?Dglc zAojiW$!I`w$i5o3Aw;~S@;-1quTzIqA4cCy50l%vy zHkk}*y5++}DqNE8rj6-TB0>0+IGQW3MezIu8BrEq8xS4S(-3hCKuIH-iof3D(Y%#F zIhHqh*uq?Di}u0&Q4$t^V^Bbibo)D^qU<6jRm_DFpE0;2G8&mr^H*tt|tlZyVM4Z;~3_QPy zzAB}X<6elPbZoG#6=zm(ikn;Cu*HAGS!Kl^Wk|h@#RCAg@H9WsdB0sbt#cr`oe7ERa-Tk3~}R$9z?tn*DlK(Z50f z9;he#C-l0kD%M|`;a{*EFKV~P-PjGD9WCvf{J5GM4^^VGZOED#y!CIiMjt>~x6-Gm z%QWu7s*2qZWIMWkxjG$oSE!+vg@Hw9QOwQ8w%%&jiWzB&yA$IG|MadcGkTL z!5rmo{ON>45nn-ZYjObJLELsf(SB?N?9w4h??ILNh-_Vp*b&#tTZE-c#SclItq~6ab|{PlY0JMF;h%Y!=_+b!{3(-7d9CXkxK><<?H2O(F;pJ#tl zjP)=ST0~oi`hkc9#Z=^HZPbA-KXm+f@`|a|GAZuYp&?4C3qfopz`*Jd`~76U&j=db zhLVK1!LGALn;C@rM}#NVJhl1eTr2og8{mBMU>VBZ^y{P(&n$ec;=Bi9>0X2Nd$64P zER$YIWLOFr`jsigLg)m&rHH}_5c(AVP}fjM>7OAabom`hJR)%w*2G^94>EP5sMk@a zgH!^tm}T_UIBi^1-*BhhQs$Ud;O0s3eOWDy;1XX-Bqw}f2C!E{ufgLBAe<<~Z(r0w zc)p_g1}{^#J%!?F>e#cK4qoO@aj5IkpZ#)kcK0Ey~ryOc6-TOLN%FfG*s*z3k!Og%T(6|MgF)^VsA>1KNL7^wG2$wz=fpV|bKM#0CVWAx9#r3EEr=tBuvBo7h z-1(hLKT8rfFh?WF-Z0xhId}ZCp!O#R-S(1+p9wIf5zwUWWKohsshG-mXs?8Sqoe-Q ze?*J79@1hugoHS$Upa2LN640?qD6Pnwiy6;_=e?qWOJ=n^0x3lDSGE{^K8x^F>e^n zn~`Ivi7Ubdz;8_nXi*_dIC-XM9}01TpU>9@vsg^s_5C!8ErEoyZ|?)eP;ne@1@*i* z%A?;ldf+9?p7%PU&Oi}nT&J-n&qF^Ol3cy}s|{eBxFC?B`>acDQtf8alTJ4L6K;Uf zyF_+?s6zi>FJ`B14$`gCLDW)0iyeYY4*_M|I~jFCD@Y^mT6mcrrpY-szfH`%61Vbe z%KAb925T(DQWr~7aw^Hx5I=-?7B5sy=GEpGdq`llL4Us!hNgv;06FASK4{c%z;Doq z`e_TXMdGJBv)AqhJq9S*8;#y|kGKfzAp*h0A;vaWu_?jJ(4X)hVjSH>b2seCA2?Zc zxsUz_Ex1WsCT1EtX-7l_hAKtrIZnztKsAdeAhLj0dVz{=(uuI?7Crbd-e`XTR!`77 zO-(W3C&_~1c@%pTpiiQ5(0Mk7b(svwnO4H_5Nfb8i)B(%k?QS8FK}X8SIgv{$&6G? zqePZ2*+RpWsG5eIQyt#Ufua}RP&*8k>PA*Yfn5Gmhsq+iW$zVwFq9E+7MHyG}-vP&1PuNI3(U4m?H7jtx11rs3+hqP>+_^I5wu6u>8jXZ&K*EQMxWJsOus26 z^(T}m@^FW!mpGYNkk`qpaaenm+do&-d&OC5CD<(sX}6>@mBCY0XC)kHz5z{ zi9Yzl&ow;6KO2nZcM8t>#J$gtes zZ6G*t>Ey{ty_!=O7P#?MGmC19hvx|K^AY8gmx1k`b&|ep=@F*Mn)#m;!ekqf=EO0c zt?HrMLohnnBm|>EA+!;rn%|OjYgo+!GXeCbOd)kW)-4XRJzyJt%__8(D62iF41i># zw>dYQg8a-Pw|HF8+v_%R^q1i7%{AIF^Z}Oo3GsvZ29dO`OyiyDa42TH>@?FX{SC$+ z#pGe@KSpvche+f70S$Wa9AG!rgY|VQV&Y=BeDE39Lv%yit*uG>g2Wr za=1%XtXRy4X!{uiLGOt_4{HxG>$F}upUj57KW&FZHsB zm0V3ThSixytA?XE2v{CH%;hnn)=_3%tGo0@QJ6=Y^9HU_Vt_l~q{4#(E;FfgCAFtb-m0=<C17jf3b4{3-B@LdoHZs1a7##nfDL!yT z?G>`j&&fkA1GcMQ{P7z7M35%Kyi}EAqb@z|lVe*RHG-A0HzjP=UII^Ih%QH#{+w0S z+V>Ck4h2ThAall1&MKbo(g5lN-(D8V-%W|GDmKb6LeIvEe$2WB$b94vQ8>0bnGm?v{aXe0~Unmb?nt(z%B@O;jq2Q=o=eC8E3cW2pS!{zqG$$+hg5X@FdKV z#AMUJ8E)%k8|&@q=tOs5wH@S8RXohQy$kf(I~~hBu$%4MV8g2&vh!m3K|R&nQ&myw z>$B%=i5HM$zJaLQIet1>PW1NYJ{+VawqJC6Ia#IU&l2M+poRF+{fqD3Jl&iBC-Gu2 z*;yd@mXcjEcgTEKVRa@(JkKAVHP2yp%^8smK+^zJ^;$UbtM@!$WSVW*S5wc;k<& zFB)qm^MjoQrFDm(aiSTllA|+X1ChSPT%+ATwsr10UMA?|G#AfS}$8^y5-XZ9|XykABm)IcWj)~1|~Seei* zY4%lnnDB`OTJTbGi|9-2+$g6n3*Ljn!4dA9J$X7;dnyR*+)f-X9`G4IoL*qSHFuw~ zfy|Bm7cO60|K?8mp@~cl+ChS{DLb_S+Nj;OU^*L4unaM4SW@bb3x9t6z({Ku=jbdw z_!ZDu7s)ex*Uc9hIcdn5pkK==9y?}i)9*AvHN>EL$RTgYRmU{C<0FA|_DPHQ#u3Ku?Mq&jN1}WSPUZ9B@gRO1LDuxJ8qPF&)6g;{(Zv-hZL+m^Djp44n&S&=Bl#o7`GcxC$_-#b>^3T;59 zxKWeyOfEJcvpmjK<$PYJ&Dkc&-M{5`$70x?Di;9lhie^fueVwa!FDYr=tUs^rJ4pj zcp9^`c&P;(6_b{@<3=Z)1nRMB@EC0K+M6i}OfcxQYlpW|V;b3Tb)u&+!wBLHhEvXO z$a#%&Rj)zmU(IWhRw-4xkni#sOxi8!KZ{2Kj%Q;+PV2i}fap48A9gpJv_FueS>+)s zK}F}rmZV7y`hd}z9^`H35ZAc`{##Biia7)sa)5f4gLUf5qC&o>NrXaqH-dI*Mm?xd zMC39yGT6mkT3RLI4U>J$dJ&CF^s&U}G6+$J@CiOen^EGBKlW%n+Ljr%$y*6wA`zNK z2K2vZeID+)v_54ifjBGBK`)@YeLss{_V@yapZ)aMNUzP5lu90d z+t#e=Qb>K7H;PujmIZhpBQtZP{>fvJb?0H6c6qUD(csS{ICs{Ve2RWANl(FPg=b5& zVM!!+*<5g_aaxzkHDv{ZNPW*)rbb5tVf$NsZ%zs=IR?R6=$QVr<5#6e5cE?0oAr2n_NfmCaHhmj(_{C%sU|%HC2z}=`El6Bz`QtrvT{VRyAi`_1(4Zs0_ud%5oqF2 z2s~ldn$dL)aARV3heX;(?xL9+u4y{|X6$t~x5+_nwb7q&s6xE#L<9?D6|P%lcg17P zm4=LKG z!oGW4a7mXeOv72eD_dve0fTQZ` zs1+lsu>r*OBM{1Fus{hjgggU!y{a3lgWqpUf+Xi%;(!CNv;HeQYWUmtMvS^|a+eFr zRVyfA-0tZRvO}PMtUC9OrR&u9TMcV|IwOv5L%acD_Np#+@5W7AnP2JAE*x7tk9 zf7elTG2UR(6J!Bofico2X%TG9k3Z)P0q-mt6jnnl)|?gcU>q1C?^6ZT8#hgOsuI8P zQtF;JZd$&~eO(i6(Px)7KYXBnX2g0WMB$e(maNgD`I@R4cIyO&B}OuQ2+f4dwSp{) zlcH`assshTOluq1&0v$Dzj=l1T_0Pr6(^<+Vy#hDbJyZI&Qpz823Z*93(zIDm~oQ4 zBPDb*vAMR(CBfNrV{dt;=3ur?dif2_H(I)kav3yGd~OjROA8G*QcE{c83=$IwWY|y zH?IeMwZ*%)fen=3=aY@>#bnTYos)T;P8&Xx2LEm7ZQR^2LhP1$*tp}R{;YG@Foh8S`V=R5E7{oVWL-uJq% zwbm89XWy(-Keo^-9nfjKHQQrX%HB$Jd$CJ7MnGA2fjDSTA7fkYs^4dOik7T#R1eGzzeuAK^1i);ti#0|q={Dy`+p2IHC= zzul6wRm)v9b?X=v_5r4Q*@tIO+@~|HeW~UQ9jxOJwvtf73F`6NdZ2V%_js86V339UsaJh5vVDYWv)!C0>tP^?x4 z%Jc$R-DJH2{bI`c)UQoq85U{)y&T7P>n+yZ1vL<|vdrIxVFLcfGewzAqx{us{kP%S4*Q?mr;J1> zst!w4C2J3xSf`PdqMK8bp46&6M6ia6_RBb#h}oG2fvf|S&j3ov`JP|V|ib@Z<}R@*gI7a9XnIq1`s z^pn3!Yx2h2BpY?(U8QF+q$_35EP9SlEmaBL5J3u?;HzwvrbM;^QHW>T9Q8gZ|E>5XR zej0AqO}DY?)@;SAlgyf`Mq!LO{E0@o%H$vmYctak-I=HI(zbzutUNhEZ#`vduaj=s zAdH>&8OAdVcnNJuCrwVAKN}Os394-o4)hF_6^7MyrkL5*97W!}X9SuK3^HyUlxrz> z*+Wec{_ds^2L#YluPY#Pes@%1$}pYWqqp-{>yQX1%cL#WjG5vo7C&6nenQ~vo~`g# ztB&&WOPzITs7|4*?fEl4e3uKQB@nTsTVGp6e)i+7&&A{@ANT+o~A9>C%{0mEq~6ImO@j!6Vry$KmL;;lS%(Et>c*^YjXu4tvbZ9JyhnPa^6ts z_Hpt+5wJHI8%Ue2v~ky&H>e(4S0{~#6 zI-Oq_gvdFcX|!V&?X5sKxFIbIJ*MT`HVGB3XyoR`IqgflU6}bap3X#fYTv`psK=ho zYf=3SSq}Td*ZJ>}yRdU+&e6{DhJu!?wRgUd7Yjnwy9=rzXoZj!bcdzqPXhir<5U=H zx;%SzJPkp#&RN&Q7LHj>#5tb`GkgV0Z3kP_tG;?-R7-GnW@FXzU47&fuu$hD(RG#% zU`cTc$%>c2P)e6Cilyf&onKLw8z%)Wn+i5edgH-o0|^P*g( z@F8u*U5OfuUqKIscK0=F@8DL)05xne`#{Ntu^~J+mfgcI7;8g7rk=DE4tpz-J$G-O z=0L;?)8|0(M}B-DncQ4Tj|$@!(_WGYxuKd!iA2Im&v3nRw8hZCtn9a=`LRh`ME}?a zV4(~*veJ;jw+9z|_s%JX98&agNXKvSjIWc--$n=%90JTo1YEp`YSWCzn2s8&6_A;m z*a*Mm5pi}6*_X8CA8erKgy!cs<(;@In6rz4p2(#?*ec`(V@G2L{#&wY1`oHvo^)k6rHZ&sZf?Siz!(u z|D?4-okMN*g1+&^FN0I*xj0TPt6<*jK6*@l=d8~Rehe+l`ScxPA5o5s9ZLB}6PL4o z_%YgeIq-VxOm>!^C1h@MRuJ>j9Ftn!@gmnNm=Dvt(uF4E^{eAru(h8kT+9n;5~(G3qxO;?KPJ0mOGb3b7LU zvqRhado>mNMY)?qd?rBaCc8I?M-26#Pm)eEM>me^mxQ9O#RZ}jr z_OWd|B}nc414VkPIk_*aO^o~gQ1O=w?useo;w^BK-W_{+cH)T$rbRq6QSlddz622( zW`uP0U)egRcC3kET#4y@&TMU));Rx+{8=$^uY!K$jE)<;^i3aR3kz z>w3p9oQLBigs#1pp8FC5?r-ZeYp_QS9%is^ZL)ISa z9+8!`ZXED$N#?3mnRCaSmtb=y8V5s^`|fMoc%LbLn4*4Op2CD;w$6@%y#8E}IP~u% zLTaozT=$##g(1|A{}SC21EmNFs1>z!^d=~*hiM=(!##n4tj)O!QO`P_6c!E@xE7P6 zt?#!L?^UltI2#O--J7mbfIfWGYh$tL8CO5r;)mW~s32%YQBbX6N!FH=BB1aF`R~Ag zELz%}+_>TCQ2-TXxHgIR`~$mj@^9W80IHRk!OjNdb;u9 zI7Qt7;Fh6ulhebz|F%OxP^fs8{gBp;d*p*S%Jm~|vL{mvf^eij0ZHS!tXsz98H6P@H)Tv+)`7sOpY8B2 zJv%9(%uAGk??Ex41*(^FmBqKko1ynmGKI*v%zOy47Gya35=3j_0MX}hCek&gWwnbu zD9=wS^yDGQ@yN<>$jYoN5ak%rLciLRJxfb@SI-mfTC7EddO}YdtjwpQBD`~}Zp)WM zyjk)`z|`L-P#LbFBZK9l8)gB1a#cB!LM1ZgC(*g5v2SA|9+}a!ERewrnJVm3HD9_g_%*+_A_-)10 zU=V+Ch%dGV)s$4k$i+yoDVpoTLC`5#+pD$q%GWq2{_+&_n=^l-EIwZ(y4q?{40DG0 z4fVmvm4iuiw!9WTsupD9pQ~QyCb@k_z~H$!O*>K;yXEz{6Fm!j=hKT`)Sc345x411 zS0u!T%8Pmx_70;b5gPIp`acFsp27wqA?9l!vC9DDr;Ghe3+*9?Lk=XMkX?~9itHOjI8_sDl6KWn=os)=kBPbP|fA(6QR=k@YT%9 zpHI($)2{k;>f3y=v)vD(2n_x9XCUnp@~(yS<20w-l`5fE|f3M%S~(Ge%jR_9Oy+S+=~>)&T~qnItj*DH5-b+VlbC%GF0c7 zBHpDR)IBT?xe5eM^Uv>64zb4ReJN*_N;=nzv&nE~u@n)(;gk@c8 zeZ~X5gts$F-R|jm^gSK%Z*R>sp!$0~OXXoij|J$QOp#pluf@;j#qj4~Apq>^&h~H{ zyk@yz$*xPmt*l@>Nf^2In4?b@|H~825q_>Emam=Jjl95e6w4S=K5nQ ziLi(rEf;|2HXp8T3BW~aKIHX*ERnIn(W;rkGqm&#Wux=tCizM>n5dj3jJxvm(0^}L z2p4ad85UAam{xUCQ+L-}aJ~uAt*P$`V3H+g_AC~VY?+|fW41c9m~V@p1Bvdc6#Ybp z;?1J}Lcu|y>_olX znb2oD($IE0y5pf1Oz`esB396j4IMdSC@BJ{uHew50?f3!D`(-)b7(J44J~;n%pCSk zhoMe*5qzyW(i_Tv%eu?ez48c10vO&Ba~T?{Ax?0T`iTB%8K$CNX3BoS-7~pTjRn((bEW zxVK!4@E9sE6KV3Wk!OhKw&`ye>sc_tbvOFk0Oa;R%`AO_LJ%T$IzGXi7C(AMpDhn| z9B76y`viVSt#N3wJyxwYONU=t4K3LVQ#Bs5g=CY`Bfjr+ z(k6Hyy3^h&<6<7Ow8YXF&-~2Jm^>I_EjHc3FJW%R`s%6SYM>L`a%Rra#9ZNDQ(eef zP1lTfTyc$0rN)9*54RJ%^joq%B|r1nGXlfXd@lTBXM2G$-PD}ad|Cd-T74sKS^Rl_ zGv&H$+QV^ydfOP*wl3?SE_BiiF+=8G>btv3vXmueGcm-AsM!&>K#ww9W1C1dqY?~5 zUkR)tI5Vz+trbt|8F8%6(95D{u;lBw_cOc4BOUOL?r&(u4Tt?DKDWIGEfL}ec*tx7 ztg5&uF!31dI|W1MpaPO(zY=2iB*qc*&gV4rEtZh@Tt?xvNxY1Q#kLKah+}jVDQvjo zhi~5ofsUEc zrtSoxkED61Y0s=OfhVr;jp6BkkwL|y@Bu{JFnmpRsvs(i?s%jf7;TjMLYk>1a*0OI zG-HHE)gwMei~R3swi(yKYSnVz8u0*DgfWhsD$#CDh=WM;8aju4Z}xiaf#42PNoTkn zTD*q)$HlIev(IT;6?Eb}E5>+zYPA^`6)%cNA|lYT*87)U=l%XVh-lD;Jx&`J+?eZ_V=lv{t8Q{=4A#$a~*fTp!bNSdknveaDmiG_pU=1eW9PAx800kJ`qX!9Z%E@fb zslE>=`FNL9F*P`>k-@2=2;be|7j}eJ_y5W ze7E&-D?%hW+0=uUdSr6mQlAHL`+N9vp46zcx-4$mc4-sQ^Zd%maSi_#9kvf`*ZJ~w zu%6ZoLiYN>25+e^OA^Fc)~`W&QWm^Azx;6a85O{X;`ORM{f<>6dVgA#Tsbxr-Z!4% zw5gQbhl;bXeXY46Ecb(At@~?Jq;&lC$hp6y-25ArXCOnU2XKh2#&Rj<7W+TmW zJssR<37&3~2s~xCzHSnN;ELw1ueZt_RU^dtpye9Tqra9vC=f&pj?9+C&Eu0~Jh=9D zNak@J-B<{=>||ArCWO5p@r#LVx(`P{&ZlEkOL_c^%l7CmHAJ3aI61moSy zQiPVz9|RZ5Y9Wz8;F>!!?-lmXM#E17FEMkA)q)IkULSJbhR0Dky_m%kI30)hTlEkB zpM}!3`2G{i@l*fB1JBzZ`K?IW!&qG@yD9xv)&+qlna(pPO3}nAVL2d;Zaxv4wu||| zuO{ywFVG$squ`YU8keUDp$WaAQ=iA|K6XDAnV!iALYU$kAEwEjl((eW;Wj|8&m3or z$A1==HH*l0{qTVU!*bCH%j?#0Y(bi-50g_FYQgaAZmpf%H$Y;}6>YFKX3W!Q9M66@ z2ob@@t(v32MK@KPdZPOqLUq4a1UW%fq;0X?pLWrJhZoWFA-OAB=CIFBIlU>3CfS!j@{FkvCB~F`0b+c9$&_F&?A>-q{n2B)ohc3`lO@VI?r*l85`< z0u10FF`ky!cfe)LyY1Rmd|^{D+#a(g{*Em3`-ycoszs)mDRXxh=tFeHOk_HZxZ+J) z^+GXpB9Du5x^}6^3HpNltK2h=dx&xyz7A=8S1lxthj^&=+1m(JE}(_f+(xcO-IDfS zp<0kRGaz7FcHo|Aw@58uYed4m)L}NN(w)Aj{{K;r;2ghoUvf(g02P6H5|I`uHkjXF z15F9R#sqEs+W1@G1(SL|BG!>}y*vpWT6>EL`en{}S+~TQ}`lt6D);@wSiHzuUI8&8_r0Gxw;Sys` zpl`B1tS=uful0$|HSeW?w6H)#f7Ph2!%!LI7~;p zQh}X64(S6_?;>Q*yD!V_IkvRd&ba<^}@J z#9aQC6l`%-;zZw20aB}`82tk~rSc%w@R6Voh)a|L z7{!!Gp&;cft}=(Z((@I(`}Jsls#)R?I3)s~mnGlJ!Xwlms3lS9QOsjy8Z@45Sbi{oe?3a&y`bsRWq8W3b%JBu^44zcF+yP(s}Y0 z4bjJfT{6P`5B1Fe{(=AfYHx0T#J$D>!jL3RAxN{`eAtxB#z6{-13TQ3V&(gfRdlgA zy4|4_dQ&Kg)lo!;kf9z}EK_Gq6}>}(H>)K>BJYCc_ccaPQQxq6)tKjVdZ#7}4-x^Y z+B5PmoIXH!#GsyI?D|^K0^yLLbOUoFViE=2b3o|LENIc?X?%tV#^MdZLafO;Q zz2V*dO1y10px`RV2g=BSgDE>s;@Cav@|}Sq>NnS+4MrX`-}daI_%;9Ml>vZ*WqHo( z4Un@TyiZ+C=B-O?PG%@Ba=1in?E5E+eZ;aaMC; z(1X`stYM$a{ey3xq16;aNtk=$uWY1z?8MpdRm){spXCCwX2avnZl_ssX2pm=da)a$ z4MzXa=S16Tl2`S9rv|#T{^{uKiy# zD&ba|N=~a`H%b>*IOgJ)84l@9D`*$8=;G%J{xolH0^1!pz5ef>pLS-7KMVGHUjQ$* zp88uL8)27pUf1j%&%eW-bpcq~QZHL!kA?Tg!58!X4k+7&RKN?#$Nu0Oe#GOV2wrJw zsYk8edrGOor3G`i+5SZbnV<&bveFG!Cq-Er+pob~V+VD&1F{Et51*HoNooO<* z8I8LoG(`dhTG-(GO2YT?2?hzG=EGe_luCVL;!iVI<-D63#eWCHOw6P+CK91OSe5v+ zC|3-96zrUdX;Z}$UO<9wmE%Mw#Ts;1An@uogG8{kqE}TuCalymB&?a5ZDvJRS z^~~>cV*>_{g8Q|6JfMa5;O*45*B48O*64be=w{%dR1h{MN@~~*b;ywjbfyKCadgbA zja=35dl~hFy9;Y;dbyC0e%-+-8oV$KhJ`lYR+hQySnmA4cqInTvsY{3Bc0IXa3pwE zq71MUS|50<>d0v5MR)%!a09}MMUr?JmUZ2e++{H=p;wW6!mJ`xCGl70t1Q&Cd<}2k z?xOJjLNXv2*-RUlQ=WXwSsx?lnKtFK=O;W#ciJSU*l6FEpz z;g9v37rrZUGB-walSsXh8hqy|5ZF{;%r(z`V{$C@aVGqM6t_#3Nu(9?=CIWHEsh>; zpWxM|Mj>&#sq;_HSF-7p2(IIIkQ>gVKx?{o9Ln(ep8Kv|oPcU>f+(vi@szz!b8RDX z`IEGIO4Y9h@e9v?*}Lm+6^y{BnEdQ_#atIy3cT^M2gZs{ZNYa}?TrVL6Wdrf}aK{x5PdA!vCaVu^pZ${$WqbU*aOTLRKq^kC&? z#y#kcFWL9x3w1gCv!NyDz*Xu{w@2l8mYQZAE)sMt{&#?i`?ViK9sZ62X5;?CrDPH& zw)wh#GEkQa-;av)&AJ$h7Tz zDo#fj?bX@AD}5170IM!0aCbK?{Uf#I{}YY^-v7w^%nK)g(aoT72gB_{y_CcX2)*tI zyYAxtf*XPtZV?;Ov~)Mttarq~-f*?F#@axV&^IXzKxmHJ$s-w)QaZ{VGv!qG{X~Ay z)4`urU7eUc=q#5cGKSqgB9U`R-$ctZpbtQ(8HTzE_`a9JC+O0#jzYPmQHhL#_ZHa( zB8wj8PeS2heK{MNocIGPP%7fYh~VfCyH$@av|w z92XX20Y?kU^$y->v*Niz=Vr=5hiS@J&vFjRa#DR1PoFIYT1G(bHa$YCx)M0sh4$zc zBO45@K0rnDm5|Fa7*uKd%EByII20}7mO2cl8u1x~66X64b`pRByXii<4Bik7c;xqZ zOQ$QmAg#{D3|xia=Z&2{=08D$w@we^?13-ebE`V9VMv$g zaQh1AlL{;z-9Wr;hp}j!2Nt1x!cL=ncU-Lf&NQ5_e1V^+s#?AP^O^0#(yxKXH9nQHA zE2MR3KMvP-IoD_VjX-qWf*SqVCvJI1H& z_4Xs*KYXdDx(@COMQs7_pQOHFXcDc?K#OS`P&6$@#J!DR@KHd#TpL+jNQ;hb2F}H0 zx~pX4M|5|{w`prqN7L!IumI<^KIG4NbK)SL+V7WeX&5ROCgI#zwsfh|+!0!{bmQz* zaI--DRV}>nnNf*ZxxOP>;K}6NN&fN4>DYMwZs&&gJP?jR z#@GHP$6fMNfs2MJ>|!{7fP(trD~2IlJUpw;CZ zCTR*I(0lZG>b>{{clRbrfi+4zG&wwp&7NCmwOP7c@>>NL#ioWyqXfUfNU_JQIPs{h zYmnxnCBz;=8LySu7;X!XriX`@6ElzXCg4UIk;+jpyq!LZbmx-^P#Y7oeZWfg{{x{z zR*^zt)U7}aWk)6sFGraxVnmP{3XxI-)!QoXNg<`>c)$@=Ic}j=e@UTL<|46)4@2GO z?%NMdYR1ncPHDIjFy12F-rsc|7WU%Jqz1ytHB2CW>Wsvw%^H}zK|^4JHj$3x5eb6y zl7D5F=F3{wWlQStDXAVxtDKKt-ST3BE(CJlhu$$E0UwDmA{Ye$B?Ac{m51!>Z&~nk zj)V-dr%Q;X;Tmwow5|Q41|7%bB%ALe9O-IECjwbf*pCLC)jdRTuHsyD1W3)n3j3G< za}H#E^!_Z__)O{n>`3Jd9OH>a%#D1)pLHZ!$(SDy-|C7M5xONNR~V5u2jfP*5sYb- z_Mb_tDkS~I3s{3|KDsihq!C0?vgEl^vpSwX#DX1qji()( z_G5R&=z-B#q{pUn;6+e>+{F{`?&G}wjnrKm?4QR)FST{=OJ#;DfVA;SXl1JyZE(Np z?fJWghhA#@Tv%Q00nFL^3f9ycq&*YzKdjh;LHSH7`V8ke90u*axDS9bij z2v{YV9gv09=1E+$(DghqJ-=>hq*oUq*?$#rVP6{0$nKT*9oxeSSq~G|ORX`Gi;Z(Bg zdWnkIfEZPX1GdO<{84cIPY3%fe2&MP&8XxnF)b(G+k_ObiaS>d`#~pryWiI5z}a4e zb5TDZ!r7UJGyQpQJ!Vx$9M$`YNj=8Gm^>X3BdtmjrwbenJA{k9hrOZnI)}KoE-}6N zNT;aH68#T7`nM>W6;9J<)}TAV17xnj$OxlLOABVJMopQU*+C`1KM3?HX%$W95ks}N z@A71w!G}u!{8HiOSR)en_My6ai(Kh3---}M)IYNBJE)N*OpHX+P1YR-KQ6H)E%>^4 zGSdq;t2~BsxpayPs|D`ei)bO@$_JKV*i;;7C1 z?&^^4&{e1q56mRM_mRgK?7NX#l7xK!`6tG$$rRE&0Ke~3%7j{uZ?Jq;gViLSl0y`+Rmtv=ol)`p2~J=O$YK;QU*Z_9vVsd!8;lB*En z2V4L|GNnCCmb&Z-?xGwf5{>F6qJVIG>%u~m8vqBeA9Q9!R5sS=$i$&1i-a#xK0XtW z?*|4D9btS6#I)`dL0pq6#sGaoUn3d&AUcpX@HDVIz}bTw0%+DIVrrgJ%t=)4`0!;} z);24t431|<4xv5TwJEdo+^@|MdTT92WhntT*5q&G<&bJk4l z$TljIRMr$Rt4tK@yL)pg3$BkuwuIa8EI~ZfM%JY_1Q^EkNTSl#sqE#0Nn;pBz!~n{ zQ}lM4xOs5`Hd1ux6qrZ;1S?J4n-Z0fEvAn*ivKv@0homO8ID#MFFZQ?jb~Rh?I7Wi zJDKbsbHzn+i3?xj;!zENMVyg#x@ptge=E+uZsz1ypnE?dbgY_0dOx-BQ7aY4MX58+5 z$V7rJx|w$*q%UlhRX%P?@IC!)Ix2l!(fmz8NEb!>fhJx4@W_qn;PgKGaoBL9>qk8I zvA}o#WlCjd3$C!~<>JvWN@~?FYVR`Z{qCH#7Je`fO;4*`H$c=id=9}oc@g>vtq$67 zPMzk&x~wHU)Y;J4OX?5>Nmhal|AC=>s5(xgqJLrhEvB zc-U`$ ztpFv-+Bme- zH8#=2p4$BnIUMH87rOqruI9>atylS^<-U^&zoXas%+5gpBbZ&;-0uMnGlL7Yrjbn8 zsh1O_ZgS@-=mv{x(81Ibz9TAlm2e(AdVVH3o-0WuIL9aI4vK$VvZNXh zCKh#CfrYf0_Sz!Q*z*+ZA28+a607n!MH;zq3K5 zqcp=rsU2-?V;$A&*3tmSp3%+DDD~0_VNo`($k| zZf4o-7rU{I-A6k5Bj*ljE_wTz#f;YSR-Y;dc!`5gDoPz~hyI7^u)K&cAaINeD>m+` zhFhGu($C9TsnQG3Moe7QPV|xGi|c2%^wp*q(Cx&QlSJ@l(n`>kbE^4? z_r!edrJGoikgXthK?913U*F%!PL3`nAqn|gEGZC5Rd_~;vNa_rVrexaEaQ6ilA<+m zvGZ4YkoM-#J8`Z_lvEXcso;M}?Vj!5z34uetW_jrP0J67AjDWD?opVmg5DYmm=RRaG$+=4*zSqVzKXJdNUlIDX#l`fZ9< z)r52v?F(LNCBKMQj04M7gdLm-SDZc#u7ACSt^msqWwY+tz0mmeOU^A7j}-%5h5YoN z!2G#H>E<_?1x;fjs{MdzGI`?FMUoHbz%biqAa||lMz%EEAwmqn(B5s>?|JKqGX?| zy8$t1YmNiI1M6*YfB3mDlPM5V?Z?eQNlM<9Z0%FQ4kC+8+g{0VKkawsf9TAkF+yE= zA}77C%csH`4?!>!zC%4;*hN<*HE|oyXjE1+1tEu%EymN=7F*$>WLb(X&)jgAEK$AC z1tx!bIm=jPh@{hQBvEKB`)#3LOR822byk1g2ps%%p}5_;DAoGdd-n)CSAl{NoAq`+ z7ycaGHS6fq`!lPC*I7FW;Q%GL5Dhs!Uh$g58_|?zuxN*7a<`UHakg<-jx4FgP|k|K zCho0bZr9(-r^YX5ERpoy9{bL?LDbQasx(j6TqQdGH5u3lx9X6w{%l@QWvhex){hoq z?&U|J)D_rBrZM;N&)k~o zU__$6+hYrJLaG&RZ~sa8oh{b+%raq46VFfhPl{68)$uTwlKRG7#&&N&6iFTA*k|6G zbNb^PnWuHZ_|0uaRaA}A=kl*~Ow>pjA#GkOP4LzKQYL18y42z~-C5coUPh>BO|}O~Mvr+Q0;{As zv8dmLtdWA4of6^BRed?Ir*iBrkn~_gMRD%h6xF%q9K(@!N!tfyDo7Mv&L8hD&-^o0 z6-Y+*kz0#FGfn&eQ&WnRs6|OpFqzY@h4I1<<~3`UMLtX_-UZyFpMt;KlMGAO8<;xX z7J@j=t6z>U-K0A~S!Nj>xQ*PZxh>iR03}sPQ@|d3fceQ%_fquBJ!&0N$WYR35Z?Tq zy}}#8;_x9$$FTIS0Q6qbTNIG2yDV&nNe~26JOLK8gi;8Eod|`IHNV!ZJesuKp0+=o zHs62ZftF)c)=AaONr_8ZE=i*Tkbl90nQ_XOW+R2b3>aw9CYVQPq%;^Giicv5QckrH zi=0e#?ES78F8f|1)(`2)3~#c5F@A6>?eZ)OarbUTu7P3g;JyG8?huG&>u3A?BOc?b z(RudW3E5iQs;N|bb2pBf#Xg$WM@<2H%JwL*5+I7H+y}8%JV|B5xXs4U@7D*lYg(E4 zoX&H#=;x87jGaq~zl-K&{Q`6`*jqW>_ja(5n1l)|^w^8ZwYJ-{*?-T}`47c4J7OJ# z*1X(I{GECmWJtJOe8+xIXy@J&;`B_5Rp--ZZ$#B5lQlG98P_>#z058lphZg0uhF{G z8JpD*Y#Da`-;(2xt_EH|^}Ym?d_uiGt|{0Ev&eX0(^*aZv%Rv~0b}m%$BM&lpXL53 zZ~aYNvM23#7MNx!;)}}{xjr)8Vi~v$4a$ib_PUm2pwPa<~CBt7-g=yo4fhHMFn?oI$(9vd|~*iXp0@xGyjk>gB2&& zZbz5HVaM#&v^CGIV!~(7t^9Jz_Ojx+V3peZ-yLp8kmlP@tIxu2VFj&Wh0QR@e?W5| zsUI&|e=jp6jX}k)Uu&gOVZxG`_e@wppR*9*Tazg0d$TJZc9$pI$1)m+4E~7hYZ(z{ zZ7Ss#>)#d^R4n-cavM?~&MG4KtIyWop!xA11SUOvgMnWND z^hI+g+#NP8b^T1tYiBYgA#cW=On%PkXiGj-wsaMsrs1j44_KY)WDi3J^1cr;sw_T- z$zxAbmTPvtW~HlH?^=mX;!#G9gHl4~B#@OY_9&ZYBF=yTpA~m)DyFv$npO_v5w!&k z*k4!a1}2KvS+I*8IIZr{7%Wl3Yc!;#@5gFRUK*?wrhkUL{*;AXLIKYB&KS-Dy*f#l2*zy-i9@7)K$=DJm|F8yCq_lJ zQg(awUCwlTi;1C_d1pF#CP`Iv1CyVGT=HcMXh%XpZj8Q}&pPIx$^E5Q*4&FP1CC>9 zT4iqNSnDt&vq845-z5aBX3tZ`3k5VDoCJ9r)#!Iv)+#=ul6WMG<)2|u1xfEFq9*Z; zX3)#@k=|fy&kKE0cdKIV`rW7V$IRA@(W-__i+MF;iU+$7XY0f)@^zTnVsM_(5i-*# zz3X2T^~z_&Njzm<@G=8AjmrH1lN5G}7X;XJ*)WJYBW=kb1QHLLXHj; zS5Oli2XkqAHQ+ZOe8KmDF_QLhpy2Zli7si$JRIu{DT~o?u>2A0-5kJ!W@<>yGwO}k|cLUjKC!coS0kz`sC1=~$T5VBeXD{v=v;54O zP^`VUqH&V^dN5$rUu+xxOGKR_ay650EU1kC+BxL{a}B9*?h(fcX8up&I4WNOXDNjH z(Ld;7i_+G#U{ZMJGw;sO(+b3*>GtS~dK9JF$z^w7P`}QFpI67OCjI!bLH_HX{wmdR z^r(MnHqO_MS$E%mSKSlm=2$k_?gu2GfhwFBKO0OAz>~6KuB!~8@4~P{$KBZq6TZB; zJy!0+v$!9^b8yJI?q{)9!%2 zsP-i2ULs?EPu<)U3o&7U+ItTuYIyXlj>sP*_0fnP+9E+K9No=eIA%8@1v83a<)Mts zB!XX-^man<)L3QjPub?Mie>i+yCQDPhDyt_U4Lt_!YfxLNe*J9*o0qXb%q1CyP>Eyop{y7}wUNy{ z=$2dkROl$nUoZEB=7%cgaQ208y~5)?8ufP!WZ#VnBy0XWF<4EgrgG77o|5moDx%}<=U6$KwA-VsM8 zz>a3S|L-jd0P$XVRT#92dbk!$-IZ;IG@3YMtkJjRMXCGrL&kp;PPvpb6n?@FvrEko zYzxk97_IP-AxETA|2!eXytX{6Ur=RM5XfZx``dm;rd)+&^+!7-*-6eN_zgUgn!K1} z+DLt|OZ-o}_kNmgEbHg<`@4yuqGRnp)z3a)c0ExhC)9CC9{SOl&}7@Lz*#+w%V|dZ zavAErHYjLa2YQLM-(z&(JzOIjq#ng_kp`o{DN%@20%_KM#MByZITOi(i-JqD1)bbF z#<;TR_`Irlbs-)ZKYMahy44&jXDyM#6IdnprW&r?j;;-Qq?>z9+<3-46J%I1c-F4) z030j-%<-l?uBm2v6f^uE&wK%pd+f9Jyr4Z7fD2hV{jLk3GE%DMm!22XuPk$-NCh6f z3FqoZRUS0{a~FKociy2lqRj5fTe0BJnl`ltbS;hii4o?gzpqt$p69~9EgK&>wte>V zcNb^?2!~m41UZcxOacv`SN=dh?`OK?D^W0S5FAtWYB=!DG~-T9vN2LmJa5QLgDb@ zDVn>V4dEpS;ab=f{+goH6tW=Z(BiB8Be%pMP47H~hQ|`C!DNE9y5OUbCGYU9Q&qyt?hlSnz3zI7Kv7%uVMqn9 zVEFp7E0cJ}A`o(!kc-0{-bLa^VidNy?x3io^$Jv!D z6ag=1MHSkk-LC19wg)3bHtKCBOU}YUSl}{Ad#a~PMcF&!;RoEFP@!jnch0 z`#FDFq#N!mBY}2!uMU#tARp6u+8PzSX=SApm(a?z5Kc<#IW~>1ifD(^Eb3|#s>gSW z{;kr#*GHcg{a+@X-)7z4rkzjo&W%2hJG>MDPrDQA>rVjx@c58}MB@-EONDVMOV%5< zI@y>gi;axEoPiqDwp#tDH_t}%$gecwlTzBL)uYik8s)uO+o-L*-aKmEv)(-`jl-g} zL3l?Qe@r6E`qPXvNsw&yQPLi#JitFggtJS*Fg#L0UXFHtqb0oQ7j5`O9p38WlsiXr z;1nLoX%bMG?$<~bT3&&1h{pD1FR|M}V_yiyC}9latJg=I0q}b`dKWNE-l92Z{~9g6 z2GjRoc=3?m<|77GJZkIF9=tfyS8wv>&#rF&BIHFJz~ z7j5uK9pL@ahz$OPpnLY?m0PRxC@z#>LMY&_g4ouREd=oxoAy}nxwj~J5e9xb=D3PU*vpIm#HL#G?D( zz1rWpwcmR6zxV3D_G^D1)W3{d_ewWo^ucP<87JLw#vi5a;mx%3W!6dP159tmou(|Y zV}#fnwflK47fP!AgavU=syoaJ#v98$<}qarZx)=;zE^m8Cv8F^<6FJ|S?$p7Z3)2H zV44p_?eDaq`g0lS$H#}XKgt9XFqZK~IG;R3?g)S5dhR~mJt;Wg1LpI{o8dL}^8eF^yV7vOgXA8Sq5|CKk z7pME;^2q~!G+?nEhS{j^@PS$`QWMVn&YC3b$%8dQkP9o^qgLKowS$9H#sS2F)M~(9 zpexb0cMUKFqgQ`)3Fr?jgR77Kdz;&T4yISIO1DFDfvm~LWqGNt#Z@}Y#ppFc;p1n* z(M#BS@+8&6cPmX&r8|dKZuQ}(IpFEss>5GL&0l)8hiUiIu=PK~Chg0jo6!47ZJ0Ah zm0*sjrp(b7wfF0!bu;UvwSGn)-OK@VCuwx=l=g$#O&WbLnXvjvvsduP#r3SPMipnZ zE#7#B4&SN0d##^zWI&lbIqX=($j*4oc-XF48k@b-+GnzW0)vD0JEMQAw!h3;pJvTF zrIXaVNxgHYc9Ld4?F_Q+Amxq{)*xjMQqJ(f9DJU2wCnD#+4}SNf5*T7{ePMS8=}L- R_09kQ002ovPDHLkV1n&~sx$xq literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/w_division.png b/org.tizen.guides/html/images/w_division.png index 88d995959343550d4859767dbfb7c6b5f128b717..443a1ea081ea7eac244b43293a0c17dcafde2c62 100644 GIT binary patch delta 7462 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 literal 113087 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 Z)cNrv|A-saJA*x)+xKX<*l+Ns{|_ZZY83zg diff --git a/org.tizen.guides/html/images/wearable_s_n.png b/org.tizen.guides/html/images/wearable_s_n.png new file mode 100644 index 0000000000000000000000000000000000000000..02e37918dbfd4a7100f5ad057e2a4f271071f4c8 GIT binary patch literal 2564 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 LPsTZ?%{%`BtxR|e literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/wearable_s_w_optional.png b/org.tizen.guides/html/images/wearable_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..cef460c854b09463be29faffd829bc08890f98a0 GIT binary patch literal 2454 zcmb7Gc~ld39*_El(N1yNQyf^c^zMs$c`uyITj4j@7 z#)g)LC=|+=>kjgfaTD_5moG-XmeDQs$Y7yl2PyqzVafy{4564}Stx|&#t6e9J|q;Y zW3NL_DAbZ#iGPqXi04HY$zpKAIUAfRMvkCSC?^+{Tqufyl;}_>Tq0#)#_H-ZXo;AC z2_*9fJUI)BkhmwpkYA#=zbG+EL=$6NoY77yIzkWwDTQcNOte%%S1~a2ymVwfw~fc3 z=S`GR49p)v1@X3^Suz+xlW`QRh(IKvsWcpsOrg@K_GkxWjVCzb9SB$gjZOyW1PAno z2ZMNn#bIQix!QTq%)B(Q}N#P+6Rkfk7huBZU|_UlJanRD2|tDn1koDH~oTl;epw0v?{X znaghh#p8V*5fk&#TA}1ae+K`T{0e`y9K!P zN&smDHb|f?5PS+meBs0hmP#P8Xdsyb5QtOpS^lt{(01jWX=b|d^q zx*!Bg;vq2ymc^jwD^HjFMGWFF65tpH0aywIKv*(BB4ZsLC{!$kOchZ=g`p%efrR;h z7ysXd!z0n)=hXIz`WChjNzY9`-X&!5@iszIq3Mi77MkLn}PM?Y5!=y z4K&W)dBAyMvC78AMyRm5i8<(`cHK;+t{+mvaG9YqiDc$x$v5tK@nX|kn^n4=-da()4hGC34De3*2H$ivY7cV{j+r6M)*da#O@jsob zs|(JBm*20ftUR@|-f~o9k?KJJ0N|{jpP#PR^pP$l1+_GiWC;}QKY+zzdwYAG>du`5 z*=#n4;}Dd#c+n5R!JaFg?_WP!R8-VRU*-CkxvGHKHK|ss1p>kA(ay_$oTpU+7Hf$| z*QKP*42E^t?a1V+ThE_w%ocB)Sci0W&z>Jg1_r{;P2d(GS`h5qS%2ot?h+4A&qIL4 z%DbVuwziv znTk-aHm3c*Y@;o!lb8~n5rm)H1t zrQ2;q6LewUx$a`ISWQh$eQOR;OHfDl6EEVQ*6;eg!Q^d6*+}DI9bxmT+osnKo~*B} zb@OU_(P%%u&Z%e<#I62Ppbz+>y4bsI2Z-yh39WQ6z}p1?6&EgS*XOU$yc#Z4nLl!` zaSj-70RIMxG%WDyU`q*&{o~IrR#&HXEH@VwXJ%#bS{mf}c0apS)z(s7 zhC5GKJpdC)o~sSV{XO?uwDWDbAx$*taekIOHd;pG*KhSLSYeHdR;X~SJc$L8viA?r&>rQWM z1aBB#d5pi|@b3M+v(tZbC9NsGxS(K*)65T-AMkyBP0jaaH4<4??>2C|$(y3i05pzH zU-=8xs^r)|^fE0am+cK! Ix`yojA5VuCwEzGB literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/wn_division.png b/org.tizen.guides/html/images/wn_division.png index 11a787672c8bc6d46378470dca2492a189c59f63..dca667f63938b0ec73963c2e664e4e27eb449cf6 100644 GIT binary patch literal 163496 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 Ksn37;-v0n5Z`YCl literal 112882 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 diff --git a/org.tizen.guides/html/index.htm b/org.tizen.guides/html/index.htm index 42ea7d8..37f0966 100644 --- a/org.tizen.guides/html/index.htm +++ b/org.tizen.guides/html/index.htm @@ -32,6 +32,7 @@

    a}C&5pT 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 WiOLronz9Q30000Is74!tF*SOhNFe6hlw)? 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 b@!`pN>oJ+t!l369@Fg#!0{tds8v6eMk{vE~ literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_contact_add.png b/org.tizen.guides/html/images/common_appcontrol_contact_add.png new file mode 100644 index 0000000000000000000000000000000000000000..f9218bf8567a2edc90bfb1b2503c7b18cb669be3 GIT binary patch literal 27358 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_contact_edit.png b/org.tizen.guides/html/images/common_appcontrol_contact_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..0ac5425dfd86a9cf4951e9b8ddeba7aa8f0689db GIT binary patch literal 31488 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 eMlA958pf&*?U><=UIZ6Zi+;^1vHcZ literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_contact_select.png b/org.tizen.guides/html/images/common_appcontrol_contact_select.png new file mode 100644 index 0000000000000000000000000000000000000000..1a39211ef682f7605a862198c62d632822193b8c GIT binary patch literal 32989 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 be=o0!%kSFt59DC4fM3cF)sdA5^Pv9&w~um! literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_contact_view1.png b/org.tizen.guides/html/images/common_appcontrol_contact_view1.png new file mode 100644 index 0000000000000000000000000000000000000000..091c11e5f11f7832e4080e508fb354d53b614c7e GIT binary patch literal 45138 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%0Ad7i#i0`+K=Z4<=4J9{c%115=C&ECrluwSgXmw^% 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 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/images/common_appcontrol_contact_view2.png b/org.tizen.guides/html/images/common_appcontrol_contact_view2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d1ead5a3a7beec57975c8df707f4d31ff035864 GIT binary patch literal 27053 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

    +
  • Add the OpenGL ES view to the application:
     // This is the GL initialization function
    @@ -147,7 +143,7 @@ static Evas_Object *glview_create(Evas_Object *win)
     
        return glview;
     }
    - +
  • Setting up the Callbacks

    @@ -170,8 +166,7 @@ static void init_gl(Evas_Object *glview) }
  • Callback for resizing -

    The resize callback is called whenever the GLView component is resized. A common action to take here is to reset the viewport. Because GLView size can be changed by a parent container, you should set a resize callback and should reset viewport size with new GLView size. -

    +

    The resize callback is called whenever the GLView component is resized. A common action to take here is to reset the viewport. Because the GLView size can be changed by a parent container, you must set a resize callback and reset the viewport size with the new GLView size.

     // GLView resize function
    @@ -215,7 +210,7 @@ static void del_gl(Evas_Object *glview)
     }
  • Add an animator. -

    The application above is technically working but the scene does not get updated unless the frame is marked as such. Games might want to use an animator to have a regular update of the scene. Here is an example for a default update refresh rate:

    +

    The application above is technically working but the scene does not get updated unless the frame is marked as such. Games sometimes want to use an animator to have a regular update of the scene. Here is an example for a default update refresh rate:

     static Eina_Bool anim_cb(void *data)
    @@ -260,7 +255,8 @@ static void glview_start(Evas_Object *glview)
     
     
     Evas_GL *evgl = elm_glview_evas_gl_get(glview);
    -// Then it is possible to call any evas_gl function with it, for example:
    +// Then it is possible to call any evas_gl function with it +
    @@ -278,17 +274,17 @@ Evas_GL *evgl = elm_glview_evas_gl_get(glview);

    This guide assumes that the application uses EvasGL directly instead of using the GLView. (If the application uses a GLView, EvasGL is created internally.)

    -

    First, you can declare the global variable using EVAS_GL_GLOBAL_GLES2_DEFINE(), then create a EvasGL and use EVAS_GL_GLOBAL_GLES2_USE(evasgl, evasgl’s context). It is similar to the GLView’s macro. These macro help that you can call GL functions directly. Now, you can call GL functions. If you want to know that detail, refer Evas_GL_GLES2_Helpers.h.

    +

    First, you can declare the global variable using the EVAS_GL_GLOBAL_GLES2_DEFINE() macro. Then, create an EvasGL and use EVAS_GL_GLOBAL_GLES2_USE(evasgl, evasgl context). This is similar to the GLView macro. Both macros help you to call GL functions directly.

    + +

    Now, you can call GL functions. For more detailed information, see the Evas_GL_GLES2_Helpers.h file.

     #include <app.h>
     #include <Evas_GL_GLES2_Helpers.h>
    -...
    -/*
    - * This code to place at the beginning of any function using GLES 2.0 APIs.
    - * When using this macro, developers can then call all glFunctions without changing their code
    - * If you want to know that detail, refer Evas_GL_GLES2_Helpers.h.
    - */
    +
    +// This code is to be placed at the beginning of any function using GLES 2.0 APIs
    +// When using this macro, you can call all glFunctions without changing their code
    +// For details, see Evas_GL_GLES2_Helpers.h
     EVAS_GL_GLOBAL_GLES2_DEFINE();
     
    @@ -307,6 +303,8 @@ typedef struct appdata    Evas_GL_Context *ctx;    Evas_GL_Surface *sfc;    Evas_GL_Config *cfg; +   Evas_Coord sfc_w; +   Evas_Coord sfc_h;    unsigned int program;    unsigned int vtx_shader; @@ -315,46 +313,43 @@ typedef struct appdata } appdata_s;
      -
    • Evas_Object *win: Application window.
    • -
    • Evas_Object *img: OpenGL ES canvas.
    • -
    • Evas_GL *evasgl: EvasGL Object for rendering gl in Evas.
    • -
    • Evas_GL_API *glapi: EvasGL API object that contains the GL APIs to be used in Evas GL.
    • -
    • Evas_GL_Context *ctx: EvasGL Context object, a GL rendering context in Evas GL.
    • -
    • Evas_GL_Surface *sfc: EvasGL Surface object, a GL rendering target in Evas GL.
    • -
    • Evas_GL_Config *cfg: EvasGL Surface configuration object for surface creation.
    • +
    • Evas_Object *win: Application window.
    • +
    • Evas_Object *img: OpenGL ES canvas.
    • +
    • Evas_GL *evasgl: EvasGL Object for rendering gl in Evas.
    • +
    • Evas_GL_API *glapi: EvasGL API object that contains the GL APIs to be used in Evas GL.
    • +
    • Evas_GL_Context *ctx: EvasGL Context object, a GL rendering context in Evas GL.
    • +
    • Evas_GL_Surface *sfc: EvasGL Surface object, a GL rendering target in Evas GL.
    • +
    • Evas_GL_Config *cfg: EvasGL Surface configuration object for surface creation.
    -

    Creating Elm window and EvasGL

    +

    Creating the Elm Window and EvasGL

    +

    To create the Elm window and EvasGL:

      -
    1. - HW acceleration -

      To develop a GL application, you have to call elm_config_accel_preference_set() before creating a window. It makes an application to use GPU. This function is supported since Tizen 2.3.

      -

      To use the Direct Rendering mode of EvasGL or EFL WebKit (EWK), you have to set the same option values (depth, stencil, and MSAA) to a rendering engine and a GLView object. EWK’s options are depth24 and stencil8. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function and to a GLView object using the elm_glview_mode_set() function. If the GLView object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled or abnormal rendering occurs. These Special options will be supported since Tizen 2.3.1.

      +
    2. Manage HW acceleration. +

      To develop a GL application, call the elm_config_accel_preference_set() function before creating a window. THis makes an application to use GPU. The function is supported since Tizen 2.3.

      +

      To use the Direct Rendering mode of EvasGL, set the same option values (depth, stencil, and MSAA) to a rendering engine and a Evas_GL_Surface object. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function and to a Evas_GL_Surface object using the Evas_GL_Config object. If the Evas_GL_Config object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled or abnormal rendering occurs. These special options are supported since Tizen 2.3.1.

       Evas_Object *win;
      -/*
      - * To use OpenGL ES, the application should turn on hardware acceleration
      - * To enable that, elm_config_accel_preference_set() with "opengl&quat;
      - * should be called before createing Elm window
      - * This function is supported since 2.3.
      - */
      +
      +// To use OpenGL ES, the application must switch on hardware acceleration
      +// To enable that, call elm_config_accel_preference_set() with "opengl&quat;
      +// before creating the Elm window
      +// This function is supported since 2.3.
       elm_config_accel_preference_set("opengl");
      -/* Creating Elm Window */
      +// Creating Elm window
       ad->win = elm_win_util_standard_add("Evas_GL Example", "Evas_GL Example");
       
      -

      We can create our EvasGL handler using evas_gl_new(Evas * e). This initializer takes the Evas canvas that OpenGL ES is to be used on as a parameter. When developing an application with Elementary, we can use the canvas of our window:

      - -
      ad->evasgl = evas_gl_new(evas_object_evas_get(ad->win));
      - -

      To free the memory allocated to this handler, use evas_gl_free(Evas_GL *evas_gl).

      -
    3. +

      You can create your EvasGL handler using the evas_gl_new(Evas * e) function. This initializer takes as a parameter the Evas canvas on which OpenGL ES is to be used. When developing an application with Elementary, use the canvas of your window:

      +
      ad->evasgl = evas_gl_new(evas_object_evas_get(ad->win));
      -
    4. Creating a Surface +

      To free the memory allocated to this handler, use the evas_gl_free(Evas_GL *evas_gl) function.

      +
    5. +
    6. Create a surface. -

      We must allocate a new config object to fill it out using evas_gl_config_new(). As long as Evas creates a config object for the user, it takes care of the backward compatibility issue. Once we have our config object, we can specify the surface settings:

      +

      You must allocate a new config object to fill the surface out using the evas_gl_config_new() function. As long as Evas creates a config object for the user, it takes care of the backward compatibility issue. Once you have your config object, you can specify the surface settings:

       appdata_s *ad;
      @@ -365,7 +360,7 @@ ad->cfg->stencil_bits = EVAS_GL_STENCIL_NONE; // Surface Stencil Format
       ad->cfg->options_bits = EVAS_GL_OPTIONS_NONE; // Configuration options (here, no extra options)
       
      -

      Once we have configured the surface behavior, we must initialize the surface using evas_gl_surface_create(Evas_GL* evas_gl, Evas_GL_Config * cfg, int w, int h). This function takes the given Evas_GL object as the first parameter and the pixel format, and configuration of the rendering surface as the second parameter. The last two parameters are the width and height of the surface, which we recover directly from the window.

      +

      Once we have configured the surface behavior, we must initialize the surface using evas_gl_surface_create(Evas_GL* evas_gl, Evas_GL_Config * cfg, int w, int h). This function takes the given Evas_GL object as the first parameter and the pixel format, and configuration of the rendering surface as the second parameter. The last two parameters are the width and height of the surface, which we recover directly from the window.

       Evas_Coord w, h;
      @@ -373,37 +368,36 @@ evas_object_geometry_get(ad->win, NULL, NULL, &w, &h);
       ad->sfc = evas_gl_surface_create(ad->evasgl, ad->cfg, w, h);
       
      -

      To manually delete a GL surface, use evas_gl_surface_destroy(Evas_GL *evas_gl, Evas_GL_Surface *surf).

      -
    7. +

      To manually delete a GL surface, use the evas_gl_surface_destroy(Evas_GL *evas_gl, Evas_GL_Surface *surf) function.

      -
    8. Creating a Context +
    9. Create a context. -

      Here, we create a context for Evas_GL using evas_gl_context_create(Evas_GL * evas_gl, Evas_GL_Context * share_ctx). You can merge the context with a higher context definition you must pass as a second parameter.

      +

      Create a context for Evas_GL using the evas_gl_context_create(Evas_GL * evas_gl, Evas_GL_Context * share_ctx) function. You can merge the context with a higher context definition you must pass as a second parameter.

       ad->ctx = evas_gl_context_create(ad->evasgl, NULL);
      -/*
      - * This macro will set the global variable holding the GL API,
      - * so that it's available to the application.
      - * It should be used right after setting up the GL context object.
      - * If you want to know that detail, refer Evas_GL_GLES2_Helpers.h.
      - */
      -EVAS_GL_GLOBAL_GLES2_USE(ad->evasgl, ad->ctx);
      +
      +// This macro sets the global variable holding the GL API,
      +// so that it is available to the application
      +// Use it right after setting up the GL context object
      +// For details, see Evas_GL_GLES2_Helpers.h
      +EVAS_GL_GLOBAL_GLES2_USE(ad->evasgl, ad->ctx);
       
      -

      To delete the context later, use evas_gl_context_destroy(Evas_GL *evas_gl, Evas_GL_Context *ctx). To delete the entire configuration object, use evas_gl_config_free(Evas_GL_Config *cfg) instead.

      -
    10. +

      To delete the context later, use the evas_gl_context_destroy(Evas_GL *evas_gl, Evas_GL_Context *ctx) function. To delete the entire configuration object, use the evas_gl_config_free(Evas_GL_Config *cfg) function instead.

      +

    Getting OpenGL ES APIs

    -

    If you want to get the API of OpenGL ES, You can get the API for rendering OpenGL ES with evas_gl_api_get(Evas_GL *evas_gl_). This function returns a structure that contains all the OpenGL ES functions you can use to render in Evas. These functions consist of all the standard OpenGL ES 2.0 functions and any extra ones Evas has decided to provide in addition. If you have your code ported to OpenGL ES 2.0, it is easy to render to Evas. (OpenGL ES 3.0 will be supported in the next Tizen version.)

    +

    If you want to get the API of OpenGL ES, you can get the API for rendering OpenGL ES with the evas_gl_api_get(Evas_GL *evas_gl_)function. This function returns a structure that contains all the OpenGL ES functions you can use to render in Evas. These functions consist of all the standard OpenGL ES 2.0 functions and any extra ones Evas has decided to provide in addition. If you have your code ported to OpenGL ES 2.0, it is easy to render to Evas. (OpenGL ES 3.0 is supported in the next Tizen version.)

    -

    If you already use global macro as a EVAS_GL_GLOBAL_GLES2_XXX, you need not get the APIs.

    +

    If you already use a global macro, such as EVAS_GL_GLOBAL_GLES2_XXX, you need not get the APIs.

     ad->glapi = evas_gl_api_get(ad->evasgl);
    +

    Callbacks

    Now that we have configured the EvasGL environment, we declare a UI component in which all the OpenGL ES transformation takes place. In the example below, we selected the image component because it provides callbacks that allow us to play with the mouse events and coordinates, and we set up an image object that inherits the size of the parent window.

    @@ -427,6 +421,8 @@ img_pixels_get_cb(void *data, Evas_Object *obj)    // Rendering process    evas_gl_make_current(ad->evasgl, ad->sfc, ad->ctx); +   // Because the surface size can be changed, set the viewport in this callback +   gl->glViewport(0, 0, ad->sfc_w, ad->sfc_h);    // Paint it blue    gl->glClearColor(0.2, 0.2, 0.6, 1.0);    gl->glClear(GL_COLOR_BUFFER_BIT); @@ -450,7 +446,7 @@ animate_cb(void *data) ecore_animator_add(animate_cb, ad->img); -

    You can define several other callbacks that have an impact on the drawing depending on the mouse, resize, and deletion events. Because window size can be changed, you should set a resize callback of a window. You should recreate a Evas_GL_Surface in the resize callback and should reset viewport size with new window size.

    +

    You can define several other callbacks that have an impact on the drawing depending on the mouse, resize, and deletion events.

     evas_object_event_callback_add(ad->img, EVAS_CALLBACK_DEL, img_del_cb, ad);
    @@ -459,6 +455,37 @@ evas_object_event_callback_add(ad->img, EVAS_CALLBACK_MOUSE_UP, mouse_up_cb,
     evas_object_event_callback_add(ad->img, EVAS_CALLBACK_MOUSE_MOVE, mouse_move_cb, ad);
     evas_object_event_callback_add(ad->win, EVAS_CALLBACK_RESIZE, win_resize_cb, ad);
    +

    Because the window size can be changed, you must set a resize callback for the window. In addition, you must recreate an Evas_GL_Surface in the resize callback and reset the viewport size with the new window size:

    + +
    +static void
    +win_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
    +{
    +   appdata_s *ad = data;
    +
    +   if (ad->sfc)
    +   {
    +      evas_object_image_native_surface_set(ad->img, NULL);
    +      evas_gl_surface_destroy(ad->evasgl, ad->sfc);
    +      ad->sfc = NULL;
    +   }
    +
    +   evas_object_geometry_get(obj, NULL, NULL, &ad->sfc_w, &ad->sfc_h);
    +   evas_object_image_size_set(ad->img, ad->sfc_w, ad->sfc_h);
    +   evas_object_resize(ad->img, ad->sfc_w, ad->sfc_h);
    +   evas_object_show(ad->img);
    +
    +   if (!ad->sfc)
    +   {
    +      Evas_Native_Surface ns;
    +
    +      ad->sfc = evas_gl_surface_create(ad->evasgl, ad->cfg, ad->sfc_w, ad->sfc_h);
    +      evas_gl_native_surface_get(ad->evasgl, ad->sfc, &ns);
    +      evas_object_image_native_surface_set(ad->img, &ns);
    +      evas_object_image_pixels_dirty_set(ad->img, EINA_TRUE);
    +   }
    +}
    +

    Setting a Surface into the Image Object

    We can also fill in the native Surface information from the given EvasGL surface. For example, to adapt the surface to the target image when the size of the canvas changes, use the following code.

    @@ -467,6 +494,7 @@ evas_object_event_callback_add(ad->win, EVAS_CALLBACK_RESIZE, win_resize_cb, Evas_Native_Surface ns; evas_gl_native_surface_get(ad->evasgl, ad->sfc, &ns); evas_object_image_native_surface_set(ad->img, &ns); + diff --git a/org.tizen.guides/html/native/graphics/tbm_n.htm b/org.tizen.guides/html/native/graphics/tbm_n.htm index f3cb78d..4a0706e 100644 --- a/org.tizen.guides/html/native/graphics/tbm_n.htm +++ b/org.tizen.guides/html/native/graphics/tbm_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/guides_n.htm b/org.tizen.guides/html/native/guides_n.htm index 08e1cdf..2accf72 100644 --- a/org.tizen.guides/html/native/guides_n.htm +++ b/org.tizen.guides/html/native/guides_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Related Info

    @@ -38,8 +38,10 @@

    Select the API domain you are interested in and see what Tizen offers for your application:

      +
    • Migration Guide +

      Enables you to make your application conform to Tizen 2.4 regarding to the application Framework APIs.

    • Account -

      Enables you to manage account information, such as receive sync operation notifications, and obtain an access token by using the oauth2 authorization.

    • +

      Enables you to manage account information, such as receive sync operation notifications, and obtain an access token by using the OAuth 2.0 authorization.

    • Application Framework

      Enables you to configure application properties, and manage application data, and runtime environment and behavior.

    • Base @@ -73,12 +75,6 @@
    • Web

      Enables you to access Web content.

    - -

    For information about features not implemented by a specific API:

    -
      -
    • Porting in mobile applications only -

      Enables you to port your current 2.2.1 native API-based applications to the new 2.3 native API.

    • -
    diff --git a/org.tizen.guides/html/native/location/geofence_n.htm b/org.tizen.guides/html/native/location/geofence_n.htm index 53c48ae..3c72e31 100644 --- a/org.tizen.guides/html/native/location/geofence_n.htm +++ b/org.tizen.guides/html/native/location/geofence_n.htm @@ -15,7 +15,7 @@
    -

    Mobile native

    +

    Mobile native

    @@ -37,16 +37,7 @@

    Geofence

    A geofence is a virtual perimeter for a real-world geographic area. A geofence is defined by either a geopoint with a radius in case of geopoint geofences, or a MAC address in case of Wi-Fi and Bluetooth geofences. The geofence feature alerts the user when the geofence state changes (the user crosses the perimeter).

    -
    - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    The main geofence features are:

      diff --git a/org.tizen.guides/html/native/location/location_guide_n.htm b/org.tizen.guides/html/native/location/location_guide_n.htm index 59cd731..d060813 100644 --- a/org.tizen.guides/html/native/location/location_guide_n.htm +++ b/org.tizen.guides/html/native/location/location_guide_n.htm @@ -16,7 +16,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -39,6 +39,8 @@
      • Location

        Provides the geographical location of the device.

      • +
      • Maps Service +

        Allows you to create and use the maps services, such as geocoder, place searching, and routing.

      @@ -46,8 +48,6 @@
      • Geofence

        Allows you to create and use geofences.

      • -
      • Maps Service -

        Allows you to create and use the maps services, such as geocoder, place searching, and routing.

      diff --git a/org.tizen.guides/html/native/location/location_n.htm b/org.tizen.guides/html/native/location/location_n.htm index dd614cb..42b9f4a 100644 --- a/org.tizen.guides/html/native/location/location_n.htm +++ b/org.tizen.guides/html/native/location/location_n.htm @@ -16,15 +16,15 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      Related Info

        @@ -40,15 +40,15 @@

        Location

        -

        Location information has a geographical point on the Earth, and optionally location-related information can also contain information about altitude, accuracy about the geographical point and altitude, and speed and course of direction of the user. Location data features include managing location information on the device.

        +

        Location information has a geographical point on the Earth, and optionally location-related information can also contain information about altitude, accuracy about the geographical point and altitude, and the user speed and course of direction. Location data features include managing location information on the device.

        The main location features are:

        - + @@ -63,41 +63,43 @@

        Location Manager

        -

        The Location Manager API (in mobile and wearable applications) provides the current location using the location sources specified in the location method.

        -

        Using the Location Manager allows your application to:

        +

        The Location Manager API (in mobile and wearable applications) provides the current location using the location sources specified in the location method.

        +

        With the Location Manager, you can:

        • Get the current location
        • Get the last known location
        • Get location updates

        Asynchronous location-related updates and region monitoring notifications are implemented with callback interfaces (functions whose names end with "cb").

        -

        You can use the location state and updates as follows:

        +

        You can use the location state and updates as follows:

        • If the Location Manager is working correctly, the location state is set to LOCATIONS_SERVICE_ENABLED. The device can receive notifications about location updates and accuracy changes only in this update state.

        • -
        • If the Location Manager is unable to run on the requested device due to weak radio reception, the location update state is set to LOCATIONS_SERVICE_DISABLED (LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE). If this situation persists for a longer period, it is recommended to stop the service and try again to conserve the device battery.

        • +
        • If the Location Manager is unable to run on the requested device due to weak radio reception, the location update state is set to LOCATIONS_SERVICE_DISABLED (LOCATIONS_ERROR_SERVICE_NOT_AVAILABLE). If this situation persists for a longer period, it is recommended to stop the service and try again to conserve the device battery.

        • If the user revokes a permission for the application to use location information, the location update state is set to LOCATIONS_ACCESS_STATE_DENIED, and the Location Manager stops all on-going services with the application. The application can request the device user for a permission to continue the stopped service.

        -

        Location Method

        -

        The location Method is used for specifying the desired quality of service of the Location Manager. For example, a location-based weather forecast application can require location-related information just to distinguish a city or a neighborhood while a GPS navigation application can require the highest quality level to pinpoint a map location. Selecting the appropriate quality level not only helps the Location Manager to run the system efficiently but also leads to a good user experience.

        -

        Using the location_method_e structure allows your application to specify the following methods of location positioning system:

        - -
          +

          Location Methods

          + +

          The location method is used to specify the desired quality of service of the Location Manager. For example, a location-based weather forecast application can require location-related information just to distinguish a city or a neighborhood, while a GPS navigation application can require the highest quality level to pinpoint a map location. Selecting the appropriate quality level not only helps the Location Manager to run the system efficiently, but also leads to a good user experience.

          +

          Using the location_method_e structure (in mobile and wearable applications) allows your application to specify the following methods of location positioning system:

          +
          • GPS, which uses the global positioning system
          • WPS, which uses the Wi-Fi positioning system
          • Hybrid, which selects the best method available at the moment
          -

          Based on the desired method, the Location Manager provides best-effort location-based services, such as an asynchronous location update or region monitoring notification.

          - -

          Location Settings

          -

          Tizen provides the user a robust way of controlling the usage of their location data through the device location settings. The following figure shows the various options for enabling or disabling specific positioning technologies.

          -

          Figure: Location setting and indicator

          -

          Location settings

          -

          The location-related functions work differently based on whether the location settings are used.

          -

          The GPS setting controls the Global Positioning System usage. It takes GPS satellite signals and provides accurate positioning services generally outdoors. The Wireless networks setting enables the usage of network-based positioning technology, which includes Wi-Fi and cell tower-based positioning, and improves the coverage of positioning services to indoors.

          -

          -

          All location settings are initially enabled, if the model is support GPS. To disable them, the user must manually toggle the buttons. The manual task required from the user is understood as an implicit user consent.

          +

          Based on the desired method, the Location Manager provides best-effort location-based services, such as an asynchronous location update or region monitoring notification.

          + +

          Location Settings

          + +

          Tizen provides a robust way of controlling the usage of the location data through the device location settings. The following figure shows the various options for enabling or disabling specific positioning technologies.

          +

          Figure: Location settings and indicator

          +

          Location settings and indicator

          + +

          The location-related functions work differently based on whether the location settings are used.

          + +

          The GPS setting controls the Global Positioning System usage. It uses GPS satellite signals and provides accurate positioning services, generally outdoors. The Wireless networks setting enables the usage of network-based positioning technology, which includes Wi-Fi and cell tower-based positioning, and improves the coverage of positioning services to indoors.

          +

          All location settings are initially enabled, if the device supports GPS. To disable them, the user must manually toggle the buttons. The manual task required from the user is understood as an implicit user consent.

          @@ -134,4 +136,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - \ No newline at end of file + diff --git a/org.tizen.guides/html/native/location/maps_n.htm b/org.tizen.guides/html/native/location/maps_n.htm index 7427969..0d06578 100644 --- a/org.tizen.guides/html/native/location/maps_n.htm +++ b/org.tizen.guides/html/native/location/maps_n.htm @@ -16,7 +16,7 @@
          -

          Mobile native

          +

          Mobile native Wearable native

          @@ -34,17 +35,6 @@

          Maps Service

          Map service features include geocoding, reverse geocoding, place searching, and route calculation.

          -
          - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          -

          The main Maps Service API features are:

          • Discovering and selecting a map provider diff --git a/org.tizen.guides/html/native/messaging/email_n.htm b/org.tizen.guides/html/native/messaging/email_n.htm index 1ae9a57..1459cad 100644 --- a/org.tizen.guides/html/native/messaging/email_n.htm +++ b/org.tizen.guides/html/native/messaging/email_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native

            +

            Mobile native

            @@ -33,16 +33,7 @@

            Email

            Email is a method of exchanging digital messages. Email systems are based on a store-and-forward model, in which email server computer systems accept, forward, deliver, and store messages on behalf of users, who only need to connect to the email infrastructure, typically an email server, with a network-enabled device for the duration of a message submission or retrieval.

            - - - - - - - - - -
            Note
            This feature is supported in mobile applications only.
            +

            This feature is supported in mobile applications only.

            Email provides features for composing, saving, and sending email messages using an SMTP (SMTP used for sending emails through the Internet is described in the RFC5321/5322 standards). It provides services to applications that make use of the email service.

            diff --git a/org.tizen.guides/html/native/messaging/messages_n.htm b/org.tizen.guides/html/native/messaging/messages_n.htm index 321ab8d..ad9cc17 100644 --- a/org.tizen.guides/html/native/messaging/messages_n.htm +++ b/org.tizen.guides/html/native/messaging/messages_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/messaging/messaging_guide_n.htm b/org.tizen.guides/html/native/messaging/messaging_guide_n.htm index a4c4311..3662533 100644 --- a/org.tizen.guides/html/native/messaging/messaging_guide_n.htm +++ b/org.tizen.guides/html/native/messaging/messaging_guide_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/messaging/push_n.htm b/org.tizen.guides/html/native/messaging/push_n.htm index 0b9a195..4ca35d4 100644 --- a/org.tizen.guides/html/native/messaging/push_n.htm +++ b/org.tizen.guides/html/native/messaging/push_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            @@ -34,10 +34,9 @@

            Push

            Push enables you to push events from an application server to your application on a Tizen device.

            -

            Figure: Push messaging service

            -

            Push messaging service

            +

            Once your application is successfully registered in the push server through the push daemon on the device, your application server can send push messages to the application in that particular device.

            -

            When a push message arrives when the application is running, it is automatically delivered to the application. If not, the daemon makes a sound or vibrates and adds a ticker or a badge notification to notify the user. By touching this notification, the user can check the message. The application server may send a message with a LAUNCH option. In this case, the daemon forcibly launches the application and hands over the message to the application as an app control.

            +

            When a push message arrives when the application is running, it is automatically delivered to the application. If not, the daemon makes a sound or vibrates and adds a ticker or a badge notification to notify the user. By touching this notification, the user can check the message. The application server may send a message with a LAUNCH option. In this case, the daemon forcibly launches the application and hands over the message to the application as an app control.

            To use the push messaging service, the application needs the permission to access Tizen push server. Request the permission from the Tizen push service team by email (push.tizen@samsung.com), including the information listed in the following table. When the team approves your request, you receive a push app ID corresponding to your package ID.

            @@ -105,6 +104,9 @@ +

            Figure: Push messaging service

            +

            Push messaging service

            +

            Service Architecture

            The following figure illustrates the service architecture of the Tizen push messaging service.

            Figure: Service architecture

            diff --git a/org.tizen.guides/html/native/migration_guide_n.htm b/org.tizen.guides/html/native/migration_guide_n.htm new file mode 100644 index 0000000..6408176 --- /dev/null +++ b/org.tizen.guides/html/native/migration_guide_n.htm @@ -0,0 +1,145 @@ + + + + + + + + + + + + + Migration Guide + + + + + +
            +

            Migration Guide

            + +

            Tizen 2.4 introduces new APIs for applications and modifies the behavior of some APIs to improve the quality of the platform. The following sections define the issues you must consider to make your application conform to Tizen 2.4 Application Framework APIs.

            + +

            New Background Application Policy

            +

            Since Tizen 2.4, the application on the background goes into a suspended state.

            +

            In the suspended state, the application process is executed with limited CPU resources. In other words, the platform does not allow the running of the background applications, except for some exceptional applications (such as Media and Download) that necessarily work on the background. In this case, the application can designate their background category as an allowed category to avoid going into the suspended state.

            +

            The following table lists the background categories that allow the application to run on the background.

            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + Table: Allowed background application policy +
            Background categoryDescriptionRelated APIsManifest file <background-category> element value
            MediaPlaying audio, recording, and outputting streaming video on the backgroundMultimedia API (in mobile and wearable applications)media
            DownloadDownloading data with the Tizen Download APIDownload API (in mobile applications)download
            Background networkProcessing general network operations on the background (such as Sync Manager, IM, and VOIP)Sync Manager (in mobile applications), Socket, and Curl API (in mobile and wearable applications)background-network
            LocationProcessing location data on the backgroundLocation API (in mobile and wearable applications)location
            Sensor (context)Processing context data from the sensors, such as gestureSensor API (in mobile and wearable applications)sensor
            IoT Communication/ConnectivityCommunicating between external devices on the background (such as Wi-Fi and Bluetooth)Wi-Fi (in mobile and wearable applications) and Bluetooth API (in mobile and wearable applications)iot-communication
            + +

            You can receive an event when the background application goes to the suspended state. Pass APP_EVENT_SUSPENDED_STATE_CHANGED as event_type to the ui_app_add_event_handler() or service_app_add_event_handler() function to handle the suspended event. You must release the resources properly when your application goes to the suspended state.

            + + +

            Changes in the Alarm API for Reducing Power Consumption

            +

            Since Tizen 2.4, the Alarm API is changed to reduce the power consumption of the device:

            + +
              +
            • Alarm APIs that support exact alarms are changed to be able to launch UI applications only. While launching UI applications when the alarm expires, the framework turns the LCD display on. Because of this you must not use those Alarm APIs for background processing. You can use the alarm_schedule_after_delay() function that supports an inexact alarm for background processing.
            • +
            • The alarm_schedule_after_delay() function is changed to support an inexact alarm. You can pass a period for alarm expiration, but the platform decides when the alarm expires according to the status of the device. +

              The alarm_schedule_after_delay() function can launch service applications when it is expired. However, the target service application must specify a background category to be registered as the target application of the function.

            • +
            • Regarding the app_control parameter of the Alarm APIs, only explicit launch is allowed. You cannot pass app_control for an implicit launch because the implicit launch cannot specify the target application when it is registered.
            • +
            +

            When you migrate your application from Tizen 2.3 to Tizen 2.4, check the changes and modify your application to conform with the Tizen 2.4 Alarm APIs.

            + +

            Tizen Application Event System

            +

            Tizen 2.4 introduces new Tizen Application Event APIs for subscribing system events and publishing and subscribing application events to other applications.

            +

            Using the Tizen Application Event APIs, you can register your service application to be launched when a specified event is published. You can specify the event name through the <app-control> element in the application manifest file. This launch-on-event allows your service application to only run after receiving an event from the platform or other application. Note that UI applications cannot be launched using the launch-on-event mechanism. For more information, see the Event API (in mobile and wearable applications).

            + +

            Application Group Launching Management

            +

            When you launch an application using the app_control_send_launch_request() function, you can treat the launched application as a sub-view of your application. For example, when your application launches the message composer application to send a message, you can treat the message composer as a member of your application group. Tizen 2.4 introduces the application group feature to supports this requirement.

            +

            The application can specify a launch mode when it launches a new application with the app_control_set_launch_mode() function. The APP_CONTROL_LAUNCH_MODE_SINGLE mode means the launched application is launched in a separate group and the APP_CONTROL_LAUNCH_MODE_GROUP mode means that the launched application is included in the group of the caller application.

            +

            You can also specify whether your application supports the group mode launching. You can specify the supported launch mode of your application in the application manifest file. If you specify the launch_mode as single, your application is always launched in a separate group, even if the caller application requests the APP_CONTROL_LAUNCH_MODE_GROUP mode. If you specify the launch_mode as caller, your application is launched according to the caller application request. If you specify the mode as group, the application is included in the group of caller application.

            +

            For more information, see the Managing Application Groups guide.

            + + + + +
            + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/multimedia/audio_io_n.htm b/org.tizen.guides/html/native/multimedia/audio_io_n.htm index c01d19b..5b19ce7 100644 --- a/org.tizen.guides/html/native/multimedia/audio_io_n.htm +++ b/org.tizen.guides/html/native/multimedia/audio_io_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/camera_n.htm b/org.tizen.guides/html/native/multimedia/camera_n.htm index d1eff57..23d8ca0 100644 --- a/org.tizen.guides/html/native/multimedia/camera_n.htm +++ b/org.tizen.guides/html/native/multimedia/camera_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/image_util_n.htm b/org.tizen.guides/html/native/multimedia/image_util_n.htm index 519f941..57a7865 100644 --- a/org.tizen.guides/html/native/multimedia/image_util_n.htm +++ b/org.tizen.guides/html/native/multimedia/image_util_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/media_codecs_n.htm b/org.tizen.guides/html/native/multimedia/media_codecs_n.htm index d600b8a..5150d4c 100644 --- a/org.tizen.guides/html/native/multimedia/media_codecs_n.htm +++ b/org.tizen.guides/html/native/multimedia/media_codecs_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/media_controller_n.htm b/org.tizen.guides/html/native/multimedia/media_controller_n.htm index 8f7f645..a103043 100644 --- a/org.tizen.guides/html/native/multimedia/media_controller_n.htm +++ b/org.tizen.guides/html/native/multimedia/media_controller_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/media_tools_n.htm b/org.tizen.guides/html/native/multimedia/media_tools_n.htm index 46fae74..12c7cb4 100644 --- a/org.tizen.guides/html/native/multimedia/media_tools_n.htm +++ b/org.tizen.guides/html/native/multimedia/media_tools_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.guides/html/native/multimedia/media_vision_n.htm b/org.tizen.guides/html/native/multimedia/media_vision_n.htm index 0d8c846..7548996 100644 --- a/org.tizen.guides/html/native/multimedia/media_vision_n.htm +++ b/org.tizen.guides/html/native/multimedia/media_vision_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            @@ -33,7 +33,7 @@

            Media Vision

            -

            You can perceive and understand an image or to extract information from images in ypur application.

            +

            You can perceive and understand an image or to extract information from images in your application.

            The main features of Media Vision API include:

              @@ -42,30 +42,21 @@
            • Detecting barcodes

              You can detect barcodes in an image or from camera preview streams, and then decrypt them to display messages to the user.

              -

              Before detecting a barcode, you must define the following detection attribute:

              -
                -
              • Barcode detection target: +

                Before detecting a barcode, you must define the barcode detection target attribute value:

                • Detect both 1D and 2D barcodes
                • Detect 1D barcodes only
                • Detect 2D barcodes only
                -
              • -
            • Generating barcodes

              You can encrypt a given message, generate a barcode from it, and save it in a memory or as a file.

              -

              Define the barcode type:

              -

              Before generating a barcode, you must define the following generation attribute:

              -
                -
              • Barcode generation text: -
                  -
                • Generate barcode without input message
                • -
                • Generate barcode with input message (Support only 1D barcodes)
                • -
                -
              • -
              -

              and specifications:

              +

              Before generating a barcode, you must define the barcode text generation attribute value:

              +
                +
              • Generate barcode without an input message
              • +
              • Generate barcode with an input message (supports only 1D barcodes)
              • +
              +

              You must also define the following specifications:

              • Barcode type
              • QR code specification (if the QA code barcode type is used)
              • @@ -207,4 +198,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/native/multimedia/metadata_editor_n.htm b/org.tizen.guides/html/native/multimedia/metadata_editor_n.htm index 64d45a5..edb2b0e 100644 --- a/org.tizen.guides/html/native/multimedia/metadata_editor_n.htm +++ b/org.tizen.guides/html/native/multimedia/metadata_editor_n.htm @@ -16,7 +16,7 @@
                -

                Mobile native Wearable native

                +

                Mobile native Wearable native

                diff --git a/org.tizen.guides/html/native/multimedia/metadata_extractor_n.htm b/org.tizen.guides/html/native/multimedia/metadata_extractor_n.htm index ad6e406..3ce3d7e 100644 --- a/org.tizen.guides/html/native/multimedia/metadata_extractor_n.htm +++ b/org.tizen.guides/html/native/multimedia/metadata_extractor_n.htm @@ -16,7 +16,7 @@
                -

                Mobile native Wearable native

                +

                Mobile native Wearable native

                diff --git a/org.tizen.guides/html/native/multimedia/multimedia_guide_n.htm b/org.tizen.guides/html/native/multimedia/multimedia_guide_n.htm index c7d342a..b11f498 100644 --- a/org.tizen.guides/html/native/multimedia/multimedia_guide_n.htm +++ b/org.tizen.guides/html/native/multimedia/multimedia_guide_n.htm @@ -16,7 +16,7 @@
                -

                Mobile native Wearable native

                +

                Mobile native Wearable native

                @@ -67,7 +67,7 @@

                The following guides apply in mobile applications only:

                  -
                • Screen Mirroring Sink +
                • Screen Mirroring

                  Enables you to mirror the device screen and sound to another device wirelessly.

                • Video Util

                  Enables you to use video transcoding features, such as multi-format codec and output format.

                • diff --git a/org.tizen.guides/html/native/multimedia/player_n.htm b/org.tizen.guides/html/native/multimedia/player_n.htm index b1dbac0..033df71 100644 --- a/org.tizen.guides/html/native/multimedia/player_n.htm +++ b/org.tizen.guides/html/native/multimedia/player_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  diff --git a/org.tizen.guides/html/native/multimedia/radio_n.htm b/org.tizen.guides/html/native/multimedia/radio_n.htm index 7319310..b4224aa 100644 --- a/org.tizen.guides/html/native/multimedia/radio_n.htm +++ b/org.tizen.guides/html/native/multimedia/radio_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  diff --git a/org.tizen.guides/html/native/multimedia/recorder_n.htm b/org.tizen.guides/html/native/multimedia/recorder_n.htm index b3e54b7..509b036 100644 --- a/org.tizen.guides/html/native/multimedia/recorder_n.htm +++ b/org.tizen.guides/html/native/multimedia/recorder_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  diff --git a/org.tizen.guides/html/native/multimedia/screen_mirroring_n.htm b/org.tizen.guides/html/native/multimedia/screen_mirroring_n.htm index efe4cb9..3aeb448 100644 --- a/org.tizen.guides/html/native/multimedia/screen_mirroring_n.htm +++ b/org.tizen.guides/html/native/multimedia/screen_mirroring_n.htm @@ -10,41 +10,32 @@ - Screen Mirroring Sink + Screen Mirroring
                  -

                  Screen Mirroring Sink

                  +

                  Screen Mirroring

                  You can mirror the device screen and sound to another device wirelessly using the screen mirroring feature. It follows the Wi-Fi Display Technical Specification and supports the feature as a sink, which receives shared data from a source device that supports the Wi-Fi Display, and displays it.

                  - - - - - - - - - -
                  Note
                  This feature is supported in mobile applications only.
                  +

                  This feature is supported in mobile applications only.

                  -

                  The main features of the Screen Mirroring Sink API include:

                  +

                  The main features of the Screen Mirroring API include:

                  • Managing the connection to the screen mirroring source

                    You can connect to and disconnect from a screen mirroring source, and start, pause, and resume the screen mirroring sink.

                    diff --git a/org.tizen.guides/html/native/multimedia/sound_manager_n.htm b/org.tizen.guides/html/native/multimedia/sound_manager_n.htm index 3bee14b..a19fc91 100644 --- a/org.tizen.guides/html/native/multimedia/sound_manager_n.htm +++ b/org.tizen.guides/html/native/multimedia/sound_manager_n.htm @@ -16,7 +16,7 @@
                    -

                    Mobile native Wearable native

                    +

                    Mobile native Wearable native

                    diff --git a/org.tizen.guides/html/native/multimedia/thumbnail_util_n.htm b/org.tizen.guides/html/native/multimedia/thumbnail_util_n.htm index d3785bd..1d3c294 100644 --- a/org.tizen.guides/html/native/multimedia/thumbnail_util_n.htm +++ b/org.tizen.guides/html/native/multimedia/thumbnail_util_n.htm @@ -16,7 +16,7 @@
                    -

                    Mobile native Wearable native

                    +

                    Mobile native Wearable native

                    diff --git a/org.tizen.guides/html/native/multimedia/tone_player_n.htm b/org.tizen.guides/html/native/multimedia/tone_player_n.htm index 86089ab..dcd6e16 100644 --- a/org.tizen.guides/html/native/multimedia/tone_player_n.htm +++ b/org.tizen.guides/html/native/multimedia/tone_player_n.htm @@ -16,7 +16,7 @@
                    -

                    Mobile native Wearable native

                    +

                    Mobile native Wearable native

                    diff --git a/org.tizen.guides/html/native/multimedia/video_util_n.htm b/org.tizen.guides/html/native/multimedia/video_util_n.htm index 51f91dd..dcc35d2 100644 --- a/org.tizen.guides/html/native/multimedia/video_util_n.htm +++ b/org.tizen.guides/html/native/multimedia/video_util_n.htm @@ -16,7 +16,7 @@
                    -

                    Mobile native

                    +

                    Mobile native

                    @@ -40,16 +40,7 @@
                  • Trim

                    A trim chapter is available in the video editor.

                  - - - - - - - - - -
                  Note
                  This feature is supported in mobile applications only.
                  +

                  This feature is supported in mobile applications only.

                  The following figure shows the result of the video file size change (due to scaling and container and codec format change).

                  diff --git a/org.tizen.guides/html/native/multimedia/wav_player_n.htm b/org.tizen.guides/html/native/multimedia/wav_player_n.htm index bff16d6..7e2a128 100644 --- a/org.tizen.guides/html/native/multimedia/wav_player_n.htm +++ b/org.tizen.guides/html/native/multimedia/wav_player_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  diff --git a/org.tizen.guides/html/native/network/bluetooth_n.htm b/org.tizen.guides/html/native/network/bluetooth_n.htm index 104bc2e..335688a 100644 --- a/org.tizen.guides/html/native/network/bluetooth_n.htm +++ b/org.tizen.guides/html/native/network/bluetooth_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  @@ -55,9 +55,9 @@
                • Connecting to audio devices with Bluetooth

                  Connect to Bluetooth audio devices, such as headset, hand-free, and headphone.

                • Handling attributes with Bluetooth GATT -

                  The Bluetooth GATT API (in mobile and wearable applications) provides functions for creating/destroying GATT Client handle, discovering, reading, modifying attributes and setting/unsetting the callbackes to get notified when characeteristic value is changed at remote device.

                  -

                  As a client, you can connect to and use a specific service on the server device. Once the connection is established, the client can manage the service attributes.

                  -

                  When no longer GATT Client operations are required, unregister the callbacks and destroy GATT Client handle.

                • +

                  The Bluetooth GATT API (in mobile and wearable applications) provides functions for creating and destroying the GATT client handle, discovering, reading, and modifying attributes, and setting and releasing callbacks to be notified when characteristic values are changed at the remote device.

                  +

                  As a client, you can connect to and use a specific service on the server device. Once the connection is established, the client can manage the service attributes. When the GATT client operations are no longer required, unregister the callbacks and destroy GATT client handle.

                  +
                • Connecting to health devices with Bluetooth HDP

                  Manage connections to health devices and exchange data.

                • Connecting to devices with Bluetooth HID diff --git a/org.tizen.guides/html/native/network/connection_n.htm b/org.tizen.guides/html/native/network/connection_n.htm index 5a8141f..4b77061 100644 --- a/org.tizen.guides/html/native/network/connection_n.htm +++ b/org.tizen.guides/html/native/network/connection_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  @@ -40,17 +40,6 @@

                  The connection features enable you to create a network connection and perform various operations over the connection. The application can access connection details, such as the IP address, proxy information, gateway information, and connection statistics.

                  - - - - - - - - - -
                  Note
                  Within the Network Programming Guide, the term "network" refers to IP network connections. For information on telephony connections, see the Telephony guide.
                  -

                  Connection Manager

                  The Connection Manager API (in mobile and wearable applications) provides functions for managing data connections. It allows you to get a state of the connection interface such as Bluetooth, cellular, and Wi-Fi. It also contains functions for getting the IP address, proxy information, and gateway information.

                  diff --git a/org.tizen.guides/html/native/network/network_guide_n.htm b/org.tizen.guides/html/native/network/network_guide_n.htm index 3094b7d..28168c5 100644 --- a/org.tizen.guides/html/native/network/network_guide_n.htm +++ b/org.tizen.guides/html/native/network/network_guide_n.htm @@ -16,7 +16,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  @@ -38,7 +38,7 @@
                • Connection

                  Enables you to get information about the connected network, set up and configure network connections, and track information, such as sent and received size.

                • Bluetooth

                  Enables you to use Bluetooth functionalities, such as managing the local Bluetooth adapter, bonding, and exchanging data between Bluetooth-enabled devices.

                • NFC

                  Enables you to use Near Field Communication (NFC) functionalities, such as reading and writing tags, and emulating a smart card.

                • -
                • SmartCard

                  Enables you to access secure elements (SE) through smart card features.

                • +
                • Smartcard

                  Enables you to access secure elements (SE) through smart card features.

                • Wi-Fi

                  Enables you to connect to a Wireless Local Area Network (WLAN) and transfer data over the network.

                The following guides apply in mobile applications only:

                @@ -46,6 +46,17 @@
              • Wi-Fi Direct

                Enables you to connect to Wi-Fi Direct™ devices and manage Wi-Fi Direct™ connections.

              + + + + + + + + + +
              Note
              Within the Network guides, the term "network" refers to IP network connections. For information on telephony connections, see the Telephony guide.
              +
            diff --git a/org.tizen.guides/html/native/network/nfc_n.htm b/org.tizen.guides/html/native/network/nfc_n.htm index 041ea86..61c6d9d 100644 --- a/org.tizen.guides/html/native/network/nfc_n.htm +++ b/org.tizen.guides/html/native/network/nfc_n.htm @@ -16,7 +16,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            @@ -132,6 +132,8 @@
          + +
      diff --git a/org.tizen.guides/html/native/network/smartcard_n.htm b/org.tizen.guides/html/native/network/smartcard_n.htm index 6acc7fc..bd4ee82 100644 --- a/org.tizen.guides/html/native/network/smartcard_n.htm +++ b/org.tizen.guides/html/native/network/smartcard_n.htm @@ -10,31 +10,31 @@ - SmartCard + Smartcard
      -

      SmartCard

      +

      Smartcard

      -

      Tizen enables you to use smart card functionalities, such as accessing a secure element (SE). Before using the SmartCard API, make sure you have a secure element on the device. The smart card service allow you to open a session on an SE, open a channel to the applet in the SE, send a command to the channel, and finally receive a response to the command.

      +

      Tizen enables you to use smart card functionalities, such as accessing a secure element (SE). Before using the Smartcard API, make sure you have a secure element on the device. The smart card service allow you to open a session on an SE, open a channel to the applet in the SE, send a command to the channel, and finally receive a response to the command.

      -

      The main components of the SmartCard API include:

      +

      The main components of the Smartcard API include:

      • SE service @@ -55,12 +55,12 @@

        Figure: Smart card service architecture

        Smart card service architecture

        -

        The SmartCard API is a reference implementation of the SIMalliance Open Mobile 3.0 API specification that enables Tizen applications to communicate with secure elements. For more information, see the SimAlliance. The Tizen implementation differs from the original as follows:

        +

        The Smartcard API is a reference implementation of the SIMalliance Open Mobile 3.0 API specification that enables Tizen applications to communicate with secure elements. For more information, see the SimAlliance. The Tizen implementation differs from the original as follows:

        • Only the transport layer is provided. There is no service layer support in Tizen.
        • The "get version" function does not exist. In Tizen, version management is not performed through a function.
        • Allocation style differs dramatically. -The Open Mobile API can facilitate the memory management by calling the API twice (for an example, see section 6.3.1, Usage pattern, in the SIMalliance Open Mobile 3.0 API specification). However, Tizen SmartCard API does not follow this allocation style.
        • +The Open Mobile API can facilitate the memory management by calling the API twice (for an example, see section 6.3.1, Usage pattern, in the SIMalliance Open Mobile 3.0 API specification). However, Tizen Smartcard API does not follow this allocation style.
        • For the SE Service object management, Tizen provides functions for initialization and deinitialization.
        diff --git a/org.tizen.guides/html/native/network/wifi_direct_n.htm b/org.tizen.guides/html/native/network/wifi_direct_n.htm index d51697b..76a989d 100644 --- a/org.tizen.guides/html/native/network/wifi_direct_n.htm +++ b/org.tizen.guides/html/native/network/wifi_direct_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native

        +

        Mobile native

        @@ -33,16 +33,7 @@

        Wi-Fi Direct™ (synonym for Wi-Fi P2P (Peer-to-Peer)) is a technology that allows you to find nearby Wi-Fi Direct™ devices and form a Wi-Fi Direct™ group to communicate over a peer-to-peer link without wireless access points (base stations) in the infrastructure mode.

        - - - - - - - - - -
        Note
        This feature is supported in mobile applications only.
        +

        This feature is supported in mobile applications only.

        In a Wi-Fi Direct™ group, the group owner works as an access point in the Wi-Fi infrastructure mode and the other devices join the group as clients. A group can be created either by negotiation between 2 devices or in an autonomous mode by a single group owner device. In a negotiation-based group creation, 2 devices compete based on the group owner intent value and the higher intent device becomes a group owner, while the other device becomes a group client. In an autonomous group creation, a device becomes a group owner by itself without any group client.

        diff --git a/org.tizen.guides/html/native/network/wifi_n.htm b/org.tizen.guides/html/native/network/wifi_n.htm index 8c4ab8b..43fa985 100644 --- a/org.tizen.guides/html/native/network/wifi_n.htm +++ b/org.tizen.guides/html/native/network/wifi_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        diff --git a/org.tizen.guides/html/native/security/key_manager_n.htm b/org.tizen.guides/html/native/security/key_manager_n.htm index 020f0a2..b6b581a 100644 --- a/org.tizen.guides/html/native/security/key_manager_n.htm +++ b/org.tizen.guides/html/native/security/key_manager_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        @@ -34,8 +34,6 @@

        The key manager provides functions to securely store keys, certificates, and sensitive data related to users and their password-protected APPs. Additionally, it provides secure cryptographic operations for non-exportable keys without revealing the key values to clients.

        -

        Figure: Key manager process

        -

        Key manager process

        A key manager stores keys, certificates, and sensitive user data in a central secure repository. The central secure repository is protected by a password.

        @@ -75,6 +73,8 @@
      +

      Figure: Key manager process

      +

      Key manager process

      The key manager provides 2 types of APIs (in mobile and wearable applications):

        diff --git a/org.tizen.guides/html/native/security/privilege_n.htm b/org.tizen.guides/html/native/security/privilege_n.htm index 17e2b55..910a7d3 100644 --- a/org.tizen.guides/html/native/security/privilege_n.htm +++ b/org.tizen.guides/html/native/security/privilege_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        diff --git a/org.tizen.guides/html/native/security/security_guide_n.htm b/org.tizen.guides/html/native/security/security_guide_n.htm index ea26b3c..10acf39 100644 --- a/org.tizen.guides/html/native/security/security_guide_n.htm +++ b/org.tizen.guides/html/native/security/security_guide_n.htm @@ -16,7 +16,7 @@
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        diff --git a/org.tizen.guides/html/native/social/calendar_n.htm b/org.tizen.guides/html/native/social/calendar_n.htm index 256a2ff..c2f53ce 100644 --- a/org.tizen.guides/html/native/social/calendar_n.htm +++ b/org.tizen.guides/html/native/social/calendar_n.htm @@ -16,7 +16,7 @@

      Related Info

        @@ -44,23 +44,14 @@

        Calendar

        - +

        A calendar is a system of organizing days for social purposes. It is composed of records, such as events and todos. The records consist of subrecords, such as alarms, attendees, or extensions. For example, if an event has a recurrence rule (meaning that it happens multiple times), separate instances are generated for each time the event occurs.

        - - - - - - - - - -
        Note
        This feature is supported in mobile applications only.
        - -

        Figure: Calendar model

        +

        This feature is supported in mobile applications only.

        + +

        Figure: Calendar model

        Calendar model

        - +

        The Calendar Service supports vCalendars.

        The main features of the Calendar API include:

        @@ -87,10 +78,10 @@
      -

      The following figure illustrates the different Calendar entities and their relationships.

      +

      The following figure illustrates the different Calendar entities and their relationships.

      -

      Figure: Calendar entities

      -

      Calendar entities

      +

      Figure: Calendar entities

      +

      Calendar entities

      vCalendar supports ver1.0 (vcs) and 2.0 (ics). For more information about vCalendar, see rfc2445.

      @@ -107,30 +98,30 @@ calendar_disconnect();

      A calendar book is a placeholder for other records in the Calendar API. Every event and todo has to belong to a calendar book. There are 3 built-in calendar books, as shown in the following table.

      - +
      - - - - - - - - - - - - - - - - - - -
      Table: Calendar books -
      BookDescription
      DEFAULT_EVENT_CALENDAR_BOOK_IDEvent book
      DEFAULT_TODO_CALENDAR_BOOK_IDTodo book
      DEFAULT_BIRTHDAY_CALENDAR_BOOK_IDBirthday book
      - + + + + Book + Description + + + DEFAULT_EVENT_CALENDAR_BOOK_ID + Event book + + + DEFAULT_TODO_CALENDAR_BOOK_ID + Todo book + + + DEFAULT_BIRTHDAY_CALENDAR_BOOK_ID + Birthday book + + + + The following code example sets a calendar book ID.
       calendar_record_h event = NULL;
      @@ -149,7 +140,7 @@ calendar_db_insert_record(event &event_id);
       calendar_record_destroy(event, true);
       
      - +

      To receive a list of existing calendar books, use the following code:

      calendar_list_h calendar_book_list = NULL;
       calendar_db_get_all_records(_calendar_calendar_book._uri, 0, 0, &calendar_book_list);
      @@ -168,115 +159,115 @@ calendar_db_add_changed_cb(_calendar_event._uri, __event_changed_cb, NULL);
  • Events and Instances

    An event record describes various properties, such as description, categories, and priority. It also contains information on when the event takes place. In a recurring event, there are more than one instance of the event. Each instance has its corresponding instance record.

    If an event is inserted with rrule (recurrence rule), alarm, and attendee, its data is saved to each database. Generated instances based on the rrule are also stored in the instance database.

    - -

    Figure: Views and databases

    -

    Views and databases

    + +

    Figure: Views and databases

    +

    Views and databases

    The following table illustrates and example of a recurring event and its instances.

    - +
    - - - - - - + Table: Event and instance example + + + + + + + +
  • Count set to 3
  • - - -
    - Table: Event and instance example -
    EventInstances
    EventInstances
    Recurrence rules:
    • Start date on 2012-10-09 (Tuesday)
    • Frequency set to WEEKLY
    • Interval set to 1
    • -
    • Count set to 3
    2012-10-09 Tuesday

    2012-10-16 Tuesday

    -

    2012-10-22 Tuesday

    +

    2012-10-22 Tuesday

    + + +

    The recurrence model in the Calendar API is compliant with the iCalendar specification. The following event properties have the same functionality as their corresponding values in iCalendar:

    - +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - Table: Recurrence rules -
    Recurrence rule propertyDescription
    freqYearly, monthly, weekly, or daily
    countUntil count. If the count is 3, 3 instances are generated.
    intervalInterval is a positive integer representing how often the recurrence rule repeats
    bydayMO, TU, WE, TH, FR, SA, or SU
    bymonthdayDays of the month
    byyeardayDays of the year
    byweeknoOrdinals specifying weeks of the year
    bymonthMonths of the year
    bysetposValues which correspond to the nth occurrence within the set of events
    wkstDay on which the workweek starts
    + Table: Recurrence rules + + + + Recurrence rule property + Description + + + freq + Yearly, monthly, weekly, or daily + + + count + Until count. If the count is 3, 3 instances are generated. + + + interval + Interval is a positive integer representing how often the recurrence rule repeats + + + byday + MO, TU, WE, TH, FR, SA, or SU + + + bymonthday + Days of the month + + + byyearday + Days of the year + + + byweekno + Ordinals specifying weeks of the year + + + bymonth + Months of the year + + + bysetpos + Values which correspond to the nth occurrence within the set of events + + + wkst + Day on which the workweek starts + + +

    Exceptions

    If one of the instances of a recurring event is modified (such as its summary or date) or deleted, it is called an exception. For example, if 2nd instance date is modified from 16th to 17th, 17th is the exception.

    - +
    - - - + + + + - - - + + + + +

    2012-10-22 Tuesday

    - - -
    Table: Exception example -
    Event
    Event InstancesExceptions
    Exceptions
    Recurrence rules:
    • Start date on 2012-10-09 (Tuesday)
    • Frequency set to WEEKLY
    • Interval set to 1
    • Count set to 3
    -
    2012-10-09 Tuesday

    2012-10-16 Tuesday > modified

    -

    2012-10-22 Tuesday

    2012-10-17 Tuesday
    + + +

    To get the changes in an exception, use the calendar_db_get_changes_exception_by_version() function. The instances and exceptions are deleted together when the original event is deleted.

    @@ -285,24 +276,24 @@ calendar_db_add_changed_cb(_calendar_event._uri, __event_changed_cb, NULL);When a filter is ready, it can be set as a property of a query. Other query properties allow configuring how the returned results are grouped and sorted.

    The operator precedence in filters is determined by the order in which the conditions and filters are added. The following table shows an example of how the operator precedence works.

    - +
    - - - - - - + + + + + + + - - - +Condition C3 + + + AND
    F1
    AND
    - F2 + F2 - - -
    Table: Filter conditions -
    ConditionResult
    ConditionResult
    Condition C1
    OR
    Condition C2
    AND
    -Condition C3
    (C1 OR C2) AND C3
    (C1 OR C2) AND C3
    Filter F1:
    Condition C1
    OR
    @@ -318,47 +309,47 @@ Condition C3
    (C5 AND F1) AND F2
    -Meaning (C5 AND (C1 OR C2)) AND (C3 OR C4)
    +Meaning (C5 AND (C1 OR C2)) AND (C3 OR C4) + + +

    The following code creates a filter, accepting events with high priority or those that include the word "meeting" in their description.

    calendar_filter_h filter = NULL;
    -
    + 
     // Create a filter returning event type records
     calendar_filter_create(_calendar_event._uri, &filter);
    -
    + 
     // Add a 'priority equals high' condition
     calendar_filter_add_int(filter, _calendar_event.priority, CALENDAR_MATCH_EQUAL, CALENDAR_EVENT_PRIORITY_HIGH);
    -
    + 
     // Add OR operator
     calendar_filter_add_operator(filter, CALENDAR_FILTER_OPERATOR_OR);
    -
    + 
     // Add a 'description contains "meeting"' condition
     calendar_filter_add_str(filter, _calendar_event.description, CALENDAR_MATCH_CONTAINS, "meeting");
    - +

    Insert the filter into the query and execute the query:

    calendar_query_h query = NULL;
     calendar_list_h list = NULL;
    -
    + 
     // Create a query returning event type records
     calendar_query_create(_calendar_event._uri, &query);
    -
    + 
     // Add the filter
     calendar_query_set_filter(query, filter);
    -
    + 
     // Execute the query, results are returned in a list
     calendar_db_get_records_with_query(query, 0, 0, &list);
    -
    + 
     calendar_filter_destroy(filter);
     calendar_query_destroy(query);
    -
    + 
     // Use the list
    -
    + 
     calendar_list_destroy(list, true);

    Projections

    @@ -415,48 +406,48 @@ calendar_record_h event2 = NULL; calendar_db_get_record(_calendar_event._uri, event_id, &event2);

    Basic Types

    -

    Records contain properties of basic types: integer, lli (long integer, long long int), double, string, bool, and time. The time type holds either a long long int, or 3 integers (year, month, day).

    +

    Records contain properties of basic types: integer, lli (long integer, long long int), double, string, bool, and time. The time type holds either a long long int, or 3 integers (year, month, day).

    The following table lists the setter and getter functions for each type.

    - +
    - - - - + Table: Setter and getter functions + + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - -
    - Table: Setter and getter functions -
    PropertySetter
    PropertySetter Getter
    integer
    integer calendar_record_set_int calendar_record_get_int
    long long integer
    long long integer calendar_record_set_lli calendar_record_get_lli
    double
    double calendar_record_set_double calendar_record_get_double
    string
    string calendar_record_set_str calendar_record_get_str
    calendar_time_s
    calendar_time_s calendar_record_set_caltime calendar_record_get_caltime
    + + + -

    Children

    +

    Children

    Certain type of records hold "child list" properties. If a record has a property of this type, it can be a parent of other records, called child records. For example, the attendee records can hold an event identifier in their event_id property. The event is the parent record of the child attendee records.

    The following code example creates an event and inserts it into the default event book.

    @@ -464,13 +455,13 @@ calendar_db_get_record(_calendar_event._uri, event_id, &event2);
    // Create an event
     calendar_record_h event = NULL;
     calendar_record_create(_calendar_event._uri, &event);
    -
    + 
     // Set event summary
     calendar_record_set_str(event, _calendar_event.summary, "Meeting");
    -
    + 
     // Put the event into the default calendar book for events
     calendar_record_set_int(event, _calendar_event.calendar_book_id, book_id);
    -
    + 
     // Insert calendar book into the database
     int event_id = 0;
     calendar_db_insert_record(event, &event_id);
    @@ -481,12 +472,11 @@ calendar_record_destroy(event, true);

    Reminders

    The following figure illustrates how the alarm process works.

    - -

    Figure: Alarm process

    + +

    Figure: Alarm process

    Alarm process

    -

    To get reminder when alarm is triggered, reminder mime name should be set by App. -

    After reminder mime name is set, insert an alarm as a child of an event record:

    +

    To get a reminder when an alarm is triggered, the application must set the reminder mime name. After the reminder mime name is set, insert an alarm as a child of an event record:

    // Set alarm
     calendar_record_h alarm = NULL;
     calendar_record_create(_calendar_alarm._uri, &alarm);
    @@ -496,18 +486,17 @@ calendar_record_set_lli(alarm, _calendar_alarm.time, (1404036000 - 60)); // Befo
     // Add alarm as child
     calendar_record_add_child_record(event, _calendar_event.calendar_alarm, alarm);
    -

    When the registered alarm is triggered and alarm manager notifies, calendar service calls packages which have the reminder mime name.

    - +

    When the registered alarm is triggered and the alarm manager notices it, the calendar service calls those packages that have the reminder mime name.

    Time Structure

    The calendar time structure, calendar_caltime_s, is defined as follows:

    typedef struct
     {
        calendar_time_type_e type;
    -   union
    +   union 
        {
           long long int utime;
    -      struct
    +      struct 
           {
              int year;
              int month;
    @@ -518,31 +507,31 @@ calendar_record_add_child_record(event, _calendar_event.calendar_alarm, alarm);<
     

    Use this structure when setting the calendar time (_CALENDAR_PROPERTY_CALTIME) properties of the records.

    The time structure can hold 2 types of data: UTC time (long long int) and date, given as year, month, and day of the month (3 integers). These types are identified by the values of the calendar_time_type_e variable, and they determine the usage of the structure.

    - +
    - - - - + + + + + - - - - - - - - - - - - - - -
    Table: Data types -
    IdentifierType
    IdentifierType Name Purpose
    CALENDAR_TIME_UTIMElong long intutimeUTC time, used to describe non-all-day events
    CALENDAR_TIME_LOCALTIMEstructdateDate only (year, month, and day of the month), used to describe all day events.
    + + + CALENDAR_TIME_UTIME + long long int + utime + UTC time, used to describe non-all-day events + + + CALENDAR_TIME_LOCALTIME + struct + date + Date only (year, month, and day of the month), used to describe all day events. + + +

    UTC Time Usage

    Structures with UTC time are used for non-all-day events. In such cases, you must convert local time to UTC time. The local time zone identifier must be stored in the record, in the corresponding property.

    @@ -550,7 +539,7 @@ calendar_record_add_child_record(event, _calendar_event.calendar_alarm, alarm);<

    When converting local time to UTC time, use the function illustrated in the following example. It converts the given date and time to the corresponding UTC time, considering the given time zone (first argument). The function uses the i18n API.

    #define ms2sec(ms) (long long int)(ms / 1000.0)
    -
    + 
     long long int _time_convert_itol(char *tzid, int y, int mon, int d, int h, int min, int s)
     {
        int ret = 0;
    @@ -562,7 +551,7 @@ long long int _time_convert_itol(char *tzid, int y, int mon, int d, int h, int m
     
        i18n_ulocale_get_default((const char **)&loc_default);
        ret = i18n_ucalendar_create(utf16_timezone, -1, loc_default, I18N_UCALENDAR_GREGORIAN, &ucal);
    -   if (I18N_ERROR_NONE != ret)
    +   if (I18N_ERROR_NONE != ret) 
        {
           dlog_print(DLOG_DEBUG, LOG_TAG, "i18n_ucalendar_create() is failed (%d)\n", ret);
     
    @@ -573,7 +562,7 @@ long long int _time_convert_itol(char *tzid, int y, int mon, int d, int h, int m
     
        i18n_udate date;
        ret = i18n_ucalendar_get_milliseconds(ucal, &date);
    -   if (I18N_ERROR_NONE != ret)
    +   if (I18N_ERROR_NONE != ret) 
        {
           dlog_print(DLOG_DEBUG, LOG_TAG, "i18n_ucalendar_create() is failed (%d)\n", ret);
           i18n_ucalendar_destroy(ucal);
    @@ -589,24 +578,24 @@ long long int _time_convert_itol(char *tzid, int y, int mon, int d, int h, int m
     
    // Fill calendar time structures (start and end time)
     calendar_time_s st = {0};
     calendar_time_s et = {0};
    -
    + 
     st.type = CALENDAR_TIME_UTIME;
     st.time.utime = _time_convert_itol("Asia/Seoul", 2012, 9, 15, 11, 0, 0);
    -
    + 
     et.type = CALENDAR_TIME_UTIME;
     et.time.utime = _time_convert_itol("Asia/Seoul", 2012, 9, 15, 12, 0, 0);
    -
    + 
     // Create an event record
    -
    + 
     // Set local time zone of start time
     calendar_record_set_str(event, _calendar_event.start_tzid, "Asia/Seoul");
    -
    + 
     // Set start time
     calendar_record_set_caltime(event, _calendar_event.start_time, st);
    -
    + 
     // Set local time zone of end time
     calendar_record_set_str(event, _calendar_event.end_tzid, "Asia/Seoul");
    -
    + 
     // Set end time
     calendar_record_set_caltime(event, _calendar_event.end_time, et);
    @@ -619,23 +608,23 @@ calendar_record_set_caltime(event, _calendar_event.end_time, et);

    Generic access functions can be used (according to data-view declarations) to access calendar views. A data-view is almost the same as a database "VIEW", which limits access and guarantees performance. A "record" represents a single row of the data-views.

    The _calendar_instance_utime and _calendar_instance_localtime views are not offered, but combinations with another views are provided.

    - +
    - - - - - - + Table: Calendar views + + + + + + + +_calendar_extended_property - - -
    - Table: Calendar views -
    Editable viewRead-only view
    Editable viewRead-only view
    _calendar_book
    _calendar_event
    _calendar_todo
    _calendar_timezone
    _calendar_attendee
    _calendar_alarm
    -_calendar_extended_property
    _calendar_updated_info
    _calendar_event_calendar_book
    _calendar_todo_calendar_book
    @@ -644,9 +633,9 @@ calendar_record_set_caltime(event, _calendar_event.end_time, et); _calendar_instance_localtime_calendar_book
    _calendar_instance_utime_calendar_book_extended
    _calendar_instance_localtime_calendar_book_extended
    + + +

    The _calendar_updated_info view is used when identifying record changes depending on the version. The other read-only views are a combination of editable views for UI convenience:

    • _calendar_event + _calendar_book = _calendar_event_calendar_book
    • @@ -656,14 +645,14 @@ calendar_record_set_caltime(event, _calendar_event.end_time, et);

    Properties

    The record types that have *_id as their property hold identifiers of other records. For example, the attendee and alarm views hold the ID of their corresponding events or todos in the event_id or todo_id property (as children of the corresponding event or todo records).

    The record type properties are other records. For example, an event record has attendee and alarm properties, which means that records of those types can be children of the event type records. The following figure illustrates macros in a calendar_view.h header file.

    - -

    Figure: Properties

    -

    Properties

    + +

    Figure: Properties

    +

    Properties

    // Create an event with _calendar_event view
     calendar_record_h event = NULL;
     calendar_record_create(_calendar_event._uri, &event);
    -
    + 
     // Set event summary to _calendar_event view
     calendar_record_set_str(event, _calendar_event.summary, "Meeting");
     
    @@ -716,7 +705,7 @@ calendar_vcalendar_parse_to_calendar(stream, &list); // Jobs for list calendar_list_destroy(list, true); - +
    @@ -738,4 +727,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/native/social/contact_n.htm b/org.tizen.guides/html/native/social/contact_n.htm index 3d63bff..3d6a6a1 100644 --- a/org.tizen.guides/html/native/social/contact_n.htm +++ b/org.tizen.guides/html/native/social/contact_n.htm @@ -16,7 +16,7 @@ @@ -46,17 +47,6 @@

    Contact features provide functions for managing contact information, such as address books, groups, persons, and phone logs.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    -

    A contact object is always associated with a specific address book. A person object is an aggregation of one or more contacts associated with the same person.

    The following figure illustrates the contact structure. There are 3 instances of the same contact in different address books. Person1 is an aggregation of those instances (Contact1, Contact2, and Contact3).

    @@ -73,7 +63,7 @@
  • Insert contacts to and remove them from the contacts database.
  • Use filters and queries to search and organize contacts.
  • Accounts -
    • Handle accounts using an account ID created with the Account Manager API.
    • +
      • Handle accounts using an account ID created with the Account Manager API (in mobile and wearable applications).
      • Have the related account ID of 0 because local device address book has no account.
      • Create only one address book each.
    • Address books @@ -144,7 +134,7 @@ free(ids);

      Database Change Notifications

      -

      To detect the contact database changes, use the Database API functions. Register a callback with the contacts_db_add_changed_cb() function. To unregister the callback and ignore database changes, use the contacts_db_remove_changed_cb() function.

      +

      To detect the contact database changes, use the Database API functions (in mobile and wearable applications). Register a callback with the contacts_db_add_changed_cb() function. To unregister the callback and ignore database changes, use the contacts_db_remove_changed_cb() function.

      Clients wait contacts change notifications on the client side. If the contact is changed by another module, the server publishes a notification. The notification module broadcasts to the subscribed modules and a user callback function is called with the user data. The following example registers person changes notification callback:

      @@ -672,7 +662,7 @@ contacts_record_destroy(contact, true);

      Figure: Properties

      Properties

      -

      For more information, see the View/Property API.

      +

      For more information, see the View/Property API (in mobile and wearable applications).

      vCards

      The Contact Service provides functions for parsing and making vCards. The vCard APIs are based on the vCard v3.0 specification.

      @@ -721,10 +711,10 @@ contacts_vcard_make_from_contact(contact, &vcard_stream); free(vcard_stream); contacts_record_destroy(contact, true); + - - - + +
  • @@ -746,4 +736,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.guides/html/native/social/service_adaptor_n.htm b/org.tizen.guides/html/native/social/service_adaptor_n.htm index 450521d..c95d918 100644 --- a/org.tizen.guides/html/native/social/service_adaptor_n.htm +++ b/org.tizen.guides/html/native/social/service_adaptor_n.htm @@ -17,7 +17,7 @@ @@ -40,6 +39,8 @@

    You can manage adaptors, which function as agents between the Service Adaptor Client and the related plugins, to take advantage of various services. For example, the Auth and Storage adaptors allow you to access the Auth and Service Plugins to use services, such as Amazon, Box, Dropbox, Google Drive, Onedrive, and Sugarsync.

    +

    This feature is supported in mobile applications only.

    +

    Figure: Service adaptor structure

    Service adaptor structure

    diff --git a/org.tizen.guides/html/native/social/social_guide_n.htm b/org.tizen.guides/html/native/social/social_guide_n.htm index 569140d..a51d6b6 100644 --- a/org.tizen.guides/html/native/social/social_guide_n.htm +++ b/org.tizen.guides/html/native/social/social_guide_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -34,21 +34,19 @@

    Social

    -

    Social features include managing personal data, such as contacts, schedules, and accounts on the device.

    +

    Social features include managing personal data, such as contacts and schedules, on the device.

    +

    The main social features are:

      -
    • Service Adaptor -

      Allows you to work with cloud storages and services by managing authentication, contact information and file transfers to and from the cloud.

    • +
    • Contacts

      Allows you to work with contact information in your application by retrieving and managing individual contact information, searching for contacts, and receiving address book change notifications.

    -

    The following guides apply in mobile applications only:

    - +

    The following guides apply in mobile applications only:

      -
    • Account Manager -

      Allows you to work with accounts in your application by creating, managing and removing individual accounts.

    • Calendar

      Allows you to work with personal scheduling data by managing calendars, events, and todos, and setting reminders and recurrence properties. You can also search for calendar book entries and receive calendar book change notifications.

    • -
    • Contacts

      Allows you to work with contact information in your application by retrieving and managing individual contact information, searching for contacts, and receiving address book change notifications.

    • +
    • Service Adaptor +

      Allows you to work with cloud storages and services by managing authentication, contact information and file transfers to and from the cloud.

    diff --git a/org.tizen.guides/html/native/system/device_n.htm b/org.tizen.guides/html/native/system/device_n.htm index 56080fd..5bbb1a3 100644 --- a/org.tizen.guides/html/native/system/device_n.htm +++ b/org.tizen.guides/html/native/system/device_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/dlog_n.htm b/org.tizen.guides/html/native/system/dlog_n.htm index 32a3b33..4e0609b 100644 --- a/org.tizen.guides/html/native/system/dlog_n.htm +++ b/org.tizen.guides/html/native/system/dlog_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -29,6 +29,7 @@
  • Error Type
  • Error Handling with dlog
  • dlogutil
  • +
  • Architecture
  • Related Info

      @@ -44,10 +45,6 @@

      The dlog logging service consists of the dlogutil dlog library, and it supports sending log messages to a circular log device. The log device is a circular buffer used to collect log messages from various applications and the system.

      -

      Figure: Architecture

      - -

      Architecture

      -

      The dlog service sends a log message to the circular buffer with APIs, including Priority and Tag information. With this information, it is easy to filter and check the messages with dlogutil.

      Before using dlog, you should know which priorities and tags to use and where to write (format, buffer).

      @@ -298,6 +295,14 @@ dlogutil [<option>] ... [<filter-spec>] ... +

      Architecture

      + +

      The following figure illustrates the general architecture of the dlog logging service.

      +

      Figure: Architecture

      + +

      Architecture

      + +
    diff --git a/org.tizen.guides/html/native/system/media_keys_n.htm b/org.tizen.guides/html/native/system/media_keys_n.htm index 3e25776..5118179 100644 --- a/org.tizen.guides/html/native/system/media_keys_n.htm +++ b/org.tizen.guides/html/native/system/media_keys_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/runtime_info_n.htm b/org.tizen.guides/html/native/system/runtime_info_n.htm index 361e892..b788805 100644 --- a/org.tizen.guides/html/native/system/runtime_info_n.htm +++ b/org.tizen.guides/html/native/system/runtime_info_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/sensors_n.htm b/org.tizen.guides/html/native/system/sensors_n.htm index 1204f8d..0b81743 100644 --- a/org.tizen.guides/html/native/system/sensors_n.htm +++ b/org.tizen.guides/html/native/system/sensors_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/settings_n.htm b/org.tizen.guides/html/native/system/settings_n.htm index 6e88570..3deec9e 100644 --- a/org.tizen.guides/html/native/system/settings_n.htm +++ b/org.tizen.guides/html/native/system/settings_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -175,13 +175,6 @@ - SYSTEM_SETTINGS_KEY_SCREEN_BACKLIGHT_TIME - int - GETTER, NOTIFIER - Backlight time (in seconds). - - - SYSTEM_SETTINGS_KEY_SOUND_LOCK bool GETTER, NOTIFIER diff --git a/org.tizen.guides/html/native/system/storage_n.htm b/org.tizen.guides/html/native/system/storage_n.htm index a17d8ea..aed0d65 100644 --- a/org.tizen.guides/html/native/system/storage_n.htm +++ b/org.tizen.guides/html/native/system/storage_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/sysinfo_n.htm b/org.tizen.guides/html/native/system/sysinfo_n.htm index 0672fd7..c2109b9 100644 --- a/org.tizen.guides/html/native/system/sysinfo_n.htm +++ b/org.tizen.guides/html/native/system/sysinfo_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -247,12 +247,22 @@ bool The platform returns true for this key, if the device supports location positioning. + + http://tizen.org/feature/location.geofence + bool + The platform returns true for this key and the http://tizen.org/feature/location key, if the device supports the geofence feature. + http://tizen.org/feature/location.gps bool The platform returns true for this key and the http://tizen.org/feature/location key, if the device supports the Global Positioning System (GPS). + http://tizen.org/feature/location.gps.satellite + bool + The platform returns true for this key and the http://tizen.org/feature/location.gps key, if the device has a GPS chip that supports satellite information. + + http://tizen.org/feature/location.wps bool The platform returns true for this key and the http://tizen.org/feature/location key, if the device supports the Wi-Fi-based Positioning System (WPS). @@ -365,11 +375,16 @@ bool The platform returns true for this key, if the device supports Bluetooth Object Push Profile (OPP). - - http://tizen.org/feature/network.internet - bool - The platform returns true for this key, if the device supports internet access. - + + http://tizen.org/feature/network.ethernet + bool + The platform returns true for this key, if the device supports Ethernet. + + + http://tizen.org/feature/network.internet + bool + The platform returns true for this key, if the device supports Internet access. + http://tizen.org/feature/network.nfc bool @@ -430,6 +445,11 @@ the Tizen reference implementation. The platform returns true for this key and the http://tizen.org/feature/network.telephony key, if the device supports MMS. + http://tizen.org/feature/network.telephony.sms + bool + The platform returns true for this key and the http://tizen.org/feature/network.telephony key, if the device supports SMS. + + http://tizen.org/feature/network.tethering bool The platform returns true for this key, if the device supports any kind of tethering. @@ -787,6 +807,11 @@ the Tizen reference implementation. The platform returns true for this key and the http://tizen.org/feature/sensor.barometer key, if the device supports the wake-up operation by the barometer sensor. + http://tizen.org/feature/sensor.geomagnetic_rotation_vector + bool + The platform returns true for this key, if the device supports the geomagnetic-based rotation vector sensor. + + http://tizen.org/feature/sensor.gesture_recognition bool The platform returns true for this key, if the device supports the gesture recognition. @@ -802,6 +827,16 @@ the Tizen reference implementation. The platform returns true for this key, if the device supports the gyro sensor. + http://tizen.org/feature/sensor.gyroscope_rotation_vector + bool + The platform returns true for this key, if the device supports the gyroscope-based rotation vector sensor. + + + http://tizen.org/feature/sensor.gyroscope.uncalibrated + bool + The platform returns true for this key, if the device supports the uncalibrated gyroscope sensor. + + http://tizen.org/feature/sensor.gyroscope.wakeup bool The platform returns true for this key and the http://tizen.org/feature/sensor.gyroscope key, if the device supports the wake-up operation by the gyro sensor. @@ -814,17 +849,17 @@ the Tizen reference implementation. http://tizen.org/feature/sensor.heart_rate_monitor.led_green bool - The platform returns true for this key, if the device supports the green LED sensor of the heart rate monitor. + The platform returns true for this key, if the device supports the LED green sensor of the heart rate monitor. http://tizen.org/feature/sensor.heart_rate_monitor.led_ir bool - The platform returns true for this key, if the device supports the infrared LED sensor of the heart rate monitor. + The platform returns true for this key, if the device supports the LED infrared sensor of the heart rate monitor. http://tizen.org/feature/sensor.heart_rate_monitor.led_red bool - The platform returns true for this key, if the device supports the red LED sensor of the heart rate monitor. + The platform returns true for this key, if the device supports the LED red sensor of the heart rate monitor. http://tizen.org/feature/sensor.humidity @@ -837,11 +872,16 @@ the Tizen reference implementation. The platform returns true for this key, if the device supports the linear acceleration sensor. - http://tizen.org/feature/sensor.magnetometer + http://tizen.org/feature/sensor.magnetometer bool The platform returns true for this key, if the device supports the magnetic sensor. + http://tizen.org/feature/sensor.magnetometer.uncalibrated + bool + The platform returns true for this key, if the device supports the uncalibrated geomagnetic sensor. + + http://tizen.org/feature/sensor.magnetometer.wakeup bool The platform returns true for this key and the http://tizen.org/feature/sensor.magnetometer key, if the device supports the wake-up operation by the magnetic sensor. @@ -951,8 +991,13 @@ the Tizen reference implementation. Type Description + + http://tizen.org/feature/speech.control + bool + The platform returns true for this key, if the device supports voice control. + - http://tizen.org/feature/speech.recognition + http://tizen.org/feature/speech.recognition bool The platform returns true for this key, if the device supports speech recognition (STT). @@ -998,6 +1043,16 @@ the Tizen reference implementation. Description + http://tizen.org/feature/vision.barcode_detection + bool + The platform returns true for this key, if the device supports the barcode detection feature. + + + http://tizen.org/feature/vision.barcode_generation + bool + The platform returns true for this key, if the device supports the barcode generation feature. + + http://tizen.org/feature/vision.face_recognition bool The platform returns true for this key, if the device supports face recognition. diff --git a/org.tizen.guides/html/native/system/system_guide_n.htm b/org.tizen.guides/html/native/system/system_guide_n.htm index d738ce1..d0209c8 100644 --- a/org.tizen.guides/html/native/system/system_guide_n.htm +++ b/org.tizen.guides/html/native/system/system_guide_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/system/t-trace_n.htm b/org.tizen.guides/html/native/system/t-trace_n.htm index ead4889..cc12363 100644 --- a/org.tizen.guides/html/native/system/t-trace_n.htm +++ b/org.tizen.guides/html/native/system/t-trace_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/telephony/phonenumber_util_n.htm b/org.tizen.guides/html/native/telephony/phonenumber_util_n.htm index 663cf79..073261d 100644 --- a/org.tizen.guides/html/native/telephony/phonenumber_util_n.htm +++ b/org.tizen.guides/html/native/telephony/phonenumber_util_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/telephony/telephony_guide_n.htm b/org.tizen.guides/html/native/telephony/telephony_guide_n.htm index 46cb284..04b783c 100644 --- a/org.tizen.guides/html/native/telephony/telephony_guide_n.htm +++ b/org.tizen.guides/html/native/telephony/telephony_guide_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/telephony/telephony_info_n.htm b/org.tizen.guides/html/native/telephony/telephony_info_n.htm index a0496c7..4e29c74 100644 --- a/org.tizen.guides/html/native/telephony/telephony_info_n.htm +++ b/org.tizen.guides/html/native/telephony/telephony_info_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/ui/eom_n.htm b/org.tizen.guides/html/native/ui/eom_n.htm index facae06..464001b 100644 --- a/org.tizen.guides/html/native/ui/eom_n.htm +++ b/org.tizen.guides/html/native/ui/eom_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/ui/minicontrol_n.htm b/org.tizen.guides/html/native/ui/minicontrol_n.htm new file mode 100644 index 0000000..dc6d58f --- /dev/null +++ b/org.tizen.guides/html/native/ui/minicontrol_n.htm @@ -0,0 +1,76 @@ + + + + + + + + + + + + + Minicontrol + + + + + +
    + +

    Minicontrol

    +

    Minicontrol is small application view that can be shown on the quick panel or lock screen.

    + +

    The main features of the Minicontrol API include:

    +
      +
    • Creating a minicontrol +

      You can create minicontrols using the Minicontrol provider API, which requires the http://tizen.org/privilege/minicontrol.provider privilege:

      +
      • To create a minicontrol, use the minicontrol_create_window() function, which returns an Evas_Object of the minicontrol window.
      • +
      • To send a request, use the minicontrol_send_event() function to get a minicontrol handle and set the details.
      +
    • +
    • Hosting minicontrols +

      You can host minicontrols, such as lock screens, on your application using the Minicontrol viewer API, which requires the http://tizen.org/privilege/minicontrol.viewer privilege:

      +
      • To host minicontrols, use the minicontrol_viewer_set_event_cb() function for listening to the request from minicontrol providers.
      • +
      • When you get the creation request from a minicontrol provider, use the minicontrol_viewer_add() function to add the minicontrol on your application.
      +
    • +
    + +

    Figure: Minicontrol on a quick panel (left) and lock screen (right)

    +

    Minicontrol on a quick panel (left) and lock screen (right) Minicontrol on a quick panel (left) and lock screen (right)

    + + + +
    + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.guides/html/native/ui/ui_guide_n.htm b/org.tizen.guides/html/native/ui/ui_guide_n.htm index 9fe4c3c..fcf9a1b 100644 --- a/org.tizen.guides/html/native/ui/ui_guide_n.htm +++ b/org.tizen.guides/html/native/ui/ui_guide_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -36,9 +36,10 @@

    The main UI features are:

    • External Output Manager

      Enables you to handle external output devices.

    • +
    • Minicontrol

      Enables you to create minicontrols on the quick panel or the lock screen, and hide a minicontrol viewer.

    -

    For more information about implementing the UI for your application using the EFL features, see EFL.

    +

    For more information about implementing the UI for your application using the EFL features, see EFL.

    diff --git a/org.tizen.guides/html/native/uix/ime_n.htm b/org.tizen.guides/html/native/uix/ime_n.htm index e947a7b..b926ebe 100644 --- a/org.tizen.guides/html/native/uix/ime_n.htm +++ b/org.tizen.guides/html/native/uix/ime_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/stt_n.htm b/org.tizen.guides/html/native/uix/stt_n.htm index c95e4c4..26544ff 100644 --- a/org.tizen.guides/html/native/uix/stt_n.htm +++ b/org.tizen.guides/html/native/uix/stt_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/tts_n.htm b/org.tizen.guides/html/native/uix/tts_n.htm index 91d69c7..2461a26 100644 --- a/org.tizen.guides/html/native/uix/tts_n.htm +++ b/org.tizen.guides/html/native/uix/tts_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/uix_guide_n.htm b/org.tizen.guides/html/native/uix/uix_guide_n.htm index 0903492..36315f7 100644 --- a/org.tizen.guides/html/native/uix/uix_guide_n.htm +++ b/org.tizen.guides/html/native/uix/uix_guide_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/voicecontrol_elm_n.htm b/org.tizen.guides/html/native/uix/voicecontrol_elm_n.htm index 5689bbd..b17aca9 100644 --- a/org.tizen.guides/html/native/uix/voicecontrol_elm_n.htm +++ b/org.tizen.guides/html/native/uix/voicecontrol_elm_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/voicecontrol_guide_n.htm b/org.tizen.guides/html/native/uix/voicecontrol_guide_n.htm index d63d03f..f4a36df 100644 --- a/org.tizen.guides/html/native/uix/voicecontrol_guide_n.htm +++ b/org.tizen.guides/html/native/uix/voicecontrol_guide_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/uix/voicecontrol_n.htm b/org.tizen.guides/html/native/uix/voicecontrol_n.htm index 9845ecd..bb1da68 100644 --- a/org.tizen.guides/html/native/uix/voicecontrol_n.htm +++ b/org.tizen.guides/html/native/uix/voicecontrol_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.guides/html/native/web/web_guide_n.htm b/org.tizen.guides/html/native/web/web_guide_n.htm index 07d3eee..e59ddd7 100644 --- a/org.tizen.guides/html/native/web/web_guide_n.htm +++ b/org.tizen.guides/html/native/web/web_guide_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    @@ -40,7 +40,7 @@
    • WebView

      Enables you to access the Web pages and Web content.

      -

      The WebView API implements the EFL WebKit (EWK), which covers various features for Web browsing, such as loading and displaying Web pages and navigating through the browsing history. EFL APIs (in mobile and wearable applications), such as evas_*, elm_*, and eina_*, are used to build up a complete application supporting Web browsing.

      +

      The WebView API implements the EFL WebKit (EWK), which covers various features for Web browsing, such as loading and displaying Web pages and navigating through the browsing history. The EFL APIs (in mobile and wearable applications), such as evas_*, elm_*, and eina_*, are used to build up a complete application supporting Web browsing.

    diff --git a/org.tizen.guides/html/web/guides_w.htm b/org.tizen.guides/html/web/guides_w.htm index 4f23775..19d6db4 100644 --- a/org.tizen.guides/html/web/guides_w.htm +++ b/org.tizen.guides/html/web/guides_w.htm @@ -18,7 +18,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    Related Info

    @@ -35,6 +35,15 @@

    Tizen Web guides introduce the various features that you can use in creating Tizen Web applications.

    +

    Select the feature you are interested in and see what Tizen offers for your application:

    + + + @@ -45,17 +54,6 @@
    - -

    Select the feature you are interested in and see what Tizen offers for your application:

    - - - - diff --git a/org.tizen.guides/html/web/tizen/application/alarm_w.htm b/org.tizen.guides/html/web/tizen/application/alarm_w.htm index a3d2d58..f2e8fca 100644 --- a/org.tizen.guides/html/web/tizen/application/alarm_w.htm +++ b/org.tizen.guides/html/web/tizen/application/alarm_w.htm @@ -16,7 +16,7 @@
    -

    Mobile Web Wearable Web

    +

    Mobile Web Wearable Web

    @@ -34,17 +34,7 @@

    Tizen enables you to schedule an application to be run at a specific time. When an alarm is triggered, the application is launched (unless it is already running).

    - - - - - - - - - -
    Note
    The Alarm API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

    All mandatory APIs are supported on the Tizen Emulators.

    +

    The Alarm API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

    The main features of the Alarm API include:

    -
     i18n_uchar text[BUFLEN];
     i18n_ustring_copy_ua(text, "TIZEN");
    @@ -304,6 +309,7 @@ i18n_usearch_destroy(usearch);
     

    To change the case in a Ustring:

    1. To change all characters' case in a Ustring, use the i18n_ustring_to_upper() and i18n_ustring_to_lower() functions. The parameters of both functions are:

      +
      • Result buffer
      • Result buffer capacity
      • @@ -313,6 +319,7 @@ i18n_usearch_destroy(usearch);
      • Result length
      • Error code variable
      +
       i18n_uchar src[BUFLEN];
       i18n_ustring_copy_ua(src, "Tizen");
      @@ -330,7 +337,7 @@ i18n_ustring_to_lower(dest, BUFLEN, src, -1, I18N_ULOCALE_US, &error_code);
       	
    2. Break iterator (to find first characters of words); if NULL, standard iterator is used
    3. Locale ("" for root locale, NULL for default locale
    4. -
      +
       i18n_uchar src[BUFLEN];
       i18n_ustring_copy_ua(src, "Tizen");
       i18n_uchar dest[BUFLEN];
      @@ -340,7 +347,7 @@ i18n_ustring_to_title_new(dest, BUFLEN, src, BUFLEN, NULL, NULL);
       

    Concatenating Ustrings

    -

    To concatenate two Ustrings:

    +

    To concatenate 2 Ustrings:

    1. Use the 18n_ustring_cat_n() functions. The parameters are:

        @@ -369,6 +376,7 @@ i18n_ustring_cat(dest, src);
      • Substring which the function searches for in the string

      The result is a pointer to the first occurrence of the substring, or NULL if the substring is not found. You can use pointer arithmetic to find the index of the character at which the first occurrence begins.

      +
       i18n_uchar s[BUFLEN];
       i18n_uchar substring[BUFLEN];
      @@ -386,8 +394,7 @@ else
       
    - - +

    Managing Dates and Calendar

    @@ -414,7 +421,6 @@ else
  • Calendar type (default, Gregorian)
  • Handle to the created Ucalendar
  • -
     i18n_uchar timezone[17];
     i18n_ustring_copy_ua_n(timezone, "America/New_York", 17);
    @@ -424,7 +430,7 @@ i18n_ucalendar_create(timezone, -1, I18N_ULOCALE_US, I18N_UCALENDAR_DEFAULT, &am
     
     
  • Set a date.

    To set a date in the Ucalendar, use the i18n_ucalendar_set_date_time() function.

    -

    Provide a handle to the Ucalendar, year, month reduced by 1 (0 for January, 1 for February, and so forth; use the values of the i18n_ucalendar_months_e enumeration to avoid mistakes), day, hour, minute, and second.

    +

    Provide a handle to the Ucalendar, year, month reduced by 1 (0 for January, 1 for February, and so forth; use the values of the i18n_ucalendar_months_e enumeration, in mobile and wearable applications, to avoid mistakes), day, hour, minute, and second.

     i18n_ucalendar_set_date_time(ucalendar, 2014, I18N_UCALENDAR_JULY, 1, 9, 0, 0);

    To set a date using milliseconds from the epoch, use the i18n_ucalendar_set_milliseconds() function:

    @@ -433,7 +439,7 @@ i18n_udate udate; // udate must be set i18n_ucalendar_set_milliseconds(ucalendar, udate);
  • -

    To add a specified period to the Ucalendar, use the i18n_ucalendar_add() function. Specify a handle to the Ucalendar, a field of Ucalendar to add to (year, week, day; the value of the i18n_ucalendar_date_fields_e enumeration) and the amount to add to field (use a negative value to subtract).

    +

    To add a specified period to the Ucalendar, use the i18n_ucalendar_add() function. Specify a handle to the Ucalendar, a field of Ucalendar to add to (year, week, day; the value of the i18n_ucalendar_date_fields_e enumeration, in mobile and wearable applications) and the amount to add to field (use a negative value to subtract).

    i18n_ucalendar_add(ucalendar, I18N_UCALENDAR_HOUR, 3);
  • Get a date. @@ -475,7 +481,7 @@ i18n_ustring_copy_ua_n(format, "EEEdMMMyyyyHHmmssz", 64); i18n_uchar best_pattern[64]; i18n_udatepg_get_best_pattern(udatepg, format, 64, best_pattern, 64, &pattern_len);
  • -

    To create a date format, use the i18n_udate_create() function. Specify the style to format time, the style to format date (from the i18n_udate_format_style_e enumeration), the desired locale, the desired time zone name, the length of the time zone name, a date pattern to use, the length of the pattern, and a handle to the created date format).

    +

    To create a date format, use the i18n_udate_create() function. Specify the style to format time, the style to format date (from the i18n_udate_format_style_e enumeration, in mobile and wearable applications), the desired locale, the desired time zone name, the length of the time zone name, a date pattern to use, the length of the pattern, and a handle to the created date format).

     i18n_udate_format_h date_format;
     i18n_ustring_copy_ua_n(timezone, "Asia/Seoul", 17);
    @@ -508,11 +514,12 @@ i18n_udate_destroy(date_format);
     
  • To manage locale information:
      -
    • To get the language code associated with a locale, use the i18n_ulocale_get_language() function. Provide the: -
      • Locale symbol (such as "en_US" or "ko_KR" - the supported locales are defined in the API as I18N_ULOCALE_*)
      • -
      • Buffer for the language code
      • -
      • The size of the buffer
      • -
      • Variable to store the actual length of the language code
      • +
      • To get the language code associated with a locale, use the i18n_ulocale_get_language() function. The parameters are: +
          +
        • Locale symbol (such as "en_US" or "ko_KR" - the supported locales are defined in the API as I18N_ULOCALE_*)
        • +
        • Buffer for the language code
        • +
        • Size of the buffer
        • +
        • Variable to store the actual length of the language code
         char language[BUFLEN];
        @@ -520,45 +527,45 @@ int lang_len;
         i18n_ulocale_get_language(I18N_ULOCALE_GERMANY, language, BUFLEN, &lang_len);
         
      • -
      • To get the language ISO-3 code for the specified locale, use the i18n_ulocale_get_language() function. The argument is the locale. -
        const char *language_iso = i18n_ulocale_get_iso3_language(I18N_ULOCALE_GERMANY);
        +
      • To get the language ISO-3 code for the specified locale, use the i18n_ulocale_get_language() function. The parameter is the locale. +
        +const char *language_iso = i18n_ulocale_get_iso3_language(I18N_ULOCALE_GERMANY);
         
      • -
      • To get the full name of language for the specified locale, use the i18n_ulocale_get_display_language() function. The parameters are: +
      • To get the full name of the language for the specified locale, use the i18n_ulocale_get_display_language() function. The parameters are:
          -
        • Locale to get the full language name of
        • -
        • Locale to localize the language name (specifies the language of the obtained name)
        • -
        • Buffer for the name
        • -
        • Size of the buffer
        • -
        • Variable to store the actual size of the language name
        • +
        • Locale to get the full language name of
        • +
        • Locale to localize the language name (specifies the language of the obtained name)
        • +
        • Buffer for the name
        • +
        • Size of the buffer
        • +
        • Variable to store the actual size of the language name
        -char *locale = I18N_ULOCALE_FRENCH;
        +char *locale = I18N_ULOCALE_CANADA_FRENCH;
         i18n_uchar language_name[BUFLEN];
         int lang_len;
         i18n_ulocale_get_display_language(locale, I18N_ULOCALE_GERMANY, language_name, BUFLEN, &lang_len);
         

        In this example, the name of the "fr_CA" locale is obtained in German.

      • -
      • To get the line orientation for the specified locale, use the i18n_ulocale_get_line_orientation() function. - The parameters are: -
          -
        • Locale to get the line orientation of
        • -
        • Variable to store the returned orientation
        • -
        -
        +
      • To get the line orientation for the specified locale, use the i18n_ulocale_get_line_orientation() function. The parameters are: +
          +
        • Locale to get the line orientation of
        • +
        • Variable to store the returned orientation
        • +
        +
         char *locale = I18N_ULOCALE_ENGLISH;
         i18n_ulocale_layout_type_e type;
         i18n_ulocale_get_line_orientation(locale, &type);
         
      • -
      • To get the character orientation for the specified locale, use the i18n_ulocale_get_character_orientation() function. - The parameters are:
          -
        • Locale to get the character orientation of
        • -
        • Variable to store the returned orientation
        • -
        -
        +
      • To get the character orientation for the specified locale, use the i18n_ulocale_get_character_orientation() function. The parameters are: +
          +
        • Locale to get the character orientation of
        • +
        • Variable to store the returned orientation
        • +
        +
         char *locale = I18N_ULOCALE_ENGLISH;
         i18n_ulocale_layout_type_e type;
         i18n_ulocale_get_character_orientation(locale, &type);
        @@ -574,7 +581,9 @@ i18n_ulocale_get_character_orientation(locale, &type);
         char *locale = I18N_ULOCALE_ENGLISH;
         char *variant = malloc(sizeof(char) * BUFLEN);
         int32_t variant_len = i18n_ulocale_get_variant(locale, variant, BUFLEN);
        -

        The function returns the actual size of the variant

      • +
        +

        The function returns the actual size of the variant.

        +
      • To get a full name for the specified locale, use the i18n_ulocale_get_display_name() function. The parameters are:
          @@ -584,6 +593,7 @@ int32_t variant_len = i18n_ulocale_get_variant(locale, variant, BUFLEN);
        • Size of the buffer
        • Variable to store the actual size of the name
        +
         i18n_uchar name[BUFLEN];
         int name_len;
        @@ -591,12 +601,13 @@ i18n_ulocale_get_display_name(I18N_ULOCALE_CANADA_FRENCH, I18N_ULOCALE_GERMANY,
         

        In this example, the name of the "fr_CA" locale is obtained in German.

      • -
      • To get the default locale, use the i18n_ulocale_get_default() function. +
      • To get the default locale, use the i18n_ulocale_get_default() function:
         char *locale;
         i18n_ulocale_get_default(&locale);
        -
      • -
      • To set the default locale, use the i18n_ulocale_set_default() function. +
      • +
      • +
      • To set the default locale, use the i18n_ulocale_set_default() function:
         i18n_ulocale_set_default(I18N_ULOCALE_KOREA);
    • @@ -613,23 +624,25 @@ i18n_ulocale_set_default(I18N_ULOCALE_KOREA);
    • Create a number format.

      To start using the Unumber module, create a number format using the i18n_unumber_create() function. The parameters are:

        -
      • Number format style (see the i18n_unumber_format_style_e enumeration in documentation)
      • +
      • Number format style (such as I18N_UNUMBER_CURRENCY; see the i18n_unumber_format_style_e enumeration, in mobile and wearable applications)
      • Format pattern (only for decimal and rule-based types)
      • Length of the format pattern
      • -
      • Locale identifier (NULL for default)
      • +
      • Locale identifier (NULL for default) +

        Some identifiers (string shortcuts for specific locales) are defined in the utils_i18n_types.h header file. For example, I18N_ULOCALE_US is equal to "en_US".

      • Optional pointer to an i18n_uparse_error_s struct
      • Handle to the created number format
      -

      As format_style you can use one of the i18n_unumber_format_style_e enums, eg. I18N_UNUMBER_CURRENCY. Some Locale parameters are defined in the utils_i18n_types.h header file. They are string shortcuts for specific locale, eg. I18N_ULOCALE_US is equal to "en_US".

      + +
       i18n_unumber_format_h num_format;
       i18n_unumber_format_style_e format_style = I18N_UNUMBER_CURRENCY;
       const char* locale = I18N_ULOCALE_US;
      -i18n_unumber_create(format_style, NULL, -1, locale, NULL, &num_format);
      - -

      After creating the number format, you can use it to format a given number in the way it is used in a specified locale. After invoking:

      +i18n_unumber_create(format_style, NULL, -1, locale, NULL, &num_format); + +

      After creating the number format, you can use it to format a given number based on the rules of a specified locale:

       #define BUFLEN 64
       i18n_uchar myString[BUFLEN];
      @@ -637,17 +650,16 @@ double myNumber = 4.5;
       i18n_unumber_format_double(num_format, myNumber, myString, BUFLEN, NULL);
       
      -

      the result set in myString variable will be equal to:

      - +

      The result set in the myString variable is equal to:

       $4.50
       
      - +
    • Get a symbol associated with the number format.

      To get a symbol associated with the created number format, use the i18n_unumber_get_symbol() function. The parameters are:

      • Number format
      • -
      • Symbol to get (see the i18n_unumber_format_symbol_e enumeration in documentation)
      • +
      • Symbol to get (see the i18n_unumber_format_symbol_e enumeration, in mobile and wearable applications)
      • Destination buffer
      • Size of the buffer
      • Variable to store the length of the symbol
      • @@ -656,12 +668,15 @@ $4.50 i18n_uchar buffer[BUFLEN]; int buf_len; i18n_unumber_format_symbol_e symbol = I18N_UNUMBER_CURRENCY_SYMBOL; -i18n_unumber_get_symbol(num_format, symbol, buffer, BUFLEN, &buf_len); -

        It returns only the symbol using in given locale (here the currency $ sign). +i18n_unumber_get_symbol(num_format, symbol, buffer, BUFLEN, &buf_len); + +

        The function returns only the symbol used in the given locale, in this example, the currency $ sign.

        +
      • Destroy the number format. -

        When you finish using the number format, destroy it with the i18n_unumber_destroy() function.

        +

        When you finish using the number format, destroy it with the i18n_unumber_destroy() function:

        i18n_unumber_destroy(num_format);
      • +

        Managing Iteration Using Ubrk

        @@ -835,7 +850,7 @@ const char *keyword = NULL; int len; keyword = i18n_uenumeration_next(keywords, &len); -while (keyword != NULL) +while (keyword != NULL) {    // Use the keyword string @@ -846,8 +861,9 @@ i18n_uenumeration_destroy(keywords); + -

        Managing Timezones

        +

        Managing Time Zones

        The Timezone module represents a time zone offset, and also figures out daylight savings.

        1. To use the Timezone API (in mobile and wearable applications), include the <utils_i18n.h> header file in your application:

          @@ -855,28 +871,28 @@ i18n_uenumeration_destroy(keywords); #include <utils_i18n.h>
        2. -
        3. Retrieve timezone information: +
        4. Retrieve time zone information: -
          • To get the default timezone based on the timezone where the program is running:

            +
            • To get the default time zone based on the time zone where the program is running:

               i18n_timezone_h tmz;
               i18n_timezone_create_default(&tmz);
               
            • -
            • To get the display name of the timezone:

              +
            • To get the display name of the time zone:

               char *display_name;
               i18n_timezone_get_display_name(tmz, &display_name);
               
            • -
            • To get the timezone ID:

              +
            • To get the time zone ID:

               char *timezone_id;
               i18n_timezone_get_id(tmz, &timezone_id);
               
            • -

              To check whether a given timezone uses daylight savings time (DST):

              +

              To check whether a given time zone uses daylight savings time (DST):

               int32_t dst_savings;
               i18n_timezone_get_dst_savings(tmz, &dst_savings);
              @@ -889,7 +905,7 @@ i18n_timezone_get_dst_savings(tmz, &dst_savings);
               int32_t dst_savings;
               i18n_timezone_get_dst_savings(tmz, &dst_savings/MS_TO_MIN);
               
              -

              The result is returned in milliseconds (3600000 ms = 1 hour). In this tutorial milliseconds are changed to minutes (1 min = 60000 ms).

            • +

              The result is returned in milliseconds (3600000 ms = 1 hour). In this tutorial, milliseconds are changed to minutes (1 min = 60000 ms).

            • To get the raw GMT offset:

              @@ -897,40 +913,47 @@ i18n_timezone_get_dst_savings(tmz, &dst_savings/MS_TO_MIN);
               int32_t offset_milliseconds;
               i18n_timezone_get_raw_offset(tmz, &offset_milliseconds/MS_TO_MIN);
               
              -

              The result is returned in milliseconds. It is the number of milliseconds to add to GMT to get the local time, before taking DST into account. In this tutorial milliseconds are changed to minutes (1 min = 60000 ms).

            • +

              The result is returned in milliseconds. It is the number of milliseconds to add to GMT to get the local time, before taking DST into account. In this tutorial, milliseconds are changed to minutes (1 min = 60000 ms).

              -
            • To get the region code associated with the timezone ID:

              +
            • To get the region code associated with the time zone ID:

               char region[6];
               int32_t region_len = -1;
               i18n_timezone_get_region(timezone_id, region, &region_len, 20);
               
          • -
          • Destroy the timezone when it is no longer needed:

            +
          • Destroy the time zone when it is no longer needed:

             i18n_timezone_destroy(tmz);
            -
        - - + +

        Managing Sets

        The Uset module allows you to create sets which can contain characters and strings. You can iterate through elements of the given set and carry out various operations on the set.

        +

        To manage sets:

        +
          -

          To use Uset API (in mobile and wearable applications), include the <utils_i18n.h> header file in your application.

          -
        1. -The first step is to create a set. The code below creates an empty set: -
          +
        2. To use the Uset API (in mobile and wearable applications), include the <utils_i18n.h> header file in your application: +
          +#include <utils_i18n.h>
          +
          +
        3. + +
        4. Create a set. +

          The following example creates an empty set:

          +
           i18n_uset_h set;
           i18n_uset_create_empty(&set);
           
        5. +
        + -

        Managing characters

        -

        The set can contain characters as its elements. It's also possible to check if a set contains specified characters.

        +

        Managing Characters

        +

        The set can contain characters as its elements. It is also possible to check whether a set contains specified characters.

          -
        1. -Add characters from a string to the set: -
          -const char *text = "Example string";
          +
        2. Add characters from a string to the set: +
          +const char *text = "Example string";
           i18n_uchar u_input_text[BUFLEN];
           i18n_ustring_copy_ua(u_input_text, text);
           
          @@ -938,83 +961,82 @@ i18n_uset_add_all_code_points(set, u_input_text, -1);
           
        3. -
        4. -Get the list of characters in the set: -
          +
        5. Get the list of characters in the set: +
           int chars_count = i18n_uset_size(set);
           int i;
           
           // Get all characters in the set
          -for (i = 0; i < chars_count; i++) {
          -    i18n_uchar32 uchar = i18n_uset_char_at(set, i);
          +for (i = 0; i < chars_count; i++) 
          +{
          +   i18n_uchar32 uchar = i18n_uset_char_at(set, i);
           }
           
        6. -
        7. -Check whether the set contains the given character: -
          -i18n_ubool contains_character = i18n_uset_contains(set, 'a');
          +
        8. Check whether the set contains the given character: +
          +i18n_ubool contains_character = i18n_uset_contains(set, 'a');
           
        9. -
        10. -Check whether the set contains characters from the a - c range: -
          -i18n_ubool contains_character = i18n_uset_contains_range(set, 'a', 'c');
          +
        11. Check whether the set contains characters from the a - c range: +
          +i18n_ubool contains_character = i18n_uset_contains_range(set, 'a', 'c');
           
        12. -
        13. -Check whether the set contains characters from another set: -
          +
        14. Check whether the set contains characters from another set: +
           i18n_uset_h compare_set = NULL;
          +
           // Fill the second set
           i18n_ubool contains_character = i18n_uset_contains_all(set, compare_set);
           
        + -

        Managing strings

        -

        The set can contain strings as its elements:

        -
          -
        1. -Add a string to the set: -
          -const char *text = "Example string";
          +	

          Managing Strings

          + +

          The set can contain strings as its elements. To manage strings:

          +
            +
          • Add a string to the set: +
            +const char *text = "Example string";
             i18n_uchar u_input_text[BUFLEN];
             i18n_ustring_copy_ua(u_input_text, text);
            -
            + 
             i18n_uset_add_string(set, u_input_text, -1);
             
            -The entire string is a single element in such cases. +

            The entire string is a single element.

          • -
          • -List all strings in the set: -
            +
            +
          • List all strings in the set: +
             int strings_count = i18n_uset_get_item_count(set);
             int32_t len = 0;
             int32_t i;
            -for (i = 0; i < strings_count; ++i) {
            -    i18n_uchar32 start, end;
            -    i18n_uchar string[100];
            -    let = i18n_uset_get_item(set, i, &start, &end, string, 100);
            -    if (len != 0) {
            -        // a string was found, use the 'string' variable
            -    }
            +for (i = 0; i < strings_count; ++i) 
            +{
            +   i18n_uchar32 start, end;
            +   i18n_uchar string[100];
            +   let = i18n_uset_get_item(set, i, &start, &end, string, 100);
            +   if (len != 0) 
            +   {
            +      // String was found, use the 'string' variable
            +   }
             }
             
            -Note that the i18n_uset_get_item() function also returns ranges (an item is a string or a range). The return value is 0 if the current item is a range. Please refer to the documentation for details. +

            Note that the i18n_uset_get_item() function also returns ranges (an item is a string or a range). The return value is 0 if the current item is a range. For more information, see the API documentation.

          • -
          • -Check whether the set contains a string: -
            +
          • Check whether the set contains a string: +
             i18n_ubool contains = i18n_uset_contains_string(set, input_ustring, -1);
             
          • -
        - - +
      + diff --git a/org.tizen.tutorials/html/native/base/sqlite_tutorial_n.htm b/org.tizen.tutorials/html/native/base/sqlite_tutorial_n.htm index 0ed1cb0..ae681f1 100644 --- a/org.tizen.tutorials/html/native/base/sqlite_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/base/sqlite_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -39,7 +39,7 @@

      Sqlite: Managing the SQL Database

      -

      This tutorial demonstrates how you can use the open source modules, whose functions provide access to SQLite and OpenSSL and demonstrate how to encrypt and store application data. The open source modules supported by Tizen are located within the API layout.

      +

      This tutorial demonstrates how you can use the open source modules, whose functions provide access to SQLite and OpenSSL and demonstrate how to encrypt and store application data. The open source modules supported by Tizen are listed in the API modules.

      Warm-up

      Become familiar with the basics of the Sqlite API by learning about:

      @@ -162,7 +162,8 @@ CREATE TABLE IF NOT EXISTS EncryptedData(TEXT NOT NULL,
      -static int CreateTable()
      +static int 
      +CreateTable()
       {
          int ret;
          char *ErrMsg;
      @@ -183,7 +184,8 @@ static int CreateTable()
       
       

      The string delimiting characters are removed. In a real implementation, replace some more characters, such as the comment sequence.

      -void PrepareToSQL(unsigned char* msg)
      +void 
      +PrepareToSQL(unsigned char* msg)
       {
          int i = 0;
          while (msg[i]!=0x00)
      @@ -230,7 +232,8 @@ InsertRecord(decrypted_out, 1, 0, strlen(ShortMsg));
       		
    • Add a delimiting 0x00 character at the end of the byte array.
    • -static int EncryptMsg(char* in, unsigned char* out, const unsigned char* password, unsigned char *localsalt, unsigned char *vector)
      +static int 
      +EncryptMsg(char* in, unsigned char* out, const unsigned char* password, unsigned char *localsalt, unsigned char *vector)
       {
          AES_KEY encryption_key;
          int iter = (int)vector[0];
      @@ -272,7 +275,8 @@ static int EncryptMsg(char* in, unsigned char* out, const unsigned char* passwor
       	
    • Insert a record into the database.

      To insert data to the database, use the sqlite3_exec() function. A query is prepared with common C functions. The encrypted variable is stored in the database and indicates whether the DATA field in the database is encrypted.

      -static int InsertRecord(unsigned char *msg, int encrypted,
      +static int 
      +InsertRecord(unsigned char *msg, int encrypted,
                               int part, int len)
       {
          char sqlbuff[BUFLEN];
      @@ -287,7 +291,6 @@ static int InsertRecord(unsigned char *msg, int encrypted,
             dlog_print(DLOG_DEBUG, LOG_TAG, "Error: %s\n", ErrMsg);
             sqlite3_free(ErrMsg);
          }
      -
          return 0;
       }
       
      @@ -300,7 +303,8 @@ static int InsertRecord(unsigned char *msg, int encrypted,

      A message is divided into blocks 16 characters long. Each block is tagged by its own number with a parts variable. A tag is stored in the database in the PART field.

      -static int InsertMessage(unsigned char* text)
      +static int 
      +InsertMessage(unsigned char* text)
       {
          unsigned char encrypted_out[BUFLEN];
          int ret = 0;
      @@ -330,7 +334,6 @@ static int InsertMessage(unsigned char* text)
                      encrypted_out, password, salt, iv);
             InsertRecord(encrypted_out, 1, parts, retlen);
          }
      -
          return 0;
       }
       
      @@ -349,7 +352,8 @@ ShowRecords();

      To list all records, use the SELECT * FROM EncryptedData query. The callback function is invoked for each record returned by SQLite. SQLite allows passing user data to the callback function. User data is the 4th parameter of sqlite3_exec(..., ..., ..., &counter, ...).

      -static void ShowRecords()
      +static void 
      +ShowRecords()
       {
          char *sql = "select * from EncryptedData";
          int counter = 0, ret = 0;
      @@ -362,7 +366,8 @@ static void ShowRecords()
       

      Callback simply prints an obtained record. The record is passed in the form of a few arrays of strings. Argv contains the column content, azColName contains the column name. Argc is the number of columns. Counter is user data. Here it is used to indicate the record number in a row (not an SQL primary key) while listing. If the content of any column is empty, the NULL string is printed.

      -static int callback(void *counter, int argc, char **argv, char **azColName)
      +static int 
      +callback(void *counter, int argc, char **argv, char **azColName)
       {
          int *localcounter = (int *)counter;
          int i;
      @@ -386,7 +391,8 @@ static int callback(void *counter, int argc, char **argv, char **azColName)
       
       

      The SELECT * FROM EncryptedData query where ENCRYPTED='1' lists all encrypted records. The callbackdecrypt() function is invoked for each record returned by the sqlite3_exec() function. In case of an error, the SQLite API requires releasing error message memory with the sqlite3_free() function.

      -static void DecryptRecords()
      +static void 
      +DecryptRecords()
       {
          char *sql = "select * from EncryptedData where ENCRYPTED='1'";
          int counter = 0;
      @@ -412,7 +418,8 @@ static void DecryptRecords()
       
    • Decrypted data is listed
    -static int callbackdecrypt(void *counter, int argc, char **argv, char **azColName)
    +static int 
    +callbackdecrypt(void *counter, int argc, char **argv, char **azColName)
     {
        unsigned char decrypted_out[BUFLEN];
        int *localcounter = (int *)counter;
    @@ -456,7 +463,8 @@ static int callbackdecrypt(void *counter, int argc, char **argv, char **azColNam
     

    The decryption routine is similar to encryption:

    -static int DecryptMsg(unsigned char* in, unsigned char * out, const unsigned char* password, unsigned char* localsalt, unsigned char* vector)
    +static int 
    +DecryptMsg(unsigned char* in, unsigned char * out, const unsigned char* password, unsigned char* localsalt, unsigned char* vector)
     {
        AES_KEY decryption_key;
        int iter = (int)vector[0];
    @@ -505,7 +513,8 @@ static char encoding_table[] = {'A', 'B', 'C', 'D
     static char *decoding_table = NULL;
     static int mod_table[] = {0, 2, 1};
     
    -void build_decoding_table()
    +void 
    +build_decoding_table()
     {
        decoding_table = malloc(256);
        int i;
    @@ -569,11 +578,11 @@ unsigned char *base64_decode(const char *data, size_t input_length, size_t *outp
           if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
           if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
        }
    -
        return decoded_data;
     }
     
    -void base64_cleanup() 
    +void 
    +base64_cleanup() 
     {
        free(decoding_table);
        decoding_table = NULL;
    @@ -584,7 +593,8 @@ void base64_cleanup()
     
  • Main function source code:
    -int OpenSQL_AES_example_1(void)
    +int 
    +OpenSQL_AES_example_1(void)
     {
        unsigned char decrypted_out[BUFLEN];
        int ret;
    diff --git a/org.tizen.tutorials/html/native/content/content_tutorials_n.htm b/org.tizen.tutorials/html/native/content/content_tutorials_n.htm
    index 1a42bcb..4aca393 100644
    --- a/org.tizen.tutorials/html/native/content/content_tutorials_n.htm
    +++ b/org.tizen.tutorials/html/native/content/content_tutorials_n.htm
    @@ -18,7 +18,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.tutorials/html/native/content/download_tutorial_n.htm b/org.tizen.tutorials/html/native/content/download_tutorial_n.htm index 82aa5f9..aff6b12 100644 --- a/org.tizen.tutorials/html/native/content/download_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/content/download_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native

    +

    Mobile native

    Content

    @@ -39,16 +39,7 @@

    This tutorial demonstrates how you can download content asynchronously from a given URL into the device storage.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    Warm-up

    @@ -108,7 +99,7 @@ error = download_set_file_name(download_id, "downloaded_file.bin");
    • Auto download

      To set an automatic download, call the download_set_auto_download() function passing the download handle and setting the second parameter to true.

      -

      This operation changes the download manager state so that it continues downloading even after the client process is terminated. Set the notification download option when using this feature, to allow the user to receive the download result when the client process is not alive.

      +

      This operation changes the download manager state so that it continues downloading even after the client process is terminated. Set the notification download option when using this feature to allow the user to receive the download result when the client process is not alive.

       error = download_set_auto_download(download_id, true);
      @@ -190,7 +181,8 @@ if (state == DOWNLOAD_STATE_DOWNLOADING)
       
    • The received parameter of the progress_cb() callback function contains the size of the data received in bytes. In this example, print out the value and the total download size.
      -static void progress_cb(int download_id, unsigned long long received, void *user_data)
      +static void 
      +progress_cb(int download_id, unsigned long long received, void *user_data)
       {
          dlog_print(DLOG_INFO, LOG_TAG, "received: %llu of %llu", received, *((unsigned long long*)user_data));
       }
    • diff --git a/org.tizen.tutorials/html/native/content/media_content_tutorial_n.htm b/org.tizen.tutorials/html/native/content/media_content_tutorial_n.htm index f6ecce1..0dec834 100644 --- a/org.tizen.tutorials/html/native/content/media_content_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/content/media_content_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -217,6 +217,7 @@

      Get information about media tags.

    • Deleting Tags

      Delete tags from the database.

    • +
  • Storage @@ -282,7 +283,8 @@ media_content_disconnect();
    1. Register a callback function to get the folder list:
      -bool gallery_folder_list_cb(media_folder_h folder, void *user_data)
      +bool 
      +gallery_folder_list_cb(media_folder_h folder, void *user_data)
       {
          media_folder_h new_folder = NULL;
          media_folder_clone(&new_folder, folder);
      @@ -303,7 +305,8 @@ GList *folder_list = NULL; // Include glib.h for this value
       media_folder_h folder_handle = NULL;
       
       ret = media_folder_foreach_folder_from_db(filter, gallery_folder_list_cb, &folder_list);
      -if (ret != MEDIA_CONTENT_ERROR_NONE) {
      +if (ret != MEDIA_CONTENT_ERROR_NONE) 
      +{
          dlog_print(DLOG_ERROR, LOG_TAG, "media_folder_foreach_folder_from_db failed: %d", ret);
       
          return ret;
      @@ -354,7 +357,8 @@ else
       
      1. Create a callback function to retrieve a media item:
        -bool gallery_media_item_cb(media_info_h media, void *user_data)
        +bool 
        +gallery_media_item_cb(media_info_h media, void *user_data)
         {
            media_info_h new_media = NULL;
            media_info_clone(&new_media, media);
        @@ -443,11 +447,12 @@ media_filter_destroy(filter);
         
        1. Define the database update callback function:
          -void _noti_cb(media_content_error_e error, int pid,
          -              media_content_db_update_item_type_e update_item,
          -              media_content_db_update_type_e update_type,
          -              media_content_type_e media_type,
          -              char *uuid, char *path, char *mime_type, void *user_data)
          +void 
          +_noti_cb(media_content_error_e error, int pid,
          +         media_content_db_update_item_type_e update_item,
          +         media_content_db_update_type_e update_type,
          +         media_content_type_e media_type,
          +         char *uuid, char *path, char *mime_type, void *user_data)
           {
              if (error == MEDIA_CONTENT_ERROR_NONE) 
              {
          @@ -537,10 +542,12 @@ media_content_unset_db_updated_cb();
           
           
        2. Retrieve album information. -

          Define the callback and retrieve the basic album information (album id, name, the artist name, and the number of media items in the album) in it.

          +

          Define the callback and retrieve the basic album information (album ID, name, the artist name, and the number of media items in the album) in it.

          If the callback returns true, the iteration continues and the callback is called for the next album, if available. If the value is false, the iteration stops.

          -
          bool media_album_list_cb(media_album_h album, void *user_data)
          +
          +bool 
          +media_album_list_cb(media_album_h album, void *user_data)
           {
              media_content_error_e ret = MEDIA_CONTENT_ERROR_NONE;
           
          @@ -660,7 +667,9 @@ media_album_get_album_id(album, &id);

          Define the callback in which you can receive and handle the album content.

          As long as the callback returns true, the callback is called for the next item, if available. The iteration stops when the return value is false.

          -
          bool album_contents_info_cb(media_info_h media, void *user_data)
          +
          +bool 
          +album_contents_info_cb(media_info_h media, void *user_data)
           {
              media_content_error_e ret = MEDIA_CONTENT_ERROR_NONE;
           
          @@ -701,7 +710,6 @@ media_album_get_album_id(album, &id);
             {       dlog_print(DLOG_DEBUG, LOG_TAG, "Size: %llu\n", size);    } -    return true; }
          @@ -783,9 +791,10 @@ media_filter_set_condition(filter, buf, MEDIA_CONTENT_COLLATE_DEFAULT);
          Set the offset for the filter.
          media_filter_set_offset(filter,
          -                        0, // Offset
          -                        3 // Count
          -);
          +                        // Offset +                        0, +                        // Count +                        3);
        3. The count sets the limit on the number of returned bookmarks, and the offset determines which of the found bookmarks counts as the "first". For example, if you sort the bookmarks in an ascending order and the offset is set to 1, you do not receive the earliest bookmark.

        4. @@ -810,7 +819,9 @@ media_filter_set_condition(filter, buf, MEDIA_CONTENT_COLLATE_DEFAULT);
        To read the bookmark information within a callback after finding the bookmark:

        -
        bool get_bookmarks_cb(media_bookmark_h bookmark, void* user_data)
        +
        +bool 
        +get_bookmarks_cb(media_bookmark_h bookmark, void* user_data)
         {
            char *thumb = NULL;
         
        @@ -825,7 +836,6 @@ media_filter_set_condition(filter, buf, MEDIA_CONTENT_COLLATE_DEFAULT);

        The above callback prints the thumbnail path and marked time for each found bookmark.

        @@ -1011,8 +1021,11 @@ media_filter_destroy(filter);
      2. Read folder details within the callback: -
        bool folder_cb(media_folder_h folder, void *user_data)
        -{
        +
        +bool 
        +folder_cb(media_folder_h folder, void *user_data)
        +{
        +

        The return value determines if the iterative calls of the callback continue (true) or are stopped (false).

        @@ -1188,7 +1201,9 @@ media_filter_destroy(filter);

      The following example prints the title of the media item for which it was called.

      -
      bool media_cb(media_info_h media, void *user_data)
      +
      +bool 
      +media_cb(media_info_h media, void *user_data)
       {
          char *title = NULL;
       
      @@ -1204,7 +1219,8 @@ media_filter_destroy(filter);
         }    return true; -}
      +} +
  • @@ -1237,7 +1253,8 @@ media_filter_destroy(filter);
  • Create a callback function to retrieve a media item:
    -bool gallery_media_item_cb(media_info_h media, void *user_data)
    +bool 
    +gallery_media_item_cb(media_info_h media, void *user_data)
     {
        media_info_h new_media = NULL;
        media_info_clone(&new_media, media);
    @@ -1340,7 +1357,8 @@ else
                 image_meta_get_burst_id(image_handle, &burst_id);
     
                 dlog_print(DLOG_DEBUG, LOG_TAG, "This is an image");
    -            dlog_print(DLOG_DEBUG, LOG_TAG, "Width : %d, Height : %d, Orientation : %d, Date taken : %s", width, height, orientation, datetaken);
    +            dlog_print(DLOG_DEBUG, LOG_TAG, "Width : %d, Height : %d, Orientation : %d, Date taken : %s", 
    +                       width, height, orientation, datetaken);
              }
     
              if (datetaken) free(datetaken);
    @@ -1372,7 +1390,8 @@ else
                 media_info_get_played_time(media_handle, &time_played);
     
                 dlog_print(DLOG_DEBUG, LOG_TAG, "This is a video");
    -            dlog_print(DLOG_DEBUG, LOG_TAG, "Title: %s, Album: %s, Artist: %s, Album_artist: %s \n Duration: %d, Played time: %d", title, album, artist, album_artist, duration, time_played);
    +            dlog_print(DLOG_DEBUG, LOG_TAG, "Title: %s, Album: %s, Artist: %s, Album_artist: %s \n Duration: %d, Played time: %d", 
    +                       title, album, artist, album_artist, duration, time_played);
              }
     
              free(artist);
    @@ -1392,20 +1411,8 @@ else
        }
     }
     
  • - - - - - - - - - -
    Note
    Note that the video_meta_get_played_time () and a few APIs have been deprecated since Tizen 2.4.
    -To replace video_meta_get_played_time (), use media_info_get_played_time () instead.
    -Although the deprecated APIs continue to be available, it is strongly recommended to use new APIs.
    -For more information on the deprecated information, please refer to the media content mobile API reference (link) and the media content wearable API reference (link) -
    + +
  • When the filter is no longer used, destroy the list, filter, and query:
    @@ -1496,7 +1503,8 @@ if (ret != MEDIA_CONTENT_ERROR_NONE)
     

    You also need the http://tizen.org/privilege/mediastorage or http://tizen.org/privilege/externalstorage privilege, since when you insert metadata, the media content APIs access content in the internal or external storage.

  • As scanning works asynchronously, you must a callback function:
    -void _scan_cb(media_content_error_e err, void *user_data)
    +void 
    +_scan_cb(media_content_error_e err, void *user_data)
     {
        dlog_print(DLOG_DEBUG, LOG_TAG, "Folder scanned\n");
     
    @@ -1588,7 +1596,9 @@ media_playlist_update_to_db(playlist);
  • In the callback function, cast the user data to a proper type and copy the media ID:

    -
    bool _media_info_cb(media_info_h media, void *user_data)
    +
    +bool 
    +_media_info_cb(media_info_h media, void *user_data)
     {
        char *data = NULL;
        char *id = NULL;
    @@ -1605,9 +1615,9 @@ media_playlist_update_to_db(playlist);
  •       free(id);    } -    return true; -} +} + @@ -1625,7 +1635,9 @@ media_playlist_foreach_playlist_from_db(NULL, playlist_list_cb, NULL);
  • Handle the found records.
    1. When a record is found, a callback function is invoked. A handle to the record is passed as a playlist function parameter.

      -
      static bool playlist_list_cb(media_playlist_h playlist, void* user_data) 
      +
      +static bool 
      +playlist_list_cb(media_playlist_h playlist, void* user_data) 
       {
          char *name = NULL;
          int playlist_id = 0;
      @@ -1662,14 +1674,17 @@ media_playlist_foreach_playlist_from_db(NULL, playlist_list_cb,  NULL);
          media_filter_destroy(temp_filter);
       
          return true;
      -}
    2. +} +
    3. The callback function operates on the records the same way as before. To get the media info, use the following functions:

      • media_info_get_audio()
      • media_info_get_media_id()
      • media_info_get_size()
      -
      static bool audio_list_cb(int playlist_member_id, media_info_h media_hndl, void *user_data) 
      +
      +static bool 
      +audio_list_cb(int playlist_member_id, media_info_h media_hndl, void *user_data) 
       {
          char * id;
          media_info_get_media_id(media_hndl, &id);
      @@ -1677,7 +1692,8 @@ media_playlist_foreach_playlist_from_db(NULL, playlist_list_cb,  NULL);
          free(id);
       
          return true;
      -}
  • +} +
  • Clean up. @@ -1705,29 +1721,28 @@ media_content_disconnect();
  • media_content_disconnect();
    -

    Adding Tags

    + +

    Adding Tags

    +

    To add a tag to the database, and add a file to the tag:

    1. Add the tag. -

      Use media_tag_insert_to_db() to add the tag. The result is a handle to the new tag.

      -
      +

      Use the media_tag_insert_to_db() function to add the tag. The result is a handle to the new tag.

      +
       media_tag_h tag = NULL;
      -const char *tag_name = "Tag name";
      +const char *tag_name = "Tag name";
       
       media_tag_insert_to_db(tag_name, &tag);
       
    2. Insert a media item into the tag. -

      -To insert an item into the tag, you need to know the id of the item. -One of the ways of obtaining the id is to insert a media item into the database. -In the example below, a media file is inserted and then added to the tag.

      -
      +

      To insert an item into the tag, you need to know the ID of the item. One way of obtaining the ID is to insert a media item into the database. In the following example, a media file is inserted and then added to the tag.

      +
       media_info_h image_info = NULL;
       char *image_id = NULL;
       
      -media_info_insert_to_db("path/to/image_file", &image_info);
      +media_info_insert_to_db("path/to/image_file", &image_info);
       
       media_info_get_media_id(image_info, &image_id);
       
      @@ -1736,17 +1751,18 @@ media_tag_add_media(tag, image_id);
       
    3. Update the tag. -

      After you make any changes to the tag, like change its name or add items, you need to update it.

      -
      +

      After you make any changes to the tag, such as changing its name or adding items, you need to update it.

      +
       media_tag_update_to_db(tag);
       
    4. -
    5. Destroy the tag handle.
    6. -

      After the tag has been inserted into the database and all updates to it have been made, you can destroy the handle. Note that this is not related to deleting the tag from the database.

      -
      +
    7. Destroy the tag handle. +

      After the tag has been inserted into the database and all updates to it have been made, destroy the handle. Note that this is not related to deleting the tag from the database.

      +
       media_tag_destroy(tag);
       
      +
    @@ -1759,7 +1775,8 @@ media_tag_destroy(tag);
     // glib library is used, so include glib.h
     
    -bool gallery_tag_item_cb(media_tag_h tag, void *user_data)
    +bool 
    +gallery_tag_item_cb(media_tag_h tag, void *user_data)
     {
        media_tag_h new_tag = NULL;
        media_tag_clone(&new_tag, tag);
    @@ -1770,7 +1787,8 @@ bool gallery_tag_item_cb(media_tag_h tag, void *user_data)
        return true;
     }
     
    -bool gallery_media_item_cb(media_info_h media, void *user_data)
    +bool 
    +gallery_media_item_cb(media_info_h media, void *user_data)
     {
        media_info_h new_media = NULL;
        media_info_clone(&new_media, media);
    @@ -1857,13 +1875,15 @@ else
     
    -

    Deleting Tags

    -

    Deleting a tag requires its id. In the example below, the id is obtained by calling media_tag_foreach_tag_from_db().

    +

    Deleting Tags

    + +

    To delete a tag, you need its ID. In the following example, the ID is obtained by calling the media_tag_foreach_tag_from_db() function.

    1. Define the callback. -

      Define the callback called for each found tag. The callback will add the handle of each tag to the tag list.

      -
      -bool gallery_tag_item_cb(media_tag_h tag, void *user_data)
      +

      Define the callback called for each found tag. The callback adds the handle of each tag to the tag list.

      +
      +bool 
      +gallery_tag_item_cb(media_tag_h tag, void *user_data)
       {
          media_tag_h new_tag = NULL;
       
      @@ -1876,17 +1896,18 @@ bool gallery_tag_item_cb(media_tag_h tag, void *user_data)
       
    2. Find tags. -

      Call media_tag_foreach_tag_from_db() to find tags in the database. The first parameter is a filter; if NULL, all tags are found. The second parameter is the callback, called for each found tag. The third parameter is data passed to the callback in each iteration. In this example it is a list of tag handles.

      -
      +

      Call the media_tag_foreach_tag_from_db() function to find tags in the database. The first parameter is a filter; if NULL, all tags are found. The second parameter is the callback, called for each found tag. The third parameter is data passed to the callback in each iteration. In this example, it is a list of tag handles.

      +
       GList *tag_list = NULL;
       
       media_tag_foreach_tag_from_db(NULL, gallery_tag_item_cb, &tag_list);
       
      +
    3. Iterate through the tag list.

      After the list is completed, access each element:

      -
      +
       media_tag_h tag_handle = NULL;
       int tag_id;
       char *tag_name = NULL;
      @@ -1900,8 +1921,8 @@ for (i = 0; i < len; i++)
       
    4. Delete the tag. -

      Provided that you have the tag handle, get the tag id with media_tag_get_tag_id() and delete the tag with media_tag_delete_from_db().

      -
      +

      Provided that you have the tag handle, get the tag ID with the media_tag_get_tag_id() function and delete the tag with the media_tag_delete_from_db() function.

      +
          ret = media_tag_get_tag_id(tag_handle, &tag_id);
       
          ret = media_tag_delete_from_db(tag_id);
      @@ -1910,19 +1931,18 @@ for (i = 0; i < len; i++)
       
       
    5. Destroy the tag handle.

      Now that the handle is no longer needed, it can be destroyed:

      -
      +
          ret = media_tag_destroy(tag_handle);
       }
       
    6. Free the tag list.

      After all elements have been accessed, free the tag handle list:

      -
      +
       g_list_free(tag_list);
       tag_list = NULL;
       
    7. -
    @@ -1952,7 +1972,8 @@ tag_list = NULL;
    1. Define callback functions:
      -void storage_cb(media_storage_h storage, void *user_data)
      +void 
      +storage_cb(media_storage_h storage, void *user_data)
       {
          media_storage_h new_storage = NULL;
          media_storage_clone(&new_storage, storage);
      @@ -2039,7 +2060,8 @@ media_group_foreach_group_from_db(NULL, group, group_cb, (void *) group);
       

      To find all items in the group, call the media_group_foreach_media_from_db() function. The parameters are similar to those in the media_group_foreach_media_from_db() function. The media_cb() callback is called for each found item.

      -bool group_cb(const char *name, void *user_data)
      +bool 
      +group_cb(const char *name, void *user_data)
       {
          media_content_error_e ret = MEDIA_CONTENT_ERROR_NONE;
          media_group_e group = (media_group_e) user_data;
      @@ -2060,7 +2082,8 @@ bool group_cb(const char *name, void *user_data)
       
    2. Define the media_cb() callback to handle each found item:
      -bool media_cb(media_info_h media, void *user_data)
      +bool 
      +media_cb(media_info_h media, void *user_data)
       {
          media_content_error_e ret = MEDIA_CONTENT_ERROR_NONE;
          char *name = NULL;
      @@ -2076,6 +2099,7 @@ bool media_cb(media_info_h media, void *user_data)
       }
       
    +

    Finding Media Item Groups Using a Filter

    To find groups containing only items matching the given criteria:

    @@ -2091,7 +2115,7 @@ media_filter_create(&filter);
  • Set the filter condition. The condition is a string used in a SQL query.

    -

    The following example searches for files containing '.jpg' in their name. The '%' characters in the query act as wildcards. Also, they should be escaped using another '%' character to avoid compiler warnings.

    +

    The following example searches for files containing '.jpg' in their name. The '%' characters in the query act as wildcards. Also, they must be escaped using another '%' character to avoid compiler warnings.

     #define BUFLEN 200 // This is just an example
    diff --git a/org.tizen.tutorials/html/native/content/mime_type_tutorial_n.htm b/org.tizen.tutorials/html/native/content/mime_type_tutorial_n.htm
    index 3eb2258..2ff0c7b 100644
    --- a/org.tizen.tutorials/html/native/content/mime_type_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/content/mime_type_tutorial_n.htm
    @@ -18,7 +18,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/context/activity_tutorial_n.htm b/org.tizen.tutorials/html/native/context/activity_tutorial_n.htm index 6ddb43f..781a0ef 100644 --- a/org.tizen.tutorials/html/native/context/activity_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/context/activity_tutorial_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -72,7 +72,10 @@ activity_start_recognition(handle, ACTIVITY_WALK, example_activity_callback, NUL
  • When the example_activity_callback() callback is invoked, the current activity is delivered as a parameter, and you can extract the accuracy of the recognized activity: -
    void example_activity_callback(activity_type_e activity, const activity_data_h data, double timestamp, activity_error_e error, void *user_data)
    +
    +void 
    +example_activity_callback(activity_type_e activity, const activity_data_h data, 
    +                          double timestamp, activity_error_e error, void *user_data)
     {
        int result;
     
    diff --git a/org.tizen.tutorials/html/native/context/context_tutorials_n.htm b/org.tizen.tutorials/html/native/context/context_tutorials_n.htm
    index 126c4d7..7f39ce3 100644
    --- a/org.tizen.tutorials/html/native/context/context_tutorials_n.htm
    +++ b/org.tizen.tutorials/html/native/context/context_tutorials_n.htm
    @@ -16,7 +16,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.tutorials/html/native/context/gesture_tutorial_n.htm b/org.tizen.tutorials/html/native/context/gesture_tutorial_n.htm index 05b91e3..9b6903c 100644 --- a/org.tizen.tutorials/html/native/context/gesture_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/context/gesture_tutorial_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -74,7 +74,9 @@ gesture_create(&handle);
  • When the gesture_cb() callback function is invoked, you can retrieve the event data using the gesture_get_event() function:

    -
    void gesture_cb(gesture_type_e gesture, const gesture_data_h data, double timestamp, gesture_error_e error, void *user_data)
    +
    +void 
    +gesture_cb(gesture_type_e gesture, const gesture_data_h data, double timestamp, gesture_error_e error, void *user_data)
     {			
        gesture_event_e event;
        if (gesture == GESTURE_PICK_UP) 
    @@ -86,7 +88,8 @@ gesture_create(&handle);
  •          // Handle the event       }    } -} +} +

    If the application registered multiple gestures to a single callback function, the input parameter gesture can be used to distinguish the gesture received.

    Some gestures can return different types of events. For example, GESTURE_SHAKE can return GESTURE_SHAKE_DETECTED or GESTURE_SHAKE_FINISHED.

    diff --git a/org.tizen.tutorials/html/native/context/history_tutorial_n.htm b/org.tizen.tutorials/html/native/context/history_tutorial_n.htm index e5a28e7..b23e400 100644 --- a/org.tizen.tutorials/html/native/context/history_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/context/history_tutorial_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native

    +

    Mobile native

    Content

    @@ -39,16 +39,7 @@

    This tutorial demonstrates how you can get the history profiles of the device usage, and enumerate retrieved data lists.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    Warm-up

    Become familiar with the Contextual History API basics by learning about:

    diff --git a/org.tizen.tutorials/html/native/context/trigger_tutorial_n.htm b/org.tizen.tutorials/html/native/context/trigger_tutorial_n.htm index 9881285..029d2ff 100644 --- a/org.tizen.tutorials/html/native/context/trigger_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/context/trigger_tutorial_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native

    +

    Mobile native

    Content

    @@ -47,16 +47,7 @@

    This tutorial demonstrates how you can compose and manage rules based on context states.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    Warm-up

    Become familiar with the Contextual Trigger API basics by learning about:

    diff --git a/org.tizen.tutorials/html/native/graphics/cairo_tutorial_n.htm b/org.tizen.tutorials/html/native/graphics/cairo_tutorial_n.htm index b47cf1d..5760d58 100644 --- a/org.tizen.tutorials/html/native/graphics/cairo_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/graphics/cairo_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -72,7 +72,8 @@ Build the environment.

    Define the appdata structure that contains the pointers to the objects to be manipulated:

    -typedef struct appdata 
    +typedef struct 
    +appdata 
     {
        Evas_Object *win;	
        Evas_Object *img;
    @@ -108,7 +109,8 @@ ad->cairo = cairo_create(ad->surface);
     
  • To draw Cairo with some specific vector positions, use the window size that you got before. You can compare the window width and height and get the smaller length to set the square side.
    -void cairo_drawing(void *data)
    +void 
    +cairo_drawing(void *data)
     {
        appdata_s *ad = data;
        int d = 0;
    @@ -162,11 +164,12 @@ void cairo_drawing(void *data)
     }
     
  • -
  • The delete callback is triggered when the Window is destroyed from the main loop. +
  • The delete callback is triggered when the window is destroyed from the main loop.
    -static void win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
    +static void 
    +win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
     {
        appdata_s *ad = data;
        cairo_surface_destroy(ad->surface);
    @@ -246,7 +249,8 @@ cairo_gl_device_set_thread_aware(ad->cairo_device, 0);
     
  • -static void init_cairo_evasgl_drawing(appdata_s *ad)
    +static void 
    +init_cairo_evasgl_drawing(appdata_s *ad)
     {
        // Create window
        elm_config_accel_preference_set("opengl");
    @@ -301,7 +305,8 @@ static void init_cairo_evasgl_drawing(appdata_s *ad)
     
  • Draw geometrical figures in the cairo_drawing() callback function.

    The following code snippet shows how to draw some geometrical figures such as a triangle, rectangle, and circle with various styles and random positions by using the Cairo APIs.

    -void cairo_drawing(void *data)
    +void 
    +cairo_drawing(void *data)
     {
        appdata_s *ad = data;
     
    @@ -385,9 +390,10 @@ void cairo_drawing(void *data)
     
  • Resize the callback. -

    In the following code snippet, when resizing occurs, Evas GL surface is recreated and reconnected to the Evas_object image.

    +

    In the following code snippet, when resizing occurs, Evas_GL surface is recreated and reconnected to the Evas_object image.

    -static void win_resize_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
    +static void 
    +win_resize_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
     {
        appdata_s *ad = data;
     
    @@ -428,7 +434,8 @@ static void win_resize_cb(void *data, Evas *e , Evas_Object *obj , void *event_i
     

    To update the Evas_object image which is connected to Evas_GL, use the evas_object_image_pixels_dirty_set() function. This updates the Evas_object image whenever Evas renders.

    -static Eina_Bool _animate_cb(void *data)
    +static Eina_Bool 
    +_animate_cb(void *data)
     {
        Evas_Object *obj = (Evas_Object *)data;
        evas_object_image_pixels_dirty_set(obj, EINA_TRUE);
    @@ -438,9 +445,10 @@ static Eina_Bool _animate_cb(void *data)
     
  • -
  • The delete callback is triggered when the Window is destroyed from the main loop. +
  • The delete callback is triggered when the window is destroyed from the main loop.
    -static void win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
    +static void 
    +win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
     {
        appdata_s *ad = data;
        cairo_surface_destroy(ad->surface);
    diff --git a/org.tizen.tutorials/html/native/graphics/graphic_comp_tutorial_n.htm b/org.tizen.tutorials/html/native/graphics/graphic_comp_tutorial_n.htm
    index e94580c..ffeba9f 100644
    --- a/org.tizen.tutorials/html/native/graphics/graphic_comp_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/graphics/graphic_comp_tutorial_n.htm
    @@ -18,7 +18,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/graphics/graphics_tutorials_n.htm b/org.tizen.tutorials/html/native/graphics/graphics_tutorials_n.htm index 1aae492..4839283 100644 --- a/org.tizen.tutorials/html/native/graphics/graphics_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/graphics/graphics_tutorials_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.tutorials/html/native/graphics/opengl_tutorial_n.htm b/org.tizen.tutorials/html/native/graphics/opengl_tutorial_n.htm index e6405b2..f1f0d9f 100644 --- a/org.tizen.tutorials/html/native/graphics/opengl_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/graphics/opengl_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -90,9 +90,13 @@

    Creating the Basic Application

    -

    This tutorial demonstrates how you can create a multicolored 3D rotating cube using OpenGL ES 2.0 API provided by GLView library. Several concepts are explained, such as the cube geometry, the initialization phase of the model, the adjustment of this very model frame by frame, and the way to design the OpenGL ES rendering loop.

    -

    First create a basic application as explained in the Basic application tutorial. This provides a basic UI application skeleton which already makes available the window object that contains the GLView canvas.

    -

    Building the Environment

    +

    This tutorial demonstrates how you can create a multicolored 3D rotating cube using the OpenGL ES 2.0 API provided by the GLView library. Several concepts are explained, such as the cube geometry, the initialization phase of the model, the adjustment of this very model frame by frame, and the way to design the OpenGL ES rendering loop.

    +

    To create the basic application:

    +
      +
    1. Create a basic application as explained in the Basic application tutorial. The basic UI application skeleton already makes available the window object that contains the GLView canvas.

      +
    2. +
    3. Build the environment: +

      Define the application data structure that holds all the objects pertinent for the GLView application:

      • Evas_Object *win: Application window
      • @@ -102,7 +106,8 @@
      • Evas_Object *inner_box: Box object for toolbox
      -typedef struct appdata 
      +typedef struct 
      +appdata 
       {
          Evas_Object *win;
          Evas_Object *conform;
      @@ -111,98 +116,114 @@ typedef struct appdata
          Evas_Object *main_box;
          Evas_Object *inner_box;
       } appdata_s;
      -
      - -

      OpenGL ES Canvas

      +
  • -

    When developing an application with Elementary, you can create a window by using the Elementary utility function as below:

    +
  • +

    Create the OpenGL ES canvas:

    +
      +
    1. +

      When developing an application with Elementary, you can create a window by using the Elementary utility function:

       elm_config_accel_preference_set("opengl"); 
       ad->win = elm_win_util_standard_add("GLView Example", "GLView Example");
      - -

      To develop a GL application, you have to call elm_config_accel_preference_set() before creating a window which makes an application to use GPU.

      - +
    2. +
    3. +

      To develop a GL application, you have to call the elm_config_accel_preference_set() function before creating a window which makes an application to use the GPU.

       ad->glview = elm_glview_add(ad->main_box);
      -

      There are 2 different methods to call GL functions.

      - -
      • First is to use Elementary GL Helper functions. You have to include Elementary_GL_Helpers.h and define a global variable by using ELEMENTARY_GLVIEW_GLOBAL_DEFINE(). Before calling gl functions, write ELEMENTARY_GLVIEW_GLOBAL_USE(). This tutorial uses this method. The usage is as follows. +

        There are 2 different methods to call the GL functions:

        +
        • Use the Elementary GL Helper functions. You have to include the Elementary_GL_Helpers.h header file and define a global variable using the ELEMENTARY_GLVIEW_GLOBAL_DEFINE() function. Before calling the gl functions, write the ELEMENTARY_GLVIEW_GLOBAL_USE() function. This tutorial uses this method.
           #include <Elementary_GL_Helpers.h>
           ELEMENTARY_GLVIEW_GLOBAL_DEFINE();
           
          -static void create_gl_canvas(appdata_s *ad) 
          +static void 
          +create_gl_canvas(appdata_s *ad) 
           {
              ad->glview = elm_glview_add(ad->main_box);
              ELEMENTARY_GLVIEW_GLOBAL_USE(ad->glview);
           }
           
          -static void draw_gl(Evas_Object *obj) 
          +static void 
          +draw_gl(Evas_Object *obj) 
           { 
              glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
           }
        • -
        • Second, you can get the Evas_GL instance from elm_glview_gl_api_get function, then you can call the OpenGL ES functions with the instance.

          +
        • Get the Evas_GL instance from the elm_glview_gl_api_get() function, and call the OpenGL ES functions with the instance.

           ad->glview = elm_glview_add(ad->main_box);
           Evas_GL_API *glapi = elm_glview_gl_api_get(ad->glview);
           glapi->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        - -

        The next thing to do is to set the GLView mode. elm_glview_mode_set(Evas_Object *obj, Elm_GLView_Mode mode) supports alpha, depth, stencil, MSAA, and client_side_rotation.

        +
      • +
      • +

        Set the GLView mode. The elm_glview_mode_set() function supports alpha, depth, stencil, MSAA, and client_side_rotation.

         elm_glview_mode_set(ad->glview, ELM_GLVIEW_DEPTH);
        - -

        To set up callbacks:

        - -
        -elm_glview_init_func_set(ad->glview, init_gl);
        -elm_glview_resize_func_set(ad->glview, resize_gl);
        -elm_glview_render_func_set(ad->glview, draw_gl);
        -elm_glview_del_func_set(ad->glview, del_gl);
        -ani = ecore_animator_add(animate_cb, ad->glview);
        - +
      • +
      • +

        Set up callbacks:

        • Callback for initialization

          The initialization callback is called when the GLView is first created, after a valid OpenGL ES context and surface have been created. This is called from the main loop, just as the 3 other callbacks.

          +
          +elm_glview_init_func_set(ad->glview, init_gl);
          +
        • Callback for resizing

          The resize callback is called whenever the GLView component is resized. A common action to take here is to reset the viewport.

          +
          +elm_glview_resize_func_set(ad->glview, resize_gl);
          +
        • Callback for drawing -

          The drawing callback is called whenever a new frame has to be drawn. The exact moment when this function is called depends on the policy set when calling.

          +

          The drawing callback is called whenever a new frame has to be drawn.

          +
          +elm_glview_render_func_set(ad->glview, draw_gl);
          +
          +

          The exact moment when this function is called depends on the policy set when calling.

           elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);
          -

          Another policy is ELM_GLVIEW_POLICY_ALWAYS, which requests render always even when it is not visible. So on demand policy is probably what you are looking for. The application can now draw anything using GL primitives when this callback is triggered. All draw operations are restricted to the surface of the GLView object previously created. Here it covers the whole window.

          +

          Another policy is ELM_GLVIEW_POLICY_ALWAYS, which requests render always even when it is not visible. So on demand policy is probably what you are looking for. The application can now draw anything using GL primitives when this callback is triggered. All draw operations are restricted to the surface of the GLView object previously created. Here it covers the whole window.

        • Callback for deleting

          The delete callback is triggered when the GLView is being destroyed, from the main loop, and no other callback can be called on the same object afterwards.

          +
          +elm_glview_del_func_set(ad->glview, del_gl);
          +
        • Add an animator. -

          The application above is technically working but the scene does not get updated unless the object is marked as such. Games might want to use an animator to have a regular update of the scene.

          +

          The application above is technically working but the scene does not get updated unless the object is marked as such. Games want to use an animator to have a regular update of the scene.

          +
          +ani = ecore_animator_add(animate_cb, ad->glview);

          Any other event can be used to refresh the view, for example user input if the view needs to be updated.

        - +
      • +
    +
  • +

    Creating the Cube

    -

    Creating and the coloring the cube can be separated into two distinct tasks: define the vertices and then add the colors to the faces.

    - +

    Creating and the coloring the cube can be separated into 2 distinct tasks: define the vertices and then add the colors to the faces.

    +

    To create and color the cube:

    Figure: Cube

    Cube

    - -

    Declare an array that stores the vertices of the cube in order to make it look like the drawing above.

    -
    static const float vertices[] =
    +
      +
    1. Declare an array that stores the vertices of the cube to make it look like the drawing above.

      +
      +static const float vertices[] =
       {
          // Front
          -0.5f, 0.5f, 0.5f,
      @@ -252,8 +273,10 @@ elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);

      Figure: Cube matrix

      Cube matrix

      -

      Each triangle is defined with three point coordinates, three vertices for each triangle, two triangles per face and six faces, so there are 36 vertices is total.

      -

      The next step is to specify a color for each face of the cube. Each color is represented in the RGBA format for the corresponding vertex, where each component is ranged from 0 to 1 where 1 is the maximum value. For example, in 32-byte color space, the RGB color of (16, 147, 237) is translated as (0.0625, 0.57421875, 0.92578125). The A of RGBA stands for the alpha channel, which represents the transparency of the color. All colors defined in this tutorial are opaque to make it simpler, so each alpha value is set to 1.0. In this example, different variants of blue are used for the faces of the cube.

      +

      Each triangle is defined with 3 point coordinates, 3 vertices for each triangle, 2 triangles per face and 6 faces. There are 36 vertices is total.

      +
    2. +
    3. +

      Specify a color for each face of the cube. Each color is represented in the RGBA format for the corresponding vertex, where each component is ranged from 0 to 1 where 1 is the maximum value. For example, in 32-byte color space, the RGB color of (16, 147, 237) is translated as (0.0625, 0.57421875, 0.92578125). The A of RGBA stands for the alpha channel, which represents the transparency of the color. All colors defined in this tutorial are opaque to make it simpler, so each alpha value is set to 1.0. In this example, different variants of blue are used for the faces of the cube.

      Specify the colors of the cube into an array dedicated to this vertex:

      static const float colors[] =
       {
      @@ -301,12 +324,17 @@ elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);
         0.52734375f, 0.76171875f, 0.92578125f, 1.0f };
    + +

    Drawing the Cube with GLView

    -

    Mathematical Functions for Matrices

    -

    After the model is initialized, create functionality to manipulate the scene. OpenGL ES 2.0 provided by GLView requires more preliminary work that the previous version of the library, but gives more power and flexibility, although our example does not take much benefit.

    -

    First, declare additional global variables for tasks specific to OpenGL ES 2.0. A program object is needed, an identifier for the vertices buffer and another for the colors. Three variables are also required to ensure the connection with the shader language:

    +

    After the model is initialized, create functionality to manipulate the scene. OpenGL ES 2.0 provided by GLView requires more preliminary work that the previous version of the library, but it gives you more power and flexibility, although this example does not take much benefit.

    +

    To draw the cube with GLView and use mathematical functions for matrices:

    + +
      +
    1. +

      Declare additional global variables for tasks specific to OpenGL ES 2.0. A program object is needed, an identifier for the vertices buffer, and another for the colors. Three variables are also required to ensure the connection with the shader language:

      • mvpLoc is an identifier for model-view-projection matrix.
      • positionLoc is an identifier for the vertex position.
      • @@ -315,21 +343,23 @@ elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);

    Declare all these variables in the appdata object as static variables so that each function can use variables and that they exist for the whole duration of the program.

    typedef struct appdata 
     {
    -   unsigned int     program;
    -   unsigned int     vtx_shader;
    -   unsigned int     fgmt_shader;
    -   unsigned int     vertexID;
    -   unsigned int     colorID;
    -   unsigned int     mvpLoc;
    -   unsigned int     positionLoc;
    -   unsigned int     colorLoc;
    +   unsigned int program;
    +   unsigned int vtx_shader;
    +   unsigned int fgmt_shader;
    +   unsigned int vertexID;
    +   unsigned int colorID;
    +   unsigned int mvpLoc;
    +   unsigned int positionLoc;
    +   unsigned int colorLoc;
     }
     
    -

    Since OpenGL ES 2.0, some functions for matrix transformations have been removed. Define three matrices to use: projection matrix, model-view matrix, and a combination of these allows you to perform any transformations on the initial vertices matrix.

    - -

    Matrix Multiplication Function (glMultMatrix)

    -

    First, define a function that is able to return the inner product of two matrices. This function reproduces the behavior of glMultMatrix() available in OpenGL ES 1.1. This function is very useful since almost every matrix transformation can be translated as multiplications of matrices.

    -

    The function takes three arguments, one is for the result and the other 2 matrices are operands:

    + +
  • +

    Since OpenGL ES 2.0, some functions for matrix transformations have been removed. Define 3 matrices to use: projection matrix, model-view matrix, and a combination of these allows you to perform any transformations on the initial vertices matrix.

    +
      +
    • Create the matrix multiplication function. +

      Define a function that is able to return the inner product of 2 matrices. This function reproduces the behavior of the glMultMatrix() function available in OpenGL ES 1.1. This function is very useful since almost every matrix transformation can be translated as multiplications of matrices.

      +

      The function takes 3 parameters, 1 is for the result and the other 2 matrices are operands.

      static void
       customMutlMatrix(float matrix[16], const float matrix0[16], const float matrix1[16])
       {
      @@ -348,9 +378,9 @@ customMutlMatrix(float matrix[16], const float matrix0[16], const float matrix1[
             matrix[i] = temp[i];
       }
       
      -

      Matrix Identity Function (glLoadIdentity)

      - -

      Implement a function equivalent to glLoadIdentity() that replaces the current matrix with the identity matrix:

      +
    • +
    • Create the matrix identity function. +

      Implement a function equivalent to the glLoadIdentity() function that replaces the current matrix with the identity matrix.

      const float unit_matrix[] = 
       {
          1.0f, 0.0f, 0.0f, 0.0f,
      @@ -366,14 +396,14 @@ customLoadIdentity(float matrix[16])
             matrix[i] = unit_matrix[i];
       }
       
      - -

      Matrix Projection Function (glFrustum)

      -

      Since glFrustum has been depreciated, implement a function that produces perspective projection matrices that are used to transform from eye coordinate space to clip coordinate space. This matrix projects a portion of the space (the "fustum") to your screen. Many caveats apply (normalized device coordinates, perspective divide, etc), but that is the idea:

      +
    • +
    • Create the matrix projection function. +

      Since the glFrustum() function has been deprecated, implement a function that produces perspective projection matrices that are used to transform from eye coordinate space to clip coordinate space. This matrix projects a portion of the space (the "frustum") to your screen. Many caveats apply (such as normalized device coordinates and perspective divide), but that is the idea.

      static int
       customFrustum(float result[16], 
      -              const float left,   const float right, 
      +              const float left, const float right, 
                     const float bottom, const float top, 
      -              const float near,   const float far)
      +              const float near, const float far)
       {
          if ((right - left) == 0.0f || (top - bottom) == 0.0f || (far - near) == 0.0f) 
             return 0;
      @@ -401,9 +431,9 @@ customFrustum(float result[16],
          return 1;
       }
       
      - -

      Matrix Scaling Function (glScale)

      -

      Depreciated glScale() function represents a non-uniform scaling along the x, y, and z axes. The three parameters indicate the desired scale factor along each of the three axes:

      +
    • +
    • Create the matrix scaling function. +

      The deprecated glScale() function represents a non-uniform scaling along the x, y, and z axes. The 3 parameters indicate the desired scale factor along each of the 3 axes.

      const float scale_matrix[] = 
       {
          x,    0.0f, 0.0f, 0.0f,
      @@ -412,7 +442,7 @@ customFrustum(float result[16],
          0.0f, 0.0f, 0.0f, 1.0f
       }
       
      -

      Here is the implementation of the matrix scaling function:

      +

      The following example shows the implementation of the matrix scaling function:

      static void
       customScale(float matrix[16], const float sx, const float sy, const float sz)
       { 
      @@ -432,9 +462,10 @@ customScale(float matrix[16], const float sx, const float sy, const float sz)
          matrix[11] *= sz; 
       }
       
      +
    • -

      Matrix Rotation Function (glRotate)

      -

      Define a function to represent a rotation by the vector (x y z). The current matrix is multiplied by a rotation matrix:

      +
    • Create the matrix rotation function. +

      Define a function to represent a rotation by the vector (x y z). The current matrix is multiplied by a rotation matrix.

      static void
       customRotate(float matrix[16], const float anglex, const float angley, const floatanglez)
       {
      @@ -467,10 +498,15 @@ customRotate(float matrix[16], const float anglex, const float angley, const flo
          customMultMatrix(matrix, matrix, temp);
       }
       
      - -

      Create the Shader

      -

      Define the source for the shader using a string array. First comes out vertex shader, which is used to a medium precision for float values. Then build a uniform matrix with dimensions 4x4 intended to hold the model-view-projection matrix. Also create two vector attributes which have 4 components for the vertex position and the color. This varying variable v_color can be accessed from the fragment shader. In the main function of the shader, initialize the position of the current vertex, gl_Position, with the product of the vertex position and the model-view-projection matrix, in order to normalize the position for the target screen. The pixel color is calculated by the varying variable from the vertex shader.

      -

      In the fragment shader, declare a varying variable, then set the color of the pixel with this interpolated color.

      +
    • +
    +
  • +
  • Create the shader: +
      +
    1. +

      Define the source for the shader using a string array. First comes out vertex shader, which is used to a medium precision for float values. Then build a uniform matrix with dimensions 4x4 intended to hold the model-view-projection matrix. Also create 2 vector attributes which have 4 components for the vertex position and the color. This varying variable v_color can be accessed from the fragment shader.

      +

      In the main function of the shader, initialize the position of the current vertex, gl_Position, with the product of the vertex position and the model-view-projection matrix, to normalize the position for the target screen. The pixel color is calculated by the varying variable from the vertex shader.

      +

      In the fragment shader, declare a varying variable, and set the color of the pixel with this interpolated color.

      static const char vertex_shader[] =
          "precision mediump float;"
          "uniform mat4 u_mvpMat;"
      @@ -490,7 +526,9 @@ static const char fragment_shader[] =
             "gl_FragColor = v_color;"
          "}";
       
      -

      Create the shaders, attach the source code that is just defined and compile the program object:

      +
    2. +
    3. +

      Create the shaders, attach the source code that is just defined, and compile the program object:

      static void
       initShaders(void* data)
       {
      @@ -507,7 +545,9 @@ initShaders(void* data)
          glShaderSource(ad->fgmt_shader, 1, &p, NULL);
          glCompileShader(ad->fgmt_shader);
       
      -

      Once the shaders are ready, instantiate the program object and link the shaders. If the linking succeeds, you can destroy the shaders afterwards (using glDeleteShader). Since they are inside the program object, so it is pointless to keep them in memory.

      +
    4. +
    5. +

      Once the shaders are ready, instantiate the program object and link the shaders. If the linking succeeds, you can destroy the shaders afterwards (using the glDeleteShader() function). Since they are inside the program object, it is pointless to keep them in memory.

         ad->program = glCreateProgram();
       
          glAttachShader(ad->program, ad->vtx_shader);
      @@ -518,14 +558,16 @@ initShaders(void* data)
       
          glLinkProgram(ad->program);
       
      - -

      For shader process, create identifiers for the attribute variables used in the shader program. First create an identifier for the model-view-projection matrix, another one for the current vertex position, and a last one for the vertex color.

      +
    6. +
    7. +

      For shader process, create identifiers for the attribute variables used in the shader program. Create an identifier for the model-view-projection matrix, another one for the current vertex position, and a last one for the vertex color.

         ad->mvpLoc      = glGetUniformLocation(ad->program, "u_mvpMat");
          ad->positionLoc = glGetAttribLocation(ad->program, "a_position");
          ad->colorLoc    = glGetAttribLocation(ad->program, "a_color");
       
      - -

      Finally, generate the buffers for the vertex positions and colors.

      +
    8. +
    9. +

      Generate the buffers for the vertex positions and colors:

          glGenBuffers(1, &ad->vertexID);
          glBindBuffer(GL_ARRAY_BUFFER, ad->vertexID);
      @@ -536,8 +578,9 @@ initShaders(void* data)
          glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
       }
       
      - -

      Allocate memory for the matrix and load a unit matrix into it. Then define the value that is used in order to build the perspective projection matrix. The customFrustum() function is used for it. Multiply this resulting matrix with a resizing matrix, so the model is correctly adjusted to the screen.

      +
    10. +
    11. +

      Allocate memory for the matrix and load a unit matrix into it. Define the value that is used to build the perspective projection matrix with the customFrustum() function. Multiply this resulting matrix with a resizing matrix, so the model is correctly adjusted to the screen.

       float aspect;
       customLoadIdentity(view);
      @@ -553,17 +596,25 @@ else
          customFrustum(view, -1.0, 1.0, -1.0 * aspect, 1.0 * aspect, -1.0, 1.0);
       }
       
      +
    12. +
    +
  • +

    Rendering the Cube

    -

    We set the viewport at 0,0 corresponding to the bottom left edge of the window, and the height and width of the GL surface. Clear the depth and the color buffers to the values that were selected during initialization. Then call the glUseProgram() function in order to trigger the shader program.

    +

    To render the cube:

    +
      +
    1. +

      Set the viewport at 0,0 corresponding to the bottom left edge of the window, and the height and width of the GL surface. Clear the depth and the color buffers to the values that were selected during initialization. Call the glUseProgram() function to trigger the shader program.

      glViewport(0, 0, w, h);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       
       glUseProgram(ad->program);
       
      - -

      Also bind the position and color identifiers to the buffers defined above.

      +
    2. +
    3. +

      Bind the position and color identifiers to the buffers defined above:

      glEnableVertexAttribArray(ad->positionLoc);
       glBindBuffer(GL_ARRAY_BUFFER, ad->vertexID);
       glVertexAttribPointer(ad->positionLoc, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
      @@ -572,27 +623,32 @@ glEnableVertexAttribArray(ad->colorLoc);
       glBindBuffer(GL_ARRAY_BUFFER, ad->colorID);
       glVertexAttribPointer(ad->colorLoc, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), 0);
       
      - -

      After this, initialize and calculate the transformation matrix of the model-view matrix by calling the customRotate() function. This makes the cube view rotate a little for a better perspective. Once the model-view matrix is ready to display, multiply the projection matrix with the model-view matrix.

      +
    4. +
    5. +

      Initialize and calculate the transformation matrix of the model-view matrix by calling the customRotate() function. This makes the cube view rotate a little for a better perspective. Once the model-view matrix is ready to display, multiply the projection matrix with the model-view matrix.

      customLoadIdentity(model);
       customRotate(ad->model, 45.0f, 45.0f, 0.0f);
       customMutlMatrix(ad->mvp, ad->view, ad->model);
       
      - -

      Then load the model-view-projection matrix into the shader and call glDrawArrays() to draw the model.

      +
    6. +
    7. +

      Load the model-view-projection matrix into the shader and call the glDrawArrays() function to draw the model:

      glUniformMatrix4fv(ad->mvpLoc, 1, GL_FALSE, mvp);
       glDrawArrays(GL_TRIANGLES, 0, 36);
       glFlush();
       
      - -

      You now are the proud owner of a nice cube!

      +
    8. +

    Figure: Static cube

    Static cube

    Animating the Cube

    -

    Ecore_Animator is used to create an animation.

    +

    To animate the cube:

    +
      +
    1. +

      Use the Ecore_Animator to create an animation:

      static Eina_Bool
       animate_cb(void *data)
       {
      @@ -607,8 +663,9 @@ create_gl_canvas(appdata_s *ad)
          ani = ecore_animator_add(animate_cb, ad->glview);
       }
       
      - -

      Next define the global variables which are used as parameters of the rendering process. Add parameters to the application data object that are used to control the scaling and the rotation of the cube. To make the cube rotate on one axis, take z, and allow the user to interact with the mouse to make the cube rotate on the two other axes x and y. In order to figure out whether the user is holding the mouse down, add a Boolean variable to have this information. Operations such as shader initialization or program compilation are not required at each tick of the animation loop. For better performance, isolate such task from the repetitive rendering loop. For such purpose, add a Boolean variable which tells whether the initialization is already done.

      +
    2. +
    3. +

      Define the global variables which are used as parameters of the rendering process. Add parameters to the application data object that are used to control the scaling and the rotation of the cube. To make the cube rotate on 1 axis, take z, and allow the user to interact with the mouse to make the cube rotate on the other axes x and y. To figure out whether the user is holding the mouse down, add a Boolean variable to have this information. Operations such as shader initialization or program compilation are not required at each tick of the animation loop. For better performance, isolate such task from the repetitive rendering loop. For such purpose, add a Boolean variable which tells whether the initialization is already done.

      typedef struct appdata 
       {
          float xangle;
      @@ -618,23 +675,29 @@ create_gl_canvas(appdata_s *ad)
          Eina_Bool initialized : 1;
       }  appdata_s;
       
      - -

      Here are the modifications that must be done to the rendering loop for animation.

      -

      First, lighten the recurrent rendering process by adding an initialization step:

      +
    4. +
    5. Modify the rendering loop for animation.

      +
        +
      • +

        Lighten the recurrent rendering process by adding an initialization step:

        if (ad->initialized) 
         {
            initShaders(ad);
            ad->initialized = EINA_TRUE;
         }
         
        - -

        Before drawing the vertices, the rotation angle for the model-view matrix must be incremented for every tick.

        +
      • +
      • +

        Before drawing the vertices, the rotation angle for the model-view matrix must be incremented for every tick. This makes the cube rotate automatically.

        customLoadIdentity(ad->model);
         customRotate(ad->model, ad->xangle, ad->yangle, ad->zangle++);
         customMutlMatrix(ad->mvp, ad->view, ad->model);
         
        - -

        This makes the cube rotate automatically. The next thing is to use the mouse to drag the cube around. To do so, add callbacks for mouse events. The first callback defines whether the user is holding the mouse down while moving the cursor around:

        +
      • +
      +
    6. +
    7. +

      Use the mouse to drag the cube around. To do so, add callbacks for mouse events. The first callback defines whether the user is holding the mouse down while moving the cursor around.

      static void
       mouse_down_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
       {
      @@ -668,16 +731,22 @@ mouse_move_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
          }
       }
       
      - +
    8. +
    9. Define the mouse events callbacks when creating the image canvas:

      evas_object_event_callback_add(ad->glview, EVAS_CALLBACK_MOUSE_DOWN, mouse_down_cb, ad);
       evas_object_event_callback_add(ad->glview, EVAS_CALLBACK_MOUSE_UP, mouse_up_cb, ad);
       evas_object_event_callback_add(ad->glview, EVAS_CALLBACK_MOUSE_MOVE, mouse_move_cb, ad);
       
      +
    10. +

    Implementing UI Component Interaction

    -

    Consider using UI component to control some aspects of the rendering. For example, use some sliders to control the shape of the cube. Declare 3 sliders to play with the scaling coordinates of the cube.

    +

    To implement UI component interaction:

    +
      +
    1. +

      Use the UI component to control some aspects of the rendering, such as some sliders to control the shape of the cube. Declare 3 sliders to play with the scaling coordinates of the cube.

      typedef struct appdata 
       {
          Evas_Object *slx;
      @@ -685,9 +754,10 @@ evas_object_event_callback_add(ad->glview, EVAS_CALLBACK_MOUSE_MOVE, mouse_mo
          Evas_Object *slz;
       }
       
      - -

      When rendering the GUI, build and show the sliders. Those accept values in a range from 0.0 to 1.5 and control the scaling of each axis of the cube.

      -
      // Slider for X-axis scale
      +
    2. +
    3. +

      Build and show the sliders when rendering the GUI. The sliders accept values in a range from 0.0 to 1.5. They control the scaling of each axis of the cube.

      +
      // Slider for X axis scale
       ad->slx = elm_slider_add(ad->inner_box);
       evas_object_size_hint_align_set(ad->slx, EVAS_HINT_FILL, 0);
       elm_slider_horizontal_set(ad->slx, EINA_TRUE);
      @@ -700,7 +770,7 @@ evas_object_color_set(ad->slx, 0.0, 0.0, 120, 255);
       elm_box_pack_end(ad->inner_box, ad->slx);
       evas_object_show(ad->slx);
       
      -// Slider for Y-axis scale
      +// Slider for Y axis scale
       ad->sly = elm_slider_add(ad->inner_box);
       evas_object_size_hint_align_set(ad->sly, EVAS_HINT_FILL, 0);
       elm_slider_horizontal_set(ad->sly, EINA_TRUE);
      @@ -713,7 +783,7 @@ evas_object_color_set(ad->sly, 0.0, 0.0, 120, 255);
       elm_box_pack_end(ad->inner_box, ad->sly);
       evas_object_show(ad->sly);
       
      -// Slider for Z-axis scale
      +// Slider for Z axis scale
       ad->slz = elm_slider_add(ad->inner_box);
       evas_object_size_hint_align_set(ad->slz, EVAS_HINT_FILL, 0);
       elm_slider_horizontal_set(ad->slz, EINA_TRUE);
      @@ -726,8 +796,9 @@ evas_object_color_set(ad->slz, 0.0, 0.0, 120, 255);
       elm_box_pack_end(ad->inner_box, ad->slz);
       evas_object_show(ad->slz);
       
      - -

      Then use the actual sliders's values and pass them to the scaling function in the rendering loop:

      +
    4. +
    5. +

      Use the actual sliders's values and pass them to the scaling function in the rendering loop:

      double scalex = elm_slider_value_get(ad->slx);
       double scaley = elm_slider_value_get(ad->sly);
       double scalez = elm_slider_value_get(ad->slz);
      @@ -737,14 +808,16 @@ customRotate(ad->model, ad->xangle, ad->yangle, ad->zangle++);
       customScale(ad->model, scalex, scaley, scalez);
       customMutlMatrix(ad->mvp, ad->view, ad->model);
       
      - -

      Consider also using a colorpicker to change the background. To achieve this, add a colorselector component:

      +
    6. +
    7. +

      Use a colorpicker to change the background by adding a colorselector component:

      typedef struct appdata 
       {
          Evas_Object *cs;
       }
       
      - +
    8. +
    9. Build the UI component with a default palette and add it to the GUI:

      ad->cs = elm_colorselector_add(ad->inner_box);
       elm_colorselector_mode_set(ad->cs, ELM_COLORSELECTOR_BOTH);
      @@ -752,34 +825,40 @@ elm_colorselector_palette_name_set(ad->cs, "default");
       elm_box_pack_end(ad->inner_box, ad->cs);
       evas_object_show(ad->cs);
       
      - -

      When rendering the cube, retrieve the currently selected color to define the color buffer. The colors from the colorselector vary from 0 to 255, which needs to be converted to the color format of OpenGL ES.

      -

      Build the UI component with a default palette and add it to the GUI:

      +
    10. +
    11. +

      When rendering the cube, retrieve the currently selected color to define the color buffer. The colors from the colorselector vary from 0 to 255, which needs to be converted to the color format of OpenGL ES.

      int r, g, b, a;
       elm_colorselector_color_get(ad->cs, &r, &g, &b, &a);
       glClearColor(r/255.0, g/255.0, b/255.0, a/255.0);
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       
      +
    12. +

    Implementing Effects

    - -

    Create a button that resets the scene by putting the background color to black and makes the cube bounce back to its original scale. First add the button to the application data object:

    +

    To implement effects:

    +
      +
    1. +

      Create a button that resets the scene by putting the background color to black and makes the cube bounce back to its original scale. Add the button to the application data object.

      typedef struct appdata 
       {
          Evas_Object *button;
       }
       
      - -

      Then add the button to the GUI:

      +
    2. +
    3. +

      Add the button to the GUI:

      elm_object_text_set(ad->button, "Reset");
       elm_box_pack_start(ad->reset_vbox, ad->button);
       evas_object_smart_callback_add(ad->button, "clicked", btn_reset_cb, ad);
       elm_box_pack_end(ad->inner_box, ad->button);
       evas_object_show(ad->button);
       
      - -

      Declare a callback that resets the variables that have influence on the drawing of the cube. In addition, animate the sliders when they get back to their original position using Ecore_Animator.

      +
    4. +
    5. +

      Declare a callback that resets the variables that have influence on the drawing of the cube. In addition, animate the sliders when they get back to their original position using the Ecore_Animator.

       typedef struct appdata 
       {
      @@ -817,6 +896,8 @@ btn_reset_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
          ecore_animator_timeline_add(1, animate_reset_cb, ad);
       }
       
      +
    6. +

    Viewing the Entire Cube Source

    @@ -849,25 +930,25 @@ typedef struct appdata    Evas_Object *cs;    Evas_Object *button; -   unsigned int program; -   unsigned int vtx_shader; -   unsigned int fgmt_shader; -   unsigned int vertexID; -   unsigned int colorID; -   unsigned int    mvpLoc; -   unsigned int    positionLoc; -   unsigned int    colorLoc; -   float model[16], mvp[16]; -   float view[16]; -   float xangle; -   float yangle; -   float zangle; -   Eina_Bool mouse_down : 1; -   Eina_Bool initialized : 1; - -   float slx_value; -   float sly_value; -   float slz_value; +   unsigned int program; +   unsigned int vtx_shader; +   unsigned int fgmt_shader; +   unsigned int vertexID; +   unsigned int colorID; +   unsigned int mvpLoc; +   unsigned int positionLoc; +   unsigned int colorLoc; +   float model[16], mvp[16]; +   float view[16]; +   float xangle; +   float yangle; +   float zangle; +   Eina_Bool mouse_down : 1; +   Eina_Bool initialized : 1; + +   float slx_value; +   float sly_value; +   float slz_value; } appdata_s; @@ -1136,7 +1217,8 @@ initShaders(void* data)    ad->colorLoc   = glGetAttribLocation(ad->program, "a_color"); } -static void init_gl(Evas_Object *obj) +static void +init_gl(Evas_Object *obj) {    int w, h;    appdata_s *ad = evas_object_data_get(obj, "ad"); @@ -1159,7 +1241,8 @@ static void init_gl(Evas_Object *obj)    } } -void resize_gl(Evas_Object *obj) +void +resize_gl(Evas_Object *obj) {    int w, h;    float aspect; @@ -1180,7 +1263,8 @@ void resize_gl(Evas_Object *obj)    } } -static void draw_gl(Evas_Object *obj) +static void +draw_gl(Evas_Object *obj) {    int w, h;    int r, g, b, a; @@ -1221,7 +1305,8 @@ static void draw_gl(Evas_Object *obj)    glFlush(); } -static void del_gl(Evas_Object *obj) +static void +del_gl(Evas_Object *obj) {    appdata_s *ad = evas_object_data_get(obj, "ad"); @@ -1232,25 +1317,30 @@ static void del_gl(Evas_Object *obj)    evas_object_data_del((Evas_Object*) obj, "ad"); } -static Eina_Bool animate_cb(void *data) +static Eina_Bool +animate_cb(void *data) {    elm_glview_changed_set(data); +    return EINA_TRUE; } -static void del_animate_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) +static void +del_animate_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info) {    Ecore_Animator *ani = evas_object_data_get(obj, "ani");    ecore_animator_del(ani); } -static void mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void +mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {    appdata_s *ad = data;    ad->mouse_down = EINA_TRUE; } -static void mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void +mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {    Evas_Event_Mouse_Move *ev;    ev = (Evas_Event_Mouse_Move *) event_info; @@ -1266,13 +1356,15 @@ static void mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf    } } -static void mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void +mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {    appdata_s *ad = data;    ad->mouse_down = EINA_FALSE; } -static Eina_Bool animate_reset_cb(void *data, double pos) +static Eina_Bool +animate_reset_cb(void *data, double pos) {    appdata_s *ad = data;    double frame = pos; @@ -1290,7 +1382,8 @@ static Eina_Bool animate_reset_cb(void *data, double pos)    return EINA_TRUE; } -static void btn_reset_cb(void *data, Evas_Object *obj, void *event_info) +static void +btn_reset_cb(void *data, Evas_Object *obj, void *event_info) {    appdata_s *ad = data;    ad->slx_value = elm_slider_value_get(ad->slx); @@ -1299,7 +1392,8 @@ static void btn_reset_cb(void *data, Evas_Object *obj, void *event_info)    ecore_animator_timeline_add(1, animate_reset_cb, ad); } -static void win_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) +static void +win_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) {    Evas_Coord w, h;    appdata_s *ad = data; @@ -1316,10 +1410,11 @@ static void win_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf    } } -static void win_back_cb(void *data, Evas_Object *obj, void *event_info) +static void +win_back_cb(void *data, Evas_Object *obj, void *event_info) {    appdata_s *ad = data; -   // Let window go to hidden state +   // Let the window go to the hidden state    elm_win_lower(ad->win); } @@ -1329,7 +1424,8 @@ win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)    ui_app_exit(); } -static void create_base_gui(appdata_s *ad) +static void +create_base_gui(appdata_s *ad) {    // Window    elm_config_accel_preference_set("opengl"); @@ -1365,7 +1461,8 @@ static void create_base_gui(appdata_s *ad)    evas_object_show(ad->win); } -static void create_gl_canvas(appdata_s *ad) +static void +create_gl_canvas(appdata_s *ad) {    Ecore_Animator *ani; @@ -1379,15 +1476,15 @@ static void create_gl_canvas(appdata_s *ad)    elm_glview_mode_set(ad->glview, ELM_GLVIEW_DEPTH);    // The resize policy tells GLView what to do with the surface when it -   // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to +   // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE tells it to    // destroy the current surface and recreate it to the new size    elm_glview_resize_policy_set(ad->glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE); -   // The render policy sets how GLView should render GL code. -   // ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the GL callback +   // The render policy sets how GLView must render GL code. +   // ELM_GLVIEW_RENDER_POLICY_ON_DEMAND has the GL callback    // called only when the object is visible. -   // ELM_GLVIEW_RENDER_POLICY_ALWAYS would cause the callback to be -   // called even if the object were hidden. +   // ELM_GLVIEW_RENDER_POLICY_ALWAYS causes the callback to be +   // called even if the object were hidden    elm_glview_render_policy_set(ad->glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);    // The initialize callback function gets registered here @@ -1406,10 +1503,10 @@ static void create_gl_canvas(appdata_s *ad)    elm_box_pack_end(ad->main_box, ad->glview);    evas_object_show(ad->glview); -   // This adds an animator so that the app will regularly -   // trigger updates of the GLView using elm_glview_changed_set() +   // This adds an animator so that the app regularly +   // triggers updates of the GLView using elm_glview_changed_set()    // -   // NOTE: If you delete GL, this animator will keep running trying to access +   // NOTE: If you delete GL, this animator keeps running trying to access    // GL so this animator needs to be deleted with ecore_animator_del()    ani = ecore_animator_add(animate_cb, ad->glview);    evas_object_data_set(ad->glview, "ani", ani); @@ -1427,7 +1524,8 @@ static void create_gl_canvas(appdata_s *ad)    ad->initialized = EINA_FALSE; } -static void create_toolbox(appdata_s *ad) +static void +create_toolbox(appdata_s *ad) {    ad->inner_box = elm_box_add(ad->main_box);    elm_box_horizontal_set(ad->inner_box, EINA_FALSE); @@ -1442,7 +1540,7 @@ static void create_toolbox(appdata_s *ad)    elm_box_pack_end(ad->inner_box, ad->cs);    evas_object_show(ad->cs); -   // Slider for X-axis scale +   // Slider for X axis scale    ad->slx = elm_slider_add(ad->inner_box);    evas_object_size_hint_align_set(ad->slx, EVAS_HINT_FILL, 0);    elm_slider_horizontal_set(ad->slx, EINA_TRUE); @@ -1455,7 +1553,7 @@ static void create_toolbox(appdata_s *ad)    elm_box_pack_end(ad->inner_box, ad->slx);    evas_object_show(ad->slx); -   // Slider for Y-axis scale +   // Slider for Y axis scale    ad->sly = elm_slider_add(ad->inner_box);    evas_object_size_hint_align_set(ad->sly, EVAS_HINT_FILL, 0);    elm_slider_horizontal_set(ad->sly, EINA_TRUE); @@ -1468,7 +1566,7 @@ static void create_toolbox(appdata_s *ad)    elm_box_pack_end(ad->inner_box, ad->sly);    evas_object_show(ad->sly); -   // Slider for Z-axis scale +   // Slider for Z axis scale    ad->slz = elm_slider_add(ad->inner_box);    evas_object_size_hint_align_set(ad->slz, EVAS_HINT_FILL, 0);    elm_slider_horizontal_set(ad->slz, EINA_TRUE); @@ -1490,10 +1588,11 @@ static void create_toolbox(appdata_s *ad)    evas_object_show(ad->button); } -static bool app_create(void *data) +static bool +app_create(void *data) {    // Hook to take necessary actions before main event loop starts -   // Initialize UI resources and application's data +   // Initialize UI resources and application's data    // If this function returns true, the main loop of application starts    // If this function returns false, the application is terminated    appdata_s *ad = data; @@ -1505,27 +1604,32 @@ static bool app_create(void *data)    return true; } -static void app_control(app_control_h app_control, void *data) +static void +app_control(app_control_h app_control, void *data) {    // Handle the launch request } -static void app_pause(void *data) +static void +app_pause(void *data) {    // Take necessary actions when application becomes invisible } -static void app_resume(void *data) +static void +app_resume(void *data) {    // Take necessary actions when application becomes visible } -static void app_terminate(void *data) +static void +app_terminate(void *data) {    // Release all resources } -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) {    appdata_s ad = { 0, };    int ret = 0; @@ -1542,7 +1646,6 @@ int main(int argc, char *argv[])    {       dlog_print(DLOG_ERROR, PACKAGE, "The application failed to start, and returned %d", ret);    } -    return ret; }
    @@ -1594,7 +1697,8 @@ typedef struct    Target_Buffer *last_buffer; } App_Data; -static bool app_create(void *data) +static bool +app_create(void *data) {    Evas_Object *win, *glview;    App_Data *ad = data; @@ -1698,7 +1802,7 @@ init(Evas_Object *obj) -
  • Create Ecore threads: +
  • Create Ecore threads.

    To easily create threads with EFL, use the ecore_thread() infrastructure, which provides a high level abstraction over system threads, along with callbacks in the main loop to signal that a thread has finished running or has been canceled.

    When the main OpenGL ES context is properly set up, spawn the render thread and start setting up its OpenGL ES context:

    @@ -1719,7 +1823,7 @@ init(Evas_Object *obj)
     

    To establish safe communication channels between threads:

    1. Since most of EFL is not thread-safe, certain operations cannot be executed from another thread and you must use the main loop instead. -

      Establish a communication channel from the render thread to the main loop:

      +

      Establish a communication channel from the render thread to the main loop.

      1. Create an ecore_pipe channel.

        EFL provides a simple tool to send messages to the main thread using pipes. Ecore Pipe is the abstraction layer around pipe objects, and is the easiest way to send a message from any thread back to the main thread.

        @@ -1775,7 +1879,7 @@ pipe_handler(void *data, void *buf, unsigned int len EINA_UNUSED)    } }
    -

    You need not use the free() function to free data since the data belongs to the ecore_pipe.

    +

    You do not need to use the free() function to free data since the data belongs to the ecore_pipe.

  • @@ -1786,7 +1890,7 @@ pipe_handler(void *data, void *buf, unsigned int len EINA_UNUSED)
    1. Create a pipe. -

      The easiest way to send a simple message in EFL in Tizen is to rely on a POSIX pipe file handle:

      +

      The easiest way to send a simple message in EFL in Tizen is to rely on a POSIX pipe file handle.

       // Create a pipe for messaging  
       int fds[2];
      @@ -1796,7 +1900,7 @@ ad.rt_wpipefd = fds[1];
       
    2. -
    3. Send messages to a thread. Write data to the pipe created above, from the main loop: +
    4. Send messages to a thread. Write data to the pipe created above, from the main loop.
       // Main loop to render thread  
       static void
      @@ -1818,8 +1922,8 @@ event_send(App_Data *ad, Event_Type type, ...)
       
    5. -
    6. Receive messages in a thread: -

      In the render thread, use the event handling code:

      +
    7. Receive messages in a thread. +

      In the render thread, use the event handling code.

       while (!ecore_thread_check(ad->th.thread))
       {
      @@ -1836,7 +1940,7 @@ while (!ecore_thread_check(ad->th.thread))
       }
       
    8. -
    9. Use a simple pipe file descriptor to use the poll() or select() function, in order to wait for events for a pre-determined period of time, or to wait for events on more than a single file descriptor. In this example, the main loop is responsible for the render thread life-cycle: +
    10. Use a simple pipe file descriptor to use the poll() or select() function to wait for events for a pre-determined period of time, or to wait for events on more than a single file descriptor. In this example, the main loop is responsible for the render thread life-cycle.
       thread_run(void *data, Ecore_Thread *th EINA_UNUSED)
       {
      @@ -1875,7 +1979,7 @@ evas_object_event_callback_add(glview, EVAS_CALLBACK_MOUSE_UP, mouse_up_cb, &
       
    11. -

      Add a handle to the callbacks:

      +

      Add a handle to the callbacks.

      The mouse down callback sends a mouse down event to render thread.

       static void
      @@ -1892,7 +1996,7 @@ mouse_down_cb(void *data, Evas *e EINA_UNUSED,
       
    12. -

      The mouse up callback sends a mouse up event to render thread.

      +

      The mouse up callback sends a mouse up event to render thread:

       static void
       mouse_up_cb(void *data, Evas *e EINA_UNUSED,
      @@ -2016,7 +2120,6 @@ target_create(App_Data *ad EINA_UNUSED)
       
             return NULL;
          }
      -
          return target;
       }
       
      @@ -2054,7 +2157,7 @@ thread_run(void *data, Ecore_Thread *th EINA_UNUSED)
    13. -

      To render in a thread, use the thread_draw() function. The following example draws with a color:

      +

      To render in a thread, use the thread_draw() function. The following example draws with a color.

       static void
       thread_draw(App_Data *ad, Evas_GL_API *gl)
      @@ -2066,14 +2169,14 @@ thread_draw(App_Data *ad, Evas_GL_API *gl)
       
    14. -
    15. Render the FBO to the screen. The following example uses the ecore_pipe: +
    16. Render the FBO to the screen. The following example uses the ecore_pipe.
       // Signal the main thread that a new frame is now available  
       message_send(ad, MSG_NEWFRAME, target);
       
    17. -

      The pipe handler receives this message in pipe_handler. The following example adds the target buffer to a queue:

      +

      The pipe handler receives this message in pipe_handler. The following example adds the target buffer to a queue.

       case MSG_NEWFRAME:
          // Queue a new frame description  
      @@ -2184,7 +2287,7 @@ if (evasglCreateImageForContext)
       {
          // Create an image
          evasglCreateImageForContext(evgl, ctx, EVAS_GL_TEXTURE_2D,
      -                               (void*)(intptr_t)texid, NULL);
      +                              (void*)(intptr_t)texid, NULL);
       }
       

      Tizen also provides specific buffers created with TBM that can be passed to this function. Unfortunately the image extension is more device-dependent, and may not even work in the Tizen emulator.

      @@ -2235,15 +2338,14 @@ if (gl->glGetProgramBinaryOES)

      Image and sync support are the most commonly used EvasGL extensions. Both can be used for multi-thread rendering, but EvasGL images can also be used to share images between contexts.

      -

      EvasGLImage

      - -

      There are 2 versions of the evasglCreateImage function, out of which extra Evas_GL_Context is taken as an argument. It is recommended to call evasglCreateImageForContext if you are dealing with multiple contexts, otherwise calling the evasglCreateImage function is sufficient.

      +
        +
      • To use the image extension: -

        The code below is just an example.

        +

        There are 2 versions of the evasglCreateImage() function, out of which extra Evas_GL_Context is taken as a parameter. It is recommended to call the evasglCreateImageForContext() function if you are dealing with multiple contexts, otherwise calling the evasglCreateImage() function is sufficient.

        1. Check for support. -

          Before using this extension, check whether it is supported:

          +

          Before using this extension, check whether it is supported.

           if (gl->evasglCreateImageForContext && gl->evasglDestroyImage)
          @@ -2253,7 +2355,7 @@ if (gl->evasglCreateImageForContext && gl->evasglDestroyImage)
           
        2. Create an image. -

          Create a render buffer and bind it to an EvasGL image:

          +

          Create a render buffer and bind it to an EvasGL image.

           const int width = 64, height = 64;
          @@ -2275,13 +2377,13 @@ gl->glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
           evgl = elm_glview_evas_gl_get(glview);
           ctx = evas_gl_current_context_get(evgl);
           image = gl->evasglCreateImageForContext(evgl, ctx, EVAS_GL_TEXTURE_2D,
          -                                        (void *)(intptr_t) color_rb, NULL);
          +                                       (void *)(intptr_t) color_rb, NULL);
           

          The EvasGL image is now created and available for use from another context.

        3. Use an image. -

          To draw something in the texture and render that texture to the screen. To skip the draw function:

          +

          To draw something in the texture and render that texture to the screen. The following example shows how to skip the draw function.

           gl->glBindFramebuffer(GL_FRAMEBUFFER_EXT, fbo);
          @@ -2296,7 +2398,7 @@ gl->glBindFramebuffer(GL_FRAMEBUFFER_EXT, 0);
           gl->glGenTextures(1, &tex);
           gl->glBindTexture(GL_TEXTURE_2D, tex);
           gl->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
          -And do the actual draw operation (draw the contents of the texture on screen):
          +// Draw the contents of the texture on the screen
           static const GLint verts[12] = { -5, -6, -10,  5, -6, -10,  -5, 4, 10,  5, 4, 10 };
           static const GLint tex_coords[8] = { 0, 0,  1, 0,  0, 1,  1, 1 };
           
          @@ -2323,37 +2425,41 @@ gl->glDisable(GL_TEXTURE_2D);
           	

          The image content can be shared between different contexts.

        4. Destroy an image. -

          After releasing all the associated resources, such as FBO and textures, release the image object itself:

          +

          After releasing all the associated resources, such as FBO and textures, release the image object itself.

           gl->evasglDestroyImage(image);
        - -

        Sync

        +
      • +
      • To use the sync extension:

        Another commonly used extension is the fence sync extension along with the reusable sync and wait sync. This allows creating a semaphore-style object that is released as soon as all the previous render operations have been completed.

        -

        This guide does not explain the details of these extensions, as they should behave in a similar way to their EGL implementations.

        +

        This guide does not explain the details of these extensions, as they must behave in a similar way to their EGL implementations.

        As usual with extensions, check the support:

         if (gl->evasglCreateSync)
        -  // fence_sync must be supported
        +   // fence_sync must be supported
         
        +
      • +

      Using Direct Rendering

      To enhance rendering performance, the Direct Rendering option is supported.

      +
        +
      • +

        To use direct rendering in GLView:

        -

        GLView

        - +

        In GLView, the ELM_GLVIEW_DIRECT option is one of GLView mode's enums and the option can be enabled using the elm_glview_mode_set() function.

         // Tizen 2.3
         // elm_config_accel_preference_set("opengl");
         
        -// since Tizen 2.3.1
        +// Since Tizen 2.3.1
         elm_config_accel_preference_set("opengl:depth24:stencil8:msaa_high");
         Evas_Object *win = elm_win_util_standard_add("sample", "sample");
         
        @@ -2361,17 +2467,17 @@ Evas_Object *glview = elm_glview_add(win);
         elm_glview_mode_set(glview, ELM_GLVIEW_DEPTH_24 | ELM_GLVIEW_STENCIL_8 | ELM_GLVIEW_MULTISAMPLE_HIGH);
         
        -

        In GLView, the ELM_GLVIEW_DIRECT option is one of GLView mode's enums and the option can be enabled using the elm_glview_mode_set() function.

        -

        To use the Direct Rendering mode since Tizen 2.3.1, set the same option values (depth, stencil, and MSAA) to a rendering engine and a GLView object. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function and to a GLView object using the elm_glview_mode_set() function. If the GLView object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled.

        +
      • +
      • +

        To use direct rendering in EvasGL:

        -

        EvasGL

        - +

        In EvasGL, the EVAS_GL_OPTIONS_DIRECT is one of EvasGL's config options and the option can be enabled by setting the Evas_GL_Config option.

         // Tizen 2.3
         // elm_config_accel_preference_set("opengl");
         
        -// since Tizen 2.3.1
        +// Since Tizen 2.3.1
         elm_config_accel_preference_set("opengl:depth24:stencil8:msaa_high");
         Evas_Object *win = elm_win_util_standard_add("sample", "sample");
         
        @@ -2385,7 +2491,7 @@ cfg->options_bits = EVAS_GL_OPTIONS_DIRECT;
         cfg->multisample_bits = EVAS_GL_MULTISAMPLE_HIGH;
         
        -

        In EvasGL, the EVAS_GL_OPTIONS_DIRECT is one of EvasGL's config options and the option can be enabled by setting the Evas_GL_Config option. To use the Direct Rendering mode since Tizen 2.3.1, set the same option values (depth, stencil, and MSAA) to a rendering engine and an Evas_GL_Config object. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function. If the Evas_GL_Config object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled.

        +

        To use the Direct Rendering mode since Tizen 2.3.1, set the same option values (depth, stencil, and MSAA) to a rendering engine and an Evas_GL_Config object. You can set the option values to a rendering engine using the elm_config_accel_preference_set() function. If the Evas_GL_Config object option values are bigger or higher than the rendering engine's, the Direct Rendering mode is disabled.

        @@ -2393,17 +2499,17 @@ cfg->multisample_bits = EVAS_GL_MULTISAMPLE_HIGH; - +
        Note
        If direct rendering is enabled, EvasGL will render directly to the back buffer of the window. Otherwise, EvasGL will render to the off screen buffer, then composited to the back buffer of the window. + If direct rendering is enabled, EvasGL rendersdirectly to the back buffer of the window. Otherwise, EvasGL renders to the off screen buffer, then composited to the back buffer of the window. -

        Although direct rendering is enabled, EvasGL will not always render directly to the back buffer. Here are some conditions that will disable direct rendering and force a fallback to indirect rendering in a frame buffer.

        +

        Although direct rendering is enabled, EvasGL not always renders directly to the back buffer. The following conditions disable direct rendering and force a fallback to indirect rendering in a frame buffer:

        -
          +
          • If the object's color is not 255,255,255,255.
          • If the object has an Evas map.
          • If the object size is different from the viewport, (RESIZE_POLICY_SCALE).
          • If the window is rotated and CLIENT_SIDE_ROTATION is not set.
          • If the GLView policy is set to ALWAYS render or the EvasGL does not use pixel getter callback.
          • -
        @@ -2417,40 +2523,40 @@ cfg->multisample_bits = EVAS_GL_MULTISAMPLE_HIGH; In the render callback function, call only GL functions.

        In case the GL functions are called outside the render callback function, you must call the evas_gl_make_current() function before the GL function calls. However, this results in a performance degradation due to context switching, and only works if the target surface is not an Evas_GL_Surface with Direct Rendering enabled.

        -

        If the target buffer is an Evas_GL_Surface with Direct Rendering enabled, all GL functions must be called from the render callback function only. All other operations can break the rendering order and the unexpected rendering will occur.

        +

        If the target buffer is an Evas_GL_Surface with Direct Rendering enabled, all GL functions must be called from the render callback function only. All other operations can break the rendering order and the unexpected rendering occurs.

        +
      • +

      Using Client-side Rotation

      - -

      The Client Side Rotation is a special value that indicates to EFL that the application will handle the view rotation when the device is rotated. This is needed only when the application requests Direct Rendering.

      +

      The Client Side Rotation is a special value that indicates to EFL that the application handles the view rotation when the device is rotated. This is needed only when the application requests Direct Rendering.

      If the window is rotated and the Direct Rendering flag is set, Client Side Rotation can be used to avoid falling back to a frame buffer.

      -

      GLView

      +
        +
      • To use GLView rotation: +

        In GLView, the ELM_GLVIEW_CLIENT_SIDE_ROTATION option is one of GLView mode's enums and the option can be enabled by using the elm_glview_mode_set() function. This option is needed only when Direct Rendering is enabled.

         Evas_Object *gl;
         gl = elm_glview_add(win);
          
         elm_glview_mode_set(gl, ELM_GLVIEW_DEPTH | ELM_GLVIEW_DIRECT | ELM_GLVIEW_CLIENT_SIDE_ROTATION);
        +
      • -

        In GLView, the ELM_GLVIEW_CLIENT_SIDE_ROTATION option is one of GLView mode's enums and the option can be enabled by using the elm_glview_mode_set() function. This option is needed only when Direct Rendering is enabled.

        - -

        EvasGL

        +
      • To use EvasGL rotation: +

        In EvasGL, the EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION is one of EvasGL's config options and this option can be enabled by setting the Evas_GL_Config option.

         Evas_GL_Config *cfg;
         cfg = evas_gl_config_new();
          
         cfg->options_bits = EVAS_GL_OPTIONS_DIRECT | EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION;
        -

        In EvasGL, the EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION is one of EvasGL's config options and this option can be enabled by setting the Evas_GL_Config option.

        -

        Get the current rotation value:

        -
         static void _draw_gl(Evas_Object *obj) 
         {
        @@ -2464,7 +2570,9 @@ static void _draw_gl(Evas_Object *obj)
            } 
         }
        -

        To get the current rotation of the view, in degrees, call the evas_gl_rotation_get() in order to properly handle the current rotation of the view. It will always return 0 unless the option EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION has been set. Indeed, in case of Direct Rendering to the back buffer, the client application is responsible for properly rotating its view. This can generally be done by applying a rotation to a view matrix.

        +

        To get the current rotation of the view, in degrees, call the evas_gl_rotation_get() function to properly handle the current rotation of the view. It always returns 0 unless the option EVAS_GL_OPTIONS_CLIENT_SIDE_ROTATION has been set. Indeed, in case of Direct Rendering to the back buffer, the client application is responsible for properly rotating its view. This can generally be done by applying a rotation to a view matrix.

        +
      • +
      diff --git a/org.tizen.tutorials/html/native/graphics/tbm_tutorial_n.htm b/org.tizen.tutorials/html/native/graphics/tbm_tutorial_n.htm index d982d88..e30173c 100644 --- a/org.tizen.tutorials/html/native/graphics/tbm_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/graphics/tbm_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -72,7 +72,7 @@ if (tbm_surface_query_formats (&formats, &format_num) != TBM_SURFACE_ERR
    18. -

      Create the TBM surface (tbm_surface), defining its format, height, and width:

      +

      Create the TBM surface (tbm_surface) and define its format, height, and width:

       int i;
       tbm_surface_h surface = NULL;
      @@ -107,7 +107,7 @@ if (tbm_surface_map (surface, TBM_SURF_OPTION_READ|TBM_SURF_OPTION_WRITE, &s
       
    19. -

      Store data at the tbm_surface by using pointer of each plane:

      +

      Store data at the tbm_surface by using a pointer of each plane:

       for (i = 0; i<surface_info.num_planes; i++)
       {
      @@ -116,7 +116,7 @@ for (i = 0; i<surface_info.num_planes; i++)
       
    20. -
    21. Unmap and destroy tbm_surface. +
    22. Unmap and destroy tbm_surface:
       if (tbm_surface_unmap (surface) != TBM_SURFACE_ERROR_NONE)
       {
      diff --git a/org.tizen.tutorials/html/native/location/geofence_tutorial_n.htm b/org.tizen.tutorials/html/native/location/geofence_tutorial_n.htm
      index fe04c46..31c4592 100644
      --- a/org.tizen.tutorials/html/native/location/geofence_tutorial_n.htm
      +++ b/org.tizen.tutorials/html/native/location/geofence_tutorial_n.htm
      @@ -16,7 +16,7 @@
       
       
      -

      Mobile native

      +

      Mobile native

      Content

      @@ -40,16 +40,7 @@

      This tutorial demonstrates how you can implement the geofence-related information and services.

      - - - - - - - - - -
      Note
      This feature is supported in mobile applications only.
      +

      This feature is supported in mobile applications only.

      Warm-up

      Become familiar with Geofence API basics by learning about:

      @@ -136,7 +127,7 @@ geofence_manager_stop(manager); geofence_manager_destroy(manager); manager = NULL;
      -

      If you destroy the handle, there is no need to call geofence_manager_stop() function to stop the service as the service is automatically stopped. Also, you do not have to unset the previously set callbacks.

    +

    If you destroy the handle, there is no need to call the geofence_manager_stop() function to stop the service as the service is automatically stopped. Also, you do not have to unset the previously set callbacks.

    Getting the Geofence Event State

    @@ -152,8 +143,9 @@ geofence_manager_set_geofence_event_cb(manager, geofence_event, NULL);
     geofence_manage_e user_action;
     geofence_error_e user_error;
    -void geofence_event(int place_id, int geofence_id, geofence_manager_error_e error, 
    -                    geofence_manage_e manage, void *user_data)
    +void 
    +geofence_event(int place_id, int geofence_id, geofence_manager_error_e error, 
    +               geofence_manage_e manage, void *user_data)
     {
        user_action = manage;
        user_error = error;
    @@ -187,7 +179,8 @@ geofence_manager_set_geofence_state_changed_cb(manager, geofence_state_changed,
     
  • When the alert is received, you can use the callback to, for example, update the variables that store the current state:

     geofence_state_e received_state;
    -void geofence_state_changed(int geofence_id, geofence_state_e state, void *user_data)
    +void 
    +geofence_state_changed(int geofence_id, geofence_state_e state, void *user_data)
     {
        received_state = state;
     }
    diff --git a/org.tizen.tutorials/html/native/location/location_tutorial_n.htm b/org.tizen.tutorials/html/native/location/location_tutorial_n.htm
    index 3006795..42305e1 100644
    --- a/org.tizen.tutorials/html/native/location/location_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/location/location_tutorial_n.htm
    @@ -16,7 +16,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -75,7 +75,7 @@
     #include <locations.h>
     
  • -
  • Create a location manager handle using the location_manager_create() function before you use it. For this example, the GPS is used as the source of the position data, so the first argument is LOCATIONS_METHOD_GPS. You can use other values of the location_method_e enumeration (in mobile and wearable applications), such as LOCATIONS_METHOD_HYBRID or LOCATIONS_METHOD_CPS, but they are less accurate.

    +
  • Create a location manager handle using the location_manager_create() function before you use it. For this example, the GPS is used as the source of the position data, so the first parameter is LOCATIONS_METHOD_GPS. You can use other values of the location_method_e enumeration (in mobile and wearable applications), such as LOCATIONS_METHOD_HYBRID or LOCATIONS_METHOD_CPS, but they are less accurate.

     location_manager_h manager;
     location_manager_create(LOCATIONS_METHOD_GPS, &manager);
    @@ -112,7 +112,8 @@ ret = location_manager_start(manager);

    The __state_changed_cb function is a callback, which is called when the status of the location service state changes.

     static location_service_state_e service_state;
    -static void __state_changed_cb(location_service_state_e state, void *user_data)
    +static void 
    +__state_changed_cb(location_service_state_e state, void *user_data)
     {
        service_state = state;
     }
    @@ -133,7 +134,8 @@ ret = location_manager_get_last_location(manager, &altitude, &latitude,
     
     
  • When getting the current location information, call the location_manager_get_location() function after the service is enabled:
    -static void __state_changed_cb(location_service_state_e state, void *user_data)
    +static void 
    +__state_changed_cb(location_service_state_e state, void *user_data)
     {
        double altitude, latitude, longitude, climb, direction, speed;
        double horizontal, vertical;
    @@ -150,7 +152,7 @@ static void __state_changed_cb(location_service_state_e state, void *user_data)
     
  • -
  • When you no longer need the Location Manager, destroy it. You must also unset all connected callback functions and stop the Location Manager: +
  • When you no longer need the Location Manager, destroy it, unset all connected callback functions, and stop the Location Manager:
     location_manager_unset_service_state_changed_cb(manager);
     location_manager_stop(manager);
    @@ -165,8 +167,9 @@ location_manager_destroy(manager);
  • When the update is received, you can, for example, update the variables that store the current position:

     static double user_latitude, user_longitude;
    -static void position_updated(double latitude, double longitude, double altitude, 
    -                             time_t timestamp, void *user_data)
    +static void 
    +position_updated(double latitude, double longitude, double altitude, 
    +                 time_t timestamp, void *user_data)
     {
        user_latitude = latitude;
        user_longitude = longitude;
    @@ -205,13 +208,14 @@ ret = location_bounds_create_polygon(coord_list, poly_size, &bounds_poly);
     

    When a circular bound is needed, use the location_bounds_create_circle() function.

  • -
  • Get the coordinates of the generated polygon bounds. Register a callback function to notify you of the polygon coordinates: +
  • Get the coordinates of the generated polygon bounds. Register a callback function to notify you of the polygon coordinates.
     ret = location_bounds_foreach_polygon_coords(bounds_poly, capi_poly_coords_cb, NULL);

    Implement the callback function (the second parameter in the function above) separately:

     static double latitude, longitude;
    -static bool capi_poly_coords_cb(location_coords_s coords, void *user_data)
    +static bool 
    +capi_poly_coords_cb(location_coords_s coords, void *user_data)
     {
        latitude = coords.latitude;
        longitude = coords.longitude;
    @@ -225,7 +229,8 @@ static bool capi_poly_coords_cb(location_coords_s coords, void *user_data)
     

    Implement the bounds_state_changed_cb callback separately:

     static location_boundary_state_e bound_state;
    -static void bounds_state_changed_cb(location_boundary_state_e state, void *user_data)
    +static void 
    +bounds_state_changed_cb(location_boundary_state_e state, void *user_data)
     {
        bound_state = state;
     }
    @@ -248,7 +253,7 @@ location_bounds_destroy(bounds_poly);
  • gps_status_set_satellite_updated_cb(manager, capi_gps_status_satellite_updated_cb, 10, NULL);

    The third parameter determines the frequency of callback calls. In this example, the callback is called every 10 seconds.

  • -
  • When the update is received, the callback having brief satellite information is called. To get the detailed satellite information in the sky, call the gps_status_foreach_satellites_in_view() function in the callback. Variables that store the current satellite information are updated: +
  • When the update is received, the callback having brief satellite information is called. To get the detailed satellite information in the sky, call the gps_status_foreach_satellites_in_view() function in the callback. Variables that store the current satellite information are updated.
     int cur_azimuth, cur_elevation, cur_prn, cur_snr;
    @@ -372,7 +377,7 @@ location_manager_get_location(manager, &altitude, &latitude, &longit
     
     
  • Get the distance.

    To get a distance (in meters) between 2 points, use the location_manager_get_distance() function. The obtained value is a great-circle distance; the shortest distance between 2 points on the sphere.

    -

    Provide the latitude and longitude of the starting point, the latitude and longitude of the end point, and the variable to store the obtained distance:

    +

    Provide the latitude and longitude of the starting point, the latitude and longitude of the end point, and the variable to store the obtained distance.

     double distance;
    diff --git a/org.tizen.tutorials/html/native/location/location_tutorials_n.htm b/org.tizen.tutorials/html/native/location/location_tutorials_n.htm
    index 9eb76f3..f5b59d7 100644
    --- a/org.tizen.tutorials/html/native/location/location_tutorials_n.htm
    +++ b/org.tizen.tutorials/html/native/location/location_tutorials_n.htm
    @@ -16,7 +16,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Related Info

    @@ -35,14 +35,13 @@

    The following tutorials apply in mobile applications only:

    diff --git a/org.tizen.tutorials/html/native/location/maps_tutorial_n.htm b/org.tizen.tutorials/html/native/location/maps_tutorial_n.htm index 6f4a890..022b4ed 100644 --- a/org.tizen.tutorials/html/native/location/maps_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/location/maps_tutorial_n.htm @@ -19,7 +19,7 @@
    -

    Mobile native

    +

    Mobile native Wearable native

    @@ -52,18 +53,6 @@

    This tutorial demonstrates how you can use the map service to query geocodes and routes, and search for places.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    - -

    Warm-up

    Become familiar with the Maps Service API basics by learning about:

      @@ -105,22 +94,24 @@

      To start using the map service:

        -
      1. To use the functions and data types of the Maps Service API, include the <maps_service.h> header file in your application:

        +
      2. To use the functions and data types of the Maps Service API (in mobile and wearable applications), include the <maps_service.h> header file in your application:

         #include <maps_service.h>
         
      3. -
      4. The Maps Service instance relies on a particular map provider. To get a list of available map providers, use the maps_service_foreach_provider() function: +
      5. The Maps Service instance relies on a particular map provider. To get a list of available map providers, use the maps_service_foreach_provider() function.
        -static bool _maps_service_provider_info_cb(char* maps_provider, void* user_data)
        +static bool 
        +_maps_service_provider_info_cb(char* maps_provider, void* user_data)
         {
            // Handle the map provider name, passed as maps_provider
         
            return bool;
         }
         
        -void get_available_providers()
        +void 
        +get_available_providers()
         {
            void *user_data = NULL;
            const int error = maps_service_foreach_provider(_maps_service_provider_info_cb, user_data);
        @@ -162,7 +153,7 @@ const bool is_routing_supported = (error == MAPS_ERROR_NONE) ? supported : false
         error = maps_service_provider_is_service_supported(maps, MAPS_SERVICE_SEARCH_ROUTE_WAYPOINTS, &supported);
         const bool is_routing_waypoints_supported = (error == MAPS_ERROR_NONE) ? supported : false;
         
        -

        To check for the availability of other services, follow the same approach using the keys from the maps_service_e enumerator.

        +

        To check for the availability of other services, follow the same approach using the keys from the maps_service_e enumerator (in mobile and wearable applications).

      6. Optionally, check which data features are available for the desired services using the maps_service_provider_is_data_supported() function: @@ -191,7 +182,7 @@ if (is_route_segment_maneuvers_supported)    // Use segment maneuvers }
    -

    To check the availability of other data features, follow the same approach using the keys from the maps_service_data_e enumerator.

    +

    To check the availability of other data features, follow the same approach using the keys from the maps_service_data_e enumerator (in mobile and wearable applications).

  • Set general preferences, such as language and distance units, using the maps_service_set_preference() function:

    @@ -305,8 +296,9 @@ if (error != MAPS_ERROR_NONE)
  • Implement the __maps_service_geocode_cb() callback to receive the service response:
    -static bool __maps_service_geocode_cb(maps_error_e result, int request_id, int index, int total, 
    -                                      maps_coordinates_h coordinates, void* user_data)
    +static bool 
    +__maps_service_geocode_cb(maps_error_e result, int request_id, int index, int total, 
    +                          maps_coordinates_h coordinates, void* user_data)
     {
        // Handle the obtained coordinate data
     
    @@ -337,8 +329,9 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_service_reverse_geocode_cb() callback to receive the service response:
    -static void __maps_service_reverse_geocode_cb(maps_error_e result, int request_id, int index, int total, 
    -                                              maps_address_h address, void* user_data)
    +static void 
    +__maps_service_reverse_geocode_cb(maps_error_e result, int request_id, int index, int total, 
    +                                  maps_address_h address, void* user_data)
     {
        // Handle the obtained address
     
    @@ -407,8 +400,9 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_service_search_place_cb() callback to receive the service response:
    -static bool __maps_service_search_place_cb(maps_error_e error, int request_id, int index, int total, 
    -                                           maps_place_h place, void* user_data)
    +static bool 
    +__maps_service_search_place_cb(maps_error_e error, int request_id, int index, int total, 
    +                               maps_place_h place, void* user_data)
     {
        // Handle the obtained place data
     
    @@ -468,8 +462,9 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_service_search_route_cb() callback to receive the service response:
    -static bool __maps_service_search_route_cb(maps_error_e error, int request_id, int index, int total, 
    -                                           maps_route_h route, void* user_data)
    +static bool 
    +__maps_service_search_route_cb(maps_error_e error, int request_id, int index, int total, 
    +                               maps_route_h route, void* user_data)
     {
        // Handle the obtained route data
     
    @@ -637,7 +632,8 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_place_categories_cb() callback:
    -static bool __maps_place_categories_cb(int index, int total, maps_place_category_h category, void* user_data)
    +static bool 
    +__maps_place_categories_cb(int index, int total, maps_place_category_h category, void* user_data)
     {
        // Handle the obtained place category data
     
    @@ -673,7 +669,8 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_place_properties_cb() callback:
    -static bool __maps_place_properties_cb(int index, int total, char* key, void* value, void* user_data)
    +static bool 
    +__maps_place_properties_cb(int index, int total, char* key, void* value, void* user_data)
     {
        // Handle the obtained property:
        // property_name: key
    @@ -788,7 +785,8 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_route_path_cb() callback:
    -static bool __maps_route_path_cb(int index, int total, maps_coordinates_h coordinates, void* user_data)
    +static bool 
    +__maps_route_path_cb(int index, int total, maps_coordinates_h coordinates, void* user_data)
     {
        // Handle the obtained route path coordinates
     
    @@ -812,8 +810,8 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_route_segment_cb() callback:

    -static bool __maps_route_segment_cb(int index, int total,
    -maps_route_segment_h segment, void* user_data)
    +static bool 
    +__maps_route_segment_cb(int index, int total, maps_route_segment_h segment, void* user_data)
     {
        // Handle the obtained route segment
     
    @@ -842,7 +840,8 @@ if (error != MAPS_ERROR_NONE)
     
     
  • Implement the __maps_route_properties_cb() callback:
    -static bool __maps_route_properties_cb(int index, int total, char* key, void* value, void* user_data)
    +static bool 
    +__maps_route_properties_cb(int index, int total, char* key, void* value, void* user_data)
     {
        // Handle the obtained property:
        // property_name: key
    diff --git a/org.tizen.tutorials/html/native/messaging/email_tutorial_n.htm b/org.tizen.tutorials/html/native/messaging/email_tutorial_n.htm
    index 80a561f..e4ca1b9 100644
    --- a/org.tizen.tutorials/html/native/messaging/email_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/messaging/email_tutorial_n.htm
    @@ -18,7 +18,7 @@
     
     
    -

    Mobile native

    +

    Mobile native

    Content

    @@ -40,16 +40,7 @@

    This tutorial demonstrates how you can send email messages with attachments.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    Warm-up

    Become familiar with the Email API basics by learning about:

    @@ -78,7 +69,7 @@

    To create and send email messages:

    1. Create an email message. -

      To create an email message and receive its handle, use the email_create_message() function. The function return code informs about success or failure:

      +

      To create an email message and receive its handle, use the email_create_message() function. The function return code informs about success or failure.

      email_h msg;
       int error_code = EMAILS_ERROR_NONE;
       error_code = email_create_message(&msg);
      @@ -89,7 +80,7 @@ if (error_code != EMAILS_ERROR_NONE)
       

      One of the possible error codes that is not related to the Email module itself is EMAIL_ERROR_ACCOUNT_NOT_FOUND. This error occurs if no email account has been configured on a device.

    2. Add recipients and attachments. -

      Email recipients can be added to the email message one by one. There is no possibility to add lists of recipients in one function call. Each address has to be given as a character string and the address type (TO, CC, BCC) has to be declared:

      +

      Email recipients can be added to the email message one by one. There is no possibility to add lists of recipients in one function call. Each address has to be given as a character string and the address type (TO, CC, BCC) has to be declared.

      error_code = email_add_recipient(msg, EMAIL_RECIPIENT_TYPE_TO, "example@mail.com");
       if (error_code != EMAILS_ERROR_NONE) 
       {
      @@ -103,7 +94,7 @@ if (error_code != EMAILS_ERROR_NONE)
       }
    3. Remove recipients or attachments. -

      You can remove added recipients and attachments. In both cases, all recipients or attachments are removed at once. It is not possible to remove one selected item. As all functions from the Email API, the email_remove_all_attachments() and email_remove_all_recipients() functions inform about success or failure by the returned error code:

      +

      You can remove added recipients and attachments. In both cases, all recipients or attachments are removed at once. It is not possible to remove one selected item. As all functions from the Email API, the email_remove_all_attachments() and email_remove_all_recipients() functions inform about success or failure by the returned error code.

      error_code = email_remove_all_recipients(msg);
       if (error_code != EMAILS_ERROR_NONE) 
       {
      @@ -115,7 +106,7 @@ if (error_code != EMAILS_ERROR_NONE)
          dlog_print(DLOG_INFO, LOG_TAG, "Failed to remove attachments\n");
       }
    4. -
    5. Save the email before sending it. +
    6. Save the email before sending it:
      error_code = email_save_message(msg);
       if (error_code != EMAILS_ERROR_NONE) 
       {
      @@ -124,8 +115,9 @@ if (error_code != EMAILS_ERROR_NONE)
       
    7. Define the email sending status callback. -

      Email sending is an asynchronous operation, and thus the sending status cannot be checked directly in the return code from the email_send_message() function. To receive notifications about sending success or failure, a callback function must be defined:

      -
      static void email_send_status(email_h email, email_sending_e result, void *user_data) 
      +

      Email sending is an asynchronous operation, and thus the sending status cannot be checked directly in the return code from the email_send_message() function. To receive notifications about sending success or failure, a callback function must be defined.

      +
      static void 
      +email_send_status(email_h email, email_sending_e result, void *user_data) 
       {
          if (result == EMAIL_SENDING_FAILED) 
          {
      @@ -140,7 +132,7 @@ if (error_code != EMAILS_ERROR_NONE)
       }
    8. Send the email. -

      If the email message object is ready and the sending status callback is defined, the message can be sent:

      +

      If the email message object is ready and the sending status callback is defined, the message can be sent.

      error_code = email_set_message_sent_cb(msg, email_send_status, NULL);
       if (error_code != EMAILS_ERROR_NONE) 
       {
      @@ -152,7 +144,7 @@ if (error_code != EMAILS_ERROR_NONE)
       {
          dlog_print(DLOG_INFO, LOG_TAG, "");
       }
      -

      When the message is sent or if sending was canceled and the message is no longer needed, delete it using the email_destroy_message() function. The callback registered for the specified message must also be unset using the email_unset_message_sent_cb() callback function:

      +

      When the message is sent or if sending was canceled and the message is no longer needed, delete it using the email_destroy_message() function. The callback registered for the specified message must also be unset using the email_unset_message_sent_cb() callback function.

      error_code = email_unset_message_sent_cb(msg);
       if (error_code != EMAILS_ERROR_NONE) 
       {
      diff --git a/org.tizen.tutorials/html/native/messaging/messaging_tutorials_n.htm b/org.tizen.tutorials/html/native/messaging/messaging_tutorials_n.htm
      index af9fcc7..17c3aea 100644
      --- a/org.tizen.tutorials/html/native/messaging/messaging_tutorials_n.htm
      +++ b/org.tizen.tutorials/html/native/messaging/messaging_tutorials_n.htm
      @@ -18,7 +18,7 @@
       
       
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      diff --git a/org.tizen.tutorials/html/native/messaging/push_tutorial_n.htm b/org.tizen.tutorials/html/native/messaging/push_tutorial_n.htm index b4950bf..0d87da6 100644 --- a/org.tizen.tutorials/html/native/messaging/push_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/messaging/push_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -192,12 +192,13 @@ push_service_connection_h push_conn;

      To manage push service connections:

      1. Connect to the push service. -

        Once the connection handle is defined, use the push_service_connect() function to connect the push service:

        +

        Once the connection handle is defined, use the push_service_connect() function to connect the push service.

         #define PUSH_APP_ID "YOUR_PUSH_ID_HERE"
         
        -static bool app_create(void *data)
        +static bool 
        +app_create(void *data)
         {
            int ret;
         
        @@ -214,7 +215,7 @@ static bool app_create(void *data)
         }
         
        -

        In the above example, the application establishes a socket connection to the push service using the push_service_connect() function. The YOUR_PUSH_ID_HERE argument is the push app ID received from the Tizen push server team when the access to the server was requested. Keep this push app ID confidential, otherwise your push notifications can be hijacked by malicious applications.

        +

        In the above example, the application establishes a socket connection to the push service using the push_service_connect() function. The YOUR_PUSH_ID_HERE parameter is the push app ID received from the Tizen push server team when the access to the server was requested. Keep this push app ID confidential, otherwise your push notifications can be hijacked by malicious applications.

        The _state_cb() and _noti_cb() parameters are callback functions called when the state changes or a notification arrives from the server through the push service.

        The push_conn parameter is the output of the push_service_connect() function. If the connection between your application and the service is successful, the push_service_connect() function returns PUSH_SERVICE_ERROR_NONE and the push_conn connection handle is returned through the last parameter. If the push_service_connect() function returns other values, the connection to the service failed. This happens most likely when the push privilege is not added in the SDK.

        @@ -246,10 +247,11 @@ push_conn = NULL;
      2. If your application is not currently registered to the push server, the state transits from the INITIAL state to the UNREGISTERED state. In this case, your application can request registration to the push server through the push service using the push_service_register() function. If this request is approved by the push server, the state transits to REGISTERED.
      3. When an error occurs, the state transits to ERROR.
      4. -

        When the current state transits, the _state_cb() function is called and the new state is obtained from the first argument. The application then needs to determine its actions based on the new state:

        +

        When the current state transits, the _state_cb() function is called and the new state is obtained from the first parameter. The application then needs to determine its actions based on the new state:

        -static void _state_cb(push_service_state_e state, const char *err, void *user_data)	
        +static void 
        +_state_cb(push_service_state_e state, const char *err, void *user_data)	
         {
            switch (state)	
            {
        @@ -275,21 +277,22 @@ static void _state_cb(push_service_state_e state, const char *err, void *user_da
         }
         
        -

        In the above example, the _on_state_registered(), _on_state_unregistered(), and _on_state_error() functions contain the actions for the REGISTERED, UNREGISTERED, and ERROR states, respectively. Your application does not need to handle the INITIAL state because it is maintained internally, and this callback function is never invoked in this state. The second argument, err, is the error message from the push service when the state becomes ERROR. Consequently, only the _on_state_error() function takes this argument while others ignore it.

        +

        In the above example, the _on_state_registered(), _on_state_unregistered(), and _on_state_error() functions contain the actions for the REGISTERED, UNREGISTERED, and ERROR states, respectively. Your application does not need to handle the INITIAL state because it is maintained internally, and this callback function is never invoked in this state. The second parameter, err, is the error message from the push service when the state becomes ERROR. Consequently, only the _on_state_error() function takes this parameter while others ignore it.

      Registering with the Push Server

      To receive push notifications, your application must send a registration request to the Tizen push server. When the server receives this request, it assigns a registration ID that is unique to your application on the particular device. When sending a notification from your application server, this registration ID is used as a destination address of your application. If your application no longer needs to receive push notifications, it needs to send a deregistration request to the server.

      - +

      To register with the push server:

      1. Request registration.

        After connecting to the push service, request registration using the push_service_register() function.

        -

        The function takes 3 arguments. The first argument is the connection handle that was returned from the push_service_connect() function. The second argument is the callback function that returns the result of this registration request. The last argument is the user data to be handed over to the result callback function.

        +

        The function takes 3 parameters. The first parameter is the connection handle that was returned from the push_service_connect() function. The second parameter is the callback function that returns the result of this registration request. The last parameter is the user data to be handed over to the result callback function.

        -static void _on_state_unregistered(void *user_data) 
        +static void 
        +_on_state_unregistered(void *user_data) 
         {
            int ret;
         
        @@ -300,10 +303,11 @@ static void _on_state_unregistered(void *user_data)
         
         

        The _on_state_unregistered() function containing the push_service_register() function is called when the state transits to UNREGISTERED. This sample application is designed to send the registration request as soon as it is connected to the push service. If your application requires users to login to your service, this registration request must be sent after the login process is complete.

        -

        Note that the registration request is non-blocking. If PUSH_SERVICE_ERROR_NONE returns from the push_service_register() function, your request is successfully delivered to the push service. However, it does not necessarily mean that your request is approved by the server. If the push service successfully sends your request to the server and receives an approval, the _result_cb() callback is called with PUSH_SERVICE_RESULT_SUCCESS from the first parameter:

        +

        Note that the registration request is non-blocking. If PUSH_SERVICE_ERROR_NONE returns from the push_service_register() function, your request is successfully delivered to the push service. However, it does not necessarily mean that your request is approved by the server. If the push service successfully sends your request to the server and receives an approval, the _result_cb() callback is called with PUSH_SERVICE_RESULT_SUCCESS from the first parameter.

        -static void _result_cb(push_service_result_e result, const char *msg, void *user_data) 
        +static void 
        +_result_cb(push_service_result_e result, const char *msg, void *user_data) 
         {
            if (result == PUSH_SERVICE_RESULT_SUCCESS)
               dlog_print(DLOG_INFO, LOG_TAG, "Registration request is approved.");
        @@ -314,7 +318,7 @@ static void _result_cb(push_service_result_e result, const char *msg, void *user
         }
         
        -

        When an error occurs in the middle of the registration process, the reason is returned from the first parameter of the callback. For example, if the push server is not responding, the push_service_register() function returns PUSH_SERVICE_ERROR_NONE (because delivery to the service is successful), but the _result_cb() function is called later with PUSH_RESULT_TIMEOUT. In this case, your application does not need to request registration again because the push service keeps the previous request and sends it when the network becomes online. The msg argument is the error message from the push service if the request fails.

        +

        When an error occurs in the middle of the registration process, the reason is returned from the first parameter of the callback. For example, if the push server is not responding, the push_service_register() function returns PUSH_SERVICE_ERROR_NONE (because delivery to the service is successful), but the _result_cb() function is called later with PUSH_RESULT_TIMEOUT. In this case, your application does not need to request registration again because the push service keeps the previous request and sends it when the network becomes online. The msg parameter is the error message from the push service if the request fails.

      2. @@ -331,7 +335,8 @@ static void _result_cb(push_service_result_e result, const char *msg, void *user
        -static void _on_state_registered(void *user_data) 
        +static void 
        +_on_state_registered(void *user_data) 
         {
            int ret;
            char *reg_id = NULL;
        @@ -346,6 +351,7 @@ static void _on_state_registered(void *user_data)
            if (ret != PUSH_SERVICE_ERROR_NONE)	
            {
               dlog_print(DLOG_ERROR, LOG_TAG, "ERROR [%d]: push_service_get_registration_id()", ret);
        +
               return;
            }
         
        @@ -369,7 +375,8 @@ static void _on_state_registered(void *user_data)
         #include <openssl/sha.h>
         #define PUSH_HASH_KEY "existing_push_reg_id"
         
        -static void _send_reg_id_if_necessary(const char *reg_id)
        +static void 
        +_send_reg_id_if_necessary(const char *reg_id)
         {
            unsigned char md[SHA_DIGEST_LENGTH];
            char hash_string[2*SHA_DIGEST_LENGTH+1];
        @@ -413,13 +420,13 @@ static void _send_reg_id_if_necessary(const char *reg_id)
         
      3. Request deregistration. -

        When your application no longer wants to receive push notifications, use the following function to request deregistration:

        +

        When your application no longer wants to receive push notifications, use the following function to request deregistration.

         push_service_deregister(push_conn, _dereg_result_cb, NULL);
         
        -

        This function is non-blocking. If PUSH_SERVICE_ERROR_NONE returns from this function, the request is successfully received by the push service. The result of this request is returned in the _dereg_result_cb() callback function. The third argument is the pointer to the user data which is handed over to the result function.

        +

        This function is non-blocking. If PUSH_SERVICE_ERROR_NONE returns from this function, the request is successfully received by the push service. The result of this request is returned in the _dereg_result_cb() callback function. The third parameter is the pointer to the user data which is handed over to the result function.

        Note that the push_service_deregister() function is not used, if the application is intended to receive push notifications while being installed. If the application is uninstalled, the push service detects the event and deregisters the application automatically. In contrast, if the application wants to receive push notifications only when a user logs in, the push_service_deregister() function must be called whenever a user logs out.

      4. @@ -446,42 +453,42 @@ push_service_deregister(push_conn, _dereg_result_cb, NULL); 00 US East - https://useast.push.samsungosp.com:8088/spp/pns/api/push + https://useast.push.samsungosp.com:8088/spp/pns/api/push 01 US West - https://uswest.push.samsungosp.com:8088/spp/pns/api/push + https://uswest.push.samsungosp.com:8088/spp/pns/api/push 02 Asia Pacific Southeast - https://apsoutheast.push.samsungosp.com:8088/spp/pns/api/push + https://apsoutheast.push.samsungosp.com:8088/spp/pns/api/push 03 EU West - https://euwest.push.samsungosp.com:8088/spp/pns/api/push + https://euwest.push.samsungosp.com:8088/spp/pns/api/push 04 Asia Pacific Northeast - https://apnortheast.push.samsungosp.com:8088/spp/pns/api/push + https://apnortheast.push.samsungosp.com:8088/spp/pns/api/push 05 Korea - https://apkorea.push.samsungosp.com:8088/spp/pns/api/push + https://apkorea.push.samsungosp.com:8088/spp/pns/api/push> 06 China - https://apchina.push.samsungosp.com.cn:8088/spp/pns/api/push + https://apchina.push.samsungosp.com.cn:8088/spp/pns/api/push 7C Staging (AP Northeast) - https://175.41.248.50:8088/spp/pns/api/push + https://175.41.248.50:8088/spp/pns/api/push @@ -502,33 +509,33 @@ push_service_deregister(push_conn, _dereg_result_cb, NULL); action - ALERT: Store the message and alert the user. -

        SILENT: Store the message without alerting the user.

        -

        DISCARD: Discard the message.

        -

        LAUNCH: Forcibly launch the app and deliver the notification.

        + ALERT: Store the message and alert the user. +

        SILENT: Store the message without alerting the user.

        +

        DISCARD: Discard the message.

        +

        LAUNCH: Forcibly launch the app and deliver the notification.

        Action to be performed if the application is not running. If action is not included, the default behavior is SILENT. alertMessage Up to 127 bytes - Alert message shown to the user in the quick panel. If the action is not set as ALERT, this value is meaningless. + Alert message shown to the user in the quick panel. If the action is not set as ALERT, this value is meaningless. badgeOption - INCREASE: Increase the badge number by the given value. -

        DECREASE: Decrease the badge number by the given value.

        -

        SET: Set badge number to the given value.

        - Option for updating the icon badge number. If the action is set as DISCARD, the badgeOption is ignored. If it is not included, the icon badge number remains unchanged. + INCREASE: Increase the badge number by the given value. +

        DECREASE: Decrease the badge number by the given value.

        +

        SET: Set badge number to the given value.

        + Option for updating the icon badge number. If the action is set as DISCARD, the badgeOption is ignored. If it is not included, the icon badge number remains unchanged. - badgeNumber + badgeNumber 0-999 - -

        For example, to show a "Hi" message in the quick panel and increase the badge count by 1 when the notification arrives at the device, the message field of the notification must be as follows:

        +

        For example, to show a "Hi" message in the quick panel and increase the badge count by 1 when the notification arrives at the device, the message field of the notification must be the following:

        "badgeOption=INCREASE&badgeNumber=1&action=ALERT&alertMessage=Hi"
        @@ -677,7 +684,8 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
      5. Example response

        If the push server receives a notification request, the server returns a JSON string that contains the regID, requestID, status code, and status message. If the request contains a malformed JSON format, requests are not processed and are returned without the regID and requestID values. If the request is of the JSON format but has invalid data, no requests are processed and are considered as an error. This return message only shows whether receiving notification request was successful. This return message does not deal with whether the push client receives the notification. The order of the return message is the same as the request message order.

        - +
          +
        • The following example is shown if the request is successful:

           {
          @@ -690,6 +698,8 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
              }]
           }
           
          +
        • +
        • The following example is shown if the request fails due to malformation:

           {
          @@ -701,7 +711,10 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
                 "statusMsg":"error of json mapping exception"
              }]
           }
          -

          The following example is shown if the request fails due to abnormal data:

          +
      +
    9. +
    10. +

      The following example is shown if the request fails due to abnormal data:

       {
          "results":
      @@ -717,6 +730,8 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
       
       
    11. + +

      Handling Push Notifications

      @@ -726,10 +741,11 @@ appSecret: dYo/o/m11gmWmjs7+5f+2zLNVOc=
      • Receive notifications when the application is running. -

        When a notification arrives to your application while it is running (precisely, your application is connected to the service), the _noti_cb() function is called as defined in the push_service_connect() function. In this callback function, you can handle the received notification. The following example shows how your application can retrieve the app data (payload), message, and timestamp from the received notification:

        +

        When a notification arrives to your application while it is running (precisely, your application is connected to the service), the _noti_cb() function is called as defined in the push_service_connect() function. In this callback function, you can handle the received notification. The following example shows how your application can retrieve the app data (payload), message, and timestamp from the received notification.

        -static void _noti_cb(push_service_notification_h noti, void *user_data)
        +static void 
        +_noti_cb(push_service_notification_h noti, void *user_data)
         {
            int ret;
         
        @@ -792,7 +808,8 @@ static void _noti_cb(push_service_notification_h noti, void *user_data)
         

        -static void app_control(app_control_h app_control, void *data)
        +static void 
        +app_control(app_control_h app_control, void *data)
         {
            char *op = NULL;
            push_service_notification_h noti = NULL;
        @@ -823,7 +840,7 @@ static void app_control(app_control_h app_control, void *data)
         }
         
        -

        When you create your project in the SDK, the app_control() function is created automatically. When your application is launched by the push service, all related information regarding this launch request is delivered through the app_control argument. From this handle, retrieve the op operation using the app_control_get_operation() function. With app_control and op, retrieve the notification data using the push_service_app_control_to_noti_data() function. If your application is not launched by the push service, this function returns as NULL.

        +

        When you create your project in the SDK, the app_control() function is created automatically. When your application is launched by the push service, all related information regarding this launch request is delivered through the app_control parameter. From this handle, retrieve the op operation using the app_control_get_operation() function. With app_control and op, retrieve the notification data using the push_service_app_control_to_noti_data() function. If your application is not launched by the push service, this function returns as NULL.

        For the second option, you need to set the action to ALERT or SILENT in the message field when sending the notification from the application server. When such a notification arrives at the device, the push service keeps the notification in the database and waits for the request from the application. The difference of the 2 options is that the former shows the alert message in the quick panel and changes the badge count while the latter does not. If the user clicks the message in the quick panel, the push service forcibly launches the application and delivers the notification through the app control callback function as in the first option.

        @@ -832,7 +849,7 @@ static void app_control(app_control_h app_control, void *data)
      • Request unread notifications. -

        If the user does not launch the application from the quick panel, the application requests the unread notifications after start-up using the push_service_request_unread_notification() function as already introduced. The synchronous request using the push_service_get_unread_notification() function is shown below: +

        If the user does not launch the application from the quick panel, the application requests the unread notifications after start-up using the push_service_request_unread_notification() function as already introduced. The synchronous request using the push_service_get_unread_notification() function is shown in the following example.

        @@ -888,4 +905,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga
         
         
          
        -
        +
        \ No newline at end of file
        diff --git a/org.tizen.tutorials/html/native/messaging/sms_mms_tutorial_n.htm b/org.tizen.tutorials/html/native/messaging/sms_mms_tutorial_n.htm
        index b8c3350..6da67e9 100644
        --- a/org.tizen.tutorials/html/native/messaging/sms_mms_tutorial_n.htm
        +++ b/org.tizen.tutorials/html/native/messaging/sms_mms_tutorial_n.htm
        @@ -18,7 +18,7 @@
         
         
        -

        Mobile native Wearable native

        +

        Mobile native Wearable native

        Content

        @@ -62,7 +62,7 @@ #include <messages.h>
      • The Messages service works like a client-service architecture. In this architecture, a Tizen application is the client side and has to connect to the service before using the Messages API.

        -

        Establish a connection using the messages_open_service(messages_service_h *service) function:

        +

        Establish a connection using the messages_open_service(messages_service_h *service) function.

        static messages_service_h service_handle = NULL;
         int error_code;
        @@ -83,11 +83,11 @@ service_handle = NULL;

    To fetch messages from a message box, use the messages_foreach_message() function with the appropriate parameters. One of these parameters is the callback function called for each message matching the search criteria.

    +

    To fetch messages:

    +
    1. Define the message searching callback function. -
      1. -

        The callback function signature has to match the following typedef:

        -
        typedef bool(* messages_search_cb)(messages_message_h msg, int index, int result_count, int total_count, void *user_data)
      2. -
      3. Within the callback, to print the message content (or to show it to the user in any other way), extract its text, address, and type as below:

        +
          +
        1. Within the callback, to print the message content (or to show it to the user in any other way), extract its text, address, and type as in the following example:

          char *message = NULL, *address = NULL;
           messages_recipient_type_e rtype;
           int error_code = MESSAGES_ERROR_NONE;
          @@ -133,7 +133,7 @@ free(address);
      4. Keyword (for searching based on text and subject)
      5. Address (message recipient address)
      6. -

        The following example shows a simple search for all SMS messages in all message boxes with a callback function named message_search_callback:

        +

        The following example shows a simple search for all SMS messages in all message boxes with a callback function named message_search_callback.

        int error_code;
         error_code = messages_open_service(&service_handle);
         if (error_code != MESSAGES_ERROR_NONE) 
        @@ -154,10 +154,11 @@ messages_close_service(service_handle);

      Sending SMS or MMS Messages

      -

      The Messaging API provides functions to send SMS (Short Message Service) messages and MMS (Multimedia Message Service) messages with attachments (image or video files):

      +

      The Messaging API supports SMS (Short Message Service) messages and MMS (Multimedia Message Service) messages with attachments (image or video files).

      +

      To send a message:

      1. Create a message.

        Before sending a message, open a connection to the messaging service.

        -

        To create an SMS or an MMS message, use the messages_create_message() function. Specify the message type (MESSAGES_TYPE_SMS or MESSAGES_TYPE_MMS) when creating the message. The following example creates an SMS message:

        +

        To create an SMS or an MMS message, use the messages_create_message() function. Specify the message type (MESSAGES_TYPE_SMS or MESSAGES_TYPE_MMS) when creating the message. The following example creates an SMS message.

        int error_code;
         messages_message_h msg_hndl = NULL;
         
        @@ -168,7 +169,7 @@ if (error_code != MESSAGES_ERROR_NONE)
            dlog_print(DLOG_DEBUG, LOG_TAG, "Failed to create message");
         }
      2. Define the recipients and message body. -

        Functions for setting the recipient address and the message body (the message text) are the same for SMS and MMS, but in this case the message type specification is not needed:

        +

        Functions for setting the recipient address and the message body (the message text) are the same for SMS and MMS, but in this case the message type specification is not needed.

        error_code = messages_add_address(msg_hndl, "123456789", MESSAGES_RECIPIENT_TO);
         if (error_code != MESSAGES_ERROR_NONE) 
         {
        @@ -182,13 +183,13 @@ if (error_code != MESSAGES_ERROR_NONE)
         }
      3. Set a subject and add an attachment (note that sending MMS is not supported on the Emulator). -
        • You can set a message subject and add attachments to MMS messages. Set the subject:

          +
          • Set a message subject to a MMS message:

            error_code = messages_mms_set_subject(msg_hndl, "MMS test");
             if (error_code != MESSAGES_ERROR_NONE) 
             {
                dlog_print(DLOG_DEBUG, LOG_TAG, "Failed to set MMS subject");
             }
          • -
          • Add attachments to the MMS message with their absolute path in the device file system. When adding the attachment, give the attachment type. Possible attachment types are image, audio, and video:

            +
          • Add attachments to the MMS message with their absolute path in the device file system. When adding the attachment, give the attachment type. Possible attachment types are image, audio, and video.

            error_code = messages_mms_add_attachment(g_message, MESSAGES_MEDIA_IMAGE, "/path/to/image/file");
             if (error_code != MESSAGES_ERROR_NONE) 
             {
            @@ -196,10 +197,10 @@ if (error_code != MESSAGES_ERROR_NONE)
             }
        • Send the message. -
          1. SMS and MMS sending is an asynchronous operation, and a callback function is needed to receive the sending operation status. This function has to match the following typedef:

            -
            typedef void(* messages_sent_cb)(messages_sending_result_e result, void *user_data)
          2. +
            1. Using the first parameter in the callback (result), the messaging service informs you about the sending status. It can be used to determine whether the sending succeeded:

              -
              static void sent_msg_cb(messages_sending_result_e result, void *user_data)
              +
              static void 
              +sent_msg_cb(messages_sending_result_e result, void *user_data)
               {
                  if (MESSAGES_SENDING_SUCCEEDED == result) 
                  {
              diff --git a/org.tizen.tutorials/html/native/multimedia/audio_io_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/audio_io_tutorial_n.htm
              index 958cc76..1c9bbd0 100644
              --- a/org.tizen.tutorials/html/native/multimedia/audio_io_tutorial_n.htm
              +++ b/org.tizen.tutorials/html/native/multimedia/audio_io_tutorial_n.htm
              @@ -18,7 +18,7 @@
               
               
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Content

              diff --git a/org.tizen.tutorials/html/native/multimedia/camera_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/camera_tutorial_n.htm index 063ec8f..979b4b5 100644 --- a/org.tizen.tutorials/html/native/multimedia/camera_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/camera_tutorial_n.htm @@ -18,13 +18,13 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Content

            2. +
            -
          3. -

            Setting the Display for Camera Preview

            -

            In order to display camera preview to the screen, need to check settings for camera display.

            -

            Camera Framework already provided proper display with default setting. Applications don't have to invoke display setting. However, if some applications want to use own display setting, you refer this page for intended display setting.

            -
              -
            1. Camera Device Location -

              To display camera preview to the screen, you need to check device location.

              -

              This location of camera device depends on the hardware device.

              -
              +

              Setting the Display for the Camera Preview

              + +

              To display the camera preview on the screen, you must check the camera display settings.

              +

              The Camera framework provides a proper display with the default settings, so the applications have no need usually to invoke the display settings. However, if you want to use your own display settings, use the following information:

              + +
                +
              • To set the camera device location: + +

                To display the camera preview on the screen, you need to check the device location. The camera device location depends on the hardware device.

                + +
                 typedef enum
                 {
                -    CAMERA_DEVICE_CAMERA0 = 0, /**< Primary camera*/
                -    CAMERA_DEVICE_CAMERA1      /**< Secondary camera*/
                +   CAMERA_DEVICE_CAMERA0 = 0, // Primary camera
                +   CAMERA_DEVICE_CAMERA1 // Secondary camera
                 } camera_device_e;
                -				
                -
              • -
              • Camera Device Orientation
              • -

                To consider proper display, you must think the physical lens orientation and location.

                -

                If the facing direction of camera is opposite to the display, camear device orientation is calculated clockwise. If the facing direction of camera is same direction to the display, camera device orientation is calculated counterclockwise.

                -
                +
                + + + +
              • To set the camera device orientation: +

                For a proper display, you must think about the physical lens orientation and location.

                +

                If the facing direction of the camera is opposite to the display, the camera device orientation is calculated clockwise. If the facing direction of the camera is the same direction as the display, the camera device orientation is calculated counter-clockwise.

                + +
                 int angle = 0;
                 int error_code = 0;
                -error_code = camera_attr_get_lens_orientation(cam_data.g_camera, &angle);
                -		 		
                -

                If your camera device is opposite to the display, the right side is 90 degrees and If it is same as the display direction, right side is 270 degrees

                -

                The returned value of "angle" is degress

                -
              • Default display settings
              • -

                Camera display settings are already set internally. For example, the Sencondary camera is already set flip for supporting mirror mode.

                -

                If application sets any other values with camera_set_display_rotation, camera_get_display_flip, these default values will be changed.

                -

                Therefore, remind that these valuses should be get the default display right after initializing the camera

                -
                +
                +error_code = camera_attr_get_lens_orientation(cam_data.g_camera, &angle);
                +
                + +

                If your camera device is opposite to the display, the right side is 90 degrees, and if it is on the display direction, the right side is 270 degrees.

                +

                The returned value of the angle variable is degrees.

                + + +
              • To set the default display settings: + +

                The camera display settings are already set internally. For example, the secondary camera is already set flipped for supporting the mirror mode.

                +

                If you set any other values with the camera_set_display_rotation() or camera_get_display_flip() functions, the default values are changed. Therefore, remember that these values are retrieved for the default display right after initializing the camera.

                + +
                 camera_rotation_e rotation = 0;
                 camera_flip_e flip = 0
                 int error_code = 0;
                -//To get default display rotation value
                -error_code = camera_get_display_rotation(cam_data.g_camera, &rotation);
                -//To get default display flip value
                -error_code = camera_get_display_flip(cam_data.g_camera, &flip);
                -		 		
                -
              • Display Rotation
              • -

                The recommended display rotation can be calculated like below

                -
                +
                +// To get the default display rotation value
                +error_code = camera_get_display_rotation(cam_data.g_camera, &rotation);
                +
                +// To get the default display flip value
                +error_code = camera_get_display_flip(cam_data.g_camera, &flip);
                +
                + +
              • To set the display rotation: +

                The recommended display rotation can be calculated as follows:

                + +
                 int lens_orientation = 0;
                 int error_code = 0;
                 camera_rotation_e display_rotation = CAMERA_ROTATION_NONE;
                 int display_rotation_angle = 0;
                 
                -// To get recommanded display rotation value
                -error_code = camera_attr_get_lens_orientation (cam_data.g_camera, &lens_orientation);
                +// To get the recommended display rotation value
                +error_code = camera_attr_get_lens_orientation (cam_data.g_camera, &lens_orientation);
                 display_rotation_angle = (360 - lens_orientation) % 360;
                 
                -// To convert to enum type and set display rotation
                -switch(display_rotation_angle) {
                -    case   0: display_rotation = CAMERA_ROTATION_NONE; break;
                -    case  90: display_rotation = CAMERA_ROTATION_90; break;
                -    case 180: display_rotation = CAMERA_ROTATION_180; break;
                -    case 270: display_rotation = CAMERA_ROTATION_270; break;
                -    default : display_rotation = CAMERA_ROTATION_NONE; break;
                +// To convert to enum type and set the display rotation
                +switch (display_rotation_angle) 
                +{
                +   case   0: display_rotation = CAMERA_ROTATION_NONE; break;
                +   case  90: display_rotation = CAMERA_ROTATION_90; break;
                +   case 180: display_rotation = CAMERA_ROTATION_180; break;
                +   case 270: display_rotation = CAMERA_ROTATION_270; break;
                +   default : display_rotation = CAMERA_ROTATION_NONE; break;
                 }
                +
                 error_code = camera_set_display_rotation(cam_data.g_camera, display_rotation);
                -		 	 	
                -
              • Display Flip
              • -

                According to the camera facing direction, you need to select flip api.

                -

                Because the display flip api runs after display rotation api, you need to remind calculation carefully with camera facing direction.

                -
                -//If the facing direction of camera is same as display module, it is needed to apply flip for front camera, because of mirror effect
                +
                + +
              • To set the display flip: +

                According to the camera facing direction, you need to select the flip API. Because the display flip API runs after the display rotation API, you need to define the calculation carefully taking account of the camera facing direction.

                + +
                +// If the facing direction of camera is the same as display, apply flip for the front camera because of the mirror effect
                 int lens_orientation = 0;
                 int error_code = 0;
                 camera_flip_e camera_default_flip = MM_FLIP_NONE;
                 
                -// To get recommanded display rotation value
                -error_code = camera_attr_get_lens_orientation (cam_data.g_camera, &lens_orientation);
                +// To get the recommended display rotation value
                +error_code = camera_attr_get_lens_orientation (cam_data.g_camera, &lens_orientation);
                 display_rotation_angle = (360 - lens_orientation) % 360;
                 
                -// To set mirror display
                -if (display_rotation_angle == 90 || display_rotation_angle == 270) {
                -    camera_default_flip = MM_FLIP_VERTICAL;
                -} else {
                -    camera_default_flip = MM_FLIP_HORIZONTAL;
                +// To set the mirror display
                +if (display_rotation_angle == 90 || display_rotation_angle == 270) 
                +{
                +   camera_default_flip = MM_FLIP_VERTICAL;
                +} 
                +else 
                +{
                +   camera_default_flip = MM_FLIP_HORIZONTAL;
                 }
                 
                -// To set display flip
                +// To set the display flip
                 error_code = camera_set_display_flip(cam_data.g_camera, camera_default_flip);
                -  
                -
            - - - - - - - - - -
            Note
            In case of an overlay surface, when the device orientation changes, the displayed camera preview does not rotate automatically. If you want to change the display orientation according to the device orientation, use the camera_set_display_rotation() function within the app_device_orientation_cb() callback function used by the application. - In case of an Evas surface, the Evas object for camera display is rotated by the window manager used by the application, not by the camera_set_display_rotation() function. function.
            -
          4. +
    +
  • + + + + + + + + + + + +
    Note
    In case of an overlay surface, when the device orientation changes, the displayed camera preview does not rotate automatically. If you want to change the display orientation according to the device orientation, use the camera_set_display_rotation() function within the app_device_orientation_cb() callback function used by the application. +

    In case of an Evas surface, the Evas object for the camera display is rotated by the window manager used by the application, not by the camera_set_display_rotation() function.

    Taking a Photo

    diff --git a/org.tizen.tutorials/html/native/multimedia/image_util_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/image_util_tutorial_n.htm index 13e5a49..ffcdd1f 100644 --- a/org.tizen.tutorials/html/native/multimedia/image_util_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/image_util_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/multimedia/media_codec_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/media_codec_tutorial_n.htm index 2a63f76..3daf961 100644 --- a/org.tizen.tutorials/html/native/multimedia/media_codec_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/media_codec_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/multimedia/media_controller_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/media_controller_tutorial_n.htm index 99580e3..cdcbcd3 100644 --- a/org.tizen.tutorials/html/native/multimedia/media_controller_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/media_controller_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/multimedia/media_tools_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/media_tools_tutorial_n.htm index a56d1df..e4c1731 100644 --- a/org.tizen.tutorials/html/native/multimedia/media_tools_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/media_tools_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/multimedia/media_vision_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/media_vision_tutorial_n.htm index c2e109f..362879c 100644 --- a/org.tizen.tutorials/html/native/multimedia/media_vision_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/media_vision_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -65,8 +65,10 @@
  • For barcode generation:
    1. Create a structure to store the global data with the bargendata_s structure: +
      -typedef struct _bargendata_s
      +typedef struct 
      +_bargendata_s
       {
          // Generate the variables to store barcode information
          mv_barcode_type_e type;
      @@ -86,22 +88,20 @@ typedef struct _bargendata_s
       static bargendata_s bargendata;
       
    2. -
    3. Configure the barcode generation engine with the mv_create_engine_config() function. The function configures an engine attribute with default values: - -
      • The MV_BARCODE_GENERATE_ATTR_TEXT attribute defines the generation with text using the mv_barcode_generate_attr_text_e enumerator (in mobile and wearable applications). The default value is MV_BARCODE_GENERATE_ATTR_TEXT_INVISIBLE.
      - +
    4. Configure the barcode generation engine with the mv_create_engine_config() function. The function configures an engine attribute with default values.
       int error_code = 0;
      -
      + 
       error_code = mv_create_engine_config(&bargendata.g_engine_cfg);
       if (error_code != MEDIA_VISION_ERROR_NONE)
       {
          dlog_print(DLOG_ERROR, LOG_TAG, "error code = %d", error_code);
       }
       
      +

      For example, use the MV_BARCODE_GENERATE_ATTR_TEXT attribute to define whether the barcode is generated with text. The possible values are listed in the mv_barcode_generate_attr_text_e enumerator (in mobile and wearable applications). The default value is MV_BARCODE_GENERATE_ATTR_TEXT_INVISIBLE.

    - +
  • For barcode detection:
    1. Include the <camera.h> header file to handle camera preview images: @@ -111,7 +111,8 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
    2. Create a structure to store the global data with the bardetdata_s structure:
      -typedef struct _bardetdata_s
      +typedef struct 
      +_bardetdata_s
       {
          // Generate the variables for the camera display
          Evas_Object *win;
      @@ -142,10 +143,7 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
       }
       
    3. -
    4. Configure the barcode detection engine with the mv_create_engine_config() function. The function configures an engine attribute with default values: - -
      • The MV_BARCODE_DETECT_ATTR_TARGET attribute defines the detection target using the mv_barcode_detect_attr_target_e enumerator (in mobile and wearable applications). The default value is MV_BARCODE_DETECT_ATTR_TARGET_ALL.
      - +
    5. Configure the barcode detection engine with the mv_create_engine_config() function. The function configures an engine attribute with default values.
       int error_code = 0;
       
      @@ -155,6 +153,7 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
          dlog_print(DLOG_ERROR, LOG_TAG, "error code = %d", error_code);
       }
       
      +

      For example, use the MV_BARCODE_DETECT_ATTR_TARGET attribute to define the detection target. The possible values are listed in the mv_barcode_detect_attr_target_e enumerator (in mobile and wearable applications). The default value is MV_BARCODE_DETECT_ATTR_TARGET_ALL.

    6. To provide camera preview images, create the camera handle, set the display and preview callback, and start the camera preview:
      @@ -312,6 +311,7 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
       
  • +
  • To release the g_engine_cfg handle, use the mv_destroy_engine_config() function:
     error_code = mv_destroy_engine_cfg(bargendata.g_engine_cfg);
    @@ -321,7 +321,6 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
     }
     
  • -
  • @@ -332,7 +331,8 @@ if (error_code != MEDIA_VISION_ERROR_NONE)
  • Fill the g_source source handle with the media packet using the mv_source_fill_by_media_packet() function.

    Use the media packet, because the camera preview images can be received through the _camera_media_packet_preview_cb() callback function as a media packet handle.

    -static void _camera_media_packet_preview_cb (media_packet_h pkt, void *user_data)
    +static void 
    +_camera_media_packet_preview_cb (media_packet_h pkt, void *user_data)
     {
        mv_rectangle_s mv_roi = { {0,0}, bardetdata.width, bardetdata.height};
     
    @@ -369,12 +369,10 @@ static void _camera_media_packet_preview_cb (media_packet_h pkt, void *user_data
     
  • Implement the _barcode_detected_cb() callback function, which is triggered when a barcode is detected.

    In the callback, when the number of detected barcodes is more than zero, print the number of detected barcodes and their messages. The used source must be cleared to use the next preview image.

    -static void _barcode_detected_cb (mv_source_h source,
    -mv_engine_config_h engine_cfg, const mv_quadrangle_s *barcode_locations, 
    -const char *message[],
    -const mv_barcode_type_e *types,
    -int number_of_barcodes,
    -void *user_data)
    +static void 
    +_barcode_detected_cb(mv_source_h source, mv_engine_config_h engine_cfg, 
    +                     const mv_quadrangle_s *barcode_locations, const char *message[], 
    +                     const mv_barcode_type_e *types, int number_of_barcodes, void *user_data)
     {
        int i = 0;
        char type[50] = {‘\0};
    diff --git a/org.tizen.tutorials/html/native/multimedia/metadata_editor_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/metadata_editor_tutorial_n.htm
    index 133ca3a..4b30616 100644
    --- a/org.tizen.tutorials/html/native/multimedia/metadata_editor_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/multimedia/metadata_editor_tutorial_n.htm
    @@ -18,7 +18,7 @@
     
     
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -39,16 +39,6 @@

    Metadata Editor: Editing Metadata from an Input Audio File

    This tutorial demonstrates how you can edit metadata in audio files.

    - - - - - - - - - -
    Note
    The metadata editor can only be used with audio files. It is not supported in the image and video files.

    Warm-up

    @@ -60,6 +50,17 @@
  • Editing Metadata and Artwork

    Create a metadata editor handle, bind the handle with the file, edit metadata and artwork, and apply to the file.

  • + + + + + + + + + + +
    Note
    The metadata editor can only be used with audio files. It is not supported in the image and video files.

    Initializing the Metadata Editor

    diff --git a/org.tizen.tutorials/html/native/multimedia/metadata_extractor_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/metadata_extractor_tutorial_n.htm index 2702b75..dccd814 100644 --- a/org.tizen.tutorials/html/native/multimedia/metadata_extractor_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/metadata_extractor_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -52,9 +52,6 @@

    Create a metadata extractor handle, bind the handle with the file, and get metadata, artwork, lyrics, and frames.

  • - -

    Initializing the Metadata Extractor

    - @@ -65,6 +62,9 @@
    + +

    Initializing the Metadata Extractor

    +

    To initialize the metadata extractor:

      diff --git a/org.tizen.tutorials/html/native/multimedia/multimedia_tutorials_n.htm b/org.tizen.tutorials/html/native/multimedia/multimedia_tutorials_n.htm index cbbd90a..00a0a03 100644 --- a/org.tizen.tutorials/html/native/multimedia/multimedia_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/multimedia_tutorials_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -55,7 +55,7 @@

      The following tutorials apply in mobile applications only:

      diff --git a/org.tizen.tutorials/html/native/multimedia/player_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/player_tutorial_n.htm index 094ce06..d8e4ed4 100644 --- a/org.tizen.tutorials/html/native/multimedia/player_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/player_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      diff --git a/org.tizen.tutorials/html/native/multimedia/radio_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/radio_tutorial_n.htm index cdfd816..bf96c0e 100644 --- a/org.tizen.tutorials/html/native/multimedia/radio_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/radio_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      diff --git a/org.tizen.tutorials/html/native/multimedia/recorder_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/recorder_tutorial_n.htm index 69bcde1..e793672 100644 --- a/org.tizen.tutorials/html/native/multimedia/recorder_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/recorder_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      diff --git a/org.tizen.tutorials/html/native/multimedia/screen_mirroring_tutorial_n.htm b/org.tizen.tutorials/html/native/multimedia/screen_mirroring_tutorial_n.htm index 343bddb..4e3d9e9 100644 --- a/org.tizen.tutorials/html/native/multimedia/screen_mirroring_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/multimedia/screen_mirroring_tutorial_n.htm @@ -11,14 +11,14 @@ - Screen Mirroring Sink: Mirroring Screen and Sound + Screen Mirroring: Mirroring Screen and Sound
      -

      Screen Mirroring Sink: Mirroring Screen and Sound

      +

      Screen Mirroring: Mirroring Screen and Sound

      This tutorial demonstrates how you can mirror the device screen and sound to another device wirelessly as a sink.

      - - - - - - - - - -
      Note
      This feature is supported in mobile applications only.
      +

      This feature is supported in mobile applications only.

      Warm-up

      -

      Become familiar with Screen Mirroring Sink API basics by learning about:

      +

      Become familiar with Screen Mirroring API basics by learning about:

    @@ -202,7 +200,7 @@ int bt_onoff_operation(void)

    To communicate with other devices using Bluetooth, learn how to check the Bluetooth adapter state:

    -
    1. Check, whether the Bluetooth adapter is enabled on your device: +
      1. Check whether the Bluetooth adapter is enabled on your device:
        bt_adapter_state_e adapter_state;
          
         // Check whether the Bluetooth Service is enabled
        @@ -227,7 +225,8 @@ if (adapter_state == BT_ADAPTER_DISABLED)
         
         bt_error_e ret;
         
        -void adapter_state_changed_cb(int result, bt_adapter_state_e adapter_state, void* user_data) 
        +void 
        +adapter_state_changed_cb(int result, bt_adapter_state_e adapter_state, void* user_data) 
         {
            if (result != BT_ERROR_NONE) 
            {
        @@ -273,7 +272,7 @@ void adapter_state_changed_cb(int result, bt_adapter_state_e adapter_state, void
               dlog_print(DLOG_INFO, LOG_TAG, "[adapter_state_changed_cb] Bluetooth is disabled!");
               // When you try to get device information
               // by invoking bt_adapter_get_name(), bt_adapter_get_address(), or bt_adapter_get_visibility(), 
        -      // BT_ERROR_NOT_ENABLED will occur
        +      // BT_ERROR_NOT_ENABLED occurs
            }
         }
         ret = bt_adapter_set_state_changed_cb(adapter_state_changed_cb, NULL);
        @@ -287,22 +286,13 @@ if (ret != BT_ERROR_NONE)
          

        Finding Other Devices

        To find remote Bluetooth devices either through device discovery or querying bonded devices:

        - -

        Defining and Registering the Discovery State Callback Function

        +
          +
        • Define and register the discovery state callback function. +
            +
          1. Discovering available Bluetooth-enabled devices is the first step to communicating with remote devices. There are 2 types of Bluetooth devices: classic Bluetooth devices and Bluetooth LE devices. Both device types use their own APIs to discover devices of the same type.

            -

            Define a callback with the following function signature to get information about a specific device type:

            -
            typedef void(* bt_adapter_device_discovery_state_changed_cb)(int result, 
            -                                                             bt_adapter_device_discovery_state_e discovery_state, 
            -                                                             bt_adapter_device_discovery_info_s *discovery_info,
            -                                                             void *user_data);
            -typedef void (*bt_adapter_le_device_discovery_state_changed_cb)(int result, 
            -                                                                bt_adapter_le_device_discovery_state_e discovery_state,
            -                                                                bt_adapter_le_device_discovery_info_s *discovery_info,
            -                                                                void *user_data);
            -
            -

            The first parameter, result, specifies the result of the bt_adapter_start_device_discover() or bt_adapter_stop_device_discovery() function in classic Bluetooth, or the bt_adapter_le_start_discover_device() or bt_adapter_le_stop_device_discovery() function in Bluetooth LE.

            -

            This discovery start functions for the 2 types are declared as follows:

            +

            Declare the discovery start functions for the 2 types.

            // Classic Bluetooth
             int bt_adapter_start_device_discovery(void);
             int bt_adapter_stop_device_discovery(void);
            @@ -311,57 +301,20 @@ int bt_adapter_stop_device_discovery(void);
             int bt_adapter_le_start_device_discovery(void);
             int bt_adapter_le_stop_device_discovery(void);
             
            - -

            If discovering Bluetooth succeeds, you will receive the BT_ERROR_NONE result as the first parameter in your bt_adapter_device_discovery_state_changed_cb() (classic Bluetooth) or bt_adapter_le_device_discovery_state_changed_cb() (Bluetooth LE) callback function. If your device did not start to discover devices due to an error, then the result code will be BT_ERROR_TIMEOUT.

            -

            If stopping the discovery succeeds, you can also receive BT_ERROR_CANCELLED.

            - -

            The values in bt_adapter_device_discovery_state_e (classic Bluetooth) or bt_adapter_le_device_discovery_state_e (Bluetooth LE) are as follows:

            - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Discovery states -
            Discovery stateDescription
            BT_ADAPTER_DEVICE_DISCOVERY_STARTEDWhen discovery is started
            BT_ADAPTER_DEVICE_DISCOVERY_FINISHEDWhen discovery is finished
            BT_ADAPTER_DEVICE_DISCOVERY_FOUNDWhen a device is found
            BT_ADAPTER_LE_DEVICE_DISCOVERY_STARTEDWhen LE discovery is started
            BT_ADAPTER_LE_DEVICE_DISCOVERY_FINISHEDWhen LE discovery is finished
            BT_ADAPTER_LE_DEVICE_DISCOVERY_FOUNDWhen an LE device is found
            - - - +
          2. +
          3. +

            If discovering Bluetooth succeeds, you receive the BT_ERROR_NONE result as the first parameter in your bt_adapter_device_discovery_state_changed_cb() (classic Bluetooth) or bt_adapter_le_device_discovery_state_changed_cb() (Bluetooth LE) callback function. If your device did not start to discover devices due to an error, the result code is BT_ERROR_TIMEOUT. If stopping the discovery succeeds, you can also receive BT_ERROR_CANCELLED.

            +
          4. +
          5. When your implemented callback function is first called, the second parameter, discovery_state, is BT_ADAPTER_DEVICE_DISCOVERY_STARTED or BT_ADAPTER_LE_DEVICE_DISCOVERY_STARTED. This indicates that device discovery has begun.

            -

            Each time you find a remote Bluetooth device, discovery_state will be in the BT_ADAPTER_DEVICE_DISCOVERY_FOUND or BT_ADAPTER_LE_DEVICE_DISCOVERY_FOUND state.

            -

            At the BT_ADAPTER_DEVICE_DISCOVERY_FOUND or BT_ADAPTER_LE_DEVICE_DISCOVERY_FOUND state, you can get some information about a discovered device, such as the device MAC address, name, class, rssi (received signal strength indicator), and bonding state. Using this information, you can connect to the discovered device.

            +

            The discovery states are values of the enumerations bt_adapter_device_discovery_state_e (classic Bluetooth) (in mobile and wearable applications) or bt_adapter_le_device_discovery_state_e (Bluetooth LE) (in mobile and wearable applications).

            +

            Each time you find a remote Bluetooth device, discovery_state is in the BT_ADAPTER_DEVICE_DISCOVERY_FOUND or BT_ADAPTER_LE_DEVICE_DISCOVERY_FOUND state. At this state you can get some information about a discovered device, such as the device MAC address, name, class, rssi (received signal strength indicator), and bonding state. Using this information, you can connect to the discovered device.

            discovery_info is a NULL value in the BT_ADAPTER_DEVICE_DISCOVERY_STARTED, BT_ADAPTER_LE_DEVICE_DISCOVERY_STARTED, BT_ADAPTER_DEVICE_DISCOVERY_FINISHED, or BT_ADAPTER_LE_DEVICE_DISCOVERY_FINISHED state.

            -

            An example implementation for classic Bluetooth (Bluetooth LE usage is the same):

            +

            The following example shows the implementation for classic Bluetooth. Bluetooth LE usage is the same.

            #include <glib.h> // For GList
            -void adapter_device_discovery_state_changed_cb(int result, bt_adapter_device_discovery_state_e discovery_state, bt_adapter_device_discovery_info_s *discovery_info, void* user_data) 
            +void 
            +adapter_device_discovery_state_changed_cb(int result, bt_adapter_device_discovery_state_e discovery_state, 
            +                                          bt_adapter_device_discovery_info_s *discovery_info, void* user_data) 
             {
                if (result != BT_ERROR_NONE) 
                {
            @@ -396,8 +349,9 @@ void adapter_device_discovery_state_changed_cb(int result, bt_adapter_device_dis
                   break;
                }
             }
            - -

            Register the callback for classic Bluetooth (Bluetooth LE usage is the same):

            +
          6. +
          7. +

            Register the callback for classic Bluetooth. Bluetooth LE usage is the same.

            GList *devices_list = NULL;
             ret = bt_adapter_set_device_discovery_state_changed_cb(
             adapter_device_discovery_state_changed_cb, (void*)&devices_list);
            @@ -406,10 +360,12 @@ if (ret != BT_ERROR_NONE)
             {
                dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_set_device_discovery_state_changed_cb] Failed.");
             }
            - -

            Finding Other Bluetooth Devices

            -

            If you want to stop the device discovery, call bt_adapter_stop_device_discovery() (classic Bluetooth) or bt_adapter_le_stop_device_discovery() (Bluetooth LE).

            -

            A remote Bluetooth device will respond to the request if it is enabled and in a discovery mode. Classic Bluetooth and Bluetooth LE usages are the same.

            +
          8. +
          +
        • +
        • Find other Bluetooth devices. +

          If you want to stop the device discovery, call the bt_adapter_stop_device_discovery() (classic Bluetooth) or bt_adapter_le_stop_device_discovery() (Bluetooth LE) function.

          +

          A remote Bluetooth device responds to the request if it is enabled and in a discovery mode. Classic Bluetooth and Bluetooth LE usages are the same.

           // Classic Bluetooth
           ret = bt_adapter_start_device_discovery();
          @@ -418,9 +374,12 @@ if (ret != BT_ERROR_NONE)
              dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_start_device_discovery] Failed.");
           }
          -

          Enabling Discovery

          -

          For other devices to find your device, your device must be discoverable.

          -

          To check the current visibility of your device, do the following:

          +
        • + +
        • Enable discovery. +
            +
          1. +

            Check the current visibility of your device. For other devices to find your device, your device must be discoverable.

             // Visibility mode of the Bluetooth device
             bt_adapter_visibility_mode_e mode;
            @@ -439,7 +398,8 @@ else
             {
                dlog_print(DLOG_INFO, LOG_TAG, "The device is discoverable for a set period of time.");
             }
            - +
          2. +
          3. To change the visibility mode, use the Bluetooth visibility setting application (shown below with the initial screen on the left and the visibility setting screen on the right).

            Figure: Bluetooth visibility setting application

            Bluetooth visibility setting application

            @@ -448,7 +408,8 @@ else #include <app_control.h> #include <dlog.h> -int bt_set_visibility_operation(void) +int +bt_set_visibility_operation(void) {    int ret = 0;    app_control_h service = NULL; @@ -476,14 +437,14 @@ int bt_set_visibility_operation(void)       return -1;    } -    return 0; }
        - -

        If you want to get a notification when the visibility is changed after 90 seconds, you must implement the following callback and register it.

        -
        typedef void(* bt_adapter_visibility_mode_changed_cb)(int result, bt_adapter_visibility_mode_e visibility_mode, void *user_data)
        -

        An example implementation:

        -
        void adapter_visibility_mode_changed_cb(int result, bt_adapter_visibility_mode_e visibility_mode, void* user_data) 
        +
      2. +
      3. +

        To get a notification when the visibility is changed after 90 seconds, implement the following callback:

        +
        +void 
        +adapter_visibility_mode_changed_cb(int result, bt_adapter_visibility_mode_e visibility_mode, void* user_data) 
         {
            if (result != BT_ERROR_NONE) 
            {
        @@ -503,27 +464,32 @@ int bt_set_visibility_operation(void)
               dlog_print(DLOG_INFO, LOG_TAG, "[visibility_mode_changed_cb] Limited discoverable mode!");
            }
         }
        +
      4. +
      5. Register the callback:

        ret = bt_adapter_set_visibility_mode_changed_cb(adapter_visibility_mode_changed_cb, NULL);
         if (ret != BT_ERROR_NONE) 
         {
            dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_set_visibility_mode_changed_cb] Failed.");
         }
        - -

        Querying Bonded Devices

        -

        Before trying to find the remote devices nearby, you can query the list of bonded devices to get the basic information (such as device address and name) your device has stored for the bonded devices. In order to get all bonded devices, call bt_adapter_foreach_bonded_device(). You can get information about bonded devices in bt_adapter_bonded_device_cb(), which you need to call for each bonded device.

        -

        bt_adapter_foreach_bonded_device() is declared as follows:

        +
      6. +
      +
    2. +
    3. Query bonded devices. +
        +
      1. +

        Before trying to find the remote devices nearby, you can query the list of bonded devices to get the basic information (such as device address and name) your device has stored for the bonded devices. To get all bonded devices, call the bt_adapter_foreach_bonded_device() function. You can get information about bonded devices in the bt_adapter_bonded_device_cb() callback function, which you need to call for each bonded device.

        +

        Declare the bt_adapter_foreach_bonded_device() function.

        int bt_adapter_foreach_bonded_device(bt_adapter_bonded_device_cb foreach_cb, void *user_data)
        -

        The callback function is declared as follows:

        -
        typedef bool(* bt_adapter_bonded_device_cb)(bt_device_info_s *device_info, void *user_data)

        You can get information (such as the device name, service list, and Mac address) about the bonded device.

        To continue performing iterations, your implemented callback function must return true. Otherwise, it returns false and stops performing additional iterations.

        -

        The following code sample describes how to query bonded devices and how to discover a desired device.

        +

        The following example describes how to query bonded devices and how to discover a desired device.

        // Server address for connecting
         char *bt_server_address = NULL;
         const char *remote_server_name = "server device";
          
        -bool adapter_bonded_device_cb(bt_device_info_s *device_info, void *user_data) 
        +bool 
        +adapter_bonded_device_cb(bt_device_info_s *device_info, void *user_data) 
         {
            if (device_info == NULL) 
            {
        @@ -562,13 +528,19 @@ if (ret != BT_ERROR_NONE)
         if (bt_server_address != NULL)
            free(bt_server_address);
         
        +
      2. +
      +
    4. -

      Requesting Bonding with a Remote Bluetooth Device

      -

      You already got information about a remote device through device discovery or querying a bonded device. You can request to bond with that device using the bt_device_create_bond() function. If you want to cancel bonding, call bt_device_cancel_bonding().

      +
    5. Request bonding with a remote Bluetooth device. +
        +
      1. +

        You can request to bond with a remote device using the bt_device_create_bond() function. If you want to cancel bonding, call the bt_device_cancel_bonding() function.

        To get notified when the bonding has finished, register a bt_device_bond_created_cb() callback function using the bt_device_set_bond_created_cb() function. From this callback, you can get the service list that the remote Bluetooth device provides and the service UUID from that service list.

        -

        The example below shows how to implement a bt_device_bond_created_cb() callback function and bond with a remote Bluetooth device.

        - -
        void device_bond_created_cb(int result, bt_device_info_s *device_info, void *user_data) 
        +

        The following example shows how to implement the bt_device_bond_created_cb() callback function and bond with a remote Bluetooth device.

        +
        +void 
        +device_bond_created_cb(int result, bt_device_info_s *device_info, void *user_data) 
         {
            if (result != BT_ERROR_NONE) 
            {
        @@ -614,19 +586,23 @@ else
         {
            dlog_print(DLOG_INFO, LOG_TAG, "[bt_device_create_bond] succeeded. device_bond_created_cb callback will be called.");
         }
        -

        After that, the remote device is included in the bonded device list. So next time you do not need to find it again. Without finding, you can get information (such as address and name) by querying the bonded device.

        -

        You can verify the bonding by calling the bt_adapter_foreach_bonded_device() function.

        -

        If you want to remove the device from the bonded list, call the bt_device_destroy_bond() function.

        +
      2. +
      3. +

        After that, the remote device is included in the bonded device list. Next time you do not need to find it again. Without finding, you can get information (such as address and name) by querying the bonded device.

        +

        You can verify the bonding by calling the bt_adapter_foreach_bonded_device() function. To remove the device from the bonded list, call the bt_device_destroy_bond() function.

        +
      4. +
      +
    6. +

      Connecting to Other Devices Using SPP

      To connect to other devices:

      -

      Connecting as a Server

      -

      If you want your device to work as a server, establish a connection using an RFCOMM socket.

      -

      To establish a connection, create a RFCOMM Bluetooth socket using the bt_socket_create_rfcomm() function. It has the following signature:

      -
      int bt_socket_create_rfcomm(const char *port_uuid, int *socket_fd)
      -

      The first parameter, port_uuid, uniquely identifies which service to provide. It is the UUID of the service. This UUID must match for the connection to be accepted. The second parameter, socket_fd, is the RFCOMM socket ID as an output parameter.

      -

      The example below shows how to make an rfcomm socket with the Bluetooth API.

      +
        +
      • Connect as a server +
          +
        1. +

          To establish a connection with your device as a server, create a RFCOMM Bluetooth socket using the bt_socket_create_rfcomm() function. The first parameter is the UUID of the service, which uniquely identifies which service to provide. This UUID must match for the connection to be accepted. The second parameter is the RFCOMM socket ID as an output parameter.

          const char* my_uuid="00001101-0000-1000-8000-00805F9B34FB";
           int server_socket_fd = -1;
           bt_error_e ret;
          @@ -636,23 +612,19 @@ if (ret != BT_ERROR_NONE)
           {
              dlog_print(DLOG_ERROR, LOG_TAG, "bt_socket_create_rfcomm() failed.");
           }
          -

          To listen for an incoming connection, call the bt_socket_listen_and_accept_rfcomm() function.

          -

          This function is declared as follows:

          +
        2. +
        3. +

          To listen for an incoming connection, call the bt_socket_listen_and_accept_rfcomm() function. The first parameter is the socket fd passed from bt_socket_create_rfcomm(), which starts listening. The second parameter is the maximum number of pending connections that a Bluetooth server can store.

          int bt_socket_listen_and_accept_rfcomm(int socket_fd, int max_pending_connections)
          -
          • int socket_fd: socket fd passed from bt_socket_create_rfcomm(), which starts listening
          • -
          • int max_pending_connections: maximum number of pending connections that a Bluetooth server can store
          - - -

          You can be notified about which device connects to your device by using the bt_socket_connection_state_changed_cb() function.

          - -

          The callback function is declared as follows:

          -
          typedef void (* bt_socket_connection_state_changed_cb) (int result, bt_socket_connection_state_e connection_state, bt_socket_connection_s *connection, void *user_data)
          - -

          The first parameter, result, is the change in the connection state. The second parameter, connection_state, is the connection state, itself, either BT_SOCKET_CONNECTED or BT_SOCKET_DISCONNECTED. The third parameter is the pointer to the structure bt_socket_connection_s, which can specify an RFCOMM Bluetooth socket. The bt_socket_connection_s structure contains socket_fd, role (client or server), and the opposite Bluetooth device's MAC address. The fourth parameter, user_data, is user-defined data.

          +
        4. +
        5. +

          Get notified about which device connects to your device by using the bt_socket_connection_state_changed_cb() function. The first parameter, result, is the change in the connection state. The second parameter, connection_state, is the connection state, itself, either BT_SOCKET_CONNECTED or BT_SOCKET_DISCONNECTED. The third parameter is the pointer to the structure bt_socket_connection_s, which can specify an RFCOMM Bluetooth socket. The bt_socket_connection_s structure contains socket_fd, role (client or server), and the opposite Bluetooth device's MAC address. The fourth parameter, user_data, is user-defined data.

          -

          The example below shows how to implement a callback function and start listening for Bluetooth client devices.

          -
          void socket_connection_state_changed(int result, bt_socket_connection_state_e connection_state, bt_socket_connection_s *connection, void *user_data) 
          +
          +void 
          +socket_connection_state_changed(int result, bt_socket_connection_state_e connection_state,
          +                                bt_socket_connection_s *connection, void *user_data) 
           {
              if (result != BT_ERROR_NONE) 
              {
          @@ -713,9 +685,15 @@ else
              dlog_print(DLOG_INFO, LOG_TAG, "[bt_socket_listen_and_accept_rfcomm] Succeeded. bt_socket_connection_state_changed_cb will be called.");
              // Waiting for incoming connections
           }
          +

          If you do not want to accept any other connections or provide a service, call the bt_socket_destroy_rfcomm() function.

          +
        6. +
        +
      • -

        Connecting as a Client

        +
      • Connect as a client +
          +
        1. Set up the bt_socket_connection_state_changed_cb() function that is called when your device is connected to a Bluetooth server device.

          @@ -729,16 +707,10 @@ else - -

          Request a connection to the Bluetooth server. The server socket fd is used when you send data or disconnect.

          -
          bt_socket_connect_rfcomm (const char *remote_address, const char *remote_port_uuid)
          -

          The first parameter, remote_address, is the address of the remote device. You can get this from the bt_device_info_s structure.

          - -

          The second parameter, remote_port_uuid, is the UUID for the specific RFCOMM-based service on a remote device.

          -

          This remote_port_uuid must match the UUID used by the server device in the bt_socket_create_rfcomm() function.

          - -

          The example below shows how to connect to a specific RFCOMM-based service on a remote device.

          - +
        2. +
        3. +

          Request a connection to the Bluetooth server using the bt_socket_connect_rfcomm() function. The server socket fd is used when you send data or disconnect.

          +

          The first parameter is the address of the remote device. You can get this from the bt_device_info_s structure. The second parameter is the UUID for the specific RFCOMM-based service on a remote device. This remote_port_uuid must match the UUID used by the server device in the bt_socket_create_rfcomm() function.

          const char *service_uuid="00001101-0000-1000-8000-00805F9B34FB";
            
           ret = bt_socket_set_connection_state_changed_cb(socket_connection_state_changed, NULL);
          @@ -760,24 +732,24 @@ else
           {
              dlog_print(DLOG_INFO, LOG_TAG, "[bt_socket_connect_rfcomm] Succeeded. bt_socket_connection_state_changed_cb will be called.");
           }
          +
        4. +
        +
      • +

      Exchanging Data Using SPP

      To share data between devices after establishing a connection:

      -
      1. To write data, use the bt_socket_send_data() function.

        -

        This function is declared as follows:

        -
        int bt_socket_send_data(int socket_fd, const char *data, int length)
        -

        The first parameter, socket_fd, is the socket ID from the bt_socket_connection_state_changed_cb() function. The second parameter, data, is the data to write. The third parameter, length, is the data length.

      2. -
      3. To read data from other devices, you must set up the bt_socket_data_received_cb() callback that will be invoked when your device receives data from other Bluetooth devices.

        -

        To register a bt_socket_data_received_cb() callback function, call the bt_socket_set_data_received_cb() function. The callback function is declared as follows:

        -
        typedef void bt_socket_data_received_cb(bt_socket_received_data_s* data, void* user_data)
        -

        The first parameter, data, is the pointer to the structure bt_socket_received_data_s that can specify received data, data size, and socket fd. The second parameter, user_data, is user data. This callback will be called whenever your device receives data from other Bluetooth devices. You can read the data in the callback.

        +
        1. To write data, use the bt_socket_send_data() function. The first parameter is the socket ID from the bt_socket_connection_state_changed_cb() function. The second parameter is the data to write. The third parameter is the data length.

        2. +
        3. To read data from other devices, you must set up the bt_socket_data_received_cb() callback that is invoked when your device receives data from other Bluetooth devices.

          +

          To register a bt_socket_data_received_cb() callback function, call the bt_socket_set_data_received_cb() function. The first parameter is the pointer to the bt_socket_received_data_s structure that can specify received data, data size, and socket fd. The second parameter is user data. This callback is called whenever your device receives data from other Bluetooth devices. You can read the data in the callback.

          bt_error_e ret;
           char data[] = "Sending test";
           int client_socket_fd = 0;
           
          -void bt_socket_data_received_cb(bt_socket_received_data_s* data, void* user_data)
          +void 
          +bt_socket_data_received_cb(bt_socket_received_data_s* data, void* user_data)
           {
              if (data == NULL) 
              {
          @@ -806,7 +778,7 @@ if (ret != BT_ERROR_NONE)
           
           

          To disconnect from a device, call the bt_socket_destroy_rfcomm() or bt_socket_disconnect_rfcomm() function:

          -
          1. Disconnect the Bluetooth server: +
            • Disconnect the Bluetooth server:
              bt_error_e ret;
                
               // You can get "server_socket_fd" from output of bt_socket_create_rfcomm()
              @@ -832,19 +804,18 @@ if (ret != BT_ERROR_NONE)
               else 
               {
                  dlog_print(DLOG_INFO, LOG_TAG, "[bt_socket_destroy_rfcomm] Succeeded. server_socket_fd = %d.", server_socket_fd);
              -}
          +}
        4. -

          Performing GATT Client Operations

          -

          To perform GATT operations:

          +

          Managing the Client Operations

          +

          To perform GATT client operations:

          1. Register a callback for connection state changes:
             int ret = 0;
             // Register for GATT connection callback
            -void __bt_gatt_connection_state_changed_cb(int result, 
            -                                           bool connected, 
            -                                           const char *remote_address, 
            -                                           void *user_data) 
            +void
            +__bt_gatt_connection_state_changed_cb(int result, bool connected, 
            +                                      const char *remote_address, void *user_data) 
             {
                if (connected)
                   dlog_print(DLOG_INFO, LOG_TAG, "LE connected");
            @@ -863,7 +834,6 @@ if (ret == BT_ERROR_NONE)
                dlog_print(DLOG_INFO, LOG_TAG, "Success");
             break;
             
            -
          2. Unregister the callback registered for connection state changes: @@ -884,7 +854,7 @@ break;
  • -
  • Gets the address of remote device: +
  • Get the address of the remote device:
     int ret = 0;
     char *addr = NULL;
    @@ -901,9 +871,7 @@ break;
     
     int ret = 0;
     
    -ret = bt_gatt_client_foreach_services(client,
    -                                      __bt_gatt_client_foreach_svc_cb, 
    -                                      (void *)test_id);
    +ret = bt_gatt_client_foreach_services(client, __bt_gatt_client_foreach_svc_cb, (void *)test_id);
     if (ret != BT_ERROR_NONE) 
     {
        dlog_print(DLOG_INFO, LOG_TAG, "fail");
    @@ -913,7 +881,8 @@ break;
     
  • Use the bt_gatt_client_foreach_svc_cb() callback to initiate the service characteristics discovery:
    -bool __bt_gatt_client_foreach_svc_cb(int total, int index, bt_gatt_h svc_handle, void *data)
    +bool 
    +__bt_gatt_client_foreach_svc_cb(int total, int index, bt_gatt_h svc_handle, void *data)
     {
        int test_id = (int)data;
        int ret;
    @@ -933,7 +902,6 @@ bool __bt_gatt_client_foreach_svc_cb(int total, int index, bt_gatt_h svc_handle,
           {
              dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_service_foreach_characteristics is failed : %d", ret);
           }
    -
           return true;
        }
     }
    @@ -941,7 +909,8 @@ bool __bt_gatt_client_foreach_svc_cb(int total, int index, bt_gatt_h svc_handle,
     
  • Use the bt_gatt_client_foreach_chr_cb() callback to discover the characteristic descriptors:
    -bool __bt_gatt_client_foreach_chr_cb(int total, int index, bt_gatt_h chr_handle, void *data)
    +bool 
    +__bt_gatt_client_foreach_chr_cb(int total, int index, bt_gatt_h chr_handle, void *data)
     {
        int ret;
        char *uuid = NULL;
    @@ -964,7 +933,8 @@ bool __bt_gatt_client_foreach_chr_cb(int total, int index, bt_gatt_h chr_handle,
     
  • Use the bt_gatt_client_foreach_desc_cb() callback to get the descriptor data:
    -bool __bt_gatt_client_foreach_desc_cb(int total, int index, bt_gatt_h desc_handle, void *data)
    +bool 
    +__bt_gatt_client_foreach_desc_cb(int total, int index, bt_gatt_h desc_handle, void *data)
     {
        char *uuid = NULL;
     
    @@ -973,7 +943,6 @@ bool __bt_gatt_client_foreach_desc_cb(int total, int index, bt_gatt_h desc_handl
        dlog_print(DLOG_INFO, LOG_TAG, "\t\t[%d / %d] uuid : (%s)", index, total, uuid);
        __bt_gatt_client_print_value(desc_handle);
     
    -   g_free(str);
        g_free(uuid);
     
        return true;
    @@ -982,7 +951,6 @@ bool __bt_gatt_client_foreach_desc_cb(int total, int index, bt_gatt_h desc_handl
     
  • -
  • Read the value of the given attribute handle:
     {
    @@ -1041,22 +1009,21 @@ bool __bt_gatt_client_foreach_desc_cb(int total, int index, bt_gatt_h desc_handl
        {
           dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_client_read_value is failed : %d", ret);
        }
    -
        __bt_free_test_param(&g_test_param);
     }
     

    After the reading operation is complete, use the bt_gatt_client_read_complete_cb() callback to handle values:

    -void __bt_gatt_client_read_complete_cb(int result, bt_gatt_h gatt_handle, void *data)
    +void 
    +__bt_gatt_client_read_complete_cb(int result, bt_gatt_h gatt_handle, void *data)
     {
        char *uuid = NULL;
     
        bt_gatt_get_uuid(gatt_handle, &uuid);
     
    -   dlog_print(DLOG_INFO, LOG_TAG, "Read %s for uuid : (%s)",
    +   dlog_print(DLOG_INFO, LOG_TAG, "Read %s for uuid : (%s)", 
                   result == BT_ERROR_NONE ? "Success" : "Fail", uuid);
     
    -   g_free(str);
        g_free(uuid);
     
        if (result != BT_ERROR_NONE)
    @@ -1147,30 +1114,28 @@ void __bt_gatt_client_read_complete_cb(int result, bt_gatt_h gatt_handle, void *
        {
           dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_client_write_value is failed : %d", ret);
        }
    -
        __bt_free_test_param(&g_test_param);
     }
     

    After the writing operation is complete, use the bt_gatt_client_write_complete_cb() callback to finish the task:

    -void __bt_gatt_client_write_complete_cb(int result, bt_gatt_h gatt_handle, void *data)
    +void 
    +__bt_gatt_client_write_complete_cb(int result, bt_gatt_h gatt_handle, void *data)
     {
        char *uuid = NULL;
     
        bt_gatt_get_uuid(gatt_handle, &uuid);
     
    -   dlog_print(DLOG_INFO, LOG_TAG, "Write %s for uuid : (%s)",
    +   dlog_print(DLOG_INFO, LOG_TAG, "Write %s for uuid : (%s)", 
                   result == BT_ERROR_NONE ? "Success" : "Fail", uuid);
     
    -   g_free(str);
        g_free(uuid);
     
        return;
     }
     
  • - -
  • Registers a callback function to be invoked when the characteristic value is changed on the remote device: +
  • Register a callback function to be invoked when the characteristic value changes on the remote device:
     {
    @@ -1193,7 +1158,7 @@ void __bt_gatt_client_write_complete_cb(int result, bt_gatt_h gatt_handle, void
        {
           dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_client_get_service is failed : %d", ret);
           __bt_free_test_param(&g_test_param);
    -   break;
    +      break;
        }
     
        ret = bt_gatt_service_get_characteristic(svc, chr_uuid, &chr);
    @@ -1204,8 +1169,7 @@ void __bt_gatt_client_write_complete_cb(int result, bt_gatt_h gatt_handle, void
           break;
        }
     
    -   ret = bt_gatt_client_set_characteristic_value_changed_cb(chr,
    -     __bt_gatt_client_value_changed_cb, NULL);
    +   ret = bt_gatt_client_set_characteristic_value_changed_cb(chr, __bt_gatt_client_value_changed_cb, NULL);
        if (ret != BT_ERROR_NONE)
        {
           dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_client_set_characteristic_value_changed_cb is failed : %d", ret);
    @@ -1213,10 +1177,10 @@ void __bt_gatt_client_write_complete_cb(int result, bt_gatt_h gatt_handle, void
        }
     }
     
    -

    After registering callback operation, use the __bt_gatt_client_value_changed_cb() callback to display the changed value:

    +

    After registering the callback operation, use the __bt_gatt_client_value_changed_cb() callback to display the changed value:

    -void __bt_gatt_client_value_changed_cb(bt_gatt_h chr, char *value, int len,
    -  void *user_data)
    +void 
    +__bt_gatt_client_value_changed_cb(bt_gatt_h chr, char *value, int len, void *user_data)
     {
        char *uuid = NULL;
        int i;
    @@ -1227,9 +1191,8 @@ void __bt_gatt_client_value_changed_cb(bt_gatt_h chr, char *value, int len,
        dlog_print(DLOG_INFO, LOG_TAG, "len [%d]", len);
        for (i = 0; i < len; i++)
        {
    -    dlog_print(DLOG_INFO, LOG_TAG, "value %u", value[i]);
    +      dlog_print(DLOG_INFO, LOG_TAG, "value %u", value[i]);
        }
    -
        g_free(uuid);
     
        return;
    @@ -1237,7 +1200,7 @@ void __bt_gatt_client_value_changed_cb(bt_gatt_h chr, char *value, int len,
     
  • -
  • Unregisters the registered characteristic value changed callback. After Unregistration, the value change will not be informed: +
  • Unregister the callback for characteristic value changes. Afterwards, you are not notified of the value changes.
     {
    @@ -1260,7 +1223,7 @@ void __bt_gatt_client_value_changed_cb(bt_gatt_h chr, char *value, int len,
        {
           dlog_print(DLOG_INFO, LOG_TAG, "bt_gatt_client_get_service is failed : %d", ret);
           __bt_free_test_param(&g_test_param);
    -   break;
    +      break;
        }
     
        ret = bt_gatt_service_get_characteristic(svc, chr_uuid, &chr);
    @@ -1293,17 +1256,19 @@ break;
     
  • -

    Performing GATT Client Common Getter Operations

    -

    To perform Getter operations for both GATT Client related information:

    -
      -
    1. Gets the type of a service, characteristic or descriptor's GATT handle: + + +

      Managing Common Getter Operations

      +

      To perform getter operations for client-related information:

      +
        +
      • Get the type of a service, characteristic, or descriptor handle:
         {
            int ret = 0;
            bt_gatt_h gatt_handle = NULL;
            bt_gatt_type_e gatt_type;
         
        -   // Handle is already created either for Service/Characteristic/Descriptor using
        +   // Handle is already created for service/characteristic/descriptor
         
            ret = bt_gatt_get_type(gatt_handle, &gatt_type);
            if (ret != BT_ERROR_NONE)
        @@ -1313,14 +1278,14 @@ break;
         }
         
      • -
      • Gets the UUID of a service, characteristic or descriptor's GATT handle: +
      • Get the UUID of a service, characteristic, or descriptor handle:
         {
            int ret = 0;
            bt_gatt_h gatt_handle = NULL;
            char *uuid = NULL;
         
        -   // Handle is already created either for Service/Characteristic/Descriptor using
        +   // Handle is already created for service/characteristic/descriptor
         
            ret = bt_gatt_get_uuid(gatt_handle, &uuid);
            if (ret != BT_ERROR_NONE)
        @@ -1330,7 +1295,7 @@ break;
         }
         
      • -
      • Gets the value of a characteristic or descriptor's GATT handle: +
      • Get the value of a characteristic or descriptor handle:
         {
            int ret = 0;
        @@ -1338,7 +1303,7 @@ break;
            bt_gatt_h gatt_handle = NULL;
            char *value = NULL;
         
        -   // Handle is already created either for Characteristic/Descriptor using
        +   // Handle is already created for characteristic/descriptor
         
            ret = bt_gatt_get_value(gatt_handle, &value, &len);
            if (ret != BT_ERROR_NONE)
        @@ -1348,7 +1313,7 @@ break;
         }
         
      • -
      • Gets the value of a characteristic or descriptor's GATT handle as an integer type: +
      • Get the value of a characteristic or descriptor handle as an integer type:
         {
            int ret = 0;
        @@ -1357,7 +1322,7 @@ break;
            bt_gatt_h gatt_handle = NULL;
            int value;
         
        -   // Assuming All the input parameters[gatt_handle, type& offset] available.
        +   // Assuming all the input parameters (gatt_handle, type, and offset) are available
         
            ret = bt_gatt_get_int_value(gatt_handle, type, offset, &value);
            if (ret != BT_ERROR_NONE)
        @@ -1367,7 +1332,7 @@ break;
         }
         
      • -
      • Gets the value of a characteristic or descriptor's GATT handle as a float type: +
      • Get the value of a characteristic or descriptor handle as a float type:
         {
            int ret = 0;
        @@ -1376,7 +1341,7 @@ break;
            bt_gatt_h gatt_handle = NULL;
            float value;
         
        -   // Assuming All the input parameters[gatt_handle, type& offset] available.
        +   // Assuming all the input parameters (gatt_handle, type, and offset) are available
         
            ret = bt_gatt_get_float_value(gatt_handle, type, offset, &value);
            if (ret != BT_ERROR_NONE)
        @@ -1386,7 +1351,7 @@ break;
         }
         
      • -
      • Gets a service's GATT handle which has specific UUID: +
      • Get a service handle with a specific UUID:
         {
            char *svc_uuid = NULL;
        @@ -1409,7 +1374,7 @@ break;
         }
         
      • -
      • Gets a characteristic's GATT handle which has specific UUID: +
      • Get a characteristic handle with a specific UUID:
         {
            char *svc_uuid = NULL;
        @@ -1443,7 +1408,7 @@ break;
         }
         
      • -
      • Gets a descriptor's GATT handle which has specific UUID: +
      • Get a descriptor handle with a specific UUID:
         {
            char *svc_uuid = NULL;
        @@ -1490,13 +1455,13 @@ break;
         }
         
      • -
      • Gets the properties using characteristic's GATT handle: +
      • Get the properties using the characteristic handle:
         {
            bt_gatt_h chr = NULL;
            int properties;
         
        -   //get the characteristic handle using bt_gatt_service_get_characteristic()
        +   // Get the characteristic handle using bt_gatt_service_get_characteristic()
         
            ret = bt_gatt_characteristic_get_properties(chr, &properties);
            if (ret != BT_ERROR_NONE)
        @@ -1506,12 +1471,12 @@ break;
         }
         
      • -
      • Gets the service's GATT handle for which the specified characteristic belongs to: +
      • Get the service handle to which the specified characteristic belongs:
         {
            bt_gatt_h svc = NULL;
            bt_gatt_h chr = NULL;
        -   //chr = Assuming characteristic's handle is already available
        +   // chr = Assuming characteristic handle is already available
         
            ret = bt_gatt_characteristic_get_service(chr, &svc);
            if (ret != BT_ERROR_NONE)
        @@ -1521,12 +1486,12 @@ break;
         }
         
      • -
      • Gets the characteristic's GATT handle for which the specified descriptor belongs to: +
      • Get the characteristic handle to which the specified descriptor belongs:
         {
            bt_gatt_h chr = NULL;
            bt_gatt_h dsc = NULL;
        -   //dsc = Assuming descriptor's handle is already available.
        +   // dsc = Assuming descriptor handle is already available
         
            ret = bt_gatt_descriptor_get_characteristic(des, &chr);
            if (ret != BT_ERROR_NONE)
        @@ -1536,12 +1501,12 @@ break;
         }
         
      • -
      • Gets the GATT client handle for which the specified service belongs to: +
      • Get the client handle to which the specified service belongs:
         {
            bt_gatt_h svc = NULL;
            bt_gatt_client_h client = NULL;
        -   //svc = Assuming service's handle is already available.
        +   // svc = Assuming service handle is already available
         
            ret = bt_gatt_service_get_client(svc, &client);
            if (ret != BT_ERROR_NONE)
        @@ -1551,12 +1516,12 @@ break;
         }
         
      • -
      • Gets the write type of the specified characteristic: +
      • Get the write type of the specified characteristic:
         {
            bt_gatt_h chr = NULL;
            bt_gatt_write_type_e write_type = NULL;
        -   //svc = Assuming characteristic's handle is already available.
        +   // svc = Assuming characteristic handle is already available
         
            ret = bt_gatt_characteristic_get_write_type(chr, &write_type);
            if (ret != BT_ERROR_NONE)
        @@ -1566,14 +1531,14 @@ break;
         }
         
      • -
      • Gets an included service's GATT handle which has specific UUID: +
      • Get an included service's handle with a specific UUID:
         {
            bt_gatt_h svc = NULL;
            bt_gatt_h included_svc = NULL;
            char *uuid = NULL;
            bt_gatt_write_type_e write_type = NULL;
        -   //svc = Assuming service's handle and UUID are already available.
        +   // svc = Assuming service handle and UUID are already available
         
            ret = bt_gatt_service_get_included_service(svc, uuid, &included_svc);
            if (ret != BT_ERROR_NONE)
        @@ -1582,103 +1547,109 @@ break;
            }
         }
         
      • -
    -

    Gatt Client/Server Common setter operations

    + + +

    Managing Common Setter Operations

    + +

    The setter operations are common for the client role.

    -

    Set the properties and values of the attribute, These operations are common for Server and Client roles.

    +

    To set the properties and values of attributes:

      -
    1. Set/Update characteristic Value, value of the type unit8 or char: +
    2. Set or update the characteristic value (unit8 or char type value):
      -   int ret = 0;
      -   char char_value[1] = {1 + (rand()%100)};
      +int ret = 0;
      +char char_value[1] = {1 + (rand()%100)};
       
      -/* In case of Client, the characteristic handle shall be retrived from the client created using gatt_client_create(),
      - * using the  bt_gatt_service_get_characteristic()*/
      +// For client, the characteristic handle is retrieved from the client created using gatt_client_create()
      +// by using bt_gatt_service_get_characteristic()
       
      -   ret = bt_gatt_set_value(characteristic_handle, char_value, 1);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_set_value(characteristic_handle, char_value, 1);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
    3. -
    4. Set/Update characteristic Value, value of the type integer: +
    5. Set or update the characteristic value (integer type value):
      -   int ret = 0;
      -   int char_value = 60 + (rand()%60);
      +int ret = 0;
      +int char_value = 60 + (rand()%60);
       
      -/* In case of Client, the characteristic handle shall be retrived from the client created using gatt_client_create(),
      - * using the  bt_gatt_service_get_characteristic()*/
      +// For client, the characteristic handle is retrieved from the client created using gatt_client_create()
      +// by using bt_gatt_service_get_characteristic()
       
      -   ret = bt_gatt_set_int_value(characteristic_handle, BT_DATA_TYPE_UINT16, char_value, 1);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_set_int_value(characteristic_handle, BT_DATA_TYPE_UINT16, char_value, 1);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
    6. -
    7. Set/Update characteristic Value, value of the type float: +
    8. Set or update the characteristic value (float type value):
      -   int ret = 0;
      +int ret = 0;
       
      -/* In case of Client, the characteristic handle shall be retrived from the client created using gatt_client_create(),
      - * using the  bt_gatt_service_get_characteristic()*/
      +// For client, the characteristic handle is retrieved from the client created using gatt_client_create()
      +// by using bt_gatt_service_get_characteristic()
       
      -    /* Here the char value is, value: 123 exponent -2 */
      -   ret = bt_gatt_set_float_value(characteristic_handle, BT_DATA_TYPE_FLOAT, 123, -2, 1);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +// Here the char value is, value: 123 exponent -2
      +ret = bt_gatt_set_float_value(characteristic_handle, BT_DATA_TYPE_FLOAT, 123, -2, 1);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
    9. -
    10. Set characteristic write type: +
    11. Set the characteristic write type:
      -   int ret = 0;
      -   bt_gatt_h svc = NULL;
      -   bt_gatt_h control_point = NULL;
      -   char *svc_uuid = "000018f2-0000-1000-8000-00805f9b34fb";
      -   char *chr_uuid = "00002af6-0000-1000-8000-00805f9b34fb";
      +int ret = 0;
      +bt_gatt_h svc = NULL;
      +bt_gatt_h control_point = NULL;
      +char *svc_uuid = "000018f2-0000-1000-8000-00805f9b34fb";
      +char *chr_uuid = "00002af6-0000-1000-8000-00805f9b34fb";
       
      -   ret = bt_gatt_client_get_service(client, svc_uuid, &ancs_svc);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_client_get_service(client, svc_uuid, &ancs_svc);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
      -   ret = bt_gatt_service_get_characteristic(svc, chr_uuid, &control_point);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_service_get_characteristic(svc, chr_uuid, &control_point);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
      -   ret = bt_gatt_characteristic_set_write_type(control_point,
      -   			BT_GATT_WRITE_TYPE_WRITE);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_characteristic_set_write_type(control_point,
      +                                            BT_GATT_WRITE_TYPE_WRITE);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
      -   ret = bt_gatt_set_value(control_point, value, len);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_set_value(control_point, value, len);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
      -   ret = bt_gatt_client_write_value(control_point,
      -   			__write_completed_cb, NULL);
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +ret = bt_gatt_client_write_value(control_point, __write_completed_cb, NULL);
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
      -   return ret;
      +return ret;
       
      -   if (ret == BT_ERROR_NONE)
      -      dlog_print(DLOG_INFO, LOG_TAG, "Success");
      +if (ret == BT_ERROR_NONE)
      +   dlog_print(DLOG_INFO, LOG_TAG, "Success");
       
    -

    Exchanging Data Using OPP

    -

    To exchange data with Object Push Profile (OPP):

    +

    Exchanging Data Using OPP

    The OPP is a basic profile for sending objects, such as pictures, virtual business cards, or schedules. The sender, which is a client, always initiates the transactions (called "push"), not the receiver, which is a server.

    - -

    Server Role

    +

    To exchange data with Object Push Profile (OPP):

    +
      +
    • Exchange data in server role. +
        +
      1. The API has a server role to initialize the status of an OPP server device.

        +

        The following example initializes the OPP server device requested by the bt_opp_server_push_requested_cb(). The bt_opp_server_connection_requested_cb function is called when an OPP connection is requested.

         bt_error_e ret;
         char *directory = NULL;
         storage_get_directory(0, STORAGE_DIRECTORY_DOWNLOADS, &directory);
         
        -void connection_requested_cb_for_opp_server(const char *remote_address, void *user_data)
        +void 
        +connection_requested_cb_for_opp_server(const char *remote_address, void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "remote_address: %s", remote_address);
         }
        @@ -1689,21 +1660,23 @@ if (ret != BT_ERROR_NONE)
         }
         free(directory);
         
        -

        This function initializes the OPP server device requested by the bt_opp_server_push_requested_cb(). The bt_opp_server_connection_requested_cb function is called when an OPP connection is requested.

        - +
      2. +
      3. When a client requests a file push, the server can accept or reject it using the following functions:

         bt_error_e ret;
         const char file_name [18] = "tempfile";
         
        -void bt_opp_server_transfer_progress_cb_for_opp(const char *file, long long size, int percent, void *user_data)
        +void 
        +bt_opp_server_transfer_progress_cb_for_opp(const char *file, long long size, int percent, void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "file: %s", file);
            dlog_print(DLOG_INFO, LOG_TAG, "size: %ld", size);
            dlog_print(DLOG_INFO, LOG_TAG, "percent: %d", percent);
         }
         
        -void bt_opp_server_transfer_finished_cb_for_opp(int result, const char *file, long long size, void *user_data)
        +void 
        +bt_opp_server_transfer_finished_cb_for_opp(int result, const char *file, long long size, void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "result: %d", result);
            dlog_print(DLOG_INFO, LOG_TAG, "file: %s", file);
        @@ -1724,8 +1697,12 @@ if (ret != BT_ERROR_NONE)
            dlog_print(DLOG_ERROR, LOG_TAG, "[bt_opp_server_reject] Failed.");
         }
         
        - -

        Client Role

        +
      4. +
      +
    • +
    • Exchange data in client role. +
        +
      1. Initialize the client using the bt_opp_client_initialize() function:

         bt_error_e ret;
        @@ -1738,7 +1715,9 @@ if (ret != BLUETOOTH_ERROR_NONE)
            return -1;
         }
         
        -

        You can get the information of a file that can be sent to the server device using the bt_opp_client_add_file() function:

        +
      2. +
      3. +

        Get the information of a file that can be sent to the server device using the bt_opp_client_add_file() function:

         bt_error_e ret;
         char *resource_path = NULL;
        @@ -1757,31 +1736,37 @@ if (ret != BLUETOOTH_ERROR_NONE)
            return -1;
         }
         
        -

        You can send the files to the server using the bt_opp_client_push_files() function:

        +
      4. +
      5. +

        Send the files to the server using the bt_opp_client_push_files() function:

         bt_error_e ret;
         char remote_addr[18] = REMOTE_DEVICE_MAC_ADDRESS;
         
        -void __bt_opp_client_push_responded_cb(int result,
        -                                       const char *remote_address,
        -                                       void *user_data)
        +void 
        +__bt_opp_client_push_responded_cb(int result,
        +                                  const char *remote_address,
        +                                  void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "result: %d", result);
            dlog_print(DLOG_INFO, LOG_TAG, "remote_address: %s", remote_address);
         }
         
        -void __bt_opp_client_push_progress_cb(const char *file,
        -                                      long long size,
        -                                      int percent,
        -                                      void *user_data)
        +void 
        +__bt_opp_client_push_progress_cb(const char *file,
        +                                 long long size,
        +                                 int percent,
        +                                 void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "size: %ld", (long)size);
            dlog_print(DLOG_INFO, LOG_TAG, "percent: %d", percent);
            dlog_print(DLOG_INFO, LOG_TAG, "file: %s", file);
         }
        -void __bt_opp_client_push_finished_cb(int result,
        -                                      const char *remote_address,
        -                                      void *user_data)
        +
        +void 
        +__bt_opp_client_push_finished_cb(int result,
        +                                 const char *remote_address,
        +                                 void *user_data)
         {
            dlog_print(DLOG_INFO, LOG_TAG, "result: %d", result);
            dlog_print(DLOG_INFO, LOG_TAG, "remote_address: %s", remote_address);
        @@ -1798,7 +1783,8 @@ else
            dlog_print(DLOG_INFO, LOG_TAG, "[bt_opp_client_push_files] Succeeded.");
         }
         
        - +
      6. +
      7. After the push is finished by the client, call the bt_opp_client_clear_files() and bt_opp_client_deinitialize() to release the Bluetooth resources related to the OPP client:

         bt_error_e ret;
        @@ -1821,18 +1807,22 @@ if (ret != BLUETOOTH_ERROR_NONE)
            return -1;
         }
         
        +
      8. +
      +
    • +
    + - -

    Managing Bluetooth LE Scans

    -

    To discover nearby LE devices, perform a LE scan operation:

    +

    To discover nearby LE devices, perform an LE scan operation:

    1. To start the BLE scan:

      -int main()
      +int 
      +main()
       {
          int ret = BT_ERROR_NONE;
          ret = bt_adapter_le_start_scan(__bt_adapter_le_scan_result_cb, NULL);
      @@ -1841,7 +1831,6 @@ int main()
          {
             dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_le_start_scan] Failed.");
          }
      -
          return;
       }
       
      @@ -1853,9 +1842,10 @@ int main()
       int ret;
       
      -void __bt_adapter_le_scan_result_cb(int result,
      -                                    bt_adapter_le_device_scan_result_info_s *info, 
      -                                    void *user_data)
      +void 
      +__bt_adapter_le_scan_result_cb(int result,
      +                                bt_adapter_le_device_scan_result_info_s *info, 
      +                                void *user_data)
       {
          bt_adapter_le_packet_type_e pkt_type = BT_ADAPTER_LE_PACKET_ADVERTISING;
       
      @@ -1948,7 +1938,8 @@ void __bt_adapter_le_scan_result_cb(int result,
       
    2. To stop the BLE scan operation:

      -int main()
      +int 
      +main()
       {
          int ret = BT_ERROR_NONE;
          ret = bt_adapter_le_stop_scan();
      @@ -1957,7 +1948,6 @@ int main()
          {
             dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_le_stop_scan] Failed.");
          }
      -
          return;
       }
       
      @@ -1966,13 +1956,24 @@ int main()

      Discovering Bluetooth LE Devices

      -

      Perform LE discovery operation to discover nearby Bluetooth LE Devices. Callbacks can be registered and unregistered for the LE discovery operation through the use of set and unset callback functions

      -

      The registered device discovery call back provides details of the discovered devices and state of discovery (started, finished, found):

      -

      To start the BLE discovery operation. Please note, the below described BLE discovery apis are deprecated since tizen_2.3.1

      -

      Please refer to the section "Managing Bluetooth LE Scans" for scanning nearby BLE devices. +

      Perform the LE discovery operation to discover nearby Bluetooth LE devices. You can register and unregister callbacks for the LE discovery operation through the use of set and unset callback functions. The registered device discovery callback provides details of the discovered devices and the state of the discovery (started, finished, found).

      + + + + + + + + + + +
      Note
      The APIs used in this use case are deprecated since Tizen 2.3.1. For scanning nearby BLE devices in Tizen 2.3.1 and later, see Managing Bluetooth LE Scans.
      + +

      To start the BLE discovery operation:

      -int main()
      +int 
      +main()
       {
          int ret = BT_ERROR_NONE;
       
      @@ -1984,29 +1985,28 @@ int main()
          {
             dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_le_start_device_discovery] Failed.");
          }
      -
      -/* To unset the le device discovery state change call back*/
      +   // To unset the LE device discovery state change callback
          ret = bt_adapter_le_unset_device_discovery_state_changed_cb
      -   
       
          return;
       }
       
      -
    - -

    Add Advertising Data to the LE Advertisement

    + +

    Adding Advertising Data to the LE Advertisement

    LE advertising data can be added to the LE advertisement or the scan response data. You can add various information, such as the device name, service UUID, service solicitation UUID, advertising appearance, advertising transmission power level, device name, and manufacturer data.

    -
      -
    1. -

      To add the advertising data:

      +

      To add the advertising data:

      +
        +
      1. +

        Add the advertising data:

         static bt_advertiser_h advertiser = NULL;
         static bt_advertiser_h advertiser_list[3] = {NULL, };
         static int advertiser_index = 0;
         
        -int le_add_advertising_data()
        +int 
        +le_add_advertising_data()
         {
            int adv_data_type = 3; // Default all
            int manufacturer_id = 117;
        @@ -2162,19 +2162,18 @@ int le_add_advertising_data()
               dlog_print(DLOG_INFO, LOG_TAG, "add manufacturer data [0x%04x]", ret);
         }
         
        +
      2. - -

        To destroy the LE advertiser:

        +

        When you are done, destroy the LE advertiser:

         {
            int ret = BT_ERROR_NONE;
            ret = bt_adapter_le_destroy_advertiser(advertiser);
        -
        + 
            if (ret != BT_ERROR_NONE)
            {
               dlog_print(DLOG_ERROR, LOG_TAG, "[bt_adapter_le_destroy_advertiser] Failed.");
            }
        -
            return;
         }
         
        @@ -2245,7 +2244,8 @@ if (ret != BT_ERROR_NONE)    dlog_print(DLOG_INFO, LOG_TAG, "add scan response data [0x%04x]", ret);
    -

    Start and Stop Advertising

    +

    Starting and Stopping Advertising

    +

    To manage advertising:

    1. To start advertising with the given advertiser and advertising parameters information, use the bt_adapter_le_start_advertising_new() function:

      @@ -2272,18 +2272,20 @@ ret = bt_adapter_le_start_advertising_new(advertiser, cb, NULL); if (ret < BT_ERROR_NONE)    dlog_print(DLOG_INFO, LOG_TAG, "failed with [0x%04x]", ret);
  • +
  • To stop advertising with the given advertiser, use the bt_adapter_le_stop_advertising() function:

     if (advertiser != NULL)
     {
    -ret = bt_adapter_le_stop_advertising(advertiser);
    -if (ret < BT_ERROR_NONE)
    -   dlog_print(DLOG_INFO, LOG_TAG, "failed with [0x%04x]", ret);
    +   ret = bt_adapter_le_stop_advertising(advertiser);
    +   if (ret < BT_ERROR_NONE)
    +      dlog_print(DLOG_INFO, LOG_TAG, "failed with [0x%04x]", ret);
     }
    -
    +
  • +

    Releasing All Resources

    @@ -2328,4 +2330,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.tutorials/html/native/network/connection_tutorial_n.htm b/org.tizen.tutorials/html/native/network/connection_tutorial_n.htm index 276a948..6e329c5 100644 --- a/org.tizen.tutorials/html/native/network/connection_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/network/connection_tutorial_n.htm @@ -18,7 +18,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    @@ -335,7 +335,7 @@ if (error_code != CONNECTION_ERROR_NONE)

    To initialize a socket for use:

      -
    1. To use the functions and data types of the Socket API, include the following header files: +
    2. To use the functions and data types of the Socket API, include the following header files in your application:
       #include <sys/stat.h>
       #include <arpa/inet.h>
      diff --git a/org.tizen.tutorials/html/native/network/network_tutorials_n.htm b/org.tizen.tutorials/html/native/network/network_tutorials_n.htm
      index f1dae2b..d546470 100644
      --- a/org.tizen.tutorials/html/native/network/network_tutorials_n.htm
      +++ b/org.tizen.tutorials/html/native/network/network_tutorials_n.htm
      @@ -18,7 +18,7 @@
       
       
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      @@ -40,7 +40,7 @@
    3. Connection: Managing Modem Data Connections

      Demonstrates how you can get network connection information, such as default gateway and proxy configuration, IPv4/IPv6 address, cellular connection state, and data transfer statistics.

    4. Bluetooth: Managing Bluetooth Devices

      Demonstrates how you can enable Bluetooth, connect to other devices, and exchange data.

    5. NFC: Managing Near Field Radio Communication

      Demonstrates how you can activate NFC and get cached NFC messages and send and receive NDEF messages using the NFC P2P mode.

    6. -
    7. SmartCard: Accessing Secure Elements

      Demonstrates how you can access secure elements (SE) through smart card features.

    8. +
    9. Smartcard: Accessing Secure Elements

      Demonstrates how you can access secure elements (SE) through smart card features.

    10. Wi-Fi: Managing Wi-Fi and Monitoring Its State

      Demonstrates how you can manage Wi-Fi connections and monitor the Wi-Fi state.

    11. diff --git a/org.tizen.tutorials/html/native/network/nfc_tutorial_n.htm b/org.tizen.tutorials/html/native/network/nfc_tutorial_n.htm index e9a939d..57f97c4 100644 --- a/org.tizen.tutorials/html/native/network/nfc_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/network/nfc_tutorial_n.htm @@ -18,7 +18,7 @@
    12. NFC P2P bump @@ -68,10 +68,11 @@

      Initialize NFC asynchronously, set the NFC tag filter, and register all necessary NFC callbacks.

    13. Getting a Cached NFC Message

      Initialize NFC synchronously and get a cached NFC message.

    14. -
    15. Using the Card_Emulation Feature -

      Create a Card Emulation application.

    16. -
    17. NFC Application Control -

      Using NFC Application Control.

    18. +
    19. Using the Card Emulation Feature +

      Create a card emulation application.

    20. +
    21. Using the NFC Application Control +

      Use the NFC application control to manage events.

    22. +
    23. NFC P2P bump @@ -96,8 +97,8 @@

      In the NFC tutorial, the NFC API (in mobile and wearable applications) is used to write an application which initializes the NFC adapter and registers callbacks called in case of each connection scenario, so the user is able to work with NFC manually. By connecting your device to the other NFC point (tag, device, or sales terminal), you can invoke the specified callback registered earlier. The second scenario of this tutorial shows how to get the message cached by NFC.

      To initialize NFC:

      -
        -
      1. To use the functions and data types of the NFC API (in mobile and wearable applications), include the <nfc.h> header file in your application:

        +
        1. +

          To use the functions and data types of the NFC API (in mobile and wearable applications), include the <nfc.h> header file in your application:

           #include <nfc.h>
           
        2. @@ -108,7 +109,7 @@    gmainloop = g_main_loop_new(NULL, FALSE);    bool is_nfc_supported = nfc_manager_is_supported();    if (!is_nfc_supported) -      dlog_print(DLOG_INFO, LOG_TAG, "is_nfc_supported NOT SUPPORTED"); +      dlog_print(DLOG_INFO, LOG_TAG, "is_nfc_supported NOT SUPPORTED"); }

    The gmainloop, which is being created here, is used to wait for the results of calling asynchronous functions.

  • @@ -196,9 +197,9 @@ g_main_loop_run(gmainloop);
    static void on_nfc_activation_changed(bool activated, void *user_data)
     {
        if (activated)
    -      dlog_print(DLOG_INFO, LOG_TAG, "NFC activated");
    +      dlog_print(DLOG_INFO, LOG_TAG, "NFC activated");
        else
    -      dlog_print(DLOG_INFO, LOG_TAG, "NFC deactivated");
    +      dlog_print(DLOG_INFO, LOG_TAG, "NFC deactivated");
     }

    So in our example, this callback only informs the user that the activation state has changed.

  • @@ -259,7 +260,7 @@ if (NFC_ERROR_NONE != error_code) // Error occurred

    The on_nfc_tag_information_event() callback in this tutorial is really simple. It just prints out the found keys and their values.

    on_nfc_tag_information_event(const char *key, const unsigned char *value, int value_size, void *user_data)
     {
    -   dlog_print(DLOG_INFO, LOG_TAG, "Title: %s, Value: %s", key, (char*)value);
    +   dlog_print(DLOG_INFO, LOG_TAG, "Title: %s, Value: %s", key, (char*)value);
     
        return true;
     }
    @@ -393,13 +394,13 @@ if (NFC_ERROR_NONE != error_code) // Error occurred    nfc_ndef_record_h record;    nfc_ndef_message_get_record_count(message, &count); -   dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_ndef_discovered %d", count); +   dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_ndef_discovered %d", count);    for (i=0; i<count; i++)    {       nfc_ndef_message_get_record(message, i, &record); -      nfc_ndef_record_get_payload (record, &payload, &size); -      dlog_print(DLOG_INFO, LOG_TAG, "Record Number : %d, Payload : %s", i, payload); +      nfc_ndef_record_get_payload(record, &payload, &size); +      dlog_print(DLOG_INFO, LOG_TAG, "Record Number : %d, Payload : %s", i, payload);    } } @@ -429,7 +430,7 @@ if (NFC_ERROR_NONE != error_code) // Error occurred
    static void on_nfc_p2p_read_completed(nfc_p2p_target_h target, nfc_ndef_message_h message, void *user_data)
     {
        int count;
    -   dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_p2p_read_completed");
    +   dlog_print(DLOG_INFO, LOG_TAG, "on_nfc_p2p_read_completed");
     
        nfc_ndef_message_get_record_count(message, &count);
        nfc_ndef_message_read_cb(clone_message(message));
    @@ -448,19 +449,19 @@ if (NFC_ERROR_NONE != error_code) // Error occurred
          // This event notifies the terminal host that it shall launch       // an application associated with an NFC application in a       // UICC (Universal Integrated Circuit Card) host -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Start Transaction"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Start Transaction");       break;    case NFC_SE_EVENT_END_TRANSACTION:       // This event notifies the terminal host that the current transaction       // in process was ended -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: End Transaction"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: End Transaction");       break;    case NFC_SE_EVENT_CONNECTIVITY:       // It is a ready signal to communicate UICC (Universal Integrated Circuit       // Card) with terminal host. \nUICC (Universal Integrated Circuit Card)       // creates a pipe and opens the pipe channel.\nThen it sends the signal       // to terminal host or host controller -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Connectivity"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Connectivity");       break;    case NFC_SE_EVENT_FIELD_ON:       // When the CLF (Contactless Front-end) detects 5ra RF field, the card @@ -469,7 +470,7 @@ if (NFC_ERROR_NONE != error_code) // Error occurred       // the CLF shall send the #NFC_SE_EVENT_FIELD_ON on all open pipes       // to these gates. Next the CLF starts the initialization       // and anti-collision process as defined in ISO/IEC 14443-3 [6] -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Field ON"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Field ON");       break;    case NFC_SE_EVENT_FIELD_OFF:       // When the CLF (Contactless Front-end) detects that the RF field @@ -477,15 +478,15 @@ if (NFC_ERROR_NONE != error_code) // Error occurred       // the card application gate.\nWhen there are multiple open card RF       // gates the CLF shall send the #NFC_SE_EVENT_FIELD_OFF to one gate       // only -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Field OFF"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Field OFF");       break;    case NFC_SE_EVENT_TRANSACTION:       // This event notifies that an external reader is trying to access a secure       // element -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Remote Start Transaction"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: Remote Start Transaction");       break;    default: -      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: DEFAULT:OTHER"); +      dlog_print(DLOG_INFO, LOG_TAG, "NFC EVENT: DEFAULT:OTHER");       break;    } } @@ -494,7 +495,7 @@ if (NFC_ERROR_NONE != error_code) // Error occurred

    The secure element transaction event gives you 4 information parameters and user data. You can get the application ID (specified in ISO/IEC 7816-4) from the first parameter, size of aid from the second parameter, the parameter list (specified in ISO/IEC 8825-1) from the third parameter, and the size of the parameter from the next function input parameter.

    static void on_nfc_se_transaction_event(nfc_se_type_e se_type, unsigned char *aid, int aid_size, unsigned char *param, int param_size, void *user_data)
     {
    -  dlog_print(DLOG_INFO, LOG_TAG, "Secure Element(SIM/UICC(Universal Integrated Circuit Card)) transaction event data");
    +  dlog_print(DLOG_INFO, LOG_TAG, "Secure Element(SIM/UICC(Universal Integrated Circuit Card)) transaction event data");
     }

    Getting a Cached NFC Message

    @@ -523,12 +524,12 @@ if (NFC_ERROR_NONE != error_code) // Error occurred }
  • Clean up at the application end.
  • -

    Using the Card Emulation Feature

    - -

    To create a Card Emulation application:

    +

    Using the Card Emulation Feature

    -
    1. Initialize the Card Emulation application: -
        +

        To create a card emulation application:

        +
          +
        1. Initialize the card emulation application: +
          1. To initialize NFC, use the nfc_manager_initialize() function:

            int ret = NFC_ERROR_NONE;
            @@ -566,55 +567,59 @@ else
                return false;
             }
             
          2. -
          3. Specify a "AID" value for the application. Next two step is required.

            -
            -

            1. To tell the platform which AIDs groups are requested by application, a metadata must be included in the manifest file.

            -
            <?xml version="1.0" encoding="utf-8"?>
            +
          4. Specify an AID value for the application:

            +
              +
            1. +

              To tell the platform which AID groups are requested by application, a metadata element must be included in the manifest file:

              +
              +<?xml version="1.0" encoding="utf-8"?>
               <manifest xmlns="http://tizen.org/ns/packages" api-version="2.3.1" package="org.tizen.basicuiapplication" version="1.0.0">
              -   <profile name="wearable" />
              -   <ui-application appid="org.tizen.basicuiapplication" exec="basicuiapplication" type="capp" multiple="false" taskmanage="true" nodisplay="false">
              +   <profile name="wearable" />
              +   <ui-application appid="org.tizen.basicuiapplication" exec="basicuiapplication" type="capp" multiple="false" taskmanage="true" nodisplay="false">
                     <icon>basicuiapplication.png</icon>
                     <label>basicuiapplication</label>
              -      <metadata key="http://tizen.org/metadata/nfc_cardemulation" value="/shared/res/wallet.xml"/>
              +      <metadata key="http://tizen.org/metadata/nfc_cardemulation" value="/shared/res/wallet.xml"/>
                  </ui-application>
               </manifest>
               
              -
              • The <metadata> is required to contain a <key> and <value> attribute.
              • -
              • <key> attribute must be "http://tizen.org/metadata/nfc_cardemulation".
              • -
              • <value> attribute contain the AID xml file path.
              • -

                <value> attribute is a relative path starting from the app root path.

                +
                • The metadata element must contain the key and value attributes.
                • +
                • The key attribute must be http://tizen.org/metadata/nfc_cardemulation.
                • +
                • The value attribute must contain the AID XML file path. +

                  The value attribute is a relative path starting from the application root path.

                -
                -

                2. meta-data tag points to an AID xml file. An example of this file with AID declaration is shown below :

                -
                <?xml version="1.0" encoding="utf-8"?>
                -   <application name = "org.tizen.basicuiapplication">
                -      <wallet>
                -        <aid-group category = "payment">
                -                <aid aid = "325041592E5359532E4444463031" se_type = "hce" unlock = "false" power = "sleep"/>
                -        </aid-group>
                -      </wallet>
                -   </application>
                +
                +
              • The metadata element points to an AID XML file. The following is an example of this file with AID declaration.

                +
                +<?xml version="1.0" encoding="utf-8"?>
                +<application name="org.tizen.basicuiapplication">
                +   <wallet>
                +      <aid-group category="payment">
                +         <aid aid="325041592E5359532E4444463031" se_type="hce" unlock="false" power="sleep"/>
                +      </aid-group>
                +   </wallet>
                +</application>
                 
                -
                • The <application> is required to contain a <name> attribute that contains a application name.
                • -
                • The <application> must contain one or more <wallet> tags.
                • -
                • Each <wallet> must contain one or more <aid-group> tags.
                • -
                • The <aid-group> is required to contain a <category> attribute that contains <payment> or <other>.
                • -
                • Each <aid-group> must contain one or more <aid> tags, each of which contains a single AID.
                • -
                • The<aid-group> can have as much as you want aid
                • -
                • The <aid> is required to contain a <aid>, <se_type>, <unlock>, <power> attribute.
                • -
                • The <se_type> must contains "hce" or "ese" or "uicc". se_type value can be added later.
                • -
                • The <unlock> must contains "true" or "false".
                • -
                  • "true" mean "Card can't work, when device is locked."
                  • -
                  • "false" mean "Card can work, when device is locked."
                  -
                • The <power> must contains "on" or "off" or "sleep".
                • -
                  • "on" mean "Card can work, when device is on."
                  • -
                  • "off" mean "Card can work, when device is off."
                  • -
                  • "sleep" mean "Card can work, when device is sleep."
                  +
                  • The application element must contain a name attribute with an application name.
                  • +
                  • The application element must contain one or more wallet element, each of which must contain one or more aid-group element.
                  • +
                  • The aid-group element is required to contain a category attribute with the payment or other value.
                  • +
                  • Each aid-group element must contain one or more aid element, each of which contains a single AID. The aid-group can have as much as many aid elements as you want.
                  • +
                  • The aid element must contain the aid, se_type, unlock, and power attributes.
                  • +
                  • The se_type attribute must contain hce, ese, or uicc. The se_type value can be added later.
                  • +
                  • The unlock attribute must contain one of the following: +
                    • true: The card cannot work when the device is locked.
                    • +
                    • false: The card can work when the device is locked.
                  • +
                  • The power must contain one of the following: +
                    • on: The card can work when the device is on.
                    • +
                    • off: The card can work when the device is off.
                    • +
                    • sleep: The card can work when the device is in the sleep mode.
                  • +
                  -
                • The http://tizen.org/privilege/nfc.cardemulation privilege is required for the HCE API. Add the privilege to the tizen-manifest.xml file.
          5. -
          6. To create a Host based Card Emulation (HCE) application : +
          7. The http://tizen.org/privilege/nfc.cardemulation privilege is required for the HCE API. Add the privilege to the tizen-manifest.xml file.
        + +
      1. To create a host-based card emulation (HCE) application:
          +
        1. Define HCE event handling.

          The application must be able to handle an HCE event from the NFC reader. Define and register a callback that is triggered when data arrives from the NFC reader.

          Use the nfc_hce_send_apdu_response() function to send a response to the NFC reader. The actual data moving between the NFC reader and the application can be anything. The APDU protocol only defines as a promise between the application producer and NFC reader.

          @@ -747,7 +752,8 @@ if (ret != NFC_ERROR_NONE)    return false; } -

          When an application receives an app-control event, application can receive the aid value using the "data" appcontrol extra key.

        2. + +

          When an application receives an app control event, the application can receive the AID value using the data app control extra key.

        3. When HCE operations are no longer needed, deinitialize the resources:
          int ret = NFC_ERROR_NONE;
          @@ -759,7 +765,12 @@ if (ret != NFC_ERROR_NONE)
           {
              dlog_print(DLOG_ERROR, LOG_TAG, "nfc_manager_deinitialize failed : %d", ret);
           }
          -
        + +
      2. +
      +
    2. +
    +

    The following example shows the entire HCE application sample code:

    @@ -899,75 +910,41 @@ int main(int argc, char* argv[])    return service_app_main(argc, argv, &event_callback, ad); } - - -

    NFC Application Control

    -

    NFC application controls are kinds of event sent by the system to applications when NFC-based payment transaction occurs.

    -

    To receive these events, you are required to define the application control information in the Application Control tab of the manifest editor.

    - -

    The platform supports the following application controls for NFC applications:

    -

    http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changed and http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_service and http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_service operations.

    - -

    default_changed operation

    -

    The application control with http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changed is sent by the system when the default wallet is changed.

    For example, in Setting > NFC > Set Default Wallet App, if the default wallet is changed, an application control with this operation will be sent to the selected application (wallet).

    - -

    You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

    -
    - -

    host_apdu_service operation

    -

    The application control with http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_service operation is sent by the system when HCE event occurs.

    For example, when a mobile device receives Host based apdu (HCE) event from POS terminal, an application control with this operation will be sent to NFC applications.

    -

    You can get the target AID information using app_control_get_extra_data() with "data" key.

    - -

    You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

    - -

    The following table shows the information comes packaged when the http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_service operation is launching.

    - - - - - - - - - - - - - -
    - Table: host_apdu_service extra key -
    Extra keyDescription
    dataTarget AID key
    -
    -

    off_host_apdu_service operation

    -

    The application control with http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_service operation is sent by the system when SE transaction occurs.

    For example, when a mobile device receives Off-Host apdu event from POS terminal, an application control with this operation will be sent to NFC applications.

    -

    You can get the target AID information using app_control_get_extra_data() with "data" key.

    - -

    You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

    - -

    The following table shows the information comes packaged when the http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_service operation is launching.

    - - - - - - - - - - - - - -
    - Table: off_host_apdu_service extra key -
    Extra keyDescription
    dataTarget AID key
    -
    -

    Application control example

    -

    To tell the platform which application is register the opeartion, a operation must be included in the manifest file.

    -
    <?xml version="1.0" encoding="utf-8"?>
    +
    + + +

    Using the NFC Application Control

    + +

    NFC application controls are events sent by the system to applications when NFC-based payment transactions occur.

    +

    To receive these events, you must define the application control information in the Application Control tab of the manifest editor.

    + +

    The platform supports the following application controls for NFC applications:

    +
      +
    • default_changed operation + +

      The system sends the http://tizen.org/appcontrol/operation/nfc/card_emulation/default_changed application control when the default wallet is changed. For example, in Setting > NFC > Set Default Wallet App, if the default wallet is changed, an application control with this operation is sent to the selected application (wallet).

      + +

      You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

      +
    • +
    • host_apdu_service operation +

      The system sends the http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_service application control when HCE event occurs. For example, when a mobile device receives a host-based APDU (HCE) event from a POS terminal, an application control with this operation is sent to NFC applications.

      +

      You can get the target AID information using the app_control_get_extra_data() function with the data key. The target AID key comes packaged when the http://tizen.org/appcontrol/operation/nfc/card_emulation/host_apdu_service operation is launching.

      +

      You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

      +
    • +
    • off_host_apdu_service operation + +

      The system sends the http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_service application control when SE transaction occurs. For example, when a mobile device receives an off-host APDU event from a POS terminal, an application control with this operation is sent to NFC applications.

      +

      You can get the target AID information using the app_control_get_extra_data() function with the data key. The target AID key comes packaged when the http://tizen.org/appcontrol/operation/nfc/card_emulation/off_host_apdu_service operation is launching.

      +

      You have to define the app_control_cb() callback and register it to ui_app_lifecycle_callback::app_control.

      + +
    • +
    +

    The following example shows the use of the application control. To tell the platform which application is registered for the operation:

    +
    +<?xml version="1.0" encoding="utf-8"?>
     <manifest xmlns="http://tizen.org/ns/packages" api-version="2.3.1" package="org.tizen.basicuiapplication" version="1.0.0">
    -   <profile name="wearable" />
    -   <ui-application appid="org.tizen.basicuiapplication" exec="basicuiapplication" type="capp" multiple="false" taskmanage="true" nodisplay="false">
    +   <profile name="wearable" />
    +   <ui-application appid="org.tizen.basicuiapplication" exec="basicuiapplication" type="capp" multiple="false" taskmanage="true" nodisplay="false">
           <icon>basicuiapplication.png</icon>
           <label>basicuiapplication</label>
           <app-control>
    @@ -978,29 +955,30 @@ int main(int argc, char* argv[])
        </ui-application>
     </manifest>
     
    -

    The code of the NFC application control is presented below:

    +

    The following example shows the NFC application control code:

    -...
    -bool service_app_control(app_control_h service, void *data)
    +bool 
    +service_app_control(app_control_h service, void *data)
     {
        struct _appdata *ad = user_data;
        char *operation, *aid;
        int ret = 0;
     
        app_control_get_operation(service, &operation);
    -   if ((strncmp(operation, NFC_APPCONTROL_STRING, strlen(NFC_APPCONTROL_STRING)) == 0)) {
    -      dlog_print(DLOG_INFO, "HCETESTAPP", "nfc appcontrol operation : [%s]", operation);
    -      app_control_get_extra_data(service, "data", &aid);
    -      dlog_print(DLOG_INFO, "HCETESTAPP", "nfc appcontrol uri : [%s]", aid);
    +   if ((strncmp(operation, NFC_APPCONTROL_STRING, strlen(NFC_APPCONTROL_STRING)) == 0)) 
    +   {
    +      dlog_print(DLOG_INFO, "HCETESTAPP", "nfc appcontrol operation : [%s]", operation);
    +      app_control_get_extra_data(service, "data", &aid);
    +      dlog_print(DLOG_INFO, "HCETESTAPP", "nfc appcontrol uri : [%s]", aid);
        }
     }
    -...
     
    -int main(int argc, char* argv[])
    +int 
    +main(int argc, char* argv[])
     {
        char ad[50] = {0,};
        service_app_event_callback_s event_callback;
    -
    + 
        event_callback.create = service_app_create;
        event_callback.terminate = service_app_terminate;
        event_callback.app_control = service_app_control;
    diff --git a/org.tizen.tutorials/html/native/network/smartcard_tutorial_n.htm b/org.tizen.tutorials/html/native/network/smartcard_tutorial_n.htm
    index 1855c3d..d046508 100644
    --- a/org.tizen.tutorials/html/native/network/smartcard_tutorial_n.htm
    +++ b/org.tizen.tutorials/html/native/network/smartcard_tutorial_n.htm
    @@ -11,14 +11,14 @@
         
         
     
    -    SmartCard: Accessing Secure Elements
    +    Smartcard: Accessing Secure Elements
     
     
     
     
     
     
     
    -

    SmartCard: Accessing Secure Elements

    +

    Smartcard: Accessing Secure Elements

    This tutorial demonstrates how you can manage smart card features and access secure elements (SE).

    Warm-up

    -

    Become familiar with the SmartCard API basics by learning about:

    +

    Become familiar with the Smartcard API basics by learning about:

    • Using the SE Service

      Initialize the SE service and retrieve available readers.

    • diff --git a/org.tizen.tutorials/html/native/network/wifi_direct_tutorial_n.htm b/org.tizen.tutorials/html/native/network/wifi_direct_tutorial_n.htm index 452d532..6cc6c2b 100644 --- a/org.tizen.tutorials/html/native/network/wifi_direct_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/network/wifi_direct_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native

      +

      Mobile native

      Content

      @@ -47,16 +47,7 @@

      This tutorial demonstrates how you can manage Wi-Fi Direct™ connections.

      - - - - - - - - - -
      Note
      This feature is supported in mobile applications only.
      +

      This feature is supported in mobile applications only.

      Warm-up

      Become familiar with the Wi-Fi Direct API basics by learning about:

      diff --git a/org.tizen.tutorials/html/native/network/wifi_tutorial_n.htm b/org.tizen.tutorials/html/native/network/wifi_tutorial_n.htm index 59d3fec..3974da9 100644 --- a/org.tizen.tutorials/html/native/network/wifi_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/network/wifi_tutorial_n.htm @@ -18,7 +18,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      diff --git a/org.tizen.tutorials/html/native/security/key_tutorial_n.htm b/org.tizen.tutorials/html/native/security/key_tutorial_n.htm index 99ad33b..722a897 100644 --- a/org.tizen.tutorials/html/native/security/key_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/security/key_tutorial_n.htm @@ -17,7 +17,7 @@
      -

      Mobile native Wearable native

      +

      Mobile native Wearable native

      Content

      @@ -193,17 +193,7 @@ if (CKMC_ERROR_NONE != ret)    // Error handling }
    - - - - - - - - - -
    Note
    Note that a few Key manager APIs have been deprecated since Tizen 2.4. - For example, several ckmc_remove_* () have been replaced by ckmc_remove_alias(). Although the deprecated APIs continue to be available, it is strongly recommended to use new APIs. For more information on the deprecated information, please refer to the Key-manager API References.
    + diff --git a/org.tizen.tutorials/html/native/security/privilege_tutorial_n.htm b/org.tizen.tutorials/html/native/security/privilege_tutorial_n.htm index 13ee06d..87be121 100644 --- a/org.tizen.tutorials/html/native/security/privilege_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/security/privilege_tutorial_n.htm @@ -17,7 +17,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    Content

    diff --git a/org.tizen.tutorials/html/native/security/security_tutorials_n.htm b/org.tizen.tutorials/html/native/security/security_tutorials_n.htm index ee8f1ea..f043761 100644 --- a/org.tizen.tutorials/html/native/security/security_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/security/security_tutorials_n.htm @@ -17,7 +17,7 @@
    -

    Mobile native Wearable native

    +

    Mobile native Wearable native

    diff --git a/org.tizen.tutorials/html/native/social/calendar_tutorial_n.htm b/org.tizen.tutorials/html/native/social/calendar_tutorial_n.htm index 707fdf4..8a7f109 100644 --- a/org.tizen.tutorials/html/native/social/calendar_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/social/calendar_tutorial_n.htm @@ -16,7 +16,7 @@
    -

    Mobile native

    +

    Mobile native

    Content

    @@ -66,16 +66,7 @@

    This tutorial demonstrates how you can manage events and todo tasks, and convert calendar details to and from the vCalendar format.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.
    +

    This feature is supported in mobile applications only.

    Warm-up

    Become familiar with the Calendar API basics by learning about:

    diff --git a/org.tizen.tutorials/html/native/social/contact_tutorial_n.htm b/org.tizen.tutorials/html/native/social/contact_tutorial_n.htm index 4e30fdd..5bfa67b 100644 --- a/org.tizen.tutorials/html/native/social/contact_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/social/contact_tutorial_n.htm @@ -16,7 +16,7 @@ @@ -103,16 +104,6 @@

    This tutorial demonstrates how you can manage contacts and groups, and import them to or export them from the vCard format.

    - - - - - - - - - -
    Note
    This feature is supported in mobile applications only.

    Warm-up

    Become familiar with the Contacts API basics by learning about:

    @@ -230,7 +221,7 @@

    To start with the Contact Service:

    1. -

      To use the functions and data types of the Contacts API, include the <contacts.h> header file in your application:

      +

      To use the functions and data types of the Contacts API (in mobile and wearable applications), include the <contacts.h> header file in your application:

       #include <contacts.h>
       
    2. @@ -274,7 +265,7 @@ error_code = contacts_record_create(_contacts_name._uri, &name);
    3. Associate the name record with the contact record, by setting the name as the contact's child record. In this example, it is achieved using contacts_record_add_child_record().
      error_code = contacts_record_add_child_record(contact, _contacts_contact.name, name);
       
      -

      The second argument (_contacts_contact.name) is the parent property to which the child record is assigned. See _contacts_contact view description in the Contacts API. In the API, the name property is listed as one of the record type properties, which means that other records can be assigned to this property as child records ("single" means that only 1 _contacts_name type child record is allowed). The required type of the child record is specified in the API.

    +

    The second argument (_contacts_contact.name) is the parent property to which the child record is assigned. See _contacts_contact view description in the Contacts API (in mobile and wearable applications). In the API, the name property is listed as one of the record type properties, which means that other records can be assigned to this property as child records ("single" means that only 1 _contacts_name type child record is allowed). The required type of the child record is specified in the API.

  • Add an image.
    1. Create an image record:
      contacts_record_h image;
      @@ -307,10 +298,10 @@ int int_date = year * 10000 + month * 100 + day;
       
       error_code = contacts_record_set_int(event, _contacts_event.date, int_date);
       
    2. -
    3. Set the event type to birthday. For available types, see contacts_event_type_e enumeration. +
    4. Set the event type to birthday. For the available types, see the contacts_event_type_e enumeration (in mobile and wearable applications).
      error_code = contacts_record_set_int(event, _contacts_event.type, CONTACTS_EVENT_TYPE_BIRTH);
       
    5. -
    6. If the type is CONTACTS_EVENT_TYPE_CUSTOM, you can set a custom label (see _contacts_event view). +
    7. If the type is CONTACTS_EVENT_TYPE_CUSTOM, you can set a custom label (see the _contacts_event view, in mobile and wearable applications).
      error_code = contacts_record_set_int(event, _contacts_event.type, CONTACTS_EVENT_TYPE_CUSTOM);
       
       error_code = contacts_record_set_str(event, _contacts_event.label, "Event description");
      @@ -1389,17 +1380,6 @@ error_code = contacts_record_set_int(speeddial, _contacts_speeddial. number_id,
       
    - - - - - - - - - - -
    Note
    This tutorial does not describe how to insert a number. For more information, see the Contact Tutorial.

    Inserting a Speed Dial to the Database

    @@ -2358,7 +2338,7 @@ static contact_gl_data_t *_create_gl_data(contacts_record_h r_contact)
  • Retrieve record data into the structure. -

    Contacts are organized in a parent-child structure. To access specified data from a record, get the child responsible for the requested type using the contacts_record_get_child_record_at_p() function (for the property lists, see View/Property). Do not pass any data returned by a function with the _p suffix to the free() function.

    +

    Contacts are organized in a parent-child structure. To access specified data from a record, get the child responsible for the requested type using the contacts_record_get_child_record_at_p() function. For the property lists, see View/Property (in mobile and wearable applications). Do not pass any data returned by a function with the _p suffix to the free() function.

    • To get the name details, get the _contacts_contact.name (representing the child) from the r_contact parent. Both structures have the contacts_record_h type. After obtaining a child record, get the desired data from it using the contacts_record_get_str() function.

      @@ -2387,7 +2367,7 @@ static bool _get_contact_id(contacts_record_h r_contact, int *id) }
    • -
    • To get a contact number, check whether it exists using the contacts_record_get_bool() function. If it exists, use the various Query and Filter functions from the Contacts API to make a query to get a list. At the end, free any data returned by a function not containing the _p suffix.

      +
    • To get a contact number, check whether it exists using the contacts_record_get_bool() function. If it exists, use the various Query (in mobile and wearable applications) and Filter (in mobile and wearable applications) functions from the Contacts API to make a query to get a list. At the end, free any data returned by a function not containing the _p suffix.

      • Get a list of all numbers and filter the list to get the default:
         static bool _get_contact_number(contacts_record_h r_contact, char **number)
        @@ -2547,7 +2527,7 @@ contacts_filter_h filter = NULL;
         contacts_filter_create (_contacts_name._uri, &filter);
         
        -

        The first parameter defines in which view to place the filter. To filter by the first and last name, use the _contacts_name filter. The first parameter of the contacts_query_create() function must be the same parameter as in the filter to be appended. For more information on views, see the View/Property tables.

      • +

        The first parameter defines in which view to place the filter. To filter by the first and last name, use the _contacts_name filter. The first parameter of the contacts_query_create() function must be the same parameter as in the filter to be appended. For more information on views, see the View/Property tables (in mobile and wearable applications).

      • Add a condition, such as the following where only contacts beginning with "Za" are shown:

        @@ -2774,7 +2754,7 @@ contacts_person_link_person(first_person_id, second_person_id);
      • Set the default properties. -

        Set the default values from one of the linked contacts with the contacts_person_set_default_property() function. The first parameter determines the detail to be set using the contacts_person_property_e enum.

        +

        Set the default values from one of the linked contacts with the contacts_person_set_default_property() function. The first parameter determines the detail to be set using the contacts_person_property_e enum (in mobile and wearable applications).

        To set a default number from one of the persons, you have to know its ID. Get the detail ID using the contacts_record_get_child_record_at_p() function, because you need to get the value from the _contact_number view.

        diff --git a/org.tizen.tutorials/html/native/social/service_adaptor_tutorial_n.htm b/org.tizen.tutorials/html/native/social/service_adaptor_tutorial_n.htm index e629653..2282d69 100644 --- a/org.tizen.tutorials/html/native/social/service_adaptor_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/social/service_adaptor_tutorial_n.htm @@ -18,7 +18,7 @@ @@ -41,6 +40,9 @@

        Service Adaptor: Working with Plugins

        This tutorial demonstrates how you can use adaptors to work with plugins.

        + +

        This feature is supported in mobile applications only.

        +

        Warm-up

        Become familiar with the Service Adaptor API basics:

          diff --git a/org.tizen.tutorials/html/native/social/social_tutorials_n.htm b/org.tizen.tutorials/html/native/social/social_tutorials_n.htm index 90f94ee..f5a4a48 100644 --- a/org.tizen.tutorials/html/native/social/social_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/social/social_tutorials_n.htm @@ -16,7 +16,7 @@
          -

          Mobile native Wearable native

          +

          Mobile native Wearable native

          Related Info

          @@ -31,19 +31,19 @@

          Social: Managing Personal Data

          - -

          The social tutorials demonstrate how to use the following features in creating Tizen native applications:

          - -

          The following tutorials apply in mobile applications only:

          -
            -
          • Account Manager: Managing Account Information on the Device

            Demonstrates how you can connect to and disconnect from the Account Service, create, delete, and update accounts in the account database, and manage account information.

          • -
          • Calendar: Managing Calendar Events and Accessing the Calendar Database

            Demonstrates how you can manage calendars, events, and tasks.

          • -
          • Contacts: Managing Contacts and Groups, and Accessing the Contact Database

            Demonstrates how you can manage contact information, contact groups, vCards, and phone logs.

          • +

            The social tutorials demonstrate how to use the following features in creating Tizen native applications:

            + + +

            The following tutorials apply in mobile applications only:

            + + diff --git a/org.tizen.tutorials/html/native/system/device_tutorial_n.htm b/org.tizen.tutorials/html/native/system/device_tutorial_n.htm index 109484f..7114ee3 100644 --- a/org.tizen.tutorials/html/native/system/device_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/device_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/dlog_tutorial_n.htm b/org.tizen.tutorials/html/native/system/dlog_tutorial_n.htm index 493f4d8..d2c1346 100644 --- a/org.tizen.tutorials/html/native/system/dlog_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/dlog_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/media_key_tutorial_n.htm b/org.tizen.tutorials/html/native/system/media_key_tutorial_n.htm index 0155264..01b3b49 100644 --- a/org.tizen.tutorials/html/native/system/media_key_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/media_key_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/runtime_tutorial_n.htm b/org.tizen.tutorials/html/native/system/runtime_tutorial_n.htm index dab5682..9bcb7ac 100644 --- a/org.tizen.tutorials/html/native/system/runtime_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/runtime_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/sensor_tutorial_n.htm b/org.tizen.tutorials/html/native/system/sensor_tutorial_n.htm index fd9facc..000baa6 100644 --- a/org.tizen.tutorials/html/native/system/sensor_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/sensor_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/storage_tutorial_n.htm b/org.tizen.tutorials/html/native/system/storage_tutorial_n.htm index 4a5ad3b..04d51c4 100644 --- a/org.tizen.tutorials/html/native/system/storage_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/storage_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/sysinfo_tutorial_n.htm b/org.tizen.tutorials/html/native/system/sysinfo_tutorial_n.htm index 0c3aabb..ff001fa 100644 --- a/org.tizen.tutorials/html/native/system/sysinfo_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/sysinfo_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/system_setting_tutorial_n.htm b/org.tizen.tutorials/html/native/system/system_setting_tutorial_n.htm index 467415c..cc693ec 100644 --- a/org.tizen.tutorials/html/native/system/system_setting_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/system_setting_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            diff --git a/org.tizen.tutorials/html/native/system/system_tutorials_n.htm b/org.tizen.tutorials/html/native/system/system_tutorials_n.htm index 7147058..4ba7927 100644 --- a/org.tizen.tutorials/html/native/system/system_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/system/system_tutorials_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            diff --git a/org.tizen.tutorials/html/native/system/t-trace_tutorial_n.htm b/org.tizen.tutorials/html/native/system/t-trace_tutorial_n.htm index e2dd716..6abb0ea 100644 --- a/org.tizen.tutorials/html/native/system/t-trace_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/system/t-trace_tutorial_n.htm @@ -18,7 +18,7 @@
            -

            Mobile native Wearable native

            +

            Mobile native Wearable native

            Content

            @@ -57,7 +57,7 @@

            To initialize tracing:

              -
            1. To use the functions and data types of the T-trace API, include the <trace.h> header file in your application: +
            2. To use the functions and data types of the T-trace API (in mobile and wearable applications), include the <trace.h> header file in your application:
               #include <trace.h>
               
              diff --git a/org.tizen.tutorials/html/native/telephony/phonenumber_util_tutorial_n.htm b/org.tizen.tutorials/html/native/telephony/phonenumber_util_tutorial_n.htm index 3581422..7005b6d 100644 --- a/org.tizen.tutorials/html/native/telephony/phonenumber_util_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/telephony/phonenumber_util_tutorial_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Content

              diff --git a/org.tizen.tutorials/html/native/telephony/telephony_info_tutorial_n.htm b/org.tizen.tutorials/html/native/telephony/telephony_info_tutorial_n.htm index 2891677..3f7fdec 100644 --- a/org.tizen.tutorials/html/native/telephony/telephony_info_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/telephony/telephony_info_tutorial_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Content

              @@ -535,4 +535,4 @@ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga - + \ No newline at end of file diff --git a/org.tizen.tutorials/html/native/telephony/telephony_tutorials_n.htm b/org.tizen.tutorials/html/native/telephony/telephony_tutorials_n.htm index d7f3c5c..4cf4c08 100644 --- a/org.tizen.tutorials/html/native/telephony/telephony_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/telephony/telephony_tutorials_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Related Info

              diff --git a/org.tizen.tutorials/html/native/tutorials_n.htm b/org.tizen.tutorials/html/native/tutorials_n.htm index 16a18a1..f4d06b3 100644 --- a/org.tizen.tutorials/html/native/tutorials_n.htm +++ b/org.tizen.tutorials/html/native/tutorials_n.htm @@ -18,7 +18,7 @@
              -

              Mobile native Wearable native

              +

              Mobile native Wearable native

              Related Info

              @@ -39,7 +39,7 @@
              • Account -

                Demonstrates how you can manage account information, such as receive sync operation notifications, and obtain an access token by using the oauth2 authorization.

              • +

                Demonstrates how you can manage account information, such as receive sync operation notifications, and obtain an access token by using the OAuth 2.0 authorization.

              • Application Framework: Controlling Your Application

                Demonstrates how you can configure application properties and manage application data.

              • Base: Using Fundamental Libraries diff --git a/org.tizen.tutorials/html/native/ui/eom_tutorial_n.htm b/org.tizen.tutorials/html/native/ui/eom_tutorial_n.htm index 264f3c7..25c1a6a 100644 --- a/org.tizen.tutorials/html/native/ui/eom_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/ui/eom_tutorial_n.htm @@ -18,7 +18,7 @@
                -

                Mobile native Wearable native

                +

                Mobile native Wearable native

                Content

                @@ -61,7 +61,7 @@

                Initializing the EOM

                To initialize EOM:

                  -
                1. To use the functions and data types of the External Output Manager API, include the <eom.h> header file in your application: +
                2. To use the functions and data types of the External Output Manager API (in mobile and wearable applications), include the <eom.h> header file in your application:
                  #include <eom.h>
                3. Initialize the application with the eom_init() function.
                4. diff --git a/org.tizen.tutorials/html/native/ui/minicontrol_tutorial_n.htm b/org.tizen.tutorials/html/native/ui/minicontrol_tutorial_n.htm new file mode 100644 index 0000000..54537d6 --- /dev/null +++ b/org.tizen.tutorials/html/native/ui/minicontrol_tutorial_n.htm @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + Minicontrol: Creating a Minicontrol + + + + + + +
                  +

                  Minicontrol: Creating a Minicontrol

                  + + +

                  This tutorial demonstrates how you can create minicontrols on the quick panel or the lock screen, and hide a minicontrol viewer.

                  + +

                  Warm-up

                  +

                  Become familiar with the Minicontrol API basics by learning about:

                  + + + +

                  Creating a Minicontrol on the Quick Panel

                  + +

                  To create a minicontrol of your application:

                  + +
                    +
                  1. To use the functions and data types of the Minicontrol API (in mobile and wearable applications), include the <minicontrol_provider.h> header file in your application:

                    +
                    +#include <minicontrol_provider.h>
                    +
                    +
                  2. +
                  3. To create a minicontrol, use the minicontrol_create_window() function:

                    + +
                    +Evas_Object *win;
                    +
                    +win = minicontrol_create_window("mini-sample", MINICONTROL_TARGET_VIEWER_QUICK_PANEL, NULL);
                    +evas_object_resize(win, 480, 140);
                    +evas_object_show(win);
                    +
                    + +

                    To create a minicontrol on the quick panel, the target_viewer parameter must be set to MINICONTROL_TARGET_VIEWER_QUICK_PANEL.

                  4. + +
                  5. Add a text label on the minicontrol using the elm_label_add() function: + +
                    +label = elm_label_add(win);
                    +elm_object_text_set(label, "mini-sample");
                    +evas_object_resize(label, 480, 140);
                    +evas_object_show(label);
                    +
                  6. +
                  + +

                  Hiding the Quick Panel

                  +

                  To hide the quick panel:

                  +
                    +
                  1. +

                    Add a button on the minicontrol:

                    + +
                    +button = elm_button_add(win);
                    +elm_object_text_set(button, "Click to hide.");
                    +evas_object_move(button, 0, 50);
                    +evas_object_resize(button, 200, 50);
                    +evas_object_show(button);
                    +
                  2. +
                  3. +

                    Add an event handler callback function:

                    + +
                    +evas_object_smart_callback_add(button, "clicked", _button_clicked_cb, win);
                    +
                  4. +
                  5. +

                    Define the callback function for hiding the quick panel:

                    + +
                    +static void 
                    +_button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
                    +{
                    +   Evas_Object *win = data;
                    +   minicontrol_send_event(win, MINICONTROL_PROVIDER_EVENT_REQUEST_HIDE, NULL);
                    +}
                    +
                  6. +
                  + +

                  Figure: Minicontrol button for hiding the quick panel

                  +

                  Minicontrol button for hiding the quick panel

                  + + + + +
                  + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.tutorials/html/native/ui/ui_tutorials_n.htm b/org.tizen.tutorials/html/native/ui/ui_tutorials_n.htm index e427f65..4e789f5 100644 --- a/org.tizen.tutorials/html/native/ui/ui_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/ui/ui_tutorials_n.htm @@ -18,7 +18,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  @@ -35,10 +35,11 @@

                  UI Framework: Creating the Application UI

                  The UI framework tutorials demonstrate how to create a visual outlook for your application to ensure the best possible user experience:

                  -

                  For more information about implementing the UI for your application using the EFL features, see EFL.

                  +

                  For more information about implementing the UI for your application using the EFL features, see EFL.

                  diff --git a/org.tizen.tutorials/html/native/uix/ime_tutorial_n.htm b/org.tizen.tutorials/html/native/uix/ime_tutorial_n.htm index 482ce28..4ec2452 100644 --- a/org.tizen.tutorials/html/native/uix/ime_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/uix/ime_tutorial_n.htm @@ -18,7 +18,7 @@
                  -

                  Mobile native Wearable native

                  +

                  Mobile native Wearable native

                  Content

                  @@ -311,7 +311,7 @@ option_window_destroyed(Evas_Object *window, void *user_data)

                  To launch the IME list menu to show the installed IMEs:

                    -
                  1. To use the functions and data types of the Input Method Manager API, include the <inputmethod_manager.h> header file in your application: +
                  2. To use the functions and data types of the Input Method Manager API (in mobile and wearable applications), include the <inputmethod_manager.h> header file in your application:
                    #include <inputmethod_manager.h>
                  3. Add the http://tizen.org/privilege/imemanager privilege to the application manifest file.
                  4. @@ -336,7 +336,7 @@ void show_ime_list()

                    To launch the IME selector menu to allow the user to select the default keyboard:

                      -
                    1. To use the functions and data types of the Input Method Manager API, include the <inputmethod_manager.h> header file in your application: +
                    2. To use the functions and data types of the Input Method Manager API (in mobile and wearable applications), include the <inputmethod_manager.h> header file in your application:
                      #include <inputmethod_manager.h>
                    3. Add the http://tizen.org/privilege/imemanager privilege to the application manifest file.
                    4. diff --git a/org.tizen.tutorials/html/native/uix/stt_tutorial_n.htm b/org.tizen.tutorials/html/native/uix/stt_tutorial_n.htm index a95b3ea..3895696 100644 --- a/org.tizen.tutorials/html/native/uix/stt_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/uix/stt_tutorial_n.htm @@ -18,7 +18,7 @@
                      -

                      Mobile native Wearable native

                      +

                      Mobile native Wearable native

                      Content

                      diff --git a/org.tizen.tutorials/html/native/uix/tts_tutorial_n.htm b/org.tizen.tutorials/html/native/uix/tts_tutorial_n.htm index 5be326b..0a51b54 100644 --- a/org.tizen.tutorials/html/native/uix/tts_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/uix/tts_tutorial_n.htm @@ -18,7 +18,7 @@
                      -

                      Mobile native Wearable native

                      +

                      Mobile native Wearable native

                      Content

                      diff --git a/org.tizen.tutorials/html/native/uix/uix_tutorials_n.htm b/org.tizen.tutorials/html/native/uix/uix_tutorials_n.htm index 2c3b317..e7b9993 100644 --- a/org.tizen.tutorials/html/native/uix/uix_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/uix/uix_tutorials_n.htm @@ -18,7 +18,7 @@
                      -

                      Mobile native Wearable native

                      +

                      Mobile native Wearable native

                      Related Info

                      diff --git a/org.tizen.tutorials/html/native/uix/voicecontrol_elm_tutorial_n.htm b/org.tizen.tutorials/html/native/uix/voicecontrol_elm_tutorial_n.htm index c7c4c74..b858dac 100644 --- a/org.tizen.tutorials/html/native/uix/voicecontrol_elm_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/uix/voicecontrol_elm_tutorial_n.htm @@ -18,7 +18,7 @@
                      -

                      Mobile native Wearable native

                      +

                      Mobile native Wearable native

                      Content

                      @@ -58,7 +58,7 @@

                      Initializing the Voice Control

                      To initialize the Voice control elementary library and create a handle:

                        -
                      1. To use the functions and data types of the Voice control elementary API, include the <voice_control_elm.h> header file in your application: +
                      2. To use the functions and data types of the Voice control elementary API (in mobile and wearable applications), include the <voice_control_elm.h> header file in your application:
                        #include <voice_control_elm.h>
                      3. Initialize the Voice control elementary library with the vc_elm_initialize() function: diff --git a/org.tizen.tutorials/html/native/uix/voicecontrol_tutorial_n.htm b/org.tizen.tutorials/html/native/uix/voicecontrol_tutorial_n.htm index cb61c4a..630384a 100644 --- a/org.tizen.tutorials/html/native/uix/voicecontrol_tutorial_n.htm +++ b/org.tizen.tutorials/html/native/uix/voicecontrol_tutorial_n.htm @@ -18,7 +18,7 @@
                        -

                        Mobile native Wearable native

                        +

                        Mobile native Wearable native

                        Content

                        @@ -58,7 +58,7 @@

                        Initializing the Voice Control

                        To initialize and prepare the voice control for use:

                          -
                        1. To use the functions and data types of the Voice control API, include the <voice_control.h> header file in your application: +
                        2. To use the functions and data types of the Voice control API (in mobile and wearable applications), include the <voice_control.h> header file in your application:
                          #include <voice_control.h>
                        3. Initialize the voice control with the vc_initialize() function: diff --git a/org.tizen.tutorials/html/native/uix/voicecontrol_tutorials_n.htm b/org.tizen.tutorials/html/native/uix/voicecontrol_tutorials_n.htm index 4b38bcb..ed1e4f9 100644 --- a/org.tizen.tutorials/html/native/uix/voicecontrol_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/uix/voicecontrol_tutorials_n.htm @@ -18,7 +18,7 @@
                          -

                          Mobile native Wearable native

                          +

                          Mobile native Wearable native

                          Related Info

                          diff --git a/org.tizen.tutorials/html/native/web/web_tutorials_n.htm b/org.tizen.tutorials/html/native/web/web_tutorials_n.htm index 9ee1f2c..8e1c00f 100644 --- a/org.tizen.tutorials/html/native/web/web_tutorials_n.htm +++ b/org.tizen.tutorials/html/native/web/web_tutorials_n.htm @@ -18,7 +18,7 @@
                          -

                          Mobile native Wearable native

                          +

                          Mobile native Wearable native

                          Content

                          @@ -195,10 +195,10 @@ static Browser_Window *window_create(Evas_Object *opener, int width, int height,       // "ERROR: could not create browser window."       return NULL;    } -    -   // If you want to use gpu acceleration, just use below function. -   // elm_config_accel_preference_set("opengl:depth24:stencil8"); -    + +   // If you want to use gpu acceleration, use the following function +   // elm_config_accel_preference_set("opengl:depth24:stencil8"); +    // Create window    window->elm_window = elm_win_add(NULL, "minibrowser-window", ELM_WIN_BASIC);    evas_object_smart_callback_add(window->elm_window, "delete,request", on_window_deletion, &window); @@ -395,7 +395,7 @@ window_create()

                          The void evas_object_show (Evas_Object *obj) function makes the given Evas object visible.

                          -

                          Finding a Window

                          +

                          Finding a Window

                          This example uses 2 helper functions for finding window structures. The first one, the window_find_with_elm_window() function, takes elm_window as an argument and returns a pointer to the Browser_Window object that the window is part of. The second one, the window_find_with_ewk_view() function, does the same for ewk_view. Both of them use the EINA_LIST_FOREACH macro to iterate over the windows list.

                          diff --git a/org.tizen.tutorials/html/web/tizen/application/alarm_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/application/alarm_tutorial_w.htm index 074458c..7d1c808 100644 --- a/org.tizen.tutorials/html/web/tizen/application/alarm_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/application/alarm_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          @@ -42,17 +42,7 @@

                          This tutorial demonstrates how you can manage alarms in the device to automatically launch applications when an alarm is triggered.

                          - - - - - - - - - -
                          Note
                          The Alarm API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                          All mandatory APIs are supported on the Tizen Emulators.

                          +

                          The Alarm API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                          Warm-up

                          Become familiar with the Alarm API basics by learning about:

                          @@ -106,7 +96,7 @@ console.log(alarms.length + " alarms present in the storage.");
                        4. To delete an alarm, use the remove() method with the alarm ID:

                           /* First add created alarm to the device */
                          -tizen.alarm.add(alarm1, "tizen.internet"); /*Tizen Alias ID is deprecated since Tizen 2.3.1.*/
                          +tizen.alarm.add(alarm1, "tizen.internet"); /* Tizen alias ID is deprecated since Tizen 2.3.1 */
                           /* Then remove it */
                           tizen.alarm.remove(alarm1.id);
                           

                          To delete all alarms at once, use the removeAll() method.

                        5. @@ -119,7 +109,7 @@ tizen.alarm.remove(alarm1.id);
                        6. To launch an application when an alarm is triggered, you must define the application as a parameter in the add() method used to add the created alarm to the system:

                           /* Run the browser */
                           var alarm = new tizen.AlarmAbsolute(new Date(2012, 10, 4, 8, 0));
                          -tizen.alarm.add(alarm, "tizen.internet"); /*Tizen Alias ID is deprecated since Tizen 2.3.1.*/
                          +tizen.alarm.add(alarm, "tizen.internet"); /* Tizen alias ID is deprecated since Tizen 2.3.1 */
                           
                        7. To launch an application with additional information when an alarm is triggered, you must use the application control and define the required arguments as a parameter in the add() method used to add the created alarm to the system:

                           /* Run the browser and open the defined browser page with the operation/view application control */
                          diff --git a/org.tizen.tutorials/html/web/tizen/application/app_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/application/app_tutorials_w.htm
                          index 62e4266..0bce714 100644
                          --- a/org.tizen.tutorials/html/web/tizen/application/app_tutorials_w.htm
                          +++ b/org.tizen.tutorials/html/web/tizen/application/app_tutorials_w.htm
                          @@ -18,7 +18,7 @@
                           
                           
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          @@ -38,8 +38,8 @@

                          The following tutorials apply in mobile applications only:

                          diff --git a/org.tizen.tutorials/html/web/tizen/application/appgroup_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/application/appgroup_tutorial_w.htm index df8ce2f..7025ca4 100644 --- a/org.tizen.tutorials/html/web/tizen/application/appgroup_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/application/appgroup_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          @@ -42,7 +42,7 @@ This tutorial demonstrates how you can define the application launch mode and ma

                          Warm-up

                          -

                          Become familiar with the Application Group API basics by learning about:

                          +

                          Become familiar with the Application API basics by learning about:

                          • Controlling the Launch Mode

                            Set the launch mode when calling an application through an app control.

                          • @@ -52,48 +52,40 @@ This tutorial demonstrates how you can define the application launch mode and ma

                            Controlling the Launch Mode

                            - - - - -

                            To launch an application in a GROUP mode you must learn how to define the application control object and next how to launch the application:

                            +

                            To launch an application in a GROUP mode, you must learn how to define the application control object and launch the application:

                              -
                            1. Define the application control object with the mode GROUP: +
                            2. Define the application control object with the GROUP mode:
                              -var appControl = new tizen.ApplicationControl(
                              -                        "http://tizen.org/appcontrol/operation/view",
                              -                        null,
                              -                        "image/jpeg",
                              -                        null,
                              -                        [],
                              -                        "GROUP");
                              +var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/view",
                              +                                              null, "image/jpeg", null, [], "GROUP");
                               
                            3. -
                            4. Define an array with callback functions for tizen.application.launchAppControl() method: +
                            5. Define an array with callback functions for the tizen.application.launchAppControl() method:
                              -var appControlReplyCallback = {
                              -  // callee sent a reply 
                              -  onsuccess: function(data) {
                              -    console.log("onsuccess");
                              -  },
                              -  // callee returned failure
                              -  onfailure: function() {
                              -    console.log("onfailure");
                              -  }
                              +var appControlReplyCallback = 
                              +{
                              +   /* Callee sent a reply  */
                              +   onsuccess: function(data) 
                              +   {
                              +      console.log("onsuccess");
                              +   },
                              +   /* Callee returned failure */
                              +   onfailure: function() 
                              +   {
                              +      console.log("onfailure");
                              +   }
                               }
                               
                            6. Launch the application in the GROUP mode with the previously defined application control object:
                              -tizen.application.launchAppControl(
                              -                      appControl,
                              -                      null,
                              -                      function() { console.log("launch application control succeed"); },
                              -                      function(e) { console.log("launch application control failed. reason: " + e.message); },
                              -                      appControlReplyCallback);
                              +tizen.application.launchAppControl(appControl, null,
                              +                                   function() {console.log("launch application control succeed");},
                              +                                   function(e) {console.log("launch application control failed. reason: " + e.message);},
                              +                                   appControlReplyCallback);
                               
                            7. diff --git a/org.tizen.tutorials/html/web/tizen/application/application_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/application/application_tutorial_w.htm index 4539ab4..d88ca54 100644 --- a/org.tizen.tutorials/html/web/tizen/application/application_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/application/application_tutorial_w.htm @@ -18,8 +18,7 @@
                              -

                              Mobile Web - Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -50,17 +49,7 @@

                              This tutorial demonstrates how you can manage and launch applications.

                              - - - - - - - - - -
                              Note
                              The Application API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Application API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Application API basics by learning about:

                              @@ -77,22 +66,35 @@

                              Learning how to retrieve information about installed and running applications allows you to manage all the device applications from your application:

                                -
                              1. To retrieve a list of installed applications, use the getAppsInfo() method of the ApplicationManager interface (in mobile and wearable applications):

                                function onListInstalledApplications(applications)
                                +   
                              2. To retrieve a list of installed applications, use the getAppsInfo() method of the ApplicationManager interface (in mobile and wearable applications):

                                +
                                +function onListInstalledApplications(applications)
                                 {
                                    console.log("The number of installed applications is " + applications.length);
                                 }
                                -tizen.application.getAppsInfo(onListInstalledApplications);

                                The list of applications is returned to the ApplicationInformationArraySuccessCallback event handler as an array of ApplicationInformation objects (in mobile and wearable applications).

                              3. -
                              4. To retrieve a list of running applications, use the getAppsContext() method of the ApplicationManager interface:

                                function onRunningApplicationContexts(contexts)
                                +tizen.application.getAppsInfo(onListInstalledApplications);
                                +
                                +

                                The list of applications is returned to the ApplicationInformationArraySuccessCallback event handler as an array of ApplicationInformation objects (in mobile and wearable applications).

                              5. +
                              6. To retrieve a list of running applications, use the getAppsContext() method of the ApplicationManager interface:

                                +
                                +function onRunningApplicationContexts(contexts)
                                 {
                                    console.log("The number of running applications is " + contexts.length);
                                 }
                                -tizen.application.getAppsContext(onRunningApplicationContexts);

                                The list of application contexts is returned to the given event handler as an array of the ApplicationContext objects.

                              7. -
                              8. To retrieve basic application information, use the getAppInfo() method of the ApplicationManager interface.

                                Provide the application ID of the application whose information you want as a parameter for the method. If no application ID is set, the method retrieves the information about the application calling the method.

                                var appinfo = tizen.application.getAppInfo("org.tizen.application");
                                +tizen.application.getAppsContext(onRunningApplicationContexts);
                                +
                                +

                                The list of application contexts is returned to the given event handler as an array of the ApplicationContext objects.

                              9. +
                              10. To retrieve basic application information, use the getAppInfo() method of the ApplicationManager interface.

                                Provide the application ID of the application whose information you want as a parameter for the method. If no application ID is set, the method retrieves the information about the application calling the method.

                                +
                                +var appinfo = tizen.application.getAppInfo("org.tizen.application");
                                 console.log("The application icon path :" + appinfo.iconPath);
                                 console.log("The application name :" + appinfo.name);
                                 
                              11. -
                              12. To retrieve application context information, use the getAppContext() method of the ApplicationManager interface.

                                Provide the context ID of the application whose context information you want as a parameter for the method. If no context ID is set, the method retrieves the information about the application calling the method.

                                var appContext = tizen.application.getAppContext();
                                -console.log("Application context retrieved for app " + appContext.id);
                              13. +
                              14. To retrieve application context information, use the getAppContext() method of the ApplicationManager interface.

                                Provide the context ID of the application whose context information you want as a parameter for the method. If no context ID is set, the method retrieves the information about the application calling the method.

                                +
                                +var appContext = tizen.application.getAppContext();
                                +console.log("Application context retrieved for app " + appContext.id);
                                +

                              Managing Applications

                              @@ -118,12 +120,18 @@ function onGetAppsContextSuccess(appcontexts) } tizen.application.getAppsContext(onGetAppsContextSuccess); -

                          You can also launch an application using the application control.

                        8. -
                        9. To retrieve the current application, use the getCurrentApplication() method:

                          var currApp = tizen.application.getCurrentApplication();
                        10. -
                        11. To hide the current application, use the hide() method:

                          +
                          +

                          You can also launch an application using the application control.

                        12. +
                        13. To retrieve the current application, use the getCurrentApplication() method:

                          +
                          +var currApp = tizen.application.getCurrentApplication();
                          +
                        14. +
                        15. To hide the current application, use the hide() method:

                          +
                           currApp.hide();
                           
                        16. -
                        17. To exit the current application, use the exit() method:

                          +   
                        18. To exit the current application, use the exit() method:

                          +
                           currApp.exit();
                           
                        @@ -134,7 +142,8 @@ currApp.exit();
                        1. Define the event handlers for different notifications by implementing the ApplicationInformationEventCallback listener interface (in mobile and wearable applications):

                          -
                          var appEventCB =
                          +
                          +var appEventCB =
                           {
                              /* When a new application is installed */
                              oninstalled: function(appInfo)
                          @@ -153,20 +162,34 @@ currApp.exit();
                              {
                                 console.log("Application " + appId + " uninstalled");
                              }
                          -} 
                        2. -
                        3. Register the listener to use the defined event handlers:

                          var listenerID = tizen.application.addAppInfoEventListener(appEventCB);
                        4. -
                        5. To stop receiving the notifications, use the removeAppInfoEventListener() method of the ApplicationManager interface (in mobile and wearable applications):

                          -tizen.application.removeAppInfoEventListener(listenerID);
                        6. +} + + +
                        7. Register the listener to use the defined event handlers:

                          +
                          +var listenerID = tizen.application.addAppInfoEventListener(appEventCB);
                          +
                          +
                        8. +
                        9. To stop receiving the notifications, use the removeAppInfoEventListener() method of the ApplicationManager interface (in mobile and wearable applications):

                          +
                          +tizen.application.removeAppInfoEventListener(listenerID);
                          +
                          +

                        Launching Applications with the Application Control

                        Learning to use the application controls to launch applications allows you to take advantage of all the device applications from your application:

                        -

                        An installed application can provide a service which is identified by the operation name. Other applications can request it and use the provided feature of the service application (an optionally passing some data to the service). The service application then responds with an ApplicationControlData instance (in mobile and wearable applications) (which can contain some data as well).

                        +

                        An installed application can provide a service which is identified by the operation name. Other applications can request it and use the provided feature of the service application (and optionally passing some data to the service). The service application then responds with an ApplicationControlData instance (in mobile and wearable applications) (which can contain some data as well).

                          -
                        1. To use the application control to pick image files from a list of images, create an ApplicationControl object (in mobile and wearable applications).

                          Define the desired functionality required from the application to be launched. The application needs to have an operation type suitable for selecting images, with URI as null, and the MIME type as image/*.

                          var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/pick", null, "image/*");
                        2. -
                        3. Define the format of the reply you want to receive from the application control:
                          var appControlReplyCB =
                          +   
                        4. To use the application control to pick image files from a list of images, create an ApplicationControl object (in mobile and wearable applications).

                          Define the desired functionality required from the application to be launched. The application needs to have an operation type suitable for selecting images, with URI as null, and the MIME type as image/*.

                          +
                          +var appControl = new tizen.ApplicationControl("http://tizen.org/appcontrol/operation/pick", null, "image/*");
                          +
                        5. +
                        6. Define the format of the reply you want to receive from the application control: +
                          +var appControlReplyCB =
                           {
                              /* Reply is sent if the requested operation is successfully delivered */
                              onsuccess: function(reply)
                          @@ -179,26 +202,26 @@ tizen.application.removeAppInfoEventListener(listenerID);
                        7.          }       }    } -}
                        8. -
                        9. Call the launchAppControl() method to find a suitable application to select the images:
                          tizen.application.launchAppControl(appControl, null,
                          +}
                          +
                        10. +
                        11. Call the launchAppControl() method to find a suitable application to select the images: +
                          +tizen.application.launchAppControl(appControl, null,
                                                              function(){console.log("launch appControl succeeded");},
                                                              function(e){/* Error handling */},
                          -                                   appControlReplyCB);
                        12. +                                   appControlReplyCB); +

                        Handling Application Control Requests

                        Learning how to handle requests from other applications allows you to create Web applications that can be called from other applications to perform specific actions.

                        -

                        Web applications can provide a service which is identified by the operation name. Other applications can request it and use the provided feature of the service application - (optionally passing some data to the service). The service application gets the request, performs some actions, and sends the result to caller application with - an ApplicationControlData array (in mobile and wearable applications).

                        +

                        Web applications can provide a service which is identified by the operation name. Other applications can request it and use the provided feature of the service application (optionally passing some data to the service). The service application gets the request, performs some actions, and sends the result to caller application with an ApplicationControlData array (in mobile and wearable applications).

                          -
                        1. To enable the application to receive Application Control requests, open the Web application configuration editor and - add an operation in the app-control section.

                          -

                          In this example, the name of the operation is http://example.tizen.org/operation/get_time. - The config.xml file contains a <tizen:app-control> element:

                          +
                        2. To enable the application to receive Application Control requests, open the Web application configuration editor and add an operation in the app-control section.

                          +

                          In this example, the name of the operation is http://example.tizen.org/operation/get_time. The config.xml file contains a <tizen:app-control> element:

                           <tizen:app-control>
                              <tizen:src name="index.html"/>
                          @@ -207,11 +230,7 @@ tizen.application.removeAppInfoEventListener(listenerID);
                        3. For more information, see Exporting Application Control Functionality.

                          -
                        4. To retrieve an object of the RequestedApplicationControl interface (in mobile and wearable applications), - use the getCurrentApplication() method of - the ApplicationManager interface (in mobile and wearable applications) and - the getRequestedAppControl() method of - the Application interface (in mobile and wearable applications):

                          +
                        5. To retrieve an object of the RequestedApplicationControl interface (in mobile and wearable applications), use the getCurrentApplication() method of the ApplicationManager interface (in mobile and wearable applications) and the getRequestedAppControl() method of the Application interface (in mobile and wearable applications):

                           var reqAppControl = tizen.application.getCurrentApplication().getRequestedAppControl();
                           
                          @@ -224,8 +243,7 @@ else
                              console.log("The application was not launched with Application Control.");
                           }
                           
                        6. -
                        7. To send a reply to the caller application, use the replyResult() method of - the RequestedApplicationControl interface:

                          +
                        8. To send a reply to the caller application, use the replyResult() method of the RequestedApplicationControl interface:

                           try
                           {
                          diff --git a/org.tizen.tutorials/html/web/tizen/application/data_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/application/data_tutorial_w.htm
                          index 3e06c1b..e0f4b94 100644
                          --- a/org.tizen.tutorials/html/web/tizen/application/data_tutorial_w.htm
                          +++ b/org.tizen.tutorials/html/web/tizen/application/data_tutorial_w.htm
                          @@ -18,7 +18,7 @@
                           
                           
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -40,16 +40,7 @@

                          This tutorial demonstrates how you can share data between applications.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          +

                          This feature is supported in mobile applications only.

                          Warm-up

                          Become familiar with the Data Control API basics by learning about:

                          diff --git a/org.tizen.tutorials/html/web/tizen/application/package_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/application/package_tutorial_w.htm index 7be5286..400325d 100644 --- a/org.tizen.tutorials/html/web/tizen/application/package_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/application/package_tutorial_w.htm @@ -18,8 +18,8 @@
                          -

                          Mobile Web - Wearable Web

                          +

                          Mobile Web + Wearable Web

                          Content

                          @@ -49,17 +49,8 @@

                          This tutorial demonstrates how you can manage packages and retrieve information about them.

                          - - - - - - - - - -
                          Note
                          The Package API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                          All mandatory APIs are supported on the Tizen Emulators.

                          +

                          The Package API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                          +

                          Warm-up

                          Become familiar with the Package API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/bluetooth_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/communication/bluetooth_tutorial_w.htm index e7e86f8..1c129fe 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/bluetooth_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/bluetooth_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -56,18 +56,7 @@

                            This tutorial demonstrates how you can manage Bluetooth and exchange data with a peer device.

                            - - - - - - - - - -
                            Note
                            The Bluetooth API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                            The Bluetooth API is not supported on any Tizen Emulators.

                            -
                            +

                            The Bluetooth API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Bluetooth API is not supported on any Tizen Emulators.

                            Warm-up

                            Become familiar with the Bluetooth API basics by learning about:

                            @@ -351,12 +340,9 @@ healthChannel.close();
                          • Define a scan event handler by implementing the BluetoothLEScanCallback callback (in mobile and wearable applications).

                            The callback is invoked when a remote device has been detected.

                            -var callbacks = 
                            +function successcallback(device)
                             {
                            -   onsuccess: function(device)
                            -   {
                            -      console.log("Found device: "  device.name  " ["  device.address  "]");
                            -   }
                            +   console.log("Found device: " + device.name + " [" + device.address + "]");
                             };
                             
                            @@ -375,7 +361,7 @@ var callbacks =
                          • To search for remote devices, use the startScan() method of the BluetoothLEAdapter interface:

                            -
                            adapter.startScan(callbacks);
                            +
                            adapter.startScan(successcallback);
                          • When you find the right remote device or the user cancels the scanning, disable the scan using the stopScan() method of the BluetoothLEAdapter interface:

                            adapter.stopScan();
                            @@ -470,7 +456,7 @@ function onDeviceFound(device)
                          • When the callbacks are completed, initiate the Bluetooth Low Energy scan using the startScan() method of the BluetoothLEAdapter adapter:

                            -
                            adapter.startScan({onsuccess: onDeviceFound});
                          • +
                            adapter.startScan(onDeviceFound);
                          • When the connection to the remote device is no longer required, disconnect from the device by calling the disconnect() method of the BluetoothLEDevice interface:

                            remoteDevice.disconnect();
                          • @@ -525,7 +511,7 @@ function onDeviceFound(device)
                          • When the callbacks are completed, initiate the Bluetooth Low Energy scan:

                            -
                            adapter.startScan({onsuccess: onDeviceFound});
                          • +
                            adapter.startScan(onDeviceFound);
                          • When the notifications about the connection are no longer required, unregister the listener from the device by calling the removeConnectStateChangeListener() method of the BluetoothLEDevice interface:

                            remoteDevice.removeConnectStateChangeListener(watchId);
                          • diff --git a/org.tizen.tutorials/html/web/tizen/communication/comm_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/communication/comm_tutorials_w.htm index a82293d..e951a6e 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/comm_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/comm_tutorials_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Related Info

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/messaging_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/communication/messaging_tutorial_w.htm index 74d12bf..334ec40 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/messaging_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/messaging_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -46,16 +46,7 @@

                            This tutorial demonstrates how you can create, send, and read messages as well as manage messages in the message storage.

                            -
                            - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Messaging API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/nfc_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/communication/nfc_tutorial_w.htm index 846a35d..8aa79fa 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/nfc_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/nfc_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -48,17 +48,7 @@

                            This tutorial demonstrates how you can use NFC connectivity to detect NFC tags and exchange data with NFC-enabled devices.

                            - - - - - - - - - -
                            Note
                            The NFC API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                            The NFC API is supported on all Tizen Emulators.

                            +

                            The NFC API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The NFC API is supported on all Tizen Emulators.

                            Warm-up

                            Become familiar with the NFC API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/push_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/communication/push_tutorial_w.htm index 979d00c..18f0655 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/push_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/push_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -40,18 +40,7 @@

                            This tutorial demonstrates how you can register your application, connect to the push service, and start receiving push notifications.

                            - - - - - - - - - -
                            Note
                            The Push API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                            The Push API is supported on all Tizen Emulators.

                            -
                            +

                            The Push API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Push API is supported on all Tizen Emulators.

                            Warm-up

                            Become familiar with the Push API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/secure_element_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/communication/secure_element_tutorial_w.htm index e8e40b5..0ca00de 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/secure_element_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/secure_element_tutorial_w.htm @@ -18,8 +18,8 @@
                            -

                            Mobile Web - Wearable Web

                            +

                            Mobile Web + Wearable Web

                            Content

                            @@ -43,17 +43,7 @@

                            This tutorial demonstrates how you can access and manage secure elements in a device.

                            - - - - - - - - - -
                            Note
                            The Secure Element API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                            The Secure Element API is supported on all Tizen Emulators.

                            +

                            The Secure Element API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Secure Element API is supported on all Tizen Emulators.

                            Warm-up

                            Become familiar with the Secure Element API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/task_bluetoothchat_w.htm b/org.tizen.tutorials/html/web/tizen/communication/task_bluetoothchat_w.htm index 4e61ced..8c07cc3 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/task_bluetoothchat_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/task_bluetoothchat_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/task_chatter_w.htm b/org.tizen.tutorials/html/web/tizen/communication/task_chatter_w.htm index 34398f5..0d8bb72 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/task_chatter_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/task_chatter_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            diff --git a/org.tizen.tutorials/html/web/tizen/communication/task_contactsexchanger_w.htm b/org.tizen.tutorials/html/web/tizen/communication/task_contactsexchanger_w.htm index df10837..3b4eb95 100644 --- a/org.tizen.tutorials/html/web/tizen/communication/task_contactsexchanger_w.htm +++ b/org.tizen.tutorials/html/web/tizen/communication/task_contactsexchanger_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/content_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/content/content_tutorial_w.htm index 113b828..ccabff5 100644 --- a/org.tizen.tutorials/html/web/tizen/content/content_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/content_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -51,17 +51,7 @@

                            This tutorial demonstrates how you can retrieve content and manage items in your device local storage.

                            - - - - - - - - - -
                            Note
                            The Content API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            All mandatory APIs are supported on the Tizen Emulators.

                            +

                            The Content API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                            Warm-up

                            Become familiar with the Content API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/content_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/content/content_tutorials_w.htm index 288e265..62b9454 100644 --- a/org.tizen.tutorials/html/web/tizen/content/content_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/content_tutorials_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Related Info

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/download_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/content/download_tutorial_w.htm index aa5aa77..876ce6c 100644 --- a/org.tizen.tutorials/html/web/tizen/content/download_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/download_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -42,17 +42,7 @@

                            This tutorial demonstrates how you can manage and monitor downloads.

                            - - - - - - - - - -
                            Note
                            The Download API is mandatory for the Tizen mobile profile, but optional for the wearable profile. This means that it is supported in all mobile devices, but may not be supported in all wearable devices. -

                            The Download API is supported on all Tizen Emulators.

                            +

                            The Download API is mandatory for the Tizen mobile profile, but optional for the wearable profile. This means that it is supported in all mobile devices, but may not be supported in all wearable devices. The Download API is supported on all Tizen Emulators.

                            Warm-up

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/exif_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/content/exif_tutorial_w.htm index b45e11d..6dc64ef 100644 --- a/org.tizen.tutorials/html/web/tizen/content/exif_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/exif_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -42,17 +42,7 @@

                            This tutorial demonstrates how you can use EXIF (exchangeable image format) information stored in JPEG files.

                            - - - - - - - - - -
                            Note
                            The Exif API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            The Exif API is supported on all Tizen Emulators.

                            +

                            The Exif API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. The Exif API is supported on all Tizen Emulators.

                            Warm-up

                            Become familiar with the Exif API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/task_downloadmanager_w.htm b/org.tizen.tutorials/html/web/tizen/content/task_downloadmanager_w.htm index 97d938f..b9de649 100644 --- a/org.tizen.tutorials/html/web/tizen/content/task_downloadmanager_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/task_downloadmanager_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            diff --git a/org.tizen.tutorials/html/web/tizen/content/task_mediacontent_w.htm b/org.tizen.tutorials/html/web/tizen/content/task_mediacontent_w.htm index 5f7bfd0..3a5733a 100644 --- a/org.tizen.tutorials/html/web/tizen/content/task_mediacontent_w.htm +++ b/org.tizen.tutorials/html/web/tizen/content/task_mediacontent_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            diff --git a/org.tizen.tutorials/html/web/tizen/input_output/archive_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/input_output/archive_tutorial_w.htm index 44b3fbd..144e452 100644 --- a/org.tizen.tutorials/html/web/tizen/input_output/archive_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/input_output/archive_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -41,17 +41,7 @@

                            This tutorial demonstrates how you can create, browse, and extract ZIP archives.

                            - - - - - - - - - -
                            Note
                            The Archive API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            The Archive API is supported on all Tizen Emulators.

                            +

                            The Archive API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. The Archive API is supported on all Tizen Emulators.

                            Warm-up

                            Become familiar with the Archive API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/input_output/filesystem_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/input_output/filesystem_tutorial_w.htm index cca6685..a539a08 100644 --- a/org.tizen.tutorials/html/web/tizen/input_output/filesystem_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/input_output/filesystem_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -46,17 +46,7 @@

                            This tutorial demonstrates how you can control files and directories on the device.

                            - - - - - - - - - -
                            Note
                            The Filesystem API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            All mandatory APIs are supported on the Tizen Emulators.

                            +

                            The Filesystem API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                            Warm-up

                            Become familiar with the Filesystem API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/input_output/io_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/input_output/io_tutorials_w.htm index ddb317a..0c778e3 100644 --- a/org.tizen.tutorials/html/web/tizen/input_output/io_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/input_output/io_tutorials_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Related Info

                            diff --git a/org.tizen.tutorials/html/web/tizen/input_output/message_port_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/input_output/message_port_tutorial_w.htm index 3278803..f4e4173 100644 --- a/org.tizen.tutorials/html/web/tizen/input_output/message_port_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/input_output/message_port_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -40,17 +40,7 @@

                            This tutorial demonstrates how you can send and receive messages through message ports.

                            - - - - - - - - - -
                            Note
                            The Message Port API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            All mandatory APIs are supported on the Tizen Emulators.

                            +

                            The Message Port API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                            Warm-up

                            Become familiar with the Message Port API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/input_output/task_filemanager_w.htm b/org.tizen.tutorials/html/web/tizen/input_output/task_filemanager_w.htm index 8dfd641..595b4ae 100644 --- a/org.tizen.tutorials/html/web/tizen/input_output/task_filemanager_w.htm +++ b/org.tizen.tutorials/html/web/tizen/input_output/task_filemanager_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            @@ -148,7 +148,7 @@ passThruModifiers: function(tplHtml, tplParam, content)    if (content && (typeof content === 'string'))    { -         content = content.replace(specRegExp, '$$$$'); +      content = content.replace(specRegExp, '$$$$');    }    if (regModOn.test(tplHtml)) @@ -163,7 +163,7 @@ passThruModifiers: function(tplHtml, tplParam, content)    }    else    { -         tplHtml = tplHtml.replace(regModOff, content); +      tplHtml = tplHtml.replace(regModOff, content);    }    return tplHtml; diff --git a/org.tizen.tutorials/html/web/tizen/multimedia/media_controller_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/multimedia/media_controller_tutorial_w.htm index 791e957..8efa45f 100644 --- a/org.tizen.tutorials/html/web/tizen/multimedia/media_controller_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/multimedia/media_controller_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -43,17 +43,7 @@

                            This tutorial demonstrates how you can to develop server and client applications for controlling various media functions of the device.

                            - - - - - - - - - -
                            Note
                            The Media Controller API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            All mandatory APIs are supported on the Tizen Emulators.

                            +

                            The Media Controller API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                            Warm-up

                            Become familiar with the Media Controller API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/multimedia/media_key_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/multimedia/media_key_tutorial_w.htm index 8a6d68a..2a32b6c 100644 --- a/org.tizen.tutorials/html/web/tizen/multimedia/media_key_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/multimedia/media_key_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -40,17 +40,7 @@

                            This tutorial demonstrates how you can control multimedia playback.

                            - - - - - - - - - -
                            Note
                            The Media Key API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                            The Media Key API is not supported on any Tizen Emulators.

                            +

                            The Media Key API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Media Key API is not supported on any Tizen Emulators.

                            Warm-up

                            Become familiar with the Media Key API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/multimedia/multimedia_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/multimedia/multimedia_tutorials_w.htm index fdde298..a71069c 100644 --- a/org.tizen.tutorials/html/web/tizen/multimedia/multimedia_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/multimedia/multimedia_tutorials_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Related Info

                            diff --git a/org.tizen.tutorials/html/web/tizen/multimedia/sound_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/multimedia/sound_tutorial_w.htm index f5af960..f63c69c 100644 --- a/org.tizen.tutorials/html/web/tizen/multimedia/sound_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/multimedia/sound_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -43,17 +43,7 @@

                            This tutorial demonstrates how you can manage the device volume levels and sound devices.

                            - - - - - - - - - -
                            Note
                            The Sound API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                            All mandatory APIs are supported on the Tizen Emulators.

                            +

                            The Sound API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                            Warm-up

                            Become familiar with the Sound API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/service/service_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/service/service_tutorial_w.htm index 4ae21e1..0d85495 100644 --- a/org.tizen.tutorials/html/web/tizen/service/service_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/service/service_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Wearable Web

                            +

                            Wearable Web

                            Content

                            @@ -40,16 +40,7 @@

                            This tutorial demonstrates how you can create a service application and implement specific features within the service application.

                            - - - - - - - - - -
                            Note
                            This feature is supported in wearable applications only.
                            +

                            This feature is supported in wearable applications only.

                            Warm-up

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/account_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/account_tutorial_w.htm index 1cc4809..a3b1ddd 100644 --- a/org.tizen.tutorials/html/web/tizen/social/account_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/account_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -41,16 +41,7 @@

                            This tutorial demonstrates how you can manage accounts and retrieve account information.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Account API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/bookmark_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/bookmark_tutorial_w.htm index 483c1e0..8111f82 100644 --- a/org.tizen.tutorials/html/web/tizen/social/bookmark_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/bookmark_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -39,16 +39,7 @@

                            This tutorial demonstrates how you can manage Tizen Web browser bookmarks on the device.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Bookmark API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/calendar_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/calendar_tutorial_w.htm index 36ef391..e1357ae 100644 --- a/org.tizen.tutorials/html/web/tizen/social/calendar_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/calendar_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -55,16 +55,7 @@

                            This tutorial demonstrates how you can manage calendars in the device to access, modify, add, and remove calendar items within a specified calendar on the device.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Calendar API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/call_history_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/call_history_tutorial_w.htm index aae5dc0..b179162 100644 --- a/org.tizen.tutorials/html/web/tizen/social/call_history_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/call_history_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -39,16 +39,7 @@

                            This tutorial demonstrates how you can manage and monitor the call history.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Call History API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/contact_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/contact_tutorial_w.htm index c283388..20ea238 100644 --- a/org.tizen.tutorials/html/web/tizen/social/contact_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/contact_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -63,16 +63,7 @@

                            This tutorial demonstrates how you can manage address books in the device to access, modify, add, and remove contacts within a specified address book on the device.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Contact API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/data_sync_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/social/data_sync_tutorial_w.htm index dd624a5..70db294 100644 --- a/org.tizen.tutorials/html/web/tizen/social/data_sync_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/data_sync_tutorial_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -38,16 +38,7 @@

                            This tutorial demonstrates how you can synchronize device data, such as contacts and calendar events, with the OMA DS server.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Data Synchronization API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/tizen/social/social_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/social/social_tutorials_w.htm index 01267bc..d794111 100644 --- a/org.tizen.tutorials/html/web/tizen/social/social_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/social_tutorials_w.htm @@ -16,7 +16,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Related Info

                            @@ -31,16 +31,7 @@

                            Social: Managing Personal Data

                            - - - - - - - - - -
                            Note
                            The Social API domain is supported in mobile applications only.
                            +

                            The Social API domain is supported in mobile applications only.

                            The social data tutorials demonstrate how to use the following features in creating Tizen Web applications:

                              diff --git a/org.tizen.tutorials/html/web/tizen/social/task_calllog_w.htm b/org.tizen.tutorials/html/web/tizen/social/task_calllog_w.htm index 9ad96c7..c0667fd 100644 --- a/org.tizen.tutorials/html/web/tizen/social/task_calllog_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/task_calllog_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              diff --git a/org.tizen.tutorials/html/web/tizen/social/task_eventmanager_w.htm b/org.tizen.tutorials/html/web/tizen/social/task_eventmanager_w.htm index d55c274..9d08f37 100644 --- a/org.tizen.tutorials/html/web/tizen/social/task_eventmanager_w.htm +++ b/org.tizen.tutorials/html/web/tizen/social/task_eventmanager_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/fm_radio_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/fm_radio_tutorial_w.htm index 1c000e0..7423ac8 100644 --- a/org.tizen.tutorials/html/web/tizen/system/fm_radio_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/fm_radio_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              Content

                              @@ -40,16 +40,7 @@

                              This tutorial demonstrates how you can manage a FM radio on the device.

                              - - - - - - - - - -
                              Note
                              This feature is supported in mobile applications only.
                              +

                              This feature is supported in mobile applications only.

                              Warm-up

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/ham_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/ham_tutorial_w.htm index 3d50159..91402d2 100644 --- a/org.tizen.tutorials/html/web/tizen/system/ham_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/ham_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -41,17 +41,7 @@

                              This tutorial demonstrates how you can monitor user activity.

                              - - - - - - - - - -
                              Note
                              The Human Activity Monitor API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                              The Human Activity Monitor API is partly supported on the Tizen Emulators (only heart-rate monitoring).

                              +

                              The Human Activity Monitor API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Human Activity Monitor API is partly supported on the Tizen Emulators (only heart-rate monitoring).

                              Warm-up

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/power_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/power_tutorial_w.htm index bf4d4cd..787ecc5 100644 --- a/org.tizen.tutorials/html/web/tizen/system/power_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/power_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -41,17 +41,7 @@

                              This tutorial demonstrates how you can access the device power state.

                              - - - - - - - - - -
                              Note
                              The Power API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Power API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Power API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/sensor_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/sensor_tutorial_w.htm index a8264c4..872424f 100644 --- a/org.tizen.tutorials/html/web/tizen/system/sensor_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/sensor_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -40,17 +40,7 @@

                              This tutorial demonstrates how you can use device sensors.

                              - - - - - - - - - -
                              Note
                              The Sensor API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. -

                              The Sensor API is supported on all Tizen Emulators.

                              +

                              The Sensor API is optional for both Tizen mobile and wearable profiles, which means that it may not be supported in all mobile and wearable devices. The Sensor API is supported on all Tizen Emulators.

                              Warm-up

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/system_info_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/system_info_tutorial_w.htm index 71f06d4..07c445f 100644 --- a/org.tizen.tutorials/html/web/tizen/system/system_info_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/system_info_tutorial_w.htm @@ -17,8 +17,8 @@
                              -

                              Mobile Web - Wearable Web

                              +

                              Mobile Web + Wearable Web

                              Content

                              @@ -44,17 +44,7 @@

                              This tutorial demonstrates how you can obtain information about the device properties.

                              - - - - - - - - - -
                              Note
                              The System Information API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The System Information API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the System Information API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/system_setting_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/system_setting_tutorial_w.htm index 38a4cd6..9146a12 100644 --- a/org.tizen.tutorials/html/web/tizen/system/system_setting_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/system_setting_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -41,17 +41,7 @@

                              This tutorial demonstrates how you can access the device's settings for the home screen and lock screen wallpaper, incoming call ringtone, and email notification tone.

                              - - - - - - - - - -
                              Note
                              The System Setting API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              The System Setting API is supported on the Tizen mobile Emulator and partly supported on the Tizen wearable Emulator (only the home screen and incoming call features).

                              +

                              The System Setting API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. The System Setting API is supported on the Tizen mobile Emulator and partly supported on the Tizen wearable Emulator (only the home screen and incoming call features).

                              Warm-up

                              Become familiar with the System Setting API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/system_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/system/system_tutorials_w.htm index 5f885ac..ffc94bb 100644 --- a/org.tizen.tutorials/html/web/tizen/system/system_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/system_tutorials_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/task_sensorball_w.htm b/org.tizen.tutorials/html/web/tizen/system/task_sensorball_w.htm index 8d11437..bf10c00 100644 --- a/org.tizen.tutorials/html/web/tizen/system/task_sensorball_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/task_sensorball_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/task_systeminfo_w.htm b/org.tizen.tutorials/html/web/tizen/system/task_systeminfo_w.htm index 427f68c..5cbf375 100644 --- a/org.tizen.tutorials/html/web/tizen/system/task_systeminfo_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/task_systeminfo_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/time_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/time_tutorial_w.htm index 43350bc..6818bca 100644 --- a/org.tizen.tutorials/html/web/tizen/system/time_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/time_tutorial_w.htm @@ -17,8 +17,7 @@
                              -

                              Mobile Web - Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -43,17 +42,7 @@

                              This tutorial demonstrates how you can manage date and time information and perform different calculations and other tasks related to date and time.

                              - - - - - - - - - -
                              Note
                              The Time API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Time API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Time API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/system/web_setting_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/system/web_setting_tutorial_w.htm index 098343f..e8d344c 100644 --- a/org.tizen.tutorials/html/web/tizen/system/web_setting_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/system/web_setting_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              Content

                              @@ -39,16 +39,7 @@

                              This tutorial demonstrates how you can manage Web view properties.

                              - - - - - - - - - -
                              Note
                              This feature is supported in mobile applications only.
                              +

                              This feature is supported in mobile applications only.

                              Warm-up

                              Become familiar with the Web Setting API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/tizen/tizen_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/tizen/tizen_tutorials_w.htm index 93f599e..ba0d96e 100644 --- a/org.tizen.tutorials/html/web/tizen/tizen/tizen_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/tizen/tizen_tutorials_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -51,17 +51,7 @@

                              This tutorial demonstrates how you can utilize generic Tizen Device API features, such as filters, sorting modes, and generic event handlers.

                              - - - - - - - - - -
                              Note
                              The Tizen API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Tizen API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Tizen API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/tutorials_tizen_w.htm b/org.tizen.tutorials/html/web/tizen/tutorials_tizen_w.htm index 32089c9..29cba39 100644 --- a/org.tizen.tutorials/html/web/tizen/tutorials_tizen_w.htm +++ b/org.tizen.tutorials/html/web/tizen/tutorials_tizen_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              @@ -34,20 +34,6 @@

                              Tizen tutorials teach you how to incorporate Tizen features into your application. The tutorials cover detailed code snippets to help you see how to write the required code in practice.

                              - - - - - - - - - -
                              Note
                              In Tizen Web Device APIs, there are 2 types of APIs: mandatory and optional. -

                              The mandatory APIs are always available on all Tizen devices. The optional APIs provide functionality that depends on the available device hardware or software capabilities, and they may not be available in all Tizen devices. For example, the Bluetooth and NFC API hardware features are optional, and not supported on all devices.

                              -

                              To determine the availability of optional APIs, use the tizen.systeminfo.getCapability() method of the System Information API (in mobile and wearable applications).

                              -

                              Note that all mandatory APIs are supported on the Tizen Emulators, while the optional APIs may or may not be supported. For the details of each API, see Tizen Web Device API Reference.

                              -

                              Select the feature you are interested in and see how you can implement its various functionalities into your application.

                              The following tutorials demonstrate features provided by the Tizen Web Device API:

                              @@ -72,8 +58,21 @@

                              Demonstrates how you can manage the user's personal data, such as contacts, calendars, location data, and call and browsing history, on the device.

                            + + + + + + + + + +
                            Note
                            In Tizen Web Device APIs, there are 2 types of APIs: mandatory and optional. +

                            The mandatory APIs are always available on all Tizen devices. The optional APIs provide functionality that depends on the available device hardware or software capabilities, and they may not be available in all Tizen devices. For example, the Bluetooth and NFC API hardware features are optional, and not supported on all devices.

                            +

                            To determine the availability of optional APIs, use the tizen.systeminfo.getCapability() method of the System Information API (in mobile and wearable applications).

                            +

                            Note that all mandatory APIs are supported on the Tizen Emulators, while the optional APIs may or may not be supported. For the details of each API, see Tizen Web Device API Reference.

                            -

                            For more information about implementing the UI for your application using the Advanced UI Framework (TAU) features, see TAU.

                            +

                            For more information about implementing the UI for your application using the Advanced UI Framework (TAU) features, see TAU.

                            In addition to the Tizen Web Device API tutorials above, you can implement the following features:

                              diff --git a/org.tizen.tutorials/html/web/tizen/ui/badge_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/ui/badge_tutorial_w.htm index 02226fc..0128da4 100644 --- a/org.tizen.tutorials/html/web/tizen/ui/badge_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/ui/badge_tutorial_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -40,17 +40,7 @@

                              This tutorial demonstrates how you can manage home screen badges.

                              - - - - - - - - - -
                              Note
                              The Badge API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Badge API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Badge API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/ui/noti_tutorial_w.htm b/org.tizen.tutorials/html/web/tizen/ui/noti_tutorial_w.htm index b7a5f14..c1b05dd 100644 --- a/org.tizen.tutorials/html/web/tizen/ui/noti_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/tizen/ui/noti_tutorial_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              @@ -41,17 +41,7 @@

                              This tutorial demonstrates how you can manage notifications created based on application events.

                              - - - - - - - - - -
                              Note
                              The Notification API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. -

                              All mandatory APIs are supported on the Tizen Emulators.

                              +

                              The Notification API is mandatory for both Tizen mobile and wearable profiles, which means that it is supported in all mobile and wearable devices. All mandatory APIs are supported on the Tizen Emulators.

                              Warm-up

                              Become familiar with the Notification API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/tizen/ui/ui_tutorials_w.htm b/org.tizen.tutorials/html/web/tizen/ui/ui_tutorials_w.htm index a4186dc..c36ff3a 100644 --- a/org.tizen.tutorials/html/web/tizen/ui/ui_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tizen/ui/ui_tutorials_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              diff --git a/org.tizen.tutorials/html/web/tutorials_w.htm b/org.tizen.tutorials/html/web/tutorials_w.htm index 6359524..40f70eb 100644 --- a/org.tizen.tutorials/html/web/tutorials_w.htm +++ b/org.tizen.tutorials/html/web/tutorials_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              @@ -35,6 +35,16 @@

                              Tizen Web tutorials teach you how to incorporate Tizen features into your application. The tutorials cover detailed code snippets to help you see how to write the required code in practice.

                              + +

                              Select the feature you are interested in and see how you can implement its various functionalities into your application:

                              + + + @@ -45,16 +55,7 @@
                              - -

                              Select the feature you are interested in and see how you can implement its various functionalities into your application:

                              - - - +
                              diff --git a/org.tizen.tutorials/html/web/w3c/communication/comm_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/communication/comm_tutorials_w.htm index aa7266a..62e5de2 100644 --- a/org.tizen.tutorials/html/web/w3c/communication/comm_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/communication/comm_tutorials_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              @@ -38,7 +38,7 @@
                            • HTML5 Web Messaging: Accessing Device-specific Information

                              Demonstrates how you can send messages between documents and through the message channel ports.

                            • WebSocket: Exchanging Data Using a Socket Server

                              Demonstrates how you can manage the client-server communication.

                            • -
                            • XMLHttpRequest Level 1 and 2: Communicating with the Server

                              Demonstrates how you can communicate with a Web server using HTTP requests.

                            • +
                            • XMLHttpRequest (Level 1 and 2): Communicating with the Server

                              Demonstrates how you can communicate with a Web server using HTTP requests.

                            The following tutorials apply in mobile applications only:

                            diff --git a/org.tizen.tutorials/html/web/w3c/communication/server_sent_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/communication/server_sent_tutorial_w.htm index d26ec30..c9414e6 100644 --- a/org.tizen.tutorials/html/web/w3c/communication/server_sent_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/communication/server_sent_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -39,16 +39,7 @@

                            This tutorial demonstrates how you can implement server push messaging.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            +

                            This feature is supported in mobile applications only.

                            Warm-up

                            Become familiar with the Server-Sent Events API basics by learning about:

                            diff --git a/org.tizen.tutorials/html/web/w3c/communication/web_messaging_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/communication/web_messaging_tutorial_w.htm index 78b599b..9d7cfba 100644 --- a/org.tizen.tutorials/html/web/w3c/communication/web_messaging_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/communication/web_messaging_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            diff --git a/org.tizen.tutorials/html/web/w3c/communication/websocket_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/communication/websocket_tutorial_w.htm index 503f642..59daf68 100644 --- a/org.tizen.tutorials/html/web/w3c/communication/websocket_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/communication/websocket_tutorial_w.htm @@ -18,7 +18,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            diff --git a/org.tizen.tutorials/html/web/w3c/communication/xmlhttprequest_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/communication/xmlhttprequest_tutorial_w.htm index 530df2e..71b1545 100644 --- a/org.tizen.tutorials/html/web/w3c/communication/xmlhttprequest_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/communication/xmlhttprequest_tutorial_w.htm @@ -11,14 +11,14 @@ - XMLHttpRequest Level 1 and 2: Communicating with the Server + XMLHttpRequest (Level 1 and 2): Communicating with the Server
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            @@ -42,7 +42,7 @@
                            -

                            XMLHttpRequest Level 1 and 2: Communicating with the Server

                            +

                            XMLHttpRequest (Level 1 and 2): Communicating with the Server

                            This tutorial demonstrates how you can communicate with a Web server using HTTP requests.

                            diff --git a/org.tizen.tutorials/html/web/w3c/device/battery_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/battery_tutorial_w.htm index ad90e97..0d15a6f 100644 --- a/org.tizen.tutorials/html/web/w3c/device/battery_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/battery_tutorial_w.htm @@ -17,7 +17,7 @@
                            -

                            Mobile Web Wearable Web

                            +

                            Mobile Web Wearable Web

                            Content

                            diff --git a/org.tizen.tutorials/html/web/w3c/device/browser_state_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/browser_state_tutorial_w.htm index 57a0414..4a8c118 100644 --- a/org.tizen.tutorials/html/web/w3c/device/browser_state_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/browser_state_tutorial_w.htm @@ -17,7 +17,7 @@
                            -

                            Mobile Web

                            +

                            Mobile Web

                            Content

                            @@ -39,17 +39,9 @@

                            This tutorial demonstrates how you can access the browser connection state.

                            - - - - - - - - - -
                            Note
                            This feature is supported in mobile applications only.
                            - + +

                            This feature is supported in mobile applications only.

                            +

                            Warm-up

                            Become familiar with the HTML5 Browser state API basics by learning about:

                              diff --git a/org.tizen.tutorials/html/web/w3c/device/device_orientation_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/device_orientation_tutorial_w.htm index 48d08ca..f224b44 100644 --- a/org.tizen.tutorials/html/web/w3c/device/device_orientation_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/device_orientation_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Content

                              diff --git a/org.tizen.tutorials/html/web/w3c/device/device_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/device/device_tutorials_w.htm index 211cdaf..0f77e1d 100644 --- a/org.tizen.tutorials/html/web/w3c/device/device_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/device_tutorials_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web Wearable Web

                              +

                              Mobile Web Wearable Web

                              Related Info

                              diff --git a/org.tizen.tutorials/html/web/w3c/device/screen_orientation_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/screen_orientation_tutorial_w.htm index d5f151e..d22052e 100644 --- a/org.tizen.tutorials/html/web/w3c/device/screen_orientation_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/screen_orientation_tutorial_w.htm @@ -17,7 +17,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              Content

                              @@ -38,16 +38,8 @@

                              This tutorial demonstrates how you can manage the screen orientation state.

                              - - - - - - - - - -
                              Note
                              This feature is supported in mobile applications only.
                              + +

                              This feature is supported in mobile applications only.

                              Warm-up

                              diff --git a/org.tizen.tutorials/html/web/w3c/device/task_compass_w.htm b/org.tizen.tutorials/html/web/w3c/device/task_compass_w.htm index 81e3254..1657542 100644 --- a/org.tizen.tutorials/html/web/w3c/device/task_compass_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/task_compass_w.htm @@ -18,7 +18,7 @@
                              -

                              Mobile Web

                              +

                              Mobile Web

                              @@ -154,7 +154,7 @@ else angleMemory = angle;
                        9. -
                        10. The needle position is updated by rotating the needle with the rotate() method of the transform function, based on the angle calculated above.

                          +
                        11. The needle position is updated by rotating the needle with the rotate() method of the transform function, based on the angle calculated above.

                          $('#direction').text(text);
                          diff --git a/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_mw.htm b/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_mw.htm
                          index e0db8ee..5288fdd 100644
                          --- a/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_mw.htm
                          +++ b/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_mw.htm
                          @@ -18,7 +18,7 @@
                           
                           
                          -

                          Mobile Web

                          +

                          Mobile Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_ww.htm b/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_ww.htm index 03d00bb..be8e699 100644 --- a/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_ww.htm +++ b/org.tizen.tutorials/html/web/w3c/device/task_touch_paint_ww.htm @@ -18,7 +18,7 @@
                          -

                          Wearable Web

                          +

                          Wearable Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/device/touch_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/touch_tutorial_w.htm index 42ba4cf..5196fe7 100644 --- a/org.tizen.tutorials/html/web/w3c/device/touch_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/touch_tutorial_w.htm @@ -17,7 +17,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/device/vibration_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/device/vibration_tutorial_w.htm index 9b6c7ad..a691d13 100644 --- a/org.tizen.tutorials/html/web/w3c/device/vibration_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/device/vibration_tutorial_w.htm @@ -17,7 +17,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/graphics/canvas_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/graphics/canvas_tutorial_w.htm index 18f2d77..2df5db9 100644 --- a/org.tizen.tutorials/html/web/w3c/graphics/canvas_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/graphics/canvas_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/graphics/graphics_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/graphics/graphics_tutorials_w.htm index 73252fe..7ca29b8 100644 --- a/org.tizen.tutorials/html/web/w3c/graphics/graphics_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/graphics/graphics_tutorials_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/graphics/svg_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/graphics/svg_tutorial_w.htm index 92218d7..a41dd8c 100644 --- a/org.tizen.tutorials/html/web/w3c/graphics/svg_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/graphics/svg_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/graphics/task_basicwatch_w.htm b/org.tizen.tutorials/html/web/w3c/graphics/task_basicwatch_w.htm index 8610251..c5a1b76 100644 --- a/org.tizen.tutorials/html/web/w3c/graphics/task_basicwatch_w.htm +++ b/org.tizen.tutorials/html/web/w3c/graphics/task_basicwatch_w.htm @@ -18,7 +18,7 @@
                          -

                          Wearable Web

                          +

                          Wearable Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/location/geolocation_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/location/geolocation_tutorial_w.htm index 410567a..6281811 100644 --- a/org.tizen.tutorials/html/web/w3c/location/geolocation_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/location/geolocation_tutorial_w.htm @@ -16,7 +16,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/location/location_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/location/location_tutorials_w.htm index 3ffd3fb..a6826e9 100644 --- a/org.tizen.tutorials/html/web/w3c/location/location_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/location/location_tutorials_w.htm @@ -16,7 +16,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/getusermedia_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/media/getusermedia_tutorial_w.htm index d5a7728..ddb899a 100644 --- a/org.tizen.tutorials/html/web/w3c/media/getusermedia_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/getusermedia_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/media_capture_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/media/media_capture_tutorial_w.htm index 7652634..0cd33de 100644 --- a/org.tizen.tutorials/html/web/w3c/media/media_capture_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/media_capture_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -38,16 +38,7 @@

                          This tutorial demonstrates how you can use the HTML media capture feature.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          +

                          This feature is supported in mobile applications only.

                          Warm-up

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/media_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/media/media_tutorials_w.htm index def7baf..2ea94a4 100644 --- a/org.tizen.tutorials/html/web/w3c/media/media_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/media_tutorials_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/task_piano_w.htm b/org.tizen.tutorials/html/web/w3c/media/task_piano_w.htm index 49f38f8..5da486d 100644 --- a/org.tizen.tutorials/html/web/w3c/media/task_piano_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/task_piano_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/task_selfcamera_w.htm b/org.tizen.tutorials/html/web/w3c/media/task_selfcamera_w.htm index 4af1cc6..0b004fc 100644 --- a/org.tizen.tutorials/html/web/w3c/media/task_selfcamera_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/task_selfcamera_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/video_audio_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/media/video_audio_tutorial_w.htm index fd4627a..2f0cc35 100644 --- a/org.tizen.tutorials/html/web/w3c/media/video_audio_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/video_audio_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/media/webaudio_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/media/webaudio_tutorial_w.htm index c65629e..81054de 100644 --- a/org.tizen.tutorials/html/web/w3c/media/webaudio_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/media/webaudio_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -40,16 +40,7 @@

                          This tutorial demonstrates how you can play audio content using the Web audio.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          +

                          This feature is supported in mobile applications only.

                          Warm-up

                          diff --git a/org.tizen.tutorials/html/web/w3c/perf_opt/page_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/perf_opt/page_tutorial_w.htm index 409c54c..6005a1a 100644 --- a/org.tizen.tutorials/html/web/w3c/perf_opt/page_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/perf_opt/page_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/perf_opt/performance_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/perf_opt/performance_tutorials_w.htm index 5562228..0d7f383 100644 --- a/org.tizen.tutorials/html/web/w3c/perf_opt/performance_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/perf_opt/performance_tutorials_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/perf_opt/timing_control_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/perf_opt/timing_control_tutorial_w.htm index 51431e9..f817308 100644 --- a/org.tizen.tutorials/html/web/w3c/perf_opt/timing_control_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/perf_opt/timing_control_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/perf_opt/web_workers_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/perf_opt/web_workers_tutorial_w.htm index bbccb9b..8f05a48 100644 --- a/org.tizen.tutorials/html/web/w3c/perf_opt/web_workers_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/perf_opt/web_workers_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/security/cors_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/security/cors_tutorial_w.htm index f1ad7cc..3df2a46 100644 --- a/org.tizen.tutorials/html/web/w3c/security/cors_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/security/cors_tutorial_w.htm @@ -17,7 +17,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/security/iframe_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/security/iframe_tutorial_w.htm index 09c61bc..fff4c0a 100644 --- a/org.tizen.tutorials/html/web/w3c/security/iframe_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/security/iframe_tutorial_w.htm @@ -17,7 +17,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/security/security_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/security/security_tutorials_w.htm index 86e7811..f93f96c 100644 --- a/org.tizen.tutorials/html/web/w3c/security/security_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/security/security_tutorials_w.htm @@ -17,7 +17,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/appcache_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/storage/appcache_tutorial_w.htm index 2e1048c..e22f834 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/appcache_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/appcache_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -41,16 +41,7 @@

                          This tutorial demonstrates how you can use HTML5 application caches.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          +

                          This feature is supported in mobile applications only.

                          Warm-up

                          Become familiar with the HTML5 Application caches API basics by learning about:

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/file_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/storage/file_tutorial_w.htm index b9b17ba..7d7da0e 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/file_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/file_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/indexdb_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/storage/indexdb_tutorial_w.htm index c413cfd..e27b9b7 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/indexdb_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/indexdb_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/storage_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/storage/storage_tutorials_w.htm index cb579f1..36d796f 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/storage_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/storage_tutorials_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/websql_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/storage/websql_tutorial_w.htm index cae3fc4..b52ea15 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/websql_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/websql_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -52,16 +52,8 @@

                          Web SQL Database: Creating and Querying Databases

                          This tutorial demonstrates how you can use SQL databases in Tizen applications.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          + +

                          This feature is supported in mobile applications only.

                          Warm-up

                          diff --git a/org.tizen.tutorials/html/web/w3c/storage/webstorage_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/storage/webstorage_tutorial_w.htm index 8b927f4..e2df93d 100644 --- a/org.tizen.tutorials/html/web/w3c/storage/webstorage_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/storage/webstorage_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/camera_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/camera_tutorial_w.htm index c918a0b..0050eaf 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/camera_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/camera_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Wearable Web

                          +

                          Wearable Web

                          Content

                          @@ -40,16 +40,7 @@

                          This tutorial demonstrates how you can control the camera on a wearable device.

                          - - - - - - - - - -
                          Note
                          This feature is supported in wearable applications only.
                          +

                          This feature is supported in wearable applications only.

                          Warm-up

                          Become familiar with the Camera API (Tizen Extension) API basics by learning about:

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/fullscreen_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/fullscreen_tutorial_w.htm index 061924f..4828165 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/fullscreen_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/fullscreen_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web

                          +

                          Mobile Web

                          Content

                          @@ -39,16 +39,7 @@

                          This tutorial demonstrates how you can display an element in the fullscreen mode.

                          - - - - - - - - - -
                          Note
                          This feature is supported in mobile applications only.
                          +

                          This feature is supported in mobile applications only.

                          Warm-up

                          Become familiar with the FullScreen API - Mozilla API basics by learning about:

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/supplement_tutorials_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/supplement_tutorials_w.htm index cde38c7..3db8c42 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/supplement_tutorials_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/supplement_tutorials_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/task_camera_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/task_camera_w.htm index 7916992..d604c6f 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/task_camera_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/task_camera_w.htm @@ -18,7 +18,7 @@
                          -

                          Wearable Web

                          +

                          Wearable Web

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/typedarray_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/typedarray_tutorial_w.htm index 458a11f..b18d312 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/typedarray_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/typedarray_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/supplement/webgl_tutorial_w.htm b/org.tizen.tutorials/html/web/w3c/supplement/webgl_tutorial_w.htm index acaaf7d..63e0034 100644 --- a/org.tizen.tutorials/html/web/w3c/supplement/webgl_tutorial_w.htm +++ b/org.tizen.tutorials/html/web/w3c/supplement/webgl_tutorial_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Content

                          diff --git a/org.tizen.tutorials/html/web/w3c/tutorials_w3c_w.htm b/org.tizen.tutorials/html/web/w3c/tutorials_w3c_w.htm index d89903d..0c5f2ce 100644 --- a/org.tizen.tutorials/html/web/w3c/tutorials_w3c_w.htm +++ b/org.tizen.tutorials/html/web/w3c/tutorials_w3c_w.htm @@ -18,7 +18,7 @@
                          -

                          Mobile Web Wearable Web

                          +

                          Mobile Web Wearable Web

                          Related Info

                          @@ -59,7 +59,7 @@

                          Demonstrates how you can create and run a wearable watch face application using the Tizen IDE.

              -

              For more information about implementing the UI for your application using the W3C features, see W3C.

              +

              For more information about implementing the UI for your application using the W3C features, see W3C.

              diff --git a/org.tizen.tutorials/html/web/w3c/watchface/developing_watch_app.htm b/org.tizen.tutorials/html/web/w3c/watchface/developing_watch_app.htm index 151595f..9097626 100644 --- a/org.tizen.tutorials/html/web/w3c/watchface/developing_watch_app.htm +++ b/org.tizen.tutorials/html/web/w3c/watchface/developing_watch_app.htm @@ -18,7 +18,7 @@
              -

              Wearable Web

              +

              Wearable Web

              @@ -39,16 +39,7 @@

              For more information on the sample functionality and the full source code, see Basic Watch task.

              - - - - - - - - - -
              Note
              This feature is supported in wearable applications only.
              +

              This feature is supported in wearable applications only.

              This article describes the main steps required to develop a watch face application using the Tizen IDE. For more detailed information about the application development process, see Web Application Development Process. To learn how to design a watch face, see the Gear UI guides on the Samsung Developers site.

              diff --git a/org.tizen.tutorials/index.xml b/org.tizen.tutorials/index.xml index 585f239..de5117f 100644 --- a/org.tizen.tutorials/index.xml +++ b/org.tizen.tutorials/index.xml @@ -9,6 +9,7 @@ + @@ -111,7 +112,7 @@ - + @@ -147,12 +148,17 @@ - + + - - + + + + + + @@ -161,8 +167,8 @@ - + @@ -188,8 +194,8 @@ - + @@ -213,14 +219,14 @@ - + - + @@ -229,10 +235,9 @@ - - - + + @@ -251,6 +256,7 @@ + diff --git a/org.tizen.ui.guides/.project b/org.tizen.ui.guides/.project deleted file mode 100755 index 2c22bce..0000000 --- a/org.tizen.ui.guides/.project +++ /dev/null @@ -1,22 +0,0 @@ - - - org.tizen.ui.guides_2.4.0 - - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - - diff --git a/org.tizen.ui.guides/META-INF/MANIFEST.MF b/org.tizen.ui.guides/META-INF/MANIFEST.MF deleted file mode 100755 index 3ef5790..0000000 --- a/org.tizen.ui.guides/META-INF/MANIFEST.MF +++ /dev/null @@ -1,7 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 1 -Bundle-Name: Tizen UI Guides -Bundle-SymbolicName: org.tizen.ui.guides;singleton=true -Bundle-Version: 2.4.0 -Bundle-Vendor: The Linux Foundation - diff --git a/org.tizen.ui.guides/build.properties b/org.tizen.ui.guides/build.properties deleted file mode 100755 index 264c2a1..0000000 --- a/org.tizen.ui.guides/build.properties +++ /dev/null @@ -1,8 +0,0 @@ -bin.includes = plugin.xml,\ - META-INF/,\ - html/,\ - build.properties,\ - .project,\ - about.html,\ - index.xml - diff --git a/org.tizen.ui.guides/html/cover_page.htm b/org.tizen.ui.guides/html/cover_page.htm deleted file mode 100755 index 1d59870..0000000 --- a/org.tizen.ui.guides/html/cover_page.htm +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - Tizen UI Guides - - - - -

              Tizen
              -UI Guides

              - -

              Click the application type you want:

              -

              Web Application Native Application

              - - - - - - - - - - - - diff --git a/org.tizen.ui.guides/html/css/snippet.css b/org.tizen.ui.guides/html/css/snippet.css deleted file mode 100755 index 2be1b1f..0000000 --- a/org.tizen.ui.guides/html/css/snippet.css +++ /dev/null @@ -1,52 +0,0 @@ -/* Pretty printing styles. Used with prettify.js. */ - -/* SPAN elements with the classes below are added by prettyprint. */ -.pln { color: #000 } /* plain text */ - -@media screen { - .str { color: #793AFF } /* string content */ - .kwd { color: #7F0055 } /* a keyword */ - .com { color: green} /* a comment */ - .typ { color: #1C1C1C } /* a type name */ - .lit { color: black } /* a literal value */ - /* punctuation, lisp open bracket, lisp close bracket */ - .pun, .opn, .clo { color: #1C1C1C} - .tag { color: #008 } /* a markup tag name */ - .atn { color: #606 } /* a markup attribute name */ - .atv { color: #080 } /* a markup attribute value */ - .dec, .var { color: #606 } /* a declaration; a variable name */ - .fun { color: red } /* a function name */ -} - -/* Use higher contrast and text-weight for printable form. */ -@media print, projection { - .str { color: #060 } - .kwd { color: #006; font-weight: bold } - .com { color: #600; font-style: italic } - .typ { color: #404; font-weight: bold } - .lit { color: #044 } - .pun, .opn, .clo { color: #440 } - .tag { color: #006; font-weight: bold } - .atn { color: #404 } - .atv { color: #060 } -} - -/* Put a border around prettyprinted code snippets. */ -pre.prettyprint { overflow: auto; padding: 2px; border: 1px solid #888 } - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ -li.L0, -li.L1, -li.L2, -li.L3, -li.L5, -li.L6, -li.L7, -li.L8 { list-style-type: none } -/* Alternate shading for lines */ -li.L1, -li.L3, -li.L5, -li.L7, -li.L9 { background: #eee } diff --git a/org.tizen.ui.guides/html/css/styles.css b/org.tizen.ui.guides/html/css/styles.css deleted file mode 100755 index ad7ebcb..0000000 --- a/org.tizen.ui.guides/html/css/styles.css +++ /dev/null @@ -1,756 +0,0 @@ -@charset "utf-8"; - -body { - background: white; - color: #1C1C1C; - margin-right: 20px; - margin-left: 20px; - font-size: 9pt; - font-weight: normal; - font-family: Arial, Helvetica, sans-serif; -} - -h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ol, dl, dd, dt, footer { - font-family: Arial, Verdana, Helvetica, sans-serif - } - -/* Set default font to 9 pt */ -table, div, p, dl, td, caption, th, ul, ol, li, dd, dt, pre, code { - font-size: 9pt; -} - -pre, code { - font-family: "Courier New", Courier, monospace; - border: 1px solid #719cc7; - margin: 6px 1.5px; - padding: 1px 1px 1px 1px; - font-weight: normal; - font-style: normal; -} - -h1 {font-size: 24pt; color: #0E437D;} -h2 {font-size: 18pt; color: #0E437D;} -h3 {font-size: 14pt; color: #1C1C1C;} -h4 {font-size: 12pt; color: #1C1C1C;} -h5 {font-size: 10pt; color: #1C1C1C;} - -h1, h2, h3, h4, h5 { - font-weight: bold; - font-style: normal; - line-height: normal; - margin-top: 16pt; -} - -caption, p.caption { - font-size: 9pt; - color: #1C1C1C; - font-weight: bold; - text-align: left; - margin-top: 20px; - margin-bottom: 0px; -} - -ol { - margin-bottom: 20px; -} - -ul ul , ol ul, ul ol, ol ol{ - margin-top: 10px; -} - -ul li, ol li { - margin-bottom: 10px; -} - -ol.tutorstep li { - border-top: 2px solid #719cc7; - list-style-position: inside; - font-weight: bold; - margin-top: 30px; - margin-left: -20px; - padding-top: 3px; - font-size: 12pt; -} - -ol.tutorstep li p{ - font-size: 9pt; - font-weight: normal; - margin-top: 10px; -} - -ol.tutorstep ol li, ol.tutorstep li ol li, ol.tutorstep li ul li { - font-size: 9pt; - list-style-position: outside; - margin-left: 0px; - font-weight: normal; -} - -ol.tutorstep ol li p, ol.tutorstep ul li p { - font-size: 9pt; - font-weight: normal; - margin-top: 5px; -} - -ol li p, ul li p { - font-size: 9pt; - font-weight: normal; - margin-bottom: 2px; - margin-top: 2px; -} - -ol ol , ol.tutorstep ol{ - font-size: 9pt; - font-weight: normal; - list-style-type: lower-alpha; - color: #1C1C1C; - border-style: none; - margin-top: 10px; -} - -ol.tutorstep ul { - margin-top: 10px; - font-size: 9pt; -} - -ol ol li, ol ul li, ol.tutorstep ol li, ol.tutorstep ul li { - border-style: none; - margin-top: 5px; - font-size: 9pt; -} - -ul { - font-size: 9pt; - font-weight: normal; - color: #1C1C1C; -} - - -/* End of font face declarations */ - -/* Set table borders and heading row background */ -table { - border: 0px; - border-collapse: collapse; - width: 100%; - margin-top: 20px; - margin-bottom: 20px; - background: white; -} - -th { - border-top: 2px solid #719cc7; - border-right: 1px solid #c6d9f1; - border-left: 1px solid #c6d9f1; - background-color: #f3f7fb; - padding: 4px; - color: #719cc7; - font-size: 9pt; - font-weight: bold; -} - -td { - border: 1px solid #c6d9f1; - vertical-align:top; - padding: 3px 20px 5px 20px; - } - -td.middle { - border: 1px solid #c6d9f1; - vertical-align:middle; - padding: 3px 20px 5px 20px; - } - -/* Notes stand out using a light top & bottom borders with yellow background */ -table.note { - border-top: 2px solid #719cc7; - border-left: 0px; - border-right: 0px; - width: 100%; -} - -tr.note { - text-align: left; -} - -th.note { - text-align: left; - background-color: #ddd9c3; - background-image: note.gif; - border-top: 2px solid #719cc7; - border-bottom:1px solid #719cc7; - border-right: none; - -} - -td.note, p.note { - background-color: #eeece1; - color: #1C1C1C; - padding: 5px; - margin-top:12px; - margin-bottom:12px; - border: none; -} - -/* Figure titles are centered and bolded */ -p.figure , ol.tutorstep li p.figure, ol.tutorstep ol li p.figure, ol.tutorstep ul li p.figure { - text-align: center; - font-weight: bold; -} - -/* Red background and white text for things that need fixing before release */ -.fix { - background-color: red; - font-weight: bold; - color: white; - } - -/* Classes for creating collapsible content */ -#banner { - padding: 8px 4px 8px 4px; - /* top right bottom left */ - border: 1px solid #7f7f7f; - width: 100%; - background-image: url("banner.png"); - text-align: left; - font-weight: bold; - font-size: 9pt; - color: #ffffff; -} - -#toc-navigation {width: 20%; position: fixed; right: 17px; top: 0; bottom: 51px; /* overflow: auto; *//* min-width: 200px; *//* background: white; */z-index: 100;padding-top: 10px;/* padding-bottom: 88px; */margin-bottom: 89px;} -#toc {padding: 0px 20px 5px 20px; /* border: 2px solid #567a9c; */ border-radius: 15px;position: absolute;top: 78px;bottom: 9px;overflow: auto;/* margin-bottom: 5px; */padding-bottom: 5px;border-bottom: 3px transparent solid;margin-left: 5px;} -#main {width: 75%; height: 90%;} -#container {width:100%;} -#container #contents {padding:0px 0 20px; overflow: auto;position: fixed;top: 0;bottom: 0;margin-bottom: 64px;right: 200px;left: 20px;} -body.no-toc #container #contents {right: 0;padding-right:30px;} -body.no-toc #toc-navigation {width: auto;} -body.no-toc .top {right: 19px; /* float:none; */ width: 28px;} -body.no-toc #profile {float: right;right: -32px;} -body.no-toc #profile p {padding: 0; margin: 0;} -#container #contents:after {content: "."; display: block; height: 20px; clear: both; visibility: hidden;} - #container #contents>.content {/* width:75%; */min-width: 600px;/* right: 300px; *//* position: fixed; */padding-right: 5px;} - #container #contents>.content>.cont { margin-bottom:80px; padding-bottom:80px; } - -.devicespecs-util {float:right; margin-top:25px;} - .devicespecs-util ul.dutil {margin:0; padding-bottom:0; height: 11px; list-style-type:none;} - .devicespecs-util ul.dutil:after {content: "."; display: block; height: 0px; clear: both; visibility: hidden;} - .devicespecs-util ul.dutil li {float:left; margin-right:8px; padding-right:8px; background:url('../images/bg_util_bar.gif') no-repeat right center; color:#666;} - .devicespecs-util ul.dutil li.none {margin-right:0; padding-right:0; background-image:none;} - .devicespecs-util ul.dutil li a { font-size:11px; color:#666; line-height: 11px;} - .devicespecs-util ul.dutil li a:hover { color:#222; } - .devicespecs-util ul.dutil li a:active { color:#222; } - -ul.devicespecifications {clear:both; width:100%; margin:0; padding: 0;} -ul.devicespecifications > li { width:100%; margin-top:0; padding-left:0; list-style-type:none; border:1px solid #799cd3; padding: 5px 0px 5px 0px;} -ul.devicespecifications li div.devicespec-con {width:90%; margin:10px 0 20px 0; padding:0 14px; font-size: 13px;} -ul.devicespecifications li div.devicespec-tit {/*height:22px;*/ padding-right: 71px; background-color:#ffffff; position: relative;} - ul.devicespecifications li div.devicespec-tit .items-tit { /*float:left;*/ margin:0 0 0 14px; padding:0; color:#567a9c; line-height: 22px; font-size: 14px; font-style:normal; font-weight: bold;} - - ul.devicespecifications li div.devicespec-tit .items-tit-h2 { /*float:left;*/ margin: 0px 0px 0px 14px; padding:0; line-height: 22px; font-size: 18pt; color: #0E437D; font-style:normal; font-weight: bold;} - ul.devicespecifications li div.devicespec-tit .items-tit-h3 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 14pt; color: #1C1C1C; font-style:normal; font-weight: bold;} - ul.devicespecifications li div.devicespec-tit .items-tit-h4 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 12pt; color: #1C1C1C; font-style:normal; font-weight: bold;} - - ul.devicespecifications li div.devicespec-tit > span {position: absolute; top: 0; right:0;background:#416cbb; display:block; height:22px; margin-right:0; border-left: solid 1px #7a9bd4; } - ul.devicespecifications li div.devicespec-tit > span a.bt-arr {display:block; width: 55px; height:15px; margin-left:0; padding-top:5px; padding-left: 14px; text-align:left; background: url('../images/ico_arr_hidden.gif') 46px 9px no-repeat;} - ul.devicespecifications li div.devicespec-tit > span a.bt-arr em {display:inline-block; height: 14px; line-height:11px; font-size:11px; color:#fff; font-style:normal; margin-right: 8px;} - ul.devicespecifications li div.devicespec-tit > span * {vertical-align:middle;} - - ul.devicespecifications li div.devicespec-con ul.con-list { width:100%; } - ul.devicespecifications li div.devicespec-con ul.con-list li {line-height: 18px; margin:0; padding:0 0 0 7px; background: url("../images/ico_bullet_2_7.gif") 0 8px no-repeat; } - -.ul.ul, .ul.ul li {margin-bottom: 10px; list-style-type: disc; border: none;} -.ul.ul ul, .ul.ul ul li, .ol.ol ul, .ol.ol ul li {list-style-type: circle;} -.ol.ol, .ol.ol li {list-style-type: decimal; border: none;} -.ol.ol ol, .ol.ol ol li, .ul.ul ol, .ul.ul ol li {list-style-type: lower-alpha;} - -.static-cont {width:100%; margin-bottom:40px;} - -.top {text-align: right;} -.toc, ul.toc{ - margin: 10px 0px 0px 0px; - padding-left: 13px; - list-style: disc; - font-size: 9pt; - line-height: 115%; - } - -.toc-title { - font-size: 12pt; - color: #0E437D; - font-weight: bold; - font-style: normal; - line-height: normal; - margin-top: 16pt; -} - -a.top { - display:block; - float: right; - position:fixed; - width: 28px; - height:89px; - bottom:50px; - z-index: 101; - right: 19%; - } - -a img {border: 0;} - -/* Footer includes space and a gray line above */ -#footer { - position: fixed; - /* width: 100%; */ - bottom: 0px; - text-align: center; - border-top: 1px solid #CCCCCC; - background-color: #FFFFFF; - left: 21px; right: 21px; -} - -.footer {font-size: 8pt;} - -caption { - font-size: 9pt; - color: #1C1C1C; - font-weight: bold; - text-align: center; - margin-top: 20px; - margin-bottom: 0px; -} - -div.qindex, div.navpath, div.navtab{ - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - padding: 2px; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a:link { - color: #719cc7; - text-decoration: underline; - font-weight: bold; -} - -a:hover { - color: #0e437d; -} - -a:visited { - text-decoration: underline; - color: #719cc7; - font-weight: bold; -} - -a.qindex { - font-weight: bold; - padding: 2px; -} - -a.qindex:hover { - text-decoration: underline; - color: #0e437d; - padding: 2px; -} - -a.qindex:visited { - text-decoration: underline; - font-weight: bold; - color: #719cc7; - padding: 2px; -} - -a.qindexHL { - text-decoration: underline; - font-weight: bold; - background-color: #6666cc; - color: #ffffff; - padding: 2px 6px; - border: 1px double #9295C2; -} - -a.qindexHL:hover { - text-decoration: none; - background-color: #6666cc; - color: #ffffff; - padding: 2px 6px; -} - -dl.el { - margin-left: -1cm -} - -.fragment { - font-family: monospace, fixed; - font-size: 105%; -} - -pre.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding: 4px 6px; - margin: 4px 8px 4px 2px; -} - -div.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding: 6px; -} - -div.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -td.md { - background-color: #f5f5f5; - font-weight: bold; -} - -td.mdname1 { - background-color: #f5f5f5; - font-weight: bold; - color: #602020; -} - -td.mdname { - background-color: #f5f5f5; - font-weight: bold; - color: #602020; - width: 600px; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -td.indexkey { - background-color: #eeeeff; - font-weight: bold; - border: 1px solid #CCCCCC; - margin: 2px 0px 2px 0; - padding: 2px 10px; -} - -td.indexvalue { - background-color: #eeeeff; - border: 1px solid #CCCCCC; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #f0f0f0; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { -} - -img.formulaInl { - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } -span.vhdldigit { color: #ff00ff } -span.vhdlchar { color: #000000 } -span.vhdlkeyword { color: #700070 } -span.vhdllogic { color: #ff0000 } - -.mdTable { - border: 1px solid #868686; - background-color: #F4F4FB; -} - -.mdRow { - padding: 8px 10px; -} - -/* @group Member Descriptions */ - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F4F4F4A; - border: none; - margin: 4px; - padding: 3px 8px 4px 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #DBDBDB; -} - -.memTemplParams { - color: #606060; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; - margin-left: 3px; -} - -.memnav { - background-color: #eeeeff; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.memitem { - padding: 0; -} - -.memname { - white-space: nowrap; - font-weight: bold; -} - -.memproto, .memdoc { - border: 1px solid #9BBCDD; -} - -.memproto { - padding: 0; - background-color: #D5E2EF; - font-weight: bold; - -webkit-border-top-left-radius: 8px; - -webkit-border-top-right-radius: 8px; - -moz-border-radius-topleft: 8px; - -moz-border-radius-topright: 8px; -} - -.memdoc { - padding: 2px 5px; - background-color: #eef3f5; - border-top-width: 0; - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -moz-border-radius-bottomleft: 8px; - -moz-border-radius-bottomright: 8px; -} - -.memdoc p, .memdoc dl, .memdoc ul { - margin: 6px 0; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #853E0E; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} - -/* @end */ - -.search { color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #eeeeff; -} - -td.tiny { - font-size: 75%; -} - -.highlight { - background-color:#E2E2FF; -} - -/*---------- ide-eclipse Styles ---------*/ -.sh_ide-eclipse{font-family: "Courier New", Courier, monospace; - margin: 0px 0px; - padding: -30px -30px -30px -30px; - font-weight: normal; - font-style: normal;} -.sh_ide-eclipse .sh_sourceCode{background-color:#fff;color:#000;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_keyword{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_type{color:#7f0055;font-weight:bold;font-style:normal;} -/*.sh_ide-eclipse .sh_sourceCode .sh_string{color:#00f;font-weight:normal;font-style:normal;}*/ -.sh_ide-eclipse .sh_sourceCode .sh_string{color:#2A00FF;font-weight:normal;font-style:normal;} - -.sh_ide-eclipse .sh_sourceCode .sh_regexp{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_specialchar{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_comment{color:#238E23;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_number{color:#000;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_preproc{color:#3f5fbf;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_function{color:#000;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_url{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_date{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_time{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_file{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_ip{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_name{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_variable{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_oldfile{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_newfile{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_difflines{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_selector{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_property{color:#7f0055;font-weight:bold;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_value{color:#00f;font-weight:normal;font-style:normal;} -.sh_ide-eclipse .sh_sourceCode .sh_unknown{font-family: "Courier New", Courier, monospace;} - -/*------------- STYLE FOR NAMES FROM XML FILE -------------*/ -.sh_styleFromXML{color:#800000;font-weight:bold;} -/*-------------------------------------------------------*/ - -/*-------- Snippet Base Styles ----------*/ -.snippet-wrap {position:relative;} -*:first-child+html .snippet-wrap {display:inline-block;} -* html .snippet-wrap {display:inline-block;} -.snippet-reveal{text-decoration:underline;} -.snippet-wrap .snippet-menu, .snippet-wrap .snippet-hide {position:absolute; top:-99999px; right:15px; font-size:.9em;z-index:1;background-color:transparent;} -.snippet-wrap .snippet-hide {top:auto; bottom:1px;} -*:first-child+html .snippet-wrap .snippet-hide {bottom:1px;} -* html .snippet-wrap .snippet-hide {bottom:1px;} -.snippet-wrap .snippet-menu pre, .snippet-wrap .snippet-hide pre {background-color:transparent; margin:1; padding:0;} -.snippet-wrap .snippet-menu a, .snippet-wrap .snippet-hide a {padding:1px; text-decoration:underline;} -.snippet-wrap pre.sh_sourceCode{padding:1px;line-height:120%;overflow:auto;position:relative; --moz-border-radius:0px; --webkit-border-radius:0px; -border-radius:0px; -box-shadow: 1px 1px px #000; --moz-box-shadow: 2px 2px 1px #000; --webkit-box-shadow: 1px 1px 1px #000;} -.snippet-wrap pre.snippet-textonly {padding:1em;} -*:first-child+html .snippet-wrap pre.snippet-formatted {padding:0.5em 0.5em;} -* html .snippet-wrap pre.snippet-formatted {padding:0em 0.3em;} -.snippet-reveal pre.sh_sourceCode {padding:0em 0em; text-align:right;} -.snippet-wrap .snippet-num li{padding-left:2px;} -.snippet-wrap .snippet-no-num{list-style:none; padding:0em 0em; margin:0;} -.snippet-wrap .snippet-no-num li {list-style:none; padding-left:0;} -.snippet-wrap .snippet-num {margin:1em 0 1em 1em; padding-left:2px;} -.snippet-wrap .snippet-num li {list-style:decimal-leading-zero outside none;} -.snippet-wrap .snippet-no-num li.box {padding:0 6px; margin-left:-6px;} -.snippet-wrap .snippet-num li.box {border:1px solid; list-style-position:inside; margin-left:0px; padding-left:2px;} -*:first-child+html .snippet-wrap .snippet-num li.box {margin-left:-2px;} -* html .snippet-wrap .snippet-num li.box {margin-left:-2px;} -.snippet-wrap li.box-top {border-width:0px 0px 0 !important;} -.snippet-wrap li.box-bot {border-width:0 0px 0px !important;} -.snippet-wrap li.box-mid {border-width:0 0px !important;} -.snippet-wrap .snippet-num li .box-sp {width:10px; display:inline-block;} -*:first-child+html .snippet-wrap .snippet-num li .box-sp {width:20px;} -* html .snippet-wrap .snippet-num li .box-sp {width:2px;} -.snippet-wrap .snippet-no-num li.box {border:1px solid;} -.snippet-wrap .snippet-no-num li .box-sp {display:none;} - -/* Layout fixing */ -.clfix:after {content: "."; display: block; height: 0px; clear: both; visibility: hidden;} -.clfix {display: inline-block;} -.clfix {display: block;} -* html .clfix {height: 1%;} /* Hides from IE-mac */ -.clfix {zoom:1;} /*for IE 5.5-7*/ - -.fl {float:left !important;} -.fr {float:right !important;} -.cl {clear:both;} -.rel {position:relative;} -.abs {position:absolute;} -.ac {text-align:center !important;} -.ar {text-align:right !important;} -.al {text-align:left !important;} -.at {vertical-align:top !important;} -.am {vertical-align:middle !important;} -.ab {vertical-align:bottom;} -.hand {cursor:pointer;} -.bgnone {background:none !important;} -.brnone {border:none !important;} -.b {font-weight:bold !important;} -.n {font-weight:normal !important;} -.invisible{display:block; overflow:hidden; visibility:hidden; width:0; height:0; margin:0; font-size:0; line-height:0;} -.mt5 {margin-top:5px !important;} -/* //Layout fixing */ - -@media print { .hide, .show { display: none; }} - -div#profile { - position: relative; -} -#profile p { - text-align: right; -} - -div#toc_border { - border: 2px solid rgb(86, 122, 156); border-top-left-radius: 15px; border-top-right-radius: 15px; border-bottom-right-radius: 15px; border-bottom-left-radius: 15px; height: 565px; -} - -#contents li { - padding-top: 3px; - margin-top: 5px; - /* overflow: auto; */ -} - -p { - /* overflow: auto; */ -} - -div.table { - /* overflow: auto; */ -} \ No newline at end of file diff --git a/org.tizen.ui.guides/html/images/after_resize.png b/org.tizen.ui.guides/html/images/after_resize.png deleted file mode 100755 index e045c5ee20b1fc137419a880a61c0ff74b916583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14803 zcmeIZbyS;QvoK19QYfXgSn*OkxI47PU6No$N^p0AQz{fI?v~;Z+?}*&@fHX!En3`z zh46)*^Lx*|Yn}DUz5jfFyelg!>v{Ifo}JmVXJ(ItX=x}vB%mU|!NGZ`tR$y{gL5ki z2j}+F`?s-gPO38gV1I78>nOg$DIccUz&_lyeyRQv2d66f0on`~`;70RWZ;g2L)3Zm zz18bnWPyE2^YQW?yJh3xh`myldkOM3 z*~x?&kwQDJ5y#Kl!br_F+Mrr5s&0p~g&S+7jdzFSyleaNgj(LL3dhTRjhlrp4EsUN ztu`h3xg}q&a`(-zs>J!lt%vb7Ee;M>ZgbD_5~Ho8_a-kNeM&78cSbClc_pFoaB#AG zV*offxX-{iI0P@?I5?zlLAP+&aEfo^XyNGK;yk4+C~HEWyO=eS zz?alYWH@guifjT;)>`Nf9?aa(W|ZBDrJkhs|Nam3XXA$QIe*wclX+#eyJIf={-IU5 zw|zA>894M0^d}yv?dA*Bf98H8-aQ`v4{FLZy#U_IKa1uNS#;iR?*0dnXYTw<`IY)V zh>e(EoimIgXSj}7uDp%?z3VK^Zr9xN4>ZF2+F2Fa{;x$MuJ&O^4U!}OjME2P>|wcb z{tx=tNP9oA>92oi^R)X5mM?K4zC6q$_yt#T8Z==_qDJ7$Y}>89z;l@MwQoL~ z!U`pEBJs}hN|L_ofh^{_$62OjQYYofQ_{=?Qj$L#b|ubF#=O^$_Ap2D6f(}HS$|d^ z6I1z|pr@b{~rC9?pQ%ie&PsC$sVuRk>Arm;*OP9qDlR3bzIhJuI z7bmXCNIqMBeSKsVELD|qbcn#rr4}io>#r{CH=<>N*rBAZW$mYl9{Bg)rSApiB`_sw zn0Uq_f}bmqX?=rUpZ?t0Jpmd|88+!IVB*eW-QX)RrYEaq5LSrfl{L(@1QQStEL3HD zcwstiv7w3XLp0I{c~;DTogUv0z7ePr@e0y{V0ge&1O3Bk#9t#j8o`SJD7#?Bsw~en&FCqK#_I2}ktUdagme&lZw4{2BGe{| z*V+2Ass?t6N2G@zUeAHhA{cvt445a!3ZplAa;q118AN~(#VmDG7If8Zatmk!)sT~j z8FIBj7P@OGiENFr}s+#@*||GZ1F~ zU|q$Gs;JqWA_nlIH+NAef6e5a714FL1Ct;*ChUP(J$faz=64)ht9acgnicb9eoy%t z%$~QIE_1quYms>#;UPd7E#nZ)+~qeG#J4Q)%pyFkoV`xj$>Po#FXs}G-!vmP%(qR^x|^axgC87o1~Z_&dn=m2|C~2Lj=`u z1$mgl+ne>46+&kd;_6PQ4TObu#eFw0g^QAyGqogKzNiwvT_{Y(>iHQ`27_K7aVbyS z|KoEmqT&;mY%t&~f|EyZe6VAEIt#aEK98<~9^ikDynl%LoZfPB{-|kjn(t07Ldulf z;#Fv{?4NhTi$Mn_ep$z-9}4J-$+$ihMnAu|FeZY)j5yO@Rau9HO40B{kLADuFNP4i zbS6*s?E1OWqlvO~e3lx{aKG%oS%Xp$m6u57hGUP7Y=6VGf39>uN4e=S_|I&Gv}m$3 z5A@Xl_Qk^qY_5AJS_l;oVrQr^b3gKELZu&u~BAScAvQ zSam+?n|AwC5~%GM>IFdenwMzklzOG zr62cdyYtap&2^+Vh(0O8<{8+fQ4W5WO$T>_r1;4fC9*utJe9Z4!7xD}JEw6+Wx|`{m0AzEQJMCPTM-$(*ow7)O7upavuxGz z&)+ejSQgMYz@K)1N|Q{1HG;@IzB>vl*`ttt9~`)T3JUt^b7whFgJDa`p(ay#cf^Nu zJR4tQkq83bfsk|()LSn?eb(lLn}+VK?{ue@-!u74m42w;l+mKs&GGR8I@J}KlF##p z7jJyk3A;S@<1ig0wWDU}$=vx)fQ)Srx4mKYvJH>oBYJ8-=aFJR0-;j708fqKyRQQZ zWW4IRrFT>3!E;F}^)x3?wUog9mqS^GERkI$?brCcUakDB&NENftBB|VQBg!|8u-ig z?O&Fhz%o@5xVY{{T=!kMQ(rfT0n{wkbSnR(%w=9r$-|!oNcY{X^hqzF;|mvWjH7N< zGJ#1AXH5;K2BfsX((d@7xk7#VwY|!k!Mzn4PY1>o$My>$Cm@b%1r#y3w}zct?d?03 z-IkGx#8#o88GT5apzW#S#!|Y^hM5_)6Vi)qp)7=T;zZX3&6cybAyMaLH*IIS_$tp% z=>`0ki`aLNRB7Pac$dv<$kVLmBcg^|dfY8yBPd!+L=DsI=Rfiqwt-)~knJ#ARpgKu z{;+wHi{kDc_mEjVOD=`f$b9tKFSxR2<+C53xVhQ2*`T|VWH-`wY1KCQ8eHQ%k(F*+C%Eo>is1oCt;pi^IUZ$ z6DFf^@FdiW*|+0Tr;Xj4jvS?_y(juDM!wGwZk=jC$S>`adx$EvZjh}vB)s@Z23DPn zeESTKGFCG){6hbnT8B?Jw3nLL9U*ijU!*VaGxVt+asku=Uu#_hflG%38P~|8oF-bM z9JsU$|&aGhs9qr}%@!x^Ycq1zRq)&7#f z5eq^}z`GcN$MbE=x!5@05_B>#XJOsj3OiPxd%DLtY!R&|wkFeyu5^Zx93iF#n!8(Os4$!vtRZxu4dGfD!)pt)@&^Ll7;Wq65GB!^x~-M3Wb z1bzoy1&1US+wBl~-A@?8h?X>vP4h-?0=WPDqW>vaRcExZmgx^~Y(egK#Q^eDa-}{| z@y`>6I_iAuAqk*u^0@f5FzQ-PS3{I#MgF>hCAC-;JRAPZJ-6xzMPp9xM-Aiz=ZDvw zzWH1c4ywws%h-4k+Btqzc(3#c{JkbpqRz4HU|3DKm4s^1isIa~c6CUsV?k5hJsyEe zDb%jMEAsY^UYq#5X0-n5pfvhR!PO2`_Y$alqzYx&OPjQLde+_bbNhYNtY>u7teCCF z;I-|-(aeL_yJ4w-y7tzkAGB46^Y9>u5}8i^f`;Nb>uCSY6?L3H$gWJ38=w$z zdz&Ue4tPr5A9z~fi+s=Tnk5B%5kURvLkI@o+0HKk?a^1fBh@nXweKWimd;Ivf?g~( ziLVd0gh;@6O`X#7^hk0H?olGV9Zc^@w3n;el0Y znw_!SjRk!6+B4i%2-W_+=@oVeUoelmbLr=oD)UGlK1^e>Dg!BQ{?Tr0i8@9qiYEkO z#^C`V+#rwV;Ivk6kJLv;iz&Ug$#6IH(g0g$`43nWnqL2T4B3v;`st58q*UJ9%^&OB zzR#yQKiBV2oB&s4g;w+vy4KY}X}5mwY^_4_RN+yyMpRqFgijrwB&`%GHda5fUV731 zIckO*9Nf~_R_f>w2rzy?L90Bu336t|(~E6rs7Y+w>kJCwn|L|P)0fo;WYl4P5erbynidYGbfuOLYr!jx z1EvASepq@w{Pbu?qLEuQPjT>xuDgg>jnI&xCEPdKL8I>ZS}gceO3_2R+f(%cXg0`7 zyk3*lX?YJV$Jn$fzgQk;g-M&e-g1489LwjZ>CdAZc8afGD#e`#gdj@X93-+H3(xaGKK`3YuZI92m^*Iz#-k;PAh zB}L$U&Pv@jUAb;I{+qqv#D&2Z4rb|s;+s022R1L?(z&KJCCc0to&p)VbjsdaDDH_9l zMS9XnI#WEkM*Ys{iglWQZ)83&3N=xxJ0#g%&|7&K3N>R*hhOyRcJaO&Fqm8|uUj4r z>pl}_=^eE$qNv|wgO=1tuuS)HNlQHk-zF^{UFl|2O?~`Cz{-|hKPC{y1fDOsee%7i zb|_$7`JpOYoQZl}^D{m{#Qo?n0uP~WRj~6wlAtPt4(wO^{)%jUQ;q|Ys2!A$%8DwD z<~JMN7Mys!(kDLA*V7^GIuu*D<3fhr{#3{_@aE1!-G@{W%6pUb56>R{N?ramkStQu z<{bw*8JDMeyxiDqMgz`t?)PNvF_ZV3p3XoQg-dz0^G(jXMSg<1RGPl9S!xCQ4XXq# z%zl-W?PQzQ-?JsVaXu5Rm{}*7^of^}T2@O(;aLIQ-(t5UQe|Y6;oRG>WrdI>{lp7U z=95d3rRuY{#|?o5#hZVMB0WC?ETdmnL8o{G!jBoc#GoyQ$`+cb%>^oME!)3l8^4}M z%jT)1w{f)``KyP5=i)FmNS@PL8gfnY=?{~tDc!8f$kp98`M`^=?@-LzntNMjo8s1? zQHUtGE&Yk&caPWKhpl>XGqFtxe%Gje(%5OLyIyd#jdjd!1 zL3HBL7WLAyheAJMnU6 zeOc}0+tW;R2ivgsoemjpYjst(j7{43*_bp)lPNR!8F|I~7_BzO%S4c@i9WaIRC#M3 zDjg6KR#DUbNq28-ydFGjSo_>yiHQhviZQ`g-Czk`ZtaMllQ;2N0QQyzfG^mp>s0oX zyQ`P0DO8W!^lDi9`DdZ+;?O>R1YeRcA1)>Ju(eH~Cz|A`Z!ExgJH~-MCH0rY1hR8v zadL5X9{Dpcl8wz$!FFq7nJaNDCnbp0SHpFhnTs`g+bE9ejY?>2?*~h2l-}^*eanf* z>Aya>^08As9+V+kA{8?WZVXFJFt#xk;_08xIDgFNj;{&ZG*=3BoEk*3uH2K@w#H$U z%!A#k-G|8B@y@Fg7YMofWI-=v`Ln#fpt*@1v)%bwJihlCdBz~|%{rvLZ8unAIkk;hP<4Y5@Qe(z~ zQqe)?Gg}>dc$cDtx#S)5&GRcnD~mGBJ32Yw#opQZ%Gr!%?_%*xf=sxmoWs(o%j(d| zc%{npFhwC#h5oavZPk-<6$!{@jiGPq-9Gzi_6O^A^IS%8Zy-++o55c4X@1>cu_OhP zD(Z!CUYvxW+sKy57OG8&;hoEjH>!R`Z2dn|QVL;3AoqB~zM=E6`B1ZW$2A}BOz_i5 zB$M{GvyOsoiL%4U`D@16>vXH0+y} zwPYuEE98+pu~S8sp_RD{VuvgP=*NHyT+Gg#Y!bSoVv@yibKEnBV=5c69NUA&rvvq- zoDv>CCKL3nGxt<+pz(S&uOh=FE{oSN^Z@w&UGWMHi-IF*36=b4op!*iqkV;d3&NQ-_5aXOpklyw3Yd$qEmi?wxhCqe?KqDBVlyrKs~m3b-}-I=L% z)!btV`uD0Q`?eM%r$_WSj~SWR%n>sb`TKYC^kgR<*_!mB4Gw)Z{4F{rBoepW2fwqK z9&Bxzcv>1Ku~X6_MU=_$sjG)K}11jU*wZ@=qui0J-=x;!W4vSM*^G&aMk`cmapeI5Vp zref`hkQ^$f@WR@9tI6h=k5_s#OF-mFC1m*t^(z{;VO<8W%JtpfkIbAef5MBk%`>M) z=zN=7T0}2i~`&R5Zl0)zZzr}TEKAba-SWl?f zEy`&;1AwY*W@8%_l7#y2JQ!tPc|Te`&L_~gu`+waIz@7oQcR$jn^z$&>XJam7hPsL zK6+iyhhTl~tY_U6aT}E%PFdY16qF{xkaHHYb*@DA;XT+L-d~b3zYz3py99DJU(F-P zCU}8J%fg(F_8pDBd zqRGz;ps`JD0X(OiDL=T46cz%eqG=R}cs=u;GZf4skiWTDs(Ywn6~lL+Z(Ou&b|T%4 zM z=G3AepMi;qRECP<0>P0T7AmWO!$n-+1`12&ZU?JLJN^8ZV2PuvoFxx|vF``3S2T2s zGHh+PNf6qd#bAJG$NQZ8gWU%~0BF|ayk%3?2XB_W#sN;i!U`t*owqE60_1M&Gl+y9 zg(I5+nJWmD$d=1K8Vt@G;xU3{-#A}}p$ZTBRkRZ01a>|RKNQt7feIDE>(!swS*{ok z?s^Vlj20TD_sABHIGl4`XyuEvX)@|e_che#a^eU}#O%U~Eu>_h(Ti$v##-RzXi) zEr)Q$?P}XJjavbg)q%!xF+vPIQG7>FRI|((N6!rdzq!%-ZSid^QTjDPq)VsjB`jMJ z(hMvw&ks^R{?r~M9++dUvsg;AcNiAWf|1&&sdaQ5rmaOZ=~=v4?#&wPqe>I)SK;oCw)OVxT#aS`Q$$yo@=Lp7dhUEGac8Y!l{4(N z;C66G4E&O}zF(fR?Yf(*(5uelDCvPxQa3Srp%2<_%u7+Cw{ECxwVncgm0&uFu#)4u zCOyvdf8X&c|6bFq&#?5MiFm*l+DvM43&l!SE2^{M^@a_x#x@tj9{;;pyh!BJO zDvB{#1M8GJZP9kLvrTC6pwgO$1z=+Nzm0b!tN28OJQs$S@5mSw#~bQ&6LPQJO~G}x zMy%@lkmZ3lfu6-RP6gi?tyLpxiD(@M=E4H^@1b&i_@j3QP|CAYzD<6o{IRJcaZ+>L zDcsOKgU3>45~l|V0><<9vV@^qqgEL4RIE=tq?u930xq4mXY396H1#-O@niKsdBa}T zl0cL8fvP2wy+G@glzOPTLV)u~aR0&d+`9Ad9&A}9a#^I3zOiY}&&F|cWrtNz+GiuD zBYxX)K66JY@}0fm>TnDsAxN$X#({WI1`lc(c7oZcIutl37wnHuoGS;kS@FozJ8BF* z=^k;p1->pL$EI?U=ZUU06&+A)c`-mFaGU3w5VtvX@4(52Vi^LtS!5dRe8R&7T% z+dR#T-{pa_AAH73-Lo>Xc=M7syr<1rhs4%`RJ$|K|HEvf{pkdW6xym^0=$%fbitVq|o&SD}!_5xjK3iF5KR>{WPLCw6n@iDb}NKb8ff~)x`j9a41(=W7(Mbd-pRR=wbv=7CO?Q5(e$?XYbn2mqN=Y-a^8~JgzR^c}6vF+C z8?!rh3j>@Hb7O86SEF-xqqPT#Y!X31k@P%DP{79Ht)fsiQ$-lActJR&dhPD8*YhrB z=k;u3g5o$2u>8fUQ@lph3{IYTeVbT6|(9x1Iu6UtJbM7!iLD!t00N8d3M9vz~ zLN-W=d$#kpqc%sf6xLh(>7lI#V0f*}Ifiw*4e@;NgQx`?P13|!sAdYlMwP63Ls=|42}nbjrC|ouBIaxV(Xj@?<(lkNT>4l`1NqgZTX1_E2gl)p9}yfs32_wb_TgZQ1JS z>Eg1Q)T-oObnfW;ez;ElL7yrG84BI`@i9x6(^48R04O;WExM2E<($=|)Ye->s$PEU!WThgzvXl(`(EhEtk9CBWMl<2=el?05blZ*NRd(-$szMFCDpkej{y0k2 z@=r7J!lb^88IWwnwm#?LlWzgE}1iv6lwNvV|6Tk zpSHLlcg016Dg(F>%5^lsN)+#39b@+Dglp5caEHQrqYYAHKzaE{^=ofFVlKwg=NG zn2i)=JhqikNsw%)jlI-?OprWupQB~rFWwZZtr6u|_|_3L+UhxEq`)lYH$a{rZCUYy zGEP{`7JclR)$?IW-g1QkIiQj9<9H>NeJX0z9pZSO4?l&s#{2zoDpVv9m-;bqukVPU z>mwDNYe%Fq<=7O3%^y0t_ypo~QhHkI-|Kd}{Ccu1AcS$;Zste#C%u)0Z&|F$<^uDq z-Q#c>6n4$R2Ip1w#8?Jrr{~zM^-AiY;OE8rBGpug+`Vz(d1L}Sio(q;PA#n6e5P4! z=+wStH(A(&tX|q;9XgQQIE$-5YRYCeN4{!Vx;|u_wi~#y`NX+GOWR2I``HG!RhO5Q z^};*$q`^yaUUnN_pf*Q5AYkAOm*KIQu+=>UZn5d@d4Mz zbF7Jb^FX^D{T-xN7YUCtRq_~ZNOcX)T&#mCPNz0ev<*gvbzM^X$7RLR!J6A_;5EU5 z;H9-4x&mPgvZCre%kdDaJUMCGj1Z?MCDS1M%@fD2itMbeei{&u-!$hLh%5|;;q=oE#`%e!$tnfG zrx@$}bS+s&j6C0n+Tnis78L~sj#(!)WW>=fP-PfKgOS_DA~P-?<7>&*nkm9n&lhzT zc|0dI3%iC=hfIBqlHh(H&!v5Z&*x65o`E%MWI{m7iAJKx>|J6}|9*6PkipEO5@@^V z^yHLe{Z|1D1m8EMQ6_Tuv; zk7@XAE_9G<)>hBqzM1p-U^tve z*e9C5QrUSAp+-Ps6$?;;iRXo11>S}6jWto44z>GE^0^;18JJAYlP%T#er^sCVyOB9 zGU%OEeNatPR$4a4D7EbFzY~^iy-+*PGpOdp$9v+T2}sv%9PCa>k=Gp--}llUQu)aS zq0yJLAL;Hp7!Gl&qbi@p|D>BoFj~l6Ol7r4k!az&ei~ql6`z|GFlNH>I7CWS^bci? zE}rzu-DH|@a{*_vH+h)Txjm+hI;8$4uoO2J z;P05>-y2oZKiwG^TYY%%xAN|D9*Mo;<%xE9qwdB~slHc+LAMm!&r=iQuK}Iz>m}~V zoJZ8=wj{uqs)LaFNomm=_8BUI`%P*6(f)4!JJri>riF9oO9?AvbBfob?acazhF<-z zu$s8>YQBRRpM^!c`1NYLKog*M^gD-FXZq&p6ka}9fa~Erqn*iawCei6m^tf^Xa~mU z7sWHZ@=Sfxd##=qwIdHX8kKxV$spy#`jwPFNI_{ z3g~M4sXt$aJ_{tp$?^GF7gyjG?X+;lYGRd~6HM>e%s^R`!5q?1WHbN>AX7kPQwCPW ziw2-ms(!@eZDtd z;SZuK8D+2F&k~AX!}EH>7H6nXKE${9qZahAkx{&9(a;`w9vmbhS4pXN9taQ&N(6+lDLYJt^*BQaY zZqk;ya41}OkUw6cacuo+^?^S=eyabA6JXgK?^r_0WpU74a2RDXXr3cwoy*VZirS-< zm$@r)YJJ4fhiz6LvnJFs`H36r&7#gGH>Q57r5=sxbi@Ge8^G$#!AnV~XAdBWeQH4$ zA|;8fag-KnlDZ{rT59%sjSu-$Z7Z}I{~$XLAKDA#kNE#8c?yC9HdS<}64s%uv@)uv zOkE{TVnH58+zOXel96HZhO_gWq5E_)N*GM16AdT8s zZI?rGVT(J$jfk9Q3o%o;NFzO0!29w4SExemcG>$_ELEX`&6hsQC^^)M^1nh6KfnDy zLlH-dc-s0VBW;W!F zeD--=-=!$V@0_e^*ViS4MryI*Qjx@0R<;(LLw2*y(`!OlqN*CmkaKJXHNxU^eO&?^ zWNUd4l<#{7s_`4YJRuKW_>_*WO*~9HnJNFMC((DvlR4Pu`ew5V~mso+asokiy zr(k?7tkq!sn`2XgDJA0Elp*|0?Yuia7tG&$iTpNsG5qOm=S{5+5C~_g-~n*CiTqqg zJTj=ss5Lew5Gt z&FPl?r8JDw$I&XU4w)C9SpD#q*548W2Jl7F!Gl-NI~)cHBaPgu)AuI5<~iVoOB=L% z$&!|(P+yg+EeMKHbT+3o@}w1-P)+jnvRerEIpW}@Z4(Alt`K5!knR)?UI4G#pFb$j zf5H!Vqx0jq;5mu}@n`_>gm8#ujV{rT%0=mhFPr>usf$S8FGi>z1lOoli;#l z7NTrVkN8wn<>o@W z=&7s}?~-c`yfdl4^(-&pa1^rTso`Z(+f>kFi3toS?6o*!Z{z`wc$-IWe!c`Z#dc6z z+D7sWsO~&9H56`=JP!tUzEWKx=V@c2qanHxQYxUQpN~&)1Rq~SX@=*oot(799PKXA zO7Dr_hNR@x7V#;A=DW=yYJ>y!JUgu|uUdtTEYwO_n8-5$_Sbz~E-1Gae!@0_YTcsN z62H34ihrCc_^>sPEaposQ~y`Hr0_lQkFrcRLOxKm8AeJkMn{nq-yM{{-wDs$>Uk{u>`=`ov{Cv$M!#U=l*XVWK4xqZgCG!d*gR}qte3) z9sbZ`Rj`Arrq_JpochR>O-9{;GN?J8zC@+MP%&{=Ztb0;o}OSEA?|8uzMWC`^ty9^ z%hk6}E_eOU#*2=-o`NyN7~cMCWMrv|=JvNw?5oy@v%|-*Xa;#zc#mEdbphTz9Q4`K zc5HGP=PiSIW%t=}O~p-NF8ZCqO)+H*-xS2C={#^Y(RBX-)lI3UY|onr?Qst-#DVp{ zV2U8THHfa!g_NA##lSO7jN;~hKz<4THi${l;M?TKllzPM_eCRU<3FE6cDrM+#Wi)q zw_L8yp!f4Xp>N~-Dqi1GjJA)Sdn0~mA<_OXoKMVPqwMOf ztktZ$*FbDzhf52WfJ6y4HCj0|TJ=-~JJXQ+*KD;!ootK4l3O@}Uuv(3;0EI4vbLz+ zVjm*WyTv+sY^i83Y$J!(Opqo25X8z+%`%1WF=7M9LoIQ1I~sUIv)>2IuhZf`r^dmt zd0~4^TNGlo5eG=bPX5sSE7s3Eebu+(jF0o>R{oXVd!w3R(;&?WPGg;XH!KY^q9S{E z))y`QrWS1bMer!5BtoqwY1cp2cA}ABXR<^`>~eV=TYHxUUth%h>LXx|4=WmkwH6zm zJBD;YgRa@Hsc^nz$oQivPb&;kG)zQH%ted4%6^`vu)~D>&N> zOVEj^Xsl>6SMz$_^CVeKC~+60NZsOewcqY>8jZHcdF#eK=dHN`Yf!-!&(`d12b2Lm z+I~^Ftl%DoBi#0vWDEEWS>LL;Bs!JkHH-cF6$O?us5zs)^Y@=4p8<;s1Wp4FFpFoe zH(g3qIsbZ>3U{ScJ)!Hgsg#VGp}6X8F!@3;1+*IIRkGt ziERhLpW4s+u^F>38z=#`;SQOYrZ4Ol`*o_GNceDQsR0M)$JD?7r02~oTYEZU?4O>W5jm&T`c9%6139(DH#1e3j@${?w7?+*> zbZ}%3vlbuBk_>A)IFez%((=+Mjxs!W{cLXX zZQlc|-9GmxWH-cWS{%(g|Hn%5D{v$Tb98-ce5{A(O)#Amw&xN@Szbe~{MDOx{{uD< Bkm&#b diff --git a/org.tizen.ui.guides/html/images/before_resize.png b/org.tizen.ui.guides/html/images/before_resize.png deleted file mode 100755 index 476210fef4151081a460c4646df8d58f341f2f49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7428 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 Y0#oUowBtKBij)u&W6MjW7hE6x7mTFYod5s; diff --git a/org.tizen.ui.guides/html/images/dali_threads.png b/org.tizen.ui.guides/html/images/dali_threads.png deleted file mode 100644 index 997d2386979d895cd37cfee7dff12c0fb4729358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24880 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 diff --git a/org.tizen.ui.guides/html/images/mn_division.png b/org.tizen.ui.guides/html/images/mn_division.png deleted file mode 100755 index 1f7e3377261df202ed0786052218854d5ca34635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113082 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 T<@VJu*)AP=wqM%rm3RIhb@$<< diff --git a/org.tizen.ui.guides/html/images/mw_division.png b/org.tizen.ui.guides/html/images/mw_division.png deleted file mode 100755 index 8fc3efa2159287dcbd694da1e9cceb01e2760e68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112882 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 KS0-Z`{J#K^ft&9D diff --git a/org.tizen.ui.guides/html/images/round_moreoption.png b/org.tizen.ui.guides/html/images/round_moreoption.png deleted file mode 100644 index fe755d1e654cb798b22ede594d47510399567276..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22852 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�B$b$^_Hm#i>^W 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 R?}O6fe^QAk3s&0*6< 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 G67qj@)N=*^ diff --git a/org.tizen.ui.guides/html/images/round_processing.png b/org.tizen.ui.guides/html/images/round_processing.png deleted file mode 100644 index 030ef40b7f9704555d08d4e71304cea3ff3eaff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11011 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 K$dpNa4f-G5N9~XR diff --git a/org.tizen.ui.guides/html/images/tizen_project_dali.png b/org.tizen.ui.guides/html/images/tizen_project_dali.png deleted file mode 100644 index 3be41253e372854e24ea8944de2eb7cc2ef003af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148580 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%0DQ_)1kJ^T^ei)8 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

              rX9uW?Wa_<JP1O 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 diff --git a/org.tizen.ui.guides/html/images/w_division.png b/org.tizen.ui.guides/html/images/w_division.png deleted file mode 100755 index 88d995959343550d4859767dbfb7c6b5f128b717..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113087 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 Z)cNrv|A-saJA*x)+xKX<*l+Ns{|_ZZY83zg diff --git a/org.tizen.ui.guides/html/images/wn_division.png b/org.tizen.ui.guides/html/images/wn_division.png deleted file mode 100755 index 11a787672c8bc6d46378470dca2492a189c59f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26903 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 diff --git a/org.tizen.ui.guides/html/images/ww_division.png b/org.tizen.ui.guides/html/images/ww_division.png deleted file mode 100755 index 65e7ab786b223181e1097ab4bac5bf138983b6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112882 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 diff --git a/org.tizen.ui.guides/html/index.htm b/org.tizen.ui.guides/html/index.htm deleted file mode 100755 index 99c8125..0000000 --- a/org.tizen.ui.guides/html/index.htm +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - - - - - - - - UI Guides - - - - -

              -
              - -
              - -

              UI Guides

              - -

              Web Application

              - - -

              Native Application

              - - - - -
              - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/actors_n.htm b/org.tizen.ui.guides/html/native/dali/actors_n.htm deleted file mode 100755 index 72d24f1..0000000 --- a/org.tizen.ui.guides/html/native/dali/actors_n.htm +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - - - - - - Actors: Working with Basic DALi Components - - - - - - -
              -

              Actors: Working with Basic DALi Components

              - - -

              Actor is the basic component that composes the entire scene. It can have visible (for example, UI components, image actor) or invisible (for example, camera actor or layer) forms.

              -

              Actor is also the primary object with which DALi applications interact. Multiple types of event signals provided by actors can be handled in a application through user-defined callback functions.

              - -

              Types of Actors

              - -

              Figure: Types of Actors

              -

              Types of Actors

              - -Actor has several concrete types as follows: - -
                -
              • UI Components are used to organize the appearance of applications. Please see UI Components: Creating the Application Layout for more details.
              • -
              • Camera Actor determines which view of the whole virtual 3D world is rendered in the screen. By default, it is best suited for 2D applications so you don't need to care about it in this case. Please see API reference for Dali::CameraActor (in mobile and wearable) for more details.
              • -
              • Layer provides a mechanism for overlaying groups of actors on top of each other. Please see API reference for Dali::Layer (in mobile and wearable) for more details.
              • -
              - -

              Actors and Stage

              - -

              Stage is a top-level object that represents the entire screen. It is used for displaying a hierarchy of actors managed by the scene graph structure, which means an actor inherits a position relative to its parent, and can be moved in relation to this point.

              - -The stage instance is a singleton object (the only instance of its class during the lifetime of the program), so you can get it using a static function. - -

              To display the contents of an actor, it must be added to a stage. The following example shows how to connect a new actor to the stage:

              - -
              Actor actor = Actor::New();
              -Stage::GetCurrent().Add(actor);
              -
              - - -

              Positioning Actors

              -

              An actor inherits its parent's position. The relative position between the actor & parent is determined by the following properties:

              -
                -
              • Parent origin -

                This Vector3 property defines a point within the parent actor's area.

                - -

                Figure: Parent origin

                -

                Parent origin

                - -

                The default is top-left (Dali::ParentOrigin::TOP_LEFT), which can be visualized in 2D as (0, 0), but is actually Vector3 (0, 0, 0.5) in the 3D DALi world. The actor position is relative to this point.

                -

                Please see API reference for Dali::Actor::SetParentOrigin() (in mobile and wearable) for more details.

                -
              • - -
              • Anchor point -

                This Vector3 property defines a point within the child actor area.

                - -

                Figure: Anchor point

                -

                Anchor point

                - -

                The default is center (Dali::AnchorPoint::CENTER), which can be visualized in 2D as (0.5, 0.5), but is actually Vector3 (0.5, 0.5, 0.5) in the 3D DALi world. The actor position is also relative to this point.

                -

                Please see API reference for Dali::Actor::SetAnchorPoint() (in mobile and wearable) for more details.

                -
              • - -
              • Position -

                This is the position vector between the parent origin and anchor point.

                - -

                Figure: Position

                -

                Position

                - -

                Therefore by default, an actor's position indicates the vector to its center from the top-left corner of its parent.

                - -

                For example (with the default camera),

                -
                  -
                • An actor added directly to the stage with position (X = stageWidth*0.5, Y = stageHeight*0.5) appears in the center of the screen.
                • -
                • An actor with the position (X = actorWidth*0.5, Y = actorWidth*0.5) appears at the top-left corner of the screen.
                • -
                - -

                Please see API reference for Dali::Actor::SetPosition() (in mobile and wearable) for more details.

                - -
              • -
              - -

              Event Handling for Actors

              -

              The Dali::Actor class provides following event signals:

              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              - Table: Event signals -
              Event signalDescription
              TouchedSignal()This signal is emitted when a touch input is received.
              HoveredSignal()This signal is emitted when a hover input is received.
              WheelEventSignal()This signal is emitted when a wheel event is received.
              OnStageSignal()This signal is emitted after the actor has been connected to the stage.
              OffStageSignal()This signal is emitted after the actor has been disconnected from the stage.
              OnRelayoutSignal()This signal is emitted after the size has been set on the actor during relayout.
              - -

              For example, a touch event can be handled as follows:

              -
              -bool OnTouch(Actor actor, const TouchEvent& touch)
              -{
              -   bool handled = false;
              -
              -   switch(touch.GetPointCount())
              -   {
              -      case 1: // Single touch
              -         if (touch.GetPoint(0).GetState == TouchPoint::Down)
              -         {
              -            // Do action when first touches the touch screen.
              -            ...
              -            handled = true;
              -         }
              -
              -         break;
              -
              -      case 2: // Multi-touch event
              -
              -         break;
              -   }
              -
              -   return handled;   // true if the operation was successful
              -}
              -
              -// Elsewhere
              -Actor actor = Actor::New();
              -actor.TouchedSignal().Connect(&OnTouch);
              - -

              For more information, see Event Handling.

              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/animation_n.htm b/org.tizen.ui.guides/html/native/dali/animation_n.htm deleted file mode 100755 index b704de8..0000000 --- a/org.tizen.ui.guides/html/native/dali/animation_n.htm +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - - - - - - - Animations: Making Your Actors Alive - - - - - - -
              -

              Animations: Making Your Actors Alive

              - -

              Animation allows your objects to move around / change their properties for a specified duration.

              - -

              DALi provides a rich and easy to use animation framework which allows you to create visually rich applications. Dali::Animation can be used to animate the animatable properties of any number of objects (Please see Attributes of Properties for more details).

              - -

              Animation components are shown in the following figure:

              - -

              Figure: DALi animation components

              -

              DALi animation components

              - -

              DALi animations occur in a dedicated thread. This allows animations to run smoothly, regardless of the time taken to process inputs events and other factors in the application code. Please see Animations with Multi-Threading

              - -

              Creating a Basic Animation

              - -

              Create an animation object that takes place over 3 seconds:

              -
              -Dali::Animation animation = Animation::New(3.0f);
              -
              - -

              Animating Properties

              - -

              There are two distinct methods to animate the properties within DALi:

              -
                -
              • AnimateTo(): The property animates TO the value in the given time.
              • -
              • AnimateBy(): The property animates BY the value in the given time.
              • -
              - -

              In the following example, it is assumed that actor1 and actor2 are at position 10.0f, 10.0f, 0.0f at the start of the animation.

              -
              -// Animate the position of actor1 TO 10.0f, 50.0f, 0.0f
              -animation.AnimateTo(Property(actor1, Dali::Actor::Property::POSITION), Vector3(10.0f, 50.0f, 0.0f)); 
              -// End Position: 10.0f, 50.0f, 0.0f
              -
              -// Animate the position of actor2 BY 10.0f, 50.0f, 0.0f
              -animation.AnimateBy(Property(actor2, Dali::Actor::Property::POSITION), Vector3(10.0f, 50.0f, 0.0f)); 
              -// End Position: 20.0f, 60.0f, 0.0f
              -
              - -

              Playback Control

              - -

              When an animation is created, it can be played using the Play() method.

              -
              -animation.Play();
              -
              -

              This is not a synchronous method. The Play() method returns after sending a message. After the message is processed in a separate thread, the animation starts. Blocking the application thread does not stop the animation from playing.

              -

              Stop() and Pause() methods are also supported.

              -
              -animation.Stop();
              -animation.Pause();
              -
              - -

              Notifications

              -

              Using DALi's signal framework applications can be notified when the animation finishes. The Dali::Animation API supports "fire and forget" behavior, which means that an animation continues to play if the handle is discarded. In the following example, the Finished signal is emitted after 2 seconds:

              - -
              -  // ... Assuming this code is in the HelloWorldController class
              -  void Create( Application& application )
              -  {
              -    PushButton actor = PushButton::New();
              -    Stage::GetCurrent().Add( actor );
              -
              -    Animation animation = Animation::New(2.0f); // Duration 2 seconds
              -    animation.AnimateTo( Property( actor, Actor::Property::POSITION ), Vector3( 100.0f, 100.0f, 0.0f ) );
              -    animation.FinishedSignal().Connect( this, &HelloWorldController::OnFinished );
              -    animation.Play();  // Fire the animation and forget about it
              -  }  // At this point the animation handle has gone out of scope
              -
              -  void OnFinished( Animation& animation )
              -  {
              -    // Do something when the animation is finished
              -  }
              -  // ...
              -
              - -

              Alpha Functions

              - -

              Alpha functions are used in animations to specify the rate of change of the animation parameter over time. This allows the animation to be, for example, accelerated, decelerated, repeated, or bounced. The built-in supported functions can be viewed in the Dali::AlphaFunction::BuiltinFunction class (in mobile and wearable applications).

              -
              -animation.SetDefaultAlphaFunction(Dali::AlphaFunction::EASE_IN);
              -
              -

              You can also create your own alpha function:

              -
              -float MyAlphaFunction(float progress)
              -{
              -   return progress;
              -}
              -
              -AlphaFunction alphaFunction(&MyAlphaFunction);
              -animation.SetDefaultAlphaFunction(alphaFunction);
              -
              -

              It is possible to specify a different alpha function for each animate call in an Animation object.

              -
              -animation.AnimateTo(Property(actor1, Dali::Actor::Property::POSITION), Vector3(10.0f, 50.0f, 0.0f), Dali::AlphaFunction::EASE_IN);
              -
              - -

              Other Actions

              - -

              An animation can be looped:

              -
              -animation.SetLooping(true);
              -
              -

              By default, when an animation ends, the properties that it was animating are baked (saved). Using the following function, the property changes can be discarded when the animation ends or is stopped:

              -
              -animation.SetEndAction(Animation::Discard);
              -
              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/animation_types_n.htm b/org.tizen.ui.guides/html/native/dali/animation_types_n.htm deleted file mode 100755 index 26c7f18..0000000 --- a/org.tizen.ui.guides/html/native/dali/animation_types_n.htm +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - Animations Types: Types of Animations Supported by DALi - - - - - - -
              -

              Animations Types: Types of Animations Supported by DALi

              - -

              DALi supports the key frame animation, path animation, and shader effect animation.

              - -

              Key Frame Animation

              - -

              DALi provides support for animating between several different values, or key frames. A key frame takes a progress value between 0.0f and 1.0f (0 and 100% respectively) and portrays the value of the property when the animation has progressed that much. You can create several key frames:

              -
              -Dali::KeyFrames keyFrames = Dali::KeyFrames::New();
              -keyFrames.Add(0.0f, Vector3(10.0f, 10.0f, 10.0f));
              -keyFrames.Add(0.7f, Vector3(200.0f, 200.0f, 200.0f));
              -keyFrames.Add(1.0f, Vector3(100.0f, 100.0f, 100.0f));
              -
              - -

              Next, you can add them to your animation.

              -
              -animation.AnimateBetween(Property(actor1, Dali::Actor::Property::POSITION), keyFrames);
              -
              -

              When you play the animation, DALi animates the position of actor1 between the key frames specified. The actor1 animates from (10.0f, 10.0f, 10.0f) to (200.0f, 200.f, 200.0f) by 70% of the animation time, and then spends the remaining time animating back to (100.0f, 100.0f, 100.0f).

              -

              The advantage of specifying a key frame at 0% is that regardless of where the actor1 is, it starts from position (10.0f, 10.0f, 10.0f). If AnimateTo() is used, the start position is the actor1's current position.

              - -

              Path Animation

              -

              The Dali::Path API can be used to animate the position and orientation of actors.

              - -

              The black points in the following figure are points where the DALi logo travels to. The red points are the control points which express the curvature of the path on the black points.

              - -

              Figure: Path animation

              -

              Path animation

              - -

              In the code, this is represented as follows:

              -
              -Path path = Path::New();
              -path.AddPoint(Vector3(50.0f, 10.0f, 0.0f));
              -path.AddPoint(Vector3(90.0f, 50.0f, 0.0f));
              -path.AddPoint(Vector3(10.0f, 90.0f, 0.0f));
              -
              -

              The control points can be added manually using Dali::Path::AddControlPoint. The Path API can also auto-generate the control points for you.

              -
              -path.GenerateControlPoints(0.25f);
              -
              -

              Here 0.25f represents the curvature of the path you require. For more information, see the GenerateControlPoints() function in Dali::Path class (in mobile and wearable applications).

              -

              To animate actor1 along this path, use the following function:

              -
              -animation.Animate(actor1, path, Vector3::ZERO);
              -
              -

              The third parameter is the forward vector (in a local space coordinate system) that is oriented with the path's tangent direction.

              - - -

              Shader Effect Animation

              -

              Shader effects provide a visual effect for actors. In a shader, uniforms are set according to the purpose of applications. The uniforms of a shader can be animated using the Animation::AnimateTo() functions.

              -

              For example, to animate the center point of the Bendy shader effect:

              -
              -Dali::Animation animation = Dali::Animation::New(1.0f);
              -
              -Vector2 newPosition(0.0f, 0.0f);
              -animation.AnimateTo(Property(shaderEffect, shaderEffect.GetPositionPropertyName()), newPosition);
              -
              -

              To animate a uniform of a custom shader effect, you must use the name of the uniform:

              -
              -Dali::Animation animation = Dali::Animation::New(1.0f);
              -
              -// Set the initial value for the uniform
              -shaderEffect.SetUniform("myUniform", -0.5f);
              -
              -// Animate the uniform to a value
              -animation.AnimateTo(Property(shaderEffect, "myUniform"), 0.5f);
              -
              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/background_n.htm b/org.tizen.ui.guides/html/native/dali/background_n.htm deleted file mode 100755 index 7e16d5e..0000000 --- a/org.tizen.ui.guides/html/native/dali/background_n.htm +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - Background Knowledge: Using DALi More Effectively - - - - -
              -
              -

              Mobile native Wearable native

              -
              -
              -

              Content

              -
                -
              -

              Related Info

              -
                -
              -
              -
              - -
              -

              Background Knowledge: Using DALi More Effectively

              - -

              This section describes useful background knowledge that enables you to use DALi more effectively.

              -

              Topics covered are:

              - - - - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/buttons_n.htm b/org.tizen.ui.guides/html/native/dali/buttons_n.htm deleted file mode 100755 index 484aa88..0000000 --- a/org.tizen.ui.guides/html/native/dali/buttons_n.htm +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - Buttons: Push, Check, Select! - - - - - - -
              -

              Buttons: Push, Check, Select!

              - -

              Button is a small object on UI that you press in order to operate it. DALi provides button controls, such as PushButton , CheckBoxButton , and RadioButton . The base class for button controls is Toolkit::Button. The Toolkit::Button class provides the disabled property and the clicked signal. Basic signals provided by the Toolkit::Button class are listed in the following table.

              - - - - - - - - - - - - - - - - - - - - - - - - - -
              - Table: Toolkit::Button input signals -
              Input signalDescription
              PressedSignal()Emitted when the button is pressed. -
              ReleasedSignal()Emitted when the button is released. -
              ClickedSignal()Emitted when the button is clicked. -
              StateChangedSignal()Emitted when the button state is changed. -
              - -

              Push Button

              - -

              The PushButton class provides a button that can be pressed to operate it. A push button changes its appearance when is pressed and returns to its original when is released.

              - -

              Figure: Push button

              -

              Push button

              - -

              A push button emits a Button::PressedSignal() signal when the button is pressed, a Button::ClickedSignal() signal when clicked, and a Button::ReleasedSignal() signal when released, or of the touch point leaves the boundary of the button. A basic push button example is as follows:

              - -
              -class ButtonController : public ConnectionTracker
              -{
              -public:
              -  ButtonController( Application& application ): mApplication( application )
              -  {
              -    mApplication.InitSignal().Connect( this, &ButtonController::Create );
              -  }
              -  void Create( Application& application )
              -  {
              -    PushButton button = PushButton::New();
              -    button.SetLabel( "Select" );
              -    button.SetParentOrigin( ParentOrigin::CENTER );
              -    button.ClickedSignal().Connect( this, &ButtonController::OnButtonClicked );
              -    Stage::GetCurrent().Add( button );
              -  }
              -  bool OnButtonClicked( Toolkit::Button button )
              -  {
              -    cout << "OnButtonClicked" << endl;
              -    return true;
              -  }
              -private:
              -  Application&  mApplication;
              -};
              -
              -int main( int argc, char **argv )
              -{
              -  Application application = Application::New( &argc, &argv );
              -  ButtonController test( application );
              -  application.MainLoop();
              -  return 0;
              -}
              -
              - -

              CheckBox Button

              - -

              The CheckBoxButton class provides check box button which can be checked or unchecked.

              - -

              Figure: Checkbox button

              -

              Checkbox button

              - -

              A checkbox button emits all of four button input sinals, but usually you can just use Button::StateChangedSignal() signal to check the button changes its state to selected or unselected. A basic checkbox button example is as follows:

              - -
              -// ... same as the push button example
              -  void Create( Application& application )
              -  {
              -    CheckBoxButton button = CheckBoxButton::New();
              -    button.SetLabel( "Select" );
              -    button.SetSize( 100,40 );
              -    button.SetBackgroundColor( Vector4( 1,0,0,1 ) );
              -    button.SetParentOrigin( ParentOrigin::CENTER );
              -    button.StateChangedSignal().Connect( this, &ButtonController::OnButtonStateChanged );
              -    Stage::GetCurrent().Add( button );
              -  }
              -  bool OnButtonStateChanged( Toolkit::Button button )
              -  {
              -    cout << "OnButtonStateChanged " << button.IsSelected() << endl;
              -    return true;
              -  }
              -// ... same as the push button example
              -
              - -

              Radio Button

              - -

              The RadioButton class provides a radio button with 2 states: selected and unselected.

              - -

              Figure: Radio button

              -

              Radio button

              - -

              Usually, radio buttons are grouped. Two or more radio buttons are in the same group when they have the same parent. In each group, only 1 radio button can be selected at a given time. You can use Button::StateChangedSignal() signal to check which radio button is selected. A basic radio button example is as follows:

              - -
              -// ... same as the push button example
              -  void Create( Application& application )
              -  {
              -    Actor radioGroup = Actor::New();
              -    radioGroup.SetParentOrigin( ParentOrigin::CENTER );
              -    Stage::GetCurrent().Add(radioGroup);
              -
              -    RadioButton button1 = RadioButton::New();
              -    button1.SetLabel( "button1" );
              -    button1.SetBackgroundColor( Vector4(1,0,0,1) );
              -    button1.SetPosition( 0, -40 );
              -    radioGroup.Add( button1 );
              -
              -    RadioButton button2 = RadioButton::New();
              -    button2.SetLabel( "button2" );
              -    button2.SetBackgroundColor( Vector4(0,0,1,1) );
              -    button2.SetPosition( 0, 40 );
              -    radioGroup.Add( button2 );
              -
              -    button1.StateChangedSignal().Connect( this, &ButtonController::OnButtonStateChanged );
              -    button2.StateChangedSignal().Connect( this, &ButtonController::OnButtonStateChanged );
              -  }
              -  bool OnButtonStateChanged( Toolkit::Button button )
              -  {
              -    cout << "OnButtonStateChanged " << button.GetLabel() << " " << button.IsSelected() << endl;
              -    return true;
              -  }
              -// ... same as the push button example
              -
              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/constraints_n.htm b/org.tizen.ui.guides/html/native/dali/constraints_n.htm deleted file mode 100755 index 15b9925..0000000 --- a/org.tizen.ui.guides/html/native/dali/constraints_n.htm +++ /dev/null @@ -1,294 +0,0 @@ - - - - - - - - - - - - - - Constraints: Imposing Your Own Constraints on Actors - - - - - - -
              -

              Constraints: Imposing Your Own Constraints on Actors

              - -

              Constraints are used to modify the property of an actor, based on other properties of the same actor; properties of the actor's parent; or properties of another actor altogether, when the modification needs to be at run-time. Custom functions or functors can be supplied, where the desired value of the property can be calculated. These functions (or functors) are called in every frame, therefore they must be fast and not too complex, otherwise they can affect performance.

              -

              Multiple constraints can be applied to the same actor at the same time. The order in which constraints are applied is important as this is the order in which they are processed in the update thread.

              -

              Constraints are applied after animations have been applied. This means that Constraints override the values set by Animations. Constraints are not applied to off-stage actors.

              -

              Not all properties can be used as a constraint input. For more details, see the IsPropertyAConstraintInput() function in the Dali::Handle class (in mobile and wearable applications).

              - -

              Using a Constraint

              - -

              Constraints are designed as a way of modifying properties that cannot be modified by any existing built-in functionality, such as animations, size negotiation, parent anchor, or origin settings. As they provide the ability for the application developer to execute their own code within the update thread, DALi can no longer guarantee the timeliness of this code, or how optimized it can be.

              -

              Generally, you must not use constraints with the size property as constraining the size and size negotiation are mutually exclusive. Consider the following use cases as an example of when and when not to use a constraint:

              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              - Table: Examples of constraint use -
              RequirementSolution
              Need a child to be 50% the size of it's parent.Use size negotiation.
              Need to zoom an actor in to the screen using its scale property.Use an animation.
              Need an actor to appear centered around the bottom-right corner of its parent.Use ParentOrigin and AnchorPoint.
              Need to lay out a series of controls with various alignment requirements.Use either Anchor and origin settings, or a TableView.
              Need to automatically modify the position property of one actor based on the position property of another actor, that is neither a parent OR a child.Use a constraint.
              Need to position an actor relative to its parent actor in a NON-UNIFORM way, or a non-linear calculation needs to be performed that requires a functor.Use a constraint.
              Need to modify an actor's property in real time based on some calculations that require additional data to be stored in-between frames.Use a constraint. The constraint functor can hold any variables within it that need to be preserved frame-to-frame.
              - -

              For most general cases, the position and size requirements of a child or parent actor (from its child or parent) can be calculated with size negotiation.

              - -

              Constraint Sources

              -

              These properties are used as input sources to the constraint. The constraint takes these values, optionally performs a calculation on them (if using a custom functor) and writes the result to the specified property of the target actor. The source actor is specified as either the same actor, its parent, or another actor.

              -
                -
              • Local source -

                A local source is based on the local properties (such as size, position, scale, orientation, or color) of an actor. For example, the actor's orientation can be used as a constraint input source.

                -
                -Dali::ConstraintSource source(Dali::LocalSource(Dali::Actor::Property::ORIENTATION));
                -
                -
              • -
              • Parent Source -

                A parent source is based on properties of the actor's parent. For example, a parent's position can be used as a constraint input source.

                -
                -Dali::ConstraintSource source(Dali::ParentSource(Dali::Actor::Property::POSITION));
                -
                -
              • -
              • Other Handle Source -

                You can base your source on the properties of another handle altogether. For example, a sibling actor's color can be used as a constraint input source.

                -
                -Dali::ConstraintSource source(Dali::Source(anotherHandle, Dali::Actor::Property::COLOR));
                -
                -
              • -
              - -

              Constraint Function

              - -

              The signature of the constraint function is:

              - -
              -void Function(PropertyType &current, const Dali::PropertyInputContainer &inputs);
              -
              -

              In this function the current parameter is a reference to the target property type, such as float, Vector2, or Vector3. This is an in or out parameter. It represents the current value of the property and the expectation is that it is modified by the function to the desired value.

              -

              The inputs parameter holds all the constraint input sources. Each element is a pointer to the property-input and can be accessed using the indexing operator [ ]. The order in which the sources are added is the order in which the property-inputs are sorted in the container. For example:

              -
              -constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION));
              -constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::SIZE));
              -constraint.AddSource(Dali::ParentSource(Dali::Actor::Property::POSITION));
              -constraint.AddSource(Dali::ParentSource(Dali::Actor::Property::SIZE));
              -
              -

              In the constraint function this equals to:

              -
              -const Dali::Vector3& position(inputs[0]->GetVector3());
              -const Dali::Vector3& size(inputs[1]->GetVector3());
              -const Dali::Vector3& parentPosition(inputs[2]->GetVector3());
              -const Dali::Vector3& parentSize(inputs[3]->GetVector3());
              -
              - - -

              Creating a Constraint

              -

              Using C Functions

              -

              If you do not have any data that is changed at runtime, C functions must be used. For example, the color of an actor can be changed based on its position along the x-axis to a preset distance of 100, beyond which it is transparent.

              -
              -Dali::Actor actor = Actor::New();
              -
              -// Create a constraint that targets actor
              -Dali::Constraint constraint = Dali::Constraint::New< Vector4 >(actor, Dali::Actor::Property::COLOR, MyConstraintFunction); 
              -
              -// Add the POSITION property as a constraint input
              -constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION)); 
              -
              -// Apply the constraint
              -constraint.Apply(); 
              -
              - -

              The following example shows the actual C function:

              -
              -void MyConstraintFunction(Dali::Vector4& current, const Dali::PropertyInputContainer& inputs)
              -{
              -   const Dali::Vector3& position(inputs[0]->GetVector3());
              -
              -   float distance = fabs(position.x);
              -
              -   // More than 100.0f away, opacity is 0.0f
              -   if (distance > 100.0f)
              -   {
              -      current.a = 0.0f;
              -   }
              -   else
              -   {
              -      // Otherwise it blends between fully opaque and transparent
              -      current.a = (100.0f - distance) / 100.0f;
              -   }
              -}
              -
              - -

              For more information, see the New() function in the Dali::Constraint class (in mobile and wearable applications).

              - -

              Using Functors

              - -

              If you need to store some data in a struct or class, a functor can be used. Reusing the last example, the color of an actor is changed based on its position along the x-axis, but the distance when it is transparent is different for each applied constraint.

              -
              -Dali::Actor actor = Actor::New();
              -
              -// Create a constraint that targets actor, and uses MyFunctor with a distance of 200
              -Dali::Constraint constraint = Dali::Constraint::New< Vector4 >(actor, Dali::Actor::Property::COLOR, MyFunctor(200)); 
              -
              -// Add the POSITION property as a constraint input
              -constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION)); 
              -
              -// Apply the constraint
              -constraint.Apply(); 
              -
              -

              The following example shows the structure:

              -
              -struct MyFunctor
              -{
              -   // Constructor which takes the distance at which the actor is fully transparent
              -   MyFunctor(float distance)
              -   : mDistance(distance)
              -   {
              -   }
              -
              -   // Functor
              -   void operator()(Dali::Vector4 &current, const Dali::PropertyInputContainer &inputs)
              -   {
              -      const Dali::Vector3& position(inputs[0]->GetVector3());
              -
              -      float distance = fabs(position.x);
              -
              -      // More than mDistance away, opacity is 0.0f
              -      if (distance > mDistance)
              -      {
              -         current.a = 0.0f;
              -      }
              -      else
              -      {
              -         // Otherwise it blends between fully opaque and transparent
              -         current.a = (100.0f - mDistance) / 100.0f;
              -      }
              -   }
              -
              -   // Data
              -   const float mDistance;
              -};
              -
              -

              MyFunctor() can be used also with another constraint with a different distance.

              -

              Instead of using the default functor, another method can be declared in the class or struct and used as the constraint function.

              -

              For more information, see the New() function in the Dali::Constraint class (in mobile and wearable applications).

              - - -

              Removing Constraints

              - -

              The actor's constraints can later be removed in several ways:

              -
              -mConstraint.Remove(); // mConstraint is a base-handle to a constraint
              -actor.RemoveConstraints(); // Removes ALL constraints applied to an actor
              -actor.RemoveConstraint(tag); // All constraints with the tag are removed from the actor (tag can be set using SetTag)
              -
              - - -

              Equal To Constraint

              - -

              The built-in Dali::EqualToConstraint function can be used if only setting a property equal to another property is required:

              -
              -Dali::Constraint constraint = Dali::Constraint::New< Vector3 >(actor, Dali::Actor::Property::POSITION, Dali::EqualToConstraint());
              -constraint.AddSource(Dali::Source(anotherActor, Dali::Actor::Property::POSITION));
              -constraint.Apply();
              -
              -

              Here actor's position is set to equal the position of anotherActor.

              - - -

              Relative To Constraint

              - -

              The built in Dali::RelativeToConstraint and Dali::RelativeToConstraintFloat functions can be used if only setting a property relative to another property is required:

              - -
              -Dali::Constraint constraint = Dali::Constraint::New< Vector3 >(actor, Dali::Actor::Property::POSITION, Dali::RelativeToConstraint(2.0f));
              -constraint.AddSource(Dali::Source(anotherActor, Dali::Actor::Property::POSITION));
              -constraint.Apply();
              -
              -

              Here the actor's position is relative to the position of anotherActor. If anotherActor is at (10.0f, 20.0f, 30.0f), actor is at (20.0f, 40.0f, 60.0f).

              - - - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/control_base_n.htm b/org.tizen.ui.guides/html/native/dali/control_base_n.htm deleted file mode 100755 index cd7f49b..0000000 --- a/org.tizen.ui.guides/html/native/dali/control_base_n.htm +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - Control: Base Class of UI Components - - - - - - -
              -

              Control: Base Class of UI Components

              - -

              Dali::Toolkit::Control is the base class for all UI components in DALi. This section describes some useful tips for this class.

              - - -

              Background Color

              - -

              It is possible to set a background color for a UI component. If you want to set a component with a red background: - -

              -Dali::Toolkit::Control control = Dali::Toolkit::Control::New();
              -control.SetSize( 200.0f, 200.0f );
              -control.SetBackgroundColor( Dali::Color::RED );
              -
              - -

              Figure: A Control object with a red background

              -

              A control with a red background

              - -

              This can be used for all existing controls like TextLabel as well:

              - -
              -Dali::Toolkit::TextLabel label = Dali::Toolkit::TextLabel::New( "Hello World" );
              -label.SetBackgroundColor( Dali::Color::RED );
              -
              - -

              Figure: A TextLabel object with a red background

              -

              A TextLabel object with a red background

              - - -

              Background Image

              - -

              You can also set a background image of a control:

              - -
              -Dali::Toolkit::Control control = Dali::Toolkit::Control::New();
              -Dali::Image image = Dali::Image::New( "image.png" );
              -control.SetBackgroundImage( image );
              -
              - -

              Figure: A Control object with a background image

              -

              A Control object with a background image

              - -

              The background image is blended with the background color. If a red background color is set on the control:

              - -
              -control.SetBackgroundColor( Dali::Color::RED );
              -
              - -

              then the control object will look like:

              - -

              Figure: A Control object with a background image blended with a background color

              -

              A Control object with a background image blended with a background color

              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/dali_applications_n.htm b/org.tizen.ui.guides/html/native/dali/dali_applications_n.htm deleted file mode 100755 index 6f841e7..0000000 --- a/org.tizen.ui.guides/html/native/dali/dali_applications_n.htm +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - Application: Framework for DALi Application - - - - - - -
              -

              Application: Framework for DALi Application

              - -

              The Adaptor framework provides the Dali::Application class, which initializes and sets up DALi appropriately. The class provides many platform-related services.

              - -

              Several signals can be connected to keep you informed when certain platform-related activities occur. It also ensures that, upon system events, DALi is called in a thread-safe manner.

              - -

              The following example shows how to create a Dali::Application instance and connect to its initialize signal, where the Dali::Actor hierarchy is created:

              - -
              void CreateProgram(Application& app)
              -{
              -   // Create DALi components...
              -   Dali::Actor actor = Actor::New();
              -   ...
              -}
              -int main (int argc, char **argv)
              -{
              -   Dali::Application app = Application::New(&argc, &argv);
              -   app.InitSignal().Connect(&CreateProgram);
              -   app.MainLoop();
              -}
              - -

              Window

              - -

              DALi provides the Window class to manage drawing to a default surface. The class is also responsible for drawing the Indicator bar if required. The Application class automatically creates a Window which the you can access after the SignalInit() function has fired.

              - -
              void CreateProgram(Application& app)
              -{
              -   app.GetWindow().ShowIndicator(Dali::Window::VISIBLE);
              -}
              -int main (int argc, char **argv)
              -{
              -   Dali::Application app = Application::New(argc, argv);
              -   app.SignalInit().Connect(&CreateProgram);
              -   app.MainLoop();
              -}
              - - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/dali_overview_n.htm b/org.tizen.ui.guides/html/native/dali/dali_overview_n.htm deleted file mode 100755 index 2e555c4..0000000 --- a/org.tizen.ui.guides/html/native/dali/dali_overview_n.htm +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - DALi Overview: Getting Started with DALi UI Programming - - - - - - -
              -

              DALi Overview: Getting Started with DALi UI Programming

              - -

              Dynamic Animation Library (DALi) internally defines a virtual 3D world (space) and maintains hierarchical objects in the 3D world. The hierarchical object tree is known as the scene graph. A node in the scene graph can have several children but often only a single parent, with the effect of a parent applied to all its child nodes; an operation performed on a group automatically propagates its effect to all of its members.

              -

              There are various types of nodes, such as image, text, and buttons.

              - -

              DALi Fundamentals

              - -

              Before starting UI programming with DALi, familiarize yourself with the basic concepts.

              - -

              Actor and Stage

              - -

              Actor is the primary object for interaction in DALi applications. Actors are effective nodes that receive input (touch events) and act as a container for drawable elements and other actors. A DALi application uses a hierarchy of actor objects to position visible content. An actor inherits a position relative to its parent, and can be moved relative to this point. UI components can be built by combining multiple actors.

              -

              Stage is a top-level node of the scene graph used for displaying a tree of actors. To display an actor, add it to the stage.

              - -

              Signal and Slot

              - -

              Signals and slots are used in the QT GUI library for communication between objects. Objects can send signals containing event information, which can be received by other objects using special functions known as slots. The DALi event system follows the signal and slot mechanism.

              - -

              Signal events are emitted when a certain action or event occurs. The application can connect using these signals. Standard C-style functions can be used to connect to these signals if no local data needs to be accessed, otherwise a class method can also be connected.

              -

              Applications can manually disconnect from signals when required. However, DALi also provides safe signal disconnection. This means that when the connecting object is deleted, the signal is automatically disconnected.

              - -

              Coordinate System

              - -

              DALi uses a left-handed coordinate system with the origin at the top-left corner, with positive X to right, positive Y going downwards, and positive Z going outside the screen with default camera. This is convenient when creating 2D views.

              -

              The stage has a 2D size that matches the size of the application window. The default unit 1 is 1 pixel with default camera.

              - -

              Figure: DALi coordinate system

              -

              DALi coordinate system

              - -

              Camera

              - -

              DALi has a concept of camera to display its virtual 3D world to a 2D screen. There are two ways of using the camera in DALi:

              - -
                -
              • For 2D applications, you don't need to care about the camera at all. The default camera is already best suited for 2D applications (configured to have the origin of coordinate system at the top-left corner of the screen, and unit 1 as 1 pixel of the screen). This is a typical way.
              • -
              • For 3D applications, you might want to change the view by mapulating the camera. You can translate / rotate the camera in this case. Please note that the top-left corner of the screen and unit 1 no longer are (0,0,0) and 1 pixel after manipulating the camera.
              • -
              - -

              DALi Internal Structure

              - -

              DALi consists of the following modules:

              - -
                -
              • dali-core -

                This module provides scene graph -based rendering, animation, and event handling. It is a base module and forms the biggest part of -DALi.

                -
              • -
              • dali-toolkit -

                This module provides UI components and various effects on top of the dali-core.

              • -
              • dali-adaptor -

                dali-adaptor is a platform adaptation layer. It initializes and sets up DALi appropriately. The module provides many platform-related services with its internal module, platform abstraction. Several signals can be connected to it to keep you informed when certain platform-related activities occur.

              • -
              -

              Figure: DALi internal structure

              -

              DALi internal structure

              - -

              Creating a DALi Application

              - -

              To create a 'Hello World' application with Dali:

              -
                -
              1. Create a DALi project
              2. -
              3. Initialize the DALi application
              4. -
              5. Create an actor and add it to a stage
              6. -
              7. Build your DALi application
              8. -
              9. Run your DALi application
              10. -
              - -

              Create a DALi project

              - -
                -
              1. Launch the Tizen IDE.
              2. -
              3. Choose File > New > Tizen Native Project. -

                Press Finish button, then your project is created at the default location. If you want to change the location, uncheck 'Use default location' and set the new location. -Please see Creating the Application Project for more information.

                -
              4. - -

                Figure: Create a DALi project

                -

                Create a DALi project

                - -
              5. The new project is shown in the Project Explorer view of the IDE. If you open src/basicdaliapplication.cpp, you can see the source code of basic DALi application as follows: -
                -#include <dali-toolkit/dali-toolkit.h>
                -
                -using namespace Dali;
                -using Dali::Toolkit::TextLabel;
                -
                -// This example shows how to create and display Hello World using a simple TextLabel
                -//
                -class HelloWorldController : public ConnectionTracker
                -{
                -public:
                -
                -  HelloWorldController( Application& application )
                -  : mApplication( application )
                -  {
                -    // Connect to the Application's Init signal
                -    mApplication.InitSignal().Connect( this, &HelloWorldController::Create );
                -  }
                -
                -  ~HelloWorldController()
                -  {
                -    // Nothing to do here
                -  }
                -
                -  // The Init signal is received once (only) during the Application lifetime
                -  void Create( Application& application )
                -  {
                -    // Get a handle to the stage
                -    Stage stage = Stage::GetCurrent();
                -    stage.SetBackgroundColor( Color::WHITE );
                -
                -    TextLabel textLabel = TextLabel::New( "Hello World" );
                -    textLabel.SetAnchorPoint( AnchorPoint::TOP_LEFT );
                -    textLabel.SetName( "hello-world-label" );
                -    stage.Add( textLabel );
                -
                -    // Respond to a click anywhere on the stage
                -    stage.GetRootLayer().TouchedSignal().Connect( this, &HelloWorldController::OnTouch );
                -  }
                -
                -  bool OnTouch( Actor actor, const TouchEvent& touch )
                -  {
                -    // quit the application
                -    mApplication.Quit();
                -    return true;
                -  }
                -
                -private:
                -  Application&  mApplication;
                -};
                -
                -// Entry point for Tizen applications
                -//
                -int main( int argc, char **argv )
                -{
                -  Application application = Application::New( &argc, &argv );
                -  HelloWorldController test( application );
                -  application.MainLoop();
                -  return 0;
                -}
                -
                -
              6. -
              - -

              Initialize the DALi Application

              - -

              To use DALi APIs, include the dali-toolkit.h header file. It includes the dali-core and dali-adaptor modules.

              - -
              #include <dali-toolkit/dali-toolkit.h>
              - -

              The Dali::Application class (in mobile and wearable applications) initializes and sets up DALi.

              -

              Several signals can be connected to keep you informed when certain platform related activities occur and ensure that, upon system events, DALi is called in a thread-safe manner. To manage signal connection safely, DALi provides Dali::ConnectionTracker. A typical way for starting DALi application is creating a class derived from Dali::ConnectionTracker and using its member functions as callback functions for DALi signals (Please see Automatic Connection Management for more information). This HelloWorldController class will be used in other code samples in the remainder of this guide.

              - -

              Create a Dali::Application instance:

              - -
              -Application application = Application::New(&argc, &argv);
              - -

              After getting the initialized signal from the Dali::Application instance, you can the DALi APIs for building the scene graph. Connect the HelloWorldController::Create callback to DALi::Application InitSignal() function:

              - -
              -mApplication.InitSignal().Connect(this, &HelloWorldController::Create);
              - -

              To run the application, start its main loop. This ensures that images are displayed and events as well as signals are dispatched and captured.

              -
              -application.MainLoop();
              - -

              Create an Actor and Add It to a Stage

              - -

              The TextLabel UI component renders a short text string. To display the TextLabel component, add it to a stage. The stage instance is a singleton object (the only instance of its class during the lifetime of the program), so you can get it using a static function:

              - -
              -Stage stage = Stage::GetCurrent();
              -stage.SetBackgroundColor( Color::WHITE );
              -
              -TextLabel textLabel = TextLabel::New( "Hello World" );
              -textLabel.SetAnchorPoint( AnchorPoint::TOP_LEFT );
              -textLabel.SetName( "hello-world-label" );
              -stage.Add( textLabel );
              -
              - -

              This code additionally sets the background color of the stage and the anchor point, a point defining a position of a child actor from its parent, of the textLabel. The application stores actor and resource handles. DALi objects are reference-counted, which makes sure they exist only as long as they are needed. Even if the TextLabel component is removed from the stage, it remains alive through the reference.

              - - -

              Build your DALi application

              - -

              To build your application, choose Project > Build Project or press F10.

              -

              The Tizen IDE automatically packages the project after building. Please note that you need to register your certificate at the first time to build. Please see Certificate Registration and Building Applications for more information.

              - - -

              Run your DALi application

              - -

              To run your application, choose Run > Run or press Ctrl+F11.

              -

              Please see Running Applications for more information.

              - -

              Figure: The first DALi application running on Tizen emulator

              -

              The first DALi application

              - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/event_handling_n.htm b/org.tizen.ui.guides/html/native/dali/event_handling_n.htm deleted file mode 100755 index f720211..0000000 --- a/org.tizen.ui.guides/html/native/dali/event_handling_n.htm +++ /dev/null @@ -1,566 +0,0 @@ - - - - - - - - - - - - - - Event Handling: Managing the Event Flow - - - - - - -
              - -

              Event Handling: Managing the Event Flow

              - -

              DALi event handling system is composed of 2 major concepts:

              - -
                -
              • Signal -

                Notifications containing event information emitted by GUI components. Also known as events or notifications.

              • -
              • Slot -

                Special functions receiving signals. Also known as event handlers, observer, listener, or callbacks.

              • -
              -

              DALi emits various types of signals to an application to inform it of user actions and the application can handle them through slots.

              - -

              The concept of signal and slots were introduced by Qt for communication between objects. The event mechanism of DALi is inspired by Qt.

              - -

              Figure: A schematic example of signal-slot connections: Signal 1 is connected to slot 1, signal 2 is connected to slot 1 and slot 3, and signal 3 is connected to slot 2.

              -

              Signal and slot event handling

              - -

              The signal and slot system has following advantages:

              -
                -
              • Object-oriented: Support callbacks for C++ member functions
              • -
              • Type safe: Compiler is able to check for type safety
              • -
              • Non-coupling: No dependency between caller and callee
              • -
              • Non-type-intrusive: No modification to caller or callee types
              • -
              • Generic: Work for all types of callbacks
              • -
              • Many-to-many relationship: For example, 1 slot can connect to many signals and 1 signal can be connected to many slots
              • -
              - -

              Example: Handling Touch Events

              -

              The Dali::Actor class provides the TouchedSignal() function to inform the application that a user touches the actor. It is defined as follows:

              - -
              typedef Signal< bool (Actor, const TouchEvent&)> TouchSignalType;
              -TouchSignalType&TouchedSignal();
              - -

              This means that a slot of the following type can be connected to the TouchedSignal() function:

              - -
              bool YourCallbackName(Actor actor, const TouchEvent&event);
              - -

              The return value true indicates that the touch event should be consumed. Otherwise, the signal is emitted on the next sensitive parent of the actor. This meaning is valid for the TouchedSignal(), and other types of signals may not have a return value.

              - -

              Each point on the screen being or having been touched is represented by the Dali::TouchPoint object. This object stores information about the state of the touch point (such as down, up, or motion.) and the coordinates of the touch.

              - -

              A collection of touch points at a specific moment in time is collated into the Dali::TouchEvent object. When a multi-touch event occurs, each touch point represents the points that are currently being touched or the points where touch has stopped.

              - -

              The following example shows how a connection to a touch event signal can be established:

              - -
              -  // ... Assuming this code is in the HelloWorldController class
              -  void Create( Application& application )
              -  {
              -    Control actor = Control::New(); // Control is one of the simplest types of Actor that has visible form
              -    actor.SetParentOrigin( ParentOrigin::CENTER );
              -    actor.SetSize( 100.0f, 100.0f );
              -    actor.SetBackgroundColor( Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
              -    actor.TouchedSignal().Connect( this, &HelloWorldController::OnTouch );
              -    Stage::GetCurrent().Add( actor );
              -  }
              -
              -  bool OnTouch( Actor actor, const TouchEvent&touch )
              -  {
              -    bool handled = false;
              -    unsigned int pointCount = touch.GetPointCount();
              -    if( pointCount == 1)
              -    {
              -      // Do action when first touch on screen
              -      handled = true;
              -    }
              -    else if( pointCount > 1)
              -    {
              -      // Do action when multi-touch on screen
              -      handled = true;
              -    }
              -    return handled;   // true if we have handled the touch, false otherwise
              -  }
              -  // ...
              -
              - -

              The touch event is first emitted to the hit actor by the primary touch point, which is the first point that the user touches. If this hit actor does not handle the event, then the event is offered to the hit actor's parent. Again, if the parent does not handle this event, it is then offered to its parent and so on until the stage is reached or the event is consumed.

              - -

              If a parent and child actor both connect to the touch signal, the touch event is first offered to the child. If it is consumed by the child, then is not informed to the parent.

              - -

              Example: Handling Key Events

              - -

              The following example show how to handle key events received by the stage:

              - -
              -  // ... Assuming this code is in the HelloWorldController class
              -  void Create( Application& application )
              -  {
              -    Stage::GetCurrent().SetBackgroundColor( Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
              -    Stage::GetCurrent().KeyEventSignal().Connect( this, &HelloWorldController::OnKeyEvent );
              -
              -    PushButton button = PushButton::New();
              -    Stage::GetCurrent().Add( button );
              -  }
              -
              -  void OnKeyEvent(const KeyEvent& event)
              -  {
              -    if(event.state == KeyEvent::Down)
              -    {
              -      if( IsKey( event, DALI_KEY_ESCAPE) || IsKey( event, DALI_KEY_BACK ) )
              -      {
              -        mApplication.Quit();
              -      }
              -    }
              -  }
              -  // ...
              -
              - -

              The stage is the top-most root object, so can receive application-wide key events.

              - -

              DALi provides its own key codes for several special keys, such as DALI_KEY_ESCAPE or DALI_KEY_BACK, for your convinience. - -

              Available DALi key codes are listed as follows:

              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              - Table: DALi key codes -
              Key Codes
              DALI_KEY_INVALID
              DALI_KEY_ESCAPE
              DALI_KEY_BACKSPACE
              DALI_KEY_CURSOR_UP
              DALI_KEY_CURSOR_LEFT
              DALI_KEY_CURSOR_RIGHT
              DALI_KEY_CURSOR_DOWN
              DALI_KEY_BACK
              DALI_KEY_CAMERA
              DALI_KEY_CONFIG
              DALI_KEY_POWER
              DALI_KEY_PAUSE
              DALI_KEY_CANCEL
              DALI_KEY_PLAY_CD
              DALI_KEY_STOP_CD
              DALI_KEY_PAUSE_CD
              DALI_KEY_NEXT_SONG
              DALI_KEY_PREVIOUS_SONG
              DALI_KEY_REWIND
              DALI_KEY_FASTFORWARD
              DALI_KEY_MEDIA
              DALI_KEY_PLAY_PAUSE
              DALI_KEY_MUTE
              DALI_KEY_MENU
              DALI_KEY_HOME
              DALI_KEY_HOMEPAGE
              DALI_KEY_WEBPAGE
              DALI_KEY_MAIL
              DALI_KEY_SCREENSAVER
              DALI_KEY_BRIGHTNESS_UP
              DALI_KEY_BRIGHTNESS_DOWN
              DALI_KEY_SOFT_KBD
              DALI_KEY_QUICK_PANEL
              DALI_KEY_TASK_SWITCH
              DALI_KEY_APPS
              DALI_KEY_SEARCH
              DALI_KEY_VOICE
              DALI_KEY_LANGUAGE
              DALI_KEY_VOLUME_UP
              DALI_KEY_VOLUME_DOWN
              - -

              Input Signals

              - -

              Many DALi classes provide various signals to notify events to the application. Among them, the most basic type of signals would be input signals. This section briefly introduces these input signals in DALi.

              - -

              The basic DALi input signals are as follows:

              - -
                -
              • Touched signal notifies screen touch or mouse click
              • -
              • Hovered signal notifies mouse hovering
              • -
              • Wheel event signal notifies mouse wheel rolling
              • -
              • Key event signal notifies keyboard input
              • -
              • Key input focus signals notifies that a control is ready to receive key event signals
              • -
              • Keyboard focus signals notifies moved focus by navigation keys (such as left or right)
              • -
              -

              These signals are provided by the following classes:

              - -
                -
              • Dali::Actor - - - - - - - - - - - - - - - - - - - - - -
                - Table: Dali::Actor input signals -
                Input signalsDescription
                TouchedSignal()Emitted when touch input is received. -

                Callback: bool YourCallbackName(Actor actor, const TouchEvent& event);

                HoveredSignal()Emitted when hover input is received. -

                Callback: bool YourCallbackName(Actor actor, const HoverEvent& event);

                WheelEventSignal()Emitted when wheel event is received. -

                Callback: bool YourCallbackName(Actor actor, const WheelEvent& event);

                - -

                The actor receiving events is passed to the callbacks.

                -
              • - -
              • -Dali::Stage - - - - - - - - - - - - - - - - - - - - - -
                - Table: Dali::Stage input signals -
                Input signalsDescription
                TouchedSignal()Emitted when touch input is received. -

                Callback: void YourCallbackName(const TouchEvent& event)

                HoveredSignal()Emitted when hover input is received. -

                Callback: void YourCallbackName(const TouchEvent& event);

                KeyEventSignal()Emitted when a key event is received. -

                Callback: void YourCallbackName(const KeyEvent& event);

                - -

                Only events are passed to the callbacks since only a single stage instance can exist in DALi application. The callback return types are void because the stage has no parent to pass events to, even though it does not consume the events.

                -
              • - -
              • -Dali::Toolkit::Control - - - - - - - - - - - - - - - - - - - - - - - - - -
                - Table: Dali::Toolkit::Control input signals -
                Input signalsDescription
                KeyEventSignal()Emitted when a key event is received. -

                Callback: bool YourCallbackName(Control control, const KeyEvent& event);

                KeyInputFocusGainedSignal()Emitted when the control gets key input focus. -

                Callback: bool YourCallbackName(Control control);

                KeyInputFocusLostSignal()Emitted when the control loses key input focus which could be due to it being gained by another Control or Actor or just cleared from this control as no longer required. -

                Callback: bool YourCallbackName(Control control);

                TouchedSignal(), HoveredSignal(), KeyEventSignal()Same as the ones supported by Actor -
                - -

                The key event signal is provided by the Dali::Stage and Dali::Toolkit::Control classes, not by the Dali::Actor class. The Dali::Actor class is not designed to get key events. To receive key events, an actor must be an instance of the Dali::Toolkit::Control class or one of its subclasses.

                -

                The Dali::Toolkit::Control class also can receive touch, hover, and wheel events as it inherits from the Dali::Actor class.

                -
              • - -
              • -Dali::Toolkit::KeyboardFocusManager - - - - - - - - - - - - - - - - - - - - - - - - - - -
                - Table: Dali::Toolkit::KeyboardFocusManager input signals -
                Input signalsDescription
                PreFocusChangeSignal()Emitted before the focus is going to be changed. -

                Callback: Actor YourCallbackName(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction);

                FocusChangedSignal()Emitted after the current focused actor has been changed. -

                Callback: void YourCallbackName(Actor originalFocusedActor, Actor currentFocusedActor);

                FocusGroupChangedSignal()Emitted when the focus group has been changed. -

                Callback: void YourCallbackName(Actor currentFocusedActor, bool forward);

                FocusedActorEnterKeySignal()Emitted when the current focused actor has the enter key pressed on it. -

                Callback: void YourCallbackName(Actor enterPressedActor);

                - -

                Dali::Toolkit::KeyboardFocusManager provides the functionality of handling keyboard navigation and maintaining the two dimensional keyboard focus chain. Disimilar to the key input focus, the keyboard focus is about the focus moving between actors, and that's why this signal is provided by the specific focus managing class.

                - -
              • -
              - - -The following DALi classes provide signals: -
                -
              • Dali::Window
              • -
              • Dali::Application
              • -
              • Dali::Timer
              • -
              • Dali::Actor
              • -
              • Dali::Image
              • -
              • Dali::ResourceImage
              • -
              • Dali::LongPressGestureDetector
              • -
              • Dali::TapGestureDetector
              • -
              • Dali::PanGestureDetector
              • -
              • Dali::PinchGestureDetector
              • -
              • Dali::RenderTask
              • -
              • Dali::Stage
              • -
              • Dali::ObjectRegistry
              • -
              • Dali::PropertyNotification
              • -
              • Dali::Animation
              • -
              • Dali::Toolkit::Button
              • -
              • Dali::Toolkit::Control
              • -
              • Dali::Toolkit::TextField
              • -
              • Dali::Toolkit::View
              • -
              • Dali::Toolkit::GaussianBlurViewSignal
              • -
              • Dali::ScrollBar
              • -
              • Dali::Toolkit::Scrollable
              • -
              • Dali::Toolkit::ScrollView
              • -
              • Dali::Toolkit::AccessibilityFocusManager
              • -
              • Dali::Toolkit::KeyboardFocusManager
              • -
              -

              For the signals of each class and their usage, see the API Reference.

              - -

              Gestures

              -

              Gesture is a user-friendly high-level event produced from a stream of touch events. The Dali::GestureDetector class analyzes a stream of touch events and attempts to determine the intention of the user.

              -

              If an actor is attached to a gesture detector and the detector recognizes a user intention (detects a predefined pattern in a stream of touch events), the actor emits a detected gesture signal to the application.

              - -

              DALi currently supports following gesture detectors:

              - -
                -
              • Dali::LongPressGestureDetector detects when the user does a long-press action.
              • -
              • Dali::TapGestureDetector detects when the user does a tap action.
              • -
              • Dali::PinchGestureDetector detects when the user moves two fingers towards or away from each other.
              • -
              • Dali::PanGestureDetector detects when the user moves one or more fingers in the same direction.
              • -
              - -

              The example below shows how an application can be notified of a pinch gesture:

              - -
              -  // ... Assuming this code is in the HelloWorldController class
              -  void Create( Application& application )
              -  {
              -    PushButton actor = PushButton::New();  // Another type of Actor
              -    actor.SetParentOrigin( ParentOrigin::CENTER );
              -    actor.SetSize( 100.0f, 100.0f );
              -    Stage::GetCurrent().Add( actor );
              -
              -    PinchGestureDetector detector = PinchGestureDetector::New();
              -    detector.Attach( actor );
              -    detector.DetectedSignal().Connect( this, &HelloWorldController::OnPinch );
              -  }
              -
              -  void OnPinch( Actor actor, const PinchGesture& pinch )
              -  {
              -     // Scale your actor according to the pinch scale
              -     Vector3 newSize = actor.GetCurrentSize() * pinch.scale;
              -     actor.SetSize( newSize );
              -  }
              -  // ...
              -
              - -

              Automatic Connection Management

              - -

              Let's say we have a pair of connected signal (for example, a button clicked signal) and slot (for example, a toolbar object having the callback for the signal). -If one of them (the button or the toolbar) is deleted without any notification, then the application will crash when the signal is emitted or the slot tries to disconnect the signal.

              - -

              DALi provides the automatic connection management mechanism to prevent this kind of situation. The key is Dali::ConnectionTracker class. It tracks connections between signals and slots, performs automatic disconnection when either the singal or slot is deleted.

              - -

              That's why all the DALi sample codes start with a controller class derived from Dali::ConnectionTracker. This is a safe and typical way of DALi application. Of course you can think of another structure using Dali::ConnectionTracker. - - - -

              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/guides_dali_n.htm b/org.tizen.ui.guides/html/native/dali/guides_dali_n.htm deleted file mode 100755 index 1295fda..0000000 --- a/org.tizen.ui.guides/html/native/dali/guides_dali_n.htm +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - DALi - - - - - - -
              -

              DALi

              - -

              DALi is a cross-platform 3D UI Toolkit for embedded systems. Its 3D user interface engine enables you to create rich and high-performance UI applications. DALi is based on OpenGL ES 2.0, but provides a clean cross-platform C++ framework. This means that you can use high-level DALi APIs instead of accessing low-level OpenGL APIs directly.

              - -

              When creating a DALi application, make sure you understand the following main features:

              - - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/handle_n.htm b/org.tizen.ui.guides/html/native/dali/handle_n.htm deleted file mode 100755 index 41da6eb..0000000 --- a/org.tizen.ui.guides/html/native/dali/handle_n.htm +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - - - - - - - - Handle/Body Pattern: Basic Way of Using DALi Objects - - - - - - -
              -

              Handle/Body Pattern: Basic Way of Using DALi Objects

              - -

              DALi widely adopts the handle/body pattern (a.k.a. pimpl pattern) which seperates implementation details (the body classes) from their interfaces (the handle classes).

              -

              Dali::BaseHandle (in mobile and wearable) is a base class of these handle classes in DALi. It additionally provides smart-pointer semantics which manages internal objects with reference counts. Most of classes in DALi public API are handle classes, which means they inherit from Dali::BaseHandle. -

              - -

              This structure is benificial for both users and developers of DALi:

              -
                -
              • Easier memory management -

                Each internal implementation class (the body class) contains a single reference count object which can be intitialized with the static "New" methods in the DALi public API. This means that C++ new/delete operators do not have to be used in the user code. -(For your information, these internal body class inherit from Dali::BaseObject, but you don't need to use this class directly). -

                -
              • -
              • Better encapsulation -

                The danger of API/ABI breaks is reduced since the implementation of a class can be changed without modifying the public API, thus without recompiling code using the public API. This also can reduce the build time.

                -
              • -
              - -

              Guide for Handles

              - -
                - -
              • No need to call destructors -
                -class HandleTest
                -{
                -  HandleTest()
                -  {
                -    mActor = Actor::New();
                -  }
                -
                -  ~HandleTest() {} // Actor object is destroyed automatically
                -
                -  Actor mActor;
                -};
                -
                -
              • - -
              • Can be stored in STL containers -
                -class HandleTest
                -{
                -  HandleTest()
                -  {
                -    mActors.push_back( Actor::New() );
                -    mActors.push_back( Actor::New() );
                -    ...
                -  }
                -
                -  ~HandleTest() {} // Actors are destroyed automatically
                -
                -  std::vector<Actor> mActors;
                -};
                -
                -
              • - -
              • Passing by value is encouraged -
                -void SomeFunction( Actor actor )
                -{
                -  if( actor )
                -  {
                -    actor.SomeMethod();
                -  }
                -}
                -
                -
              • - -
              • Validity check -
                -{
                -  ...
                -  Actor actor;  // Create a NULL object
                -
                -  // At this stage we cannot call any of the Actor methods
                -  if( !actor )  // This test is will pass, since the actor is NULL
                -  {
                -    actor = Actor::New();
                -    ...
                -  }
                -  ...
                -}
                -
                -
              • - -
              • Equality operators -
                -{
                -  Actor handle1;
                -  Actor handle2;
                -  cout << handle1 == handle2 << endl; // "true", both handles are empty
                -
                -  handle2 = Actor::New();
                -  cout << handle1 == handle2 << endl; // "false", one handle is empty
                -
                -  handle1 = Actor::New();
                -  cout << handle1 == handle2 << endl; // "false", handles to different objects
                -
                -  handle1 = handle2;
                -  cout << handle1 == handle2 << endl; // "true", handles to same object
                -}
                -
                -
              • - -
              • Reference counting examples -
                -class AnimationTest
                -{
                -...
                -private:
                -  Animation mAnimation; // animation handle
                -};
                -void AnimationTest::Initialize ()
                -{
                -  mAnimation = Animation::New( 10.0f ); // reference count will be 1, animation object stays alive when method returns
                -  ...
                -}
                -void AnimationTest::SetAnimation( Animation anim )
                -{
                -  mAnimation = anim; // reference count of original animation decreased, 'anim' is referenced instead
                -                     // if nobody else had a reference on the initial animation, the object is destroyed
                -}
                -
                - -
                -// At this point we own a Dali::Actor named "container"
                -// Enter a code block
                -{
                -  // Create an text label
                -  TextLabel actor = TextLabel::New("test");
                -  // Add the text label to a container
                -  container.Add(actor);
                -}
                -// Exit the code block
                -// At this stage the text label is still alive
                -// We don't keep the handle to the text label, but it can be retrieved from the container
                -
                - -
              - - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/imageview_n.htm b/org.tizen.ui.guides/html/native/dali/imageview_n.htm deleted file mode 100644 index a00a060..0000000 --- a/org.tizen.ui.guides/html/native/dali/imageview_n.htm +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - ImageView: Displaying Images - - - - - - -
              -

              ImageView: Displaying Images

              - -

              ImageView is a control displying an image.

              - -

              Creating an ImageView

              - -

              The following example shows how to create an ImageView object: - -

              -Image image = ResourceImage::New(myImageFilename);
              -ImageView imageView = ImageView::New(image);
              -
              - -

              The image view is constructed by passing a Dali::Image object. The Dali::Image is an abstract base class with multiple derived classes, and the Dali::ResourceImage class is used for loading an image from a file on an url. Please see Resources: Handling Images for more information.

              - - -

              Changing the Image

              - -

              The image view needs a reference to a Dali::Image object on creation. However, the image object can be later changed by calling ImageView::SetImage() function.

              - -
              -imageView.SetImage(newImage);
              -
              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/itemview_n.htm b/org.tizen.ui.guides/html/native/dali/itemview_n.htm deleted file mode 100755 index 9260eb4..0000000 --- a/org.tizen.ui.guides/html/native/dali/itemview_n.htm +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - ItemView: Item Container with Layouts - - - - - - -
              -

              ItemView: Item Container with Layouts

              - -

              The ItemView class is a scrollable container that can contain many items. It provides several scrollable layouts as illustranted in the following figure:

              - -

              Figure: ItemView layouts

              - - - - - - - - - - - - - - -
              GridSpiralDepth
              captured screen2captured screen2captured screen2
              -

              You can also create your own custom layout by inheriting from the Dali::Toolkit::ItemLayout class.

              - -

              Item Factory

              - -

              To create an ItemView instance, you should create your own ItemFactory class by deriving from Dali::Toolkit::ItemFactory and provide its instance to ItemView::New(). ItemFactory is an abstract class having two pure virtual member functions to create items and get the number of created items. The following is a basic example of implementing an ItemFactory:

              - -
              -class MyFactory : public Dali::Toolkit::ItemFactory
              -{
              -public:  
              -   virtual unsigned int GetNumberOfItems()  
              -   {   
              -      // Return the number of items   
              -      return MY_ITEM_COUNT;  
              -   }  
              -
              -   virtual Actor NewItem(unsigned int itemId)  
              -   {   
              -      // Create the actor representing the item based on the itemId 
              -      std::ostringstream imageName;   
              -      imageName << "my-image-folder/" << itemId << ".png"; 
              -
              -      // If item is 10, this results in my-image-folder/10.png
              -      Dali::ResourceImage image = Dali::ResourceImage::New(imageName.str());
              -
              -      // Create an ImageView from the image
              -      return Dali::ImageView::New(image);
              -   }
              -};
              -
              - -

              The overridden functions in the derived class are called by the ItemView object.

              - -

              Creating an ItemView

              - -

              An example of ItemView is as follows:

              - -
              // Store this as a member variable
              -MyFactory factory; 
              -
              -// Pass in the factory
              -Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::New(factory); 
              -
              -itemView.SetParentOrigin(ParentOrigin::CENTER);
              -itemView.SetAnchorPoint(AnchorPoint::CENTER);
              -
              -// Create a layout
              -Dali::Toolkit::ItemLayoutPtr spiralLayout = Dali::Toolkit::DefaultItemLayout::New(Dali::Toolkit::DefaultItemLayout::SPIRAL);
              -
              -// Add the layout to the ItemView
              -itemView.AddLayout(spiralLayout);
              -
              -// More layouts can be created and added to the ItemView
              -// Activate the layout
              -itemView.ActivateLayout(0, Dali::Stage::GetCurrent().GetSize(), 0);
              -
              -Dali::Stage::GetCurrent().Add(itemView);
              - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/layout_n.htm b/org.tizen.ui.guides/html/native/dali/layout_n.htm deleted file mode 100644 index c4c7d8e..0000000 --- a/org.tizen.ui.guides/html/native/dali/layout_n.htm +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - Actors: Working with Basic DALi Components - - - - - - -
              -

              Layout Management: Allocating the Sizes of the Actors

              - -

              DALi provides rule-based layout management, size negotiation, which is used to allocate the sizes of the actors on the stage based on rules of dependency between the actors.

              - -

              Dimensions

              -

              The notion of width and height is generalized into the concept of a dimension. Several methods take the Dimension parameter. The Dimension enum specifies the available dimensions as bit fields:

              -
                -
              • Dimension::WIDTH
              • -
              • Dimension::HEIGHT
              • -
              -

              If a method can process width and height at the same time, the Dimension::ALL_DIMENSIONS mask can be specified.

              - -

              Resize Policies

              - -

              The ResizePolicy enum specifies a range of options for controlling the way actors resize. These rules enable automatic resizing.

              - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
              - Table: Resizing rules -
              Resize policyDescriptionIllustration
              ResizePolicy::FIXEDUse this option to maintain a specific size as set by the SetSize() function. This is the default for all actors.captured screen2
              ResizePolicy::USE_NATURAL_SIZEUse this option for objects, such as images or text to get their natural size. This can mean the dimensions of an image or the size of text with no wrapping. You can also use this option with table views when the size of the table depends on its children.captured screen2
              ResizePolicy::FILL_TO_PARENTThe size of the actor is similar to its parent's size with proportionate filling considered.captured screen2
              ResizePolicy::SIZE_RELATIVE_TO_PARENTThe size of the actor is similar to its parent's size with a relative scale. Use the SetSizeModeFactor() function to specify the ratio.
              ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENTThe size of the actor is similar to its parent's size with a fixed offset using the SetSizeModeFactor function.
              ResizePolicy::FIT_TO_CHILDRENThe size of the actor is scaled around the size of the its children. For example, the height of a pop-up can be resized according to its contents.captured screen2
              ResizePolicy::DIMENSION_DEPENDENCYThis option covers rules, such as width-for-height and height-for-width. You can specify that one dimension depends on another.captured screen2
              - - -

              Example with Actors

              - -

              This section describes a layout example with a actor.

              - -

              Enabling Size Negotiation

              - -

              Text and image actors have relayout enabled by default, while plain actors are disabled unless the SetResizePolicy() function is called.

              - -

              Specifying Size Policies

              - -

              Actors have different size policies by default. For example, the image actor is set to USE_NATURAL_SIZE. This ensures that an image actor uses its natural size by default when it is placed on the stage. However, if the SetSize() function is used with sizes other than 0 on the image actor, the current resize policy is overridden by the FIXED policy and the actor takes the specified size.

              - -

              You can specify how an actor is size-negotiated:

              - -
              void SetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimension) @endcode
              - -

              It is possible to specify different policies for the different dimensions of width and height to archive different layouts. Different actors have different resize policies specified. For example, image actors are set to USE_NATURAL_SIZE by default.

              - -

              The following example shows the rootActor with its width set to ResizePolicy::FILL_TO_PARENT and its height set to ResizePolicy::FIT_TO_CHILDREN. It has an image actor added to it with an explicit call to USE_NATURAL_SIZE in both dimensions called on it. This creates an actor that fills the space of its parent in the width dimension and fits its child in the height dimension. As the image actor child is using its natural size, the height of the root actor fits the height of the child image.

              - -
              Actor rootActor = Actor::New();
              -rootActor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
              -rootActor.SetResizePolicy(ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT);
              -ImageActor image = ImageActor::New(Image::New(MY_IMAGE_PATH));
              -image.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS);
              -rootActor.Add(image);
              - -

              The following images show the before and after layouts for this code example.

              - -

              Figure: Before and after setting the resize policy

              -

              Before and after setting the resize policy

              -

              Before and after setting the resize policy

              - - -

              This example shows a root actor set to expand to its parent's width and adjust around its child's height. The child image actor is set to its natural size.

              - -

              To specify that a dimension has a dependency on another dimension, use the ResizePolicy::DIMENSION_DEPENDENCY policy. For example, if the dimension is Dimension::HEIGHT and the dependency is Dimension::WIDTH, there is a height-for-width dependency in effect. You can use the policy in a text view that wraps its text. The following example shows a text view that expands its width according to the size of its parent, wraps its contents and then determines its height based on the width.

              - -
              TextLabel text = TextLabel::New("Example");
              -text.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
              -text.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
              - -

              Specifying Sizes and Size Limits

              - -

              To specify a fixed size for an actor, use the FIXED resize policy and set the desired size using the SetSize function. If only 1 dimension is FIXED, the other value in the size parameter is ignored, so it is safe to set it to 0.

              -

              To constrain the final negotiated size of an actor, set the following minimum and maximum sizes, respectively:

              - -
              void SetMinimumSize(const Vector2& size)
              -void SetMaximumSize(const Vector2& size)
              - -

              Adjusting the Negotiated Size

              - -

              When an actor must to maintain the aspect ratio of its natural size, use the SizeScalePolicy() function. This is useful to ensure that images maintain their aspect ratio while still fitting the bounds they have been allocated.

              -

              You can use the following resize policies:

              -
                -
              • SizeScalePolicy::USE_SIZE_SET -

                This is the default policy.

              • -
              • SizeScalePolicy::FIT_WITH_ASPECT_RATIO -

                Fits the actor within the bounds it has been allocated while maintaining the aspect ratio.

              • -
              • SizeScalePolicy::FILL_WITH_ASPECT_RATIO -

                Fills all available space, potentially overflowing its bounds, while maintaining aspect ratio.

              • -
              - -
              void SetSizeScalePolicy(SizeScalePolicy::Type policy)
              - -

              Using Actors in Containers

              - -

              When using actors in containers, such as a table view, you can specify the padding surrounding the actor. The padding specifies the left, right, bottom, and top padding value.

              - -
              void SetPadding(const Padding& padding)
              - - - - - - - - - - -
              Note

              Beware of infinite dependency loops!

              -

              The simplest form of this is shown when the resize policy of a parent actor is set to ResizePolicy::FIT_TO_CHILDREN with a child that has a resize policy of ResizePolicy::FILL_TO_PARENT.

              -

              A more complex loop occurs when a parent actor has a width policy of ResizePolicy::DIMENSION_DEPENDENCY with a height policy of ResizePolicy::FIT_TO_CHILDREN. The parent has a single child with a height policy ResizePolicy::DIMENSION_DEPENDENCY with width. If the child's width policy is ResizePolicy::FILL_TO_PARENT, a loop occurs.

              -

              Loops can occur over larger spreads of parent-child relationships. These loops are detected by the relayout algorithm, which allocates actors 0 sizes.

              - - - - -
              - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/multi_threaded_n.htm b/org.tizen.ui.guides/html/native/dali/multi_threaded_n.htm deleted file mode 100755 index 2972ebb..0000000 --- a/org.tizen.ui.guides/html/native/dali/multi_threaded_n.htm +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - Multi-Threaded Architecture: The Secret of High-Performance of DALi - - - - -
          -
          -
          - -
          -

          Multi-Threaded Architecture: The Secret of High-Performance of DALi

          - -

          DALi uses a multithreaded architecture in order to provide the best performance and scalability.

          -
            -
          • Event Thread: The main thread in which application code and event handling runs.
          • -
          • Update Thread: Updates the nodes on the scene as well as running animations and constraints.
          • -
          • Render Thread: OpenGL drawing, texture and geometry uploading etc.
          • -
          • Resource Thread: Loads images and decodes into bitmaps etc.
          • -
          - -

          Figure: DALi Thread Architecture

          -

          Thread Architecture

          - - - - - -

          Animations with Multi-Threading

          - -

          Multi-threaded Architecture

          - -

          DALi animations and rendering occur in a dedicated rendering thread. This allows animations to run smoothly, regardless of the time taken to process inputs events in the application code.

          - -

          Internally, DALi contains the scene graph that mirrors the actor hierarchy. The scene graph objects perform the actual animation and rendering, while the actors provide thread-safe access. Actors and scene graph objects communicate through messaging.

          - -

          The following figure shows an actor hierarchy, in which one of the actors is being animated. The green objects in are created by the application code, while the blue private objects are used in the dedicated rendering thread.

          - -

          Figure: Actor hierarchy with an animation

          -

          Actor hierarchy with an animation

          - -

          Reading an Animated Value

          - -

          When a property is animatable, it can only be modified in the rendering thread. The value returned from a getter method is the value used when the previous frame was rendered.

          - -

          For example, the GetCurrentPosition() function returns the position in which the actor was last rendered. Since the SetPosition() function is asynchronous, a call to GetCurrentPosition() function does not immediately return the same value.

          - -
          Actor actor = Actor::New();
          -Stage::GetCurrent().Add(actor); // Initial position is 0,0,0
          -
          -actor.SetPosition(Vector3(10,10,10));
          -
          -Vector3 current;
          -current = actor.GetCurrentPosition();
          -std::cout << "Current position: " << current.x << ", " << current.y << ", " << current.z << std::endl;
          -
          -std::cout << "..." << std::endl;
          -
          -// Handling another event
          -
          -current = actor.GetCurrentPosition();
          -std::cout << "Current position: " << current.x << ", " << current.y << ", " << current.z << std::endl;
          -
          - -

          The above code is likely to output:

          -
          Actor actor = Actor::New();
          -"Current position: 0,0,0"
          -// Other positions
          -"Current position: 10,10,10"
          - -

          Setting a Property during an Animation

          - -

          When a property is being animated, the animation overrides all values set with other functions, such as the SetPosition() function.

          - -

          Figure: Actor hierarchy with an animated property

          -

          Actor hierarchy with an animated property

          - -

          The order of execution in the render thread is:

          -
            -
          1. Process message and call the SetPosition() function
          2. -
          3. Apply animation and call the SetPosition() function
          4. -
          5. Render frame
          6. -
          - -

          Resource Loading with Multi-Threading

          - -

          DALi loads resources in seperate threads. Without using these resource threads, a large image file will cause block to process next operation in the main thread while reading data from file system or downloading from network.

          - -

          Currently, DALi creates one thread for loading local resources and another for loading remote resources if required.

          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/properties_n.htm b/org.tizen.ui.guides/html/native/dali/properties_n.htm deleted file mode 100755 index 5bd20dd..0000000 --- a/org.tizen.ui.guides/html/native/dali/properties_n.htm +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - - - - - - - - Properties: Accessing to Properties of DALi Objects - - - - - - -
          -

          Properties: Accessing to Properties of DALi Objects

          - -

          A property is a value used by an object that can be modified or read via Dali::Handle::GetProperty() / SetProperty() API.

          - -

          The difference between properties and ordinary C++ member variables is that a property can be dynamically added to or removed from an existing object in runtime, which enables more flexible, script-like programming with DALi.

          - -

          Dali::Handle (in mobile and wearable) provides methods to manage properties, thus the DALi classes that inherit from Dali::Handle (most of classes that users would use) have a number of predefined properties and can have any number of user-defined custom properties. -

          - -

          Accessing to Property Values

          - -

          Property values of an object usually can be accessed via two ways: by its class member functions or by property getters/setters (Dali::Handle::GetProperty() / SetProperty()).

          -

          For example, Dali::Actor has following predefined properties:

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Properties of Dali::Actor -
          Property Index (enumeration)Member Functions
          Dali::Actor::POSITIONDali::Actor::GetCurrentPosition() / SetPosition()
          Dali::Actor::ORIENTATIONDali::Actor::GetCurrentOrientation() / SetOrientation()
          Dali::Actor::SIZEDali::Actor::GetCurrentSize() / SetSize()
          Dali::Actor::COLORDali::Actor::GetCurrentColor() / SetColor()
          Dali::Actor::NAMEDali::Actor::GetName() / SetName()
          ......
          - - You can access them in both ways: - -
          -Actor actor = Actor::New();
          -actor.SetName("test actor");
          -std::cout << actor.GetName() << std::endl;  // "test actor"
          -
          - -
          -Actor actor = Actor::New();
          -actor.SetProperty( Actor::Property::NAME, "test actor" );
          -std::cout << actor.GetProperty( Actor::Property::NAME ) << std::endl;  // "test actor"
          -std::cout << actor.GetProperty<std::string>( Actor::Property::NAME ) << std::endl;  // "test actor"
          -std::cout << actor.GetProperty( Actor::Property::NAME ).Get<std::string>() << std::endl;  // "test actor"
          -
          - -

          Please see API reference for Dali::Handle (in mobile and wearable) for more information. - -

          Usages of Properties

          - -

          Registering User-Defined Custom Properties to Objects

          - -

          Properties can be registered / unregistered in runtime, which enables script-like programming of DALi application, for example, adding custom member data to an instance of a DALi class without subclassing the class or maintaining another pool of custom data.

          -

          For example, you can set your own custom data to PushButton objects and use them later when the buttons are clicked like:

          -
          -void Create( Application& application )
          -{
          -  for( int i=0; i<5; ++i )
          -  {
          -    Toolkit::PushButton button = Toolkit::PushButton::New();
          -    button.SetSize( 100, 100 );
          -    button.SetPosition( 100*i+50, 50 );
          -    button.ClickedSignal().Connect( this, OnButtonClicked );
          -
          -    // Register a custom property having button index.
          -    // Store the property index so you can look it up later.
          -    // Note: This is much faster than looking the property up by property name and should always be used if possible.
          -    // As all control types are the same (PushButtons) the indices to the unique custom property are all same.
          -    Property::Value data( i );
          -    mCustomDataIndex = button.RegisterProperty( "custom-data", data );
          -
          -    Stage::GetCurrent().Add(button);
          -  }
          -}
          -
          -bool OnButtonClicked(Toolkit::Button button)
          -{
          -  // Look up the custom property by the stored property index.
          -  // Note: If the property belongs to a control in another library, or we do not know the index, we can look the index up first with:
          -  // Property::Index index = button.GetPropertyIndex( "custom-data" );
          -  cout << button.GetProperty( mCustomDataIndex ) << endl;
          -  return true;
          -}
          -
          - -

          Please see API reference for Dali::Handle (in mobile and wearable) for more information. - -

          Animating Objects

          - -

          DALi animation API is used to animate the properties of any number of objects.

          - -

          For example, following code animates the value of the POSITION property of a radio button to (100.0, 200.0, 0.0) for 2 seconds:

          - -
          -RadioButton actor = RadioButton::New();
          -Stage::GetCurrent().Add(actor);
          -Animation animation = Animation::New(2.0f); // duration 2 seconds
          -animation.AnimateTo(Property(actor, Actor::Property::POSITION), Vector3(100.0f, 200.0f, 0.0f));
          -animation.Play();
          -
          - -

          Please see Animation Basics for more information.

          - -

          Imposing Constraints on Objects

          - -

          DALi constraint API is used to modify the property of an object based on other properties of other objects.

          - -

          For example, following code makes the value of the SIZE property of an actor same as the value of the SIZE property of its parent actor:

          - -
          -Constraint constraint = Constraint::New( actor,
          -                                                  Actor::Property::SIZE,
          -                                                  EqualToConstraint() );
          -constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
          -constraint.Apply();
          -
          - -

          Please see Constraints for more information.

          - -

          Attributes of Properties

          - -

          A property has following attributes: -

            -
          • Index: An enumeration number indicating the property. Property index is usually used to access properties.
          • -
          • Type: Type of the property. Retrieved by Dali::Handle::GetPropertyType().
          • -
          • Name: Name of the property. Retrieved by Dali::Handle::GetPropertyName().
          • -
          • Writable: If true, the property value can be written. Retrieved by Dali::Handle::IsPropertyWritable().
          • -
          • Animatable: If true, the property can be animated using Dali::Animation. Retrieved by Dali::Handle::IsPropertyAnimatable().
          • -
          • Constraint-Input: If true, the property can be used as input of constraints. Retrieved by Dali::Handle::IsPropertyAConstraintInput().
          • -
          - -

          For example, predefined properties of Dali::Actor has following attributes:

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Attributes of Properties of Dali::Actor -
          Property Index (enumeration)Property TypeProperty Name
          Dali::Actor::POSITIONVector3"position"
          Dali::Actor::ORIENTATIONQuaternion"orientation"
          Dali::Actor::SIZEVector3"size"
          Dali::Actor::COLORVector4"color"
          Dali::Actor::NAMEstd::string"name"
          .........
          - -

          You can see these information at API reference for property of each class. For example for Dali::Actor, please see Dali::Actor::Property (in mobile and wearable).

          - -

          To check all kinds of supported property types, please see Dali::Property::Type (in mobile and wearable) and Dali::PropertyTypes (in mobile and wearable).

          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/rendering_effects_n.htm b/org.tizen.ui.guides/html/native/dali/rendering_effects_n.htm deleted file mode 100755 index ba741e0..0000000 --- a/org.tizen.ui.guides/html/native/dali/rendering_effects_n.htm +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - Rendering and Effects: Managing Viewing Modes and Shader Effects - - - - - - -
          -

          Rendering and Effects: Managing Viewing Modes and Shader Effects

          - -DALi provides stereoscopic viewing modes. It also provides a way to use user-defined custom shader effects. - -

          Viewing Modes

          - -

          DALi supports the following viewing modes:

          -
            -
          • MONO
          • -
          • STEREO_HORIZONTAL
          • -
          • STEREO_VERTICAL
          • -
          - -

          MONO is the default viewing mode. When using the MONO mode, only 1 image per scene is produced in every update. In this setup, DALi creates a default render task, which renders everything added to the stage root layer, and 1 default camera for that render task.

          - -

          The STEREO_HORIZONTAL and STEREO_VERTICAL modes allow the application to produce stereo images. Stereoscopy is a technique for creating or enhancing the illusion of depth in an image. Stereo rendering technique produces 2 images of the scene with an slight offset between them, which is presented to the left and the right eye independently. In this setup, DALi creates 2 additional render tasks, 1 for the right eye and 1 for the left, each with its own camera. Those cameras are parented to the default camera. The method to generate the projection transformation for each camera is known as "parallel axis asymmetric frustum perspective projection" and is illustrated in the following figure.

          - -

          Figure: Stereoscopic projection

          -

          Stereoscopic projection

          - -

          The separation between the 2 cameras is configurable but, typically, it ranges between 50 and 70 millimeters. Too large a separation can be hard to resolve and is known as hyperstereo. The convergence plane for both frustums is the 2D plane, so the projection of anything lying in the 2D plane is coincident for both left and right eye, resulting in no parallax. Objects that lie in front of the projection plane appear to be in front of the screen and objects behind the projection plane appear to be "into" the screen. Objects behind the projection plane (positive parallax) are easier to look at without straining the eyes.

          - -

          To view stereoscopic images correctly, each image must be presented to each eye independently. There are devices on the market for this, such as a head-mounted display, which is a display device worn in the head that has 2 small displays, one for each eye. A cheaper alternative to this often expensive device is the Google cardboard viewer.

          - -

          Figure: Google cardboard viewer

          -

          Google cardboard viewer

          - -

          With the Google cardboard viewer or a similar device, you can transform your phone into a basic virtual reality headset.

          - -

          Stereoscopic Rendering in DALi

          - -

          The STEREO_HORIZONTAL mode presents the left image on the top half of the screen and the right image on the bottom half. It is intended to be used in landscape orientation, so the images are rotated 90 degrees counter-clockwise. The STEREO_VERTICAL mode, on the other hand, renders the left image on the left half of the screen and the right image on the right half.

          - -

          To define the viewing mode to be used, use the SetViewMode() function of the Application class, passing the mode as a parameter. You can query the view mode being used by calling the GetViewMode() function. To define the separation between the left and right cameras, use the SetStereoBase() function, passing the distance in millimeters as a parameter. This distance can be queried using the GetStereoBase() function. You can also set the viewing mode and offset at initialization time using 2 command line arguments for this purpose: -view-mode (or -v) and 0 for MONO, 1 for STEREO_HORIZONTAL, 2 for STEREO_VERTICAL, and -stereo-base (or -s) and the separation in millimeters.

          - -

          Restrictions

          - -

          There are certain restrictions when writing stereoscopic applications using DALi:

          - -
            -
          • When a stereo mode is selected, the default render task source actor is set to an uninitialized actor so it does not render anything. Changing the default render task source actor later on produces undesired results, as the user does not want to see anything rendered by the default camera when stereo mode is on.
          • -
          • Stereo cameras are parented to the default camera, so if the application needs to change the camera position or orientation, it must change the default camera transformation. The handle to the default camera can be obtained from the default render task as follows: - -
            Dali::RenderTask defaultRenderTask = Dali::Stage::GetCurrent().GetRenderTaskList().GetTask(0); Dali::CameraActor defaultCamera = defaultRenderTask.GetCameraActor();
            -
          • -
          • Stereo render tasks render everything added to the stage's root layer. If the application must render an object hierarchy to an off-screen buffer, it must set the exclusive flag on that render task so that the stereo tasks do not render that particular subtree. To set the exclusive flag in a render task, use the SetExclusive() function defined in the render task.
          • -
          - - - - - - - - - - -
          Note
          -

          DALi stereoscopic viewing mode is a developing feature rather than completed feature. Thus, it might not be enough for commercialized applications at this moment. For example, distortion correction is not supported yet. We are trying to improve this streoscopic mode to give our users chances to provide more exciting and immersive user experience to their clients.

          -
          - - - -

          Shader Effects

          -

          The shader effects allow the developer to apply visual deformations on the actors. They can affect the geometry, the colors and textures of the actor.

          -
            -
          • Each actor has its own default shaders.
          • -
          • Those default shaders can be overridden by modified shader effects.
          • -
          • In an application, each actor might possess its own shader effect.
          • -
          • In an application, multiple actors might apply the same effect.
          • -
          - -

          Custom Shader Effects

          -

          The ShaderEffect enables you to create custom shader effects by specifying the vertex and pixel shaders. For a custom shader, you can provide the vertex and fragment shader code as strings. These shader snippets get concatenated with the default attributes and uniforms.

          - -

          Create a custom shader effect:

          - -
          std::string myVertexShader; // This variable would contain the code for a vertex shader.
          -Dali::ShaderEffect myEffect = Dali::ShaderEffect::New(myVertexShader,
          -   "" // use default pixel shader
          -);
          - -

          Set the value of a uniform:

          - -
          // if the uniform was declared like this in the shader: uniform float myUniform;
          -myEffect.SetUniform("myUniform", 0.5f);
          - -

          You can apply the custom shader effect to an actor like any other shader:

          - -
          actor.SetShaderEffect(myEffect);
          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/resources_n.htm b/org.tizen.ui.guides/html/native/dali/resources_n.htm deleted file mode 100755 index 12d0974..0000000 --- a/org.tizen.ui.guides/html/native/dali/resources_n.htm +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - Resources: Handling Images - - - - - - -
          -

          Resources: Handling Images

          - -

          DALi provides several ways to handle resource images.

          - -

          Loading Image Files

          - -

          You can load an image file with ResourceImage class by specifying its location as follows: - -

          -Dali::ResourceImage image = Dali::ResourceImage::New("/my-path/my-image.png");
          -
          - -

          The loaded image can be displayed using ImageView as follows:

          - -
          -ImageView imageView = ImageView::New(image);
          -Stage::GetCurrent().Add(imageView);
          -
          - -

          Please see ImageView: Displaying Images for more details. - -

          Supported Resource Types

          - -

          The resource location can be a file path or a URL.

          - -

          Currently supported image types are:

          -
            -
          • png
          • -
          • jpeg
          • -
          • gif
          • -
          • bmp
          • -
          • wbmp
          • -
          • ico
          • -
          • ktx
          • -
          - -

          Currently supported URL schemes are:

          -
            -
          • http
          • -
          • https
          • -
          - -

          Asynchronous Loading

          - -

          Resources are loaded in separate threads, which means when you call ResourceImage::New(), it returns immediately.

          - -

          The application can connect to the Dali::ResourceImage::LoadingFinishedSignal() signal to get notified when the image has loaded as follows:

          - - -
          -class ResourceImageController : public ConnectionTracker
          -{
          -public:
          -  ResourceImageController( Application& application ) : mApplication( application )
          -  {
          -    mApplication.InitSignal().Connect( this, &ResourceImageController::Create );
          -  }
          -
          -  void Create( Application& application )
          -  {
          -    ResourceImage image = ResourceImage::New("https://www.tizen.org/sites/default/files/admins/tizen-branding-lockup-on-light.png");
          -    image.LoadingFinishedSignal().Connect(this, &ResourceImageController::OnLoadFinished); 
          -
          -    ImageView imageView = ImageView::New(image);
          -    imageView.SetSize(400,200);
          -    imageView.SetParentOrigin(ParentOrigin::CENTER);
          -    Stage::GetCurrent().Add(imageView);
          -  }
          -
          -  void OnLoadFinished(ResourceImage image)
          -  {
          -    LoadingState state = image.GetLoadingState();
          -    if(state == ResourceLoadingSucceeded)
          -      cout << "Loading " << image.GetUrl() << " is succeeded" << endl;
          -    else if(state == ResourceLoadingFailed)
          -      cout << "Loading " << image.GetUrl() << " is failed" << endl;
          -  }
          -};
          -
          - -

          Please see Resource Loading with Multi-Threading for more information about the resource threads. - - -

          Load Policies & Release Policies

          - -

          By default, resource images start loading immediately and the data is released only when the ResourceImage handle is destroyed. To optimize the application's memory footprint, the application can ask resources to be loaded only when actually required and their data to be released automatically when they are no longer being used by actors.

          - -
          Dali::ResourceImage image = Dali::ResourceImage::New("/my-path/my-image.png", Dali::ResourceImage::ON_DEMAND, Dali::Image::UNUSED);
          - -

          If the Dali::Image::UNUSED property is used, when the image is used again, the resource data is reloaded automatically.

          - -

          Resizing at Load Time

          - -

          An application loading images from an external source will often want to display those images at a lower resolution than their native ones. To support this, DALi can resize an image at load time so that its in-memory copy uses less space and its visual quality benefits from being prefiltered. There are four algorithms which can be used to fit an image to a desired rectangle, a desired width or a desired height (see Dali::FittingMode).

          - -

          Here is an example doing rescaling:

          - -
          -Dali::Image image = Dali::ResourceImage::New( filename, ImageDimensions( 240, 240 ), FittingMode::SCALE_TO_FILL );
          -
          - -

          This example sets the size and fitting mode appropriately for a large thumbnail during the Dali::ResourceImage object construction. In general, to enable scaling on load, pass a non-zero width or height and one of the four fitting modes to the Dali::ResourceImage creator function as shown above.

          - -

          The fitting modes and a suggested use-case for each are as follows:

          - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Fitting Modes -
          Fitting ModeSuggested Usecase
          Dali::FittingMode::SHRINK_TO_FITFull-screen image display: Limit loaded image resolution to device resolution but show all of image.
          Dali::FittingMode::SCALE_TO_FILLThumbnail gallery grid: Limit loaded image resolution to screen tile, filling whole tile but losing a few pixels to match the tile shape.
          Dali::FittingMode::FIT_WIDTHImage columns: Limit loaded image resolution to column.
          Dali::FittingMode::FIT_HEIGHTImage rows: Limit loaded image resolution to row height.
          - - -

          Image Size

          - -

          If the application requires the image dimensions immediately, they can be retrieved synchronously:

          - -
          Dali::ImageDimensions dimensions = Dali::ResourceImage::GetImageSize("/my-path/my-image.png");
          - -

          This is a disk read which can be slow and block the event thread (This is currently not suppored for remote resources such as http or https URLs).

          - -

          Nine-Patch Image

          - -

          DALi provides support for Nine-patch images which are stretchable images while maintaining their corners.

          - -

          Nine-Patch Image Format

          - -

          A nine-patch image has nine sections. In the following figure, section 2, 4, 5, 6, 8 are stretched and section 1, 3, 7, 9 keep their size unchanged when the size of the image is changed:

          - -

          Figure: A nine-patch image

          -

          A nine-patch image

          - -

          Figure: A nine-patch image explained

          -

          A nine-patch image

          - -

          The black lines top and left side of the image determines the stretchable region.

          - -

          This format is compatible with the one used in Android. Therefore, you can easily make nine-patch images using existing tools such as Simple Nine-patch Generator.

          - -

          Loading Nine-Patch Images

          - -

          A nine-patch image can be loaded by ResourceImage just like other images. If a image file has .9.png or .9.jpg extension and proper nine-patch image contents as forementioned, the image loaded by ResourceImage will be rendered in nine-patch way with ImageView class.

          - -

          The following is an example of using a *.9.png image:

          - -
          -  ResourceImage image = ResourceImage::New( "nine_patch_dali.9.png" );
          -  ImageActor imageView = ImageActor::New(image);
          -  imageView.SetSize(200,200);
          -
          - -

          The result is as follows:

          -

          Figure: 200 x 200 image

          -

          200 x 200 image

          - -

          Buffer Image

          - -

          A BufferImage represents an image resource in the form of a pixel buffer data. The application can write to this buffer as required and the image is updated on the screen.

          - -
          // Create a 200 by 200 pixel buffer with a color-depth of 32-bits (with alpha)
          -Dali::BufferImage image = Dali::BufferImage::New(200, 200);
          - -

          Please see API reference for Dali::BufferImage (in mobile and wearable) for more details. - - - - -

          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/scrollview_n.htm b/org.tizen.ui.guides/html/native/dali/scrollview_n.htm deleted file mode 100755 index 0121500..0000000 --- a/org.tizen.ui.guides/html/native/dali/scrollview_n.htm +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - - - - ScrollView: Scrollable Container for Items - - - - - - -
          -

          ScrollView: Scrollable Container for Items

          - -

          The ScrollView class provides scrollable view which contains actors and can be scrolled automatically or manually by panning.

          - -

          The following figure shows example layouts using the ScrollView.

          - -

          Figure: ScrollView

          -

          ScrollView

          - - -

          A scroll view emits a SnapStartedSignal() when the ScrollView has started to snap or flick. The signal informs the target of the scroll position, scale, and rotation.

          - -

          Creating a ScrollView

          - -

          The following example shows how to create a ScrollView:

          - -
          Dali::Toolkit::ScrollView scrollView;
          -
          -// Create a ScrollView instance
          -myScrollView = ScrollView::New();
          -
          -// Add it to the stage
          -Stage::GetCurrent().Add(scrollView);
          -
          -// Set the size of stage; it covers the entire stage 
          -Stage stage = Dali::Stage::GetCurrent();
          -Size size = stage.GetSize();
          -scrollView.SetSize(size);
          -
          -// Add actors to the ScrollView 
          -Image image = Image::New(DALI_IMAGE_DIR "button-background.png");
          -ImageActor imageActor = ImageActor::New(image);
          -scrollView.Add(imageActor);
          -// The ScrollView contents are now draggable
          -
          -// To enforce horizontal-only scrolling, the Y-axis ruler can be disabled 
          -RulerPtr rulerY = new DefaultRuler();
          -rulerY->Disable();
          -scrollView.SetRulerY(rulerY);
          -
          -// To enable snapping, a FixedRuler can be applied to the X-axis, with snap points spaced to the width of the stage. 
          -Size size = stage.GetSize();
          -RulerPtr rulerX = new FixedRuler(size.width);
          -scrollView.SetRulerX(rulerX);
          -
          -// A domain can be applied to rulers to prevent scrolling beyond this boundary
          -// In this case, to 4 times the width of the stage, allowing for 4 pages to be scrolled
          -Size size = stage.GetSize();
          -RulerPtr rulerX = new FixedRuler(size.width);
          -rulerX->SetDomain(RulerDomain(0.0f, size.width*4.0f));
          -scrollView.SetRulerX(rulerX);
          - -

          Ruler, RulerDomain, and Wrap

          - -

          The Ruler abstract class defines the scroll axes. The RulerDomain class specifies the minimum and maximum values of a ruler. The ScrollView class provides a wrap mode for ScrollView contents. When enabled, the ScrollView contents are wrapped over the x/y domain. The ScrollView behavior depends on a combination of the Ruler, RulerDomain, and Wrap modes. The following table shows ScrollView behavior according to the combination.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Scrollview behavior in the Ruler, RulerDomain, and Wrap mode
          RulerDomainWrapBehavior
          DisabledDisabledWrapNo movement in axis
          DisabledEnabledNo wrapNo movement in axis
          DisabledEnabledWrapNo movement in axis
          EnabledDisabledNo wrapFree movement in axis
          EnabledDisabledWrapFree movement in axis, wrapped according to domain minimum and maximum
          EnabledEnabledNo wrapMovement limited to domain minimum and maximum
          EnabledEnabledWrapMovement limited to domain minimum and maximum
          - - - - - - - - - - -
          Note
          Actors within a ScrollView are controlled by constraints. If you apply constraints to these actors externally, undefined behavior can occur. Applying additional constraints can conflict with the ScrollView constraints, so place the actors within container actors. The container actors are affected by the constraints.
          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/tableview_n.htm b/org.tizen.ui.guides/html/native/dali/tableview_n.htm deleted file mode 100755 index 6de3ce8..0000000 --- a/org.tizen.ui.guides/html/native/dali/tableview_n.htm +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - TableView: Container with Grid-like Layout - - - - - - -
          -

          TableView: Container with Grid-like Layout

          - -

          The TableView class is a layout container for aligning child actors in a grid like layout. TableView constraints the x and y position and width and height of the child actors.

          - -

          Figure: TableView

          -

          TableView

          - -

          Creating a TableView

          - -

          The following example shows how to create a TableView:

          - -
          class ButtonsController: public ConnectionTracker
          -{
          -   ButtonsController(Application& application)
          -      : mApplication(application)
          -   {
          -      mApplication.InitSignal().Connect(this, &ButtonsController::Create);
          -   }
          -
          -   void Create(Application& application)
          -   {
          -      Stage stage = Stage::GetCurrent();
          -
          -      TableView tableView = TableView::New(4,4);
          -      tableView.SetKeyboardFocusable(true);
          -      tableView.SetName("TableView");
          -
          -      for (int row = 0; row < 4; ++row)
          -      {
          -         for (int col = 0; col < 4; ++col)
          -         {
          -            Control control = Control::New();
          -            std::ostringstream str;
          -            str << row << "-" << col;
          -            control.SetName(str.str());
          -            control.SetKeyboardFocusable(true);
          -            tableView.AddChild(control, TableView::CellPosition(row, col));
          -         }
          -      }
          -      stage.Add(tableView);
          -   }
          -
          -   // Signal
          -
          -   Application& mApplication;
          -}
          - - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/textfield_n.htm b/org.tizen.ui.guides/html/native/dali/textfield_n.htm deleted file mode 100755 index d45daf5..0000000 --- a/org.tizen.ui.guides/html/native/dali/textfield_n.htm +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - - - - - - - TextField: Type Your Text! - - - - - - -
          -

          TextField: Type Your Text!

          - -

          The TextField class is a control providing a single-line editable text field.

          - -

          Figure: TextField

          -

          TextField

          - -

          Creating a TextField

          - -

          Before text has been entered, the TextField can display a placeholder text. An alternative placeholder can be displayed when the TextField has keyboard focus. For example, a TextField used to enter a username can initially show the text Unknown Name, and the text Enter Name.when the cursor is visible.

          - -
          TextField field = TextField::New();
          -field.SetProperty(TextField::Property::PLACEHOLDER_TEXT, "Unnamed Name");
          -field.SetProperty(TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Enter Name.");
          -Stage::GetCurrent().Add(field);
          -
          - -

          When the TextField is tapped, it automatically gets the keyboard focus. Key events enter text, and the placeholder text is removed. After text has been entered, it can be retrieved from the TEXT property.

          - -
          Property::Value fieldText = field.GetProperty(TextField::Property::TEXT);
          -std::cout << "Received text: " << fieldText.Get< std::string >() << std::endl;
          - -

          Text Alignment

          - -

          The TextField displays a single-line of text, which scrolls if there is not enough space for the text displayed. If there is enough space, the text can be aligned horizontally to the beginning, end, or center of the available area:

          - -
          field.SetProperty(TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); // "CENTER" or "END"
          - -

          Decorations

          - -

          For text decorations, the TextLabel class provides the properties listed in the following table.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: TextField properties -
          PropertyTypeWritableAnimatable
          RENDERING_BACKENDIntegerYesNo
          TEXTStringYesNo
          PLACEHOLDER_TEXTStringYesNo
          PLACEHOLDER_TEXT_FOCUSEDStringYesNo
          FONT_FAMILYStringYesNo
          FONT_STYLEStringYesNo
          POINT_SIZEFloatYesNo
          MAX_LENGTHIntegerYesNo
          EXCEED_POLICYIntegerYesNo
          HORIZONTAL_ALIGNMENTStringYesNo
          VERTICAL_ALIGNMENTStringYesNo
          COLORVector4YesNo
          SHADOW_OFFSETVector2YesNo
          SHADOW_COLORVector4YesNo
          PRIMARY_CURSOR_COLORVector4YesNo
          SECONDARY_CURSOR_COLORVector4YesNo
          ENABLE_CURSOR_BLINKBooleanYesNo
          CURSOR_BLINK_INTERVALFloatYesNo
          CURSOR_BLINK_DURATIONFloatYesNo
          GRAB_HANDLE_IMAGEStringYesNo
          GRAB_HANDLE_PRESSED_IMAGEStringYesNo
          SCROLL_THRESHOLDFloatYesNo
          SCROLL_SPEEDFloatYesNo
          SELECTION_HANDLE_IMAGE_RIGHTStringYesNo
          SELECTION_HANDLE_PRESSED_IMAGE_LEFTStringYesNo
          SELECTION_HANDLE_PRESSED_IMAGE_RIGHTStringYesNo
          SELECTION_HIGHLIGHT_COLORVector4YesNo
          DECORATION_BOUNDING_BOXRectangleYesNo
          INPUT_METHOD_SETTINGSMapYesNo
          - -

          To change the color of the text, use the TEXT_COLOR property. An alternative color can be used for placeholder text by setting the PLACEHOLDER_TEXT_COLOR property. Unlike the Actor::COLOR property, these properties do not affect child actors added to the TextField.

          - -
          field.SetProperty(TextField::Property::TEXT_COLOR, Color::CYAN);
          -field.SetProperty(TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::BLACK);
          - - - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/textlabel_n.htm b/org.tizen.ui.guides/html/native/dali/textlabel_n.htm deleted file mode 100755 index 49e721c..0000000 --- a/org.tizen.ui.guides/html/native/dali/textlabel_n.htm +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - - - - - - - - TextLabel: Displaying Text Labels - - - - - - -
          -

          TextLabel: Displaying Text Labels

          - -

          The TextLabel class provides a control that renders a short text string. The text labels are lightweight, non-editable, and do not respond to user input.

          - -

          Figure: TextLabel

          -

          TextLabel

          - -

          Creating a TextLabel

          - -

          The following example shows how to create a TextLabel instance:

          - -
          TextLabel label = TextLabel::New();
          -label.SetProperty(TextLabel::Property::TEXT, "Hello World");
          -Stage::GetCurrent().Add(label);
          - -

          Font Selection

          - -

          By default, the TextLabel automatically selects a suitable font from the platform. Please note that the selected font might not support all characters in your input text. For example, Latin fonts often do not provide Arabic glyphs.

          - -

          Alternatively, you can request a font using the FONT_FAMILY, FONT_STYLE, and POINT_SIZE properties:

          - -
          label.SetProperty(TextLabel::Property::FONT_FAMILY, "HelveticaNue");
          -label.SetProperty(TextLabel::Property::FONT_STYLE,  "Regular");
          -label.SetProperty(TextLabel::Property::POINT_SIZE,  12.0f);
          - -

          The TextLabel falls back to using the default font if the requested font does not support the required scripts.

          - -

          Text Alignment

          - -

          Wrapping can be enabled using the MULTI_LINE property:

          - -
          label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          - -

          The text can be aligned horizontally to the beginning, end, or center of the available area:

          - -
          label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); // "CENTER" or "END"
          - -

          Layout

          - -

          There are several resize policies commonly used with TextLabels. -The following examples show the actual size by setting a colored background, whilst the black area represents the size of the parent control.

          - -

          Natural Size Policy

          - -

          In its natural size, the TextLabel is large enough to display the text without wrapping, and does not have extra space to align the text within. In the following example, the same result is displayed regardless of the alignment or multi-line properties:

          - -
          TextLabel label = TextLabel::New("Hello World");
          -label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          -label.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE,Dimension::ALL_DIMENSIONS);
          -label.SetBackgroundColor(Color::BLUE);Stage::GetCurrent().Add(label);
          - -

          Height-for-width Policy

          - -

          To lay out text labels vertically, a fixed (maximum) width must be provided by the parent control. Each TextLabel reports the desired height for the given width. The following example uses TableView as the parent:

          - -
          TableView parent = TableView::New(3, 1);
          -parent.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          -parent.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
          -parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          -
          -Stage::GetCurrent().Add(parent);
          -
          -TextLabel label = TextLabel::New("Hello World");
          -label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          -label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          -label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          -label.SetBackgroundColor(Color::BLUE);
          -
          -parent.AddChild(label, TableView::CellPosition(0, 0));
          -parent.SetFitHeight(0);
          -
          -label = TextLabel::New("A Quick Brown Fox Jumps Over The Lazy Dog");
          -label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          -label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          -label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          -label.SetBackgroundColor(Color::GREEN);
          -label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          -
          -parent.AddChild(label, TableView::CellPosition(1, 0));
          -parent.SetFitHeight(1);
          -
          -label = TextLabel::New("لإعادة ترتيب الشاشات، يجب تغيير نوع العرض إلى شبكة قابلة للتخصيص");
          -label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          -label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          -label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          -label.SetBackgroundColor(Color::BLUE);
          -label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          -
          -parent.AddChild(label, TableView::CellPosition(2, 0));
          -parent.SetFitHeight(2);
          - -

          In the example, the "Hello World" text label has been given the full width, not the natural width.

          - -

          Decorations

          - -

          For text decorations, TextLabel provides several properties.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: TextLabel properties -
          PropertyTypeWritableAnimatable
          RENDERING_BACKENDIntegerYesNo
          TEXTStringYesNo
          FONT_FAMILYStringYesNo
          FONT_STYLEStringYesNo
          POINT_SIZEFloatYesNo
          MULTI_LINEBooleanYesNo
          HORIZONTAL_ALIGNMENTStringYesNo
          VERTICAL_ALIGNMENTStringYesNo
          TEXT_COLORVector4YesNo
          SHADOW_OFFSETVector2YesNo
          SHADOW_COLORVector4YesNo
          UNDERLINE_ENABLEDBooleanYesNo
          UNDERLINE_COLORVector4YesNo
          UNDERLINE_HEIGHTFloatYesNo
          - -

          Color

          - -

          To change the color of the text, use the TEXT_COLOR property. Unlike the Actor::COLOR property, this does not affect child actors added to the TextLabel.

          - -
          label.SetProperty(TextLabel::Property::TEXT, "Red Text");
          -label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
          - -

          Drop Shadow

          - -

          To add a drop shadow to the text, set the SHADOW_OFFSET property with a non-zero values. The color can also be selected using the SHADOW_COLOR property.

          - -
          stage.SetBackgroundColor(Color::BLUE);
          -label1.SetProperty(TextLabel::Property::TEXT, "Plain Text");
          -label2.SetProperty(TextLabel::Property::TEXT, "Text with Shadow");
          -label2.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(1.0f, 1.0f));
          -label2.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::BLACK);
          -label3.SetProperty(TextLabel::Property::TEXT, "Text with Bigger Shadow");
          -label3.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(2.0f, 2.0f));
          -label3.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::BLACK);
          -label4.SetProperty(TextLabel::Property::TEXT, "Text with Color Shadow");
          -label4.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(1.0f, 1.0f));
          -label4.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::RED);
          - -

          Underlining

          - -

          The text can be underlined by setting UNDERLINE_ENABLED. The color can also be selected using the UNDERLINE_COLOR property.

          - -
          label1.SetProperty(TextLabel::Property::TEXT, "Text with Underline");
          -label1.SetProperty(TextLabel::Property::UNDERLINE_ENABLED, true);
          -label2.SetProperty(TextLabel::Property::TEXT, "Text with Color Underline");
          -label2.SetProperty(TextLabel::Property::UNDERLINE_ENABLED, true);
          -label2.SetProperty(TextLabel::Property::UNDERLINE_COLOR, Color::GREEN); 
          - -

          By default, the underline height is based on the font metrics. This can be overridden using the UNDERLINE_HEIGHT property:

          - -
          label1.SetProperty(TextLabel::Property::UNDERLINE_HEIGHT, 1.0f);
          - - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/dali/ui_components_n.htm b/org.tizen.ui.guides/html/native/dali/ui_components_n.htm deleted file mode 100755 index c7160c2..0000000 --- a/org.tizen.ui.guides/html/native/dali/ui_components_n.htm +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - UI Components: Creating the Application Layout - - - - - - -
          -

          UI Components: Creating the Application Layout

          - -

          UI components are interactive components for layouting and scrolling the user interface. DALi provides UI components, such as buttons, item view, scroll view, table view, and text controls.

          - -

          Figure: DALi UI components

          -

          DALi UI components

          - -

          The following table lists the available UI components.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: DALi UI components -
          ControlDescriptionRelated classes
          ButtonsA push button that can be pressed, a checkbox button that can be checked/unchecked,and a radio button that only one option can be selected.Button, PushButton, CheckBoxButton, RadioButton
          ItemViewAn item view that renders item sets in a scrollable layout.ItemView, ItemFactory, ItemLayout, Scrollable
          ScrollViewA scroll view to provide scrollable view.ScrollView, Scrollable, ScrollViewEffect, ScrollViewPagePathEffect
          TableViewA table view that can align child actors in a grid like layout.TableView
          TextFieldA text field that provides a single-line editable text field.TextField
          TextLabelA text label that renders a short text string.TextLabel
          ImageViewAn image view that renders an image.ImageView
          - -

          The base class for the components is Dali::Toolkit::Control (in mobile and wearable applications). This class can also be used to create your own custom UI components. Please find some tips for the base control class in Control: Base Class of UI Components. For remainder of this guide, the term "control" or "component" can be used to indicate UI component.

          - -

          The following figure illustrates the hierarchy of the UI components.

          - -

          Figure: DALi UI control hierarchy

          -

          DALi UI control hierarchy

          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/animation_effects_n.htm b/org.tizen.ui.guides/html/native/efl/animation_effects_n.htm deleted file mode 100755 index c6ee375..0000000 --- a/org.tizen.ui.guides/html/native/efl/animation_effects_n.htm +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - Animations and Effects: Creating Transformations - - - - - -
          - -

          Animations and Effects: Creating Transformations

          - -

          EFL provides the following animation functionalities: Ecore animators, Elementary transitions, Edje animations, and Evas Map animations.

          - -

          The first option for creating animations with EFL is to use Ecore animators. To create an Ecore animation, you must first determine the duration of the animation, and then define a callback function that performs the animation with that duration.

          - -

          You can also create animations using Elementary transitions. Elementary transitions allow you to apply various transition effects, such as translation and rotation, to Evas objects. Elementary transitions are mostly based on Ecore animators, but provide some transition methods at a higher level of abstraction. Elementary transitions provide a simpler way of animating objects than Ecore animators or Edje animations.

          - -

          A third option for animating objects is to use Edje animations, which are based on a simple principle: transitioning from one state to another. To animate an object with Edje, you have to first define the start and end states of the animation, and then transition the object from the start state to the end state.

          - -

          Finally, Evas Map animations allow you to apply transformations to all types of objects by way of UV mapping. In UV mapping, you map points in the source object to 3D space positions in the target object. This allows for rotation, perspective, scale, and other transformation effects, depending on the map. In addition, each map point can carry a multiplier color, which, if properly calculated, can be used to apply 3D shading effects on the target object.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/basic_tutorial_mn.htm b/org.tizen.ui.guides/html/native/efl/basic_tutorial_mn.htm deleted file mode 100755 index 1e662b5..0000000 --- a/org.tizen.ui.guides/html/native/efl/basic_tutorial_mn.htm +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - - - - - - - Creating Basic Mobile Interactions - - - - - - -
          -

          Creating Basic Mobile Interactions

          - - -

          This tutorial teaches the basics of UI components interactions. It builds upon the Hello World example.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          Using Buttons

          - -

          The basic application code is the same as in the Hello World example.

          - -

          Button Styles

          -

          Basic Text Button

          - -

          To create a text-only button, use the following code.

          -
          Evas_Object* button;
          -
          -button = elm_button_add(box);
          -elm_object_text_set(button, "Click me");
          -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
          -elm_box_pack_end(box, button);
          -evas_object_show(button);
          -
          - -

          Basic Icon Button

          -

          Instead of a button with text, create a button with an icon.

          -
          Evas_Object* button2;
          -Evas_Object* icon2;
          -
          -button2 = elm_button_add(box);
          -icon2 = elm_icon_add(box);
          -elm_image_file_set(icon2, "icon.png", NULL);
          -elm_object_part_content_set(button2, "icon", icon2);
          -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
          -elm_box_pack_end(box, button);
          -evas_object_show(button);
          -
          - -

          Icon and Text Button

          -

          Create buttons with both an icon and a text label.

          -
          Evas_Object* button3;
          -Evas_Object* icon3;
          -button3 = elm_button_add(box);
          -icon3 = elm_icon_add(box);
          -elm_image_file_set(icon, "icon.png", NULL);
          -elm_object_part_content_set(button3, "icon", icon3);
          -elm_object_text_set(button3, "Press me");
          -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
          -elm_box_pack_end(box, button);
          -evas_object_show(button);
          -
          - -

          Disabled Button

          -

          To disable a button so that it is not in use, only shown.

          -
          elm_object_disabled_set(button2, EINA_TRUE);
          -
          - -

          Callbacks

          -

          The Elementary buttons respond to user interactions with several events.

          - -

          Click Event

          -

          The "click" event is the most basic and well-known one. The following code snippet changes the text of a button upon a click event: a press followed by an unpress.

          -
          -static void _button_click_cb(void *data, Evas_Object *button, void *ev) 
          -{
          -   elm_object_text_set(button, "Clicked!");
          -}
          -evas_object_smart_callback_add(button, "clicked", _button_click_cb, NULL);
          -
          - -

          Press/Unpress Events

          -

          The button can respond to the press and unpress events instead of the entire click event.

          -
          static void _button_press_cb(void *data, Evas_Object *button, void *ev) 
          -{
          -   elm_object_text_set(button, "Pressed!");
          -}
          -static void _button_unpress_cb(void *data, Evas_Object *button, void *ev) 
          -{
          -   elm_object_text_set(button, "Unpressed!");
          -}
          -
          -evas_object_smart_callback_add(button3, "pressed", _button_press_cb, NULL);
          -evas_object_smart_callback_add(button3, "unpressed", _button_unpress_cb, NULL);
          -
          - -

          Repeated Events

          -

          The button can receive several events in case it is being held by the user. Timings, such as the initial timeout and the repeat interval, can be set. In this example, the initial timeout is set to 1 second, and the repeat interval to half a second.

          -
          static void _button_repeat_cb(void *data, Evas_Object *button, void *ev) 
          -{
          -   static int count = 0;
          -   char buf[16];
          -
          -   snprintf(buf, sizeof(buf), "Repeat %d", count++);
          -
          -   elm_object_text_set(button, buf);
          -}
          -
          -elm_button_autorepeat_set(button3, EINA_TRUE);
          -elm_button_autorepeat_initial_timeout_set(button3, 1.0);
          -elm_button_autorepeat_gap_timeout_set(button3, 0.5);
          -evas_object_smart_callback_add(button3, "repeated", _button_repeat_cb, NULL);
          -
          - -

          Using Simple Text

          - -

          Basic Text

          -

          To create a label object, use the following code.

          -
          label = elm_label_add(ad->win);
          -elm_object_text_set(label, "My label");
          -evas_object_show(label);
          -
          - -

          Sliding Text

          -

          If your text is too long, set it to slide. The duration of the slide is set to five seconds in the following example. There are several styles available:

          -
            -
          • slide_short: The text stops at an edge, reverts to its initial position and slides again.
          • -
          • slide_long: The text is originally empty. It slides in, all the way to the edge, continues sliding until the label is empty, and loops.
          • -
          • slide_bounce: The text moves backwards after stopping at the edge. In the example, it is set to bounce.
          • -
          - -
          Evas_Object* label;
          -label = elm_label_add(->win);
          -elm_object_text_set(label, "This text is supposed to be really long.");
          -elm_label_slide_set(label, EINA_TRUE);
          -elm_label_slide_duration_set(label, 5.);
          -elm_object_style_set(label, "slide_bounce");
          -evas_object_show(label);
          -
          - -

          If needed, you can use the slide,end event to respond to the moment when the sliding text reaches its end.

          - -

          Marker Text

          -

          A marker is a text that is centered and bold by default. As the default color is white, set the blue color in this example.

          -
          elm_object_style_set(label, "marker");
          -evas_object_color_set(label, 0, 0, 255, 255);
          -
          - -

          Styling the Text

          -

          You can apply basic styles to the text. For a bolded text, do as follows.

          -
          elm_object_text_set(label, "<b>This text is bold.</b>");
          -
          - -

          Using Simple Lists

          - -

          Basic List

          -

          A list is a scrollable container, whose children are selected.

          -
          Evas_Object* list;
          -Evas_Object* icon;
          -list = elm_list_add(ad->win);
          -elm_list_item_append(list, "Text item", NULL, NULL, NULL, NULL);
          -icon = elm_icon_add(ad->win);
          -elm_icon_standard_set(icon, "chat");
          -elm_list_item_append(list, "Second item", icon, NULL, NULL, NULL);
          -Evas_Object* button;
          -button = elm_button_add();
          -elm_object_text_set(button, "Button");
          -elm_list_item_append(list, "Fourth item", NULL, button, NULL, NULL);
          -elm_list_go(list);
          -
          - -

          Any Evas Object can be added as an icon, either at the beginning (third parameter) or the end (fourth parameter).

          - -

          List Orientation

          -

          By default, a list is set vertically. This is how to display it horizontally.

          -
          elm_list_horizontal_set(list, EINA_TRUE);
          -
          - -

          List Mode

          -

          There are several modes for the list item dimensions.

          -
            -
          • ELM_LIST_COMPRESS: The list does not set any size measures to inform the container how to resize it. If the list is not created as a "resize object", its dimensions are zeroed. The list respects the container's geometry and if any of the list items do not fit into the container transverse axis, the list does not scroll in that direction.
          • -
          • ELM_LIST_SCROLL: This is the default value. This list is the same as ELM_LIST_COMPRESS, with the exception that if any of the list items do not fit into the container transverse axis, the list still scrolls in that direction.
          • -
          • ELM_LIST_LIMIT: This list sets a minimum size measure on the list object, so that containers may respect it (and resize themselves to fit the child properly). More specifically, a minimum size measure is set for its transverse axis, so that the largest item in that direction fits well. This feature is bound by the list object's maximum size measures that are set externally.
          • -
          • ELM_LIST_EXPAND: Besides setting a minimum size on the transverse axis, as in ELM_LIST_LIMIT, this list sets a minimum size on the longitudinal axis to reserve space for all its children to be visible at the same time. This feature is bound by the list object's maximum size measures that are set externally.
          • -
          -
          elm_list_mode_set(list, ELM_LIST_COMPRESS);
          -
          - -

          Scroller Policy

          -

          Several effects are shown on a list.

          -

          For example, the scroller is set to bounce at the end on either direction.

          -
          elm_scroller_bounce_set(list, EINA_TRUE, EINA_TRUE);
          -
          - - -

          This is how to control displaying scrollbars. The second argument is for the horizontal axis, the third one for the vertical axis.

          -
          elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_ON);
          -
          - -

          As for the bounce preference, the second argument is for the horizontal axis, the third one for the vertical axis.

          -
            -
          • ELM_SCROLLER_POLICY_OFF hides the scrollbar
          • -
          • ELM_SCROLLER_POLICY_ON shows the scrollbar
          • -
          • ELM_SCROLLER_POLICY_AUTO the scrollbar is shown only when needed and stays hidden at other times
          • -
          - -

          Events

          -

          A list responds to several events:

          -
            -
          • activated: The user clicks or presses an item.
          • -
          • selected: The user selects an item.
          • -
          • unselected: The user unselects an item.
          • -
          • longpressed: The user long-presses an item.
          • -
          • edge,top: The user scrolls the list to the top edge.
          • -
          • edge,bottom: The user scrolls the list to the bottom edge.
          • -
          • edge,left: The user scrolls the list to the left edge.
          • -
          • edge,right: The user scrolls the list to the right edge.
          • -
          • highlighted: An item is pressed and highlighted.
          • -
          • unhighlighted: The press and highlight is removed on an item.
          • -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/button_tutorial_wn.htm b/org.tizen.ui.guides/html/native/efl/button_tutorial_wn.htm deleted file mode 100755 index 09fbae2..0000000 --- a/org.tizen.ui.guides/html/native/efl/button_tutorial_wn.htm +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - Creating Wearable Buttons - - - - - - -
          -

          Creating Wearable Buttons

          - - -

          This tutorial teaches the basics of the button component interactions.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - - -

          Initializing the Button Application

          - -

          This use case creates an application with a window entitled "Button Basic Tutorial". The window consists of a box component, and a button is placed inside the box.

          - -

          To create a typical elementary application:

          -
          -static void
          -create_base_gui(appdata_s *ad) 
          -{
          -   // Window
          -   Evas_Object *btn1, *btn2, *btn3;
          -
          -   ad->win = elm_win_util_standard_add("main", "Button Basic Tutorial");
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          -
          -   ad->box = elm_box_add(ad->win);
          -   evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_show(ad->box);
          -   elm_win_resize_object_add(ad->win, ad->box);
          -
          -   create_button(ad->box);
          -
          -   // Show the window after the base GUI is set up
          -   evas_object_show(ad->win);
          -}
          -
          -static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          -
          -int
          -main(int argc, char **argv)
          -{
          -   struct app_data ad = {0,};
          -   ui_app_lifecycle_callback_s event_callback = {0,};
          -
          -   event_callback.create = app_create;
          -
          -   return ui_app_main(&argc, &argv, &event_callback, &ad);
          -}
          - - -

          Using Button Styles

          - -

          The basic application code is the same as in the Hello World example.

          - -

          To use various button styles:

          - -
          1. To create buttons using various styles:

            - -
            • Create a basic text-only button: - -
              Evas_Object* button;
              -
              -button = elm_button_add(box);
              -elm_object_text_set(button, "Click me");
              -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
              -elm_box_pack_end(box, button);
              -evas_object_show(button);
              -
            • - -
            • Create a basic icon button (no text, just an icon): -
              Evas_Object* button2;
              -Evas_Object* icon2;
              -
              -button2 = elm_button_add(box);
              -icon2 = elm_icon_add(box);
              -elm_image_file_set(icon2, "icon.png", NULL);
              -elm_object_content_set(button2, icon2);
              -evas_object_size_hint_weight_set(button2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              -evas_object_size_hint_align_set(button2, EVAS_HINT_FILL, 0.5);
              -elm_box_pack_end(box, button2);
              -evas_object_show(button2);
              -
            • - -
            • Create a button with both an icon and a text label: -
              Evas_Object* button3;
              -Evas_Object* icon3;
              -button3 = elm_button_add(box);
              -icon3 = elm_icon_add(box);
              -elm_image_file_set(icon3, "icon.png", NULL);
              -elm_object_content_set(button3, icon3);
              -elm_object_text_set(button3, "Press me");
              -evas_object_size_hint_weight_set(button3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              -evas_object_size_hint_align_set(button3, EVAS_HINT_FILL, 0.5);
              -elm_box_pack_end(box, button3);
              -evas_object_show(button3);
              -
            • -
          2. -
          3. To disable a button so that it is not in use, only shown:

            -
            elm_object_disabled_set(button2, EINA_TRUE);
            -
          - -

          Managing Button Events

          -

          The Elementary buttons respond to user interactions with several events.

          -

          To manage button events:

          - -
            -
          • Handle click events: -

            The "click" event is the most basic and well-known one. The following code snippet changes the text of a button upon a click event: a press followed by an unpress.

            -
            -static void _button_click_cb(void *data, Evas_Object *button, void *ev) 
            -{
            -   elm_object_text_set(button, "Clicked!");
            -}
            -evas_object_smart_callback_add(button, "clicked", _button_click_cb, NULL);
            -
          • - -
          • Handle press and unpress events: -

            The button can respond to the separate press and unpress events instead of the entire click event.

            -
            static void _button_press_cb(void *data, Evas_Object *button, void *ev) 
            -{
            -   elm_object_text_set(button, "Pressed!");
            -}
            -static void _button_unpress_cb(void *data, Evas_Object *button, void *ev) 
            -{
            -   elm_object_text_set(button, "Unpressed!");
            -}
            -
            -evas_object_smart_callback_add(button3, "pressed", _button_press_cb, NULL);
            -evas_object_smart_callback_add(button3, "unpressed", _button_unpress_cb, NULL);
            -
          • - -
          • Handle repeated events: -

            The button can receive several events in case it is being held by the user. Timings, such as the initial timeout and the repeat interval, can be set. In this example, the initial timeout is set to 1 second, and the repeat interval to half a second.

            -
            static void _button_repeat_cb(void *data, Evas_Object *button, void *ev) 
            -{
            -   static int count = 0;
            -   char buf[16];
            -
            -   snprintf(buf, sizeof(buf), "Repeat %d", count++);
            -
            -   elm_object_text_set(button, buf);
            -}
            -
            -elm_button_autorepeat_set(button3, EINA_TRUE);
            -elm_button_autorepeat_initial_timeout_set(button3, 1.0);
            -elm_button_autorepeat_gap_timeout_set(button3, 0.5);
            -evas_object_smart_callback_add(button3, "repeated", _button_repeat_cb, NULL);
            -
          - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/component_custom_n.htm b/org.tizen.ui.guides/html/native/efl/component_custom_n.htm deleted file mode 100755 index d3f8043..0000000 --- a/org.tizen.ui.guides/html/native/efl/component_custom_n.htm +++ /dev/null @@ -1,557 +0,0 @@ - - - - - - - - - - - - - Customizing Components - - - - - -
          - -

          Customizing Components

          - - -

          Elementary UI components use the Edje library EDC themes to manage their look.

          - -

          Elementary Theme

          - -

          An Elementary theme is an Edje EDC file that contains groups composed of parts and programs. For more information about Edje, see Theme.

          - -

          Using Theme Styles

          - -

          Elementary UI components provide a way to modify only some parts of the styles using the default theme. A style is a part of the EDC theme (a group) that concerns only one UI component. For example, you can create a new style for a button component to change its appearance without modifying the default theme.

          - - - - - - - - - - -
          Note
          When creating a new style, knowledge of how each UI component is themed is required, because setting another style always replaces the entire group used by the UI component. Important signals and parts must be there for the object to behave properly.
          - -

          When several styles are loaded in the current theme, you can set a different style to a specific UI component using the elm_object_style_set() function. It is also possible to see the current style with the elm_object_style_get() function.

          - -

          The default theme specifies several styles for the button component. The code below shows how to set the "anchor" style of a newly created button component.

          - -
          -Evas_Object *parent, *button;
          -
          -// Create a button object 
          -button = elm_button_add(parent);
          -
          -// Set its style to "anchor""
          -elm_object_style_set(button, "anchor");
          -
          - -

          Loading Theme Styles

          - -

          Once written and compiled with Edje tools, the Elementary provides two methods to load the style in the application theme:

          -
            -
          • overlays
          • -
          • extensions
          • -
          - -

          When looking for a theme, the Elementary checks the list of overlays, if any are defined. Then it takes the default theme, and if it cannot find a theme for the UI component, it looks at the extensions list.

          - -

          Overlay

          - -

          An overlay can replace the look of all UI components by overriding the default style. If we create a new style called "default" for the button component and add it as an overlay, the Elementary uses the overlay for all button components overriding the default theme.

          - -

          Here is how to add an overlay to your application's theme.

          - -
          -elm_theme_overlay_add(NULL, "./theme_button.edj");
          -
          - - - - - - - - - - -
          Note
          Here we assume that the "theme_button.edj" file only contains a new theme for the button component.
          - - - - - - - - - - -
          Note
          Doing this is not recommended. Adding a file as an overlay makes the Elementary use the new theme for all the button components defined in the application. You must make sure that the "theme_button.edj" file reimplements everything that was previously defined in the default theme concerning the button component.
          - -

          This is how to remove the previously added overlay to return to the default theme.

          - -
          -elm_theme_overlay_del(NULL, "./theme_button.edj");
          -
          - -

          Extension

          - -

          With extensions, we can write styles that we can apply to some UI components (not all of them) by using the elm_object_style_set() function.

          - -

          The application adds a theme to the list of extensions with the following call.

          - -
          -elm_theme_extension_add(NULL, "./theme_button_style_custom.edj");
          -
          - - - - - - - - - - -
          Note
          Here we assume that the "theme_button_style_custom.edj" file contains a new button style called "custom".
          - -

          This is how to use the new "custom" style on a button component.

          - -
          -Evas_Object *parent, *button;
          -
          -// Create a button object 
          -button = elm_button_add(parent);
          -
          -// Set its style to "custom" 
          -elm_object_style_set(button, "custom");
          -
          - - - - - - - - - - -
          Note
          When using elm_theme_extension_add or elm_theme_overlay_add to add a new theme extension or overlay to a Theme object (here called the default theme), the Elementary calls the elm_theme_flush function to flush Elementary theme caches. Thus, the theme of all UI components that use the default theme is reloaded.
          - -

          Creating a New Theme

          - -

          This is how to create a new theme object.

          - -
          -Elm_Theme *new_theme = elm_theme_new();
          -
          - -

          This function creates an empty specific theme that only uses the default theme. It has its own private set of extensions and overlays (which are empty by default). Specific themes do not fall back to the themes of parent objects. They are not intended for this use.

          - -

          This is how to apply this theme to a UI component and its children (a button, for example).

          - -
          -// Create a button component 
          -Evas_Object *button = elm_button_add();
          -
          -// Set the new theme to the button component 
          -elm_object_theme_set(button, new_theme);
          -
          - -

          Customizing a UI Component Style

          - -

          UI component themes are written in Edje EDC source files (.edc). These files are compiled with Edje tools to make an .edj file that is used by the application. For more information on using the EDC language, see Theme.

          - -

          A new Edje style can be added for a UI component. The best way is to copy the existing "default" style, rename it, and update it to your needs.

          - -

          Creating a Customized Style for the Check Component

          - -

          As an example, we show how to create a new style for the check component. The aim is to update the background and the main pictures of this UI component with custom pictures.

          - -

          The EDC source file concerning the check component (check.edc file) is composed of several groups.

          - -
          -group 
          -{
          -   name: "elm/check/base/default";
          -}
          -
          -group 
          -{
          -   name: "elm/check/base/toggle";
          -}
          -
          - -

          Those two groups define two different styles for the check component (the "default" style and the "toggle" style).

          - -

          We copy the group corresponding to the "default" style in a new file to create a new style called "custom". This new style is saved in the "check_custom.edc" file.

          - -
          -group 
          -{
          -   name: "elm/check/base/custom";
          -   // Here is the copy of the content of "default" style 
          -}
          -
          - -

          In the new group ("elm/check/base/custom"), we have to find the parts we want to modify. Here, the appropriate parts are "bg" and "check" parts.

          - -
          -part 
          -{
          -   name: "bg";
          -   mouse_events: 0;
          -   scale: 1;
          -   description 
          -   {
          -      state: "default" 0.0;
          -      rel1.offset: 1 1;
          -      rel2.relative: 0.0 1.0;
          -      rel2.offset: 1 -2;
          -      align: 0.0 0.5;
          -      min: 16 16;
          -      max: 16 16;
          -      aspect: 1.0 1.0;
          -      aspect_preference: VERTICAL;
          -      image 
          -      {
          -         normal: "check_base.png";
          -         border: 5 5 5 5;
          -         middle: 0;
          -      }
          -      fill.smooth: 0;
          -   }
          -}
          -part 
          -{
          -   name: "check";
          -   mouse_events: 0;
          -   scale: 1;
          -   description 
          -   { 
          -      state: "default" 0.0;
          -      rel1 
          -      {
          -         to: "bg";
          -         offset: 1 1;
          -      }
          -      rel2 
          -      {
          -         to: "bg";
          -         offset: -2 -2;
          -      }
          -      visible: 0;
          -      color: 255 255 255 255;
          -      image.normal: "check.png";
          -   }
          -   description 
          -   {
          -      state: "visible" 0.0;
          -      inherit: "default" 0.0;
          -      visible: 1;
          -   }
          -   description 
          -   {
          -      state: "disabled" 0.0;
          -      inherit: "default" 0.0;
          -      visible: 0;
          -      color: 128 128 128 128;
          -   }
          -   description 
          -   {
          -      state: "disabled_visible" 0.0;
          -      inherit: "default" 0.0;
          -      color: 128 128 128 128;
          -      visible: 1;
          -   }
          -}
          -
          - -

          We do not detail all the options that can be modified here, but assume that the user is familiar with Edje and knows Edje basics.

          - -

          Our custom pictures filenames are:

          -
            -
          • check_base_custom.png for the bg part
          • -
          • check_custom.png for the check part
          - -

          We must update the image.normal attribute in both parts with our custom pictures filenames to modify the pictures of this style.

          - -
          -part 
          -{
          -   name: "bg";   
          -   description 
          -   {
          -      state: "default" 0.0;
          -
          -      image 
          -      {
          -         normal: "check_base_custom.png";
          -         border: 5 5 5 5;
          -         middle: 0;
          -      }
          -                
          -   }
          -}
          -part 
          -{
          -   name: "check";
          -        
          -   description 
          -   {
          -      state: "default" 0.0;
          -            
          -      image.normal: "check_custom.png";
          -   }
          -        
          -}
          -
          - - - - - - - - - - -
          Note
          Here, we assume that the custom images are the same size as the "default" images.
          - -

          Adding the Theme File to Your Project

          - -

          Once written, the check_custom.edc file is put in the /res/edje/. directory of the application project in the SDK.

          - -

          When building the application, the SDK calls the Edje tools automatically to build the final check_custom.edj file. This file can be loaded from our application.

          - -

          Using the New Style

          - -

          This is how to add the new theme file as an extension in the application.

          - -
          -char edj_path[PATH_MAX] = {0, };
          -
          -// Get the full path of the edj file 
          -app_get_resource("/edje/check_custom.edj", edj_path, (int)PATH_MAX);
          -
          -// Load check custom style as an extension 
          -elm_theme_extension_add(NULL, edj_path);
          -
          - -

          Use the "custom" style on a new check component.

          - -
          -Evas_Object *parent, *check;
          -
          -// Create a check object 
          -check = elm_check_add(parent);
          -
          -// Set its style to "custom" 
          -elm_object_style_set(check, "custom");
          -
          - -

          Special Theme Parts

          - -

          Some parts of the EDC file can be interacted with the Elementary. The content of parts of the type TEXT are modified using the elm_object_part_set_text() function. The content of SWALLOW parts is updated using the elm_object_part_content_set() function.

          - -

          Swallow Parts

          - -

          In the previous example (the check component "default" style), there is a part called "elm.swallow.content" that is of the type SWALLOW.

          - -
          -part 
          -{
          -   name: "elm.swallow.content";
          -   type: SWALLOW;
          -   scale: 1;
          -   description 
          -   {
          -      state: "default" 0.0;
          -      fixed: 1 0;
          -      visible: 0;
          -      align: 0.0 0.5;
          -      rel1.to_x: "bg";
          -      rel1.relative: 1.0 0.0;
          -      rel1.offset: 1 1;
          -      rel2.to_x: "bg";
          -      rel2.offset: 1 -2;
          -      rel2.relative: 1.0 1.0;
          -   }
          -   description
          -   {
          -      state: "visible" 0.0;
          -      inherit: "default" 0.0;
          -      fixed: 1 0;
          -      visible: 1;
          -      aspect: 1.0 1.0;
          -      min: 16 16;
          -   }
          -   description 
          -   {
          -      state: "disabled" 0.0;
          -      inherit: "default" 0.0;
          -      color: 255 255 255 128;
          -   }
          -   description 
          -   {
          -      state: "disabled_visible" 0.0;
          -      inherit: "default" 0.0;
          -      color: 255 255 255 128;
          -      fixed: 1 0;
          -      visible: 1;
          -      aspect: 1.0 1.0;
          -   }
          -}
          -
          - -

          We can push content (Evas_Object) to this part from the application anytime. The size and position of the content pushed is controlled by the EDC theme.

          - -
          -Evas_Object *parent, *check1, *content;
          -
          -// Create a check object 
          -check1 = elm_check_add(parent);
          -
          -// Set the content of the check object 
          -elm_object_part_content_set(check1, "elm.swallow.content", content);
          -
          - - - - - - - - - - -
          Note
          We can add new SWALLOW parts when customizing a UI component's style, if we want to be able to control more content from the application. Note that removing existing SWALLOW parts changes the UI component's behavior.
          - -

          Text Parts

          - -

          The same is done with parts of the type TEXT. The check "default" style contains a part named "elm.text".

          - -
          -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: 1 1;
          -      rel2.relative: 1.0 1.0;
          -      rel2.offset: -2 -2;
          -      color: 0 0 0 255;
          -      text 
          -      {
          -         font: "Sans,Edje-Vera";
          -         size: 10;
          -         min: 0 1;
          -         align: -1.0 0.5;
          -      }
          -   }
          -   description
          -   {
          -      state: "visible" 0.0;
          -      inherit: "default" 0.0;
          -      visible: 1;
          -      text.min: 1 1;
          -   }
          -   description 
          -   {
          -      state: "disabled" 0.0;
          -      inherit: "default" 0.0;
          -      color: 0 0 0 128;
          -      color3: 0 0 0 0;
          -   }
          -   description
          -   {
          -      state: "disabled_visible" 0.0;
          -      inherit: "default" 0.0;
          -      color: 0 0 0 128;
          -      color3: 0 0 0 0;
          -      visible: 1;
          -      text.min: 1 1;
          -   }
          -}
          -
          - -

          This is how to modify the content of the "elm.text" part from the application. The position of the text, its size, color, look and feel are managed by the EDC theme.

          - -
          -Evas_Object *parent, *check2;
          -
          -// Create a check object 
          -check2 = elm_check_add(parent);
          -
          -// Set the text of the check object 
          -elm_object_part_text_set(check2, "elm.text", "Test text");
          -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/component_focus_n.htm b/org.tizen.ui.guides/html/native/efl/component_focus_n.htm deleted file mode 100755 index ee8ae76..0000000 --- a/org.tizen.ui.guides/html/native/efl/component_focus_n.htm +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - Managing Component Focus - - - - - -
          - -

          Managing Component Focus

          - - -

          Focus is a graphical user interface concept. A component, for example, a UI component, has a focus when it is selected to receive input from the user. The input can be an event, such as mouse button click or key press. A UI component application has, at all times, one (and only one) focused object. This is what determines where the input event goes to within the application window. Also, focused objects can be decorated differently, in order to signal to the user where the input is at any given moment.

          - -

          Focusing can be immediate (selected by the touchscreen or mouse) or relative (selected by a key press). There are mainly 2 ways to set focus on a graphical elements:

          - -
            -
          • Direct selection: this is done by clicking on the element. -

            Direct selection does not really need any kind of special treatment as the user explicitly selects the UI component to interact with.

          • -
          • Relative selection: this is done by moving the selection from a UI component to another, such as going to the previous or next one; this is done with a keyboard. -

            Relative selection' default order is the one in which the UI components have been added to the canvas. That may not be appropriate, if they are added programmatically in a different order than they appear on-screen.

          • -
          - - -

          Moving Focus

          - -

          Concept of Focus Chain

          -

          The order the focus goes from a UI component to another is called the focus chain. As said before, the default focus chain is set to the order the UI components have been added to the canvas.

          - -

          Focusable Objects

          -

          An object can be focused if the following conditions apply:

          - -
            -
          • object is visible
          • -
          • object is enabled
          • -
          • object accepts focus
          • -
          • object's subtree (if any) is focusable
          • -
          • all of object's parents have their subtrees focusable
          • -
          - -

          If any of these conditions do not apply, the object is unfocusable.

          - -

          Handling Key Input

          - -

          Handling of the keys is done automatically by Elementary. According to which key the user pressed, Elementary switches the focus in the selected direction. For example, using the Tab key the focus goes to the next object in the natural order, whereas using the direction keys the focus goes to the next object in the requested direction.

          - -

          Hiding, Deleting or Disabling a Focused Object

          - -

          When a UI component is hidden, deleted, or disabled, it becomes unfocusable.

          - -

          When a focused object is unfocusable, the focus is moved to another object.

          - -

          Selecting Next Object

          - -

          When the user wants to switch the focus to the next object (i.e. cycle focus), Elementary searches the first object which is focusable.

          - -

          If there is a disabled or read-only object in the focus chain, the focus goes to the following object in the requested direction.

          - -

          Customizing Focus

          - -

          There are several reasons why to customize the focus chain of an application, for example:

          - -
            -
          • If you have created a form with labels and text entries next to them, the focus moves to the entry field when the user clicks on the associated label.
          • -
          • If you have created an interface with several columns (table), set the focus chain as you wish, for example, going horizontally instead of going vertically, regardless whatever the order the UI components are added.
          • -
          - -

          Customizing Object's Focus Exit Chain

          - -

          Set the object to focus after other object in a specific direction using elm_object_focus_next_object_set(object, next, direction). Use the following directions:

          - -
            -
          • ELM_FOCUS_NEXT: next UI component in natural order
          • -
          • ELM_FOCUS_PREVIOUS: previous UI component in natural order
          • -
          • ELM_FOCUS_UP: UI component to focus when going up
          • -
          • ELM_FOCUS_DOWN: UI component to focus when going down
          • -
          • ELM_FOCUS_RIGHT: UI component to focus when going right
          • -
          • ELM_FOCUS_LEFT: UI component to focus when going left
          • -
          - -

          Set the object next to another in a specific direction using elm_object_focus_next_object_get(object, direction).

          - -

          Customizing Whole Application's Focus Chain

          - -

          To customize the application's custom chain:

          - -
          -Evas_Object *main, obj1, obj2, obj3, obj4, obj5;
          -
          -Eina_List *focus_chain = NULL;
          -focus_chain = eina_list_append(focus_chain, obj3);
          -focus_chain = eina_list_append(focus_chain, obj2);
          -// The chain is obj3, then obj2. Set the chain.
          -elm_object_focus_custom_chain_set(main, focus_chain);
          -// Prepend obj5 at the beginning of the chain
          -elm_object_focus_chain_prepend(main, NULL, obj5);
          -// Append obj1 after obj3
          -elm_object_focus_chain_append(main, obj3, obj1);
          -// Prepend obj4 before obj1
          -elm_object_focus_chain_prepend(main, obj1, obj4);
          -
          - -

          The focus chain is obj5, obj3, obj4, obj1, obj2.

          - -

          This actually applies to any container: it is possible to set the focus chain of, for example, a box.

          - -

          Customizing Collision of Both

          - -

          If an object is part of a focus chain and has the next focused object defined, the next object takes precedence over the focus chain.

          - -

          Following on the previous example, if obj4 has obj5 defined as its next object, the actual focus chain is obj5, obj3, obj4, and loop back to obj5.

          - -

          Focus on UI Component

          - -

          If your Evas object has several sub-objects, set its focus chain using the same functions as for the application. Elementary first follows the main focus chain, and then the focus chain of each UI component if applicable.

          - -

          Use elm_object_focus_get(object) to set whether a specific object has the focus. Set the focus to an object using elm_object_focus_set(object, set), where set is a Boolean value. If it is set to EINA_TRUE, the focus is set to that given object. If it is set to EINA_False, the focus is unset and passed back to the previous element in the focus chain. Set the focus only after the object is shown, that is, after evas_object_show(object) has been called. Call the function back when the object receives or loses focus by registering on smart event "focused" or "unfocused"

          - -

          Use elm_object_tree_focus_allow_set(object, focusable) to tell Elementary whether an object and its children are focusable, where focusable is a Boolean value. Get the current value using elm_object_tree_focus_allow_get(object).

          - -

          The similar functions for a specific object are elm_object_focus_allow_set(object, focusable) and elm_object_focus_allow_get(object).

          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/component_infra_n.htm b/org.tizen.ui.guides/html/native/efl/component_infra_n.htm deleted file mode 100755 index 0c9a0ff..0000000 --- a/org.tizen.ui.guides/html/native/efl/component_infra_n.htm +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - UI Component Infrastructure Modules: Managing Component Properties - - - - - -
          - -

          UI Component Infrastructure Modules: Managing Component Properties

          - -

          The Elementary library is composed of many UI components to support Tizen native applications. While using UI components, you must manage their common properties. To meet this requirement, Elementary creates some infrastructure modules in order to support many UI components. Currently, Elementary provides following infrastructure modules:

          -
          • Component focus -

            A UI component application always has 1 focused object, which is selected to receive input from the user. The focus can change between objects, and the focused object can be decorated on the screen to make it easily visible.

          • -
          • Handling touch gestures for components -

            UI components generally handle basic touch inputs, such as press, release and moving. However, in some use cases (for example, when the accessibility Assistive Technology (AT) client is working), handling for a variety of touch gesture events (such as tap, double-tap, triple-tap, double-tap and hold, and left/right/up/down swipe) is needed. Elementary can also create new touch gesture patterns according to application use cases.

            -
          • -
          • Customizing components -

            Elementary provides basic UI components based on the Tizen UX styles which you can use. Usually, you can use the supported UI components themselves to make your application. However, if you need to use other styles than the basic ones, you must customize the UI component style.

          • -
          • UI mirroring -

            Elementary provides UI mirroring, which allows you to set UI mirroring on specific UI components or the whole interface. This facility is very useful to support applications which need both right-to-left and left-to-right languages.

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/containers_n.htm b/org.tizen.ui.guides/html/native/efl/containers_n.htm deleted file mode 100755 index f9ad56d..0000000 --- a/org.tizen.ui.guides/html/native/efl/containers_n.htm +++ /dev/null @@ -1,608 +0,0 @@ - - - - - - - - - - - - - - Using Container UI Components - - - - - - -
          -

          Using Container UI Components

          - -

          Box

          - - -

          Figure: Box container

          -

          Box container

          - - -

          Most of the time, you want to display UI components on the screen in a specific order. In a form container, for example, the user information is arranged vertically. This basic container is called a box. There is no theme for a box layout. It is just a linear method of arranging UI components horizontally or vertically.

          -

          Creating a Box

          -

          To create a new horizontal box:

          -
          Evas_Object *vbox;
          -
          -vbox = elm_box_add(parent);
          -
          -

          By default, the elm_box_add() function creates a vertical box. If you want to create a horizontal box, use the elm_box_horizontal_set() function:

          -
          Evas_Object *hbox;
          -
          -hbox = elm_box_add(parent);
          -elm_box_horizontal_set(hbox, EINA_TRUE);
          -
          - - - - - - - - - - -
          Note
          A box is a non-graphical object. It adds no graphics to or around the objects it holds.
          - -

          Adding Objects to the Box

          -

          You can add any Evas object to the box. Here, we create 5 button components and add them to a box:

          -
          int i;
          -Evas_Object *bt;
          -Evas_Object *vbox;
          -
          -vbox = elm_box_add(parent);
          -
          -for (i = 0; i < 5; i++)
          -{
          -   char tmp[16];
          -   snprintf(tmp, sizeof(tmp), "Button %d", i);
          -   bt = elm_button_add(vbox);
          -   elm_object_text_set(bt, tmp);
          -   elm_box_pack_end(vbox, bt);
          -   evas_object_show(bt);
          -}
          -evas_object_show(vbox);
          -
          -

          The most important function in the above code is elm_box_pack_end(), which is used to add the button component to the end of the box.

          - -

          Setting the Padding

          -

          You can set the padding between the objects in a box by using the elm_box_padding_set() function. The padding values are the number of pixels horizontally and vertically.

          -
          elm_box_padding_set(vbox, 16, 64);
          -
          - -

          Handling Element Size

          -

          You can add different-size elements to a container. For example, to add an image with a size of 128x128 pixels as the first element in a box, use the elm_box_pack_start() function:

          -
          ic = elm_icon_add(vbox);
          -elm_image_file_set(ic, "./c1.png", NULL);
          -evas_object_size_hint_min_set(ic, 128, 128);
          -evas_object_show(ic);
          -elm_box_pack_start(vbox, ic);
          -
          -

          We ask Evas to set the size hint for the icon object by using the elm_object_size_hint_min_set() function. Evas will try to set the minimum size of this object accordingly.

          -

          If you want to create a homogeneous box, where all objects have the same height or width, depending on the orientation of the box, use the elm_box_homogeneous_set() function:

          -
          elm_box_homogeneous_set(vbox, EINA_TRUE);
          -
          -

          Elementary will set the height of the tallest object as the height of all objects, or the width of the widest element as the width of all objects.

          -

          Setting the Alignment

          -

          You can set the alignment of UI components inside a box using the elm_box_align_set() function. The function takes two doubles values, a horizontal value and a vertical value, representing the percentage between 0 and 1.0 of the alignment in the horizontal and vertical axes. When you add a UI component with the elm_box_pack_end() or elm_box_pack_start() function, Elementary computes the global size of the box. If the global size is bigger than the size of the box's parent, the box will take up all the space occupied by the parent, and the size of the parent may be extended to hold the box. If the global size is smaller than the parent's size, the alignment values will set the position of the box inside the parent.

          - -

          Figure: Alignment

          -

          Alignment

          - -

          Here, we set an alignment of 0.8 vertically:

          -
          elm_box_align_set(vbox, 0.0, 0.8);
          -
          - - - - - - - - - - -
          Note
          The alignment only takes effect in the opposite direction than the one defined with the elm_box_horizontal_set() function.
          - - -

          The elm_box_layout_transition() function provides the ability to animate the motion of the objects in a box when switching from one layout to another.

          -

          Using Size Hints

          -

          Size hints are a set of functions that can be used on any Evas object. You request Evas to take care of various properties, and Evas will honor these requests if it can. This is why they are called "hints". The size hint functions are:

          -
            -
          • evas_object_size_hint_min_set()
          • -
          • evas_object_size_hint_max_set()
          • -
          • evas_object_size_hint_aspect_set()
          • -
          • evas_object_size_hint_align_set()
          • -
          • evas_object_size_hint_weight_set()
          • -
          -

          You can also use the respective get functions to get the current hint values.

          -

          In case of the evas_object_size_hint_min_set() function, you ask Evas to respect the minimum size you define for the object. For example, to set the minimum size of an icon to 64x46 pixels:

          -
          evas_object_size_hint_min_set(ic, 64, 64);
          -
          -

          You can also set a maximum size for the same icon:

          -
          evas_object_size_hint_max_set(ic, 128, 128);
          -
          -

          When you resize the parent of the icon, if there are no constraints to the parent, the minimum size of the parent will be the minimum hint size of the icon. If you increase the parent size, the icon will grow larger until its maximum hint size is reached. After this point, the icon will not grow any larger and there will be empty space around the icon within the parent.

          -

          When the aspect size hint is set, Evas tries to fix the dimensional proportions of the object. Here, the proportion of the icon is respected, and the width will be the same as the height:

          -
          evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
          -
          -

          Here, the width will be twice the height:

          -
          evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 2, 1);
          -
          -

          If we want to change the alignment of the icon relative to the parent, we can use the evas_object_size_hint_align() function. By default, the icon is centered, so it is aligned with a value of 0.5. You can change the alignment as follows:

          -
          evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -
          -

          In the above case, the icon is aligned to the bottom left corner of the parent.

          -

          We can also play with the size of the icon inside its container by using the weight size hint. By default, the weight is not set, so the size of the icon will be the minimum size. But if you set this value to 1, the icon will be expand as much as it can inside the container:

          -
          evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -
          -

          You can also use the alignment and weight hints together. Here, we want the icon to take up all the space in its parent:

          -
          evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -
          - - -

          Conformant

          - -

          Figure: Conformant container

          -

          Conformant container

          - -

          A conformant is a container UI component that accounts for the space taken by the indicator, virtual keyboard, and softkey windows. The content area of the conformant is resized and positioned based on the space available. When the virtual keyboard is displayed, the content area is not resized.

          - -

          Creating a Conformant

          -

          To create a conformant, use the elm_conformant_add() function:

          -
          -Evas_Object *conformant;
          -
          -conformant = elm_conformant_add(parent);
          -
          - -

          Adding Content to the Conformant

          -

          To add content to the conformant, use the elm_object_content_set() function:

          -
          elm_object_content_set(conformant, main_view);
          -
          - -

          Signals

          -

          To receive notifications about the state of the virtual keyboard and clipboard, listen to the following Evas signals:

          -
            -
          • "virtualkeypad,state,on": The virtual keyboard has been switched on.
          • -
          • "virtualkeypad,state,off": The virtual keyboard has been switched off.
          • -
          • "virtualkeypad,size,changed": The virtual keyboard size has changed.
          • -
          • "clipboard,state,on": The clipboard has been switched on.
          • -
          • "clipboard,state,off": The clipboard has been switched off.
          • -
          - - -

          Grid

          - -

          In a grid, objects are placed at specific positions along a fixed grid, where the position of each object is given as a percentage of the full width and height of the grid. By default, the size of the grid is 100 x 100 pixels.

          - -

          Creating a Grid

          -

          To create a grid, use the elm_grid_add() function:

          -
          Evas_Object *grid;
          -
          -grid = elm_grid_add(parent);
          -

          Adding Items to the Grid

          -

          To add an item to the grid, use the elm_grid_pack_set() function. Provide the X and Y coordinates, and the width and height in the grid as parameters. The following code adds 12 icons in a circle formation:

          -
          for (i = 0; i < 12; i++)
          -{
          -   ic = elm_icon_add(grid);
          -   elm_image_file_set(ic, "c1.png", NULL);
          -   evas_object_size_hint_min_set(ic, 128, 128);
          -   evas_object_show(ic);
          -   x = 40 * cos(2.0 * M_PI / 12 * i);
          -   y = 40 * sin(2.0 * M_PI / 12 * i);
          -   elm_grid_pack(grid, ic,  40 + x,  40 + y,  20 , 20);
          -}
          -evas_object_show(grid);
          -
          - -

          Changing Position and Size

          -

          To change the position of an item in the grid, use the elm_grid_pack_set() function. The first parameter is the item you want to move, and the following parameters are the same as for the elm_grid_pack() function.

          -

          To change the size of the grid, use the elm_grid_size_set() function. You can set the new width and height for the grid. The position and size of the items in the grid are changed accordingly.

          -

          Clearing the Grid

          -

          To clear the grid, use the elm_grid_clear() function. All items are removed from the grid. If you set the clear parameter, all the items are also deleted, with the evas_object_del() function called on each item.

          - - -

          Layout

          - -

          A layout is a container that takes a standard Edje design file and wraps it very thinly in a UI component. Layouts are the basis of a lot of graphics components used in Elementary.

          - -

          An Edje design file describes how the elements of the UI are positioned and how they behave when interacted with. For more information about Edje, see Themes.

          - -

          Creating a Layout

          - -

          To create a new layout, use the elm_layout_add() function:

          -
          Evas_Object *layout;
          -
          -layout = elm_layout_add(parent);
          -
          -

          In Tizen, the layout component is extended to support different kinds of layouts. Rather than define layouts yourself, you can use the following predefined default layouts:

          -
            -
          • application/default: This layout can be used to display content inside a window.
          • -
          • drawer/panel: This layout can be used to create a 2-panel view.
          • -
          • nocontents/default: This layout can be used when there is no content to display, such as in a contact or email.
          • -
          -

          To use the application/default layout:

          -
          Evas_Object *ly;
          -
          -ly = elm_layout_add(parent);
          -elm_layout_theme_set(ly, "layout", "application", "default");
          -
          - -

          Adding Objects to the Layout

          -

          To add an Evas object to the layout:

          -
          elm_object_part_content_set(ly, "elm.swallow.content" view);
          -
          -

          elm.swallow.content is the swallow part of the application layout, and with this call you integrate the view inside the swallow object of the layout.

          -

          The drawer/panel layout can display 2 different views, the background and the main content:

          -
          Evas_Object *ly;
          -
          -ly = elm_layout_add(parent);
          -elm_layout_theme_set(ly, "layout", "drawer", "panel");
          -
          -

          To swallow an object inside the main content and background views:

          -
          elm_object_part_content_set(ly, "elm.swallow.content", main_view);
          -elm_object_part_content_set(ly, "elm.swallow.background", background);
          -
          -

          The nocontents/default layout is a special layout in that it does not contain any swallows. You can only set the text part. There are two different texts zones: elm.text and elm.help.text. To change the text:

          -
          elm_object_part_text_set(ly, "elm.text", "Hi All :)");
          -elm_object_part_text_set(ly, "elm.help.text", "Hi All :)");
          -
          -

          Using Layout Themes

          -

          The layout component supports the following predefined default themes:

          -
            -
          • toolbar-content: For applications with a toolbar and main content area.
          • -
          • toolbar-content-back: For applications with a toolbar, main content area (with a back button), and title area.
          • -
          • toolbar-content-back-next: For applications with a toolbar, main content area (with back and next buttons), and title area.
          • -
          • content-back: For applications with main content (with a back button) and title areas.
          • -
          • content-back-next: For applications with main content (with back and next buttons) and title areas.
          • -
          • toolbar-vbox: For applications with a toolbar and main content area as a vertical box.
          • -
          • toolbar-table: For applications with a toolbar and main content area as a table.
          • -
          -

          To set a theme to the layout, use the elm_layout_theme_set() function.

          - - -

          Mapbuf

          - -

          Figure: Mapbuf hierarchy

          -

          Mapbuf hierarchy

          - -

          A mapbuf component is a container UI component that uses an Evas map to hold a content object. This component is used to improve the moving and resizing performance of complex UI components.

          - -

          The content object is treated as a single image by the Evas map. If you have a content object containing several child objects, frequently moving the mapbuf component will be faster than frequently moving the content object.

          - -

          The mapbuf component inherits all the functions of the container class.

          - -

          Creating a Mapbuf

          -

          To create a mapbuf component, use the elm_mapbuf_add() function:

          -
          Evas_Object *mapbuf, *parent, *content;
          -
          -// Creating a mapbuf
          -mapbuf = elm_mapbuf_add(parent);
          -
          -

          Adding Content to the Mapbuf

          -

          To add content to the mapbuf component, use the elm_object_content_set() function with the "default" part:

          -
          elm_object_content_set(mapbuf, content);
          - - - - - - - - - - -
          Note
          Calling elm_object_content_set(mapbuf, content) is equivalent to calling elm_object_part_content_set(mapbuf, "default", content).
          - - -

          To activate smooth map rendering and alpha rendering for the mapbuf component:

          -
          elm_mapbuf_smooth_set(mapbuf, EINA_TRUE);
          -elm_mapbuf_alpha_set(mapbuf, EINA_TRUE);
          -
          - -

          Activating the Mapbuf

          -

          Finally, to use the mapbuf component, you must activate it:

          -
          elm_mapbuf_enabled_set (mapbuf, EINA_TRUE);
          - -

          Signals

          -

          The mapbuf component does not emit any signals and therefore does not provide any callbacks that you can register.

          - - - - -

          A naviframe component consists of a stack of views. New views are pushed on top of previous ones, and only the top-most view on the stack is displayed. The previous views are not deleted. A previous view is displayed when the view on top of it is popped. Transitions can be animated on a push or a pop, depending on the theme applied to the UI component.

          - -

          Creating a Naviframe

          -

          To create a naviframe, use the elm_naviframe_add() function:

          -
          Evas_Object *nav;
          -
          -nav = elm_naviframe_add(parent);
          -
          -

          Adding and Deleting Views

          -

          The naviframe is a stack of views. A new view is always pushed to the top of the stack. The top-most view is deleted by popping it.

          -

          To add a new view to the naviframe:

          -
          Elm_Object_Item *nav_it;
          -
          -nav_it = elm_naviframe_item_push(nav, NULL, NULL, NULL, view, NULL);
          -// In Tizen 2.3, the back button is not supported in the naviframe 
          -
          -

          When you push a new view to the stack, you receive an Elm_Object_Item for the view. You can use this item to modify the view.

          -

          To pop and delete the top-most view:

          -
          elm_naviframe_item_pop(nav);
          -
          - -

          Adding Fixed Content

          -

          The naviframe can also display fixed content on top of the current (top-most) view. Use the elm_object_item_part_content_set() function to set this content. Use the following part names to specify the location of the content:

          -
            -
          • "default": The main content area of the current view.
          • -
          • "icon": An icon in the title area of the current view.
          • -
          • "title_left_btn": A button on the left side of the naviframe.
          • -
          • "title_right_btn": A button on the right side of the naviframe.
          • -
          -

          For example, to add a button to the naviframe:

          -
          btn = elm_button_add(nav);
          -elm_object_style_set(btn, "naviframe/title_cancel");
          -elm_object_item_part_content_set(nav_it, "title_left_btn", btn);
          -
          -

          To set the title labels of the naviframe, use the elm_object_item_part_text_set() function and specify one of the following label locations:

          -
            -
          • "default": Sets the title label in the title area of the current view.
          • -
          • "subtitle": Sets the subtitle label in the title area of the current view.
          • -
          -

          Signals

          -

          The naviframe emits the following signals:

          -
            -
          • "transition,finished": The transition has finished changing the view.
          • -
          • "title,transition,finished": The title area transition has finished changing the state of the title.
          • -
          • "title,clicked": The user has clicked the title area.
          • -
          - - - -

          Panes in Mobile Applications

          - -

          Figure: Panes component

          -

          Panes component

          - -

          A panes component adds a draggable bar between two sections of content. The sections are resized when the bar is dragged.

          - -

          Creating Panes

          -

          To create a panes component, use the elm_panes_add() function:

          -
          Evas_Object *panes;
          -
          -panes = elm_panes_add(parent);
          -
          - -

          Adding Content to the Panes

          -

          To add content to the panes, use the elm_object_part_content_set() function. The following code adds an object to the left pane:

          -
          elm_object_part_content_set(panes, "left", obj);
          -
          - -

          Setting Panes Options

          -

          To set the orientation of the panes, use the elm_panes_horizontal_set() function.

          - -

          To set the size of the panes, use the elm_panes_content_left_size_set() and elm_panes_content_right_size_set() functions.

          - -

          Signals

          -

          The panes component emits the following signals:

          -
            -
          • "press": The panes component has been pressed (but the press has not been released yet).
          • -
          • "unpress": The press has been released.
          • -
          • "clicked": The panes component has been clicked.
          • -
          • "clicked,double": The panes component has been double-clicked.
          • -
          - - -

          Scroller

          - -

          A scroller holds (and clips) a single object and allows you to scroll across it. This means that the user can use a scroll bar or their finger to drag the viewable region across the object, moving through a much larger area than is contained in the viewport. The scroller will always have a default minimum size that is not limited by its contents.

          -

          The scroller component inherits all the functions of the Layout.

          -

          Creating a Scroller

          -

          To create a scroller, use the elm_scroller_add() function:

          -
          -Evas_Object *scroller;
          -
          -scroller = elm_scroller_add(parent);
          -
          -

          Adding Objects to the Scroller

          -

          To add an object to the scroller, use the elm_object_content_set() function:

          -
          Evas_Object *image;
          -
          -image = elm_image_add(parent);
          -elm_image_file_set(image, "image.png", NULL);
          -evas_object_show(image);
          -evas_object_size_hint_min_set(image, 2560, 1600);
          -elm_object_content_set(scroller, image);
          -
          -

          In the above code, we set a minimum size of 2560 x 1600 pixels for the image. The scroller is smaller than the image, so you can scroll across the image.

          -

          If you want to be informed when the user begins scrolling the image, use the following code:

          -
          -evas_object_smart_callback_add(scroller, "scroll,drag,start", _scroll_start_cb, NULL);
          -
          -// Callback function for the "animate,begin" signal
          -// This callback is called when the user begins scrolling the image
          -void _scroll_start_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   printf("Scroll starts\n");
          -}
          - -

          Managing the Properties of the Scroller

          -

          When scrolling content, the scroller may "bounce" when reaching the edge of the content. This is a visual way of indicating that there is no more content to scroll in that direction. Bounce is enabled by default for both axes. To enable or disable the bounce for either or both axes, use the elm_scroller_bounce_set() function. The following code disables the bounce for the horizontal axis and enables it for the vertical axis:

          - -
          elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
          -
          -

          The scroller can limit the scrolling to "pages". In this case, the scrolling occurs in page-sized chunks of content rather than in a purely continuous fashion, with the scroller displaying a single "page" at a time. This feature sets the size of the page relative to the viewport of the scroller. A size of 1.0 equals 1 viewport (horizontally or vertically). A size of 0.0 disables paging for that axis. These settings are mutually exclusive with page size (see the elm_scroller_page_size_set() function). A size of 0.5 equals half a viewport. Usable size values are normally between 0.0 and 1.0, including 1.0. If you only want a single axis to scroll in pages, use 0.0 for the other axis.

          - -

          Signals

          - -

          The scroller emits the following signals, which you can catch in your application:

          - -
            -
          • "edge,left": The left edge of the content has been reached.
          • -
          • "edge,right": The right edge of the content has been reached.
          • -
          • "edge,top": The top edge of the content has been reached.
          • -
          • "edge,bottom": The bottom edge of the content has been reached.
          • -
          • "scroll": The content has been scrolled (moved).
          • -
          • "scroll,anim,start": The scrolling animation has started.
          • -
          • "scroll,anim,stop": The scrolling animation has stopped.
          • -
          • "scroll,drag,start": Dragging the contents has started.
          • -
          • "scroll,drag,stop": Dragging the contents has stopped.
          • -
          • "vbar,drag": The vertical scroll bar has been dragged.
          • -
          • "vbar,press": The vertical scroll bar has been pressed.
          • -
          • "vbar,unpress": The vertical scroll bar has been unpressed.
          • -
          • "hbar,drag": The horizontal scroll bar has been dragged.
          • -
          • "hbar,press": The horizontal scroll bar has been pressed.
          • -
          • "hbar,unpress": The horizontal scroll bar has been unpressed.
          • -
          • "scroll,page,changed": The visible page has changed.
          • -
          - -

          Example

          -

          A good example of the scroller is a picture slideshow: we add images to the scroller and limit the scrolling to pages (one picture at a time). In the following code, we disable the scroll bars for both axes, limit the scrolling to pages by using the elm_scroller_page_scroll_limit_set() function, and lock the scrolling on the Y axis by using the elm_object_scroll_lock_y_set() function:

          -
          elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
          -elm_scroller_page_scroll_limit_set(scroller, 1, 0);
          -elm_object_scroll_lock_y_set(scroller, EINA_TRUE);
          -
          -

          We create a horizontal box, which will contain all the images, and which itself will be contained by the scroller:

          -
          box = elm_box_add(scroller);
          -elm_box_horizontal_set(box, EINA_TRUE);
          -elm_object_content_set(scroller, box);
          -evas_object_show(box);
          -
          -

          We then create all the images and add them to the horizontal box:

          -
          img = elm_image_add(scroller);
          -snprintf(buf, sizeof(buf), IMAGE_DIR"/%d.jpg", i);
          -elm_image_file_set(img, buf, NULL);
          -evas_object_show(img);
          -pages = eina_list_append(pages, img);
          -elm_box_pack_end(box, img);
          -
          -

          We store references to the images in an eina_list for easy retrieval later.

          -

          Finally, we display the first page of the scroller:

          -
          elm_scroller_page_show(scroller, 0, 0);
          -
          -

          The size of the scroller depends on the size of the parent. When the parent changes, for example when the window is resized or rotated, the scroller is also resized. Since we need to be informed when the scroller is resized, we add a callback on the EVAS_CALLBACK_RESIZE event for the scroller:

          -
          evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE, _scroller_resize_cb, NULL);
          -

          The callback retrieves the new size of the scroller by using the evas_object_geometry_get() function on the object pointer. The pointer is relative to the object that has been resized, which in our case is the scroller itself. We can then iterate through the images of the scroller and set the minimum size to fit the scroller size:

          -
          EINA_LIST_FOREACH(images, l, page)
          -{
          -   evas_object_size_hint_min_set(page, w, h);
          -}
          -
          -

          Finally, we set the page size of the scroller to match the scroller size and display the first page:

          -
          elm_scroller_page_size_set(obj, w, h);
          -elm_scroller_page_show(obj, 0, 0);
          - -

          Table

          - -

          A table is like a box but with 2 dimensions. You have the same kind of APIs as with boxes. An item inside the table can span multiple columns and rows, and even overlap with other items (and it can then be raised or lowered accordingly to adjust stacking if there is overlap).

          - -

          Creating a Table

          - -

          To create a table, use the elm_table_add() function:

          -
          Evas_Object *table;
          -table = elm_table_add(parent);
          - -

          Adding Items to the Table

          - -

          Items are added to the table with the elm_table_pack() function. This function takes as parameters the table, the item to add to the table, and the position where to add the item: column, row, and the size of the item in number of rows and columns (colspan and rowspan). If we want to create an icon that takes 3 columns and rows and a button that only takes 1 row and column, the code will look like this:

          -
          ic = elm_icon_add(table);
          -elm_image_file_set(ic, "icon.png", NULL);
          -evas_object_show(ic);
          -elm_table_pack(table, ic, 0, 0, 3, 3);
          -
          -btn = elm_button_add(table);
          -elm_object_text_set(btn, "Click me i'm famous");
          -evas_object_show(btn);
          -elm_table_pack(table, btn, 3, 1, 1, 1);
          -evas_object_show(table);
          -
          - -

          Managing the Items

          - -

          If you want to change the position of the item after adding it, use the elm_table_pack_set() function. This function takes as parameters the item whose position to change, the new column, the new row, and the size of the item in number of rows and columns (colspan and rowspan).

          - -

          To add padding around the item, use the elm_table_padding_set() function. The second parameter is the padding between columns, and the third parameter is the padding between rows:

          -
          elm_table_padding_set(table, 10, 10);
          - -

          To change the alignment and size of an item, use the evas_object_size_hint parameters. They are used in the same way as with boxes. You can set the same size and weight to each item by using the homogeneous parameter:

          -
          elm_table_homogeneous_set(table, EINA_TRUE);
          -
          - -

          Clearing the Table

          - -

          To clear the table, use the elm_table_clear() function. If the clear parameter is EINA_TRUE, the table items are deleted. The evas_object_del() function will be called on each item.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/core_loop_n.htm b/org.tizen.ui.guides/html/native/efl/core_loop_n.htm deleted file mode 100755 index fcd6f6d..0000000 --- a/org.tizen.ui.guides/html/native/efl/core_loop_n.htm +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - Core Loop and OS Interfacing: Handling the Main Loop and Threads - - - - - -
          - -

          Core Loop and OS Interfacing: Handling the Main Loop and Threads

          -

          The Ecore library provides convenience functions, which allow you to manage the application main loop and threading.

          - -

          Tizen applications developed with EFL use the EDA (Event-driven Architecture) pattern. In EDA, applications reiterate the routine that checks input events, processes the events, and then displays the outputs. The main loop is the entity handling this sequence. It is the heart of any GUI based on EDA.

          - -

          Most applications start and end the main loop, which is used in special situations, such as propagation of events to UI components for handling and updating application appearance and state. That guarantees the delivery of all events received from low-level input devices and provides the accurate and speedy render event loop for synchronizing the application UI with events.

          - -

          The Ecore library provides main loop abstraction with a clean and tiny event loop library. Applications mainly deal with file descriptors handling, event handling, and timer handling from the beginning of the main loop.

          - -

          In addition, Ecore provides several modules related to, for example, Audio, Cocoa, Connection, Drm, FrameBuffer, Input, IPC, Wayland, Win32, and X11 with convenient methods to communicate with underlying operating systems, such as Linux, Windows®, or Mac OS® X.

          - -

          There are 2 types of threads in Tizen applications:

          -
            -
          • Main thread that contains the main loop
          • -
          • Worker threads that support concurrent processing. In parallel processing, applications must keep the GUI updating while processing the data related to the UI.
          • -
          - -

          The Ecore library provides these concurrent processing mechanisms through Ecore threads. An Ecore thread is not a simple wrapper for standard POSIX threads. It is not meant to be used to run parallel tasks throughout the entire duration of the application, especially when these tasks are performance-critical. Ecore manages these tasks using a pool of threads based on system configuration, such as the number of processors the system has, and the maximum amount of concurrent threads set for the application.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/data_types_n.htm b/org.tizen.ui.guides/html/native/efl/data_types_n.htm deleted file mode 100755 index 65bf805..0000000 --- a/org.tizen.ui.guides/html/native/efl/data_types_n.htm +++ /dev/null @@ -1,1696 +0,0 @@ - - - - - - - - - - - - - Data Types - - - - - -
          - -

          Data Types

          - -

          The Eina library is a central part of the EFL. It implements an API for data types, and allows you to create and manipulate several data types:

          - -
            -
          • Inline Array: standard array of inlined members
          • -
          • Array: standard array of void* data
          • -
          • Hash Table: standard hash of void* data
          • -
          • Inline List: list with nodes inlined into the user type
          • -
          • Compact List
          • -
          • List: standard list of void* data
          • -
          • Iterator Functions
          • -
          • Sparse Matrix: sparse matrix of void* data
          • -
          • Red-Black tree: red-black tree with nodes inlined into the user type
          • -
          • String Buffer: mutable string to prepend, insert, or append strings to a buffer
          • -
          • Stringshare: shares read-only string references
          • -
          • Tiler split: merges and navigates into 2D tiled regions
          • -
          • Trash: container of unused but allocated data
          • -
          • Generic Value Storage: container for generic value storage and access
          • -
          • Data Model API: container for data with a user-defined hierarchy or structure
          • -
          - - -

          Iterator Functions

          -

          Eina provides a set of iterator functions to manipulate data types, such as arrays.

          -

          These functions allow access to container elements in a generic way, without knowing which container is used (similar to iterators in the C++ STL). Iterators only allow sequential access (that is, from one element to the next one). For random access, Eina provides accessor functions.

          -

          Getting an iterator to access elements of a given container is done through the functions of that particular container. There is no function to create a generic iterator as iterators absolutely depend on the container. Note that all iterators, regardless of the container type, are always deleted with the same eina_iterator_free() function.

          -

          To get the data and iterate, use the eina_iterator_next() function. To call a function on every single element of a container, use the eina_iterator_foreach() function.

          -

          In addition to iterator functions, each data type also owns a set of macros that provide the iterators, such as FOREACH or REVERSE_FOREACH.

          - -

          Strings

          - -

          Stringshare

          - -

          The Eina_Stringshare data type functions allow you to store a single copy of a string and use it in multiple places throughout your program. This way you can save a lot of strings with less memory. It improves string creation and destruction speed, reduces memory use, and decreases memory fragmentation.

          -

          With this data type you can reduce the number of duplicated strings kept in memory. It is common for the same strings to be dynamically allocated repeatedly between applications and libraries, especially in circumstances where you can have multiple copies of a structure that allocates the string. Rather than duplicating and freeing these strings, request a read-only pointer to an existing string and only incur the overhead of a hash lookup. This can sound like micro-optimizing, but profiling has shown that this can have a significant impact as the number of copies grows.

          - -

          To manage stringshares:

          -
            -
          1. To create a stringshare, declare a string variable and call the eina_stringshare_add() function: -
            -const char *mystr;
            -const char *prologue = "Enlightenment is not just a window manager for Linux/X11 and others"
            -
            -mystr = eina_stringshare_add(prologue);
            -
          2. - -
          3. To retrieve or modify the string data: -
              -
            • Retrieve a string for use in a program from a format string using the eina_stringshare_printf() function. If you have a "format" string to pass to a function like printf, you can store it as a stringshare as well. -

              The following example produces "1 desktop manager to rule them all".

              -
              -const char *myfmtstr = "%d desktop manager to rule them all";
              -const char *str;
              -
              -str = eina_stringshare_printf(myfmtstr, 1);
              -
              -print(str)
              -
              -
            • - -
            • Replace the value of a stringshare with the eina_stringshare_replace() function. Pass the pointer address and the new value to the function. -
              -eina_stringshare_replace(&str,"One desktop manager to rule them all");
              -
              -
            • - -
            • Retrieve the length of the stringshare value with the eina_stringshare_strlen() function. -
              -printf("length: %d\n", eina_stringshare_strlen(str));
              -
              -
            • -
            -
          4. -
          5. When the string is no longer needed, delete it using the eina_stringshare_del() function: -
            -eina_stringshare_del(mystr);
            -
            -
          6. -
          - - - -

          String Buffer

          -

          The string buffer data type is designed to be a mutable string, allowing you to append, prepend or insert a string to a buffer. It allows easy handling of buffers in your applications.

          -

          To manage string buffers:

          -
            -
          1. Initialize the Eina_Strbuf instance and create the buffer: -
            -Eina_Strbuf *buf;
            -mybuffer = eina_strbuf_new();
            -
            -
          2. -
          3. Manage the buffer content: -
              -
            • To append characters to the buffer: -
                -
              • -

                For basic strings, use the eina_strbuf_append() function:

                -
                -eina_strbuf_append(mybuffer, "This is my string.");
                -
                -
              • -
              • To append 1 character to your buffer, use the eina_strbuf_append_char() function. You can also append a sized string to the buffer using the eina_strbuf_append_length() function. -
                -eina_strbuf_append_length(mybuffer, "Buffe", 5);
                -eina_strbuf_append_char(mybuffer, 'r');
                -
                -
              • -
              • To handle "printf" format strings, use the eina_strbuf_append_printf() function to add formatted strings to the buffer: -
                -eina_strbuf_append_printf(buf, "%s%c", "buffe", 'r');
                -
                -
              • -
              -
            • - -
            • To remove characters from one position to another, use the eina_strbuf_remove() function. The first parameter is the buffer, the second is the start position of the characters you want to delete, and the last the end position. -

              This example removes the first 19 characters of the buffer:

              -
              -eina_strbuf_remove(buf, 0, 18);
              -
              -
            • - -
            • To replace characters: - -
              • -eina_strbuf_replace() replaces a specific occurrence of a given string in the buffer with another string.
              • -
              • -eina_strbuf_replace_all() replaces all occurrences of a given string in the buffer with another string. -
              • -
              -
              -eina_strbuf_append(mybuffer, "buffer buffer buffer");
              -
              -// Replacing one occurrence of "buffer" by "B-U-F-F-E-R"
              -eina_strbuf_replace(mybuffer, "buffer", "B-U-F-F-E-R", 1);
              -
              -// Replacing all the occurrences of "buffer" by "B-U-F-F-E-R"
              -eina_strbuf_replace_all(mybuffer, "buffer", "B-U-F-F-E-R");
              -
              -// Replacing all the occurrences of "B-U-F-F-E-R" by "Buffer"
              -eina_strbuf_replace_all(mybuffer, "B-U-F-F-E-R", "Buffer");
              -
              -
            • -
            • To insert a string at the specified position, use the eina_strbuf_insert() function. Use the eina_strbuf_insert_printf() function with formatted strings. -
              -eina_strbuf_insert(mybuffer, "More buffer", 10);
              -
              -// Using eina_strbuf_length_get to get the buffer length
              -eina_strbuf_insert_printf(buf, " %s: %d", 6, "length", eina_strbuf_length_get(buf));
              -
              -
            • - -
            • To get the complete length of the string and the buffer, use the eina_strbuf_string_get() and eina_strbuf_length_get() functions: -
              -printf("%s : %d\n", eina_strbuf_string_get(mybuffer), eina_strbuf_length_get(buf));
              -
              -
            • -
            -
          4. - -
          5. When no longer needed, free the buffer with the eina_strbuf_free() function. You can also free the content of Eina_Strbuf without freeing the buffer itself using the eina_strbuf_string_free() function. -
            -eina_strbuf_free(mybuffer);
            -
            -
          6. -
          - -

          Arrays

          -

          An array is a data type which describes an ordered collection of values. The values are accessed by their index.

          -
          -INDEX | VALUE
          ---------------
          -0     | value0
          -1     | value1
          -2     | value2
          -3     | value3
          -4     | value4
          -5     | value5
          -6     | value6
          -7     | value7
          -
          -

          Eina provides 2 array types: the classic array and an inline array.

          - -

          Creating and Destroying a Classic Array

          - -

          The eina_array_new() function creates a new array. You can store strings or objects in the created array. The function returns a new array, or if memory allocation fails, NULL.

          -

          The first parameter of the eina_array_new() function defines the size of the array allocation step. For example, if you set it to 4, the function returns an array of 4 elements and the next time you grow the array it grows by 4 elements. Unless you have pushed 4 elements inside, it does not grow. But once you add the 5th element, it grows again and becomes an array of 8 elements. The allocation step feature is very useful for optimizing performance, and it also reduces memory fragmentation by having a size that fits the array usage. If you set the step to 0, the function sets a default safe value.

          - -

          To create an array to store strings:

          -
            -
          1. Create the array: -
            -// Strings to store in the array 
            -const char* strings[] = 
            -{
            -   "helo", "hera", "starbuck", "kat", "boomer",
            -   "hotdog", "longshot", "jammer", "crashdown", "hardball",
            -   "duck", "racetrack", "apolo", "husker", "freaker",
            -   "skulls", "bulldog", "flat top", "hammerhead", "gonzo"
            -};
            -// Declaring the array (type Eina_Array)
            -Eina_Array *array;
            -unsigned int i;
            -
            -// Creating the array
            -array = eina_array_new(20);
            -
            -// Inserting elements in the array
            -for (i = 0; i < 20; i++)
            -   eina_array_push(array, strdup(strings[i]));
            -
            -
          2. -
          3. To change the allocation step, use the eina_array_step_set() function: -
            • The first parameter is the array you want to change.
            • -
            • The second parameter is the size of that specific array (retrieved with the sizeof() function).
            • -
            • The last parameter is the new step size.
            -

            In this example, the array step changes from 20 to 30.

            -
            -eina_array_step_set(array, sizeof(*array), 30);
            -
            -
          4. -
          5. When no longer used, use the eina_array_free() function to free the array. It first calls the eina_array_flush() function and frees the memory of the pointer. It does not free the memory allocated for the elements of the array. To free them, use a while statement with the eina_array_pop function. -
            -// Freeing the array elements
            -while (eina_array_count(array))
            -   free(eina_array_pop(array));
            -
            -// Freeing the array itself
            -eina_array_free(array);
            -
            -
          6. -
          - -

          Modifying Classic Array Content

          - -

          To modify classic array content:

          -
            -
          • To set the data of an element, use the eina_array_data_set() function. The first parameter is the array, the second is the index of the element you want to set, and the last one is the data. You must first get the related pointer if you need to free it, as this function replaces the previously held data. Be careful, as there is no array or index check. If the value is NULL or invalid, the application can crash. -
            -free(eina_array_data_get(array, 0));
            -eina_array_data_set(array, 0, strdup(strings[3]);
            -
            -
          • -
          • To add elements to the end of the array, use the eina_array_push() function. The function returns EINA_TRUE on success, and EINA_FALSE on failure. The first parameter is the array to store the element, the second one is the data you want to store. If you store strings, remember to allocate the memory first. The example uses the strdup function to duplicate the string contained in strings[]. This function allocates the memory of the returned string, so you do not have to do it yourself. -
            -for (i = 0; i < 20; i++)
            -   eina_array_push(array, strdup(strings[i]));
            -
            -
          • - -
          • To remove the last element of an array, use the eina_array_pop() function. It takes the array as a parameter, and if the operation is successful, returns a pointer to the data of the removed element. -
            -while (eina_array_count(array))
            -   free(eina_array_pop(array));
            -
            -
          • - -
          • To rebuild the array by specifying the data to be kept, use the eina_array_remove() function: -
            • The first parameter is the array to be changed.
            • -
            • The second parameter is the function which selects the data to keep in the rebuilt array.
            • -
            • The last parameter is the data to pass to the selector function defined as the second parameter.
            -

            The selector function has to return an Eina_Bool, EINA_TRUE if the element stays, and EINA_FALSE if it has to be removed.

            -

            The following example shows how to remove all the elements of the array that are longer than 5.

            -
            -// Selector function 
            -Eina_Bool keep(void *data, void *gdata)
            -{
            -   if (strlen((const char*)data) <= 5)
            -      return EINA_TRUE;
            -
            -   return EINA_FALSE;
            -}
            -
            -int remove_array()
            -{
            -   Eina_Array *array;
            -   Eina_Array_Iterator iterator;
            -   const char *item;
            -   unsigned int i;
            -
            -   // Creating and populating an array
            -
            -   // Removing the undesired elements 
            -   eina_array_remove(array, keep, NULL);
            -
            -   // Flushing and freeing the array
            -
            -   return 0;
            -}
            -
            -
          • -
          • To completely wipe an array out, use the eina_array_flush() function. This function sets the count and total members of an array to 0, and frees and sets its data members to NULL. For performance reasons, there is no array check. If the value is NULL or invalid, the program can crash. The only parameter of this function is a pointer to the Eina_Array array you want to flush. -
            -eina_array_flush(array);
            -
            -
          • -
          • To empty an array quickly, use the eina_array_clean() function. This function sets the counting of members in the array to 0. It does not free any space so you have to use it carefully. For performance reasons, there is no array check. If the value is NULL or invalid, the program can crash. -
            -eina_array_clean(array);
            -
            -
          • -
          - -

          Accessing Classic Array Data

          - -

          To access classic array data:

          -
            -
          • To access the data in the array, use the eina_array_data_get() function with the array and the index of the element you want to get. The function returns a pointer to the data. -
            -// Getting the data of the first element 
            -char *mydata;
            -mydata = eina_array_data_get(array, 0);
            -
            -
          • - - -
          • To get the number of elements in an array, use the eina_array_count() function. The first parameter is a pointer to the array variable returned by the eina_array_new() function. -

            The function returns the number of elements.

            -
            -unsigned int nb_elm;
            -nb_elm = eina_array_count(array);
            -
            -
          • - -
          • To iterate through an array, you can use various methods: -
              -
            • Use the Eina_Array iterator called ITER_NEXT. -

              You can use the iterator by calling the macro EINA_ARRAY_ITER_NEXT(). It takes the array to iterate as the first parameter, a counter for the current index during the iteration, and a variable of the same type as the item data and an Eina_Iterator. To use it, declare an Eina_Iterator, an int counter, and, for example, a char * item if your array contains any strings.

              -
              -Eina_Array_Iterator iterator;
              -const char *item;
              -unsigned int i;
              -
              -EINA_ARRAY_ITER_NEXT(array, i, item, iterator)
              -   printf("item #%d: %s\n", i, item);
              -
              -
            • -
            • Use the eina_array_foreach() function to iterate over the array. -

              The first parameter is the array to iterate, the second is a callback function which determines whether the iteration can continue,and the last is the data passed to the callback function.

              -

              To iterate over the array and to print the data of each array element:

              -
              -// Callback function 
              -static Eina_Bool
              -elm_print(const void *container, void *data, void *fdata)
              -{
              -   printf("%s\n", (char *)data);
              -
              -   return EINA_TRUE;
              -}
              -
              -int iterating_array()
              -{
              -   Eina_Array *array;
              -   unsigned int i;
              -
              -   // Creating and populating an array
              -
              -   // Iterating over the array and calling elm_print on each element
              -   eina_array_foreach(array, elm_print, NULL);
              -
              -   // Freeing the element data and array
              -
              -   return 0;
              -}
              -
              -
            • - -
            • Use the eina_array_iterator_new() function to create an iterator for the array.

              The function returns a newly allocated iterator associated with the array. If the array is NULL or the count of the array members is less than or equal to 0, the function returns NULL. If the memory cannot be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is thrown. Otherwise, a valid iterator is returned.

              -

              Pass to this function the array for which you want to create a new iterator. The iterator is used to run a sequential walk through the array, just like the eina_array_foreach() function.

              -

              To create an iterator and use it to print the data of each array element:

              -
              -static Eina_Bool
              -print_one(const void *container, void *data, void *fdata)
              -{
              -   printf("%s\n", (char*)data);
              -
              -   return EINA_TRUE;
              -}
              -
              -int new_iterator()
              -{
              -   Eina_Array *arra;
              -   Eina_Iterator *it;
              -   unsigned short int i;
              -   void *uninteresting;
              -   Eina_Bool rt;
              -
              -   // Creating and populating an array
              -
              -   it = eina_array_iterator_new(array);
              -
              -   it = eina_iterator_next(it, &uninteresting);
              -   eina_iterator_foreach(it, print_one, NULL);
              -   eina_iterator_free(it);
              -
              -   return 0;
              -}
              -
              -
            • -
            • Use the eina_array_accessor_new() function to get random access to the array elements. -

              The function returns a newly allocated accessor associated with the array. If the array is NULL or the counting of array members is less than or equal to 0, this function returns NULL. If the memory cannot be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is thrown. Otherwise, a valid accessor is returned.

              -

              To use the accessor to retrieve and print the data of every other array element:

              -
              -int random_access()
              -{
              -   // Declaration of the array 
              -   Eina_Array *array;
              -   // Declaration of the accessor
              -   Eina_Accessor *acc;
              -
              -   // Generic counter
              -   unsigned short int i;
              -
              -   // Variable to put the data retrieved from an array element
              -   void *data;
              -
              -   // Creating and populating an array
              -
              -   // Creating the array accessor
              -   acc = eina_array_accessor_new(array);
              -
              -   // Random access to the data of the array elements
              -   for(i = 1; i < 10; i += 2)
              -   {
              -      // Putting the data in the variable 'data'
              -      eina_accessor_data_get(acc, i, &data);
              -      printf("%s\n", (const char *)data);
              -   }
              -
              -   // Freeing the accessor
              -   eina_accessor_free(acc);
              -
              -   // Freeing the array
              -
              -   return 0;
              -}
              -
              -
            • -
            -
          • -
          - - -

          Creating and Destroying an Inline Array

          - -

          An inline array is a container that stores the data itself, not the pointers to the data. This means there is no memory fragmentation, and for small data types, such as char, short, and int, it is more memory-efficient. This is because the data is stored in the cache and is faster to access. The bigger the data gets, however, the less likely it is and the less interesting it becomes.

          -

          To create an inline array, use the eina_inarray_new() function:

          -
          • The first parameter is the size of the value. In this example, only the characters are stored, and because of that, only sizeof(char) is passed to the function.
          • -
          • The second parameter defines the size of the array allocation step. For example, if you set it to 4, the function returns an inline array of 4 elements, and the next time you grow the inline array, it grows by 4 elements and becomes an array of 8 elements. If you set the step to 0, the function sets a default safe value. -

            The step can be changed later on using the eina_inarray_step_set() function.

          - -

          The eina_inarray_new() function returns a pointer to the new Eina_Inarray variable.

          -
          -int inline_array() 
          -{
          -   // Declare an inline array variable of the type Eina_Inarray
          -   Eina_Inarray *iarr;
          -
          -   // Create an inline array of "char"
          -   iarr = eina_inarray_new(sizeof(char), 0);
          -
          -   // When no longer needed, free the array memory
          -   eina_inarray_free(iarr);
          -
          -   return 0;
          -}
          -
          - -

          Modifying Inline Array Content

          - -

          To modify inline array content:

          -
            -
          • -

            To add data as the last element of the inline array, use the eina_inarray_push() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the data you want to push to the inline array.

            -

            If everything runs fine, the function returns the index of the new element. If something goes wrong, it returns -1.

            -
            -ch = 'a';
            -eina_inarray_push(iarr, &ch);
            -
            -
          • -
          • -

            To insert data to a given position of the inline array, use the eina_inarray_insert_at() function:

            -
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • -
            • The second parameter is the index of the element you want to add to the inline array.
            • -
            • The last parameter is a pointer to the content to be added.
            -

            The content of the pointer is copied to the given position in the inline array. All the members from the position to the end of the array are shifted towards the end. If the position is equal to the end of the array, the member is appended. If the position is bigger than the array length, the function fails.

            -
            -ch = 'a';
            -eina_inarray_push(iarr, &ch);
            -ch = 'b';
            -eina_inarray_push(iarr, &ch);
            -ch = 'd';
            -eina_inarray_push(iarr, &ch);
            -
            -// Adding data on position 3
            -ch = 'c';
            -eina_inarray_insert_at(iarr, 2, &ch)
            -
            -
          • -
          • -

            To insert data with your own position criteria, use the eina_inarray_insert() or eina_inarray_insert_sorted() function. The only difference between these functions is that the eina_inarray_insert_sorted() function assumes that the array is already sorted and consequently optimizes the insertion position by doing a binary search.

            -

            In both functions:

            -
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • -
            • The second parameter is the data you want to push to the inline array.
            • -
            • The last parameter is the callback comparison function. -

              The Eina_Compare_Cb callback function compares data1 and data2. data1 is the value contained in the inline array and data2 is the data you pass to the eina_inarray_insert() or eina_inarray_insert_sorted() function as the second parameter. If data1 is less than data2, -1 must be returned, if it is greater, 1 must be returned, and if they are equal, 0 must be returned.

            -

            The following example shows how to insert a value before a greater value:

            -
            -// Defining the comparison function with the position criteria
            -Eina_Compare_Cb cmp(const void *a, const void *b)
            -{
            -   return *(int*)a > *(int*)b;
            -}
            -
            -int inline_insert()
            -{
            -   Eina_Inarray *iarr;
            -   char ch, *ch3;
            -   int a, *b;
            -
            -   // Creating an inline array
            -
            -   // Adding data to the inline array
            -   a = 97;
            -   eina_inarray_push(iarr, &a);
            -   a = 98;
            -   eina_inarray_push(iarr, &a);
            -   a = 100;
            -   eina_inarray_push(iarr, &a);
            -
            -   // Inserting data with the criteria
            -   a = 99;
            -   eina_inarray_insert_sorted(iarr, &a, cmp);
            -
            -   eina_inarray_free(iarr);
            -}
            -
            -
          • -
          • -

            To remove the last element of the inline array, use the eina_inarray_pop() function. The only parameter is a pointer to the array variable returned by the eina_inarray_new() function. This function returns the data removed from the inline array.

            -
            -eina_inarray_pop(iarr);
            -
            -
          • -
          • -

            To remove specific data from an inline array, use the eina_inarray_remove() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the data you want to remove from the inline array.

            - -

            The eina_inarray_remove() function finds the data and removes the matching members from the array. The data can be an existing member of an inline array for optimized usage. In other cases, the content is matched using the memcmp() function.

            - - -

            The eina_inarray_remove() function returns the index of the removed member, or -1 if failed.

            -
            -iarr = eina_inarray_new(sizeof(char), 0);
            -
            -ch = 'a';
            -eina_inarray_push(iarr, &ch);
            -
            -// Removing data from the array
            -eina_inarray_remove(iarr, &ch);
            -
            -
          • - -
          • -

            To remove data from a defined position in an inline array, use the eina_inarray_remove_at() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the index of the element you want to remove from the inline array.

            -

            The function returns EINA_TRUE on success and EINA_FALSE if something goes wrong. The member is removed from the inline array and any members after it are moved towards the array's head.

            -
            -// Removing data from position 2
            -eina_inarray_remove_at(iarr, 2);
            -
            -
          • -
          • To remove all the elements of the array, use the eina_inarray_flush() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The function removes every member from the array.

            -
            -eina_inarray_flush(iarr);
            -
            -
          • - -
          • -

            To replace values in the inline array, use the eina_inarray_replace_at() function, which copies the data over the given position:

            -
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • -
            • The second parameter is the index of the element you want to remove from the inline array.
            • -
            • The last parameter is the data you want to copy in place of the current data.
            -

            The function returns EINA_TRUE on success, and EINA_FALSE on failure. The given pointer content is copied to the given position in the array. The pointer is not referenced, instead its contents are copied to the member's array using the previously defined member_size. If the position does not exist, the function fails.

            -
            -// Replacing the member at position 3 
            -ch = 'd';
            -eina_inarray_replace_at(iarr, 3, &ch);
            -
            -
          • - -
          • -

            To sort an inline array, use the eina_inarray_sort() function, which applies a quick sorting algorithm to the inline array:

            -
            • The first parameter is a pointer to the array returned by the eina_inarray_new() function.
            • -
            • The last parameter is the Eina_Compare_Cb callback comparison function, which compares data1 and data2. -

              data1 and data2 are values contained in the inline array. If the data matches, the function must return 0, if data1 is less than data2, -1 must be returned and if it is greater, 1 must be returned.

            -
            -static int
            -short_cmp(const void *pa, const void *pb)
            -{
            -   const short *a = pa, *b = pb;
            -
            -   return *a - *b;
            -}
            -
            -int sorting_inline_array()
            -{
            -   Eina_Inarray *array;
            -   int i;
            -
            -   // Creating and populating the inline array
            -
            -   eina_inarray_sort(array, short_cmp);
            -   eina_inarray_free(array);
            -}
            -
            - -

            Be careful, the data given to the compare function is the pointer to the member memory itself. Do not change it.

            -
          • -
          - -

          Accessing Inline Array Data

          - -

          To access inline array data:

          -
            -
          • -

            To search a member in an inline array, use the eina_inarray_search() function that runs a linear walk looking for the given data:

            - -
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • -
            • The second parameter is the data used by the callback function to run the comparison.
            • -
            • The last parameter is the Eina_Compare_Cb callback comparison function, which compares data1 and data2. -

              data1 is the value contained in the inline array and data2 is the data you pass to the eina_inarray_search() function as the second parameter. If the data matches, the function must return 0, if data1 is less than data2, -1 must be returned and if it is greater, 1 must be returned.

            -

            The function returns the member index, or -1 if not found.

            -
            -Eina_Compare_Cb
            -compare(const void *pa, const void *pb)
            -{
            -   const short *a = pa, *b = pb;
            -   if (*a == *b)
            -   {
            -      return EINA_TRUE;
            -   }
            -
            -   return EINA_FALSE;
            -}
            -
            -int search_inline_array()
            -{
            -   Eina_Inarray *array;
            -   int i;
            -   int elm_index;
            -   int to_search = 3;
            -
            -   // Creating and populating the inline array
            -
            -   elm_index = eina_inarray_search(array, &to_search, compare);
            -   eina_inarray_free(array);
            -}
            -
            - -

            Be careful, the data given to the compare function is the pointer to the member memory itself. Do not change it.

            -

            The eina_inarray_search_sorted() function does exactly the same as eina_inarray_search(), but uses a binary search for the given data.

            -
          • - -
          • -

            To get the number of elements in an inline array, use the eina_inarray_count(). The first parameter is a pointer to the array returned by the eina_inarray_new() function. The function returns an unsigned int, the number of elements.

            -
            -printf("Inline array of integers with %d elements:\n", eina_inarray_count(iarr));
            -
            -
          • - -
          • To iterate through an inline array, you can use various methods: -
              -
            • You can use the iterator macros for the inline arrays: FOREACH and REVERSE_FOREACH.

            • -
            • -

              To run a linear walk over an array of elements, use the EINA_INARRAY_FOREACH() macro. The first parameter is a pointer to the array variable returned by eina_inarray_new(), and the second parameter is the variable into which the current value is put during the walk. The EINA_INARRAY_REVERSE_FOREACH() macro does the same thing but starts from the last element.

              - -

              The following example illustrates the printing of each element and its pointer:

              -
              -iarr = eina_inarray_new(sizeof(char), 0);
              -int a, *b;
              -
              -a = 97;
              -eina_inarray_push(iarr, &a);
              -a = 98;
              -eina_inarray_push(iarr, &a);
              -a = 99;
              -eina_inarray_push(iarr, &a);
              -
              -EINA_INARRAY_FOREACH(iarr, b)
              -  printf("int: %d(pointer: %p)\n", *b, b);
              -
              -
            • -
            • To process the array data, use the eina_inarray_foreach() function, which invokes the given function on each element of the array with the given data: -
              • The first parameter is a pointer to the array variable returned by eina_inarray_new().
              • -
              • The second parameter is the function to run on each element. -

                The function must return EINA_TRUE as long as you want to continue iterating. By returning EINA_FALSE, you stop the iteration and make the eina_inarray_foreach() function return EINA_FALSE.

                -

                The data given to the function is the pointer to the member itself.

              • -
              • The last parameter is the data passed to the function called on each element.
              -

              The eina_inarray_foreach() function returns EINA_TRUE if it successfully iterates through all items of the array. Call the function for every given data in the array. This is a safe way to iterate over an array.

              -
              -static Eina_Bool
              -array_foreach(const void *array __UNUSED__, void *p, void *user_data __UNUSED__)
              -{
              -   short *member = p;
              -   int *i = user_data;
              -   (*p)++;
              -   (*i)++;
              -
              -   return EINA_TRUE;
              -}
              -
              -int inline_array_foreach()
              -{
              -   Eina_Inarray *iarr;
              -   iarr = eina_inarray_new(sizeof(char), 1);
              -   int i;
              -
              -   for (i = 0; i < numbers_count; i++)
              -   {
              -      short val = i;
              -      eina_inarray_push(iarr, &val);
              -   }
              -
              -   i = 0;
              -   eina_inarray_foreach(iarr, array_foreach, &i);
              -
              -   eina_inarray_free(iarr);
              -
              -   return 0;
              -}
              -
              -
            • - -
            • To remove some elements based on your own criteria, use the eina_inarray_foreach_remove() function, which walks through the array and, if the value matches in the callback function, removes the element: -
              • The first parameter is a pointer to the array returned by eina_inarray_new() function.
              • -
              • The second parameter is the callback function to run on each element. -

                The callback function returns EINA_TRUE if the value matches, or EINA_FALSE if it does not match.

              • -
              • The last parameter is the data passed to the callback function.
              -

              The function returns the number of removed entries or -1 if something goes wrong.

              -
              -static Eina_Bool
              -array_foreach(const void *array __UNUSED__, void *p, void *user_data __UNUSED__)
              -{
              -   short *member = p;
              -   int *i = user_data;
              -   if (*i == *p) 
              -   { 
              -      return EINA_TRUE;
              -   }
              -
              -   return EINA_FALSE;
              -}
              -
              -int inline_array_foreach_remove()
              -{
              -   Eina_Inarray *iarr;
              -   iarr = eina_inarray_new(sizeof(char), 1);
              -   int i;
              -
              -   for (i = 0; i < numbers_count; i++)
              -   {
              -      short val = i;
              -      eina_inarray_push(iarr, &val);
              -   }
              -
              -   i = 6;
              -   eina_inarray_foreach_remove(iarr, array_foreach, &i);
              -
              -   eina_inarray_free(iarr);
              -
              -   return 0;
              -}
              -
              - -
            • -
            -
          • -
          - - -

          Hash Tables

          -

          The Eina_Hash provides a way to store values in association with a key. For example, if you want to store some tuples into a table, you can do it using the Eina_Hash.

          -

          The Eina_Hash is implemented using an array of "buckets" where each bucket is a pointer to a structure that is the head of a red-black tree. This implementation makes it very robust against week keys as in the worst case scenario, you can still depend on an efficient binary tree implementation.

          - -

          Creating a Hash Table

          - -

          To create the hash table, use the eina_hash_new() function:

          -
            -
          • The first parameter is the function called when getting the size of the key.
          • -
          • The second parameter is the function called when comparing the keys.
          • -
          • The third parameter is the function called when getting the values.
          • -
          • The fourth parameter is the function called on each value when the hash table is freed, or when an item is deleted from it. NULL can be passed as the callback.
          • -
          • The last parameter is the size of the buckets.
          • -
          -

          When you create an Eina_Hash instance, you have to create 4 potentially long callback functions. To make the functions shorter, Eina_Hash offers some predefined functions to create the following kinds of hash tables:

          -
            -
          • eina_hash_string_djb2_new() creates a new hash table using the djb2 algorithm for strings.
          • -
          • eina_hash_string_superfast_new() creates a new hash table for use with strings (better with long strings).
          • -
          • eina_hash_string_small_new() creates a new hash table for use with strings with a small bucket size.
          • -
          • eina_hash_int32_new() and eina_hash_int64_new() create a new hash table for use with 32-bit and 64-bit integers.
          • -
          • eina_hash_pointer_new() creates a new hash table for use with pointers.
          • -
          • eina_hash_stringshared_new() creates a new hash table for use with shared strings.
          • -
          -

          All these predefined functions require only one parameter, which is the function to free the data you store in the hash table.

          -

          The following example shows how to manage a small phone book using the eina_hash_string_superfast_new() function to create the hash table.

          -
            -
          1. Create the phone book structure and some static data:

            -
            -struct _Phone_Entry 
            -{
            -   const char *name; // Full name
            -   const char *number; // Phone number
            -};
            -
            -typedef struct _Phone_Entry Phone_Entry;
            -
            -static Phone_Entry _start_entries[] = 
            -{
            -   { "Wolfgang Amadeus Mozart", "+01 23 456-78910" },
            -   { "Ludwig van Beethoven", "+12 34 567-89101" },
            -   { "Richard Georg Strauss", "+23 45 678-91012" },
            -   { "Heitor Villa-Lobos", "+34 56 789-10123" },
            -   { NULL, NULL }
            -};
            -
            -
          2. - -
          3. Create the callback to free the data:

            -
            -static void
            -_phone_entry_free_cb(void *data)
            -{
            -   free(data);
            -}
            -
            -

            The free callback can be changed later using the eina_hash_free_cb_set() function. You need to pass the hash and the new callback function.

            -
          4. - -
          5. Create and destroy the hash table.

            -

            The eina_hash_free_buckets() function frees all hash table buckets. It empties the hash but does not destroy it, and you can still use it for another purpose. When eina_hash_free() is called, the space allocated for the hash is freed.

            -
            -int free_data()
            -{
            -   Eina_Hash *phone_book = NULL;
            -   phone_book = eina_hash_string_superfast_new(_phone_entry_free_cb);
            -
            -   // Empty the phone book without destroying it
            -   eina_hash_free_buckets(phone_book);
            -   eina_hash_free(phone_book);
            -}
            -
            -
          6. -
          - - - - -

          Modifying Hash Table Content

          - -

          To modify hash table content:

          -
            -
          • -

            To add some data to a hash, use the eina_hash_add() function. This function takes the hash, the key to access the data, and the data as its parameters.

            -

            The following example shows how to add the initial data declared earlier to the hash:

            -
            -for (i = 0; _start_entries[i].name != NULL; i++)
            -{
            -   eina_hash_add(phone_book, _start_entries[i].name, strdup(_start_entries[i].number));
            -}
            -
            - -

            The Eina_Hash offers various ways to add elements to a hash, such as the eina_hash_direct_add() function, which adds the entry without duplicating the string key. The key is stored in the struct, so this function can be used with eina_stringshare to avoid key data duplication.

            -
            -for (i = 0; _start_entries[i].name != NULL; i++)
            -{
            -   // Allocating memory for the phone entry
            -   Phone_Entry *e = malloc(sizeof(Phone_Entry));
            -
            -   // Creating an eina_stringshare for the name and the phone number
            -   e->name = eina_stringshare_add(_start_entries[i].name);
            -   e->number = eina_stringshare_add(_start_entries[i].number);
            -
            -   // Adding the entry to the hash 
            -   eina_hash_direct_add(phone_book, e->name, e);
            -}
            -
            -
          • -
          • -

            To modify an entry, use eina_hash_modify() function passing the hash, the key of the data to change, and the new data. The function returns the old data on success.

            -

            The eina_hash_set() function does the same work as eina_hash_modify(), but if the entry does not exist, the function creates a new one.

            -
            -char *old_phone = NULL;
            -char *phone = NULL;
            -// Replace the phone number of Richard Strauss
            -old_phone = eina_hash_modify(phone_book, "Richard Georg Strauss", strdup("+23 45 111-11111"));
            -phone = eina_hash_set(phone_book, "Philippe de Magalhães", strdup("+33 6 111-11111"));
            -eina_hash_set(phone_book, "Richard Georg Strauss", strdup("+23 45 111-117711"));
            -
            -
          • -
          • -

            To change the key associated with the data without freeing and creating a new entry, use the eina_hash_move() function. You only have to pass the hash, the old key, and the new key. If the operation succeeds, the function returns EINA_TRUE, if not, it returns EINA_FALSE.

            -
            -Eina_Bool res;
            -res = eina_hash_move(phone_book, "Philippe de Magalhães", "Filipe de Magalhães");
            -
            -
          • -
          • -

            To delete entries from a hash table:

            -
            • Use the eina_hash_del() function to remove the entry identified by a key or data from the given hash table: -
              -Eina_Bool r;
              -const char *entry_name = "Heitor Villa-Lobos";
              -r = eina_hash_del(phone_book, entry_name, NULL);
              -
            • -
            • Use the eina_hash_del_by_key() function to remove an entry based on the key: -
              -r = eina_hash_del_by_key(phone_book, "Richard Georg Strauss");
              -
              -
            • -
            • -

              Use the eina_hash_del_by_data() function to remove an entry based on the data:

              -
              -r = eina_hash_del_by_data(phone_book, "+12 34 567-89101");
              -
              -
            • -
          - -

          Accessing Hash Table Data

          -

          To find hash table elements and get data based on the key name:

          -
            -
          • -

            To retrieve an entry based on its key, use the eina_hash_find() function by passing the hash and the key you are looking for:

            -
            -char *phone = NULL;
            -const char *entry_name = "Heitor Villa-Lobos";
            -
            -// Look for a specific entry and get its phone number
            -phone = eina_hash_find(phone_book, entry_name);
            -
            -
          • -
          • -

            To get the number of entries in a hash, use the eina_hash_population() function. Pass the hash as the only argument.

            -
            -unsigned int nb_elm;
            -nb_elm = eina_hash_population(phone_book);
            -
            -
          • - -
          • To iterate through a hash table, you can use various methods: -
              - -
            • to iterate over the hash table, use the eina_hash_foreach() function: - -
              • The first parameter is the hash.
              • -
              • The second parameter is the callback function called on each iteration. -

                The callback function has to return an Eina_Bool, EINA_TRUE if the iteration has to continue and EINA_FALSE if the iteration has to stop.

              • -
              • The last parameter one is the data passed to the callback function.
              - -

              The following example prints the key and the data of the hash entry (the name and the phone number):

              - -
              -static Eina_Bool
              -pb_foreach_cb(const Eina_Hash *phone_book, const void *key, void *data, void *fdata)
              -{
              -   const char *name = key;
              -   const char *number = data;
              -   printf("%s: %s\n", name, number);
              -
              -   // Return EINA_FALSE to stop this callback from being called
              -   return EINA_TRUE;
              -}
              -
              -printf("List of phones:\n");
              -
              -// Running the callback on the hash called phone_book 
              -eina_hash_foreach(phone_book, pb_foreach_cb, NULL);
              -printf("\n");
              -
              -
            • -
            • To iterate over the keys, use the eina_hash_iterator_key_new() function: -
              -// Declaration of the Eina_Iterator
              -Eina_Iterator *it;
              -
              -// Variable to handle the current iteration "data"
              -void *data;
              -
              -// Iterate over the keys (names)
              -printf("List of names in the phone book:\n");
              -
              -it = eina_hash_iterator_key_new(phone_book);
              -
              -// Use the generic eina_iterator_next()
              -while (eina_iterator_next(it, &data))
              -{
              -   const char *name = data;
              -   printf("%s\n", name);
              -}
              -
              -// Free the iterator
              -eina_iterator_free(it);
              -
              -
            • - -
            • To iterate over the hash data, use the eina_hash_iterator_data_new() function the same way as eina_hash_iterator_key_new(): -
              -// Declaration of the Eina_Iterator
              -Eina_Iterator *it;
              -
              -// Variable to handle the current iteration "data"
              -void *data;
              -
              -// Iterate over hash data 
              -printf("List of numbers in the phone book:\n");
              -
              -it = eina_hash_iterator_data_new(phone_book);
              -while (eina_iterator_next(it, &data))
              -{
              -   const char *number = data;
              -   printf("%s\n", number);
              -}
              -
              -// Free the iterator
              -eina_iterator_free(it);
              -
              -
            • -
            • To iterate over a tuple composed of keys and data, use the eina_hash_iterator_tuple_new() function: -
              -// Declaration of the Eina_Iterator
              -Eina_Iterator *tit;
              -
              -// Variable to handle the current iteration "data"
              -void *tuple;
              -
              -printf("List of phones:\n");
              -tit = eina_hash_iterator_tuple_new(phone_book);
              -while (eina_iterator_next(tit, &tuple))
              -{
              -   Eina_Hash_Tuple *t = tuple;
              -   const char *name = t->key;
              -   const char *number = t->data;
              -   printf("%s: %s\n", name, number);
              -}
              -
              -// Always free the iterator after its use
              -eina_iterator_free(tit); 
              -
              -
            • -
            -
          • -
          - - -

          Lists

          - -

          The Eina_List is a double-linked list that can store data of any type as void pointers. It provides a set of functions to create and manipulate the list to avoid the access to the struct's fields, similar to a self-made double-link list.

          -

          In addition to the previous and next node and its data, the Eina_List nodes keep a reference to an accounting structure. The accounting structure is used to improve the performance of some functions. The structure is private and must not be modified.

          - -

          In an Eina_List, everything is a "list": the list itself is a list where each node is a list as well.

          - -

          Eina provides 2 list types: the classic list (Eina_List) and an inline list (Eina_Inlist).

          - -

          Creating and Destroying a List

          -

          To use an Eina_List:

          - -
          1. Declare the list with NULL as the default value: -
            -int list()
            -{
            -   // Declaration of the Eina_List with NULL as default value;
            -   Eina_List *list = NULL;
            -
          2. - -
          3. Call the eina_list_append() function with the list and the data you want to append as parameters. -

            The list must be a pointer to the first element of the list (or NULL). The function returns a pointer to the list.

            -
            -   // Creating the first element of the list 
            -   list = eina_list_append(list, "watch");
            -
            -   // Adding more elements
            -   list = eina_list_append(list, "phone");
            -   list = eina_list_append(list, "ivi");
            -   list = eina_list_append(list, "notebook");
            -
          4. - -
          5. When you no longer need the list, free it: -
            -   // Free the Eina_List
            -   eina_list_free(list);
            -
            -   return 0;
            -}
            -
          6. -
          - - -

          Modifying List Content

          - -

          To modify list content:

          -
            -
          • -

            To add data to a list:

            - -
              -
            • To add data at the end of the list, use the eina_list_append() function. To add data at the top of the list, use eina_list_prepend(). The functions work in the same way, only adding the data to different places. -
              -list = eina_list_prepend(list, "set-top box");
              -
              -
            • - -
            • To insert data into the list after a specified data, use the eina_list_append_relative() function. As the last parameter, define the element after which the data is added. -

              For example to append data after the "phone" element:

              -
              -list = eina_list_append_relative(list, "single-board computer", "phone");
              -
              -
            • - -
            • To add a new entry before a specified data, use the eina_list_prepend_relative() function. It is similar to the eina_list_append_relative() function. -
              -list = eina_list_prepend_relative(list, "ultrabook", "ivi");
              -
              -
            • - -
            • To append a list node to a linked list after a specified member, use the eina_list_append_relative_list() function. To prepend a list node to a linked list before a specified member, use the Eina_List * eina_list_prepend_relative_list() function. -
            • -
            -
          • - -
          • To set data in a list member, use the eina_list_data_set() function. Pass the "list" (node) as the first argument and the data to set as the second. - -

            The following example also shows the usage of the eina_list_last() function, which returns the last element of an Eina_List.

            - -
            -// Setting new data for the last element
            -eina_list_data_set(eina_list_last(list), eina_stringshare_add("Boris"));
            -
            -
          • - -
          • To remove a node from the list, use the eina_list_remove() function. This function removes the first instance of the specified data from the given list. -
            -list = eina_list_remove(list, "ultrabook");
            -
            -

            You can also remove a "list" (node) from a list using the eina_list_remove_list() function. Pass the list you want to delete an element from and a 'list' (node) you want to delete.

            -
            -Eina_List *app_list = NULL;
            -Eina_List *to_remove = NULL;
            -
            -// Adding some elements to the list (using stringshares)
            -app_list = eina_list_append(app_list, eina_stringshare_add("enna"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("ebird"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("calaos"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("rage"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("terminology"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("enlightenment"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("eyelight"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("ephoto"));
            -
            -// Finding the "list" to remove 
            -to_remove = eina_list_data_find_list(list, eina_string_share_add("enlightenment"));
            -
            -list = eina_list_remove_list(list, to_remove);
            -
            -
          • - -
          • To move elements in a list, you can use various function, such as eina_list_promote_list() that promotes an element to the top of the list or eina_list_demote_list() that puts the specified element at the end of the list. Remember that everything is a list so the second parameter represents the "list" (node) you want to move. Use the functions just like the eina_list_remove_list() function. -
            -list = eina_list_promote_list(list, eina_list_data_find_list(list, "ivi"));
            -
            -
          • -
          • To reverse all the elements of a list, use the eina_list_reverse() function. To obtain a reversed copy of the list while keeping the initial list unchanged, use the eina_list_reverse_clone() function. -
            -Eina_List *rev_copy;
            -
            -app_list = eina_list_reverse(app_list);
            -rev_copy = eina_list_reverse_clone(app_list);
            -
            -
          • -
          • To sort a list, use the eina_list_sort() function. This function takes a list which needs to be sorted, the maximum number of elements to be sorted, and a callback function that compares data. To sort all list elements, set the maximum number of elements to 0. -
            -int sort_cb(const void *d1, const void *d2)
            -{
            -   const char *txt = d1;
            -   const char *txt2 = d2;
            -   if(!txt) return(1);
            -   if(!txt2) return(-1);
            -
            -   return(strcmp(txt, txt2));
            -}
            -
            -extern Eina_List *list;
            -list = eina_list_sort(list, 0, sort_cb);
            -
            -
          • -
          • To merge 2 list into 1, use the eina_list_merge() function. The eina_list_sorted_merge() function merges 2 sorted lists according to the ordering function that you pass as the last argument. -
            -int sort_cb(void *d1, void *d2)
            -{
            -   const char *txt = NULL;
            -   const char *txt2 = NULL;
            -   if(!d1) return(1);
            -   if(!d2) return(-1);
            -
            -   return(strcmp((const char*)d1, (const char*)d2));
            -}
            -
            -Eina_List *sorted1;
            -Eina_List *sorted2;
            -Eina_List *newlist;
            -
            -// Insert some values and sort your lists
            -
            -// Simply merge 2 lists without any process
            -newlist = eina_list_merge(sorted1, sorted2);
            -
            -newlist = eina_list_sorted_merge(sorted1, sorted2, sort_cb);
            -
            -
          • -
          • To split a list, use the eina_list_split_list() function: -
            • The first parameter is the list to split.
            • -
            • The second parameter is the "list" (element) after which the list is split.
            • -
            • The last parameter is the head of the second list.
            -
            -// Original list (left list)
            -Eina_List *list = NULL;
            -
            -// New list (right list)
            -Eina_List *other_list = NULL;
            -
            -// Eina_List (element)
            -Eina_List *l;
            -
            -list = eina_list_append(list, "super tux");
            -list = eina_list_append(list, "frozen bubble");
            -list = eina_list_append(list, "lincity-ng");
            -
            -// Sorting the list (just for fun)
            -list = eina_list_sort(list, 0, cmp_func);
            -
            -// Looking for the 'split' element
            -l = eina_list_search_sorted_list(list, cmp_func, "frozen bubble");
            -
            -// Splitting the list
            -list = eina_list_split_list(list, l, &other_list);
            -
            -
          • -
          • To copy a list, use the eina_list_clone() function. The function copies all the elements in the list in the exact same order. -
            -Eina_List *app_list_copy;
            -
            -app_list_copy = eina_list_clone(app_list);
            -
            -
          • - -
          - - -

          Accessing List Data

          -

          To access list data:

          -
            -
          • To find some data on your list, use the eina_list_data_find() function. Pass the list containing your data as the first parameter and the data you are looking for as the last one. The function returns the found member data pointer if found, NULL otherwise. -

            The eina_list_data_find() function searches the list from the beginning to the end for the first member for which the data pointer is data. If it is found, the data is returned, otherwise NULL is returned. The function only compares pointers, which is why using Eina_Stringshare is very useful with lists, because it always returns the same pointer for the same string.

            -
            -Eina_List *app_list = NULL;
            -const char *res_str;
            -
            -// Adding some elements to the list (using stringshares)
            -app_list = eina_list_append(app_list, eina_stringshare_add("enna"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("ebird"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("calaos"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("rage"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("terminology"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("enlightenment"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("eyelight"));
            -app_list = eina_list_append(app_list, eina_stringshare_add("ephoto"));
            -
            -// Finding the data
            -res_str = eina_list_data_find(list, eina_string_share_add("enlightenment"));
            -if (res_str == eina_stringshare_add("enlightenment"))
            -   printf("Data is present");
            -else
            -   printf("Data not present");
            -
            - -

            The above example returns "Data is present".

            -

            The eina_list_data_find_list() function does the same thing as eina_list_data_find(), but returns an Eina_List. For an example, see the eina_list_remove_list() function.

            -

            You can access the data or a "list" (node) of an Eina_List using the eina_list_nth() and eina_list_nth_list() functions. The first one returns a pointer to the data of the "n" element and the second a pointer to the "list". To access the data of the 3rd element of an Eina_List:

            -
            -const char *res;
            -Eina_List *res_lst;
            -
            -res = eina_list_nth(app_list, 2);
            -res_lst = eina_list_nth_list(app_list, 2);
            -
            - -

            The res variable contains the pointer to the string "calaos". The res_lst variable is the list containing "calaos".

            -
          • - -
          • To search for data in a list, select your function based on whether the list is sorted or unsorted. -
              -
            • To search in an unsorted list, use the eina_list_search_unsorted() function: -
              • The first parameter is the list.
              • -
              • The second parameter is a callback function for comparison.
              • -
              • The last parameter is the data you are looking for.
              - -

              The eina_list_search_unsorted_list() function does the same but returns an "Eina_List".

              - - -

              The following example shows 2 searches using both the eina_list_search_unsorted() and eina_list_search_unsorted_list() functions:

              -
              -int search_list()
              -{
              -   // Declaring the list
              -   Eina_List *list = NULL; 
              -   Eina_List *l;
              -   // Little trick to use strcmp as Eina_Compare_Cb 
              -   Eina_Compare_Cb cmp_func = (Eina_Compare_Cb)strcmp;
              -
              -   void *data;
              -   int cmp_result;
              -
              -   list = eina_list_append(list, "debian");
              -   list = eina_list_append(list, "archlinux");
              -   list = eina_list_append(list, "centos");
              -
              -   data = eina_list_search_unsorted(list, cmp_func, "archlinux");
              -   l = eina_list_search_unsorted_list(list, cmp_func, "archlinux");
              -   if (l->data != data)
              -   {
              -      eina_list_free(list);
              -
              -      return 1;
              -   }
              -
              -   eina_list_free(list);
              -
              -   return 0;
              -}
              -
              - -
            • -
            • To search in sorted lists, use the eina_list_search_sorted_list() and eina_list_search_sorted() functions. They work similarly as the eina_list_search_unsorted() function. -
            • -
            -
          • - - -
          • To get data from a list element, use the eina_list_data_get() function. The function returns the data contained in the given list. - -

            The following example uses the eina_list_next() function to move through the list in a statement.

            -
            -int list_data_set()
            -{
            -   // Declaring the list
            -   Eina_List *list = NULL;
            -   // Eina_List in which to place the elements or lists
            -   Eina_List *l;
            -
            -   void *list_data;
            -
            -   list = eina_list_append(list, eina_stringshare_add("Bertrand"));
            -   list = eina_list_append(list, eina_stringshare_add("Cedric"));
            -   list = eina_list_append(list, eina_stringshare_add("Nicolas"));
            -   list = eina_list_append(list, eina_stringshare_add("Vincent"));
            -   list = eina_list_append(list, eina_stringshare_add("Raoul"));
            -   list = eina_list_append(list, eina_stringshare_add("Fabien"));
            -   list = eina_list_append(list, eina_stringshare_add("Philippe"));
            -   list = eina_list_append(list, eina_stringshare_add("billiob"));
            -
            -   for(l = list; l; l = eina_list_next(l))
            -      // Printing the data returned by eina_list_data_get
            -      printf("%s\n", (char*)eina_list_data_get(l));
            -
            -   EINA_LIST_FREE(list, list_data)
            -      eina_stringshare_del(list_data);
            -
            -   return 0;
            -}
            -
            -
          • - -
          • To move in a list, use the eina_list_last(), eina_list_next(), or eina_list_prev() functions to move to the last, next, or previous element in the list. -

            The following example scrolls backwards starting from the end of the list:

            -
            -for(l = eina_list_last(list); l; l = eina_list_prev(l))
            -   printf("%s\n", (char*)eina_list_data_get(l));
            -
            - -
          • - -
          • To count the list elements, use the eina_list_count() function. The function returns the number of items in a list. -
            -printf("List size: %d\n", eina_list_count(list));
            -
            -
          • -
          • To iterate through an array, you can use various iterators: -
              -
            • To iterate over a list from the beginning to the end, use the EINA_LIST_FOREACH macro: -
              • The first parameter is the list to iterate.
              • -
              • The second parameter is an Eina_List * to hold the current "List" (node).
              • -
              • The last parameter receives the current data during the run.
              - -

              The following example prints the data of each "List" (node) of the list:

              -
              -Eina_List *list = NULL;
              -Eina_List *l;
              -void *list_data;
              -
              -list = eina_list_append(list, "ls");
              -list = eina_list_append(list, "top");
              -list = eina_list_append(list, "rmdir");
              -list = eina_list_append(list, "uname");
              -
              -EINA_LIST_FOREACH(list, l, list_data)
              -   printf("%s\n", (char*)list_data);
              -
              -eina_list_free(list);
              -
              -
            • -
            • To iterate from the last element to the first, use the EINA_LIST_REVERSE_FOREACH macro. It works similarly as EINA_LIST_FOREACH(). -
            • -
            • To iterate over a list from the beginning to the end, you can also use the EINA_LIST_FOREACH_SAFE macro. It is called safe, because it stores the next "List" (node), so you can safely remove the current "List" (node) and continue the iteration. -
              -Eina_List *list;
              -Eina_List *l;
              -Eina_List *l_next;
              -char *data;
              -
              -list = eina_list_append(list, "tizen");
              -list = eina_list_append(list, "tizen");
              -list = eina_list_append(list, "tizen");
              -list = eina_list_append(list, "tizen");
              -
              -// Using EINA_LIST_FOREACH_SAFE to free the elements that match "tizen"
              -
              -EINA_LIST_FOREACH_SAFE(list, l, l_next, data)
              -   if (strcmp(data, "tizen") == 0) 
              -   {
              -      free(data);
              -      list = eina_list_remove_list(list, l);
              -   }
              -
              -
            • - - -
            • To remove each list element while having access to the node's data, use the EINA_LIST_FREE macro. Pass the list and a pointer to hold the current data. -
              -Eina_List *list;
              -char *data;
              -
              -// List is filled
              -
              -EINA_LIST_FREE(list, data)
              -   free(data);
              -
              -
            • -
            -
          • -
          - -

          Using an Inline List

          -

          The Eina_Inlist is a special data type drawn to store nodes pointers in the same memory as data. This way the memory is less fragmented, but operations, such as sort and count, are slower. The Eina_Inlist has its own purpose, but if you do not understand what the purpose is, use the regular Eina_List instead.

          - -

          The Eina_Inlist nodes can be part of a regular Eina_List, simply added with the eina_list_append() or eina_list_prepend() functions.

          - -

          To use the inline list:

          -
            -
          1. Define the structure of the data before creating the inline list: -
            -struct my_struct 
            -{
            -   EINA_INLIST;
            -   int a, b;
            -};
            -
            - -

            The structure is composed of 2 integers, the real data, and the EINA_INLIST type which is composed of 3 pointers defining the inline list structure:

            - -
              -
            • Eina_Inlist * next: next node
            • -
            • Eina_Inlist * prev: previous node
            • -
            • Eina_Inlist * last: last node
            • -
          2. - -
          3. -

            To create the inlist nodes, allocate the memory and use the eina_inlist_append() function:

            -
            • The first parameter is the existing list head or NULL to create a new list. -

              The following example passes NULL to create a new list.

            • -
            • The second parameter is the new list node, and it must not be NULL. -

              You must use the EINA_INLIST_GET() macro to get the inlist object of the datastruct.

            -
            -struct my_struct *d, *cur;
            -Eina_Inlist *list, *itr, *tmp;
            -
            -d = malloc(sizeof(*d));
            -d->a = 1;
            -d->b = 10;
            -
            -list = eina_inlist_append(NULL, EINA_INLIST_GET(d));
            -
            - -

            Repeat this operation for every new node:

            -
            -d = malloc(sizeof(*d));
            -d->a = 2;
            -d->b = 20;
            -list = eina_inlist_append(list, EINA_INLIST_GET(d));
            -
            -
          4. - -
          5. To add data to the inline list: -
            • Put data at the end of the inline list with the eina_inlist_prepend() function: -
              -d = malloc(sizeof(*d));
              -d->a = 3;
              -d->b = 30;
              -list = eina_inlist_prepend(list, EINA_INLIST_GET(d));
              -
              -
            • - -
            • Add a node before or after a given node with the eina_inlist_prepend_relative() and eina_inlist_append_relative() functions. -

              In both functions, the first parameter is the target list, the second is the element you want to add, and the last is the reference element to place data after (in this case). Similarly as in a regular Eina_List, everything is a list, so the last parameter is an Eina_Inlist typed variable.

              -
              d = malloc(sizeof(*d));
              -d->a = 4;
              -d->b = 40;
              -list = eina_inlist_append_relative(list, EINA_INLIST_GET(d), list);
              -
              -
          6. - -
          7. To sort and iterate an inline list, to find and move list elements, and to perform other inline list operations, see the Inline List API.
          8. - -
          9. When the inline list is no longer needed, destroy it by looping over the list to free each EINA_INLIST structure and the data using allocated memory. Use the eina_inlist_remove() function on each node. - -

            In the following example, the EINA_INLIST_CONTAINER_GET() macro returns the container object of an inlist (the EINA_INLIST of my_struct), and the list element is removed and the allocated memory of the container "object" is freed.

            - -
            while (list)
            -{
            -   struct my_struct *aux = EINA_INLIST_CONTAINER_GET(list, struct my_struct);
            -
            -   // Remove the current list element 
            -   list = eina_inlist_remove(list, list);
            -   free(aux);
            -}
            -
            -
          10. - - -
          - -

          Generic Value

          - -

          The Eina_Value object provides generic data storage and access, allowing you to store what you want in one single type of Eina_Value. It is meant for simple data types, providing uniform access and release functions, useful to exchange data preserving their types. The Eina_Value comes with predefined types for numbers, array, list, hash, blob, and structs, and it can convert between data types, including string.

          - -

          The Eina_Value can handle the following types:

          -
            -
          • EINA_VALUE_TYPE_UCHAR: unsigned char
          • -
          • EINA_VALUE_TYPE_USHORT: unsigned short
          • -
          • EINA_VALUE_TYPE_UINT: unsigned int
          • -
          • EINA_VALUE_TYPE_ULONG: unsigned long
          • -
          • EINA_VALUE_TYPE_TIMESTAMP: unsigned long used for timestamps
          • -
          • EINA_VALUE_TYPE_UINT64: unsigned integer of 64 bits
          • -
          • EINA_VALUE_TYPE_CHAR: char
          • -
          • EINA_VALUE_TYPE_SHORT: short
          • -
          • EINA_VALUE_TYPE_INT: int
          • -
          • EINA_VALUE_TYPE_LONG: long
          • -
          • EINA_VALUE_TYPE_INT64: integer of 64 bits
          • -
          • EINA_VALUE_TYPE_FLOAT: float
          • -
          • EINA_VALUE_TYPE_DOUBLE: double
          • -
          • EINA_VALUE_TYPE_STRINGSHARE: stringshared string
          • -
          • EINA_VALUE_TYPE_STRING: string
          • -
          • EINA_VALUE_TYPE_ARRAY: array
          • -
          • EINA_VALUE_TYPE_LIST: list
          • -
          • EINA_VALUE_TYPE_HASH: hash
          • -
          • EINA_VALUE_TYPE_TIMEVAL: 'struct timeval'
          • -
          • EINA_VALUE_TYPE_BLOB: blob of bytes
          • -
          • EINA_VALUE_TYPE_STRUCT: struct
          • -
          - - -

          To set up a generic value:

          -
            -
          1. Declare the necessary variables: -
            -// The Eina_Value itself
            -Eina_Value v;
            -// An integer 
            -int i;
            -// And a char *
            -char *newstr;
            -
            -
          2. - -
          3. To set up an Eina_Value for an integer, use the eina_value_setup() function. The first argument is the Eina_Value and the second is the type. -
            -eina_value_setup(&v, EINA_VALUE_TYPE_INT);
            -
            -
          4. -
          -

          To manage the generic value:

          -
            -
          • To set an integer, use the eina_value_set() function: -
            -eina_value_set(&v, 123);
            -
            -
          • - -
          • To get the value, use the eina_value_get() function. Pass the Eina_Value as the first argument, and a pointer to a variable to store the value (the target variable must have the same type as the Eina_Value). -
            -eina_value_get(&v, &i);
            -printf("v=%d\n", i);
            -
            -

            The above example prints "v=123".

            -
          • - - -
          • To store an Eina_List, use the Eina_Value that corresponds to the EINA_VALUE_TYPE_LIST type. -
          • -
          • To create an Eina_Value_List, use the eina_value_list_setup() function. The function initializes a generic value storage of the list type. The first parameter is the "object" value, and the second one is the type (how to manage the stored list members). -
          • -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/data_types_tools_n.htm b/org.tizen.ui.guides/html/native/efl/data_types_tools_n.htm deleted file mode 100755 index a5bca4a..0000000 --- a/org.tizen.ui.guides/html/native/efl/data_types_tools_n.htm +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - Data Types and Tools: Using Eina Resources - - - -
          -
          -

          Mobile native Wearable native

          -
          - - -
          - -
          - -

          Data Types and Tools: Using Eina Resources

          - -

          UI toolkits, such as Qt and Gtk, generally support their own data types, structures, functions, and macros in order for you to easily and efficiently make their applications. EFL, as one of Tizen native UI toolkits, provides data types and useful tools as well.

          - -

          The Eina library in EFL implements APIs for data types and structures easy to use and optimized in an efficient way. It also provides some useful tools, such as opening shared libraries, error management, type conversion, time accounting, and memory pool to help convenient application development.

          - -

          The main features of Eina are:

          -
            -
          • Data Types

            The Eina library is a central part of the EFL. It implements an API for data types, and allows you to create and manipulate several data types.

          • -
          • Tools

            Eina provides a number of tools, such as string manipulation, that make your life easier when coding applications.

          • -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/datetime_tutorial_wn.htm b/org.tizen.ui.guides/html/native/efl/datetime_tutorial_wn.htm deleted file mode 100755 index 2febe03..0000000 --- a/org.tizen.ui.guides/html/native/efl/datetime_tutorial_wn.htm +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - Creating Wearable Datetimes - - - - - - -
          -

          Creating Wearable Datetimes

          - - -

          This tutorial explains how you can create UI components that allow the user to select a date or time.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - - -

          Creating a Date Picker

          - -

          Use the elm_datetime component to add a date picker style (Year : Month : Day).

          -

          The following example creates the datepicker-styled Datetime and adds it in the conform.

          - -
          -// Add a datepicker style Datetime component
          -datetime = elm_datetime_add(ad->win);
          -evas_object_size_hint_align_set(datetime, EVAS_HINT_FILL, 0.5);
          -evas_object_size_hint_weight_set(datetime, EVAS_HINT_EXPAND, 1.0);
          -elm_object_style_set(datetime, "datepicker_layout");
          -evas_object_show(datetime);
          -
          -elm_object_content_set(ad->conform, datetime);
          -
          - -

          Creating a Time Picker

          -

          Use the elm_datetime component to add a time picker style (Hour(12) : Min : AM/PM, or Hour(24) : Min).

          -

          The following example creates the timepicker-styled Datetime and adds it in the conform.

          - -
          -// Add a timepicker style Datetime component
          -datetime = elm_datetime_add(ad->win);
          -evas_object_size_hint_align_set(datetime, EVAS_HINT_FILL, 0.5);
          -evas_object_size_hint_weight_set(datetime, EVAS_HINT_EXPAND, 1.0);
          -elm_object_style_set(datetime, "timepicker_layout");
          -evas_object_show(datetime);
          -
          -elm_object_content_set(ad->conform, datetime);
          -
          - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/ecore_animation_n.htm b/org.tizen.ui.guides/html/native/efl/ecore_animation_n.htm deleted file mode 100755 index 944e05c..0000000 --- a/org.tizen.ui.guides/html/native/efl/ecore_animation_n.htm +++ /dev/null @@ -1,451 +0,0 @@ - - - - - - - - - - - - - Ecore Animations - - - - - -
          - -

          Ecore Animations

          - -

          Ecore provides a facility for animations called Ecore_Animator. Ecore animators use the Ecore main loop for creating animations, running a specific action on each tick of a timer in the main loop.

          - -

          To create an Ecore animation:

          -
            -
          1. Determine the duration of the animation.
          2. -
          3. Define a callback function that performs the animation with that duration.
          4. -
          - -

          To use Ecore animators in your application, you must include the <Ecore.h> file. This file is included by default if you are already using the <Elementary.h> file in your application. You then declare an Ecore_Animator* variable and use the variable in the ecore_animator_* functions.

          - -

          The following example shows how to create a simple animation with a finite duration:

          - -
          -static Eina_Bool
          -_do_animation(void *data, double pos)
          -{
          -   evas_object_move(data, 100 * pos, 100 * pos);
          -   // Do some more animating...
          -}
          -ecore_animator_timeline_add(2, _do_animation, my_evas_object);
          -
          - -

          In the above example, we create a linear transition to move my_evas_object from position (0,0) to position (100,100) in 2 seconds.

          - -

          Creating an Animation with a Finite Duration

          - -

          Most of the time, you will want to create animations that last for a predefined time.

          - -

          The ecore_animator_timeline_add() function allows you to define an animator that is automatically deleted after the animation is finished:

          - -
          ecore_animator_timeline_add(double runtime, Ecore_Timeline_Cb func, const void *data)
          - -
            -
          • The first argument is the duration of the animation in seconds. The duration is not affected by frame rate.
          • -
          • The second argument is the callback function that performs the animation.
          • -
          • The third argument is the parameter passed to the callback function. This is usually the Evas object to animate.
          • -
          - - - - - - - - - - -
          Note
          The callback function can return ECORE_CALLBACK_RENEW to keep the animator running or ECORE_CALLBACK_CANCEL to stop the animator and have it be deleted automatically at any time. The callback function is also passed a timeline position parameter with a value between 0.0 (start) to 1.0 (end) to indicate where along the timeline the animator is running.
          - -

          The following example performs a linear horizontal translation of 500 pixels in 8 seconds:

          -
          -static Eina_Bool
          -_my_animation(void *data, double pos)
          -{
          -   Evas_Object *obj = data; // Get the target object
          -   int x, y, w, h; // Target object geometry
          -   evas_object_geometry_get(obj, &x, &y, &w, &h); // Get current object position and size attributes
          -   evas_object_move(obj, 500 * pos, y); // Linear translation of the Evas object
          -}
          -ecore_animator_timeline_add(8, _my_animation, my_evas_object);
          -
          - -

          Position Mappings

          - -

          The Ecore_Pos_Map position mappings are used to define the evolution of a given position in accordance with the desired effects. The value ranges from 0.0 to 1.0 on a given timeline. This position variation allows you to apply dynamic changes to any attribute of your Evas object, such as position, width, height, scale, angle, and color.

          - -

          Ecore supports the following position mappings (with the listed v1 and v2 parameters):

          - -
            -
          • ECORE_POS_MAP_LINEAR: linear 0.0 - 1.0 -
              -
            • v1: not used
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_ACCELERATE: start slow, then speed up -
              -
            • v1: not used
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_DECELERATE: start fast, then slow down -
              -
            • v1: not used
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_SINUSOIDAL: start slow, speed up, then slow down at the end -
              -
            • v1: not used
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_ACCELERATE_FACTOR: start slow, then speed up -
              -
            • v1: power factor: 0.0 is linear, 1.0 is standard acceleration, 2.0 is a much more pronounced acceleration (squared), 4.0 is cubed, and so on
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_DECELERATE_FACTOR: start fast, then slow down -
              -
            • v1: power factor: 0.0 is linear, 1.0 is standard deceleration, 2.0 is a much more pronounced deceleration (squared), 3.0 is cubed, and so on
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_SINUSOIDAL_FACTOR: start slow, speed up, then slow down at the end -
              -
            • v1: power factor: 0.0 is linear, 1.0 is a standard sinusoidal, 2.1 is a much more pronounced sinusoidal (squared), 3.0 is cubed, and so on
            • -
            • v2: not used
            • -
            -
          • -
          • ECORE_POS_MAP_DIVISOR_INTERP: start at gradient * v1, interpolated via power of v2 curve -
              -
            • v1: multiplication factor for gradient
            • -
            • v2: curve value
            • -
            -
          • -
          • ECORE_POS_MAP_BOUNCE: start at 0.0, then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with a decay factor of v1 -
              -
            • v1: bounce decay factor
            • -
            • v2: number of bounces
            • -
            -
          • -
          • ECORE_POS_MAP_SPRING: start at 0.0, then "wobble" like a spring until rest position at 1.0, and wobble v2 times, with a decay factor of v1 -
              -
            • v1: wobble decay factor
            • -
            • v2: number of wobbles
            • -
            -
          • -
          - -

          Figure: Position mappings

          -

          Position mappings

          - -

          Using Position Mappings

          -

          When using the animation callback function, the animator passes a timeline position parameter with a value between 0.0 (start) and 1.0 (end) to indicate where along the timeline the animator is running.

          - -

          If you want to create a non-linear animation, map the position value to one of several curves and mappings:

          -
          ecore_animator_pos_map(double pos, Ecore_Pos_Map map, double v1, double v2)
          -
            -
          • The first argument is the current position value, which ranges from 0.0 to 1.0.
          • -
          • The second argument is the position mapping you want to apply.
          • -
          • The third argument is the first parameter (v1) to pass to the position mapping.
          • -
          • The fourth argument is the second parameter (v2) to pass to the position mapping.
          • -
          - - - - - - - - - - -
          Note
          The v1 and v2 arguments are specific to the chosen position mapping. For example, if you are using ECORE_POS_MAP_BOUNCE, v1 represents the bouncing level and v2 the number of bounces.
          - -

          The following example performs a transition that bounces 7 times, diminishing by a factor of 1.8 over 5 seconds:

          - -
          static Eina_Bool
          -_my_animation_callback(void *data, double pos)
          -{
          -   Evas_Object *obj = data; // Get the target object
          -   int x, y, w, h; // Target object geometry
          -   double frame = pos; // Actual position variation
          -   // Get frame relative position depending on desired effect
          -   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
          -   evas_object_geometry_get(obj, &x, &y, &w, &h); // Get current object position and size attributes
          -   evas_object_move(obj, x, 600 * frame); // Move the Evas object according to desired effect
          -
          -   return EINA_TRUE;
          -}
          -ecore_animator_timeline_add(5, _my_animation_callback, my_evas_object);
          - -

          Creating an Infinite Animation

          - -

          If you want the animation to run for an unspecified amount of time, use the ecore_animator_add() function. This function works the same way as the ecore_animation_timeline_add() function, except its interval is based on frame rate. Using frame rate as the basis benefits performance, especially if you define multiple animations, since you may want to have a different timer for each callback function.

          - -
          -ecore_animator_add(Ecore_Task_Cb func, const void *data)
          -
          - -
            -
          • The first argument is the callback function that performs the animation.
          • -
          • The second argument is the parameter passed to the callback function. This is usually the Evas object to animate.
          • -
          - - - - - - - - - - -
          Note
          The function returns a pointer to an Ecore_Animator object, which you can use to adjust the animation.
          - -

          The following example creates a rectangle sliding from left to right and back again. When the rectangle hits one edge of the screen, it changes direction.

          - -
          static Eina_Bool
          -_slide_back_and_forth(void *data)
          -{
          -   typedef enum {LEFT, RIGHT} direction_t; // Direction datatype
          -   static int x = 0; // Initial position
          -   static direction_t direction = RIGHT; // Initial direction
          -   if (x >= 250)
          -      direction = LEFT; // Change direction
          -   else if (x <= 0)
          -      direction = RIGHT; // Change direction
          -   if (direction == RIGHT)
          -      evas_object_move(data, ++x, 350); // Slide to right
          -   else if (direction == LEFT)
          -      evas_object_move(data, --x, 350); // Slide to left
          -
          -   return EINA_TRUE;
          -}
          -int
          -main(int argc, char *argv[])
          -{
          -   // Declarations
          -
          -   // Ecore Evas init
          -
          -   // Draw Evas objects
          -
          -   // Animations go here
          -   anim = ecore_animator_add(_slide_back_and_forth, rectangle);
          -   // Ecore main loop
          -
          -   // Free memory
          -}
          - - - - - - - - - - -
          Note
          To use this code, you have to merge it with the Ecore transition example above.
          - -

          Chaining Animations

          - -

          You may sometimes want to delay animating an object. This can be useful if, for example, you want to start an animation only after another one has finished.

          - -

          You can simply set a delay to the second animation equal to the duration of the first animation:

          - -
          -static int runtime = 5;
          -static int delay = runtime;
          -static Eina_Bool
          -_start_fold_animation(void *data)
          -{
          -   ecore_animator_timeline_add(runtime, _fold_animation, data);
          -
          -   return EINA_FALSE;
          -}
          -static Eina_Bool
          -_start_unfold_animation(void *data)
          -{
          -   ecore_animator_timeline_add(runtime, _unfold_animation, data);
          -
          -   return EINA_FALSE;
          -}
          -_start_fold_animation(my_evas_object);
          -ecore_timer_add(delay, _start_unfold_animation, my_evas_object);
          -
          - -

          Pausing and Resuming Animations

          - -

          You can pause and resume Ecore animations. To pause a running animation, use the ecore_animator_freeze() function:

          - -
          ecore_animator_freeze(Ecore_Animator *animator)
          - -

          The parameter is the Ecore_Animator to pause.

          - -

          To resume the paused animation, use the ecore_animator_thaw() function:

          - -
          ecore_animation_thaw(Ecore_Animator *animator)
          - -

          The parameter is the Ecore_Animator to resume.

          - -

          The following example pauses a transition after 5 seconds and resumes it after 5 more seconds:

          - -
          -static Eina_Bool
          -_freeze_animation(void *data)
          -{
          -   ecore_animator_freeze(data);
          -
          -   return EINA_FALSE;
          -}
          -static Eina_Bool
          -_thaw_animation(void *data)
          -{
          -   ecore_animator_thaw(data);
          -
          -   return EINA_FALSE;
          -}
          -ecore_timer_add(5, _freeze_animation, animator);
          -ecore_timer_add(10, _thaw_animation, animator);
          -
          - -

          Freeing Up Memory

          - -

          When you create an animation that does not have a timeout, you will have to manually free up the memory allocated to the Ecore_Animator object. By comparison, if the animation has a timeout, Ecore implements the mechanisms to automatically delete the animator from the list of pointers: When your animation callback returns 0 or ECORE_CALLBACK_CANCEL, the animator manager takes care of freeing up the allocated memory.

          - -

          To manually free up the memory, delete the pointer by using the ecore_animator_del() function:

          - -
          ecore_animator_del(Ecore_Animator *animator)
          - -

          The argument is the Ecore_Animator whose memory allocation to free up.

          - -

          Regardless of the type of animation, it is good practice to always ensure that the allocated memory is freed up before the program exits:

          - -
          if (animator != NULL)
          -   ecore_animator_del(animator);
          - -

          Frametime

          -

          In most cases, you will want to use the default timer ECORE_ANIMATOR_SOURCE_TIMER. This timer ticks every "frametime" seconds and allows you to perform transitions within a predefined timeline. The timer uses the system clock to tick over every Nth second, with the default being 1/30th of a second.

          - -

          To tweak performance, you can change the frametime value:

          - -
          ecore_animator_frametime_set(double frametime)
          - -

          The argument is the new frametime value.

          - - - - - - - - - - -
          Note
          Too small a value can cause performance issues, whereas too high a value can cause your animation to seem jerky.
          - -

          If you want to get the current frametime value, use the ecore_animator_frametime_get() function.

          - -

          Custom Timer

          - -

          You may want to specify a custom timer to match your animation to third-party events. For example, the filling speed of a progress bar will mainly depend on the time it takes for a task to complete and the velocity at which the remaining time estimation evolves. This kind of animation requires you to use a custom timer.

          - -

          To use a custom timer, first set ECORE_ANIMATOR_SOURCE_CUSTOM as the timer source, and then drive the timer based on an input tick source (such as another application via IPC or a vertical blanking interrupt):

          - -
          ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func, const void *data)
          - -

          The first argument is the callback function to call on the tick start. The second argument is the data to pass to the callback function.

          - -
          ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func, const void *data)
          - -

          The first argument is the callback function to call on the tick end. The second argument is the data to pass to the callback function to set the functions that will be called to start and stop the ticking source.

          - -

          Next, trigger a tick over one frame:

          - -
          ecore_animator_custom_tick(void)
          - -

          The following example supposes a progress bar that will be refreshed every time some progress occurs:

          - -
          ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
          -void _on_progress_update()
          -{
          -   // Called when some progress occurs
          -   ecore_animator_custom_tick(); // Tick (next frame in progress bar animation)
          -}
          - -

          Finally, to get the current animator source, use the ecore_animator_source_get() function.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/ecore_animation_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/ecore_animation_tutorial_n.htm deleted file mode 100755 index dcd1204..0000000 --- a/org.tizen.ui.guides/html/native/efl/ecore_animation_tutorial_n.htm +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - - - - - - - - - Creating Ecore Animations - - - - - - -
          -

          Creating Ecore Animations

          - - -

          This tutorial demonstrates how you can use Ecore animators to simplify the creation of animations. Using Ecore animators, you can manually create your own animations by changing and manipulating Evas object attributes. Ecore animators work like timers, running callback functions over a given duration (an animation timeline).

          - -

          Setting Up the Application

          - -

          In this part of the tutorial, we create a simple application that manipulates and animates an Evas object. We use a "Basic UI Application" as the basis for the application.

          -

          First, we set up the UI components we are going to use in the application:

          - -
          typedef struct appdata 
          -{
          -   // Main window
          -   Evas_Object *win;
          -   // Application title
          -   Evas_Object *label;
          -
          -   // Buttons
          -   Evas_Object *bt1;
          -   Evas_Object *bt2;
          -   Evas_Object *bt3;
          -
          -   // Animation target
          -   Evas_Object *target;
          -} appdata_s;
          -
          - -

          We then create the actual UI components in the create_base_gui() function, starting with the main window and application title:

          - -
          // Main window
          -ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -if (elm_win_wm_rotation_supported_get(ad->win)) 
          -{
          -   int rots[4] = { 0, 90, 180, 270 };
          -   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -}
          -
          -evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -
          -// Application title
          -ad->label = elm_label_add(ad->win);
          -elm_object_text_set(ad->label, "Ecore Animator Tutorial");
          -evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(ad->win, ad->label);
          -evas_object_show(ad->label);
          -
          - -

          Next, we create the animation target, which is an Evas object of type Elm_Image. The image that is used in the source code is stored in the res/images folder of the application. The image that is used in the EDC file is stored in the edje/images folder.

          - -
          // Animation target
          -// Setting the image path
          -char buf[PATH_MAX];
          -snprintf(buf, sizeof(buf), "/opt/usr/apps/%s/res/images/tizen-logo.png", PACKAGE);
          -// Adding the image
          -ad->target = elm_image_add(ad->win);
          -// Setting the image path
          -if (!elm_image_file_set(ad->target, buf, NULL))
          -   printf("error: could not load image \"%s\"\n", buf);
          -evas_object_size_hint_weight_set(ad->target, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -// Moving the image
          -evas_object_move(ad->target, 130, 100);
          -// Resizing the image
          -evas_object_resize(ad->target, 200, 100);
          -// Showing the image
          -evas_object_show(ad->target);
          -
          - -

          All images are available in the /opt/usr/apps/<PACKAGE_NAME>/res/images folder of the application. The package name is defined at the begin of the application code:

          - -
          #if !defined(PACKAGE)
          -#define PACKAGE "org.tizen.ecoreanimator"
          -#endif
          -
          - -

          The image path is set by calling the elm_image_file_set() function. This function takes as arguments the ad->target Evas object and the path of the image file, built with the snprintf() function and stored in a buffer.

          - -
          // Setting the image path
          -char buf[PATH_MAX];
          -snprintf(buf, sizeof(buf), "/opt/usr/apps/%s/res/images/tizen-logo.png", PACKAGE);
          -// Adding the image
          -ad->target = elm_image_add(ad->win);
          -// Setting the image path
          -if (!elm_image_file_set(ad->target, buf, NULL))
          -   printf("error: could not load image \"%s\"\n", buf);
          -evas_object_size_hint_weight_set(ad->target, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -
          - -

          The remaining code moves and resizes the image:

          - -
          //Moving the image
          -evas_object_move(ad->target, 130, 100);
          -//Resizing the image
          -evas_object_resize(ad->target, 200, 100);
          -//Showing the image
          -
          - -

          Creating a Rotation Effect

          - -

          After the animation target is created, we can create the first button and the associated rotation animation:

          - -
          // Button 1
          -ad->bt1 = elm_button_add(ad->win);
          -elm_object_text_set(ad->bt1, "Rotate");
          -evas_object_size_hint_weight_set(ad->bt1, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_move(ad->bt1, 25, 0);
          -evas_object_resize(ad->bt1, 90, 70);
          -evas_object_smart_callback_add(ad->bt1, "clicked", _btn_rotate_cb, ad);
          -evas_object_show(ad->bt1);
          -
          - -

          We create the button for triggering the rotation effect. The button is placed and resized, and associated with the _btn_rotate_cb() callback function. This callback function calls the animation on the animation target.

          - -
          static void _btn_rotate_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   ecore_animator_timeline_add(1, _do_rotate, ad->target);
          -}
          -
          - -

          In this callback function, we create an Ecore animator timeline using the ecore_animator_timeline_add() function. This function adds an animator that runs for a limited time: we run the _do_rotate() animation callback function for 1 second on the ad->target Evas object.

          - -

          Next, we write the animation callback function that actually runs the animation. This callback is an Ecore_Timeline_Cb function, meaning it returns an Eina_Bool value and takes as arguments some data and the current position along the animation timeline (pos).

          - -

          To create the rotation animation, we use an Evas Map. The map handles the necessary map points and allows you to manipulate the target Evas object on the X, Y, and Z axes.

          - -
          static Eina_Bool
          -_do_rotate(void *data, double pos)
          -{
          -   // Get the animation target
          -   Evas_Object *obj = data;
          -   // Declaration of an `Evas_Map`
          -   Evas_Map *m;
          -   // Variables to store the target size and position
          -   int x, y, w, h;
          -
          -   // Getting the size and position of the target
          -   evas_object_geometry_get(obj, &x, &y, &w, &h);
          -   // Creation of an `Evas_Map` of 4 points
          -   m = evas_map_new(4);
          -   // Populate source and destination map points to match exactly object.
          -   evas_map_util_points_populate_from_object(m, obj);
          -   // Create a rotation of 360° with x+(w/2) "x" center and y +(h/2) "y" center.
          -   evas_map_util_rotate(m, 360.0 * pos, x + (w / 2), y + (h / 2));
          -   // Setting the object to "animate" in the `Evas_Map`
          -   evas_object_map_set(obj, m);
          -   // Starting the Animation
          -   evas_object_map_enable_set(obj, EINA_TRUE);
          -   // Free used memory
          -   evas_map_free(m);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          In the animation callback function, we first declare the Evas Map. To implement the rotation, we need to set an X and Y center, so we create 4 integer variables to store the size and position of the target. This information is provided by the evas_object_geometry_get() function, which returns the X and Y coordinates and the weight and height of the target Evas object. Now we have all the required data to build the animation.

          - -

          We create an Evas Map consisting of four points, and we populate these points with the animation target:

          - -
          // Creation of an Evas_Map of 4 points
          -m = evas_map_new(4);
          -// Populate source and destination map points to match the object.
          -evas_map_util_points_populate_from_object(m, obj);
          -
          - -

          Now we can define the rotation using the evas_map_util_rotate() function:

          - -
          // Create a rotation of 360° with x+(w/2) "x" center and y +(h/2) "y" center.
          -evas_map_util_rotate(m, 360.0 * pos, x + (w / 2), y + (h / 2));
          -
          - -

          The animation callback function will be called at several points along the timeline, which is why we multiply the rotation angle (360°) by the timeline position (pos) to get the actual animation angle. If we do not do this, we will never see the animation take place. We then join the target object to the map and run the animation:

          - -
          // Setting the object to "animate" in the Evas Map
          -evas_object_map_set(obj, m);
          -// Starting the Animation
          -evas_object_map_enable_set(obj, EINA_TRUE);
          -
          - -

          Each call to the animation callback function will rotate the object (360 * timeline position) degrees.

          - -

          Finally, we free up the memory allocated to the Evas Map:

          - -
          // Free used memory
          -evas_map_free(m);
          -
          - -

          Creating a Zoom Effect

          - -

          The next animation is a zoom, for which we also use an Evas Map.

          - -

          First, we create the button in the create_base_gui() function:

          - -
          // Button 2
          -ad->bt2 = elm_button_add(ad->win);
          -elm_object_text_set(ad->bt2, "Zoom");
          -evas_object_size_hint_weight_set(ad->bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_move(ad->bt2, 315, 0);
          -evas_object_resize(ad->bt2, 90, 70);
          -evas_object_smart_callback_add(ad->bt2, "clicked", _btn_zoom_cb, ad);
          -evas_object_show(ad->bt2);
          -
          - -

          We then create the button callback function with a new timeline:

          - -
          static void _btn_zoom_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   ecore_animator_timeline_add(1, _do_zoom, ad->target);
          -}
          -
          - -

          Next, we create the _do_zoom() animation callback function, which is almost identical to the _do_rotate() callback function, except that we use the evas_map_util_zoom() function to create the animation:

          - -
          static Eina_Bool
          -_do_zoom(void *data, double pos)
          -{
          -   Evas_Object *obj = data;
          -   Evas_Map *m;
          -   int x, y, w, h;
          -
          -   evas_object_geometry_get(obj, &x, &y, &w, &h);
          -   m = evas_map_new(4);
          -   evas_map_util_points_populate_from_object(m, obj);
          -   evas_map_util_zoom(m, 2 * pos, 2 * pos, x , y);
          -   evas_object_map_set(obj, m);
          -   evas_object_map_enable_set(obj, EINA_TRUE);
          -   evas_map_free(m);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          The evas_map_util_zoom() function takes the following arguments:

          - -
            -
          • The map to change
          • -
          • The horizontal zoom factor
          • -
          • The vertical zoom factor
          • -
          • The horizontal position (X coordinate) of the zooming center
          • -
          • The vertical position (Y coordinate) of the zooming center
          • -
          - -

          Here, we use a horizontal and vertical zoom factor of 2, and the X and Y coordinates of the target as the horizontal and vertical center coordinates.

          - -

          The _do_zoom() callback function is called at several points along the animation timeline, which is why we multiply the horizontal and vertical zoom factor values by the timeline position. Each call will zoom more than the previous one, thereby creating the animation effect.

          - -

          Creating a 3D Rotation Effect

          - -

          The last animation is a 3D rotation. For this one, we are going to rotate the Evas object on all three axes (X, Y, Z).

          - -

          First, we create the button and its callback function:

          - -
          // Button 3
          -ad->bt3 = elm_button_add(ad->win);
          -elm_object_text_set(ad->bt3, "3D");
          -evas_object_size_hint_weight_set(ad->bt3, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_move(ad->bt3, 170, 0);
          -evas_object_resize(ad->bt3, 90, 70);
          -evas_object_smart_callback_add(ad->bt3, "clicked", _btn_3d_cb, ad);
          -evas_object_show(ad->bt3);
          -
          - -
          static void _btn_3d_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   ecore_animator_timeline_add(1, _do_3d, ad->target);
          -}
          -
          - -

          Next, we create the _do_3d() animation callback function, which is very similar to the rotate and zoom callback functions. To create the animation, we use the evas_map_util_3d_rotate() function, which allows you to rotate any Evas object on all three axes.

          - -
          static Eina_Bool
          -_do_3d(void *data, double pos)
          -{
          -   Evas_Object *obj = data;
          -   Evas_Map *m;
          -   int x, y, w, h;
          -
          -   evas_object_geometry_get(obj, &x, &y, &w, &h);
          -   m = evas_map_new(4);
          -   evas_map_util_points_populate_from_object(m, obj);
          -   evas_map_util_3d_rotate(m, pos * 360, pos * 360, pos * 360, x + (w / 3), y + 60, 0);
          -   evas_object_map_set(obj, m);
          -   evas_object_map_enable_set(obj, EINA_TRUE);
          -   evas_map_free(m);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          The evas_map_util_3d_rotate() function takes the following arguments:

          - -
            -
          • The map to change
          • -
          • The angle (0-360°) to rotate around the X axis
          • -
          • The angle (0-360°) to rotate around the Y axis
          • -
          • The angle (0-360°) to rotate around the Z axis
          • -
          • The X coordinate of the rotation center
          • -
          • The Y coordinate of the rotation center
          • -
          • The Z coordinate of the rotation center
          • -
          - -

          Here, we rotate 360 degrees around each axis. The horizontal (X) rotation center is the X position of the target plus its width divided by 2. The vertical (Y) rotation center is the Y position of the target plus 60. The Z rotation center is 0.

          - -

          As with the rotation and zoom animations, we multiply the angles by the timeline position to gently rotate the target on each call to the _do_3d() callback function along the timeline.

          - -

          Creating Drop and Bounce Effects

          - -

          To finish, we add drop and bounce effects to our buttons at application start. To do this, we create one timeline per button after creating the buttons in the create_base_gui() function:

          - -
          ecore_animator_timeline_add(2, _do_drop, ad->bt1);
          -ecore_animator_timeline_add(2.3, _do_drop, ad->bt2);
          -ecore_animator_timeline_add(2.5, _do_drop, ad->bt3);
          -
          - -

          We call the same _do_drop() animation callback function for each timeline. In this callback, instead of using an Evas Map, we simply change the position of the target using the evas_object_move() function:

          - -
          static Eina_Bool
          -_do_drop(void *data, double pos)
          -{
          -   Evas_Object *obj = data;
          -   int x, y, w, h;
          -   double frame = pos;
          -   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 2, 4);
          -
          -   evas_object_geometry_get(obj, &x, &y, &w, &h);
          -   evas_object_move(obj, x, 600 * frame);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          To get the bounce effect, we use the ecore_animator_pos_map() function, which maps an input position from 0.0 to 1.0 along the timeline to a position on a different curve. The curve can be of different types, such as LINEAR, SINUSOIDAL, and BOUNCE. This function takes the following arguments:

          - -
            -
          • The input position to map
          • -
          • The mapping to use (LINEAR, SINUSOIDAL, and so on)
          • -
          • v1, which is the first parameter used by the mapping
          • -
          • v2, which is the second parameter used by the mapping
          • -
          - -

          The ECORE_POS_MAP_BOUNCE map we use starts at 0.0, then drops like a ball bouncing to the ground at 1.0, bouncing v2 times with a decay factor of v1. Here, we bounce 4 times with a decay factor of 2:

          - -
          frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 2, 4);
          -
          - -

          This frame is used in the move function to create the animation. The value increases on each _do_drop() call along the timeline, which produces a nice drop of the buttons from their initial position to 600 pixels on the vertical axis.

          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edc_optimization_n.htm b/org.tizen.ui.guides/html/native/efl/edc_optimization_n.htm deleted file mode 100755 index a7aa126..0000000 --- a/org.tizen.ui.guides/html/native/efl/edc_optimization_n.htm +++ /dev/null @@ -1,556 +0,0 @@ - - - - - - - - - - - - - - Optimizing EDC - - - - - - -
          -

          Optimizing EDC

          - - -

          To optimize EDC:

          - - - -

          Removing Unnecessary Parts

          -

          When you create EDC, there can be obsolete and unnecessary parts. Since they have an effect on performance, remove them.

          - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "bg";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.relative: 0.0 0.0;
          -               rel2.relative: 1.0 1.0;
          -               color: 255 255 255 255;
          -            }
          -         }
          -         part 
          -         { 
          -            name: "new";
          -            type: RECT;
          -            scale: 1;
          -            mouse_events: 1;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 0 255;
          -               rel1.relative: 0.2 0.2;
          -               rel2.relative: 0.8 0.8;
          -            }
          -         }
          -         part 
          -         { 
          -            name: "old";
          -            type: RECT;
          -            scale: 1;
          -            mouse_events: 1;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 0 0 0 0;
          -               rel1.relative: 0.5 0.5;
          -               rel2.relative: 1.0 1.0;
          -            }
          -         }
          -      }
          -   }
          -}
          -
          -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "bg";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.relative: 0.0 0.0;
          -               rel2.relative: 1.0 1.0;
          -               color: 255 255 255 255;
          -            }
          -         }
          -         part 
          -         { 
          -            name: "new";
          -            type: RECT;
          -            scale: 1;
          -            mouse_events: 1;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 0 255;
          -               rel1.relative: 0.2 0.2;
          -               rel2.relative: 0.8 0.8;
          -            }
          -         }  
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -
          -       
          -      }
          -   }
          -}
          -
          - -

          Using Text instead of Textblock

          - -

          The following EDCs lead to the same result. However, use TEXT for the simple texts for high performance apart from using tags or multiple lines.

          - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -collections 
          -{
          -   styles 
          -   {
          -      style 
          -      { 
          -         name: "text_style";
          -         base: "font="Sans" font_size=30 text_class=entry 
          -         color=#0088AA style=shadow,bottom 
          -         shadow_color=#00000080 valign=0.5 ellipsis=1.0 
          -         wrap=none align=center";
          -      }
          -   }
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "text";
          -            type: TEXTBLOCK;
          -            scale: 1;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               text 
          -               {
          -                  style: "text_style";
          -                  text: "TEXT";
          -               }
          -            }
          -         }
          -      }
          -   }
          -}
          -
          -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      part 
          -      { 
          -         name: "simple";
          -         type: TEXT;
          -         scale: 1;
          -         effect: SHADOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            align: 0.5 0.5;
          -            color: 0 136 170 255;
          -            visible: 1;
          -            text 
          -            {
          -               size: 30;
          -               font: "Sans";
          -               text: "TEXT";
          -            }
          -         }
          -      }
          -   }
          -}
          -
          - -

          Compressing Images and Embedding into EDC

          - -

          When you use a fixed image, it is more efficient to call an image within EDC. This save time in accessing the image data and is more suitable for the data size.

          - -
          -collections 
          -{
          -   images 
          -   {
          -      image: "logo.png" COMP;
          -   }
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "logo";
          -            type: IMAGE;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.relative: 0.0 0.0;
          -               rel2.relative: 1.0 1.0;
          -               image.normal: "logo.png";
          -               aspect: 1 1;
          -               aspect_preference: BOTH;
          -            }
          -         }
          -      }
          -   }
          -}
          -
          - -

          Using a Spacer

          -

          When you use a part (such as Padding) which is invisible but has a size, using Spacer is more efficient. Since Spacer is invisible, it does not have the visible and color options.

          - - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "bg";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 255 255;
          -            }         
          -         }
          -         part 
          -         { 
          -            name: "padding_left_top";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 0 0 0 0;
          -               rel1.to: "bg";
          -               rel2.to:"bg";
          -               rel2.relative: 0.0 0.0;
          -               align: 0.0 0.0;               
          -               min: 100 100;        
          -            }
          -         }
          -         part 
          -         { 
          -            name: "padding_right_bottom";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 0 0 0 0;
          -               rel1.to: "bg";
          -               rel1.relative: 1.0 1.0;
          -               rel2.to:"bg";
          -               align: 1.0 1.0;               
          -               min: 100 100;
          -            }         
          -         }
          -         part 
          -         { 
          -            name: "content";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 0 255;
          -               rel1.to: "padding_left_top";
          -               rel1.relative: 1.0 1.0;
          -               rel2.to:"padding_right_bottom";
          -               rel2.relative: 0.0 0.0;
          -            }         
          -         }
          -      }
          -   }
          -}
          -
          -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "bg";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 255 255;
          -            }         
          -         }
          -         part 
          -         { 
          -            name: "padding_left_top";
          -            type: SPACER;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.to: "bg";
          -               rel2.to:"bg";
          -               rel2.relative: 0.0 0.0;
          -               align: 0.0 0.0;               
          -               min: 100 100;
          -            }         
          -         }
          -         part 
          -         { 
          -            name: "padding_right_bottom";
          -            type: SPACER;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.to: "bg";
          -               rel1.relative: 1.0 1.0;
          -               rel2.to:"bg";
          -               align: 1.0 1.0;               
          -               min: 100 100;
          -            }         
          -         }
          -         part 
          -         { 
          -            name: "content";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               color: 255 255 0 255;
          -               rel1.to: "padding_left_top";
          -               rel1.relative: 1.0 1.0;
          -               rel2.to:"padding_right_bottom";
          -               rel2.relative: 0.0 0.0;
          -            }         
          -         }
          -      }
          -   }
          -}
          -
          - -

          Using the Image Border Feature

          - -

          When you use an image, you do not need to use a full size or larger size image. As you can see below, it is much more efficient to scale the image using a border option.

          - - - - - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -collections 
          -{
          -   images 
          -   {
          -      image: "test.png" COMP;
          -   }
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "test";
          -            type: IMAGE;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.relative: 0.2 0.2;
          -               rel2.relative: 0.8 0.8;
          -               image.normal: "test.png";
          -
          -            }
          -         }
          -      }
          -   }
          -}
          -
          -
          -collections 
          -{
          -   images 
          -   {
          -      image: "test.png" COMP;
          -   }
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "test";
          -            type: IMAGE;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               rel1.relative: 0.2 0.2;
          -               rel2.relative: 0.8 0.8;
          -               image.normal: "test.png";
          -               image.border: 5 5 5 5;
          -            }
          -         }
          -      }
          -   }
          -}
          -

          Image before

          Image after

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edc_part_block_n.htm b/org.tizen.ui.guides/html/native/efl/edc_part_block_n.htm deleted file mode 100755 index 4b2c935..0000000 --- a/org.tizen.ui.guides/html/native/efl/edc_part_block_n.htm +++ /dev/null @@ -1,2080 +0,0 @@ - - - - - - - - - - - - - EDJE Data Collection Reference - - - - - -
          - -

          EDJE Data Collection Reference

          - - - -

          Edje Blocks

          - -

          A typical Edje file starts with the following definitions:

          - -
          -images {}
          -fonts {}
          -color_classes {}
          -styles {}
          -collections 
          -{
          -   sounds 
          -   {
          -      tone: "tone-1" 2300;
          -      tone: "tone-2" 2300;
          -      sample 
          -      {
          -         name: "sound1" RAW;
          -         source: "sound_file1.wav";
          -      }
          -   }
          -   group {}
          -   group {}
          -}
          -
          - -

          To get more details above each sub-block, click on the links inside the collections block above.

          - - - - - - - - - - -
          Note
          This guide is based on original work from Andres Blanc (dresb) andresblanc@gmail.com, it has been heavily expanded and edited since then.
          - -

          Images Block

          - -
          -images 
          -{
          -   image: "filename1.ext" COMP;
          -   image: "filename2.ext" LOSSY 99;
          -   set {}
          -   set {}
          -}
          -
          - -

          The images 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. Besides the document's root, additional images blocks can be included inside other blocks, usually collections, group, and part. This makes file list maintenance easier when the theme is split among multiple files.

          - -
            -
          • image [image file] [compression method] (compression level) -

            This is included in each image file. The full path to the directory holding the images can be defined later with edje_cc's "-id" option. Available compression methods are:

            -
              -
            • RAW: Uncompressed
            • -
            • COMP: Lossless compression
            • -
            • LOSSY [0-100]: JPEG lossy compression with quality from 0 to 100
            • -
            • USER: Not embedded to the file, refer to the external file instead
            • -
            -
          • -
          - -

          Images.set Block

          - -
          -set 
          -{
          -   name: "image_name_used";
          -   image {}
          -   image {}
          -}
          -
          - -

          The set block is used to define an image with different content depending on their size. Besides the document's root, additional set blocks can be included inside other blocks, normally collections, group, and part. This makes file list maintenance easier when the theme is split among multiple files.

          - -
            -
          • name [image name] -

            Defines the name that refer to this image description.

            -
          • -
          - -

          Images.set.image Block

          - -
          -image 
          -{
          -   image: "filename4.ext" COMP;
          -   size: 51 51 200 200;
          -   border: 0 0 0 0;
          -   border_scale_by: 0.0;
          -}
          -
          - -

          The image block inside a set block defines the characteristic of an image. Every block describes one image and the size rule to use it.

          - -

          For full documentation, see Image.

          - -
            -
          • image [image file] [compression method] (compression level) -

            This is included in each image file. The full path to the directory holding the images can be defined later with edje_cc's -id option. Available compression methods are:

            -
              -
            • RAW: Uncompressed
            • -
            • COMP: Lossless compression
            • -
            • LOSSY [0-100]: JPEG lossy compression with quality from 0 to 100
            • -
            • USER: Not embedded to the file, refer to the external file instead
            • -
            -
          • -
          • size [minw] [minh] [maxw] [maxh] -

            Defines the minimum and maximum size that selects the specified image.

            -
          • -
          • border [left] [right] [top] [bottom] -

            If set, the area (in pixels) of each side of the image is displayed as a fixed size border, from the side to inwards, preventing the corners from being changed on a resize.

            -
          • -
          • border_scale_by [value] -

            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 the exact 3 columns of output, or at scale 2.0 they will be 6 columns, or 0.33 they will merge into a single column). This property multiplies the input scale factor by this multiplier, allowing the creation of supersampled borders to make much higher resolution outputs possible by always using the highest resolution artwork and then runtime scaling it down. Valid values are: 0.0 or bigger (0.0 or 1.0 to turn it off).

            -
          • -
          - -

          Fonts Block

          - -
          -fonts 
          -{
          -   font: "filename1.ext" "fontname";
          -   font: "filename2.ext" "otherfontname";
          -}
          -
          - -

          The fonts block is used to list each font file with an alias used later in the theme. As with the images block, additional fonts blocks can be included inside other blocks.

          - -
            -
          • font [font filename] [font alias] -

            Defines each font file and alias, the full path to the directory containing the font files can be defined with edje_cc's -fd option. -

          • -
          - -

          Data Block

          - -
          -data 
          -{
          -   item: "key" "value";
          -   file: "otherkey" "filename.ext";
          -}
          -
          - -

          This block behaves in the same way as the data block inside the parts, only the use-cases are different: this is useful for data that is for the whole theme, for instance license information, version, authors, and so on.

          - -

          Color_classes Block

          - -
          -color_classes 
          -{
          -   color_class 
          -   {
          -      name: "colorclassname";
          -      color: [0-255] [0-255] [0-255] [0-255];
          -      color2: [0-255] [0-255] [0-255] [0-255];
          -      color3: [0-255] [0-255] [0-255] [0-255];
          -   }
          -}
          -
          - -

          The color_classes block contains a list of one or more color_class blocks. Each color_class allows the designer 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.

          - -
            -
          • name [color class name] -

            Sets the name for the color class, used as reference by both the theme and the application.

            -
          • - -
          • color [red] [green] [blue] [alpha] -

            The main color.

            -
          • - -
          • color2 [red] [green] [blue] [alpha] -

            Used as outline in text and textblock parts.

            -
          • - -
          • color3 [red] [green] [blue] [alpha] -

            Used as shadow in text and textblock parts.

            -
          • -
          - -

          Styles Block

          - -
          -styles 
          -{
          -   style 
          -   {
          -      name: "stylename";
          -      base: "..default style properties..";
          -      tag: "tagname" "..style properties..";
          -   }
          -}
          -
          - -

          The styles block contains a list of one or more style blocks. A style block is used to create style <tags> for advanced TEXTBLOCK formatting.

          - -
            -
          • name [style name] -

            The name of the style to be used as reference later in the theme.

            -
          • - -
          • base [style properties string] -

            The default style properties that is applied to the complete text. The available tags that can be used in the style property are the following:

            -
              -
            • font
            • -
            • font_size - - - - - - - - - -
              Note
              The font size is a point size, and the size of the rendered text is affected by the ppi information. The system basic ppi is 96, and you can change it on the Emulator menu.
              - -
            • -
            • color
            • -
            • color_class
            • -
            • text_class
            • -
            • ellipsis
            • -
            • wrap
            • -
            • style
            • -
            • valign
            • -
            • align
            • - -
            - -
          • - -
          • tag [tag name] [style properties string] -

            Style to be applied only to text between style <tags>..</tags>. When creating paired tags, like <bold></bold>, a '+' sign must be added at the start of the style properties of the first part (<bold>). If the second part (</bold>) is also defined, a '-' sign must be added to its style properties. This applies only to paired tags; single tags, like <tab>, must not have a starting '+'.

            -
              -
            • br
            • -
            • tab
            • -
            • b
            • -
            • match
            • -
            - -
          • -
          - -

          The following code is the sample of a text style for the text style:

          - -
          -style 
          -{ 
          -   name: "list_text_main";
          -   base: "font=Tizen:style=Regular font_size=30 color=#ffffff ellipsis=1.0";
          -   tag: "br" "\n";\
          -   tag: "ps" "ps";\
          -   tag: "tab" "\t";\
          -   tag: "b" "+ font_weight=Bold";
          -}
          -
          - - - -

          Collections Block

          - -
          -collections 
          -{
          -   base_scale: 1.8;
          -   sounds 
          -   {
          -      tone: "tone-1" 2300;
          -      tone: "tone-2" 440;
          -      sample 
          -      {
          -         name: "sound_file1" RAW;
          -         source: "sound_file1.wav";
          -      }
          -   }
          -   group 
          -   {
          -      name: "groupname";
          -      alias: "anothername;"
          -      min: width height;
          -      max: width height;
          -      parts {}
          -      scripts {}
          -      limits {}
          -      data {}
          -      programs {}
          -   }
          -}
          -
          - -

          The collections block is used to list the groups that compose the theme. Additional collections blocks do not prevent overriding group names.

          - -

          The sounds block contains a list of one or more sound sample and tone items.

          - -

          Base Scale

          - -
            -
          • base_scale: [scale factor] -

            Information about the scale factor in the edc file.

            -
          • -
          - -

          Object scaling must be defined in the config.xml file of this application to show the application in a proper size in other devices. However, the scaling must be based on the scale 1.0 or, if the application is based on another scale, this scale must be defined in the config.xml file. This predefined scale is called the "base scale".

          - -

          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.

          - -

          For more information about supporting multiple screens in one edc, see the Multiple Screen Support guide.

          - - -

          Sounds Block

          - -

          -
            -
          • tone [tone name] [frequency] -

            A sound of the given frequency.

            -
          • -
          - - -

          Sounds.sample Block

          - -

          The sample block defines the sound sample.

          - -

          -
            -
          • name [sample name] [compression type] (quality) -

            Used to include each sound file. The full path to the directory holding the sounds can be defined later with edje_cc's -sd option. Valid types are:

            -
              -
            • RAW: Uncompressed
            • -
            • COMP: Lossless compression
            • -
            • LOSSY [-0.1 - 1.0]: Lossy compression with quality from 0.0 to 1.0
            • -
            • AS_IS: No compression or encoding, write the file information as it is
            • -
            -
          • -
          - -

          -
            -
          • source [file name] -

            The sound source file name (source can be mono/stereo WAV file. Only files with 44.1 KHz sample rate are supported for now).

            -
          • -
          - - -

          Group Block

          - -
          -group 
          -{
          -   name: "nameusedbytheapplication";
          -   alias: "anothername";
          -   min: width height;
          -   max: width height;
          -   parts 
          -   {
          -      <definitions of parts>
          -   }
          -   script 
          -   {
          -      <embryo script>
          -   }
          -   limits 
          -   {
          -      vertical: "limit_name" height_barrier;
          -      horizontal: "limit_name" width_barrier;
          -   }
          -   data 
          -   {
          -      items: "key" "value";
          -      file: "key" "file";
          -   }
          -   programs {}
          -}
          -
          - -

          Group

          - -

          A group block contains the list of parts and programs that compose a given Edje Object.

          - -
            -
          • name [group name] -

            The name that is used by the application to load the resulting Edje object and to identify the group to swallow in a GROUP part. If a group with the same name exists already it will be completely overridden by the new group.

            -
          • - -
          • inherit_only [1 or 0] -

            This flags the group as being used only for inheriting, which will inhibit edje_cc resolving of programs and parts that may not exist in this group, but are located in the group which is inheriting this group.

            -
          • - -
          • inherit [parent group name] -

            Parent group name for inheritance. 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. If you specify the type again in an inherited part, it causes an error.

            - - - - - - - - - -
            Note
            When inheriting any parts, descriptions without state names are not allowed.
            -
          • - -
          • script_recursion [1/0] -

            This flag (1 or 0) determines whether to error on unsafe calls when recursively running Embryo programs. For example, running an Embryo script which calls EDC that has a script{} block is unsafe, and the outer-most (first) Embryo stack is corrupted. It is strongly unadvisable to use this flag.

          • - -
          • alias [additional group name] -

            Additional name to be used as an identifier. Defining multiple aliases is supported.

            -
          • - -
          • min [width] [height] -

            The minimum size for the container defined by the composition of the parts. It is not enforced.

            -
          • - -
          • max [width] [height] -

            The maximum size for the container defined by the totality of the parts. It is not enforced.

            -
          • - -
          • broadcast_signal [on/off] -

            Signal gets automatically broadcasted to all sub group parts. Default is "true".

            -
          • - -
          • orientation [AUTO/LTR/RTL] -

            This defines GROUP orientation. It is useful if you want match interface orientation with language.

            -
              -
            • AUTO: Follow system defaults
            • -
            • LTR: Used in Left To Right Languages (Latin)
            • -
            • RTL: Used in Right To Left Languages (Hebrew, Arabic interface)
            • -
            -
          • - -
          • mouse_events [1 or 0] -

            Changes the default value of mouse_events for every part in this group. Default is "1", to maintain compatibility.

            -
          • - -
          • program_source [source name] -

            Change the default value of source for every program in the current group which is declared after this value is set. Defaults to an unset value to maintain compatibility. The name of source can be set on every program, but if the name can be defined in the group level, it reduces the effort to indicate it in every program.

            -
          • -
          - -

          Group.parts

          - -
          -parts 
          -{
          -   part {}
          -   part {}
          -   part {}
          -}
          -
          - -

          The parts group contain one or more part. Each part describes a visual element and has a type: text, image, table, etc.

          - -

          For complete documentation, see the Part Block guide.

          - -

          Group.script

          - -
          -group 
          -{
          -   script 
          -   {
          -      <embryo script>
          -   }
          -   program 
          -   {
          -      script 
          -      {
          -         <embryo script>
          -      }
          -   }
          -}
          -
          - -

          This 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.

          - -

          For more information, see the Program guide.

          - -

          Group.limits

          - -
          -limits 
          -{
          -   vertical: "limit_name" height_barrier;
          -   horizontal: "limit_name" width_barrier;
          -}
          -
          - -

          This block is used to trigger signals when the Edje object is resized.

          -

          -
            -
          • vertical [name] [height barrier] -

            This sends a signal limit,name,over when the object is resized and passes the limit by growing over it. When the object's size is reduced below the limit, signal limit,name,below is sent. This limit is applied on the y axis and is given in pixels.

            -
          • -
          - -

          -
            -
          • horizontal [name] [width barrier] -

            This sends a signal limit,name,over when the object is resized and passes the limit by growing over it. When the object's size is reduced below the limit, signal limit,name,below is sent. This limit is applied on the x axis and is given in pixels.

            -
          • -
          - -

          Group.data

          - -
          -data 
          -{
          -   item: "key" "value";
          -   file: "key2" "somefile";
          -}
          -
          - -

          The data block is used to pass arbitrary parameters from the theme to the application. Unlike the images and fonts blocks, additional data blocks can only be included inside the group block.

          - -
            -
          • items: "key" "value"; -

            Defines a new parameter, the value is the string specified next to it.

            -
          • -
          • file: "key" "file"; -

            Defines a new parameter, the value is the contents of the specified file formatted as a single string of text. This property only works with plain text files.

            -
          • -
          - - - - - - - - - - -
          Note
          For genlist item styles, keys must be texts and icons, respectively for text parts and swallow parts; values must the names of the parts, separated with spaces.
          - -

          Group.programs

          - -
          -programs 
          -{
          -   program {}
          -   program {}
          -   program {}
          -}
          -
          - -

          The programs group contain one or more program.

          - -

          For more information about the program structure, see the Program guide.

          - - -

          Part Block

          - -
          -part 
          -{
          -   // inherit all the fields of another part
          -   inherit: "partname";
          -   // name the part
          -   name: "partname";
          -   // set the part type
          -   type: IMAGE;
          -   // enable mouse events on the part
          -   mouse_events: 0/1;
          -   // repeat mouse events to parts below the current one
          -   repeat_events: 0/1;
          -   ignore_flags: NONE;
          -   // whether the part sizes scale with the edje scaling factor
          -   scale: 0/1;
          -   // whether fully-transparent pixels are taken into account for collision detection
          -   precise_is_inside: 0/1;
          -   // only render the area of the part that coincides with the given part
          -   clip_to: "anotherpart";
          -   // for group/textblock parts: swallow the given group (for textblock: goes below text)
          -   source: "groupname";
          -   // same as source but goes on top of text
          -   source2: "groupname";
          -   // for textblock parts: swallow the given group below the mouse cursor when it hovers over the part
          -   source3: "groupname";
          -   // same as source3 but goes on top of the cursor
          -   source4: "groupname";
          -   // for textblock parts: swallow the given group below text anchors (<a>...</a>)
          -   source5: "groupname";
          -   // same as source5 but goes on to top of the anchor
          -   source6: "groupname";
          -   // add a shadow effect to the part
          -   effect: SOFT_SHADOW (BOTTOM_RIGHT);
          -   // for textblock parts: makes the text editable, possibly with a specific behavior
          -   entry_mode: PASSWORD;
          -   // for textblock parts: change how the tex selection is triggered
          -   select_mode: EXPLICIT;
          -   // for editable textblock parts: where to draw the (blinking) cursor
          -   cursor_mode: UNDER;
          -   // for editable textblock parts: allow multiple lines
          -   multiline: 0/1;
          -   // for textblock parts: accessibility features will be used
          -   access: 0/1;
          -   // no-one uses that
          -   pointer_mode: AUTOGRAB;
          -   use_alternate_font_metrics: 0/1;
          -   // remove the given program; useful when it was inherited
          -   program_remove: "programname";
          -   // remove the given part; useful when it was inherited
          -   part_remove: "partname";
          -   // insert the current part below the given part, as if it were declared before
          -   insert_before: "partname";
          -   // insert the current part above the given part, as if it were declared after
          -   insert_after: "partname";
          -   // define a new part inside this one
          -   part 
          -   {
          -      <part definition>
          -   }
          -   draggable 
          -   {
          -      // confine the current part to the given part
          -      confine: "another part";
          -      // only start drag when it would have moved enough to be outside of the given part
          -      threshold: "another part";
          -      // forward drag events to the given part instead of handling them
          -      events: "another draggable part";
          -      // enable horizontal drag of the part with steps each step_size or with steps_count steps
          -      x: 0/1 <step_size> <steps_count>;
          -      // same as x but vertical
          -      y: 1 0 100;
          -   }
          -   // for box or table parts
          -   box/table 
          -   {
          -      // list of items
          -      items 
          -      {
          -         item 
          -         {
          -            // define item type, can only be GROUP
          -            type: GROUP;
          -            // name the item
          -            name: "name";
          -            // set the source for this item, i.e. its contents
          -            source: "groupname";
          -            // minimum horizontal and vertical item sizes (-1 for expand)
          -            min: -1 -1;
          -            // maximum horizontal and vertical item sizes (-1 for ignore)
          -            max: 100 100;
          -            // set the item padding in pixels
          -            padding: 2 2 2 2;
          -            spread: 1 1;
          -            // set the item alignment
          -            align: 0.5 0.5;
          -            // set a weight hint in the box for the given object
          -            weight: 1 1;
          -            // set the aspect ratio hint
          -            aspect: 1 1;
          -            aspect_mode: BOTH;
          -            // number of columns and rows the item will take
          -            span: 1 1;
          -         }
          -      }
          -   }
          -   description 
          -   {
          -      // inherit another description
          -      inherit: "default" 1.0;
          -      // name the current description
          -      state: "default" 1.0;
          -      // use another part as content of the current "PROXY" part (This description only works in the PROXY part and the current part mirrors the rendering content of the source part)
          -      source: "partname";
          -      // make the part (in)visible (invisible parts emit no signals)
          -      visible: 0/1;
          -      // emit a signal when the given dimension becomes zero or stops being zero
          -      limit: WIDTH;
          -      // horizontal and vertical alignment of the part inside its parent
          -      align: 0.5 0.5;
          -      // set that the part does not change size
          -      fixed: 0/1 0/1;
          -      // set the minimum size for the part
          -      min: 200 200;
          -      // forcibly multiply the minimum sizes by the given factors
          -      minmul: 1.2 1.2;
          -      // set the maximum size for the part
          -      max: 400 400;
          -      // make vertical and horizontal resizes happen in steps
          -      step: 0 0;
          -      // force aspect ratio to be kept between min and max between resizes
          -      aspect: 0.8 1.2;
          -      // the dimension to which the aspect ratio applies
          -      aspect_preference: BOTH;
          -      // use the given color class which can be used to factor font colors
          -      color_class: "colorclassname";
          -      // set the text color
          -      color: 255 0 0 255;
          -      // set the color of the text's shadow
          -      color2: 0 255 0 255;
          -      // set the color of the text's outline
          -      color3: 0 0 255 255;
          -      // define the positions of the top-left (rel1) and bottom-right (rel2) corners
          -      rel1/rel2 
          -      {
          -         // make relative and offset use the given part for their positioning
          -         to: "partname";
          -         // position the corner relative to the part given through to (0.0 being axis beginning, 1.0 being its end)
          -         relative: 0.1 0.1;
          -         // add an absolute offset (in pixels) along each axis
          -         offset: 10 10;
          -         // same as to but only for the x axis
          -         to_x: "partname";
          -         // same as to but only for the y axis
          -         to_y: "partname";
          -      }
          -      // settings specific to parts of type image
          -      image 
          -      {
          -         // name (not path) of the regular image
          -         normal: "imagename";
          -         // image to use while transitioning to the normal image; use several times to create animations
          -         tween: "imagename2";
          -         // set the number of pixels that make up each border of the image, i.e. are not resized when the image is
          -         border: 4 4 4 4;
          -         // hide, strip from its alpha or show (default) the non-border part of the image
          -         middle: DEFAULT;
          -         border_scale_by: 1.0;
          -         // whether to scale the border or not
          -         border_scale: 0/1;
          -         scale_hint: STATIC;
          -         // set how the image is going to fill its part
          -         fill: 
          -         {
          -            // whether to smooth the image when scaling it
          -            smooth: 0/1;
          -            spread: ??;
          -            // whether to scale or tile to fit when resizing the image is needed
          -            type: SCALE/TILE;
          -            // only display the part of the image that is below and to the right of the given point
          -            origin 
          -            {
          -               // specify top-left point as relative coordinates
          -               relative: 0.1 0.1;
          -               // specify top-left point as a pixel offset
          -               offset: 10 10;
          -            }
          -            // specify bottom-right point as relative coordinates
          -            size 
          -            {
          -               relative: 0.1 0.1;
          -               // specify bottom-right point as a pixel offset
          -               offset: 10 10;
          -            }
          -         }
          -      }
          -      // settings specific to parts of type text and textblock
          -      text 
          -      {
          -         // set the part's text
          -         text: "some text";
          -         // set the text's font
          -         font: "Tizen Sans";
          -         // set the text's size
          -         size: 14;
          -         // set the text's class which can be used to factor font and font-size settings
          -         text_class: "classname";
          -         // use the styles defined in stylename
          -         style: "stylename";
          -         // for textblocks in password mode, replace characters to hide with this string
          -         repch: "*";
          -         // set the min and max font sizes allowed when resizing (default is 0 0, i.e. unrestricted)
          -         size_range: 6 18;
          -         // increase font size as much as possible while still remaining in the container for both axis
          -         fit: 0/1 0/1;
          -         // make the min size of the container equal to the min size of the current text (0 0 by default)
          -         min: 0/1 0/1;
          -         // make the max size of the container equal to the max size of the current text (0 0 by default)
          -         max: 0/1 0/1;
          -         // set the vertical and horizontal alignments of the text
          -         align: 0.5 0.5;
          -         // re-use the text of another part
          -         text_source: "partname";
          -         // when text is too long to fit, relative position at which to cut the text and put an ellipsis ("...")
          -         ellipsis: 0.9;
          -      }
          -      // settings specific to parts of type box
          -      box 
          -      {
          -         // set how children while be arranged in the box
          -         layout: horizontal_homogeneous;
          -         // set the vertical and horizontal alignments of box
          -         align: 0.5 0.5;
          -         // set the padding between items of the box
          -         padding: 1 1;
          -         // make the box' min size be the min size of its elements (i.e. make it shrinkable as much as its items)
          -         min: 0 1;
          -      }
          -      table 
          -      {
          -         // make items homogeneous
          -         homogeneous: NONE;
          -         // set the vertical and horizontal alignments of box
          -         align: 0.5 0.5;
          -         // set the padding between items of the box
          -         padding: 1 1;
          -         // make the table's min size be the min size of its elements (i.e. make it shrinkable as much as its items)
          -         min: 0 1;
          -      }
          -      map 
          -      {
          -         perspective: "partname";
          -         light: "partname";
          -         on: 0/1;
          -         smooth: 0/1;
          -         alpha: 0/1;
          -         backface_cull: 0/1;
          -         perspective_on: 0/1;
          -         color: 0/1;
          -         rotation 
          -         {
          -            center: "partname";
          -            x: 45;
          -            y: 120;
          -            z: 90;
          -         }
          -         perspective 
          -         {
          -            zplane: 0/1;
          -            focal: 20;
          -         }
          -         // simpler syntax to create transitions to the current part
          -         link 
          -         {
          -            base: "edje,signal" "edje";
          -         }
          -      }
          -   }
          -}
          -
          - -

          Part

          - -
          -part 
          -{
          -   name: "partname";
          -   type: IMAGE;
          -   mouse_events:  1;
          -   repeat_events: 0;
          -   ignore_flags: NONE;
          -   clip_to: "anotherpart";
          -   source:  "groupname";
          -   pointer_mode: AUTOGRAB;
          -   use_alternate_font_metrics: 0;
          -
          -   dragable {}
          -   items {}
          -   description {}
          -}
          -
          - -

          Parts are used to represent the most basic design elements of the theme, for example, a part can represent a line in a border or a label on a button.

          - -
            -
          • inherit [part name] -

            Copies all attributes except part name from referenced part into current part. All existing attributes, except part name, are overwritten.

            - - - - - - - - - -
            Note
            When inheriting any parts, descriptions without state names are not allowed.
            -
          • - -
          • program_remove [program name] (program name) (program name) ... -

            Removes the listed programs from an inherited group. Removing non-existing programs is not allowed.

            - - - - - - - - - -
            Note
            This breaks program sequences if a program in the middle of the sequence is removed.
            -
          • - -
          • part_remove [part name] (part name) (part name) ... -

            Removes the listed parts from an inherited group. Removing non-existing parts is not allowed.

            -
          • - -
          • name [part name] -

            The part's name is used as reference in the theme's relative positioning system, by programs and in some cases by the application. It must be unique within the group.

            -
          • - -
          • type [TYPE] -

            Sets the type. This is set to IMAGE by default. Valid types are:

            -
              -
            • RECT: Rectangle object in the screen
            • -
            • TEXT: Simple text
            • -
            • IMAGE: Image area
            • -
            • SWALLOW: Area where you can add the object
            • -
            • TEXTBLOCK: Complex text with multiple lines, mark-up elements, and such.
            • -
            • GROUP: Part which can include other groups in the same group.
            • -
            • BOX: Container object as a container. It has a row or column.
            • -
            • TABLE: Container object as a container. It has a row and column.
            • -
            • PROXY: Clone of another part in the same group. It shares the memory of the source part.
            • - -
            • SPACER: Rectangle object, but invisible. Recommended to padding because it does not allocate any memory.
            • - -
            -
          • - -
          • part [part declaration] -

            Nested parts adds hierarchy to Edje. Nested part inherits its location relatively to the parent part. To declare a nested part create a new part within current part declaration. Define parent part name before adding nested parts.

            -
            -part 
            -{
            -   name: "parent_rect";
            -   type: RECT;
            -   description {}
            -   part 
            -   {
            -      name: "nested_rect";
            -      type: RECT;
            -      description {}
            -   }
            -}
            -
            -
          • - -
          • insert_before [another part's name] -

            The part's name which this part is inserted before. One part cannot have both insert_before and insert_after. One part cannot refer more than one by insert_before.

            -
          • - -
          • insert_after [another part's name] -

            The part's name which this part is inserted after. One part cannot have both insert_before and insert_after. One part cannot refer more than one by insert_after.

            -
          • - -
          • mouse_events [1 or 0] -

            Specifies whether the part emits signals, although it is named mouse_events. Disabling it (0) prevents the part from emitting signal. It is set to 1 by default, or to the value set to mouse_events at the group level, if any.

            -
          • - -
          • repeat_events [1 or 0] -

            Specifies whether a part echoes a mouse event to other parts below the pointer (1), or not (0). It is set to 0 by default.

            -
          • - -
          • ignore_flags [FLAG] ... -

            Specifies whether events with the given flags are ignored, i.e., do not emit signals to the parts. Multiple flags must be separated by spaces, the effect is ignoring all events with one of the flags specified. Possible flags are:

            -
              -
            • NONE: Event is handled properly (default value)
            • -
            • ON_HOLD: Event is not handled or passed in this part
            • - -
            -
          • - -
          • scale [1 or 0] -

            Specifies whether the part scales its size with an Edje scaling factor. By default scale is off (0) and the default scale factor is 1.0 which means no scaling. 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. The reason to be selective is that some parts are scaled well, others are not, so choose what works best.

            -
          • - -
          • pointer_mode [MODE] -

            Sets the mouse pointer behavior for a given part. The default value is AUTOGRAB. Available modes are:

            -
              -
            • AUTOGRAB, when the part is clicked and the button remains pressed, the part is the source of all future mouse signals emitted, even outside the object, until the button is released.
            • -
            • NOGRAB, the effect is limited to the part's container.
            • -
            -
          • - -
          • precise_is_inside [1 or 0] -

            Enables precise point collision detection for the part, which is more resource-intensive. It is disabled by default.

            -
          • - -
          • use_alternate_font_metrics [1 or 0] -

            Only affects text and textblock parts, when enabled Edje uses different size measurement functions. It is disabled by default.

            -
          • - -
          • clip_to [another part's name] -

            Only renders the area of part that coincides with another part's container. Overflowing content is not displayed. Note that the part being clipped to can only be a rectangle part.

            -
          • - -
          • source [another group's name] -

            Only available to GROUP or TEXTBLOCK parts. Swallows the specified group into the part's container if it is a GROUP. If TEXTBLOCK it is used for the group to be loaded and used for selection display UNDER the selected text. source2 is used for on top of the selected text, if source2 is specified.

            -
          • - -
          • source2 [another group's name] -

            Only available to TEXTBLOCK parts. It is used for the group to be loaded and used for selection display OVER the selected text. source is used for under of the selected text, if source is specified.

            -
          • - -
          • source3 [another group's name] -

            Only available to TEXTBLOCK parts. It is used for the group to be loaded and used for cursor display UNDER the cursor position. source4 is used for over the cursor text, if source4 is specified.

            -
          • - -
          • source4 [another group's name] -

            Only available to TEXTBLOCK parts. It is used for the group to be loaded and used for cursor display OVER the cursor position. source3 is used for under the cursor text, if source4 is specified.

            -
          • - -
          • source5 [another group's name] -

            Only available to TEXTBLOCK parts. It is used for the group to be loaded and used for anchors display UNDER the anchor position. source6 is used for over the anchors text, if source6 is specified.

            -
          • - -
          • source6 [another group's name] -

            Only available to TEXTBLOCK parts. It is used for the group to be loaded and used for anchor display OVER the anchor position. source5 is used for under the anchor text, if source6 is specified.

            -
          • - -
          • effect [effect] (shadow direction) -

            Apply the selected outline, shadow, or glow effect to "textblock" (take care that this effect only works for the textblock). The available effects are:

            -
              -
            • PLAIN
            • -
            • OUTLINE
            • -
            • SOFT_OUTLINE
            • -
            • SHADOW
            • -
            • SOFT_SHADOW
            • -
            • OUTLINE_SHADOW
            • -
            • OUTLINE_SOFT_SHADOW
            • -
            • FAR_SHADOW
            • -
            • FAR_SOFT_SHADOW
            • -
            • GLOW
            • -
            - -

            The available shadow directions definitions are (default is BOTTOM_RIGHT):

            -
              -
            • BOTTOM_RIGHT
            • -
            • BOTTOM
            • -
            • BOTTOM_LEFT
            • -
            • LEFT
            • -
            • TOP_LEFT
            • -
            • TOP
            • -
            • TOP_RIGHT
            • -
            • RIGHT
            • -
            -
          • - -
          • entry_mode [mode] -

            Sets the edit mode for a textblock part. The available modes are:

            -
              -
            • NONE: -

              The textblock is non-editable.

            • -
            • PLAIN: -

              The textblock is non-editable, but selectable.

            • -
            • EDITABLE: -

              The textblock is editable.

            • -
            • PASSWORD: -

              The textblock is editable if the Edje object has the keyboard focus and the part has the Edje focus (or selectable always regardless of focus). In the event of password mode, not selectable and all text chars replaced with *'s but editable and pastable.

            • -
            -
          • - -
          • select_mode [mode] -

            Sets the selection mode for a textblock part. The available modes are:

            -
              -
            • DEFAULT, selection mode is what you would expect on any desktop. Press mouse, drag and release to end.
            • -
            • EXPLICIT, this mode requires the application controlling the Edje object has to explicitly begin and end selection modes, and the selection itself is draggable at both ends.
            • -
            -
          • - -
          • cursor_mode [mode] -

            Sets the cursor mode for a textblock part. The available modes are:

            -
              -
            • UNDER, the cursor draws below the character pointed at. That is the default.
            • -
            • BEFORE, the cursor is drawn as a vertical line before the current character, just like many other GUI toolkits handle it.
            • -
            -
          • - -
          • multiline [1 or 0] -

            It causes a textblock that is editable to allow multiple lines for editing.

            -
          • - -
          • access [1 or 0] -

            Specifies whether the part uses accessibility feature (1), or not (0). It is set to 0 by default.

            -
          • -
          - -

          Draggable

          - -
          -dragable 
          -{
          -   confine: "another part";
          -   threshold: "another part";
          -   events:  "another draggable part";
          -   x: 0 0 0;
          -   y: 0 0 0;
          -}
          -
          - -

          When this block is used the part can be dragged around the interface, do not confuse with external drag and drop. By default Edje (and most applications) attempts to use the minimal size possible for a draggable part. If the min property is not set in the description the part is (most likely) set to 0px width and 0px height, thus invisible.

          - -
            - -
          • x [enable/disable] [step] [count] -

            Used to set up dragging events for the X axis. The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis. When enabled, 1 sets the starting point at 0.0 and -1 at 1.0. The second parameter takes any integer and limits movement to values divisible by it, causing the part to jump from position to position. If step is set to 0 it is calculated as width of confine part divided by count.

            -
          • - -
          • y [enable/disable] [step] [count] -

            Used to set up dragging events for the Y axis. The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis. When enabled, 1 sets the starting point at 0.0 and -1 at 1.0. The second parameter takes any integer and limits movement to values divisible by it, causing the part to jump from position to position. If step is set to 0 it is calculated as height of confine part divided by count.

            -
          • - -
          • confine [another part's name] -

            Limits the movement of the dragged part to another part's container. Set a min size for the part, or the dragged object will not show up.

            -
          • - -
          • threshold [another part's name] -

            When set, the movement of the dragged part can only start when it get moved enough to be outside of the threshold part.

            -
          • - -
          • events [another draggable part's name] -

            Causes the part to forward the drag events to another part, thus ignoring them for itself.

            -
          • - -
          - -

          Box/table

          - -

          Items

          - -
          -box/table 
          -{
          -   items 
          -   {
          -      item 
          -      {
          -         type: GROUP;
          -         source: "some source";
          -         min: -1 -1;
          -         max: 100 100;
          -         padding: 1 1 2 2;
          -      }
          -      item 
          -      {
          -         type: GROUP;
          -         source: "some other source";
          -         name: "some name";
          -         align: 1.0 0.5;
          -      }
          -   }
          -}
          -
          - -

          On a BOX part, this block is used to set other groups as elements of the box. These can be mixed with external objects set by the application through the edje_object_part_box*() functions.

          - -
          Item
          - -
            - -
          • type [item type] -

            Sets the type of the object this item holds. The supported type is:

            -
              -
            • GROUP (default)
            • -
            -
          • - -
          • name [name for the object] -

            Sets the name of the object via evas_object_name_set().

            -
          • - -
          • source [another group's name] -

            Sets the group this object is made of.

            -
          • - -
          • min [width] [height] -

            Sets the minimum size hints for this object.

            - - - - - - - - - -
            Note
            Must be -1 to get expand behavior.
            -
          • - -
          • spread [width] [height] -

            Replicates the item in a rectangle of size width x height box starting from the defined position of this item. The default value is 1 1;.

            -
          • - -
          • prefer [width] [height] -

            Sets the preferred size hints for this object.

            -
          • - -
          • max [width] [height] -

            Sets the maximum size hints for this object.

            -
          • - -
          • padding [left] [right] [top] [bottom] -

            Sets the padding hints for this object.

            -
          • - -
          • align [x] [y] -

            Sets the alignment hints for this object.

            -
          • - -
          • weight [x] [y] -

            Sets the weight hints for this object.

            -
          • - -
          • aspect [w] [h] -

            Sets the aspect width and height hints for this object.

            -
          • - -
          • aspect_mode [mode] -

            Sets the aspect control hints for this object. The available hints are:

            -
              -
            • NONE
            • -
            • NEITHER
            • -
            • HORIZONTAL
            • -
            • VERTICAL
            • -
            • BOTH
            • -
            -
          • - -
          • options [extra options] -

            Sets extra options for the object.

            -
          • - -
          • position [col] [row] -

            Sets the position this item has in the table. This is required for parts of type TABLE.

            -
          • - -
          • span [col] [row] -

            Sets how many columns and rows this item uses. The default value is 1 1.

            -
          • - -
          - -

          Description

          - -
          -description 
          -{
          -   inherit: "another_description" INDEX;
          -   state: "description_name" INDEX;
          -   visible: 1;
          -   min: 0 0;
          -   max: -1 -1;
          -   align: 0.5 0.5;
          -   fixed: 0 0;
          -   step: 0 0;
          -   aspect: 1 1;
          -
          -   rel1 
          -   {
          -      ...
          -   }
          -
          -   rel2 
          -   {
          -      ...
          -   }
          -}
          -
          - -

          Every part can have one or more description blocks. Each description is used to define style and layout properties of a part in a given "state".

          - -
            - -
          • inherit [another description's name] [another description's index] -

            Thee description inherits all the properties from the named description. The properties defined in this part override the inherited properties, reducing the amount of necessary code for simple state changes. Note: inheritance in Edje is single level only.

            -
          • - -
          • source [another part's name] -

            Causes the part to use another part's content as the content of this part. This works only with PROXY part.

            -
          • - -
          • state [name for the description] [index] -

            Sets a name used to identify a description inside a given part. Multiple descriptions are used to declare different states of the same part, like "clicked" or "invisible". All state declarations are also coupled with an index number between 0.0 and 1.0. All parts must have at least one description named "default 0.0".

            -
          • - -
          • visible [0 or 1] -

            Takes a Boolean value specifying whether part is visible (1) or not (0). Non-visible parts do not emit signals. The default value is 1.

            -
          • - -
          • limit [mode] -

            Emits a signal when the part size changes from zero or to a zero (limit,width,over, limit,width,zero). By default no signal are emitted. Valid values are:

            -
              -
            • NONE
            • -
            • WIDTH
            • -
            • HEIGHT
            • -
            • BOTH
            • -
            -
          • - -
          • align [X axis] [Y axis] -

            When the displayed object's size is smaller or bigger than its container, this property moves it relatively along both axis inside its container. "0.0" means left/top edges of the object touching container's respective ones, and "1.0" stands for right/bottom edges of the object (on horizontal/vertical axis, respectively). The default value is "0.5 0.5". For a more detailed explanation, see the Align Size Hint.

            -
          • - -
          • fixed [width, 0 or 1] [height, 0 or 1] -

            Sets the minimum size calculation. See edje_object_size_min_calc() and edje_object_size_min_restricted_calc(). This tells the min size calculation routine that this part does not change size in width or height (1 for it does not, 0 for it does), so the routine does not try to expand or contract the part.

            -
          • - -
          • min [width] [height] or SOURCE -

            Sets the minimum size of the state. When min is defined to SOURCE, it looks at the original image size and enforces its minimal size to match at least the original one. The part must be an IMAGE or a GROUP part.

            -
          • - -
          • minmul [width multiplier] [height multiplier] -

            A multiplier forcibly applied to whatever minimum size is only during minimum size calculation.

            -
          • - -
          • max [width] [height] or SOURCE -

            The maximum size of the state. A size of -1.0 means that it is ignored in one direction. When max is set to SOURCE, Edje enforces the part to be not more than the original image size. The part must be an IMAGE part.

            -
          • - -
          • step [width] [height] -

            Restricts resizing of each dimension to values divisible by its value. This causes the part to jump from value to value while resizing. The default value is "0 0" which disables stepping.

            -
          • - -
          • aspect [min] [max] -

            Normally width and height can be resized to any values independently. The aspect property forces the width to height ratio to be kept between the minimum and maximum set. For example, "1.0 1.0" increases the width a pixel for every pixel added to height. The default value is "0.0 0.0" which disables aspect. For a more detailed explanation, see the Min Size Hint .

            -
          • - -
          • aspect_preference [DIMENSION] -

            Set the dimensions to which the "aspect" property applies. Available options are:

            -
              -
            • BOTH
            • -
            • VERTICAL
            • -
            • HORIZONTAL
            • -
            • SOURCE
            • -
            • NONE
            • -
            -

            For a more detailed explanation, see Min Size Hint.

            -
          • - -
          • color_class [color class name] -

            The part uses the color values of the named color_class, these values can be overridden by the "color", "color2" and "color3" properties.

            -
          • - -
          • color [red] [green] [blue] [alpha] -

            Sets the main color to the specified values (between 0 and 255).

            - - - - - - - - - -
            Note
            The textblock part is not affected by the color description. Set the color in the text style.
            - -
          • - -
          • color2 [red] [green] [blue] [alpha] -

            Sets the text shadow color to the specified values (0 to 255).

            -
          • - -
          • color3 [red] [green] [blue] [alpha] -

            Sets the text outline color to the specified values (0 to 255).

            -
          • - -
          - -

          Rel1/rel2

          -
          -description 
          -{
          -   rel1 
          -   {
          -      relative: 0.0 0.0;
          -      offset:     0   0;
          -   }
          -   rel2 
          -   {
          -      relative: 1.0 1.0;
          -      offset:    -1  -1;
          -   }
          -}
          -
          - -

          The rel1 and rel2 blocks are used to define the position of each corner of the part's container. With rel1 being the left-up corner and rel2 being the right-down corner.

          - -
            - -
          • relative [X axis] [Y axis] -

            Moves the corner to a relative position inside the container of the relative "to" part. Values from 0.0 (0%, beginning) to 1.0 (100%, end) of each axis.

            -
          • - -
          • offset [X axis] [Y axis] -

            Affects the corner position a fixed number of pixels along each axis.

            -
          • - -
          • to [another part's name] -

            Positions the corner relatively to another part's container. Setting to "" resets this value for inherited parts.

            -
          • - -
          • to_x [another part's name] -

            Positions the corner relatively to the X axis of another part's container. This affects the first parameter of "relative". Setting to "" resets this value for inherited parts.

            -
          • - -
          • to_y [another part's name] -

            Positions the corner relatively to the Y axis of another part's container. This affects the second parameter of "relative". Setting to "" resets this value for inherited parts.

            -
          • - -
          - -

          Image

          - -
          -description 
          -{
          -   image 
          -   {
          -      normal: "filename.ext";
          -      tween:  "filename2.ext";
          -      tween:  "filenameN.ext";
          -      border:  left right top bottom;
          -      middle:  0/1/NONE/DEFAULT/SOLID;
          -      fill {}
          -   }
          -}
          -
          - -
            - -
          • normal [image's filename] -

            Name of image to be used as previously declared in the images block. In an animation, this is the first and last image displayed. It is required in any image part

            -
          • - -
          • tween [image's filename] -

            Name of an image to be used in an animation loop, an image block can have none, one or multiple tween declarations. Images are displayed in the order they are listed, during the transition to the state they are declared in; the "normal" image is the final state.

            -
          • - -
          • border [left] [right] [top] [bottom] -

            Sets the area (in pixels) of each side of the image is displayed as a fixed size border, from the side -> inwards, preventing the corners from being changed on a resize.

            -
          • - -
          • middle [mode] -

            If border is set, this value tells Edje if the rest of the image (not covered by the defined border) displayed or not or be assumed to be solid (without alpha). The default value is 1/DEFAULT. The available values are:

            -
              -
            • 0 or NONE
            • -
            • 1 or DEFAULT
            • -
            • SOLID (strip alpha from the image over the middle zone)
            • -
            -
          • - -
          • border_scale_by [value] -

            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). 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. Value can be: 0.0 or bigger (0.0 or 1.0 to turn it off)

            -
          • - -
          • border_scale [0/1] -

            Tells Edje if the border is scaled by the object/global Edje scale factors.

            -
          • - -
          • scale_hint [mode] -

            Sets the evas image scale hint letting the engine more effectively save cached copies of the scaled image if it makes sense. Valid values are:

            -
              -
            • 0 or NONE
            • -
            • DYNAMIC
            • -
            • STATIC
            • -
            -
          • - -
          - -
          Image.fill
          - -
          -image 
          -{
          -   fill 
          -   {
          -      type: SCALE;
          -      smooth: 0-1;
          -      origin {}
          -      size {}
          -   }
          -}
          -
          - -

          The fill method is an optional block that defines the way an IMAGE part is going to be displayed inside its container. It can be used for tiling (repeating the image) or displaying only part of an image. See evas_object_image_fill_set() documentation for more details.

          - -
            - -
          • smooth [0 or 1] -

            The smooth property takes a boolean value to decide if the image will be smoothed on scaling (1) or not (0). The default value is 1.

            -
          • - -
          • spread -
          • - -
          • type [fill type] -

            Sets the image fill type. The part parameter "min" must be set, it is size of tiled image. If parameter "max" set tiled area has the size accordingly "max" values. SCALE is default type. Valid values are:

            -
              -
            • SCALE, image is scaled accordingly the value of the parameters "relative" and "offset" from "origin" and "size" blocks.
            • -
            • TILE, image is tiled accordingly parameters value "relative" and "offset" from "origin" and "size" blocks.
            • -
            -
          • - -
          - -
          Image.fill.origin
          - -
          -image 
          -{
          -   fill 
          -   {
          -      origin 
          -      {
          -         relative: 0.0 0.0;
          -         offset: 0 0;
          -      }
          -   }
          -}
          -
          - -

          The origin block is used to place the starting point, inside the displayed element, that is used to render the tile. By default, the origin is set at the element's left-up corner.

          - -
            - -
          • relative [X axis] [Y axis] -

            Sets the starting point relatively to displayed element's content.

            -
          • -
          • offset [X axis] [Y axis] -

            Affects the starting point a fixed number of pixels along each axis.

            -
          • - -
          - -
          Image.fill.size
          - -
          -image 
          -{
          -   fill 
          -   {
          -      size 
          -      {
          -         relative: 1.0 1.0;
          -         offset: -1 -1;
          -      }
          -   }
          -}
          -
          - -

          The size block defines the tile size of the content that are displayed.

          - -
            - -
          • relative [width] [height] -

            Takes a pair of decimal values that represent the percentage of the original size of the element. For example, "0.5 0.5" represents half the size, while "2.0 2.0" represents the double. The default value is "1.0 1.0".

            -
          • -
          • offset [X axis] [Y axis] -

            Affects the size of the tile a fixed number of pixels along each axis.

            -
          • - -
          - -

          Text

          - -
          -text 
          -{
          -   text: "some string of text to display";
          -   font: "font_name";
          -   size: SIZE;
          -   text_class: "class_name";
          -   fit: horizontal vertical;
          -   min: horizontal vertical;
          -   max: horizontal vertical;
          -   align: X-axis Y-axis;
          -   source: "part_name";
          -   text_source: "text_part_name";
          -   style: "stylename";
          -}
          -
          - - -
            - -
          • text [a string of text, or nothing] -

            Sets the default content of a text part, normally the application is the one changing its value.

            -
          • - -
          • text_class [text class name] -

            Similar to color_class, this is the name used by the application to alter the font family and size at runtime.

            -
          • - -
          • font [font alias] -

            This sets the font family to one of the aliases set up in the "fonts" block. Can be overridden by the application.

            -
          • - -
          • style [the style name] -

            Causes the part to use the default style and tags defined in the "style" block with the specified name.

            -
          • - -
          • repch [the replacement character string] -

            If this is a textblock and is in PASSWORD mode this string is used to replace every character to hide the details of the entry. Normally * is used, but you can use anything you like.

            -
          • - -
          • size [font size in points (pt)] -

            Sets the default font size for the text part. Can be overridden by the application.

            -
          • - -
          • size_range [font min size in points (pt)] [font max size in points (pt)] -

            Sets the allowed font size for the text part. Setting min and max to 0 means that sizing is not restricted. This is also the default value.

            -
          • - -
          • fit [horizontal] [vertical] -

            When any of the parameters is set to 1 Edje resizes the text for it to fit in its container. Both are disabled by default.

            -
          • - -
          • min [horizontal] [vertical] -

            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. The default value is "0 0".

            -
          • - -
          • max [horizontal] [vertical] -

            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. The default value is "0 0".

            -
          • - -
          • align [horizontal] [vertical] -

            Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

            -
          • - -
          • source [another TEXT part's name] -

            Causes the part to use the text properties (like font and size) of another part and update them as they change.

            -
          • - -
          • text_source [another TEXT part's name] -

            Causes the part to display the text content of another part and update them as they change.

            -
          • - -
          • ellipsis [point of balance] -

            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. The default value is 0.0.

            -
          • - -
          - - -

          Box

          - -
          -box 
          -{
          -   layout: "vertical";
          -   padding: 0 2;
          -   align: 0.5 0.5;
          -   min: 0 0;
          -}
          -
          - -

          A box block can contain other objects and display them in different layouts, any of the predefined set, or a custom one, set by the application.

          - -
            - -
          • layout [primary layout] (fallback layout) -

            Sets the layout for the box:

            -
              -
            • horizontal (default)
            • -
            • vertical
            • -
            • horizontal_homogeneous
            • -
            • vertical_homogeneous
            • -
            • horizontal_max (homogeneous to the max sized child)
            • -
            • vertical_max
            • -
            • horizontal_flow
            • -
            • vertical_flow
            • -
            • stack
            • -
            • some_other_custom_layout_set_by_the_application -

              Set a custom layout as a fallback. For more information, see edje_box_layout_register(). If an unregistered layout is used, it defaults to horizontal.

            • - -
            -
          • - -
          • align [horizontal] [vertical] -

            Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

            -
          • - -
          • padding [horizontal] [vertical] -

            Sets the space between cells in pixels. The default value is 0 0.

            -
          • - -
          • min [horizontal] [vertical] -

            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. The default value is 0 0.

            -
          • - -
          - -

          Table

          - -
          -table 
          -{
          -   homogeneous: TABLE;
          -   padding: 0 2;
          -   align: 0.5 0.5;
          -   min: 0 0;
          -}
          -
          - -

          A table block can contain other objects packed in multiple columns and rows, and each item can span across more than one column and/or row.

          - -
            - -
          • homogeneous [homogeneous mode] -

            Sets the homogeneous mode for the table:

            -
              -
            • NONE: default
            • -
            • TABLE: available space is evenly divided between children (which overflows onto other children if too little space is available)
            • -
            • ITEM: size of each item is the largest minimal size of all the items
            • -
            -
          • - -
          • align [horizontal] [vertical] -

            Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

            -
          • - -
          • padding [horizontal] [vertical] -

            Sets the space between cells in pixels. The default value is 0 0.

            -
          • - -
          • min [horizontal] [vertical] -

            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. The default value is 0 0.

            -
          • - -
          - -

          Map

          - -
          -map 
          -{
          -   perspective: "name";
          -   light: "name";
          -   on: 1;
          -   smooth: 1;
          -   perspective_on: 1;
          -   backface_cull: 1;
          -   alpha: 1;
          -
          -   rotation 
          -   {
          -      ...
          -   }
          -}
          -
          - -
            - -
          • perspective [another part's name] -

            This sets the part that is used as the perspective point for giving a part a 3D look. 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.

            -
          • - -
          • light [another part's name] -

            This 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). 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. 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 [1 or 0] -

            This enables mapping for the part. Default is 0.

            -
          • - -
          • smooth [1 or 0] -

            This enables smooth map rendering. 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. The default value is 1.

            -
          • - -
          • alpha [1 or 0] -

            This enables alpha channel when map rendering. The default value is 1.

            -
          • - -
          • backface_cull [1 or 0] -

            This enables backface culling (when the rotated part that normally faces the camera is facing away after being rotated etc.). This means that the object are hidden when backface is culled.

            -
          • - -
          • perspective_on [1 or 0] -

            This enables perspective when rotating even without a perspective point object. This uses perspective set for the object itself or for the canvas as a whole as the global perspective with edje_perspective_set() and edje_perspective_global_set().

            -
          • - -
          • color [point] [red] [green] [blue] [alpha] -

            This sets the color of a vertex in the map. Colors are linearly interpolated between vertex points through the map. 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. 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.

            -
          • - -
          - -
          Map.rotation
          - -
          -rotation 
          -{
          -   center: "name";
          -   x: 45.0;
          -   y: 45.0;
          -   z: 45.0;
          -}
          -
          - -

          Rotates the part, optionally with the center on another part.

          - -
            - -
          • center [another part's name] -

            This sets the part that is used as the center of rotation when rotating the part with this description. The part's center point is used as the rotation center when applying rotation around the x, y and z axes. If no center is given, the parts original center itself is used for the rotation center.

            -
          • - -
          • x [X degrees] -

            This sets the rotation around the x axis of the part considering the center set. The value is given in degrees.

            -
          • - -
          • y [Y degrees] -

            This sets the rotation around the y axis of the part considering the center set. The value is given in degrees.

            -
          • - -
          • z [Z degrees] -

            This sets the rotation around the z axis of the part considering the center set. The value is given in degrees.

            -
          • - -
          - -
          Perspective
          - -
          -perspective 
          -{
          -   zplane: 0;
          -   focal: 1000;
          -}
          -
          - -

          Adds focal and plane perspective to the part. Active if perspective_on is true. Must be provided if the part is being used by other part as it is perspective target.

          - -
            - -
          • zplane [unscaled Z value] -

            This sets the z value that is not scaled. Normally this is 0 as that is the z distance.

            -
          • - -
          • focal [distance] -

            This sets the distance from the focal z plane (zplane) and the camera - i.e. equating to focal length of the camera

            -
          • - -
          - - - -
          -link 
          -{
          -   base: "edje,signal" "edje";
          -   transition: LINEAR 0.2;
          -   in: 0.5 0.1;
          -   after: "some_program";
          -}
          -
          - -

          The link block can be used to create transitions to the enclosing part description state. The result of the above block is identical to creating a program with

          - - -
          -action: STATE_SET "default"";
          -signal: "edje,signal";
          -source: "edje";
          -
          - -
            - -
          • base [signal] [source] -

            Defines the signal and source which triggers the transition to this state. The source parameter is optional here and is filled with the current group's default value if it is not provided.

            -
          • -
          - -

          Program

          - -
          -program
          -{
          -   // name of the program
          -   name: "programname";
          -   // signals which trigger the program
          -   signal: "signalname";
          -   // filter incoming signals depending on the sender name
          -   source: "partname";
          -   // filter incoming signals depending on the part's state
          -   filter: "partname" "statename";
          -   // delay the program by X seconds plus a random time between 0 and Y
          -   in: 0.3 0.0;
          -   // action to perform
          -   action: STATE_SET "statename" state_value;
          -   // if action is STATE_SET, define a transition from the current to the target state
          -   transition: LINEAR 0.5;
          -   // if action is SIGNAL_EMIT, the name of the part which will receive the signal
          -   target: "partname";
          -   // run another program after the current one is done
          -   after: "programname";
          -   after: "anotherprogram";
          -}
          -
          - -

          Program

          - -

          Programs define how your interface reacts to events. Programs can change the state of parts or trigger other events.

          - -
            - -
          • name [program name] -

            Symbolic name of program as a unique identifier.

            -
          • - -
          • signal [signal name] -

            Specifies signals that cause the program to run. The signal received must match the specified source to run. There may be several signals, but only one signal keyword per program can be used. Also, there are some predefined signals for touch event handling. The predefined signals are:

            -
              -
            • "hold,on": Holding on the mouse event matching the source that starts the program.
            • -
            • "hold,off": Holding off the mouse event matching the source that starts the program.
            • -
            • "focus,part,in": Focusing in the matching source that starts the program.
            • -
            • "focus,part,out": Focusing out of the matching source that starts the program.
            • -
            • "mouse,in": Moving the mouse into the matching source that starts the program.
            • -
            • "mouse,out": Moving the mouse out of the matching source that starts the program.
            • -
            • "mouse,move": Moving the mouse in the matching source that starts the program.
            • -
            • "mouse,down,*": Pressing the mouse button in the matching source that starts the program.
            • -
            • "mouse,up,*": Releasing the mouse button in the matching source that starts the program.
            • -
            • "mouse,clicked,*": Clicking any mouse button in the matching source that starts the program.
            • -
            • "mouse,wheel,0,*": Moving the mouse wheel in the matching source that starts the program. A positive number moves up and a negative number moves down.
            • -
            • "drag,start": Starting a drag of the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • -
            • "drag,stop": Stopping a drag of the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • -
            • "drag": Dragging the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • -
            -
          • - -
          • source [source name] -

            Source of accepted signal. There may be several signals, but only one source keyword per program can be used. For example, source: "button-*"; (signals from any part or program named "button-*" are accepted).

            -
          • - -
          • filter [part] [state] -

            Filter signals to be only accepted if the part is in state named [state]. Only one filter per program can be used. If [state] is not given, the source of the event is used instead.

            -
          • - -
          • in [from] [range] -

            Wait [from] seconds before executing the program and add a random number of seconds (from 0 to [range]) to the total waiting time.

            -
          • - -
          • action [type] (param1) (param2) (param3) (param4) -

            Action to be performed by the program. Valid actions (only one can be specified) are:

            -
              -
            • STATE_SET: Set "target part" state as "target state"
            • -
            • ACTION_STOP: Stop the ongoing transition.
            • -
            • SIGNAL_EMIT: Emit a signal to the application level. The application can register a callback for handling actions based on the EDC state.
            • -
            • DRAG_VAL_SET: Set a value for the dragable part (x, y values).
            • -
            • DRAG_VAL_STEP: Set a step for the dragable part (x, y values).
            • -
            • DRAG_VAL_PAGE: Set a page for the dragable part (x, y values).
            • -
            • FOCUS_SET: Set the focus to the target group.
            • -
            • PLAY_SAMPLE "sample name" speed (channel): Play a music sample clip. - -

              PLAY_SAMPLE's (optional) channel can be one of:

              -
                -
              • EFFECT/FX
              • -
              • BACKGROUND/BG
              • -
              • MUSIC/MUS
              • -
              • FOREGROUND/FG
              • -
              • INTERFACE/UI
              • -
              • INPUT
              • -
              • ALERT
              • -
              -
            • - -
            • PLAY_TONE "tone name" duration_in_seconds (Range 0.1 to 10.0): Play a predefined tone of a specific duration.
            • -
            • PLAY_VIBRATION "sample name" repeat (repeat count)
            • -
          • - - -
          • transition [type] [length] (interp val 1) (interp val 2) (option) -

            Defines how transitions occur using STATE_SET action. [type] is the style of the transition and [length] is a double specifying the number of seconds in which to preform the transition. Valid types are:

            -
              -
            • LIN or LINEAR
            • -
            • SIN or SINUSOIDAL
            • -
            • ACCEL or ACCELERATE
            • -
            • DECEL or DECELERATE
            • -
            • ACCEL_FAC or ACCELERATE_FACTOR
            • -
            • DECEL_FAC or DECELERATE_FACTOR
            • -
            • SIN_FAC or SINUSOIDAL_FACTOR
            • -
            • DIVIS or DIVISOR_INTERP
            • -
            • BOUNCE
            • -
            • SPRING
            • -
            - -

            ACCEL_FAC, DECEL_FAC and SIN_FAC need the extra optional "interp val 1" to determine the "factor" of curviness. 1.0 is the same as their non-factor counterparts and 0.0 is equal to linear. Numbers higher than 1.0 make the curve angles steeper with a more pronounced curve point.

            - -

            DIVIS, BOUNCE and SPRING also require "interp val 2" in addition to "interp val 1".

            - -

            DIVIS uses [val 1] as the initial gradient start (0.0 is horizontal, 1.0 is diagonal (linear), 2.0 is twice the gradient of linear, etc.). [val 2] is interpreted as an integer factor defining how much the value swings outside the gradient before going back to the final resting spot at the end. 0.0 for [val 2] is equivalent to linear interpolation. Note that DIVIS can exceed 1.0.

            - -

            BOUNCE uses [val 2] as the number of bounces (so it is rounded down to the nearest integer value), with [val 1] determining how much the bounce decays; 0.0 gives linear decay per bounce and higher values give much more decay.

            - -

            SPRING is similar to bounce; [val 2] specifies the number of spring swings and [val 1] specifies the decay, but it can exceed 1.0 on the outer swings.

            - -

            Valid options are:

            -
              -
            • CURRENT causes the object to move from its current position. Can be used as the last parameter of any transition type.
            • -
            -
          • - -
          • target [target] -

            Program or part on which the specified action acts.

            -
          • - -
          • after [after] -

            Specifies a program that is run after the current program completes. The source and signal parameters of a program run as an after are ignored. Multiple after statements can be specified per program.

            -
          • - -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edc_positioning_n.htm b/org.tizen.ui.guides/html/native/efl/edc_positioning_n.htm deleted file mode 100755 index 57093ad..0000000 --- a/org.tizen.ui.guides/html/native/efl/edc_positioning_n.htm +++ /dev/null @@ -1,488 +0,0 @@ - - - - - - - - - - - - - Positioning Parts with the EDC File - - - - - -
          - -

          Positioning Parts with the EDC File

          - - -

          Positioning Basic Parts

          - -

          Size of a part (in pixels) is set using the min and max parameters. The following code example sets the minimum and maximum size of the rectangle part to 200x200 px.

          - -
          -part 
          -{ 
          -   name: "rectangle";
          -   type: RECT;
          -   description 
          -   { 
          -      state: "blue" 0.0;
          -      align: 0.0 0.0;
          -      // set the size to 200x200
          -      min: 200 200;
          -      max: 200 200;
          -      // blue color
          -      color: 0 0 255 255;
          -   }
          -}
          -
          - -

          Position of the parts is defined in the rel1 and rel2 blocks. rel1 and rel2 blocks are used to define respectively the upper-left corner and the lower-right corner of the part. Position can be defined relatively to other parts (with the relative parameter) as an offset (offset parameter). When using relative positioning, the to, to_x and to_y parameters are used to define to which part the relative positioning is done. If nothing else is specified, the positioning is relative to the parent's part.

          - -

          To demonstrate the relative positioning, here is a code example that creates another part and positions it under the first part (the upper-left corner of the new part will start at the lower-left corner of the previous one).

          - -
          -part 
          -{ 
          -   name: "rectangle2";
          -   type: RECT;
          -   description 
          -   { 
          -      state: "green" 0.0;
          -      align: 0.0 0.0;
          -      // set the size to 200x200
          -      min: 200 200;
          -      max: 200 200;
          -      // green color
          -      color: 0 255 0 255;
          -      // set the position
          -      // rel1 is relative to "rectangle"
          -      rel1 
          -      {
          -         relative: 0.0 1.0;
          -         to: "rectangle";
          -      }
          -      // rel2 is relative to the parent
          -      rel2 
          -      {
          -         relative: 1.0 1.0;
          -      }
          -   }
          -}
          -
          - - - - - - - - - - -
          Note
          The align parameter defines how the parts align themselves in the main window if their size is smaller than the main window. If nothing is specified, the parts are aligned in the center of the window.
          - -

          Adding Offset to Relative Positioning

          - -

          The rel1 and rel2 structures also support offset which is a complement to the relative positioning: the corners are first placed according to their relative parameters and then adjusted using the offsets.

          - -

          The picture below shows the pixel positions for a 4x4 rectangle. The indices start in the top-left corner at (0, 0) increase to the right and to the bottom. Since the indices have started at 0, the 4th pixel has an index of 3.

          - -

          Therefore, in order to create a 2x2 blue rectangle centered inside that green square, the top-left corner has to be (1, 1) and the bottom-right one has to be (2, 2).

          - -

          Figure: Offset indices

          -

          Offset indices

          - -

          Edje needs the following things defined:

          -
            -
          • the part coordinates depending on the size and position of the green rectangle
          • -
          • the relative component of positions is the same: the top-left corner of the green rectangle
          • -
          • the top-left pixel is (1, 1) and the bottom-right one is (2, 2)
          • -
          - -

          The following code example defines these things:

          - -
          -name: "blue rectangle";
          -
          -rel1.to: "green rectangle";
          -rel1.relative: 0 0;
          -rel1.offset: 1 1;
          -
          -rel2.to: "green rectangle";
          -rel2.relative: 0 0;
          -rel2.offset: 2 2;
          -
          - -

          For most tasks, relative positioning is simpler than using offsets. Offsets are usually left for fine-tuning and creating borders.

          - -

          The example below is similar to the previous one but uses relative positioning instead of offsets to achieve an equivalent at 4x4 but could scale to larger sizes.

          - -

          The blue square starts at 25% of the green square (both vertically and horizontally) and ends at 75% of it (again, both vertically and horizontally).

          - -

          Just like in the previous example, the blue rectangle is named and Edje is told what the object of reference is:

          - -
          -name: "blue rectangle";
          -rel1.to: "green rectangle";
          -rel2.to: "green rectangle";
          -
          - -

          The image below shows how to refer pixels using relative positioning when the offsets are (0, 0).

          - -

          Figure: Relative positioning

          -

          Relative positioning

          - -

          Note the addressing of pixels: (0, 0) is addressed through relative: 0 0; offset 0 0; and each additional 0.25 in the relative field gives a 1-pixel move. With this, the pixel addressed through relative: 0.75 0.75; offset: 0 0; is at (3, 3) and not (2, 2)!.

          - -

          This comes from a design choice in Evas and Edje which favor simplicity. In the examples shown in this guide, there are 4 pixels and therefore when the [0; 1) range is divided in 4, the result is [0; 0.25), [0.25; 0.50), [0.50; 0.75), [0.75; 0.100). With Edje, the value used to refer to each segment is the left bound and therefore, 0.75 refers to [0.75; 0.100), i.e. the bottom-right pixel of the green rectangle and not the 3/4th one.

          - -

          The way to refer to the pixel right before is to set the rel2 bound to relative: 0.75 0.75;, as would be expressed naturally, and offset: -1 -1;. This can also be understood as extending the rectangle up to 75% of its parent with the upper bound excluded (as shown in the [0.50; 0.75)).

          - -

          Since -1 -1 is the most common offset wanted for rel2, it is the default value; i.e. the default behavior is practical.

          - -

          Calculating Edje Object Total Size

          - -

          When the EDC file is composed of a lot of parts, Edje calculates the size of the global Edje object, by taking all the parts and their parameters into account. Some parameters have an role in this calculation and affect the global size:

          - -
            -
          • min and max: these define the minimum and the maximum size of a part.
          • -
          • rel1 and rel2: these specify the relative position of a part.
          • -
          • align: this relates to the alignment of the part in the parent's object.
          • -
          • fixed: this defines if the part has a fixed size.
          • -
          - - - - - - - - - - -
          Note
          fixed parameter can only be used on TEXTBLOCK type parts. Setting this parameter to fixed: 1 1 will not take into account the part for the calculation of the global size.
          - -

          Using Edje Size Hints

          - -

          Any Evas_Object can have hints, so that the object knows how to properly position and resize. Edje uses these hints when swallowing an Evas_Object to position and resize it in the SWALLOW part of the EDC file.

          - -

          Size hints are not a size enforcement, they just tell the parent object the desired size for this object. Then, the parent tries to get as close as possible to the hint.

          - -

          Hints are set in an Evas_Object using the evas_object_size_hint_*() functions.

          - -

          Min Size Hint

          - -

          This sets the hints for the object's minimum size, given in pixels.

          - -

          Here the horizontal and vertical min size hints of an Evas_Object are set to 0 pixels.

          - -
          -Evas_Object *object;
          -evas_object_size_hint_min_set(object, 0, 0);
          -
          - -

          Max Size Hint

          - -

          This sets the hints for the object's maximum size, given in pixels.

          - -

          Here the horizontal and vertical max size hints of an Evas_Object are set to 200 pixels.

          -
          evas_object_size_hint_max_set(object, 200, 200);
          - -

          Request Size Hint

          - -

          This sets the hints for the object's optimum size.

          - -

          The following code example defines that the optimum size of a part is 200x200 pixels.

          - -

          Aspect Size Hint

          - -

          This sets the hints for the object's aspect ratio. Available aspect size hints are:

          - -
            -
          • EVAS_ASPECT_CONTROL_NONE
          • -
          • EVAS_ASPECT_CONTROL_HORIZONTAL
          • -
          • EVAS_ASPECT_CONTROL_VERTICAL
          • -
          • EVAS_ASPECT_CONTROL_BOTH
          • -
          - -

          The other parameters are aspect width and height ratio. These integers are used to calculate the proportions of the object. If aspect ratio terms are null, the object's container ignores the aspect and scale of the object and occupies the whole available area.

          - -

          Figure: Aspect control

          -

          Aspect control

          - -

          Aspect control

          - -

          Aspect control

          - -

          The following code example sets the aspect size hint to EVAS_ASPECT_CONTROL_BOTH with a width of 100 and a height of 200. So aspect ratio should be 1/2.

          - -
          -evas_object_size_hint_aspect_set(object, EVAS_ASPECT_CONTROL_BOTH, 100, 200);
          -
          - -

          Align Size Hint

          -

          This sets the hints for the object's alignment. This hint is used when the object size is smaller than its parent's. The special EVAS_HINT_FILL parameter uses maximum size hints with higher priority, if they are set. Also, any padding hints set on objects are added up to the alignment space on the final scene composition.

          - -

          Figure: Alignment

          -

          Alignment

          - -

          In the code below, the special EVAS_HINT_FILL parameter is used.

          - -
          -evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -
          - -

          Weight Size Hint

          - -

          This sets the hints for the object's weight. The weight tells to a container object how the given child is resized. Using EVAS_HINT_EXPAND parameter asks to expand the child object's dimensions to fit the container's own.

          - -

          When several child objects have different weights in a container object, the container distributes the space it has to layout them by those factors. Most weighted children get larger in this process than the least ones.

          - -

          Here the container is asked to expand the object in both directions.

          - -
          -evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -
          - -

          Padding Size Hint

          - -

          This sets the hints for the object's padding space. Padding is extra space an object takes on each of its delimiting rectangle sides. The padding space is rendered transparent. Four hints can be defined, for the left, right, top, and bottom padding.

          - -

          Figure: Padding

          -

          Padding

          - -

          Here the padding hints are set to 5 pixels on each side of the object.

          - -
          -evas_object_size_hint_padding_set(object, 5, 5, 5, 5);
          -
          - - -

          Edje Swallow

          - -

          The parent of all layout components is Edje. Edje as explained in the Edje Blocks is a library which convert edc files into Evas object. EDC is a description language. It means that the objects of interface are described by using text description. One of its main features is the possibility to create "Swallows" objects. When this kind of object is added in an Evas, it contains any other Evas_Object. To create a swallow part, create first the EDC file:

          - -
          -collections
          -{
          -   group 
          -   { 
          -      name: "container";
          -      parts 
          -      {
          -         part 
          -         {
          -            name: "part.swallow"
          -            type: SWALLOW;
          -            description 
          -            {
          -               state: "default" 0.0;
          -               rel1.offset: 31 31;
          -               rel2.offset: -32 -32;
          -            }
          -         }
          -      }
          -   }
          -}
          -
          - -

          This EDC describes a group named "container", with one part inside of type SWALLOW and with the name part.swallow. This part is centered inside the parent (it is the default behavior) but there are 32 pixels free all around this part. Use edje_cc to compile the EDC file into a binary EDJ file:

          - -
          -edje_cc -o container.edj container.edc
          -
          - -

          Create an Edje object and load this file:

          - -
          -edje = edje_object_add(evas_object_evas_get(parent));
          -edje_object_file_set(edje, "container.edj", "container");
          -
          - - - - - - - - - - -
          Note
          edje_object_add as opposed as all elementary object, does not take an Evas_Object as a parent. Give it the Evas on which the object is added. As the parent is already added on an Evas by elementary, retrieve a reference on it by using the evas_object_evas_get() function.
          - -

          edje_object_file_set is used to set the Edje file from which the object is loaded. The object itself is the name of the group as defined in the EDC file, in this case it is "container".

          - -

          Use the API edje_object_swallow to swallow any kind of Evas_Object inside.

          - -
          -ic = elm_icon_add(parent);
          -elm_image_file_set(ic, "c1.png", NULL);
          -edje_object_part_swallow(edje, "part.swallow", ic);
          -
          - - - - - - - - - - -
          Note
          The elm_image_file_set() function parameters are linked to Edje. The second argument in this example is a PNG file; however, it can also be an Edje file. In that case, the third argument must be the Edje group to load, exactly as previously shown with the edje_object_file_set() function.
          - -

          Create complex layout for your application with Edje. It is may not be the most easy way, but it is the most powerful. This Edje layout is used all around elementary and is the basis of the layout component.

          - -

          ELM Layout

          - -

          Layout is a container component. For the basic use of the elm_layout with a default style, see Layout. Elm layout takes a standard Edje design file and wraps it in a UI component. Layouts are the basis of graphical UI components which are used in Elementary.

          - -

          Adding Layout

          - -

          Create a new elementary layout using elm_layout_add:

          - -
          -Evas_Object *layout;
          -layout = elm_layout_add(parent);
          -
          - -

          As for Edje swallows, load an Edje file. Create first an Edje file, that contains a black rectangle and an icon in the center.

          - -
          -images
          -{
          -   image: "c1.png" COMP;
          -}
          -
          -collections
          -{
          -   group 
          -   { 
          -      name: "my_layout";
          -      parts 
          -      {
          -         part 
          -         {
          -            name: "background";
          -            type: RECT; description 
          -            { 
          -               state: "default" 0.0; color: 0 0 0 255; 
          -            } 
          -         } 
          -         part 
          -         { 
          -            name: "background"; 
          -            type: IMAGE; 
          -            description 
          -            { 
          -               state: "default" 0.0; 
          -               rel1.offset: 31 31; 
          -               rel2.offset: -32 -32; 
          -               default.image: "c1.png"; 
          -            } 
          -         }
          -      } 
          -   } 
          -}
          -
          -

          Compile it with edje_cc -o edje_example.edj edje_example.edc.

          -

          This file can be loaded with elm_layout_file_set:

          - -
          -elm_layout_file_set(layout, "edje_example.edj", "my_layout");
          -
          - -

          The layout component may contain as many parts/children as described in its theme file (EDC). Some of these children can have special types:

          - -
            -
          • SWALLOW (content holder)
          • -
          • BOX
          • -
          • TABLE
          • -
          - -

          Only one object can be added to a SWALLOW. The elm_layout_content_set()/get/unset functions are used to manage objects in a SWALLOW part. After being set to this part, the object's size, position, visibility, clipping and other description properties are controlled by the description of the given part (inside the Edje theme file).

          - -

          The BOX layout can be used through the elm_layout_box_*() set of functions. It is very similar to the elm_box component but the BOX layout's behavior is completely controlled by the Edje theme. The TABLE layout is like the BOX layout, the difference is that it is used through the elm_layout_table_*() set of functions.

          - -

          Signals

          -

          Elm can send Edje signals to the EDC part by using the elm_layout_signal_emit. You can also use elm_layout_signal_callback_add to receive signals.

          - -

          Use the following code to listen to any signals sent by the layout:

          - -
          -elm_layout_signal_callback_add(layout, "*", "*", _signal_cb, NULL);
          -
          -static void _signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
          -{
          -   printf("Info received from layout : %s %s\n", emission, source);
          -}
          -
          - -

          For more details on this, see the section on edje signals and layouts.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edje_animation_n.htm b/org.tizen.ui.guides/html/native/efl/edje_animation_n.htm deleted file mode 100755 index 3a64886..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_animation_n.htm +++ /dev/null @@ -1,535 +0,0 @@ - - - - - - - - - - - - - Edje Animations - - - - - -
          - -

          Edje Animations

          - -

          One of the greatest strengths of EFL and Edje is the ability to create animations. This tutorial demonstrates how Elm_Transit can create predefined animations, but you can also use the Edje library to create your own animations.

          - -

          The Edje animations are based on a very simple principle: going from one state to another. If you want to animate something with Edje, you must define two states and move from the first state to the second.

          - -

          Animating a Rectangle

          - -

          This example shows how to animate a rectangle. It is positioned in the top left corner of the window and is moved to the bottom right corner in five seconds. To do that with Edje, define a part called "rectangle" with the type RECT: this part has two descriptions (or states). In the first state, the rectangle is in is the top left corner. In the second state, it is in is the bottom right corner. To create the transition, set this EDC code for Edje to switch the object from its current state to another.

          - -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "rectangle";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               align: 0.0 0.0;
          -               rel1 {relative: 0.0 0.0;}
          -               rel2 {relative: 0.3 0.1;}
          -               color: 0 0 255 255;
          -            }
          -            description 
          -            { 
          -               state: "default" 0.5;
          -               align: 0.0 0.0;
          -               rel1 {relative: 0.7 0.9;}
          -               rel2 {relative: 1.0 1.0;}
          -               color: 0 0 255 255;
          -            }
          -         }
          -      }
          -      programs 
          -      {
          -         program 
          -         { 
          -            name: "animation,state1";
          -            source: "";
          -            signal: "load";
          -            action: STATE_SET "default" 0.5;
          -            target: "rectangle";
          -            transition: LINEAR 5;
          -         }
          -      }
          -   }
          -}
          -
          - -

          The "rectangle" part has two descriptions that share the same name, but have a different "version".

          - -
          -part 
          -{ 
          -   name: "rectangle";
          -   type: RECT;
          -   description 
          -   { 
          -      state: "default" 0.0;
          -   }
          -   description 
          -   { 
          -      state: "default" 0.5;
          -   }
          -}
          -
          - -

          The program defines when and how to move from one state to another. A program is called upon reception of a signal from a source. Here the program is called when the signal load is received from any source.

          - -
          -program 
          -{ 
          -   name: "animation,state1";
          -   source: "";
          -   signal: "load";
          -}
          -
          - -

          An action is performed upon the signal reception. In this example, the state is changed.

          - -
          -action: STATE_SET "default" 0.5;
          -
          - -

          The program has a target, here the "rectangle".

          - -
          -target: "rectangle";
          -
          - -

          The program uses a transition to perform the action.

          - -
          -transition: LINEAR 5;
          -
          - -

          This example produces a blue rectangle that moves from the upper left to the lower right corner with a linear transition in five seconds.

          - -

          Actions

          - -

          The Edje programs are not only for animations. There are different actions, for example STATE_SET and ACTION_STOP. You may also send signals with SIGNAL_EMIT.

          - -

          The STATE_SET action changes the state of the "target".

          - -

          In the following example, the state of the part named "image" changes to "default" "0.0".

          - -
          -program 
          -{
          -   name: "animate";
          -   signal: "animate";
          -   action: STATE_SET "default" 0.0;
          -   transition: LINEAR 3.0;
          -   target: "image";
          -}
          -
          - -

          The ACTION_STOP stops the program specified by "target".

          - -
          -program 
          -{
          -   name: "animate_stop";
          -   signal: "animate_stop";
          -   action: ACTION_STOP;
          -   target: "animate_loop";
          -}
          -
          - -

          The previous example stops the program defined as "target" named animate_loop. This program runs on the animate_stop signal.

          - -

          The SIGNAL_EMIT emits a signal that is used to communicate with the application directly from the theme.

          - -

          The following example emits a signal frame_move "start" when it receives the signal mouse,down,* from the video_over part. In other words, it sends the signal frame_move "start" when the mouse is pressed in the video_over part.

          - -
          -program 
          -{ 
          -   name: "video_move_start";
          -   signal: "mouse,down,*";
          -   source: "video_mover";
          -   action: SIGNAL_EMIT "frame_move" "start";
          -}
          -
          - -

          Transitions

          - -

          The transitions available are:

          -
            -
          • LIN or LINEAR: makes a linear transition and takes the duration in seconds as the parameter
          • -
          • SIN or SINUSOIDAL: makes a sinusoidal transition and takes the duration in seconds as the parameter
          • -
          • ACCEL or ACCELERATE: makes an accelerated transition and takes the duration in seconds as the parameter
          • -
          • DECEL or DECELERATE: makes a decelerated transition and takes the duration in seconds as the parameter
          • -
          • ACCEL_FAC or ACCELERATE_FACTOR: makes an accelerated transition and takes the duration and the factor as the parameters
          • -
          • DECEL_FAC or DECELERATE_FACTOR: makes a decelerated transition and takes the duration and the factor as the parameters
          • -
          • SIN_FAC or SINUSOIDAL_FACTOR: makes a sinusoidal transition and takes the duration and the factor as the parameters
          • -
          • DIVIS or DIVISOR_INTERP: takes 3 parameters: -
              -
            • the duration
            • -
            • the initial gradient start (0.0 is horizontal, 1.0 is diagonal (linear), 2.0 is twice the gradient of linear, and so on)
            • -
            • an integer factor that defines how much the value swings outside the gradient to come back to the final resting spot at the end. 0.0 for the third parameter is equivalent to linear interpolation. Note that DIVIS may exceed 1.0.
            • -
            -
          • -
          • BOUNCE: makes a bounce transition and takes 3 parameters: -
              -
            • the duration
            • -
            • how much the bounce decays, with 0.0 giving linear decay per bounce, and higher values giving more decay
            • -
            • the number of bounces (rounded down to the nearest integer value)
            • -
            -
          • -
          • SPRING: makes a spring transition and takes 3 parameters: -
              -
            • the duration
            • -
            • the decay, with the level exceeding 1.0 on the outer swings
            • -
            • the number of spring swings
            • -
            -
          • -
          - -

          There are graphical representations of these effects in the Ecore_Evas section above.

          - -

          Chaining Edje Programs

          - -

          To define a couple of Edje programs and chain them, we can, for example, create a program to make the rectangle return to its initial state with another transition (such as BOUNCE).

          - -

          Use the statement after in the first program. after takes the name of the transition to run when the program is done.

          - -
          -after: "animation,state0";
          -
          - -

          This is how to add the bounce animation. To return the blue rectangle to its initial position with a BOUNCE transition: it bounces with a factor of 1.8, six times. This program is only to be used at the end of the first one, so it does not have any signal statement.

          - -
          -program 
          -{ 
          -   name: "animation,state0";
          -   source: "";
          -   signal: "";
          -   action: STATE_SET "default" 0.0;
          -   target: "rectangle";
          -   transition: BOUNCE 5 1.8 6;
          -}
          -
          - -

          Playing on Signals

          - -

          The programs start when they receive a signal from a source. Edje handles many kind of signals, including mouse events.

          - - - - - - - - - - -
          Note
          To show the signals, use edje_player -p myfile.edj.
          - -

          For example, in another transition the rectangle is left clicked. The corresponding signal name is mouse,clicked,1.

          - -

          For this transition, define a new state. This state changes the color and the position of the rectangle.

          - -
          -// To be placed in the "part" definition
          -description 
          -{ 
          -   state: "color" 0.0;
          -   rel1 {relative: 0.3 0.3;}
          -   rel2 {relative: 0.7 0.4;}
          -   color: 255 0 0 255;
          -}
          -
          - -

          The program is as follows:

          - -
          -program 
          -{ 
          -   name: "animation,color";
          -   source: "rectangle";
          -   signal: "mouse,clicked,1";
          -   action: STATE_SET "color" 0.0;
          -   target: "rectangle";
          -   transition: SIN 2;
          -}
          -
          - -

          This starts when the rectangle is left clicked.

          - -

          If you want to send a signal from your application when you use signals to start transitions, create a program waiting for your own special signal. For example:

          - -
          -program 
          -{ 
          -   name: "animation,menu_side,hide";
          -   source: "MenuButton";
          -   signal: "hide,sidemenu";
          -   action: STATE_SET "default" 1.0;
          -   target: "menu/side";
          -   transition: LINEAR 0.2;
          -}
          -
          - -

          This program changes the state of the target named animation,menu_side,hide to "default" 1.0. It waits for the hide,sidemenu signal emitted by a source called MenuButton.

          - -
          -edje_object_signal_emit(layout, "hide,sidemenu", "MenuButton");
          -
          - -

          This statement sends a signal named hide,sidemenu with a source named MenuButton to the object called layout.

          - -

          The edje_object_signal_emit function emits a signal on an Evas_Object part of the application.

          - -
          -edje_object_signal_emit(Evas_Object *obj,
          -                        const char *emission,
          -                        const char *source)
          -
          - -
            -
          • The first parameter is the Evas_Object, which emits the signal (layout in the example).
          • -
          • The second parameter is the emission string (the name of the signal hide,sidemenu in the example).
          • -
          • The third parameter is the source of the signal (the name of the source, MenuButton in the example).
          • -
          - -

          If you use the Elementary in the application, you can use elm_object_signal_emit. It functions exactly the same way as edje_object_signal_emit and takes the same parameters.

          - - - - - - - - - - -
          Note
          To find a complete example, use elm_object_signal_emit in Creating Mobile Menus.
          - -

          Rotating with Edje

          - -

          The Edje library allows you to rotate objects, using the map statement. For example, if you want to rotate the blue rectangle on a right click, you must define a new rotate state. To enable the map on you object you must add a map part to your default state.

          - -
          -map 
          -{
          -   on: 1;
          -   smooth: 1;
          -   perspective_on: 1;
          -   rotation.x: 0;
          -   rotation.y: 0;
          -   rotation.z: 0;
          -}
          -
          - -
            -
          • on: 1; enables the map on the object
          • -
          • perspective_on: 1, enables the perspective when rotating, even without a perspective point object
          • -
          • smooth: 1; enables a smooth map rendering
          • -
          • The rotation statements define the default rotation of the object on x, y, and z axes.
          • -
          - -

          To add a new rotate state with a rotation around any axis, do the following.

          - -
          -description 
          -{ 
          -   state: "rotate" 0.0;
          -   inherit: "default" 0.0;
          -   map.rotation.z: 120;
          -}
          -
          - -

          This rotate state inherits all the default state properties, but changes the value of map.rotation.z from 0° to 120°.

          - -

          To set a program to run the rotate state, do the following.

          - -
          -program 
          -{ 
          -   name: "animation,rotate";
          -   source: "rectangle";
          -   signal: "mouse,clicked,3";
          -   action: STATE_SET "rotate" 0.0;
          -   target: "rectangle";
          -   transition: LIN 5;
          -}
          -
          - -

          This program runs on a right click on the rectangle object.

          - -

          The complete code of this example is as follows.

          - -
          -collections 
          -{
          -   group 
          -   { 
          -      name: "main";
          -      parts 
          -      {
          -         part 
          -         { 
          -            name: "rectangle";
          -            type: RECT;
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               align: 0.0 0.0;
          -               rel1 {relative: 0.0 0.0;}
          -               rel2 {relative: 0.3 0.1;}
          -               map 
          -               {
          -                  on: 1;
          -                  smooth: 1;
          -                  perspective_on: 1;
          -                  rotation 
          -                  {
          -                     z: 0;
          -                     x: 0;
          -                     y: 0;
          -                  }
          -               }
          -               color: 0 0 255 255;
          -            }
          -            description 
          -            { 
          -               state: "default" 0.5;
          -               align: 0.0 0.0;
          -               rel1 {relative: 0.7 0.9;}
          -               rel2 {relative: 1.0 1.0;}
          -               color: 0 0 255 255;
          -            }
          -            description 
          -            { 
          -               state: "color" 0.0;
          -               rel1 {relative: 0.3 0.3;}
          -               rel2 {relative: 0.7 0.4;}
          -               color: 255 0 0 255;
          -            }
          -            description 
          -            { 
          -               state: "rotate" 0.0;
          -               inherit: "default" 0.0;
          -               map.rotation.z: 120;
          -            }
          -         }
          -      }
          -      programs 
          -      {
          -         program 
          -         { 
          -            name: "animation,state1";
          -            source: "";
          -            signal: "load";
          -            action: STATE_SET "default" 0.5;
          -            target: "rectangle";
          -            transition: LINEAR 1;
          -            after: "animation,state0";
          -         }
          -         program 
          -         { 
          -            name: "animation,state0";
          -            source: "";
          -            signal: "";
          -            action: STATE_SET "default" 0.0;
          -            target: "rectangle";
          -            transition: BOUNCE 2 1.8 26;
          -         }
          -         program 
          -         { 
          -            name: "animation,color";
          -            source: "rectangle";
          -            signal: "mouse,clicked,1";
          -            action: STATE_SET "color" 0.0;
          -            target: "rectangle";
          -            transition: SIN 2;
          -         }
          -         program 
          -         { 
          -            name: "animation,rotate";
          -            source: "rectangle";
          -            signal: "mouse,clicked,3";
          -            action: STATE_SET "rotate" 0.0;
          -            target: "rectangle";
          -            transition: LIN 5;
          -         }
          -      }
          -   }
          -}
          -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_animation_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/edje_animation_tutorial_n.htm deleted file mode 100755 index aa85f96..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_animation_tutorial_n.htm +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - - - - - - - - Creating Edje Animations - - - - - - -
          -

          Creating Edje Animations

          - - -

          One of the greatest strengths of EFL and Edje is the ability to create animations. This tutorial demonstrates how Elm_Transit can create pre-defined animations, but you can also use the Edje library to create your own animations.

          - -

          Animating on Application Start-up

          - - -

          The goal of this tutorial is to create an animation target and buttons to start animations, all this in an EDC (Edje Data Collection) file.

          -

          First create an application using Basic EDC UI Application. This model provides a simple application just like the one used in the previous chapter, but with one more element: an .edc file.

          -

          Animations can be run at application startup. By default the Basic EDC UI Application model produces an empty window with a title. In this example a Tizen logo is added to the window and the behavior of the window title is changed.

          -

          The images used by the Edje file are stored in the edje/images directory of the application. Copy the Tizen logo available in shared/res/<yourapplicationname>.png into the Edje image directory edje/images. Then add the image to the Edje images collection.

          -
          images 
          -{
          -   image: "edceffects.png" COMP;
          -   image: "tizen-logo.png" COMP;
          -}
          -
          - -

          Then add an Edje part using the small logo: this part has two states. This is the first important notion for animations. The STATE describes the appearance of a part: size, position, color, etc.

          -

          In this example, the part has two states, default and down-state:

          -
          // An image using the tizen logo
          -part 
          -{ 
          -   name: "logo";
          -   type: IMAGE;
          -   description 
          -   { 
          -      state: "default" 0.0;
          -      max: 63 63;
          -      min: 63 63;
          -      image { normal: "small-logo.png"; }
          -      rel1.relative: 0.1 0.0;
          -      rel2.relative: 0.0 0.0;
          -   }
          -
          -   description 
          -   { 
          -      state: "down-state" 1.0;
          -      inherit: "default" 0.0;
          -      rel1.relative: 0.1 0.92;
          -      rel2.relative: 0.05 1.0;
          -   }
          -}
          -

          The logo part has the IMAGE type. The default state contains in the first description of the part sets:

          -
            -
          • the maximum and minimum size using the min and max statements
          • -
          • the image to use in this part
          • -
          • the default position.
          • -
          -

          The second state, down-state, inherits all of the default's attributes, and only changes the position to put the image at the bottom of the application window.

          -

          These two states are the start and end states of the animation. To actually create the animation, add a program to the Edge programs collection.

          -
          // Icon drop animation
          -program 
          -{ 
          -   name: "animation,state1";
          -   source: "";
          -   signal: "load";
          -   action: STATE_SET "down-state" 1.0;
          -   target: "logo";
          -   transition: BOUNCE 2.5 0.0 5.0;
          -}
          -

          This program is named animation,state1 and is started when the application receives the load signal immediately on startup. It runs the STATE_SET action so it changes the object state from default to down-state. The target of the program is the logo part.

          -

          In order to switch from one state to another, it uses a transition of the BOUNCE type with 3 parameters, the bounce_decay, the number_of_bounces, and the duration which here is set to five seconds.

          -

          This produces an falling and bouncing effect.

          -

          Also add an animation for the window title to make it move from the left to the right with a bounce effect while growing the font size.

          -

          Create a new state on the part called "txt_title" inside which both the font size and position are changed.

          -
          part 
          -{ 
          -   name: "txt_title";
          -   type: TEXT;
          -   mouse_events: 0;
          -
          -   // The default State
          -   description 
          -   { 
          -      state: "default" 0.0;
          -      align: 0.0 0.0;
          -      rel1 { relative: 0.0 0.0; }
          -      rel2 { relative: 0.0 0.0; }
          -      text 
          -      { 
          -         font: "Tizen:style=regular";
          -         size: 24;
          -         min: 1 1;
          -      }
          -      color: 0 0 0 255;
          -   }
          -
          -   // The "Bigger" state
          -   description 
          -   { 
          -      state: "Bigger" 0.0;
          -      align: 0.0 0.0;
          -      rel1 { relative: 0.75 0.0; }
          -      rel2 { relative: 0.0 0.0; }
          -      text 
          -      { 
          -         font: "Tizen:style=regular";
          -         size: 28;
          -         min: 1 1;
          -      }
          -      color: 0 0 0 255;
          -   }
          -}
          -
          -

          Create a program to animate this part on startup, just like the small Tizen logo.

          -
          // Make the title bigger
          -program 
          -{ 
          -   name: "animation,bigtitle";
          -   source: "";
          -   signal: "load";
          -   action: STATE_SET "Bigger" 1.0;
          -   target: "txt_title";
          -   transition: LINEAR 5.0;
          -}
          -
          -

          This program goes from the default state to the bigger state in five seconds with a LINEAR effect, automatically running on the application startup.

          - -

          Animating Object on Click

          - -

          All the previous animations are automatic and do not have any relation with the user's actions. Next animate a part by clicking on another one. Make the title restore its default aspect when clicking on the small logo.

          -

          The parts and the states are already defined. The animation goes back to the default state, there is no need to add any parts or states: only add a program which makes the transition when clicking on logo part.

          -
          // Make the title go back to normal
          -program 
          -{
          -   name: "animation,normaltitle";
          -   source: "logo";
          -   signal: "mouse,clicked,*";
          -   action: STATE_SET "default" 1.0;
          -   target: "txt_title";
          -   transition: LINEAR 0.5;
          -}
          -

          This program starts when the application receives the signal mouse,clicked,* (any button of the mouse is clicked) from the part called logo, (source). It performs the STATE_SET action and sets the default state on the target txt_file part with a LINEAR transition.

          -

          When clicking any mouse button on the small logo, the title goes back to its original state.

          -

          Rotating Parts

          -

          Next add two more buttons to the application and create programs to animate a target.

          -

          It is possible to create a button with Edje from scratch, but to save time, the SWALLOW part is used in this example to store Elementary UI components.

          -

          First create the SWALLOW parts, and then the Elementary UI components in the .c file.

          -
          // Container for the rotate button
          -part 
          -{
          -   type: SWALLOW;
          -   name: "btn/rotate";
          -   description 
          -   {
          -      state: "default" 0.0;
          -      rel1.relative: 0.10 0.80;
          -      rel2.relative: 0.30 0.90;
          -   }
          -}
          -

          This part is called btn/rotate, it only has a SWALLOW type and a default state with its position being on the bottom left of the screen.

          -
          // Container for the grow button
          -part 
          -{
          -   type: SWALLOW;
          -   name: "btn/grow";
          -   description 
          -   {
          -      state: "default" 0.0;
          -      rel1.relative: 1.02 0;
          -      rel1.to: "btn/rotate";
          -      rel2.relative: 2.02 1;
          -      rel2.to: "btn/rotate";
          -   }
          -}
          -

          This second SWALLOW part is very similar to the first one. It is placed relatively to btn/rotate, in order to remain next to it.

          -

          Next create the actual UI components. This is done in the .c file and is very similar to what is done for the buttons in the first chapter.

          -

          This code is added to the create_base_ui function.

          -
          // Creation button in the app window
          -ad->button = elm_button_add(ad->win);
          -elm_object_text_set(ad->button, "Rotate");
          -// Add the button to the edje layout container called "btn/rotate"
          -elm_object_part_content_set(ad->layout, "btn/rotate", ad->button);
          -evas_object_show(ad->button);
          -
          -// Creation a up button in the app window
          -ad->btn_up = elm_button_add(ad->win);
          -// Add the button to the edje layout container called "btn/grow"
          -elm_object_text_set(ad->btn_up, "Grow");
          -elm_object_part_content_set(ad->layout, "btn/grow", ad->btn_up);
          -evas_object_show(ad->btn_up);
          -

          In the default Basic EDC UI Application, the Edje layout is loaded by default. Create two Elementary buttons and add them to the SWALLOW containers, without having to setup sizes or positions as this is done in the SWALLOW container.

          -

          Note that the part name is very important because it is used to be merged the Elementary UI component and the SWALLOW part.

          -

          When the buttons placed and set, create the animation target. it is done in the EDC file.

          -

          Add the animation target part.

          -

          The part initialization and the default state:

          -
          // The animation target
          -part 
          -{
          -   name: "atarget";
          -   type: IMAGE;
          -
          -   // Default state
          -   description 
          -   {
          -      state: "default" 0.0;
          -      image { normal: "tizen-logo.png"; }
          -      color: 255 0 0 255; // red
          -      rel1 { relative: 0.3 0.3; }
          -      rel2 { relative: 0.7 0.4; }
          -   }
          -}
          -
          -

          This part is an image displaying a big Tizen logo, placed on the top of the screen more or less centered.

          -

          Create a state to change the color and add the map statement.

          -
          // The rotate state
          -description 
          -{
          -   state: "rotate" 0.0;
          -   inherit: "default" 0.0;
          -
          -   map 
          -   {
          -      // Enable Map on the part
          -      on: 1;
          -      // Enable smooth rendering
          -      smooth: 1;
          -      // Enable perspective
          -      perspective_on: 1;
          -
          -      // Apply rotations on the part
          -      rotation.x: 0;
          -      rotation.y: 0;
          -      rotation.z: 0;
          -   }
          -   color: 0 255 0 255; // green
          -}
          -

          This part changes the color to green and defines the map. This statement makes rotations possible on an Edje part. Rotations are done around the x, y or z axes. In this example, the map is enabled and a 0° rotation is applied around each axis.

          -

          Add a state with a rotation around the z axis of 360°.

          -
          description 
          -{
          -   state: "rotate" 1.0;
          -   inherit: "rotate" 0.0;
          -   map.rotation.z: 360;
          -}
          -

          This state inherits from the default state parameters and add a rotation around the z axis.

          -

          Finally add a state to the other button animation grow. Change the size of the animation target and add an offset.

          -
          // The grow state
          -description 
          -{
          -   state: "grow" 0.0;
          -   color: 0 0 255 255; // blue
          -   rel1 
          -   {
          -      relative: 0.2 0.2;
          -      offset: 0.3 0.3;
          -   }
          -   rel2 
          -   {
          -      relative: 0.7 0.4;
          -      offset: 0.3 0.3;
          -   }
          -}
          -

          The last step is to create the programs to make all these states animate.

          -

          To make the rotation animation smoother, create and chain several programs with different durations.

          -

          First create the main one: it goes from the default state to the rotate 0.0 state in 0.2 seconds.

          -

          Note that the states are all named the same way (rotate) but not with the same version. This version allows you to have more than one state with the same name, in fact the actual name of the state is the name plus the version.

          -
          // Change the color of target to green
          -program 
          -{
          -   name: "rotate,target";
          -   source: "btn/rotate";
          -   signal: "mouse,clicked,*";
          -   action: STATE_SET "rotate" 0.0;
          -   target: "atarget";
          -   transition: SIN 0.2;
          -   after: "rotate,target,2";
          -}
          -

          The program starts when the btn/rotate part is clicked with any mouse button. When the animation ends, it calls the next one called rotate,target,2.

          -
          // Rotate 360°
          -program 
          -{
          -   name: "rotate,target,2";
          -   action: STATE_SET "rotate" 1.0;
          -   target: "atarget";
          -   transition: SIN 0.7;
          -   after: "rotate,end";
          -}
          -

          This program sets the part state to rotate 1.0 in 0.7 seconds, and when done calls the next one rotate,end.

          -
          // Go back to the normal
          -program 
          -{
          -   name: "rotate,end";
          -   action: STATE_SET "rotate" 0.0;
          -   target: "atarget";
          -   transition: LINEAR 0.2;
          -}
          -

          rotate,end is the last program of the rotation effect: it sets the state to rotate 0.0 very fast.

          -

          The last program of this example is the grow effect, it switches from one state to another.

          -
          // Grow the target and go back to normal state
          -program 
          -{
          -   name: "grow,target";
          -   source: "btn/grow";
          -   signal: "mouse,clicked,*";
          -   action: STATE_SET "grow" 1.0;
          -   after: "go,default";
          -   target: "atarget";
          -   transition: SINUSOIDAL 1.0;
          -}
          -

          It starts when the btn/grow part is clicked, it goes from the current state to grow 1.0 in one second. It then calls the go,default program. In this program, both size and color change during the transition.

          -

          The go,default program sets the status back default for the animation target.

          -
          // Go back to normal (default) state
          -program 
          -{
          -   name: "go,default";
          -   action: STATE_SET "default" 1.0;
          -   target: "atarget";
          -   transition: SIN 1.0;
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edje_color_n.htm b/org.tizen.ui.guides/html/native/efl/edje_color_n.htm deleted file mode 100755 index 48d272a..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_color_n.htm +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - - - - - - - - Using Edje Color Classes - - - - - - -
          -

          Using Edje Color Classes

          - -

          This tutorial demonstrates how you can change the color of 2 or more parts using Edje color classes.

          -

          If a part is assigned with a color class, setting color values to this class causes all those parts to have their colors multiplied by the values. Setting the values to a color class affects all parts within that color class at process level, while at object level, it only affects the parts inside a specified object.

          - -

          Create a simple application with a menu and separate screens for each Edje Animation function:

          - -
            -
          1. In the Tizen IDE, go to Tizen Native project > UI application > EDC and create a new project named colorclass.
          2. - -
          3. Open the colorclass.edc file and replace it with the following code: -
            color_classes 
            -{
            -   color_class 
            -   {
            -      name: "A";
            -      color: 255 255 0 255;
            -      color2: 255 0 0 255;
            -      color3: 0 0 255 255;
            -   }
            -   color_class 
            -   {
            -      name: "B";
            -      color: 0 255 0 255;
            -      color2: 0 0 255 255;
            -      color3: 255 0 0 255;
            -   }
            -   color_class 
            -   {
            -      name: "C";
            -      color: 125 0 0 255;
            -      color2: 255 0 0 255;
            -      color3: 0 0 255 255;
            -   }
            -}
            -
            -collections 
            -{
            -   group 
            -   { 
            -      name: "main";
            -      parts 
            -      {
            -         part 
            -         { 
            -            name: "bg";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "textA";
            -            type: TEXT;
            -            effect: OUTLINE_SHADOW;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "A";
            -               rel1.relative: 0.0 0.0;
            -               rel2.relative: 0.2 0.2;
            -               color2: 255 255 255 255;
            -               color3: 255 255 255 255;
            -               text 
            -               {
            -                  text: "A:";
            -                  size: 44;
            -               }
            -            }
            -         }
            -         part 
            -         { 
            -            name: "textB";
            -            type: TEXT;
            -            effect: OUTLINE_SHADOW;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "B";
            -               rel1.relative: 0.0 0.2;
            -               rel2.relative: 0.2 0.4;
            -               color2: 255 255 255 255;
            -               color3: 255 255 255 255;
            -               text 
            -               {
            -                  text: "B:";
            -                  size: 44;
            -               }
            -            }
            -         }
            -         part 
            -         { 
            -            name: "textC";
            -            type: TEXT;
            -            effect: OUTLINE_SHADOW;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "C";
            -               rel1.relative: 0.0 0.4;
            -               rel2.relative: 0.2 0.6;
            -               color2: 255 255 255 255;
            -               color3: 255 255 255 255;
            -               text 
            -               {
            -                  text: "C:";
            -                  size: 44;
            -               }
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect1";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "A";
            -               rel1.relative: 0.2 0.0;
            -               rel2.relative: 0.4 0.2;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect2";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "B";
            -               rel1.relative: 0.4 0.2;
            -               rel2.relative: 0.6 0.4;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect3";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "A";
            -               rel1.relative: 0.6 0.0;
            -               rel2.relative: 0.8 0.2;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect4";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color_class: "B";
            -               rel1.relative: 0.8 0.2;
            -               rel2.relative: 1.0 0.4;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect5";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color: 125 0 0 255;
            -               color_class: "C";
            -               rel1.relative: 0.6 0.4;
            -               rel2.relative: 0.8 0.6;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "rect6";
            -            type: RECT;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               color: 255 255 255 255;
            -               color_class: "C";
            -               rel1.relative: 0.8 0.4;
            -               rel2.relative: 1.0 0.6;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "swallow.btn1";
            -            type: SWALLOW;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               rel1.relative: 0.0 0.8;
            -               rel2.relative: 0.45 1.0;
            -            }
            -         }
            -         part 
            -         { 
            -            name: "swallow.btn2";
            -            type: SWALLOW;
            -            description 
            -            { 
            -               state: "default" 0.0;
            -               rel1.relative: 0.55 0.8;
            -               rel2.relative: 1.0 1.0;
            -            }
            -         }
            -      }
            -   }
            -}
            - -

            Setting the color class of a part causes its colors to be multiplied by color_class color values. To see how the color class affects the shadow and outline colors, set those colors as white in the part:

            - -
            color2: 255 255 255 255;
            -color3: 255 255 255 255;
            - -

            Parts with color_class "C" have different colors because their base colors are different.

            -
          4. - -
          5. Replace the create_base_gui() function with the following code: - -
            static void
            -btn1_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   edje_color_class_set("A", rand()%255, rand()%255, rand()%255, 255,
            -                        rand()%255, rand()%255, rand()%255, 255,
            -                        rand()%255, rand()%255, rand()%255, 255);
            -}
            -static void
            -btn2_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   edje_color_class_set("B", rand()%255, rand()%255, rand()%255, 255,
            -                        rand()%255, rand()%255, rand()%255, 255,
            -                        rand()%255, rand()%255, rand()%255, 255);
            -}
            -
            -static void
            -create_base_gui(appdata_s *ad)
            -{
            -   char edj_path[PATH_MAX] = {0, };
            -
            -   // Window
            -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            -   elm_win_conformant_set(ad->win, EINA_TRUE);
            -   elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -   if (elm_win_wm_rotation_supported_get(ad->win)) 
            -   {
            -      int rots[4] = { 0, 90, 180, 270 };
            -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            -   }
            -
            -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            -
            -   // Conformant
            -   ad->conform = elm_conformant_add(ad->win);
            -   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            -   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_win_resize_object_add(ad->win, ad->conform);
            -   evas_object_show(ad->conform);
            -
            -   // Base layout
            -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -   ad->layout = elm_layout_add(ad->win);
            -   elm_layout_file_set(ad->layout, edj_path, GRP_MAIN);
            -   evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad);
            -   elm_object_content_set(ad->conform, ad->layout);
            -
            -   // Buttons
            -   ad->btn1 = elm_button_add(ad->win);
            -   elm_object_part_content_set(ad->layout, "swallow.btn1", ad->btn1);
            -   evas_object_smart_callback_add(ad->btn1, "clicked", btn1_cb, ad);
            -   elm_object_part_text_set(ad->btn1, NULL, "Change A");
            -   ad->btn2 = elm_button_add(ad->win);
            -   elm_object_part_content_set(ad->layout, "swallow.btn2", ad->btn2);
            -   evas_object_smart_callback_add(ad->btn2, "clicked", btn2_cb, ad);
            -   elm_object_part_text_set(ad->btn2, NULL, "Change B");
            -
            -   // Show the window
            -   evas_object_show(ad->win);
            -}
            - -

            Pressing the Change A button changes all colors of all parts with color_class set as "A" but does not affect other parts. The actual color, color2, and color3 values remain unchanged but they are multiplied by values from the color class.

            -

            You can omit the color class declaration in the .edc file and still use it in parts. There are no visual effects unless you change the color class in the code. For example, you can comment out the color class "B" and see what happens when you press the Change B button.

            -
          6. - -

            Figure: Edje colorclass application

            -

            Edje colorclass application

            - -
          - - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edje_files_n.htm b/org.tizen.ui.guides/html/native/efl/edje_files_n.htm deleted file mode 100755 index 55b54b3..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_files_n.htm +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - Handling Edje Files - - - - - - -
          -

          Handling Edje Files

          - -

          This tutorial demonstrates how you can manage EDJ files. An EDJ file is a specific eet file that collects layouts. The Edje layout is called Style and created using the EDC language. The file that contains the layout collection called Theme.

          - -

          Initializing the Application

          - -

          The following example shows a typical Elementary application that creates a window entitled Genlist Basic Tutorial. It is consisted of a conformant widget that contains a naviframe widget. The genlist goes inside the naviframe.

          - -
          static void
          -create_base_gui(appdata_s *ad)
          -{
          -   char edj_path[PATH_MAX] = {0, };
          -
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_conformant_set(ad->win, EINA_TRUE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   if (elm_win_wm_rotation_supported_get(ad->win)) 
          -   {
          -      int rots[4] = {0, 90, 180, 270};
          -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -   }
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, ad);
          -
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          -   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -
          -   // Naviframe
          -   ad->navifr = elm_naviframe_add(ad->win);
          -   elm_object_content_set(ad->conform, ad->navifr);
          -   eext_object_event_callback_add(ad->navifr, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, ad);
          -
          -   // Genlist
          -   ad->itc = elm_genlist_item_class_new();
          -   ad->itc->func.text_get =_genlist_item_text_get;
          -
          -   ad->genlist = elm_genlist_add(ad->win);
          -   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
          -
          -   // Show window after base GUI is set up
          -   evas_object_show(ad->win);
          -}
          -
          -static bool
          -app_create(void *data)
          -{
          -   // Initialize UI resources and application data
          -   // If this function returns true, the main loop of application starts
          -   // If this function returns false, the application is terminated
          -   appdata_s *ad = data;
          -
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          - -

          Declare the struct appdata:

          - -
          typedef struct appdata
          -{
          -   Evas_Object *win;
          -   Evas_Object *conform;
          -   Evas_Object *navifr;
          -   Evas_Object *genlist;
          -   Eina_List *list;
          -   Elm_Genlist_Item_Class *itc;
          -} 
          -appdata_s;
          - -

          Loading the Collection List from an EDJ File

          - -

          Edje provides the functionality to manipulate the EDJ files. First, get the list of styles from EDJ file:

          - -
          // Get the collection list from the EDJ file
          -app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          -ad->list = edje_file_collection_list(edj_path);
          - -

          When you do not use the collection list, delete it:

          - -
          static void
          -win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   // Free the collection list
          -   edje_file_collection_list_free(ad->list);
          -   ui_app_exit();
          -}
          - - - - - - - - - - -
          Note
          The list returned after using the edje_file_collection_list() function must only be deleted using the edje_file_collection_list_free() function.
          - -

          Add the item in the genlist to display the list:

          - -
          EINA_LIST_FOREACH(ad->list, l, str)
          -{
          -   elm_genlist_item_append(ad->genlist, ad->itc, str, NULL, ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
          -}
          - - -

          Creating an Edje Object

          - -

          Implement callbacks for the clicked (tapped) event. Check that the required style exists using the edje_file_group_exists() function. The first argument is the path to EDJ file and style name. Create the Edje object and load the given style.

          - -
          static void
          -_genlist_clicked(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   Elm_Object_Item *eoi = NULL;
          -   const char *str;
          -   char edj_path[PATH_MAX] = {0, };
          -   Evas_Object *edje_object;
          -
          -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          -   eoi = elm_genlist_selected_item_get(obj);
          -
          -   str = elm_object_item_part_text_get(eoi, "elm.text");
          -   // Check whether a group matching glob exists in an edje file
          -   // If there is no matching group
          -   if (!edje_file_group_exists(edj_path, str)) return;
          -
          -   // Load the given style to the object
          -   edje_object = edje_object_add(evas_object_evas_get(ad->win));
          -   edje_object_file_set(edje_object, edj_path, str);
          -   // Check object loading errors
          -   if (edje_object_load_error_get(edje_object) != EDJE_LOAD_ERROR_NONE)
          -   {
          -      evas_object_del(edje_object);
          -
          -      return;
          -   }
          -   evas_object_size_hint_weight_set(edje_object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_naviframe_item_simple_push(ad->navifr, edje_object);
          -}
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edje_intro_n.htm b/org.tizen.ui.guides/html/native/efl/edje_intro_n.htm deleted file mode 100755 index dd8df7b..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_intro_n.htm +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - - - - - - Introduction to EDC Programming - - - - - -
          - -

          Introduction to EDC Programming

          - - - -

          This programming guide shows you how to write an EDC file that can be used to theme a Tizen application. It describes concepts about parts positioning and resizing. It also explains part animations that can be done through programs.

          - -

          What is an EDC File?

          - -

          An EDC file stands for Edje data collection. It is a text file that contains special code format describing the position, size, and other parameters of graphical elements that compose the visual aspect of your application. In addition to graphical elements, it can also handle sounds.

          - -

          The syntax for the Edje data collection files follows a simple structure of "blocks { .. }" that can contain "properties: ..", more blocks, or both.

          - -

          An EDC file has the ".edc" extension.

          - -

          Compiling the EDC File

          -

          EDC file needs to be compiled into a ".edj" file using Edje library tools. After compiling the ".edj" file can be used by a native Tizen application.

          - -

          Here is an example about compiling helloworld.edc to ".edj" file using edje_cc tool:

          - -
          -$ edje_cc helloworld.edc
          -
          - -

          This command creates a helloworld.edj file.

          - -

          An EDC file can use external files such as sounds, images, or fonts. The path to these resources are passed to the edje_cc tool so that they are included in the final ".edj" file.

          - -
          -$ edje_cc -sd $SOUNDS_DIR -fd $FONTS_DIR -id $IMAGES_DIR
          -
          - -

          SOUNDS_DIR, FONTS_DIR, and IMAGES_DIR are the paths for sounds, fonts, and images resources respectively.

          - -

          Tizen SDK calls edje_cc during the project building if it finds an EDC source file in the ./res/edje/ directory.

          - -
          -Building file: ../res/edje/helloworld.edc
          -Invoking: EDC Resource Compiler
          -edje_cc -sd ../edje/sounds -fd ../edje/fonts -id ../edje/images ../res/edje/helloworld.edc ../res/edje/helloworld.edj
          -
          - - -

          The Tizen SDK compilation log extract shows you that if your EDC file uses pictures, they must be copied to the ./edje/images directory. Fonts and sounds go to the ./edje/fonts and ./edje/sounds directory respectively. The SDK builds the helloworld.edj file in the ./res/edje/ folder.

          - -

          Writing a Simple EDC File

          -

          The code example below shows you the structure of an EDC file. It is a collection of groups that contain parts and programs.

          - -
          -collections 
          -{
          -   group 
          -   {
          -      name: "my_group";
          -      parts {}
          -      programs {}
          -   }
          -}
          -
          - -

          Groups are identified with a name, parts correspond to the graphical elements. Each one of them can have several states that describe a specific position, size, and visual aspect. Programs contain the program code, such as interaction with the main application through signals. Also animations are defined here (changing a part state using an animated transition).

          - -

          The description field is where the state of a part is written.

          - -
          -part
          -{
          -   description 
          -   { 
          -      state: "default" 0.0;
          -   }
          -   description 
          -   { 
          -      state: "state1" 0.0;
          -   }
          -   description 
          -   { 
          -      state: "state2" 0.0;
          -   }
          -}
          -
          - -

          As an example, here is a simple EDC file that contains only one part and one program. The part is a rectangle with blue state and red state, the program changes the state from blue to red when user clicks on the rectangle.

          - -
          -collections 
          -{
          -   group 
          -   {
          -      name: "example";
          -      parts 
          -      {
          -         // create the part
          -         part 
          -         { 
          -            name: "rectangle";
          -            // set the type to RECT (rectangle)
          -            type: RECT;
          -            // default state (blue color)
          -            description 
          -            { 
          -               state: "default" 0.0;
          -               align: 0.0 0.0;
          -               // blue color
          -               color: 0 0 255 255;
          -            }
          -            // second state (red color)
          -            description 
          -            { 
          -               state: "red" 0.0;
          -               align: 0.0 0.0;
          -               // red color
          -               color: 255 0 0 255;
          -            }
          -         }
          -      }
          -      programs 
          -      {
          -         // create a program
          -         program 
          -         { 
          -            name: "change_color";
          -            // program is triggered on mouse click
          -            signal: "mouse,clicked,*";
          -            source: "*";
          -            // set the red state of the "rectangle" part
          -            action: STATE_SET "red" 0.0;
          -            target: "rectangle";
          -         }
          -      }
          -   }
          -}
          -
          - -

          A program is triggered when receiving a signal from a specific source (here all the sources are taken into account). When launched, it does the action (changing the state of a part) on the target (the rectangle).

          - -

          Quick How-tos

          - -
          • Adding an element on the screen -

            Add a new part inside the parts block.

          • -
          • Using an image -

            List the image in the images block, make sure the part has type "IMAGE" and set the normal property inside description.image of part.

          • -
          • Using the same color definitions across multiple elements -

            Define a color class and set the description.color_class property.

          • -
          • Positioning or resizing a part (relative and absolute positioning) -

            Fill in the rel1 and rel2 structures inside the description block.

          • -
          • Hiding a part -

            Set the visible property to 0.

          • -
          • Animating a part -
            1. Create several description blocks inside your part and give each of them a different value for state. Set one description for the initial state and one for the end state.

            2. -
            3. Create a program with an action that is STATE_SET "end_state" 0.0; and with a target that is the name of the part. You can also set a non-default transition.

            4. -
            5. When defining the second description, inherit from the first part in order to re-use the values which are already defined.

            6. -
            7. The after property of the program block is used to trigger another program after the animation is done. It can be used to trigger another animation or to emit a signal to the C part of the program.

          • -
          • Making a genlist item theme -

            Create a group with one part element for each part that can be filed from the C code and set the items properties inside the group element:

            - -
            -items: "texts" "text_part_1 text_part_2";
            -items: "icons" "image_part_1 image_part_2";
            -
            -

            On the C side, the text_get and content_get callback are called respectively with text_part_1 and text_part_2, and image_part_1 and image_part_2.

          • - -
          • Using the image masking effect -

            EDC files support an image masking effect that applies the transparency of a mask image to a content object.

            - -

            Figure: Masking effect

            -

            Masking effect

            - -

            To use the image masking effect, add 2 new parts inside the parts block used as a content and mask. Set the mask using the clip_to keyword in the content part.

            -
            -part 
            -{
            -   name: "bg";
            -   type: RECT;
            -   description 
            -   {
            -      state: "default" 0.0;
            -   }
            -}
            -part 
            -{
            -   name: "text";
            -   type: TEXTBLOCK;
            -   clip_to: "mask";
            -   description 
            -   {
            -      state: "default" 0.0;
            -      align: 0.5 0.5;
            -      text 
            -      {
            -         style: "text_style";
            -         text: "TEXT<br>WITH<br>MASK";
            -      }
            -   }
            -}
            -part 
            -{
            -   name: "mask";
            -   type: IMAGE;
            -   description 
            -   {
            -      state: "default" 0.0;
            -      image.normal: "mask.png";
            -   }
            -}
            -
            -

            The content part is cropped off in the mask shape, which depends on the alpha value per pixel. The content part can be almost any type in the EDC files, but the mask part can only be the IMAGE type.

            -
          • -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_manage_animation_n.htm b/org.tizen.ui.guides/html/native/efl/edje_manage_animation_n.htm deleted file mode 100755 index 23049bf..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_manage_animation_n.htm +++ /dev/null @@ -1,728 +0,0 @@ - - - - - - - - - - - - - Edje Animations - - - - - -
          - -

          Edje Animations

          - -

          This tutorial demonstrates how you can turn Edje animations on and off, pause, stop and resume them, and check the status of Edje parts.

          - - -

          Creating the Application Layout

          - -

          Create a simple application with a menu and separate screens for each Edje Animation function:

          - -
            -
          1. -

            Create a simple main layout with a swallow for demo animation and another for controls:

            - -
            collections 
            -{
            -   group 
            -   {
            -      name: "demo";
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "swallow.demo";
            -            type: SWALLOW;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel2 
            -               {
            -                  relative: 1.0 0.0;
            -                  to_y: "swallow.control";
            -               }
            -            }
            -         }
            -         part 
            -         {
            -            name: "swallow.control";
            -            type: SWALLOW;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 
            -               {
            -                  relative: 0.0 0.8;
            -               }
            -            }
            -         }
            -      }
            -   }
            -}
            -
            -
          2. - -
          3. -

            Create a group for the cycled animation:

            -
            group 
            -{
            -   name: "cycled_animation";
            -   parts 
            -   {
            -      part 
            -      {
            -         name: "bg";
            -         type: RECT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 100 100 100 255;
            -         }
            -         description 
            -         {
            -            state: "clicked" 0.0;
            -            color: 200 100 100 255;
            -         }
            -      }
            -      part 
            -      {
            -         name: "a";
            -         type: RECT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 0 255 0 255;
            -            rel2 
            -            {
            -               relative: 0.3 0.3;
            -            }
            -         }
            -         description 
            -         {
            -            state: "red" 0.0;
            -            color: 255 0 0 255;
            -            rel1 
            -            {
            -               relative: 0.35 0.7;
            -            }
            -            rel2 
            -            {
            -               relative: 0.65 1.0;
            -            }
            -         }
            -         description 
            -         {
            -            state: "blue" 0.0;
            -            color: 0 0 255 255;
            -            rel1 
            -            {
            -               relative: 0.7 0.0;
            -            }
            -            rel2 
            -            {
            -               relative: 1.0 0.3;
            -            }
            -         }
            -      }
            -   }
            -   programs 
            -   {
            -      program 
            -      {
            -         name: "bg_click";
            -         signal: "mouse,clicked,*";
            -         source: "bg";
            -         action: STATE_SET "clicked" 0.0;
            -         target: "bg";
            -      }
            -      program 
            -      {
            -         name: "step1";
            -         signal: "load";
            -         source: "";
            -         action: STATE_SET "red" 0.0;
            -         transition: LINEAR 1.0;
            -         target: "a";
            -         after: "step2";
            -      }
            -      program 
            -      {
            -         name: "step2";
            -         action: STATE_SET "blue" 0.0;
            -         transition: LINEAR 1.0;
            -         target: "a";
            -         after: "step3";
            -      }
            -      program 
            -      {
            -         name: "step3";
            -         action: STATE_SET "default" 0.0;
            -         transition: LINEAR 1.0;
            -         target: "a";
            -         after: "step1";
            -      }
            -   }
            -}
            -
          4. - -
          5. -

            Create another group for animation that can be activated by clicking:

            -
            group 
            -{
            -   name: "clickme";
            -   parts 
            -   {
            -      part 
            -      {
            -         name: "bg";
            -         type: RECT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 100 100 100 255;
            -         }
            -      }
            -      part 
            -      {
            -         name: "text_bg";
            -         type: RECT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            rel1 
            -            {
            -               to: "text";
            -            }
            -            rel2 
            -            {
            -               to: "text";
            -            }
            -         }
            -      }
            -      part 
            -      {
            -         name: "text";
            -         type: TEXT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            color: 0 0 0 255;
            -            text 
            -            {
            -               text: ":-)";
            -               font: "Sans";
            -               size: 42;
            -               min: 1 1;
            -               max: 1 1;
            -            }
            -         }
            -         description 
            -         {
            -            state: "state2" 0.0;
            -            inherit: "default" 0.0;
            -            align: 1.0 1.0;
            -            text.text: ":-D";
            -         }
            -      }
            -      part 
            -      {
            -         name: "text_bg2";
            -         type: RECT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 0 200 0 255;
            -            rel1 
            -            {
            -               to: "text2";
            -            }
            -            rel2 
            -            {
            -               to: "text2";
            -            }
            -         }
            -         description 
            -         {
            -            state: "state2" 0.0;
            -            inherit: "default" 0.0;
            -            color: 200 0 0 255;
            -         }
            -      }
            -      part 
            -      {
            -         name: "text2";
            -         type: TEXT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            align: 0.0 1.0;
            -            visible: 0;
            -            text 
            -            {
            -               text: "Click me";
            -               font: "Sans";
            -               size: 42;
            -               min: 1 1;
            -               max: 1 1;
            -            }
            -         }
            -         description 
            -         {
            -            state: "state2" 0.0;
            -            inherit: "default" 0.0;
            -            visible: 1;
            -         }
            -      }
            -      part 
            -      {
            -         name: "text3";
            -         type: TEXT;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            align: 0.0 1.0;
            -            visible: 1;
            -            text 
            -            {
            -               text: "Click me";
            -               font: "Sans";
            -               size: 42;
            -               min: 1 1;
            -               max: 1 1;
            -            }
            -         }
            -         description 
            -         {
            -            state: "state2" 0.0;
            -            inherit: "default" 0.0;
            -            visible: 0;
            -         }
            -      }
            -   }
            -   programs 
            -   {
            -      program 
            -      {
            -         name: "clicked";
            -         signal: "mouse,clicked,1";
            -         source: "text3";
            -         action: STATE_SET "state2" 0.00;
            -         transition: LINEAR 3.00000;
            -         target: "text";
            -         target: "text2";
            -         target: "text3";
            -         target: "text_bg2";
            -      }
            -      program 
            -      {
            -         name: "return";
            -         signal: "mouse,clicked,1";
            -         source: "text2";
            -         action: STATE_SET "default" 0.00;
            -         transition: LINEAR 1.00000;
            -         target: "text";
            -         target: "text2";
            -         target: "text3";
            -         target: "text_bg2";
            -      }
            -   }
            -}
            -
          6. -
          - -

          Creating the Application Logic

          - -
            -
          1. Create new project named test.
          2. - -
          3. Add 2 new files to the application project:edje_animation.h and edje_animation.c.
          4. -
          5. To access the application data from the newly created files, move the appdata_s structure from the test.c file to the test.h file and remove the static specifier.
          6. - -
          7. Add the following code to the edje_animation.h file: -
            #ifndef __edje_animation_H__
            -#define __edje_animation_H__
            -#include "test.h"
            -
            -typedef struct _edje_animation_item_s 
            -{
            -   const char *name;
            -   Evas_Object* (*func)(appdata_s *ap);
            -} 
            -Edje_Animation_Menu_Item;
            -
            -#endif // __edje_animation_H__
            - -

            This structure will define menu items and their callbacks.

            -
          8. - -
          9. -

            Create a global menu array in the edje_animation.c file and fill it with necessary items:

            -
            Edje_Animation_Menu_Item edje_animation_items[] =
            -{
            -   {"test1", _test1_func },
            -   {"test2", _test2_func },
            -
            -   {NULL, NULL } // Do not delete
            -};
            -
          10. - -
          11. -

            Use the array to fill the main menu:

            -
            extern Edje_Animation_Menu_Item edje_animation_items[];
            -
            -static void
            -create_base_gui(appdata_s *ad)
            -{
            -   // Genlist
            -   ad->itc = elm_genlist_item_class_new();
            -   ad->itc->func.text_get =_genlist_item_text_get;
            -   ad->genlist = elm_genlist_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -
            -   int i;
            -   Elm_Object_Item *eoi = NULL;
            -
            -   for (i = 0; edje_animation_items[i].name; ++i)
            -   {
            -      eoi = elm_genlist_item_append(ad->genlist, ad->itc, edje_animation_items[i].name, NULL,
            -                                    ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
            -      elm_object_item_data_set(eoi, (void *)&edje_animation_items[i]);
            -   }
            -}
            -
          12. - -
          13. All examples use the same basic layout: -
            static void
            -app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max)
            -{
            -   char *res_path = app_get_resource_path();
            -   if (res_path) 
            -   {
            -        snprintf(edj_path_out, edj_path_max, "%s%s", res_path, edj_file_in);
            -        free(res_path);
            -   }
            -}
            -
            -static void
            -_example_layout_create(appdata_s *ad,
            -                       const char *layout_group,
            -                       const char *demo_group,
            -                       Evas_Object **layout_out,
            -                       Evas_Object **animation_out)
            -{
            -   char edj_path[PATH_MAX] = {0, };
            -
            -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -
            -   *layout_out = elm_layout_add(ad->win);
            -   elm_layout_file_set(*layout_out, edj_path, layout_group);
            -   evas_object_size_hint_weight_set(*layout_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -
            -   *animation_out = edje_object_add(evas_object_evas_get(ad->win));
            -   edje_object_file_set(*animation_out, edj_path, demo_group);
            -   evas_object_size_hint_weight_set(*animation_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_layout_content_set(*layout_out, SWALLOW_DEMO, *animation_out);
            -   evas_object_show(*animation_out);
            -}
            -
          14. - -
          15. You can try out the following operations to see how the application works: - -
              -
            • Check the time for each frame. - -

              The edje_frametime_get() function allows you to check how much time is elapsed for single frame. This is a value of an internal parameter and not actual frame time. You can change it using the edje_frametime_set() function.

              - - - - - - - - - - -
              Note
              Changing the frame time affects all objects on the same canvas, not only on the given one.
              - -

              Use the edje_frametime_get() function and edje_frametime_set() function in the edje_animation.c file:

              -
              // edje_frametime_set/get
              -static void
              -_frametime_test_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
              -{
              -   edje_frametime_set(elm_spinner_value_get(obj));
              -}
              -
              -Evas_Object *
              -frametime_test(appdata_s *ad)
              -{
              -   Evas_Object *layout, *animation, *spinner;
              -   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              -
              -   spinner = elm_spinner_add(ad->win);
              -   elm_spinner_label_format_set(spinner, "Frame_t: %1.3f");
              -   double framerate = edje_frametime_get();
              -   elm_spinner_min_max_set(spinner, 0.001, 2.0);
              -   elm_spinner_step_set(spinner, 0.005);
              -   elm_spinner_value_set(spinner, framerate);
              -   evas_object_smart_callback_add(spinner, "changed", _frametime_test_spinner_changed_cb, NULL);
              -   elm_layout_content_set(layout, SWALLOW_CONTROL, spinner);
              -   evas_object_show(spinner);
              -
              -   return layout;
              -}
              -
              -Edje_Animation_Menu_Item edje_animation_items[] =
              -{
              -   {"frametime test", frametime_test},
              -
              -   {NULL, NULL}
              -};
              - -

              The spinner displays the current frame time value and enables changing it. Extreme values (> 0.9) are affecting animation.

              - -

              Figure: Displaying the frame time

              -

              Displaying the frame time

              - -
            • - -
            • Pause and resume animation and check its status. - -

              The edje_object_play_set() function allows you to pause or resume animation for a given object. A resumed animation starts from the same point.

              -

              To check whether the animation is paused, use the edje_object_play_get() function.

              - -
              // edje_object_play_set/get
              -static void
              -_play_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              -{
              -   Evas_Object *anim = data;
              -   if (edje_object_play_get(anim))
              -   {
              -      edje_object_play_set(anim, EINA_FALSE);
              -      elm_object_text_set(obj, "Play");
              -   }
              -   else
              -   {
              -      edje_object_play_set(anim, EINA_TRUE);
              -      elm_object_text_set(obj, "Pause");
              -   }
              -}
              -
              -Evas_Object *
              -play_test(appdata_s *ad)
              -{
              -   Evas_Object *layout, *animation, *button;
              -   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              -   button = elm_button_add(ad->win);
              -   elm_object_text_set(button, "Pause");
              -   evas_object_smart_callback_add(button, "clicked", _play_test_button_cb, animation);
              -   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              -   evas_object_show(button);
              -
              -   return layout;
              -}
              -
              -Edje_Animation_Menu_Item edje_animation_items[] =
              -{
              -   {"frametime test", frametime_test},
              -   {"play test", play_test},
              -   
              -   {NULL, NULL}
              -};
              -
            • - -
            • Stop the animation. - -

              The edje_object_freeze() function allows you to stop animation rendering. This function puts all changes on hold. Successive freezes are nested, requiring an equal number of thaws. Using the edje_object_thaw() function, you can apply all changes immediately.

              - -
              // edje_object_freeze/thaw
              -static void
              -_freeze_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              -{
              -   Evas_Object *anim = data;
              -   static int i = 0;
              -   if(!i)
              -   {
              -      i = edje_object_freeze(anim);
              -      elm_object_text_set(obj, "Thaw");
              -   }
              -   else
              -   {
              -      i = edje_object_thaw(anim);
              -      elm_object_text_set(obj, "Freeze");
              -   }
              -}
              -
              -Evas_Object *
              -freeze_test(appdata_s *ad)
              -{
              -   Evas_Object *layout, *animation, *button;
              -   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              -
              -   button = elm_button_add(ad->win);
              -   elm_object_text_set(button, "Freeze");
              -   evas_object_smart_callback_add(button, "clicked", _freeze_test_button_cb, animation);
              -   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              -   evas_object_show(button);
              -
              -   return layout;
              -}
              -
              -Edje_Animation_Menu_Item edje_animation_items[] =
              -{
              -   {"frametime test", frametime_test},
              -   {"play test", play_test},
              -   {"freeze/thaw test", freeze_test},
              -
              -   {NULL, NULL}
              -};
              - -

              The edje_freeze() function and edje_thaw() function freeze or thaw all objects in the entire application.

              -
            • - -
            • Enable and disable the animation. - -

              All transitions in edje programs are ignored and parts go directly to their final states.

              - -
              // edje_object_animation_set/get
              -static void
              -_animation_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              -{
              -   Evas_Object *anim = data;
              -   if (edje_object_animation_get(anim))
              -   {
              -      edje_object_animation_set(anim, EINA_FALSE);
              -      elm_object_text_set(obj, "Turn animation on");
              -   }
              -   else
              -   {
              -      edje_object_animation_set(anim, EINA_TRUE);
              -      elm_object_text_set(obj, "Turn animation off");
              -   }
              -}
              -
              -Evas_Object *
              -animation_test(appdata_s *ad)
              -{
              -   Evas_Object *layout, *animation, *button;
              -   _example_layout_create(ad, GRP_DEMO, GRP_CLICKME, &layout, &animation);
              -
              -   button = elm_button_add(ad->win);
              -   elm_object_text_set(button, "Turn animation off");
              -   evas_object_smart_callback_add(button, "clicked", _animation_test_button_cb, animation);
              -   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              -   evas_object_show(button);
              -
              -   return layout;
              -}
              -
              -Edje_Animation_Menu_Item edje_animation_items[] =
              -{
              -   {"frametime test", frametime_test},
              -   {"play test", play_test},
              -   {"freeze/thaw test", freeze_test},
              -   {"animation test", animation_test},
              -
              -   {NULL, NULL}
              -};
              -
            • - -
            • Get the current state of given part. - -

              Parts that are in transition return the transition's starting state.

              - -
              // edje_object_part_state_get
              -static void
              -_state_get_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              -{
              -   Evas_Object *anim = data;
              -   const char *state;
              -   double state_val = 0;
              -   state = edje_object_part_state_get(anim, "text", &state_val);
              -   edje_object_part_text_set(anim, "text", state);
              -}
              -
              -Evas_Object *
              -state_get_test(appdata_s *ad)
              -{
              -   Evas_Object *layout, *animation, *button;
              -   _example_layout_create(ad, GRP_DEMO, GRP_CLICKME, &layout, &animation);
              -
              -   button = elm_button_add(ad->win);
              -   elm_object_text_set(button, "Get state");
              -   evas_object_smart_callback_add(button, "clicked", _state_get_test_button_cb, animation);
              -   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              -   evas_object_show(button);
              -
              -   return layout;
              -}
              -
              -Edje_Animation_Menu_Item edje_animation_items[] =
              -{
              -   {"frametime test", frametime_test},
              -   {"play test", play_test},
              -   {"freeze/thaw test", freeze_test},
              -   {"animation test", animation_test},
              -   {"part state get test", state_get_test},
              -
              -   {NULL, NULL}
              -};
              -
            • -
            -
          16. -
          - - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_message_signal_n.htm b/org.tizen.ui.guides/html/native/efl/edje_message_signal_n.htm deleted file mode 100755 index 958a3fe..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_message_signal_n.htm +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - - - - - - - - Managing Signals and Messages - - - - - -
          - -

          Managing Signals and Messages

          - - -

          Edje objects have 2 communication interfaces between the application logic (code) and GUI (theme). You can either emit a signal from the code to the theme, or create handles for the signals emitted from the theme. Signals are identified by strings. With Edje messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          - - -

          Signals

          -

          You can emit signals from code to a theme, or create handles for the signals emitted from themes. Signals are identified by strings.

          - -

          Using signals in the EDC file is simple. Create a program and set the signal name to the signal attribute.

          - -
          -group 
          -{ 
          -   name: "main";
          -   parts 
          -   {
          -      part 
          -      { 
          -         name: "rect1";
          -         type: RECT;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            min: 100 100;
          -            max: 100 100;
          -            color: 255 0 0 255;
          -         }
          -         description 
          -         { 
          -            state: "default" 1.0;
          -            min: 100 100;
          -            max: 100 100;
          -            color: 0 0 255 255;
          -         }
          -      }
          -      part 
          -      { 
          -         name: "swallow.check";
          -         type: SWALLOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            align: 0.5 0.0;
          -            rel2 
          -            {
          -               relative: 0.0 0.0;
          -               to_x: "swallow.slider_ver";
          -            }
          -         }
          -      }
          -   }
          -   programs 
          -   {
          -      program 
          -      { 
          -         name: "to_default_0";
          -         signal: "to,state,default,0";
          -         action: STATE_SET "default" 0.00;
          -         transition: ACCELERATE 0.5 CURRENT;
          -         target: "rect1";
          -      }
          -      program 
          -      { 
          -         name: "to_default_1";
          -         signal: "to,state,default,1";
          -         action: STATE_SET "default" 1.00;
          -         transition: ACCELERATE 0.5 CURRENT;
          -         target: "rect1";
          -      }
          -   }
          -}
          -
          - -

          Emitting Signals from the C Code

          - -

          Create the Edje Object and widget check. When a changed event is triggered, a signal is emitted from the C code to the EDC file.

          - -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   char edj_path[PATH_MAX] = {0, };
          -   
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_conformant_set(ad->win, EINA_TRUE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   if (elm_win_wm_rotation_supported_get(ad->win)) 
          -   {
          -      int rots[4] = { 0, 90, 180, 270 };
          -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -   }
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          -
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          -   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -
          -   // Base layout
          -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          -   ad->edje_object = edje_object_add(evas_object_evas_get(ad->win));
          -   edje_object_file_set(ad->edje_object, edj_path, GRP_MAIN);
          -   evas_object_size_hint_weight_set(ad->edje_object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   
          -   ad->check = elm_check_add(ad->win);
          -   edje_object_part_swallow(ad->edje_object, "swallow.check", ad->check);
          -   evas_object_smart_callback_add(ad->check, "changed", _check_toggled, ad);
          -
          -   elm_object_content_set(ad->conform, ad->edje_object);
          -   // Show the window
          -   evas_object_show(ad->win);
          -}
          -
          - -

          The following figure displays the result.

          - -

          Figure: Signal implemented on the screen

          -

          Signal implemented on the screen

          - -

          The following example implements the callback for the changed event from the widget check.

          -
          -static void
          -_check_toggled(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -
          -   if (elm_check_state_get(obj))
          -      edje_object_signal_emit(ad->edje_object, "to,state,default,1", "");
          -   else
          -      edje_object_signal_emit(ad->edje_object, "to,state,default,0", "");
          -}
          -
          - -

          The following figure displays the result.

          - -

          Figure: Widget check status changed

          -

          Widget check status changed

          - - -

          Messages

          - -

          Edje messages are used for communication between code and a given Edje object's theme. With messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          - -

          In the following example, the rect1 part is made draggable and 2 sliders added to change the part position.

          - -
          -group 
          -{ 
          -   name: "main";
          -   parts 
          -   {
          -      part 
          -      { 
          -         name: "drag_area";
          -         type: RECT;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            rel1 
          -            {
          -               relative: 0.0 1.0;
          -               to_y: "swallow.check";
          -            }
          -            rel2 
          -            {
          -               relative: 0.0 0.0;
          -               to_x: "swallow.slider_ver";
          -               to_y: "swallow.slider_hor";
          -            }
          -         }
          -      }
          -      part 
          -      { 
          -         name: "rect1";
          -         type: RECT;
          -         dragable 
          -         {
          -            x: 1 1 1;
          -            y: 1 1 1;
          -            confine: "drag_area";
          -         }
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            min: 100 100;
          -            max: 100 100;
          -            color: 255 0 0 255;
          -         }
          -         description { state: "default" 1.0;
          -            min: 100 100;
          -            max: 100 100;
          -            color: 0 0 255 255;
          -         }
          -      }
          -      part 
          -      { 
          -         name: "swallow.check";
          -         type: SWALLOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            align: 0.5 0.0;
          -            rel2 
          -            {
          -               relative: 0.0 0.0;
          -               to_x: "swallow.slider_ver";
          -            }
          -         }
          -      }
          -      part 
          -      { 
          -         name: "swallow.slider_ver";
          -         type: SWALLOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            align: 1.0 0.5;
          -            rel1 
          -            {
          -               relative: 1.0 1.0;
          -               to_y: "swallow.check";
          -            }
          -            rel2 
          -            {
          -               relative: 1.0 0.0;
          -               to_y: "swallow.slider_hor";
          -            }
          -         }
          -      }
          -      part 
          -      { 
          -         name: "swallow.slider_hor";
          -         type: SWALLOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            align: 0.5 1.0;
          -            rel1 
          -            {
          -               relative: 0.0 1.0;
          -            }
          -            rel2 
          -            {
          -               relative: 0.0 1.0;
          -               to_x: "swallow.slider_ver";
          -            }
          -         }
          -      }
          -   }
          -   programs 
          -   {
          -      program 
          -      { 
          -         name: "to_default_0";
          -         signal: "to,state,default,0";
          -         action: STATE_SET "default" 0.00;
          -         transition: ACCELERATE 0.5 CURRENT;
          -         target: "rect1";
          -      }
          -      program 
          -      { 
          -         name: "to_default_1";
          -         signal: "to,state,default,1";
          -         action: STATE_SET "default" 1.00;
          -         transition: ACCELERATE 0.5 CURRENT;
          -         target: "rect1";
          -      }
          -      program 
          -      {
          -         signal: "drag";
          -         source: "rect1";
          -         script 
          -         {
          -               new Float:x, Float:y;
          -               get_drag(PART:"rect1", x, y);
          -               send_message(MSG_FLOAT, 2, x);
          -               send_message(MSG_FLOAT, 3, y);
          -         }
          -      }
          -   }
          -}
          -
          - -

          Add the sliders:

          - -
          -ad->slider_ver = elm_slider_add(ad->win);
          -edje_object_part_swallow(ad->edje_object, "swallow.slider_ver", ad->slider_ver);
          -elm_slider_horizontal_set(ad->slider_ver, EINA_FALSE);
          -evas_object_smart_callback_add(ad->slider_ver, "changed", _slider_changed, ad);
          -
          -ad->slider_hor = elm_slider_add(ad->win);
          -evas_object_smart_callback_add(ad->slider_hor, "changed", _slider_changed, ad);
          -
          - -

          The following figure displays the result.

          -

          Figure: Sliders added

          -

          Sliders added

          - -

          To handle the message in the Style, add the following script to the EDC file:

          - -
          -group 
          -{ 
          -   name: "main";
          -   script 
          -   {      	
          -      public message(Msg_Type:type, id, ...) 
          -      {
          -         if ((type == MSG_FLOAT_SET) && (id == 1)) 
          -         {
          -            new Float:x, Float:y;
          -            
          -            x = getfarg(2);
          -            y = getfarg(3);
          -            set_drag(PART:"rect1", x, y);
          -         }
          -      }
          -   }
          -}
          -
          - -

          This script is called when an incoming message is detected.

          - -

          Sending Messages

          - -

          Add a callback for the changed event to send a message to the Style:

          - -
          -static void
          -_slider_changed(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   Edje_Message_Float_Set *msg;
          -   
          -   msg = malloc(sizeof(*msg) + 1 * sizeof(float));
          -   msg->count = 2;
          -   msg->val[0] = elm_slider_value_get(ad->slider_hor);
          -   msg->val[1] = elm_slider_value_get(ad->slider_ver);
          -   
          -   edje_object_message_send(ad->edje_object, EDJE_MESSAGE_FLOAT_SET, 1, msg);
          -   free(msg);
          -}
          -
          - -

          The same message can be sent in the opposite direction. To send messages in EDC script (Embryo – link to Embryo), use the sent_message() function.

          - -
          -program 
          -{
          -   signal: "drag";
          -   source: "rect1";
          -   script 
          -   {
          -      new Float:x, Float:y;
          -      get_drag(PART:"rect1", x, y);
          -      send_message(MSG_FLOAT, 2, x);
          -      send_message(MSG_FLOAT, 3, y);
          -   }
          -}
          -
          - -

          2 messages are sent using the drag signal from the rect1 part.

          - -

          Add a message handler in the C code:

          - -
          -edje_object_message_handler_set(ad->edje_object, _message_handle, ad);
          -
          - -

          Add a callback:

          - -
          -static void
          -_message_handle(void *data, Evas_Object *obj, Edje_Message_Type type,
          -                int id, void *msg)
          -{
          -   Edje_Message_Float *m;
          -   appdata_s *ad = data;
          -   
          -   if (type != EDJE_MESSAGE_FLOAT) return;
          -   m = msg;
          -   if (id == 2) elm_slider_value_set(ad->slider_hor, m->val);
          -   if (id == 3) elm_slider_value_set(ad->slider_ver, m->val);
          -}
          -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_objects_n.htm b/org.tizen.ui.guides/html/native/efl/edje_objects_n.htm deleted file mode 100755 index 0c0bb0b..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_objects_n.htm +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - Edje Objects: Managing Layouts and Layout Components - - - - - -
          - -

          Edje Objects: Managing Layouts and Layout Components

          - - -

          You can build and handle layouts using Edje objects. An Edje object is a type of Evas object for displaying units, such as rectangles, lines, polygons, text, and images. Edje objects are only used in Edje and provide functions that deal with Edje layouts and layout components. Namely, there is no Edje object type in the source code for implementing an application. The objects are mainly layouts or themes defined by groups and parts, and declared in EDC files.

          -

          Edje provides functions for the following features:

          - -
            -
          • Handling Edje Files -

            Edje layouts are called themes and created using the EDC language. The EDC language is declarative and must be compiled before being used. The output of this compilation is an EDJ file, which can be loaded by Edje, and the result is an Edje object.

          • - -
          • Scaling Edje Objects -

            Edje enables you to build scalable interfaces. There are 2 types of scaling factors, which are set to neutral (1.0) values by default (no scaling, actual sizes): global and individual. Scaling affects the minimum and maximum values of the part sizes, which are multiplied. Font sizes are scaled, too.

          • - -
          • Using Edje Color Classes -

            To change the color and text of 2 or more parts simultaneously, you can use color classes. If parts are assigned with a color class, setting the color values to this class causes all the parts to have their colors multiplied by the values. Setting the values to a color class at a process level affects all parts with that color class, while at the object level, only the parts inside a specified object are affected.

          • - -
          • Using Edje Text Classes -

            To change the text of 2 or more parts simultaneously, you can use text classes. If parts are assigned with a text class, setting the font attributes to this class updates all these parts with the new font attributes. Setting the values to a text class at a process level affects all parts with that text class, while at the object level, only the parts inside a specified object are affected.

          • - -
          • Using Edje Perspective -

            Perspective is a graphical tool that makes 2D objects appear as 3D. The perspective can be used with all Edje objects.

          • - -
          • Managing Signals and Messages -

            Edje objects have 2 communication interfaces between the logic and GUI. You can either emit a signal from the logic to the GUI, or create handles for the signals emitted from the GUI. Signals are identified by strings. With Edje messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          • - -
          • Managing Edje Animations -

            Edje has the ability to animate their objects. You can start, stop, play, pause, freeze, and thaw Edje animations, and check their status.

          • -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_perspective_n.htm b/org.tizen.ui.guides/html/native/efl/edje_perspective_n.htm deleted file mode 100755 index cb50901..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_perspective_n.htm +++ /dev/null @@ -1,486 +0,0 @@ - - - - - - - - - - - - - Using Edje Perspective - - - - - -
          - -

          Using Edje Perspective

          - - -

          This tutorial demonstrates how you can create a 3D projection of a 2D object.

          -

          Edje Perspective is a graphical tool that makes 2D objects appear like they have a 3D appearance.

          -

          Edje Perspective can be used in all Edje objects to create and configure a perspective objects and to set the to an Edje object or a canvas, affecting all the objects within that have no specific perspective already defined.

          - -

          Creating the Basic Application

          -

          The perspective application has buttons to move the Edje object and change its perspective. The Edje object is a 2D object that changes its position so that the perspective point can be applied.

          - - - - - - - - - - -
          Note
          The loaded Edje object must have the perspective option enabled in its EDC source code.
          - -

          Create a simple Edje object that has 4 states: left-top, right-top, left-bottom, and right-bottom. Clicking a button emits signals into the object and makes the object move.

          - -
            -
          1. - -

            The following example implements the Edje object:

            - -
            -group 
            -{
            -   name: "example/group";
            -   min: 480 320;
            -   parts 
            -   {
            -      part 
            -      {
            -         name: "bg";
            -         type: RECT;
            -         mouse_events: 1;           
            -         description 
            -         {
            -            state: "default" 0.0;
            -         }
            -      }       
            -      part 
            -      {
            -         name: "rectangle";
            -         type: RECT;
            -         mouse_events: 0;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 255 0 0 128;
            -            rel1 
            -            {
            -               offset: -5 -5;
            -               to: "title";
            -            }
            -            rel2 
            -            {
            -               offset: 4 4;
            -               to: "title";
            -            }
            -            map 
            -            {
            -               on: 1;
            -               perspective_on: 1;
            -               rotation 
            -               {
            -                  x: 45;
            -                  y: 15;
            -               }
            -            }
            -         }
            -      }
            -      part 
            -      {
            -         name: "title";
            -         type: TEXT;
            -         mouse_events: 0;
            -         description 
            -         {
            -            state: "default" 0.0;
            -            color: 200 200 200 255;
            -            align: 0.0 0.5;
            -            rel1.relative: 0.2 0.2;
            -            rel2.relative: 0.2 0.2;
            -            text 
            -            {
            -               text: "Perspective example";
            -               font: "Sans";
            -               size: 16;
            -               min: 1 1;
            -            }
            -            map 
            -            {
            -               on: 1;
            -               perspective_on: 1;
            -               rotation 
            -               {
            -                  x: 45;
            -                  y: 15;
            -               }
            -            }
            -         }
            -         description 
            -         {
            -            state: "right" 0.0;
            -            inherit: "default" 0.0;
            -            rel1.relative: 0.5 0.2;
            -            rel2.relative: 0.5 0.2;
            -         }
            -         description 
            -         {
            -            state: "bottom" 0.0;
            -            inherit: "default" 0.0;
            -            rel1.relative: 0.2 0.8;
            -            rel2.relative: 0.2 0.8;
            -         }
            -         description 
            -         {
            -            state: "bottomright" 0.0;
            -            inherit: "default" 0.0;
            -            rel1.relative: 0.5 0.8;
            -            rel2.relative: 0.5 0.8;
            -         }
            -      }
            -   }
            -   programs 
            -   {
            -      program 
            -      {
            -         name: "move,right";
            -         signal: "move,1,0";
            -         action: STATE_SET "right" 0.0;
            -         transition: SINUSOIDAL 1.0;
            -         target: "title";
            -         after: "animation,end";
            -      }
            -      program 
            -      {
            -         name: "move,bottom";
            -         signal: "move,0,1";
            -         action: STATE_SET "bottom" 0.0;
            -         transition: SINUSOIDAL 1.0;
            -         target: "title";
            -         after: "animation,end";
            -      }
            -      program 
            -      {
            -         name: "move,bottomright";
            -         signal: "move,1,1";
            -         action: STATE_SET "bottomright" 0.0;
            -         transition: SINUSOIDAL 1.0;
            -         target: "title";
            -         after: "animation,end";
            -      }
            -      program 
            -      {
            -         name: "move,default";
            -         signal: "move,0,0";
            -         action: STATE_SET "default" 0.0;
            -         transition: SINUSOIDAL 1.0;
            -         target: "title";
            -         after: "animation,end";
            -      }
            -      program 
            -      {
            -         name: "animation,end";
            -         action: SIGNAL_EMIT "animation,end" "";
            -      }
            -   }
            -}
            -
            -
          2. - -
          3. -

            Create the application. Create a basic window widget that is going to be loaded and created in the main starting function:

            - -
            -// Window
            -ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            -elm_win_conformant_set(ad->win, EINA_TRUE);
            -elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -if (elm_win_wm_rotation_supported_get(ad->win)) 
            -{
            -   int rots[4] = 
            -   {
            -      0, 90, 180, 270 
            -   };
            -   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            -}
            -
            -
          4. - -
          5. -

            Add a conformant and set the main layout of the application.

            -

            The main layout is described in the EDC part and consists of 2 swallows. The first swallow has the Edje object loaded into it. The second contains a box of buttons to manipulate the perspective of the Edje object.

            - -
            -// Conformant
            -ad->conform = elm_conformant_add(ad->win);
            -elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            -elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            -evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_win_resize_object_add(ad->win, ad->conform);
            -evas_object_show(ad->conform);
            -
            -// Base layout
            -app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -ad->layout = elm_layout_add(ad->win);
            -elm_layout_file_set(ad->layout, edj_path, GRP_MAIN);
            -evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad);
            -elm_object_content_set(ad->conform, ad->layout);
            -
            -
          6. - -
          7. -

            Create the Edje object on Evas using the evas_object_evas_get() function. This function is very useful because you must operate on the canvas, but have only an object pointer to a window object.

            - -
            -Evas *evas;
            -evas = evas_object_evas_get(ad->win);
            -ad->edje_obj = edje_object_add(evas);
            -
            -
          8. - -
          9. -

            Instantiate a new Edje object by creating a new Edje smart object and returning its Evas_Object handle:

            - -
            -ad->edje_obj = edje_object_add(evas);
            -
            -
          10. - -
          11. -

            An Edje object is useless without a source file set to it, so use the edje_object_file_set() function to set the object into the main layout:

            - -
            -ad->edje_obj = edje_object_add(evas);
            -edje_object_file_set(ad->edje_obj, edj_path, "example/group");
            -evas_object_move(ad->edje_obj, 0, 0);
            -evas_object_show(ad->edje_obj);
            -elm_object_part_content_set(ad->layout, "swallow", ad->edje_obj);
            -
            - -

            Figure: Main layout with the swallow part highlighted

            -

            Main layout with the swallow part highlighted

            -
          12. - -
          13. -

            Create the actual perspective object, define its position, focal distance and Z plane position, and set it as global:

            - -
            -ad->ps = edje_perspective_new(evas);	
            -edje_perspective_set(ad->ps, 160, 320, 0, ad->focal);
            -edje_perspective_global_set(ad->ps, EINA_TRUE);
            -
            - -

            To set the perspective of the Edje object, instead of setting it as global to the entire canvas, you can use the edje_object_perspective_set() function. -

            -
          14. - -
          15. -

            Create a new perspective in the canvas by setting up the transformation for the perspective object:

            - -
            -void 
            -edje_perspective_set(Edje_Perspective * ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
            -
            - -

            This sets the parameters of the perspective transformation. X, Y, and Z values are used. The px and py points specify the infinite distance point in the 3D conversion, where all lines converge. The z0 point specifies the Z value at which there is a 1:1 mapping between spatial coordinates and screen coordinates. Any points on the Z value do not have their X and Y values modified in the transformation. The points further away (with a higher Z value) shrink into the distance, and those that are closer expand and become bigger.

            -

            The foc value determines the focal length of the camera. This is the distance between the camera lens plane and the z0 Z value. This allows for some depth control. The foc value must be greater than 0.

            -
          16. - -
          17. -

            The Swallow buttons layout part contains a box of buttons to manipulate the perspective of the loaded Edje object.

            - -

            Figure: Main layout with swallow buttons highlighted

            -

            Main layout with swallow buttons highlighted

            - -

            Add the box and pack the buttons into it. Name the first button Global and register a callback for clicking:

            - -
            -Evas_Object *box, *button;
            -// Adding box
            -box = elm_box_add(ad->layout);
            -evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            -evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            -elm_box_horizontal_set(box, EINA_TRUE);
            -evas_object_show(box);
            -elm_object_part_content_set(ad->layout, "swallow.buttons", box);
            -
            -button = elm_button_add(ad->layout);
            -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_object_text_set(button, "move");
            -evas_object_show(button);
            -elm_box_pack_end(box, button);
            -evas_object_smart_callback_add(button, "clicked", _on_btn_clicked, ad);
            -
            -button = elm_button_add(ad->layout);
            -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_object_text_set(button, "more");
            -evas_object_show(button);
            -elm_box_pack_end(box, button);
            -evas_object_smart_callback_add(button, "clicked", _on_btn_more_clicked, ad);
            -
            -button = elm_button_add(ad->layout);
            -evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_object_text_set(button, "less");
            -evas_object_show(button);
            -elm_box_pack_end(box, button);
            -evas_object_smart_callback_add(button, "clicked", _on_btn_less_clicked, ad);
            -
            -ad->edje_obj = edje_object_add(evas);
            -edje_object_file_set(ad->edje_obj, edj_path, "example/group");
            -evas_object_move(ad->edje_obj, 0, 0);
            -evas_object_show(ad->edje_obj);
            -elm_object_part_content_set(ad->layout, "swallow", ad->edje_obj);
            -
            -
          18. - -
          19. -

            Show the main window:

            - -
            -evas_object_show(ad->win);
            -
            - -

            Figure: Main screen

            -

            Figure: Main screen

            - -
          20. -
          - -

          Playing with the Perspective

          - -
            -
          1. -

            The callback for a clicked button is converted to a signal determining where the text and rectangle must be moved:

            - -
            -static void
            -_part_move(appdata_s *ad, int dx, int dy)
            -{
            -   char emission[64];
            -
            -   dlog_print(DLOG_ERROR, "AAAA", "x,y = %d, %d", dx, dy);
            -   snprintf(emission, sizeof(emission), "move,%d,%d", dx, dy);
            -   edje_object_signal_emit(ad->edje_obj, emission, "");
            -}
            -
            -
          2. - -
          3. -

            The callback representing the Edje object move calls the part_move() function that directly sends a signal to the Edje part. The moving action is treated in the program according to the passed signal.

            - -
            -static void
            -_on_btn_clicked(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   static int i = 0;
            -   switch (i) 
            -   {
            -      case 0:
            -         _part_move(ad, 1, 0);
            -         break;
            -      case 1:
            -         _part_move(ad, 1, 1);
            -         break;
            -      case 2:
            -         _part_move(ad, 0, 1);
            -         break;
            -      case 3:
            -         _part_move(ad, 0, 0);
            -         break;
            -   }
            -   i++;
            -   i = i%4;
            -}
            -
            - -

            Figure: Moving process

            -

            ->Figure: Moving process Figure: Moving process

            -
          4. - -
          5. -

            By clicking the More and Less buttons, you can increase or decrease the focal length of the camera:

            - -
            -static void
            -_on_btn_more_clicked(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   ad->focal += 5;
            -   edje_perspective_set(ad->ps, 160, 320, 0, ad->focal);
            -   edje_perspective_global_set(ad->ps, EINA_TRUE);
            -}
            -
            -static void
            -_on_btn_less_clicked(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   ad->focal -= 5;
            -   edje_perspective_set(ad->ps,160, 320, 0, ad->focal);
            -   edje_perspective_global_set(ad->ps, EINA_TRUE);
            -}
            -
            - -

            Figure: Decreasing and increasing the focal length

            - -

            Decreasing and increasing the focal length

            -
          6. -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/edje_scaling_n.htm b/org.tizen.ui.guides/html/native/efl/edje_scaling_n.htm deleted file mode 100755 index ff9b16e..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_scaling_n.htm +++ /dev/null @@ -1,794 +0,0 @@ - - - - - - - - - - - - - - Scaling Edje Objects - - - - - - -
          -

          Scaling Edje Objects

          - -

          This demonstrates how you can scale Edje objects. Scalability is important when building user interfaces for different environments, such as mobile phones and laptops.

          -

          The natural value of scale factors is 1.0. Scaling affects minimum and maximum part size and font size, and multiplies them.

          - -

          You can disable scaling of certain parts.

          - -

          Initializing the EDC File

          - -

          Set up and prepare the EDC source code for loading the Edje objects in your application:

          - -
            -
          1. -

            To demonstrate Edje scale usability, set up 2 groups. The first group contains only one scalable part.

            - -
            group 
            -{ 
            -   name: "scale_group_1";
            -   parts 
            -   {
            -      part
            -      { 
            -         name: "scalable_rect";
            -         type: RECT;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            min: 16 16;
            -            max: 16 16;
            -            color: 0 0 255 255;
            -         }
            -      }
            -   }
            -}
            - -

            Figure: First scalable group

            -

            First scalable group

            - -

            For this example, the group is used for showing Edje's global scale.

            - -

            The other group is used for showing usability of the edje_object_scale function. The group has 2 non-scalable parts (not_scalable_rect1 and not scalable_rect2 ), which are related to the scalable parts. It can be seen that scalability actually changes the scalable parts and all UI can be changed according to new relatives.

            - -

            Scalability of certain parts is usually preset in the EDC source code with the scale property:

            - -
            -group 
            -{ 
            -   name: "scale_group_2";
            -   parts 
            -   {
            -      part 
            -      { 
            -         name: "not_scalable_rect1";
            -         type: RECT;
            -         scale: 0;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.5;
            -            min: 40 40;
            -            max: 40 40;
            -            color: 255 0 255 255;
            -         }
            -      }
            -      part 
            -      { 
            -         name: "scalable_rect";
            -         type: RECT;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.5;
            -            min: 25 19;
            -            max: 25 19;
            -            color: 0 255 255 255;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to_x: "not_scalable_rect1";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "not_scalable_rect2";
            -         type: RECT;
            -         scale: 0;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.5;
            -            min: 40 40;
            -            max: 40 40;
            -            color: 255 0 255 255;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to_x: "scalable_rect";
            -            }
            -         }
            -      }
            -   }
            -}
            -
            - -

            Figure: Second scalable group

            -

            Second scalable group

            -
          2. - -
          3. - -

            The base_scale factor can be used when the whole collection in the EDC file contains it:

            - -
            collections 
            -{
            -   base_scale: 1.2;
            -   group 
            -   { 
            -      name: "scale_group_1";
            -   }
            -   group 
            -   { 
            -      name: "scale_group_2";
            -   }
            -   group 
            -   {
            -      name: "main_layout";
            -   }
            -}
            -
          4. - -
          5. -

            An application must contain controls, such as a spinner, to change the scale and see the result.

            - -

            Add a box with 2 groups loaded as edje objects, and spinners for changing the scale values:

            - -
            -group 
            -{ 
            -   name: "main_application";
            -   parts 
            -   {
            -      part 
            -      { 
            -         name: "edje.swallow.content";
            -         type: SWALLOW;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 1.0;
            -            rel1 
            -            {
            -               relative: 0.0 1.0;
            -               offset: 0 20;
            -               to_y: "title2";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "title1";
            -         type: TEXT;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 100 32;
            -            color: 0 0 0 255;
            -            text 
            -            {
            -               text: "edje scale:";
            -               font: "Sans";
            -               size: 16;
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "title2";
            -         type: TEXT;
            -         scale: 1;
            -         description
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 150 32;
            -            color: 0 0 0 255;
            -            rel1 
            -            {
            -               relative: 0.0 1.0;
            -               to_y: "scale.swallow";
            -            }
            -            text 
            -            {
            -               text: "edje object scale:";
            -               font: "Sans";
            -               size: 16;
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "scale.swallow";
            -         type: SWALLOW;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 200 48;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to_x: "title2";
            -               to_y: "title1";
            -            }
            -            rel2 
            -            {
            -               to_y: "title1";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "scale.swallow2";
            -         type: SWALLOW;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 200 48;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to: "title2";
            -            }
            -            rel2 
            -            {
            -               to_y: "title2";
            -            }
            -         }
            -      }
            -   }
            -}
            -
            - -

            Figure: Main application layout

            -

            Main application layout

            - -

            In the example, there are the following swallows:

            -
              -
            • edje.swallow.content is used for the box containing the Edje objects.
            • -
            • scale.swallow is used for the spinner that changes the scale value a loaded Edje object.
            • -
            • scale.swallow2 is used for the spinner that changes the global scale, so changing this value changes the scale of all Edje objects if they do not have their own scales set using the edje_object_scale_set() function.
            • -
            -
          6. -
          - -

          Initializing the Application

          - -

          All application code lays in the create_base_gui() function that creates and loads all objects and forms, and creates application's main look.

          - -
            -
          1. -

            Create a window and get the path to the EDJ file:

            - -
            -ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);   elm_win_conformant_set(ad->win, EINA_TRUE);
            -elm_win_autodel_set(ad->win, EINA_TRUE);
            -if (elm_win_wm_rotation_supported_get(ad->win))
            -{
            -   int rots[4] = 
            -   {
            -      0, 90, 180, 270
            -   };
            -   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            -}
            -// Path to edj group with three groups
            -app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -
            -
          2. - -
          3. -

            Set the conformant containing the main layout into the window:

            - -
            -ad->conform = elm_conformant_add(ad->win);
            -elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            -elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            -evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_win_resize_object_add(ad->win, ad->conform);
            -evas_object_show(ad->conform);
            -// Main layout
            -ad->main_layout = elm_layout_add(ad->win);
            -evas_object_size_hint_weight_set(ad->main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_layout_file_set(ad->main_layout, edj_path, "main_application");
            -elm_object_content_set(ad->conform, ad->main_layout);
            -evas_object_show(ad->main_layout);
            -app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -
            - - - - - - - - - - -
            Note
            If you have layout for your window written in the EDC file, use and load it as Layout with Elementary layout API (using, for example, the elm_layout_add() , elm_object_style_set() , and elm_layout_file_set() functions).
            -
          4. - -
          5. -

            Add the box and set it into the edje.swallow.content main layout swallow:

            - -
            -// Add the box
            -ad->box = elm_box_add(ad->main_layout);
            -evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, 0.0);
            -evas_object_size_hint_align_set(ad->box, EVAS_HINT_FILL, 0.0);
            -elm_box_horizontal_set(ad->box, EINA_TRUE);
            -evas_object_show(ad->box);
            -// Set the box into the main layout
            -elm_object_part_content_set(ad->main_layout, "edje.swallow.content", ad->box);
            -
          6. - -
          7. -

            Load the Edje objects:

            - -
            -// Add group1
            -ad->edje_object_1 = edje_object_add(evas_object_evas_get(ad->win));
            -evas_object_size_hint_weight_set(ad->edje_object_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -edje_object_file_set(ad->edje_object_1, edj_path, "scale_group_1");
            -// Check object loading errors
            -if (edje_object_load_error_get(ad->edje_object_1) != EDJE_LOAD_ERROR_NONE)
            -{
            -   evas_object_del(ad->edje_object_1);
            -
            -   return;
            -}
            -evas_object_show(ad->edje_object_1);
            -
          8. - -
          9. -

            Pack the Edje objects into the box:

            - -
            -elm_box_pack_end(ad->box, ad->edje_object_1);
            -elm_box_pack_end(ad->box, ad->edje_object_2);
            -
          10. - -
          11. -

            Add 2 spinners that change the scale values:

            - -
            -ad->edje_scale = elm_spinner_add(ad->win);
            -evas_object_size_hint_weight_set(ad->edje_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -evas_object_size_hint_align_set(ad->edje_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -elm_spinner_min_max_set(ad->edje_scale, 1, 300);
            -elm_spinner_step_set(ad->edje_scale, 10);
            -evas_object_show(ad->edje_scale);
            -elm_spinner_value_set(ad->edje_scale, 100);
            -elm_object_part_content_set(ad->main_layout, "scale.swallow", ad->edje_scale);
            -
            -ad->edje_object_scale = elm_spinner_add(ad->win);
            -evas_object_size_hint_weight_set(ad->edje_object_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -evas_object_size_hint_align_set(ad->edje_object_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -elm_spinner_min_max_set(ad->edje_object_scale, 1, 300);
            -elm_spinner_step_set(ad->edje_object_scale, 10);
            -evas_object_show(ad->edje_object_scale);
            -elm_spinner_value_set(ad->edje_object_scale, 100);
            -elm_object_part_content_set(ad->main_layout, "scale.swallow2", ad->edje_scale);
            -
          12. - -
          13. Display the window:

            - -
            -evas_object_show(ad->win);
            - -

            Figure: Scale testing application

            -

            Scale testing application

            -
          14. -
          - - -

          Setting Global Scales

          - -
            -
          1. -

            Add a callback for the second spinner that changes Edje global scale value and, as a result, affects all loaded Edje objects:

            - -
            static void
            -create_base_gui(appdata_s *ad)
            -{
            -   // Add scale spinners
            -   ad->edje_object_scale = elm_spinner_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->edje_object_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   evas_object_size_hint_align_set(ad->edje_object_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   elm_spinner_min_max_set(ad->edje_object_scale, 1, 300);
            -   elm_spinner_step_set(ad->edje_object_scale, 10);
            -   evas_object_show(ad->edje_object_scale);
            -   elm_spinner_value_set(ad->edje_object_scale, 100);
            -   elm_object_part_content_set(ad->main_layout, "scale.swallow2", ad->edje_object_scale);
            -
            -   evas_object_smart_callback_add(ad->edje_object_scale, "changed", _on_global_scale_change, ad);
            -}
            -
          2. - -
          3. - -

            Set the scale using the edje_scale_set() function:

            - -
            static void
            -_on_global_scale_change(void *data, Evas_Object *obj, void *event_info)
            -{
            -   edje_scale_set(elm_spinner_value_get(obj) / 100);
            -}
            - -

            By clicking the spinner buttons, you can change the scale of all loaded Edje objects. The Edje object on the right has its own scale values, so global scale values do not apply to it.

            - -

            Figure: Different global scales

            -

            Different global scales

            -
          4. - -
          - - - - - - - - - -
          Note
          Using the edje_scale_set() function that changes the global scale values can affect your whole application and destroy the UI layout. Be careful with this function.
          - -

          Setting Scales for Edje Objects

          - -

          Add a callback to get the value of the first spinner and apply it to the Edje object on the right:

          - -
          static void
          -_on_scale_change(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   edje_object_scale_set(ad->edje_object_2, elm_spinner_value_get(obj) / 100);
          -}
          -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   // Add scale spinners
          -   ad->edje_scale = elm_spinner_add(ad->win);
          -   evas_object_size_hint_weight_set(ad->edje_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(ad->edje_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   elm_spinner_min_max_set(ad->edje_scale, 1, 300);
          -   elm_spinner_step_set(ad->edje_scale, 10);
          -   evas_object_show(ad->edje_scale);
          -   elm_spinner_value_set(ad->edje_scale, 100);
          -   elm_object_part_content_set(ad->main_layout, "scale.swallow", ad->edje_scale);
          -   evas_object_smart_callback_add(ad->edje_scale, "changed", _on_scale_change, ad);
          -}
          - - -

          By clicking on spinner buttons, you can change the scale of the second Edje object in the box.

          - -

          Figure: Edje object scales

          -

          Edje object scales

          - - -

          Personal, Global, and Base Scales

          - -

          Modify the main layout and add a swallow for the buttons. The buttons are used for showing the current scale:

          - -
            -
          1. -

            Modify the main layout EDC code by creating another swallow part, swallow.buttons , and modifying the edje.swallow.content part:

            - -
            -group 
            -{ 
            -   name: "main_application";
            -   parts 
            -   {
            -      part 
            -      { 
            -         name: "edje.swallow.content";
            -         type: SWALLOW;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 1.0;
            -            rel1 
            -            {
            -               relative: 0.0 1.0;
            -               offset: 0 20;
            -               to_y: "title2";
            -            }
            -            rel2 
            -            {
            -               relative: 1.0 0.0;
            -               to_y: "swallow.buttons";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "title1";
            -         type: TEXT;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 100 32;
            -            color: 0 0 0 255;
            -            text 
            -            {
            -               text: "edje scale:";
            -               font: "Sans";
            -               size: 16;
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "title2";
            -         type: TEXT;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 150 32;
            -            color: 0 0 0 255;
            -            rel1 
            -            {
            -               relative: 0.0 1.0;
            -               to_y: "scale.swallow";
            -            }
            -            text 
            -            {
            -               text: "edje object scale:";
            -               font: "Sans";
            -               size: 16;
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "scale.swallow";
            -         type: SWALLOW;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 200 48;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to_x: "title2";
            -               to_y: "title1";
            -            }
            -            rel2 
            -            {
            -               to_y: "title1";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "scale.swallow2";
            -         type: SWALLOW;
            -         scale: 1;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 0.0;
            -            max: 200 48;
            -            rel1 
            -            {
            -               relative: 1.0 0.0;
            -               to: "title2";
            -            }
            -            rel2 
            -            {
            -               to_y: "title2";
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "swallow.buttons";
            -         type: SWALLOW;
            -         scale: 0;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.0 1.0;
            -            min: 0 60;
            -            max: -1 60;
            -         }
            -      }
            -   }
            -}
            -
            -
          2. - -
          3. -

            Add a box with buttons and set it into the main layout:

            - -
            static void
            -_edje_object_scale_get(void *data, Evas_Object *obj, void *event_info)
            -{
            -   char title[PATH_MAX] = {0, };
            -   appdata_s *ad = data;
            -   snprintf(title, (int)PATH_MAX, "object %.2f", edje_object_scale_get(ad->edje_object_2));
            -   elm_object_text_set(obj, title);
            -}
            -static void
            -_edje_scale_get(void *data, Evas_Object *obj, void *event_info)
            -{
            -   char title[PATH_MAX] = {0, };
            -   snprintf(title, (int)PATH_MAX, "global %.2f", edje_scale_get());
            -   elm_object_text_set(obj, title);
            -}
            -static void
            -_edje_object_base_scale_get(void *data, Evas_Object *obj, void *event_info)
            -{
            -   char title[PATH_MAX] = {0, };
            -   appdata_s *ad = data;
            -   snprintf(title, (int)PATH_MAX, "base %.2f", edje_object_base_scale_get(ad->edje_object_2));
            -   elm_object_text_set(obj, title);
            -}
            -
            -static void
            -create_base_gui(appdata_s *ad) 
            -{
            -   Evas_Object *box, *button;
            -   // Add the box
            -   box = elm_box_add(ad->main_layout);
            -   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            -   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            -   elm_box_horizontal_set(box, EINA_TRUE);
            -   evas_object_show(box);
            -   elm_object_part_content_set(ad->main_layout, "swallow.buttons", box);
            -
            -   button = elm_button_add(ad->main_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, "object ");
            -   evas_object_show(button);
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_scale_get, ad);
            -   elm_box_pack_end(box, button);
            -
            -   button = elm_button_add(ad->main_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, "global ");
            -   evas_object_show(button);
            -   evas_object_smart_callback_add(button, "clicked", _edje_scale_get, ad);
            -   elm_box_pack_end(box, button);
            -
            -   button = elm_button_add(ad->main_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, "base ");
            -   evas_object_show(button);
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_base_scale_get, ad);
            -   elm_box_pack_end(box, button);
            -}
            - - -

            Clicking a button gets a specific scale and prints its value on the button. For example, clicking the Global button shows the global scale value.

            - -

            Figure: Scale values

            -

            Scale values

            -
          4. - -
          5. -

            The loaded Edje object does not have its own scale value (0.00), so it uses the global scale value defined in the EFL configuration based on the device. A mobile device that is being used here, has the global scale ~1.8). The base scale is set to 1.2.

            - -
            collections 
            -{
            -   base_scale: 1.2;
            -   group 
            -   { 
            -      name: "scale_group_1";
            -   }
            -   group 
            -   { 
            -      name: "scale_group_2";
            -   }
            -   group 
            -   { 
            -      name: "main_layout";
            -   }
            -}
            - -

            Figure: Scale values after changing the Edle object scale

            -

            Figure: Scale values after changing the Edle object scale

            - -

            After applying the scale of the new object, the global scale does not apply to this Edje object anymore. While all other objects have the scale value 1.8, the new object has the scale value 1.37.

            - - - - - - - - - - -
            Note
            The default base scale value is 1.0. All scale values in Edje objects, either set with the global scale value using the edje_scale_set() function or with a personal scale factor using the edje_object_scale_set() function are divided by base scale.
            - -

            Figure: Base scale

            -

            Base scale

            - -

            Setting a scale value that is same as the base scale makes the layout appear as if it had the scale value 1.0.

            -
          6. -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/edje_text_n.htm b/org.tizen.ui.guides/html/native/efl/edje_text_n.htm deleted file mode 100755 index 47ca76f..0000000 --- a/org.tizen.ui.guides/html/native/efl/edje_text_n.htm +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - - - - - - - Using Edje Text Classes - - - - - - -
          -

          Using Edje Text Classes

          - -

          This tutorial demonstrates how you can change the text of 2 or more parts using Edje text classes.

          -

          If a part is assigned with a text class, setting font attributes to this class updates all those parts with the new font attributes. Setting the values to a text class affects all parts in that text class at process level, while at the object level, it only affects the parts inside a specified object.

          - -

          Creating the Basic Application

          - -

          The example application has 2 screen with different UIs. The screens demonstrate different text class APIs. The screen contains a genlist with 2 items set into a naviframe. Clicking an item opens displays a screen. Pressing the hardware Back button displays the main screen with the genlist.

          - -
            -
          1. Create the basic application: - -
            static void
            -win_back_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   elm_naviframe_item_pop(ad->navifr);
            -}
            -
          2. - -
          3. -

            Get the path to the EDC file that contains the main layout and the Edje object to load:

            - -
            static void
            -app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max)
            -{
            -   char *res_path = app_get_resource_path();
            -   if (res_path) 
            -   {
            -      snprintf(edj_path_out, edj_path_max, "%s%s", res_path, edj_file_in);
            -      free(res_path);
            -   }
            -}
            - -

            Create a window and register an event callback that calls the win_back_cb() function after pressing the Back button on the device:

            - -
            static void
            -create_base_gui(appdata_s *ad)
            -{
            -   Elm_Object_Item *eoi = NULL;
            -
            -   // Window
            -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            -   elm_win_conformant_set(ad->win, EINA_TRUE);
            -   elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -   if (elm_win_wm_rotation_supported_get(ad->win)) 
            -   {
            -      int rots[4] = {0, 90, 180, 270};
            -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            -   }
            -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
            -}
            -
            -
          4. - -
          5. -

            Add a conformant that contains the naviframe and genlist. Add item selection callbacks for the genlist items to show different screens:

            - -
            static char *
            -_genlist_item_text_get(void *data, Evas_Object *obj, const char *part)
            -{
            -   Eina_Stringshare *text_class = (Eina_Stringshare *)data;
            -   if (strcmp(part, "elm.text") == 0)
            -      return strdup(text_class);
            -   else
            -      return NULL;
            -}
            -
            -static void
            -create_base_gui(appdata_s *ad)
            -{
            -   // Conformant
            -   ad->conform = elm_conformant_add(ad->win);
            -   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            -   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_win_resize_object_add(ad->win, ad->conform);
            -   evas_object_show(ad->conform);
            -
            -   // Naviframe
            -   ad->navifr = elm_naviframe_add(ad->win);
            -   elm_object_content_set(ad->conform, ad->navifr);
            -   eext_object_event_callback_add(ad->navifr, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, ad);
            -
            -   // Genlist
            -   ad->itc = elm_genlist_item_class_new();
            -   ad->itc->func.text_get =_genlist_item_text_get;
            -
            -   ad->genlist = elm_genlist_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -
            -   eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Text Class List"), NULL,
            -                                 ELM_GENLIST_ITEM_NONE, NULL, ad);
            -   eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Object Text Class API"), NULL,
            -                                 ELM_GENLIST_ITEM_NONE, NULL, ad);
            -   elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
            -
            -   // Show the window
            -   evas_object_show(ad->win);
            -}
            - - -

            The following figure shows the result.

            - -

            Figure: Main screen

            -

            Main screen

          6. -
          - -

          Getting, Deleting, and Displaying Text Classes

          - -

          The first screen of the application shows an example of the edje_text_class_del(), edje_text_class_list(), and edje_text_class_get() functions.

          - -

          The following code implements the layout:

          - -
          -group 
          -{ 
          -   name: "class_list_application";
          -   parts 
          -   {
          -      part 
          -      { 
          -         name: "text_view";
          -         type: TEXT;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            visible: 1;
          -            color: 0 0 0 255;
          -            align: 0.5 0.0;
          -            text 
          -            {
          -               text: "text part number 3";
          -               font: "Sans";
          -               min: 1 1;
          -               max: 1 1;
          -               size: 20;
          -            }
          -         }
          -      }
          -      part 
          -      { 
          -         name: "edje.swallow.list";
          -         type: SWALLOW;
          -         description
          -         { 
          -            state: "default" 0.0;
          -            align: 0.5 0.0;
          -            color: 0 0 0 255;
          -            rel1 
          -            {
          -               relative: 0.0 1.0;
          -               to_y: "text_view";
          -            }
          -         }
          -      }
          -   }
          -}
          -
          - -

          Figure: First screen EDC layout

          -

          First screen EDC layout

          - -

          The first part (text_view) shows the properties of the selected text class. Clicking a text class in the genlist shows its properties, such as font, size, and name in the text part.

          - -
            -
          1. -

            Add the base genlist:

            - -
            -ad->genlist = elm_genlist_add(ad->win);
            -evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Text Class List"), NULL, 
            -                              ELM_GENLIST_ITEM_NONE, _create_class_list_gui, ad);
            -eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Object Text Class API"), 
            -                              NULL, ELM_GENLIST_ITEM_NONE, NULL, ad);
            -elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
            -
            -
          2. - -
          3. -

            Load the layout:

            - -
            static void
            -_create_class_list_gui(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data; // Get application's data
            -   char edj_path[PATH_MAX] = {0, }; // path to edc file
            -   Eina_List *l;  //  Used later
            -   const char *str; // Used later
            -   Elm_Object_Item *eoi = NULL; // Used later
            -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -
            -   // Main layout
            -   ad->gui1_layout = elm_layout_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->gui1_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_layout_file_set(ad->gui1_layout, edj_path, "class_list_application");
            -}
            -
            -
          4. - -
          5. -

            Get a list of all text classes loaded into the system.In the following example, the Eina_List list is a field in application data.

            - -
            ad->list = edje_text_class_list();
            -
          6. - -
          7. -

            Create the genlist:

            - -
            // Genlist
            -ad->itc_text_classes = elm_genlist_item_class_new();
            -ad->itc_text_classes->func.text_get =_genlist_item_text_get;
            -
            -ad->genlist_text_classes = elm_genlist_add(ad->win);
            -evas_object_size_hint_weight_set(ad->genlist_text_classes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -
            -
          8. - -
          9. -

            Go through the text class list and insert each text class to the genlist. Set the genlist into the main layout of the current screen and show it in the naviframe:

            - -
            -EINA_LIST_FOREACH(ad->list, l, str)
            -{
            -   eoi = elm_genlist_item_append(ad->genlist_text_classes, ad->itc_text_classes, str, NULL, ELM_GENLIST_ITEM_NONE, NULL, ad);
            -   elm_object_item_data_set(eoi, (void *)str);
            -}
            -elm_object_part_content_set(ad->gui1_layout, "edje.swallow.list", ad->genlist_text_classes);
            -evas_object_show(ad->genlist_text_classes);
            -elm_naviframe_item_simple_push(ad->navifr, ad->gui1_layout);
            -
            - - -

            Clicking Text Class List displays the screen with a genlist of text classes.

            - -

            Figure: Text class list

            -

            Text class list

            -
          10. - -
          11. -

            The edje_text_class_del() function deletes a text class (in the following example, T094):

            - -
            -// Main layout
            -ad->gui1_layout = elm_layout_add(ad->win);
            -evas_object_size_hint_weight_set(ad->gui1_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_layout_file_set(ad->gui1_layout, edj_path, "class_list_application");
            -evas_object_show(ad->gui1_layout);
            -
            -// Get the collection list
            -app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -edje_text_class_del("T094");
            -ad->list = edje_text_class_list();
            -
            -// Genlist
            -ad->itc_text_classes = elm_genlist_item_class_new();
            -ad->itc_text_classes->func.text_get =_genlist_item_text_get;
            -
            - -

            Figure: Text class list after deleting a class

            -

            Text class list after deleting a class

            -
          12. - -
          13. -

            Every text class contains specific information, such as the font name, font size, and text class name. To show the properties when the text class name is clicked, create a callback that uses the edje_text_class_get() function:

            - -
            static void
            -_genlist_clicked(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   char text_class[PATH_MAX] = {0, };
            -   Elm_Object_Item *eoi = NULL;
            -   const char *str;
            -   char *font;
            -   Evas_Font_Size size;
            -
            -   eoi = elm_genlist_selected_item_get(obj);
            -   str = elm_object_item_data_get(eoi);
            -   edje_text_class_get(str, &font, &size);
            -   snprintf(text_class, PATH_MAX, "%s font{%s} size{%d}", str, font, size);
            -   elm_object_part_text_set(ad->gui1_layout, "text_view", text_class);
            -}
            -
          14. - -
          15. -

            Register the added callback function in the genlist:

            - -
            -EINA_LIST_FOREACH(ad->list, l, str)
            -{
            -   eoi = elm_genlist_item_append(ad->genlist_text_classes, ad->itc_text_classes, str, NULL, ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
            -   elm_object_item_data_set(eoi, (void *)str);
            -}
            -elm_object_part_content_set(ad->gui1_layout, "edje.swallow.list", ad->genlist_text_classes);
            -
            -evas_object_show(ad->genlist_text_classes);
            -elm_naviframe_item_simple_push(ad->navifr, ad->gui1_layout);
            -
            - -

            Figure: Displaying text class properties

            -

            Displaying text class properties

            -
          16. -
          - - -

          Application Layout

          - -

          The second screen contains 2 Edje object with text parts containing the custom_text_class text class. When a text class is modified, all text parts assigned to it are changed as well.

          - -

          The following example shows a simple Edje object layout:

          - -
          -group 
          -{ 
          -   name: "edje_example";
          -   parts 
          -   {
          -      part 
          -      { 
          -         name: "text_example";
          -         type: TEXT;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            visible: 1;
          -            color: 0 0 0 255;
          -            text 
          -            {
          -               text: "text part number 3";
          -               font: "Sans";
          -               size: 10;
          -               text_class: "custom_text_class";
          -            }
          -         }
          -      }
          -   }
          -}
          - -
            -
          1. -

            After loading the Edje objects, add a spinner for changing the font size.

            - -

            Add 2 buttons for changing the text class of a specific object or setting the font size of the custom_text_class text class. The Set1 button sets a new size for the text class of the first Edje object and the Set2 button for the second object, respectively.

            - -

            The Get1 and Get2 buttons get the text class properties and display them on the screen.

            -

            The Global button changes the text class globally, causing all Edje object parts to be changed in case they contain the custom_text_class text class.

            - -
            -group 
            -{ 
            -   name: "class_list_application";
            -   parts 
            -   {
            -      part 
            -      { 
            -         name: "text_view";
            -         type: TEXT;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            visible: 1;
            -            color: 0 0 0 255;
            -            align: 0.5 0.0;
            -            text 
            -            {
            -               text: "text part number 3";
            -               font: "Sans";
            -               min: 1 1;
            -               max: 1 1;
            -               size: 20;
            -            }
            -         }
            -      }
            -      part 
            -      { 
            -         name: "edje.swallow.list";
            -         type: SWALLOW;
            -         description 
            -         { 
            -            state: "default" 0.0;
            -            align: 0.5 0.0;
            -            color: 0 0 0 255;
            -            rel1 
            -            {
            -               relative: 0.0 1.0;
            -               to_y: "text_view";
            -            }
            -      }
            -   }
            -}
            -
            -
          2. - -
          3. -

            Create a view for the new screen:

            - -
            static void
            -_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   char edj_path[PATH_MAX] = {0, };
            -
            -   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            -
            -   // Main Layout
            -   ad->gui2_layout = elm_layout_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->gui2_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_layout_file_set(ad->gui2_layout, edj_path, "object_text_class_application");
            -   evas_object_show(ad->gui2_layout);
            -
            -   // Add group1
            -   ad->edje_object_1 = edje_object_add(evas_object_evas_get(ad->win));
            -   evas_object_size_hint_weight_set(ad->edje_object_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   edje_object_file_set(ad->edje_object_1, edj_path, "edje_example");
            -   // Check the object loading error
            -   if (edje_object_load_error_get(ad->edje_object_1) != EDJE_LOAD_ERROR_NONE)
            -   {
            -      evas_object_del(ad->edje_object_1);
            -
            -      return;
            -   }
            -   evas_object_show(ad->edje_object_1);
            -   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.group1", ad->edje_object_1);
            -
            -   // Addgroup2
            -   ad->edje_object_2 = edje_object_add(evas_object_evas_get(ad->win));
            -   evas_object_size_hint_weight_set(ad->edje_object_2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   edje_object_file_set(ad->edje_object_2, edj_path, "edje_example");
            -   // Check object loading errors
            -   if (edje_object_load_error_get(ad->edje_object_2) != EDJE_LOAD_ERROR_NONE)
            -   {
            -      evas_object_del(ad->edje_object_2);
            -
            -      return;
            -   }
            -   evas_object_show(ad->edje_object_2);
            -   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.group2", ad->edje_object_2);
            -
            -   // Add spinner
            -   ad->spinner = elm_spinner_add(ad->win);
            -   evas_object_size_hint_weight_set(ad->spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   evas_object_size_hint_align_set(ad->spinner, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   elm_spinner_min_max_set(ad->spinner, 1, 64);
            -   elm_spinner_step_set(ad->spinner, 1);
            -   evas_object_show(ad->spinner);
            -   elm_spinner_value_set(ad->spinner, 10);
            -   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.spinner", ad->spinner);
            -   elm_naviframe_item_simple_push(ad->navifr, ad->gui2_layout);
            -}
            - - -

            Figure: Second application screen

            -

            Second application screen

          4. -
          - -

          Setting the Text Class for All Edje Objects

          - -

          To set the text class globally, use the edje_test_class_set() function:

          - -
            -
          1. -

            Add a box and pack the buttons into it. Add the Global button and register a callback for clicking:

            - -
            static void
            -_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            -{
            -   Evas_Object *box, *button;
            -   // Add the box
            -   box = elm_box_add(ad->gui2_layout);
            -   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            -   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            -   elm_box_horizontal_set(box, EINA_TRUE);
            -   evas_object_show(box);
            -
            -   button = elm_button_add(ad->gui2_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, "Global");
            -   evas_object_show(button);
            -   evas_object_smart_callback_add(button, "clicked", _edje_text_class_set, ad);
            -   elm_box_pack_end(box, button);
            -
            -   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.buttons", box);
            -
            -   elm_naviframe_item_simple_push(ad->navifr, ad->gui2_layout);
            -}
            -
          2. - -
          3. -

            The callback contains functions for setting the text class globally:

            - -
            static void
            -_edje_text_class_set(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   edje_text_class_set("custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            -}
            - -

            Clicking the Global button recalculates all text parts in every Edje object that contains the custom_text_class text class and changes their size.

            - - -

            Figure: Changing the text class globally

            -

            Changing the text class globally

          4. - -
          - -

          Setting the Text Class of a Specific Object

          - -

          To set the text class of a specific Edje object, use the edje_object_test_class_set() function.

          - -
            -
          1. -

            Add 2 more buttons, Set1 and Set2.

            -

            The first button sets the text class of the first Edje object on the left, and the second sets the text class of the other object, respectively.

            - -
            static void
            -_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            -{
            -   button = elm_button_add(ad->gui2_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, Set1);
            -   evas_object_show(button);
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_set_1, ad);
            -   elm_box_pack_end(box, button);
            -
            -   button = elm_button_add(ad->gui2_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, Set2);
            -   evas_object_show(button); 
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_set_2, ad);
            -   elm_box_pack_end(box, button);
            -}
            -
          2. - -
          3. -

            Add callbacks:

            - -
            static void
            -_edje_object_text_class_set_1(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   edje_object_text_class_set(ad->edje_object_1, "custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            -}
            -
            -static void
            -_edje_object_text_class_set_2(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   edje_object_text_class_set(ad->edje_object_2, "custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            -}
            -
          4. - -
          5. -

            Test the functionality:

            - -
              -
            1. Set the size of the left object to 16. - -

              Font size 16

            2. - -
            3. Set the size of the right object to 44. - -

              Font size 44

            4. - -
            5. Set the size of the right object to 22. - -

              Font size 22

            6. -
            -
          6. -
          - - -

          Getting the Text Class of an Object

          - -

          To get the text class of a specific Edje object, use the edje_object_test_class_get() function.

          - -
            -
          1. -

            Add 2 more buttons, Get1 and Get2. The first gets the text class of the first Edje object on the left and sets into that object result, and the second gets the text class of the other object, respectively.

            - -
            static void
            -_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            -{
            -   button = elm_button_add(ad->gui2_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, Get1);
            -   evas_object_show(button); 
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_get_1, ad);
            -   elm_box_pack_end(box, button);
            -
            -   button = elm_button_add(ad->gui2_layout);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -   elm_object_text_set(button, Get2);
            -   evas_object_show(button); 
            -   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_get_2, ad);
            -   elm_box_pack_end(box, button);
            -}
            -
          2. - -
          3. -

            Add callbacks:

            -
            static void
            -_edje_object_text_class_get_1(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   char *font;
            -   Evas_Font_Size size;
            -   char text_class[PATH_MAX] = {0, };
            -
            -   edje_object_text_class_get(ad->edje_object_1, "custom_text_class", &font, &size);
            -   snprintf(text_class, PATH_MAX, "font{%s} size{%d}", font, size);
            -   edje_object_part_text_set(ad->edje_object_1, "text_example", text_class);
            -}
            -
            -static void
            -_edje_object_text_class_get_2(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   char *font;
            -   Evas_Font_Size size;
            -   char text_class[PATH_MAX] = {0, };
            -
            -   edje_object_text_class_get(ad->edje_object_2, "custom_text_class", &font, &size);
            -   snprintf(text_class, PATH_MAX, "font{%s} size{%d}", font, size);
            -   edje_object_part_text_set(ad->edje_object_2, "text_example", text_class);
            -}
            - - -

            The following figure shows the result.

            - -

            Figure: Displaying text class changes

            -

            Displaying text class changes

            - - -

            Changing the custom_text_class for the first object changed its font size to 16 size, while changing the custom_text_class for the second object changes its font size to 22.

          4. -
          - - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/efl_overview_n.htm b/org.tizen.ui.guides/html/native/efl/efl_overview_n.htm deleted file mode 100755 index 80a2aef..0000000 --- a/org.tizen.ui.guides/html/native/efl/efl_overview_n.htm +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - EFL Overview: Getting Started with EFL UI Programming - - - - - -
          - -

          EFL Overview: Getting Started with EFL UI Programming

          - -

          EFL stands for Enlightenment Foundation Libraries. Enlightenment is a project consisting of the Enlightenment window manager, EFL libraries, and various utilities and applications. The Enlightenment team needed powerful libraries to handle, among others, rendering, main loops, and events, so EFL was introduced during the development of the Enlightenment window manager to fill these gaps. EFL is now widely used outside of the Enlightenment window manager.

          - -

          EFL Features

          - -

          The general UI design features include:

          -
            -
          • UI component support -

            You can use basic core UI components, such as buttons, genlists, and sliders, and also create a layout for the Tizen native application by using container UI components.

          • -
          • Theme support -

            You can create and change a theme that is a preset package containing graphical details. Tizen supports specifying the UI look and feel through a default theme.

          • -
          • Font settings -

            Tizen supports various methods to change the font of your application to another system default font or your own font.

          • -
          • Scalability -

            Elementary provides a way to scale UI components in order to be comfortably used with a finger and to make the text more readable.

          • -
          • Event handling and main loop -

            The user interface relies on callbacks designed to react to EFL events generated by the system or the user. You can handle various events, from low-level Ecore system events to Evas smart object events that happen on object collections.

            -

            The Ecore library provides a main loop abstraction that gets you data when it is available and sends you events. You can handle the main loop and use threads with the Ecore main loop.

          • -
          • UI animating with animators and effects -

            Tizen supports various methods to create animations and effects in your application.

          • -
          • Data types and tools support -

            Tizen supports a core library for data types and some useful tools.

          • -
          • Hardware input event support -

            Tizen supports the handling of hardware input events.

          • -
          - -

          EFL Characteristics

          - -

          EFL is aimed at not only desktop computers but also touch-screen and embedded devices, making EFL applications portable to many different types of devices. Applications do not need to care about the types of devices and profiles they run on. Instead of changing the code, it is typically enough to simply configure the applications for different devices.

          - -

          The key characteristics of EFL include:

          - -
            -
          • Performance -

            The main reason Tizen adopted EFL as its native toolkit is its speed. EFL is highly optimized by using a scene graph and retained-mode rendering. EFL is fast even in software rendering.

          • -
          • Small memory footprint -

            Despite its fast performance, EFL's memory footprint is smaller than that of other toolkits with similar features. A small memory footprint is useful in the embedded world, since embedded devices do not normally have much memory.

          • -
          • Back-end engine support -

            EFL supports several back-end engines, such as X11 (OpenGL, Xlib, Xcb), Wayland (OpenGL, SHM), Direct Framebuffer, DRM, memory buffers, PS3 native, Windows, and Mac OS. Applications do not need to deal with each back-end engine separately.

          • -
          • GUI and logic separation -

            EFL supports GUI layout and logic separation by having the layout description in a plain text file and the logic code in the C or C++ source files.

          • -
          • Themeable -

            An EFL theme can be changed at runtime without restarting the application. UI components are customizable so that each application can create its own customized theme to overlay above the default theme, adding customized versions of UI components to achieve a specific look and feel.

          • -
          • Scalable -

            EFL supports a scale factor that affects the size of objects in the application at runtime. By configuring the scale factor, applications can scale up and down as needed. The scale factor also supports a default setting that allows applications to scale nicely out-of-the-box.

          • -
          • Animations -

            EFL supports different types of animations. Evas supports Evas maps with low-level APIs for performing 2D, 2.5D, and 3D object transformations. Edje supports pre-defined transitions and wrapping of Evas maps. Elementary supports transit APIs for various types of animations, which can be combined.

          • -
          • Hardware acceleration -

            EFL supports OpenGL® and OpenGL-ES acceleration.

          • -
          - - -

          EFL Libraries

          - -

          The EFL are a set of layered libraries, as shown in the following diagram:

          - -

          Figure: EFL layers

          -

          EFL layers

          - -

          When you create a basic EFL application, you use the following main libraries as a basis:

          - -
            -
          • Elementary is the top-most library with which you create your EFL application. It provides all the functions you need to create a window, create simple and complex layouts, manage the life cycle of a view, and add UI components. The full list of UI components that can be used in Tizen can be found in Mobile UI Components and Wearable UI Components.
          • -
          • Edje is the library used by Elementary to provide a powerful theme. You can also use Edje to create your own objects and use them in your application. You may also want to extend the default theme. You will find more information about Edje and the EDC format in Themes and Customizing Components.
          • -
          • Ecore is the library which manages the main loop of your application. The main loop is one of the most important concepts you need to know about to develop an application. The main loop is where events are handled, and where you interact with the user through the callback mechanism. The main loop mechanisms are explained in the Handling the Main Loop guide.
          • -
          • Evas is the canvas engine. Evas is responsible for managing the drawing of your content. All graphical objects that you create are Evas objects. Evas handles the entire state of the window by filling the canvas with objects and manipulating their states. In contrast to other canvas libraries, such as Cairo, OpenGL, and XRender, Evas is not a drawing library but a scene graph library that retains the state of all objects. The Evas concept is explained in Evas Rendering Concept and Method. Evas objects are created and then manipulated until they are no longer needed, at which point they are deleted. This allows the developer to work in the same terms that a designer thinks in: it is a direct mapping, as opposed to having to convert the concepts into drawing commands in the right order, calculate minimum drawing calls needed to get the job done, and so on.
          • -
          • Eina is the basis of all the EFL libraries. Eina is a toolbox that implements an API for data types in an efficient way. It contains all the functions needed to create lists and hashes, manage shared strings, open shared libraries, and manage errors and memory pools. Eina concepts are explained in Data Types and Tools.
          • -
          - -

          The EFL include more than just the above libraries, but the above are the most important libraries to get started with. The other libraries, such as Eet, Embryo, and Emotion, will be explored later in the programming guides and the API Reference (in mobile and wearable applications).

          - -

          The Hello World example shows you how to develop your first application with the EFL.

          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/elementary_animation_n.htm b/org.tizen.ui.guides/html/native/efl/elementary_animation_n.htm deleted file mode 100755 index f956971..0000000 --- a/org.tizen.ui.guides/html/native/efl/elementary_animation_n.htm +++ /dev/null @@ -1,872 +0,0 @@ - - - - - - - - - - - - - Elementary Animations - - - - - -
          - -

          Elementary Animations

          - -

          Elementary transitions (Elm_Transit) allow you to apply various transition effects, such as translation and rotation, to Evas objects. Elementary transitions are mostly based on Ecore animators, but provide some transition methods at a higher level of abstraction. Elementary transitions provide a simpler way of animating objects than Ecore animators or Edje animations.

          - -

          To use Elementary transitions, you must create an Elm_Transit object and define the desired transitions using the methods of this object. After the transitions are registered, they will be automatically managed: their callback functions will be called for the set duration, and they will be deleted upon completion.

          - -

          Use Elementary transitions only when Edje animations are not sufficient. Edje animations are better at handling transitions, have more flexibility, and can be manipulated inside themes. The only drawback is that Edje animations have their own definition language. If you want to code with the C language, use Elementary transitions.

          - -

          Getting Started

          -

          The first thing you need to do when creating an transition with Elm_Transit is to build your transit object using the elm_transit_add() function:

          - -
          Elm_Transit *transit = elm_transit_add();
          - -

          You now have an Elm_Transit instance that will allow you to perform transitions on one or more objects. The transit object holds the information about the target objects and the transition effects that will be used. The transit object also contains information about animation duration, number of repetitions, auto-reverse, and so on. The transit object starts playing as soon as the application enters the main loop.

          - -

          Adding Objects to an Animation

          - -

          You can add your Evas objects to your transition using the elm_transit_object_add() function:

          - -
          elm_transit_object_add(Elm_Transit *transit, Evas_Object *obj)
          - -

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the Evas object to animate.

          - - - - - - - - - - -
          Note

          The Evas object can be a low-level component, such as a rectangle, but also a UI component, such as a button, image, or calendar.

          -

          If you want to animate an Evas object handled by a container, such as a box, you need to either unpack the object before the animation or animate the whole container.

          - -

          If you want to know which objects are currently in your transition, use the elm_transit_objects_get() function. You will get a list of all the objects that are subject to the transition.

          - -

          At any time, you can remove objects from the transition:

          - -
          elm_transit_object_remove(Elm_Transit *transit, Evas_Object *obj)
          - -

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the Evas object to remove from the transition.

          - - - - - - - - - - -
          Note
          After you have added at least one Evas object to your transition, if the list of objects gets emptied somehow, be it because the transition has been terminated or all objects have been deleted, the transition will be automatically deleted. Otherwise, you will have to delete the transition by yourself using the elm_transit_del() function. If you delete the transit while the transition is running, the transition will stop.
          - -

          Adding Images to an Animation

          - -

          If you do not want to manage UI components for animating images, Elm_Transit provides a helper function for directly manipulating images:

          - -
          -elm_transit_effect_image_animation_add(Elm_Transit *transit, Eina_List *images)
          -
          - -

          The first argument is the Elm_Transit instance that handles the transition. The second argument is a list of the image paths.

          - - - - - - - - - - -
          Note
          This list and its contents will be deleted after the effect ends by the elm_transit_effect_image_animation_context_free() function.
          - -

          You can now define your image transitions exactly the same way as with any Evas object.

          - -

          The following example shows how to use Elm_Transit with images:

          - -
          char buf[PATH_MAX];
          -Eina_List *images = NULL;
          -Elm_Transit *transit = elm_transit_add();
          -snprintf(buf, sizeof(buf), "%s/images/btn_default.png", PACKAGE_DATA_DIR);
          -images = eina_list_append(images, eina_stringshare_add(buf));
          -snprintf(buf, sizeof(buf), "%s/images/btn_hover.png", PACKAGE_DATA_DIR);
          -images = eina_list_append(images, eina_stringshare_add(buf));
          -elm_transit_effect_image_animation_add(transit, images);
          - -

          Animation Duration

          - -

          With Elm_Transit, setting the transition duration is mandatory. To set the duration, use the elm_transit_duration_set() function:

          - -
          elm_transit_duration_set(Elm_Transit *transit, double duration)
          - -

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the duration in seconds.

          - - - - - - - - - - -
          Note
          The purpose of Elm_Transit is to abstract the low-level details of object interpolation, so you cannot create an infinite transition by specifying the duration. However, you can make your transition last forever using the repeat function.
          - -

          The following example shows how to make a complete revolution of the target Evas object in 2 seconds:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_rotation_add(transit, 0.0, 360);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_go(transit);
          -
          - -

          To get the duration of the transition, use the elm_transit_duration_get() function.

          - -

          Animation Acceleration Mode ("Tween Mode")

          - -

          Elm_Transit supports a number of built-in interpolation methods. By default, all interpolations are linear. If you want to change the animation's dynamics, use the elm_transit_tween_mode_set() function:

          - -
          elm_transit_tween_mode_set(Elm_Transit *transit, Elm_Transit_Tween_Mode tween_mode)
          - -

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the tween mode of the transition, which can be one of the following:

          -
            -
          • ELM_TRANSIT_TWEEN_MODE_LINEAR: The default mode.
          • -
          • ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL: The transition starts with acceleration and ends with deceleration.
          • -
          • ELM_TRANSIT_TWEEN_MODE_DECELERATE: The transition decelerates over time.
          • -
          • ELM_TRANSIT_TWEEN_MODE_ACCELERATE: The transition accelerates over time.
          • -
          • ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE: The transition uses an interpolated cubic-bezier curve adjusted with parameters.
          • -
          - -

          To get the current tween mode, use the elm_transit_tween_mode_get() function.

          - -

          Animation Repeat

          - -

          To set a transition to repeat, use the elm_transit_repeat_times_set() function:

          - -
          elm_transit_repeat_times_set(Elm_Transit *transit, int repeat)
          - -

          The function takes the following arguments:

          -
            -
          • The transition you want to repeat.
          • -
          • The number of times the transition repeats.
          • -
          - - - - - - - - - - -
          Note
          If the repeat argument is set to 0, the transition will not loop at all. If set to 1, the transition will run twice. If set to a negative value, the transition will repeat forever.
          - -

          To get the repeat value, use the elm_transit_repeat_times_get() function. The default value is 0.

          - -

          The following example shows how to make an Evas object spin for 3 complete revolutions in 6 seconds:

          - -
          Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_rotation_add(transit, 0.0, 360);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_repeat_set(transit, 3.0);
          -elm_transit_go(transit);
          - -

          Animation Auto-reverse

          - -

          Elm_Transit provides a helper function for automatically reversing the transition once it finishes:

          - -
          elm_transit_auto_reverse_set(Elm_Transit *transit, Eina_Bool reverse)
          - -

          The first argument is the transition you want to reverse. The second argument is the reverse state. If the reverse state is set to EINA_TRUE, this function will perform the same transition backwards as soon as the first transition is complete.

          - - - - - - - - - - -
          Note
          -

          Reversing the transition doubles the duration of the transition. Moreover, if the transition is set to repeat, the transition will run back and forth until the repeat count is finished.

          -

          You can calculate the duration as follows if both auto-reverse and repeat are set: 2 * duration * repeat.

          -
          - -

          The following example shows how to make an object perform half a turn and then reverse the animation to its original position in 4 seconds:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_rotation_add(transit, 0.0, 360);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_auto_reverse_set(transit, EINA_TRUE);
          -elm_transit_go(transit);
          -
          - -

          To determine whether the auto-reverse mode is enabled, use the elm_transit_auto_reverse_get() function.

          - -

          Transitions

          - -

          We distinguish two main transition types:

          -
            -
          • Transitions that are applied to the properties of objects, such as position, size, angle, and color.
          • -
          • Transitions from one object to another, where the first object is hidden to let the second one appear.
          • -
          -

          All transitions are based on the same principle: we set the starting and the ending values for the properties we want to animate, we then set the lifespan of the animation, and finally we inquire the preferred interpolation method (such as linear, acceleration, or bounce).

          - -

          You must declare the transitions after the parent window has been created, since the transition effects make use of the geometric properties of the parent window. If the parent window does not yet exist when calculating the interpolation, the interpolation may end up being based on wrong information.

          - -

          Built-in Transitions

          - -

          Elm_Transit provides several built-in transition definitions that are useful for the most common cases, so you that will not have to code them from scratch.

          - -

          All these built-in effects are implemented as follows:

          - -
          Elm_Transit *transit = elm_transit_add();
          -elm_transit_effect_add(transit,
          -                       elm_transit_effect_translation_op,
          -                       elm_transit_effect_translation_context_new(),
          -                       elm_transit_effect_translation_context_free);
          - -
            -
          • transit: The Elm_Transit object that contains the target Evas objects and all the information needed to setup the transition.
          • -
          • elm_transit_effect_translation_op: The callback function that performs the transition (resizing interpolation in this example).
          • -
          • elm_transit_effect_translation_context_new(): The callback function that returns the context used in the transition for calculations. In this example, the context is the coordinates of the before and after objects.
          • -
          • elm_transit_effect_translation_context_free: The callback function that frees up the memory once the transition is complete.
          • -
          - -

          All the definitions above can be rewritten as follows:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_effect_translation_add(transit, from_x, from_y, to_x, to_y);
          -
          - -

          Translation

          -

          To perform a translation on an Evas object, use the following method:

          - -
          -elm_transit_effect_translation_add(Elm_Transit *transit,
          -                                   Evas_Coord from_dx,
          -                                   Evas_Coord from_dy,
          -                                   Evas_Coord to_dx,
          -                                   Evas_Coord to_dy)
          -
          - -
            -
          • The first argument is the transit object that contains (among other things) all the Evas objects subject to the translation.
          • -
          • from_dx: The starting X coordinate (source).
          • -
          • from_dy: The starting Y coordinate (source).
          • -
          • to_dx: The ending X coordinate (destination).
          • -
          • to_dy: The ending Y coordinate (destination).
          • -
          - -

          The following example shows how to slide an Evas object (a rectangle) on a 45-degree diagonal, from bottom-left to top-right, at a constant speed, and in 1 second:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, rectangle);
          -elm_transit_effect_translation_add(transit, 0, 0, 280, 280);
          -elm_transit_duration_set(transit, 1);
          -elm_transit_go(transit);
          -
          - -

          Color Transition

          - -

          Color transitions allow you to dynamically change the color of Evas objects. The first argument is the transit object, while the other arguments will be used to define the color transition using RGB colors. There is also an alpha channel that controls the opacity of the color (the background of the object, not the object itself).

          - -
          -elm_transit_effect_color_add(Elm_Transit *transit,
          -                             unsigned int from_r,
          -                             unsigned int from_g,
          -                             unsigned int from_b,
          -                             unsigned int from_a,
          -                             unsigned int to_r,
          -                             unsigned int to_g,
          -                             unsigned int to_b,
          -                             unsigned int to_a)
          -
          - -
            -
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • -
          • from_r: The start value for "Red".
          • -
          • from_g: The start value for "Green".
          • -
          • from_b: The start value for "Blue".
          • -
          • from_a: The start value for "Alpha".
          • -
          • to_r: The end value for "Red".
          • -
          • to_g: The end value for "Green".
          • -
          • to_b: The end value for "Blue".
          • -
          • to_a: The end value for "Alpha".
          • -
          - -

          The following example shows how to transit a rectangle from red to blue in 3 seconds:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, rectangle);
          -elm_transit_effect_color_add(transit, // Target object
          -                             255, 0, 0, 255, // From color
          -                             0, 0, 255, 255); // To color
          -elm_transit_duration_set(transit, 3);
          -elm_transit_go(transit);
          -
          - -

          Rotation

          - -
          elm_transit_effect_rotation_add(Elm_Transit *transit, float from_degree, float to_degree)
          - -
            -
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • -
          • from_degree: The start degree of rotation.
          • -
          • to_degree: The end degree of rotation.
          • -
          - -

          This function can be used to perform a rotation on any Evas object. It works the same way as the other transit effects and takes two arguments for the starting and ending angles. Note that if you apply a rotation on multiple objects, they will individually mill around and not act as a group. If you want several objects to revolve around a common point, you must encapsulate the objects into a single parent object and apply the rotation to the parent object. The following example shows how to achieve this:

          - -
          -// Parent container
          -Evas_Object *parent = elm_box_add(my_window);
          -evas_object_show(parent);
          -elm_box_horizontal_set(parent, EINA_TRUE);
          -elm_box_homogeneous_set(parent, EINA_TRUE);
          -
          -// Button 1
          -Evas_Object *btn1 = elm_button_add(parent);
          -elm_object_text_set(btn1, "Btn1");
          -elm_box_pack_start(parent, btn1);
          -evas_object_show(btn1);
          -
          -// Button 2
          -Evas_Object *btn2 = elm_button_add(parent);
          -elm_object_text_set(btn2, "Btn2");
          -elm_box_pack_end(parent, btn2);
          -evas_object_show(btn2);
          -
          -// Make the parent container do a 360 degrees spin
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, parent);
          -elm_transit_effect_rotation_add(transit, 0.0, 360);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_go(transit);
          -
          - -

          Wipe Effect

          - -

          The wipe effect is designed to dynamically hide or show any element on the scene.

          - -
          -elm_transit_effect_wipe_add(Elm_Transit *transit,
          -                            Elm_Transit_Effect_Wipe_Type type,
          -                            Elm_Transit_Effect_Wipe_Dir dir)
          -
          - -

          In addition to the Elm_Transit instance passed as the first argument, the function takes the following arguments:

          - -
            -
          • type: The wipe type Elm_Transit_Effect_Wipe_Type defines whether to show or hide the target elements. The value can be one of the following: -
              -
            • ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE
            • -
            • ELM_TRANSIT_EFFECT_WIPE_TYPE_SHOW
            • -
            -
          • -
          • dir: The wipe direction Elm_Transit_Effect_Wipe_Dir defines in which direction the target will progressively appear or disappear. The value can be one of the following: -
              -
            • ELM_TRANSIT_EFFECT_WIPE_DIR_LEFT
            • -
            • ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT
            • -
            • ELM_TRANSIT_EFFECT_WIPE_DIR_UP
            • -
            • ELM_TRANSIT_EFFECT_WIPE_DIR_DOWN
            • -
            -
          • -
          - -

          The following example shows how to make an object disappear progressively from left to right:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_wipe_add(transit,
          -                            ELM_TRANSIT_EFFECT_TYPE_HIDE,
          -                            ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_go(transit);
          -
          - -

          Zoom Effect

          -

          Elm_Transit provides a zoom function.

          - -
          -elm_transit_effect_zoom_add(Elm_Transit *transit,
          -                            float from_rate,
          -                            float to_rate)
          -
          - -
            -
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • -
          • from_rate: The starting level of the zoom.
          • -
          • to_rate: The ending level of the zoom.
          • -
          - -

          The from_rate argument defines the scale of the target objects at the beginning of the animation. A value of 1 represents the initial scale of the objects.

          - -

          Setting the value of the to_rate argument to 2 will double the size of the target objects (double the width and double the height). When using this effect, the width and height of a target object will remain proportional to one another. If you want to customize the zoom effect, use the elm_transit_effect_resizing_add() function.

          - -

          The following example shows how to implement a zoom-out transition. At the end of the 2-secondstransition, the animated object will be half its original size.

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_zoom_add(transit, 1, 0.5);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_go(transit);
          -
          - -

          Resizing Effect

          - -

          The resizing effect allows you to design an interpolation of the width and height attributes of one or more target elements.

          - -
          -elm_transit_effect_resizing_add(Elm_Transit *transit,
          -                                Evas_Coord from_w,
          -                                Evas_Coord from_h,
          -                                Evas_Coord to_w,
          -                                Evas_Coord to_h)
          -
          - -
            -
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • -
          • from_w: The starting width.
          • -
          • from_h: The starting height.
          • -
          • to_w: The ending width.
          • -
          • to_h: The ending height.
          • -
          - -

          The from_w and from_h arguments define the size at the beginning of the animation. The to_w and to_h arguments define the size at the end.

          - - - - - - - - - - -
          Note
          If you are planning to use this method to hide an Evas object by setting one of the length attributes to zero, consider using the elm_transit_effect_wipe_add() function instead.
          - -

          The following example shows how to make a rectangle exchange its width and height properties in a 2-second transition:

          - -
          -Evas_Coord w, h;
          -evas_object_geometry_get(my_evas_object, NULL, NULL, &w, &h);
          -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, my_evas_object);
          -elm_transit_effect_resize_add(transit, // Transition object
          -                              w, h, // Original sizing
          -                              h, w); // Target sizing
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_go(transit);
          -
          - -

          Flip Effect

          -

          This transition combines the target Evas objects in pairs, so that one object will show up while the other one disappears. This association relates the even objects in the transit list of objects with the odd ones. The even objects are shown at the beginning of the animation, and the odd objects shown when the transition is complete. In other words, the effect applies to each pair of objects in the order in which they are listed in the transit list of objects.

          - -

          The flip effect itself is a pseudo-3D effect where the first object in the pair is the front object and the second one is the back object. When the transition launches, the front object rotates around a preferred axis in order to let the back object take its place.

          - -
          -elm_transit_effect_flip_add(Elm_Transit *transit,
          -                            Elm_Transit_Effect_Flip_Axis axis,
          -                            Eina_Bool cw)
          -
          - -

          The first argument is the transit object. The second argument is the preferred axis of rotation:

          -
            -
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_X
          • -
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_Y
          • -
          - -

          The third argument is the direction of the rotation:

          -
            -
          • EINA_TRUE is clockwise.
          • -
          • EINA_FALSE is counter-clockwise.
          • -
          - -

          The following example shows how to create a coin that flips indefinitely. Note that we use images as Elementary UI components for demonstration purposes. You can use the elm_transit_effect_image_animation_add() function if you do not want to bother creating UI components.

          - -
          -// Coin Heads
          -Evas_Object *coin_heads = elm_image_add(ad->win);
          -if (!elm_image_file_set(coin_heads, IMG_DIR"/coin_heads.png", NULL))
          -   printf("error: could not load image");
          -elm_win_resize_object_add(ad->win, coin_heads);
          -
          -// Coin Tails
          -Evas_Object *coin_tails = elm_image_add(ad->win);
          -if (!elm_image_file_set(coin_tails, IMG_DIR"/coin_tails.png", NULL))
          -   printf("error: could not load image");
          -elm_win_resize_object_add(ad->win, coin_tails);
          -
          -// Transition definition
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, coin_heads);
          -elm_transit_object_add(transit, coin_tails);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_auto_reverse_set(transit, EINA_TRUE);
          -elm_transit_repeat_times_set(transit, -1);
          -elm_transit_effect_flip_add(transit, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
          -elm_transit_go(transit);
          -
          - -

          Figure: Coin flip

          -

          Coin flip

          - -

          Resizable Flip Effect

          -

          In the flip example above, we used two objects that have the same size. However, you may sometimes want to flip from one object to another object with different size attributes. The most common example would be using buttons with dimensions that depend on their contents (such as labels). If you decide to use the classic elm_transit_effect_flip_add() function, the size of the object will change at the moment one object becomes completely hidden and the other one begins to show up. If you wish to interpolate the size attributes as well, use the elm_transit_effect_resizable_flip_add() function:

          - -
          -elm_transit_effect_resizable_flip_add(Elm_Transit *transit,
          -                                      Elm_Transit_Effect_Flip_Axis axis,
          -                                      Eina_Bool cw)
          -
          - -

          The first argument is the transit object. The second argument is the preferred axis of rotation:

          -
            -
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_X
          • -
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_Y
          • -
          - -

          The third argument is the direction of the rotation:

          -
            -
          • EINA_TRUE is clockwise.
          • -
          • EINA_FALSE is counter-clockwise.
          • -
          - -

          This function works the exact same way as the standard flip effect function.

          - -

          Fade Effect

          - -

          This effect is used to transition from one Evas object to another one using a fading effect: the first object will slowly disappear to let the second object take its place.

          - -
          elm_transit_effect_fade_add(Elm_Transit *transit)
          - -

          This effect is applied to each pair of objects in the order in which they are listed in the transit list of objects. The first object in the pair will be the before object and the second one will be the after object.

          - -

          Building on the coin flip example, the following example shows how to fade out one face of the coin while fading in the other face:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, coin_heads);
          -elm_transit_object_add(transit, coin_tails);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_effect_fade_add(transit);
          -elm_transit_go(transit);
          -
          - -

          If you simply want to hide an object with a fade transition, consider using a transparent after object.

          - -

          Blend Effect

          - -

          Another transition involving at least two Evas objects is the blend effect. This transition makes the before object blurry before the after object appears.

          - -
          elm_transit_effect_blend_add(Elm_Transit *transit)
          - -

          The argument is the transition target of the blend effect.

          - -

          Building on the coin flip example, the following example shows how to blur out one face of the coin while blurring in the other face:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, coin_heads);
          -elm_transit_object_add(transit, coin_tails);
          -elm_transit_duration_set(transit, 2.0);
          -elm_transit_effect_blend_add(transit);
          -elm_transit_go(transit);
          -
          - -

          If you simply want to hide an object with a blur transition, consider using a transparent after object.

          - -

          Combining Transitions

          - -

          To use multiple transitions at the same time on the same objects, simply declare the transitions one after the other.

          - -

          Building on the coin flip example, the following example shows how to roll the coin on the ground using a rotation and a translation effect:

          - -
          -Evas_Object *coin_heads = elm_image_add(ad->win);
          -if (!elm_image_file_set(coin_heads, IMG_DIR"/coin_heads.png", NULL))
          -   printf("error: could not load image");
          -evas_object_resize(coin_heads, 100, 100);
          -evas_object_show(coin_heads);
          -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_object_add(transit, coin_heads);
          -elm_transit_duration_set(transit, 5.0);
          -elm_transit_effect_translation_add(transit, 0, 0, 3.1415 * 2 * 100, 0);
          -elm_transit_effect_rotation_add(transit, 0, 360);
          -elm_transit_go(transit);
          -
          - -

          Animation Chain

          - -

          Now that we have listed all the effects that can be implemented using Elm_Transit, we will see how to chain transitions into sequences. To create complex, chained animations without worrying about synchronization between the transitions, use the elm_transit_chain_transit_add() function. This function takes as arguments two Elm_Transit objects and will automatically take care of the chaining for you: the second transition will start as soon as the first transition is finished.

          - -

          The following example shows how to move a datetime component on a square trajectory:

          - -
          -Evas_Object *dt = elm_datetime_add(ad->win);
          -evas_object_resize(dt, 350, 50);
          -evas_object_show(dt);
          -
          -// The first transition
          -Elm_Transit *t1 = elm_transit_add();
          -elm_transit_object_add(t1, dt);
          -elm_transit_duration_set(t1, 2);
          -elm_transit_effect_translation_add(t1, 0, 0, 100, 0);
          -
          -// The second transition
          -Elm_Transit *t2 = elm_transit_add();
          -elm_transit_object_add(t2, dt);
          -elm_transit_duration_set(t2, 2);
          -elm_transit_effect_translation_add(t2, 100, 0, 100, 100);
          -
          -// The third transition
          -Elm_Transit *t3 = elm_transit_add();
          -elm_transit_object_add(t3, dt);
          -elm_transit_duration_set(t3, 2);
          -elm_transit_effect_translation_add(t3, 100, 100, 0, 100);
          -
          -// The fourth transition
          -Elm_Transit *t4 = elm_transit_add();
          -elm_transit_object_add(t4, dt);
          -elm_transit_duration_set(t4, 2);
          -elm_transit_effect_translation_add(t4, 0, 100, 0, 0);
          -
          -// Chaining the transitions
          -elm_transit_chain_transit_add(t1, t2);
          -elm_transit_chain_transit_add(t2, t3);
          -elm_transit_chain_transit_add(t3, t4);
          -
          -// Starting the transitions
          -elm_transit_go(t1);
          -
          - -

          Note that we cannot use transition chaining to make a loop animation, since the transit object is automatically destroyed as soon as the transition completes. Therefore, you cannot do something like this:

          - -
          elm_transit_chain_transit_add(t4, t1);
          - -

          To create a looped animation chain, you have to use low-level components provided by the Ecore and Evas transition libraries, or you can use the elm_transit_del_cb_set() function to define a callback function for when a transition gets deleted. This way, you could recreate your objects and reiterate the transition chain as soon as the last transition ends.

          - -
          -elm_transit_del_cb_set(Elm_Transit *transit, Elm_Transit_Del_Cb cb, void *data)
          -
          - -

          The first argument is the transition object. The second argument is the callback function to run on transition delete. The third argument is the data to pass to the callback function.

          - -

          You can severe the chain relationship between two transits by using the elm_transit_chain_transit_del() function:

          - -
          elm_transit_chain_transit_del(Elm_Transit *transit, Elm_Transit *chain_transit)
          - -

          The first argument is the first transition in the chain. The second argument is the second transition in the chain.

          - -

          To get the current chain transit list, use the elm_transit_chain_transits_get() function.

          - -

          Animation Timeline

          - -

          After you have defined all the properties that define your transition, start the transition with the elm_transit_go() function:

          - -
          elm_transit_go(Elm_Transit *transit)
          - -

          You can maintain full control over the execution process even after the transition has started. You can pause the transition by setting the paused argument to EINA_TRUE:

          - -
          elm_transit_paused_set(Elm_Transit *transit, Eina_Bool paused)
          - -

          You can resume the transition by using the same method but setting the paused argument to EINA_FALSE. If you want to know whether the transition is currently paused, use the elm_transit_paused_get() function.

          - -

          You can remain informed about the present transition flow and get the current frame by using the elm_transit_progress_value_get() function. This function will return the timeline position of the animation, ranging between 0.0 (start) and 1.0 (end).

          - -

          Custom Transitions

          - -

          Elm_Transit provides a standard function for defining any effect of your choosing that will be applied to some context data:

          - -
          -elm_transit_effect_add(Elm_Transit *transit,
          -                       Elm_Transit_Effect_Transition_Cb transition_cb,
          -                       Elm_Transit_Effect *effect,
          -                       Elm_Transit_Effect_End_Cb end_cb)
          -
          - -

          The first argument is the transition target of the new effect. The second argument is the transition callback function. The third argument is the new effect. The fourth argument is the callback function to call at the end of the effect.

          - -

          As described earlier in this programming guide, this function embraces three callbacks that will allow you to define every aspects of your transition from its creation to its deletion. The following is an example of how to build a custom resizing animation.

          - -

          First, we define a structure capable of holding the context information about resizing an Evas object:

          - -
          -typedef struct
          -{
          -   struct _size
          -   {
          -      Evas_Coord w, h;
          -   }
          -   from, to;
          -}
          -Custom_Effect;
          -
          - -

          We can now implement our custom resizing callback function. This function takes the following arguments:

          - -
            -
          • The context data that holds the custom properties of our transition, which are used as parameters to calculate the interpolation.
          • -
          • The transit object that contains the list of our Evas objects to animate and all the information about duration, auto-reverse, looping, and so on.
          • -
          • The progress (position along the animation timeline) that ranges from 0.0 to 1.0 and allows us to calculate the desired interpolation for each frame.
          • -
          - -
          -static void
          -_custom_op(void *data, Elm_Transit *transit, double progress)
          -{
          -   if (!data) return;
          -   Evas_Coord w, h;
          -   Evas_Object *obj;
          -   const Eina_List *elist;
          -   Custom_Effect *custom_effect = data;
          -   const Eina_List *objs = elm_transit_objects_get(transit);
          -   if (progress < 0.5)
          -   {
          -      h = custom_effect->from.h + (custom_effect->to.h * progress * 2);
          -      w = custom_effect->from.w;
          -   }
          -   else
          -   {
          -      h = custom_effect->from.h + custom_effect->to.h;
          -      w = custom_effect->from.w + (custom_effect->to.w * (progress - 0.5) * 2);
          -   }
          -   EINA_LIST_FOREACH(objs, elist, obj)
          -      evas_object_resize(obj, w, h);
          -}
          -
          - -

          The callback function above resizes our Evas objects in two steps. During the first half of the transition, only the height changes, while the width remains the same. During the second half, it is the other way around until we get to the desired size.

          - -

          You must then define the context used by your animation:

          - -
          -static void*
          -_custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h)
          -{
          -   Custom_Effect *custom_effect;
          -
          -   custom_effect = calloc(1, sizeof(Custom_Effect));
          -   if (!custom_effect) return NULL;
          -
          -   custom_effect->from.w = from_w;
          -   custom_effect->from.h = from_h;
          -   custom_effect->to.w = to_w - from_w;
          -   custom_effect->to.h = to_h - from_h;
          -
          -   return custom_effect;
          -}
          -
          - -

          You must define the function that will take care of deleting all the context objects used by your custom transition and free up the allocated memory:

          - -
          -static void
          -_custom_context_free(void *data, Elm_Transit *transit __UNUSED__)
          -{
          -   free(data);
          -}
          -
          - -

          Finally, apply your custom transition to your Elm_Transit object:

          - -
          -Elm_Transit *transit = elm_transit_add();
          -elm_transit_effect_add(transit,
          -                       _custom_op,
          -                       _custom_context_new(),
          -                       _custom_context_free);
          -
          - -

          If you want to delete an effect from your effects list, use the elm_transit_effect_del() function.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/elementary_animation_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/elementary_animation_tutorial_n.htm deleted file mode 100755 index 5f21d4c..0000000 --- a/org.tizen.ui.guides/html/native/efl/elementary_animation_tutorial_n.htm +++ /dev/null @@ -1,628 +0,0 @@ - - - - - - - - - - - - - - Creating Elementary Animations - - - - - - -
          -

          Creating Elementary Animations

          - - -

          This tutorial demonstrates how you can use Elm Transit to create animated transitions effects, such as rotation, wiping, zooming, resizing, and fading, to an Evas_Object.

          - - -

          Setting Up the Application

          - -

          First create a basic application like explained in Creating Basic Mobile Interactions.

          - -

          When the application is ready, create Evas objects and animate them. In this example, one single object is animated with different type of animations.

          - -

          Create the structure of our application represented by a struct named appdata

          - -
          typedef struct appdata 
          -{
          -   Evas_Object *win;
          -   Evas_Object *label;
          -   Evas_Object *button;
          -   Evas_Object *buttonbck;
          -   Evas_Object *hbox;
          -   Evas_Object *left_vbox;
          -   Evas_Object *center_vbox;
          -   Evas_Object *right_vbox;
          -   float rt_angle, zto, zfrom;
          -} appdata_s;
          -
          - -

          This structure holds the main UI components of the application:

          - -
            -
          • win: the main window
          • -
          • label: the title label
          • -
          • button: a button object, the target of the animations
          • -
          • buttonbck: a button representing the back of the target button
          • -
          • left_vbox: a vertical box to place the first buttons column
          • -
          • center_vbox: a vertical box to store the second buttons column
          • -
          • right_vbox: a vertical box to store the last buttons column
          • -
          • hbox: a horizontal box to store the vertical boxes
          • -
          • rt_angle, zto, zfrom: these variables are used to store values for animations
          • -
          - -

          Place the UI components on the application's canvas. To make things easier, the UI component creation is split into two functions.

          - -

          The first function creates UI components on the main window, and the second in the boxes.

          - -
          create_base_gui(appdata_s *ad)
          -{
          -   ad->rt_angle = 360.0;
          -   ad->zfrom = 1.0;
          -   ad->zto = 2.0;
          -
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   if (elm_win_wm_rotation_supported_get(ad->win)) 
          -   {
          -      int rots[4] = { 0, 90, 180, 270 };
          -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -   }
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -
          -   // Label
          -   ad->label = elm_label_add(ad->win);
          -   elm_object_text_set(ad->label, "Effects Tutorial");
          -   evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->label);
          -   evas_object_show(ad->label);
          -
          -   // Show the window after the base GUI is set up
          -   evas_object_show(ad->win);
          -
          -   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
          -
          -   // Creation a button in the app window
          -   ad->button = elm_button_add(ad->win);
          -
          -   // Moving the button to x=50 y=100
          -   evas_object_move(ad->button, 50, 100);
          -
          -   // Resizing the button 100x50
          -   evas_object_resize(ad->button, 200, 50);
          -
          -   // Showing the button
          -   evas_object_show(ad->button);
          -
          -   // Creation a back button in the app window
          -   ad->buttonbck = elm_button_add(ad->win);
          -   elm_object_text_set(ad->buttonbck, "Button back");
          -   evas_object_move(ad->buttonbck, 50, 100);
          -   evas_object_resize(ad->buttonbck, 200, 50);
          -
          -   _create_btn_box(ad);
          -
          -} // End of create_base_gui
          -
          - -

          This function takes appdata_s *ad as its only parameter. This function is called by the creation callback app_create of the Tizen application (event_callback.create = app_create;) in the main function of the application.

          - -

          Set up the needed values like the rotation angle, the original zoom value (zfrom), and the destination zoom value (zto).

          - -
          ad->rt_angle = 360.0;
          -ad->zfrom = 1.0;
          -ad->zto = 2.0;
          -
          - -

          Create the main window with a title and add the delete callback:

          - -
          // Window
          -ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -if (elm_win_wm_rotation_supported_get(ad->win)) 
          -{
          -   int rots[4] = { 0, 90, 180, 270 };
          -   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -}
          -
          -evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -
          -// Label
          -ad->label = elm_label_add(ad->win);
          -elm_object_text_set(ad->label, "Effects Tutorial");
          -evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(ad->win, ad->label);
          -evas_object_show(ad->label);
          -
          -// Show the window after the base GUI is set up
          -evas_object_show(ad->win);
          -
          -ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
          -
          - -

          Next create the animation target button and the back button. Call the button box creation function with the application data as its parameter.

          - -
          _create_btn_box(ad);
          -
          - -

          Add a set of buttons to this box that starts animations on the animation target.

          - -

          Create the structure of the buttons box with three columns (vertical boxes) and one horizontal for the main container.

          - -
          // Creation of the main container box
          -ad->hbox = elm_box_add(ad->win);
          -elm_box_horizontal_set(ad->hbox, EINA_TRUE);
          -elm_box_homogeneous_set(ad->hbox, EINA_TRUE);
          -evas_object_move(ad->hbox, 10, 500);
          -evas_object_show(ad->hbox);
          -
          -// Creation of the first column
          -ad->left_vbox = elm_box_add(ad->hbox);
          -elm_box_horizontal_set(ad->left_vbox, EINA_FALSE);
          -elm_box_homogeneous_set(ad->left_vbox, EINA_TRUE);
          -evas_object_show(ad->left_vbox);
          -elm_box_pack_start(ad->hbox, ad->left_vbox);
          -
          -// Creation of the second column
          -ad->center_vbox = elm_box_add(ad->hbox);
          -elm_box_horizontal_set(ad->center_vbox, EINA_FALSE);
          -elm_box_homogeneous_set(ad->center_vbox, EINA_TRUE);
          -evas_object_show(ad->center_vbox);
          -elm_box_pack_end(ad->hbox, ad->center_vbox);
          -
          -// Creation of the last column
          -ad->right_vbox = elm_box_add(ad->hbox);
          -elm_box_horizontal_set(ad->right_vbox, EINA_FALSE);
          -elm_box_homogeneous_set(ad->right_vbox, EINA_TRUE);
          -evas_object_show(ad->right_vbox);
          -elm_box_pack_end(ad->hbox, ad->right_vbox);
          -
          - -

          Then create the first action button for the resize effect.

          - -
          // Button creation
          -btn_resize = elm_button_add(ad->win);
          -// Setting the button text
          -elm_object_text_set(btn_resize, "Resize");
          -// Setting the hint weight policy
          -evas_object_size_hint_weight_set(btn_resize, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -// Showing the button
          -evas_object_show(btn_resize);
          -// Setting the "clicked" callback
          -evas_object_smart_callback_add(btn_resize, "clicked", _btn_resize_cb, ad);
          -// Adding the button to the first column
          -elm_box_pack_end(ad->left_vbox, btn_resize);
          -
          - -

          evas_object_smart_callback_add defines the callback function that is to be called when the button is clicked. In this example, set a _btn_resize_cb function and pass the application data ad to this callback function.

          - -

          The callback by itself only sets a new text for the animation target button, and calls a function which will actually animate the button.

          - -
          static void _btn_resize_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Starting the rotation effect 360 degrees
          -   // evas_object_resize(ad->button, 100, 50);
          -   elm_object_text_set(ad->button, "Resize");
          -   _resize_effect(ad->button);
          -
          -}
          -
          - -

          This function is an evas_object_smart_callback and thus needs to have its specific prototype: it does not return anything and receives three parameters:

          - -
            -
          • data: data to be passed
          • -
          • btn: the object the callback is being called about
          • -
          • ev: the actual event, seldom used
          • -
          - -

          In this case, use data to pass the application data to the callback. However, the parameter's type is void * and not appdata_s *. Initialize a variable of the correct type with the pointer.

          -
          appdata_s *ad = data;
          -
          - -

          Then use the application data in the callback function. At this point create the animation directly in the callback function, but it is more straightforward to encapsulate the animation process into a dedicated function. _resize_effect implements the animation code:

          - -
          static void _resize_effect(Evas_Object *obj)
          -{
          -   // Elementary Transition declaration and creation
          -   Elm_Transit *trans = elm_transit_add();
          -
          -   // Adding the transition target object
          -   elm_transit_object_add(trans, obj);
          -
          -   // Setting the resize effect
          -   elm_transit_effect_resizing_add(trans, 100, 50, 300, 150);
          -
          -   // Setting the transition duration
          -   elm_transit_duration_set(trans, 3.0);
          -
          -   // Starting the transition
          -   elm_transit_go(trans);
          -}
          -
          - -

          Create an Elm_Transit * object representing the transition.

          - -
          Elm_Transit *trans = elm_transit_add();
          -
          - -

          Then add the target object to the transition

          - -
          elm_transit_object_add(trans, obj);
          -
          - -

          Add a resizing transition to the object with the origin and destination width and height in pixels.

          - -
          elm_transit_effect_resizing_add(trans, 100, 50, 300, 150);
          -
          -

          100 and 50 are respectively the object's width and height when the effect begins, whereas 300 and 150 are respectively the object's width and height when the effect ends: the object grows from 100×50 to 300×150.

          - -

          After that set the transition duration with elm_transit_duration_set.

          -
          elm_transit_duration_set(trans, 3.0);
          -
          - -

          The animation lasts three seconds. The duration parameter is a double.

          - -

          Now start the animation by calling elm_transit_go with the Elm_Transit object.

          - -
          elm_transit_go(trans);
          -
          - -

          When the resize button is clicked, the animation target button grows.

          - -

          All the action buttons are created exactly the same way as the resize button, with a callback and an animation function.

          - -

          Creating a Rotation Effect

          - -

          This effect rotates the animation target button with an angle of 360°. This angle is stored in the application data as ad->rt_angle.

          - -

          Create the button and add it to the center column in the _create_btn_box function.

          - -
          // The rotation button
          -btn_rotate = elm_button_add(ad->win);
          -elm_object_text_set(btn_rotate, "Rotate");
          -evas_object_size_hint_weight_set(btn_rotate, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_rotate);
          -evas_object_smart_callback_add(btn_rotate, "clicked", _btn_rotate_cb, ad);
          -elm_box_pack_end(ad->center_vbox, btn_rotate);
          -
          - -

          In the rotate button callback, call the effect function with the target button as first parameter and the rotation angle as the second one.

          - -
          static void _btn_rotate_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Rotate");
          -   _rotation_effect(ad->button, ad->rt_angle);
          -}
          -
          - -

          The animation function rotates the animation target by adding a rotation effect with elm_transit_effect_rotation_add. This function takes three parameters:

          - -
            -
          • Elm_Transit
          • -
          • the rotation position at which the effect begins
          • -
          • the rotation position at which the effect ends
          • -
          - -

          Rotation starts at 0° to finish at 360°. The animation lasts two seconds.

          - -
          static void _rotation_effect(Evas_Object *obj, float angle)
          -{
          -   Elm_Transit *trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -
          -   // Rotates the object from its original angle to given degrees to the right
          -   elm_transit_effect_rotation_add(trans, 0.0, angle);
          -   elm_transit_duration_set(trans, 2.0);
          -   elm_transit_go(trans);
          -}
          -
          - -

          Creating a Zoom Effect

          - -

          The zoom effect zooms on the animation target to make it twice bigger. Store the source rate and the destination rate in the application data using ad->zfrom and ad->zto.

          -

          Create the button and add it to the center column in the _create_btn_box function.

          - -
          // The zoom button
          -btn_zoom = elm_button_add(ad->win);
          -elm_object_text_set(btn_zoom, "Zoom");
          -evas_object_size_hint_weight_set(btn_zoom, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_zoom);
          -evas_object_smart_callback_add(btn_zoom, "clicked", _btn_zoom_cb, ad);
          -elm_box_pack_end(ad->right_vbox, btn_zoom);
          -
          - -

          Then add a callback function in order to perform the animation.

          - -
          static void _btn_zoom_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Starting the rotation effect 360 degrees
          -   // evas_object_resize(ad->button, 100, 50);
          -   elm_object_text_set(ad->button, "Zoom");
          -   _zoom_effect(ad->button, ad->zfrom, ad->zto);
          -}
          -
          - -

          To create the zoom effect, use elm_transit_effect_zoom_add with the start rate and the destination rate stored in application data (ad->zfrom and ad->zto)

          - -
          static void _zoom_effect(Evas_Object *obj, float from, float to)
          -{
          -   Elm_Transit *trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -
          -   elm_transit_effect_zoom_add(trans, from, to);
          -   elm_transit_duration_set(trans, 2.0);
          -   elm_transit_go(trans);
          -}
          -
          - - -

          Creating a Flip Effect

          - -

          This effect is applied to a pair of objects, in the order they are added, to the Elm_Transit transition. In this example, add the animation target button and the button called buttonbck which represents the back of the target button.

          - -

          Create the action button for the flip effect:

          - -
          // The flip button
          -btn_flip = elm_button_add(ad->win);
          -elm_object_text_set(btn_flip, "Flip x");
          -evas_object_size_hint_weight_set(btn_flip, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_flip);
          -evas_object_smart_callback_add(btn_flip, "clicked", _btn_flip_cb, ad);
          -elm_box_pack_end(ad->left_vbox, btn_flip);
          -
          - -

          The corresponding callback to create and start the animation with the two objects (target button and back button) to animate is like follows.

          - -
          static void _btn_flip_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Flip");
          -   _flip_effect(ad->button, ad->buttonbck);
          -}
          -
          - -

          Create the function which runs the animation. This flip animation is created using elm_transit_effect_flip_add. The second parameter is the axis of the flip: in this example it is the X axis, so the button flips down to top to show the back button. The last parameter is the flip direction: EINA_TRUE means clockwise.

          - -
          static void _flip_effect(Evas_Object *obj, Evas_Object *obj2)
          -{
          -   Elm_Transit *trans;
          -
          -   trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -   elm_transit_object_add(trans, obj2);
          -   elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
          -
          -   elm_transit_duration_set(trans, 3.0);
          -   elm_transit_go(trans);
          -}
          -
          - -

          Creating a Blend Transition

          - -

          The blend effect also works the same way as the flip, but without the axes or direction information. Use the back button here as well. To create the blend effect button:

          - -
          // The blend button
          -btn_blend = elm_button_add(ad->win);
          -elm_object_text_set(btn_blend, "Blend");
          -evas_object_size_hint_weight_set(btn_blend, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_blend);
          -evas_object_smart_callback_add(btn_blend, "clicked", _btn_blend_cb, ad);
          -elm_box_pack_end(ad->center_vbox, btn_blend);
          -
          - -

          The blend transition callback is:

          - -
          static void _btn_blend_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Blend");
          -   _blend_effect(ad->button, ad->buttonbck);
          -}
          -
          - -

          Create and start the blend animation. This animation is created by adding it to and Elm_Transit with elm_transit_effect_blend_add. Add two objects, as for the flip.

          - -
          static void _blend_effect(Evas_Object *obj, Evas_Object *obj2)
          -{
          -   Elm_Transit *trans;
          -
          -   trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -   elm_transit_object_add(trans, obj2);
          -   elm_transit_effect_blend_add(trans);
          -   elm_transit_duration_set(trans, 3.0);
          -   elm_transit_go(trans);
          -}
          -
          - -

          Creating a Fade Effect

          - -

          The fade effect works exactly the same way as the blend effect. First create the button:

          - -
          // The fade button
          -btn_fade = elm_button_add(ad->win);
          -elm_object_text_set(btn_fade, "Fade");
          -evas_object_size_hint_weight_set(btn_fade, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_fade);
          -evas_object_smart_callback_add(btn_fade, "clicked", _btn_fade_cb, ad);
          -elm_box_pack_end(ad->right_vbox, btn_fade);
          -
          - -

          Then add the button's callback:

          - -
          static void _btn_fade_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Fade");
          -   _fade_effect(ad->button, ad->buttonbck);
          -}
          -
          - -

          The animation function calls elm_transit_effect_fade_add instead of elm_transit_effect_blend_add.

          - -
          static void _fade_effect(Evas_Object *obj, Evas_Object *obj2)
          -{
          -   Elm_Transit *trans;
          -
          -   trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -   elm_transit_object_add(trans, obj2);
          -   elm_transit_effect_fade_add(trans);
          -   elm_transit_duration_set(trans, 3.0);
          -   elm_transit_go(trans);
          -}
          -
          - -

          Creating a Flip on y Axis

          - -

          This is same as the flip transition, but on y axis. To create a flip on y axis:

          - -
          // The flip y button
          -btn_flip_y = elm_button_add(ad->win);
          -elm_object_text_set(btn_flip_y, "Flip y");
          -evas_object_size_hint_weight_set(btn_flip_y, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_flip_y);
          -evas_object_smart_callback_add(btn_flip_y, "clicked", _btn_flip_y_cb, ad);
          -elm_box_pack_end(ad->left_vbox, btn_flip_y);
          -
          -static void _btn_flip_y_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Flip 2");
          -   _flip_y_effect(ad->button, ad->buttonbck);
          -}
          -
          -static void _flip_y_effect(Evas_Object *obj, Evas_Object *obj2)
          -{
          -   Elm_Transit *trans;
          -
          -   trans = elm_transit_add();
          -   elm_transit_object_add(trans, obj);
          -   elm_transit_object_add(trans, obj2);
          -   elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, EINA_TRUE);
          -   elm_transit_duration_set(trans, 3.0);
          -   elm_transit_go(trans);
          -}
          -
          - -

          Creating a Wipe Effect

          - -

          The wipe transition is applied on an Evas object considering the wipe type and the direction. Use ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE to hide the button, and ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT to do it from left to right.

          - -

          The wipe animation button is as follows:

          - -
          // The wipe button
          -btn_wipe = elm_button_add(ad->win);
          -elm_object_text_set(btn_wipe, "Wipe");
          -evas_object_size_hint_weight_set(btn_wipe, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(btn_wipe);
          -evas_object_smart_callback_add(btn_wipe, "clicked", _btn_wipe_cb, ad);
          -elm_box_pack_end(ad->right_vbox, btn_wipe);
          -
          - -

          The wipe button callback looks like:

          - -
          static void _btn_wipe_cb(void *data, Evas_Object *btn, void *ev)
          -{
          -   appdata_s *ad = data;
          -
          -   // Starting the rotation effect 360 degrees
          -   // evas_object_resize(ad->button, 100, 50);
          -   // Setting the button text
          -   elm_object_text_set(ad->button, "Wipe");
          -   _wipe_effect(ad->button);
          -}
          -
          - -

          The animation function calls elm_transit_effect_wipe_add with ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE as the second parameter to hide the button and ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT as last parameter to set the direction (left to right).

          - -
          static void _wipe_effect(Evas_Object *obj)
          -{
          -    Elm_Transit *trans;
          -
          -    trans = elm_transit_add();
          -    elm_transit_object_add(trans, obj);
          -    elm_transit_effect_wipe_add(trans, ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE, ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
          -    elm_transit_duration_set(trans, 3.0);
          -    elm_transit_go(trans);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/elementary_transit_effect_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/elementary_transit_effect_tutorial_n.htm deleted file mode 100755 index a4e7e9a..0000000 --- a/org.tizen.ui.guides/html/native/efl/elementary_transit_effect_tutorial_n.htm +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - Creating Elementary Transit Effects - - - - - - -
          -

          Creating Elementary Transit Effects

          - -

          This tutorial demonstrates how you can implement a variety of EFL animation effects using the APIs available in the EFL library.

          - -

          Initializing the Application Layout

          - -

          The application uses UI components, such as elm_conformant and elm_naviframe for view management, layout classes, such as elm_list for the composition of the screen, and UI components, such as elm_button and elm_image for the content inside the view.

          -

          The transit is designed to apply various animated transition effects to the Evas_Object. The following transition effects are supported in the Tizen native applications:

          -
            -
          • Blend
          • -
          • Color
          • -
          • Fade
          • -
          • Flip
          • -
          • Rotation
          • -
          • Transition
          • -
          • Wipe
          • -
          • Zoom
          • -
          - -

          The application layout is created by the create_base_gui() function. First, a window is created and the elm_conformant component is added to it to decorate the window with an indicator. It then adds the elm_naviframe component, which acts as a view manager for the window and provides the window title functionality.

          -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   if (elm_win_wm_rotation_supported_get(ad->win)) 
          -   {
          -      int rots[4] = { 0, 90, 180, 270 };
          -      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          -   }
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -
          -   // Naviframe
          -   ad->nf = create_main_view(ad);
          -   elm_object_content_set(ad->conform, ad->nf);
          -
          -   // Show window after the base GUI is set up
          -   evas_object_show(ad->win);
          -
          -   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
          -}
          -
          - -

          The create_main_view() function creates the main content. It consists of a naviframe containing a list. This function returns a list of naviframe object pointers for the content set.

          -
          -static Evas_Object*
          -create_main_view(appdata_s *ad)
          -{
          -   Elm_Object_Item *nf_it;
          -   Evas_Object *navi, *list;
          -
          -   navi = elm_naviframe_add(ad->conform);
          -
          -   list = elm_list_add(navi);
          -   elm_list_mode_set(list, ELM_LIST_COMPRESS);
          -
          -   elm_list_item_append(list, "Blend", NULL, NULL, blend_cb, navi);
          -   elm_list_item_append(list, "Color", NULL, NULL, color_cb, navi
          -   elm_list_item_append(list, "Fade", NULL, NULL, fade_cb, navi);
          -   elm_list_item_append(list, "Flip", NULL, NULL, flip_cb, navi);
          -   elm_list_item_append(list, "Rotation", NULL, NULL, rotation_cb, navi);
          -   elm_list_item_append(list, "ResizableFlip", NULL, NULL, resizable_flip_cb, navi);
          -   elm_list_item_append(list, "Translation", NULL, NULL, translation_cb, navi);
          -   elm_list_item_append(list, "Wipe", NULL, NULL, wipe_cb, navi);
          -   elm_list_item_append(list, "Zoom", NULL, NULL, zoom_cb, navi);
          -   elm_list_item_append(list, "Custom", NULL, NULL, custom_cb, navi);
          -   elm_list_go(list);
          -
          -   nf_it = elm_naviframe_item_push(navi, "Transit", NULL, NULL, list, NULL);
          -
          -   return navi;
          -}
          -
          - -

          This document describes only the rotation and zoom implementations. For more information about other effects, see the transit.c file and the elm_transit document. The following figure illustrates the rotation and zoom effects.

          - -

          Figure: Rotation and zoom

          -

          Rotation and zoom

          - -

          Implementing the Rotation Effect

          - -

          If the list item named by rotation includes the touch event, the callback function for this event is called.

          -

          The data is sent as an Evas_Object. This implements the animation effect.

          -

          To implement the rotation effect:

          -
            -
          1. Use the elm_transit object with the elm_transit_add() function to add the transit effect.
          2. -
          3. Set the transit rotation amount and duration.
          4. -
          5. To start the transit animation, use the elm_transit_go() function.
          6. -
          -
          -static void
          -rotation_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   Evas_Object *layout = (Evas_Object *) data;
          -   Elm_Transit *transit = elm_transit_add();
          -
          -   // 360 degree rotation effect in the clock-wise direction
          -   elm_transit_object_add(transit, layout);
          -   elm_transit_effect_rotation_add(transit, 0, 360);
          -   elm_transit_duration_set(transit, 1);
          -   elm_transit_del_cb_set(transit, transit_del_cb, NULL);
          -   elm_transit_go(transit);
          -}
          -
          - -

          Implementing the Zoom Effect

          - -

          If the list item named by zoom includes the touch event, the callback function for this event is called.

          -

          The data is sent as an Evas_Object. This implements the animation effect.

          -

          There are 2 transit functions: one is for the zoom effect and the other is for returning to the original effect:

          -
            -
          1. After adding the transit object, add an evas_object to get the effect.
          2. -
          3. Set the zoom from the original size (1.0) to 0.4 times the original size, and set the duration.
          4. -
          5. Similarly, set the zoom size (0.4) back to the original size (1.0), and set the duration.
          6. -
          7. Set both of effects to be applied in sequence.
          8. -
          -
          -static void
          -zoom_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   Evas_Object *layout = (Evas_Object *) data;
          -   // Zoom out to scale 0.6
          -   Elm_Transit *transit = elm_transit_add();
          -   elm_transit_smooth_set(transit, EINA_FALSE);
          -   elm_transit_object_add(transit, layout);
          -   elm_transit_effect_zoom_add(transit, 1.0, 0.4);
          -   elm_transit_duration_set(transit, 0.5);
          -
          -   // Zoom in to the original size
          -   Elm_Transit *transit2 = elm_transit_add();
          -   elm_transit_smooth_set(transit2, EINA_FALSE);
          -   elm_transit_object_add(transit2, layout);
          -   elm_transit_effect_zoom_add(transit2, 0.4, 1.0);
          -   elm_transit_duration_set(transit2, 0.5);
          -   elm_transit_del_cb_set(transit2, transit_del_cb, NULL);
          -
          -   elm_transit_chain_transit_add(transit, transit2);
          -   elm_transit_go(transit);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/evas_advanced_objects_n.htm b/org.tizen.ui.guides/html/native/efl/evas_advanced_objects_n.htm deleted file mode 100755 index fd8c475..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_advanced_objects_n.htm +++ /dev/null @@ -1,379 +0,0 @@ - - - - - - - - - - - - - - Advanced Manipulation of Evas Objects - - - - - - -
          -

          Advanced Manipulation of Evas Objects

          - - -

          This tutorial demonstrates how you can use Evas object extra functions.

          - -

          This tutorial shows how to create an application that enables scaling of an Evas text object by clicking buttons. Data setter and getter functions are used to pass the scalable object through the clicked button object to a callback.

          -

          The tutorial also shows how to change the Evas object rendering mode using the extra object manipulation API.

          - -

          Figure: Advanced Evas application

          -

          Advanced Evas application

          - - -

          Creating the Basic Application

          -

          To create the basic application:

          -
            -
          1. -

            To use the required APIs, include the following libraries:

            - -
            #include <app.h>
            -#include <Elementary.h>
            -#include <system_settings.h>
            -#include <efl_extension.h>
            -
          2. - -
          3. -

            Create objects for an Elementary window and buttons for scaling and changing the object render mode. Also create a text object and 2 rectangle objects to connect to the application data structure:

            - -
            typedef struct appdata 
            -{
            -   Evas_Object *win;
            -   Evas_Object *scale_incr_button;
            -   Evas_Object *scale_decr_button;
            -
            -   Evas_Object *render_text;
            -   Evas_Object *blend_mode_button;
            -   Evas_Object *copy_mode_button;
            -   Evas_Object *render_rect1;
            -   Evas_Object *render_rect2;
            -} 
            -appdata_s;
            -
          4. -
          - -

          Creating the Elementary Window

          -

          To create an elementary window:

          -
            -
          1. -

            Use the elm_win_util_standard_add() function and give there the name and title of the application. To set a callback for the Back hardware button, use the eext_object_event_callback_add() function. To display the Evas object, use the evas_object_show() function.

            - -
            static void
            -create_base_gui(appdata_s *ad)
            -{
            -   // Window
            -   ad->win = elm_win_util_standard_add("Extra object function", "Extra object function");
            -   elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -   // Window callbacks
            -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, back_cb, ad);
            -
            -   // Show the window
            -   evas_object_show(ad->win);
            -}
            -
          2. - -
          3. - -

            Implement callback functions to enable closing the application:

            - -
            static void
            -back_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -
            -   elm_win_lower(ad->win);
            -}
            -
            -static void
            -win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   ui_app_exit();
            -}
            -
          4. -
          - -

          Creating an Application

          -

          Create an Elementary application with a GUI:

          - -
          static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -
          -   // Create the application UI
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          -
          -int
          -main(int argc, char *argv[])
          -{
          -   appdata_s ad = {0,};
          -
          -   ui_app_lifecycle_callback_s event_callback = {0,};
          -
          -   event_callback.create = app_create;
          -
          -   // Run the main loop
          -   return ui_app_main(argc, argv, &event_callback, &ad);
          -}
          - -

          Creating Buttons

          -

          To create buttons:

          -
            -
          1. -

            Create the scale buttons. The move() and resize() functions configure the buttons' custom geometry.

            - -
            // Scale increasing button
            -ad->scale_incr_button = elm_button_add(ad->win);
            -elm_object_text_set(ad->scale_incr_button, "Scale +");
            -evas_object_resize(ad->scale_incr_button, 120, 50);
            -evas_object_move(ad->scale_incr_button, 180, 20);
            -evas_object_show(ad->scale_incr_button);
            -
            -// Scale decreasing button
            -ad->scale_decr_button = elm_button_add(ad->win);
            -elm_object_text_set(ad->scale_decr_button, "Scale -");
            -evas_object_resize(ad->scale_decr_button, 120, 50);
            -evas_object_move(ad->scale_decr_button, 180, 170);
            -evas_object_show(ad->scale_decr_button);
            -
          2. - -
          3. -

            Create the render mode change buttons:

            - -
            // Blend render mode button
            -ad->blend_mode_button = elm_button_add(ad->win);
            -elm_object_text_set(ad->blend_mode_button, "BLEND Mode");
            -evas_object_resize(ad->blend_mode_button, 190, 50);
            -evas_object_move(ad->blend_mode_button, 30, 280);
            -evas_object_show(ad->blend_mode_button);
            -
            -// Copy render mode button
            -ad->copy_mode_button = elm_button_add(ad->win);
            -elm_object_text_set(ad->copy_mode_button, "COPY Mode");
            -evas_object_resize(ad->copy_mode_button, 190, 50);
            -evas_object_move(ad->copy_mode_button, 260, 280);
            -evas_object_show(ad->copy_mode_button);
            -
          4. -
          - -

          Creating Callbacks for the Button Click Signal

          -

          To create the callbacks:

          -
            -
          1. -

            Create callbacks:

            - -
            -evas_object_smart_callback_add(ad->scale_incr_button, "clicked", scale_incr_cb, NULL);
            -evas_object_smart_callback_add(ad->scale_decr_button, "clicked", scale_decr_cb, NULL);
            -evas_object_smart_callback_add(ad->blend_mode_button, "clicked", blend_mode_cb, ad);
            -evas_object_smart_callback_add(ad->copy_mode_button, "clicked", copy_mode_cb, ad);
            -
          2. - -
          3. -

            Implement callback functions to enable changing the scale and render mode:

            - -
            static void
            -scale_incr_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
            -   if (!evas_text)
            -      return;
            -
            -   double current_scale = evas_object_scale_get(evas_text);
            -
            -   if (current_scale >= 5.0)
            -      return;
            -
            -   evas_object_scale_set(evas_text, current_scale + 0.2);
            -}
            -
            -static void
            -scale_decr_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
            -   if (!evas_text)
            -      return;
            -
            -   double current_scale = evas_object_scale_get(evas_text);
            -
            -   if (current_scale <= 0.0)
            -   {
            -      return;
            -   }
            -
            -   evas_object_scale_set(evas_text, current_scale - 0.2);
            -}
            -
            -static void
            -blend_mode_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -
            -   evas_object_text_text_set(ad->render_text, "EVAS_RENDER_BLEND: d = d * (1-sa) + s");
            -   evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_BLEND);
            -}
            -
            -static void
            -copy_mode_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -
            -   evas_object_text_text_set(ad->render_text, "EVAS_RENDER_COPY: d = s");
            -   evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_COPY);
            -}
            -
          4. -
          - -

          Attaching Data to the Object

          -

          To attach data to the object:

          -
            -
          1. -

            Use the evas_object_data_set() function. To create the keyword to get the data, use the evas_object_data_get() function.

            - -

            Create the text object using the evas_object_text_add() function.

            - -
            -evas = evas_object_evas_get(ad->win);
            -
          2. - -
          3. -

            Create the Evas text object to be used as data attached to the button:

            - -
            -evas_text = evas_object_text_add(evas);
            -evas_object_text_text_set(evas_text, "Scalable Text Object");
            -evas_object_text_font_set(evas_text, "Sans", 10);
            -evas_object_color_set(evas_text, 50, 100, 200, 255);
            -evas_object_move(evas_text, 10, 90);
            -evas_object_show(evas_text);
            -
          4. -
          - -

          Attaching Data

          - -

          The data is passed to the function through buttons. Use the evas_object_data_set() function for the button. Give a pointer to the attach data, and the key name to associate it with the data.

          - -
          -evas_object_data_set(ad->scale_incr_button, "evas_text", evas_text);
          -evas_object_data_set(ad->scale_decr_button, "evas_text", evas_text);
          - -

          Getting data

          - -

          To get the file data attached to the object, use the evas_object_data_get() function and give the data key name added when you attached this data:

          - -
          Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
          - -

          Deleting data

          - -

          To delete the data attached to the object, use the evas_object_data_del() function and give the data key name added when you attached this data:

          - -
          evas_object_data_del(obj, "evas_text");
          - -

          Using Scale Functions

          - -

          To set the scale factor to a single Evas object instead of setting scale to the entire application, use the evas_object_scale_set() function. This is useful when you want scalable UI elements at runtime. However, only text and textblock objects have scaling change handlers. Other objects do not change visually on this call. In this application, the scale is defined in the button click callbacks.

          - -
          double current_scale = evas_object_scale_get(evas_text);
          -
          -if (current_scale >= 5.0)
          -   return;
          -
          -evas_object_scale_set(evas_text, current_scale + 0.2);
          - -

          Get the current scale of the Evas text object and check its maximum size. If the current size is smaller than the maximum size, the scale factor for the object is increased using the evas_object_scale_set function. The text object is updated on display and its size changes.

          - -

          Configuring the Evas Object Render Mode

          - -

          To change the render operation to be used for rendering the Evas object, use the evas_object_render_op_set() function. To get the current render operation, use the evas_object_render_op_get() function.

          - -

          Creating Rectangle Objects

          - -

          Creates Evas rectangle objects to change the Evas rendering mode for them:

          - -
          // Rectangle with yellow background
          -ad->render_rect1 = evas_object_rectangle_add(evas);
          -evas_object_color_set(ad->render_rect1, 240, 220, 50, 191);
          -evas_object_resize(ad->render_rect1, 260, 260);
          -evas_object_move(ad->render_rect1, 60, 400);
          -evas_object_show(ad->render_rect1);
          -
          -// Translucent rectangle with blue foreground
          -ad->render_rect2 = evas_object_rectangle_add(evas);
          -evas_object_color_set(ad->render_rect2, 25, 110, 220, 127);
          -evas_object_resize(ad->render_rect2, 260, 260);
          -evas_object_move(ad->render_rect2, 170, 500);
          -evas_object_show(ad->render_rect2);
          - -

          Changing the Render Operation

          - -

          To change the rendering mode, use the evas_object_render_op_set() function and give the render operation constant, which informs Evas of the function to use when drawing the eEvas object on canvas. By default, all evas objects use the EVAS_RENDER_BLEND mode and all colors are drawn using the "d = d*(1-sa) + s" formula, where "d" is destination color, "sa" is source alpha, and "s" is source color.

          - -

          Change the rendering mode to copy mode (d = s):

          - -
          evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_COPY);
          - - - - - - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/evas_basic_objects_n.htm b/org.tizen.ui.guides/html/native/efl/evas_basic_objects_n.htm deleted file mode 100755 index 80d5933..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_basic_objects_n.htm +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - - - - - - - - Basic Manipulation of Evas Objects - - - - - - -
          -

          Basic Manipulation of Evas Objects

          - - -

          Most Evas objects can be manipulated using generic functions.

          - -

          The list of available basic actions does not depend on the object's type. Evas implements functionality that allows performing basic manipulation, such as showing, hiding, setting, and getting geometry, bringing a layer up or down, managing color, clipping, and reference counting.

          - -

          This tutorial introduces the basic manipulations available for Evas_Object object.

          - - -

          Working with Evas

          - -
            -
          1. -

            To start interacting with Evas, first create an Evas instance or get a reference to an already allocated Evas object:

            - -
            ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            -elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -Evas *evas = evas_object_evas_get(ad->win);
            -
          2. - -
          3. -

            When an instance of Evas object exists, you can start creating basic Evas objects using obtained reference to Evas as a parent for child objects. The following example creates an Evas_Object with size 480x800, position on window at 0,0 by x and y axis, and set as a background:

            - -
            -ad->bg = evas_object_rectangle_add(evas);
            -evas_object_color_set(ad->bg, 255, 255, 255, 255);
            -evas_object_resize(ad->bg, 480, 800);
            -evas_object_move(ad->bg, 0, 0);
            -evas_object_show(ad->bg);
            -
            - -

            Figure: Empty window

            -

            Empty window

            - -
          4. -
          - - -

          Clipping an Object

          - -

          You can set an Evas object as a clipper for another Evas object. To obtain a clipper object, create an Evas object, set its width and height parameters, and call the evas_object_clip_set() function to set the object as a clipper for other Evas objects:

          - -
          ad->img = evas_object_image_filled_add(evas);
          -_app_get_resource("images/enlightenment.png", image_path, PATH_MAX);
          -evas_object_image_file_set(ad->img, image_path, NULL);
          -if (evas_object_image_load_error_get(ad->img) != EVAS_LOAD_ERROR_NONE)
          -   return;
          -
          -evas_object_geometry_get(ad->spacer, NULL, NULL, &w, &h);
          -evas_object_name_set(ad->img, "background");
          -evas_object_resize(ad->img, WIDTH, HEIGHT);
          -evas_object_move(ad->img, w, h);
          -evas_object_show(ad->img);
          -
          -ad->clipper = evas_object_rectangle_add(evas);
          -evas_object_geometry_get(ad->img, &x, &y, &w, &h);
          -evas_object_move(ad->clipper, WIDTH / 4 + x, HEIGHT / 4 + y);
          -evas_object_resize(ad->clipper, w / 2, h / 2);
          -evas_object_clip_set(ad->img, ad->clipper);
          -evas_object_show(ad->clipper);
          -
          - -

          Figure: Using the clipper

          -

          Using the clipper

          - - -

          You can also unset the clipper object using the evas_object_clip_unset() function. As a result, there are 2 objects, an image and a rectangle. The rectangle is on top of the image object according to the creation order.

          - -
          static void
          -_clipper_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   const char *object_name = evas_object_name_get(ad->img);
          -   if (strcmp(object_name, "background") != 0)
          -      return;
          -
          -   if (evas_object_clip_get(ad->img) == ad->clipper)
          -      evas_object_clip_unset(ad->img);
          -   else
          -      evas_object_clip_set(ad->img, ad->clipper);
          -}
          - -

          Figure: Using the clipper

          -

          Using the clipper

          - -

          Changing Colors and Visibility

          - -

          You can manage the object colors and visibility. To change a color of a valid Evas_Object, use the evas_object_color_set() and pass a color value:

          - -
          static void
          -_color_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   int alpha, r, g, b;
          -
          -   evas_object_color_get(ad->clipper, &r, &g, &b, &alpha);
          -   evas_color_argb_unpremul(alpha, &r, &g, &b);
          -
          -   if (g > 0)
          -      g = b = 0;
          -   else
          -      g = b = 255;
          -
          -   evas_color_argb_premul(alpha, &r, &g, &b);
          -   evas_object_color_set(ad->clipper, r, g, b, alpha);
          -}
          - -

          Figure: Applying color

          -

          Applying color

          - -

          You can also change the opacity of the object:

          - -
          static void
          -_opacity_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   int alpha, r, g, b;
          -
          -   evas_object_color_get(ad->clipper, &r, &g, &b, &alpha);
          -   evas_color_argb_unpremul(alpha, &r, &g, &b);
          -
          -   alpha -= 20;
          -   if (alpha < 0)
          -      alpha = 255;
          -
          -   evas_color_argb_premul(alpha, &r, &g, &b);
          -   evas_object_color_set(ad->clipper, r, g, b, alpha);
          -}
          - -

          Figure: Changing opacity

          -

          Changing opacity

          - -

          You can also hide the object when it is not needed:

          - -
          static void
          -_visibility_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   if (evas_object_visible_get(ad->clipper))
          -      evas_object_hide(ad->clipper);
          -   else
          -      evas_object_show(ad->clipper);
          -}
          - -

          Figure: Changing visibility

          -

           Changing visibility

          - -

          Reference Counting

          - -

          Evas has a simple reference counting mechanism that is useful for scenarios like inside a code block, callbacks exist which would possibly delete an object we are operating on afterwards.

          -

          To increment the reference count of an object, use the evas_object_ref() function. If the reference count is greater than 0, the evas_object_del() function is called until all references are released. References cannot go below 0 and are limited to 2^32 - 1 for each object:

          - -
          ad->spacer = evas_object_rectangle_add(evas);
          -evas_object_color_set(ad->spacer, 0, 255, 100, 255);
          -evas_object_move(ad->spacer, 0, 0);
          -evas_object_resize(ad->spacer, 120, 20);
          -evas_object_show(ad->spacer);
          -evas_object_ref(ad->spacer);
          -
          -static void
          -_unref_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   if (!ad->spacer)
          -      return;
          -
          -   if (evas_object_ref_get(ad->spacer) != 0)
          -   {
          -      evas_object_unref(ad->spacer);
          -      return;
          -   }
          -
          -int x, y, w, h;
          -
          -evas_object_geometry_get(ad->spacer, &x, &y, NULL, NULL);
          -evas_object_move(ad->img, x, y);
          -evas_object_geometry_get(ad->img, &x, &y, &w, &h);
          -evas_object_move(ad->clipper, x + (w / 4), y + (h / 4));
          -evas_object_move(ad->clipper_border, x + (w / 4) - 3, y + (h / 4) - 3);
          -evas_object_del(ad->spacer);
          -ad->spacer = NULL;
          -}
          - - -

          A green rectangle is used as a padding and the clipper object calculates its x, y coordinates based on the rectangle position. The rectangle reference count is increased by calling the evas_object_ref() function and now it is equal to 1. When the _unref_cb callback is triggered, the reference count value is higher than 0 and the evas_object_del(ad->spacer) function has no effect on the object. After the second callback call, the evas_object_ref_get(ad->spacer) function returns 0 and the evas_object_del(ad->spacer) function marks the rectangle object for deletion.

          - -

          Figure: Removing padding

          -

          Removing padding

          - -

          Changing the Object Order on Canvas

          - -

          By default, the placing of objects on canvas is based on their creation order.

          - -
          -ad->order_rect1 = evas_object_rectangle_add(evas);
          -evas_object_name_set(ad->order_rect1, "red");
          -evas_object_color_set(ad->order_rect1, 255, 0, 0, 255);
          -evas_object_move(ad->order_rect1, 120, 310);
          -evas_object_resize(ad->order_rect1, 200, 200);
          -evas_object_show(ad->order_rect1);
          -
          -ad->order_rect2 = evas_object_rectangle_add(evas);
          -evas_object_name_set(ad->order_rect2, "blue");
          -evas_object_color_set(ad->order_rect2, 0, 0, 255, 255);
          -evas_object_move(ad->order_rect2, 180, 350);
          -evas_object_resize(ad->order_rect2, 200, 200);
          -evas_object_show(ad->order_rect2);
          -
          - -

          Figure: Default order of objects on canvas

          -

          Default order of objects on canvas

          - -

          You can change the object triggering the _object_order_cb() callback, which switches the order of the rectangles.

          - -
          static void
          -_object_order_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   Evas_Object *rect = evas_object_below_get(ad->order_rect2);
          -   if (!rect)
          -      return;
          -
          -   const char *name = evas_object_name_get(rect);
          -   if (name)
          -      if (strcmp(name, "red") == 0)
          -      {
          -         evas_object_stack_below(ad->order_rect2, rect);
          -
          -         return;
          -      }
          -
          -   rect = evas_object_below_get(ad->order_rect1);
          -   if (!rect)
          -      return;
          -
          -   name = evas_object_name_get(rect);
          -   if (name)
          -      if (strcmp(name, "blue") == 0)
          -      {
          -         evas_object_stack_below(ad->order_rect1, rect);
          -
          -         return;
          -      }
          -}
          - -

          Figure: Changed order of objects on canvas

          -

          Changed order of objects on canvas

          - -

          Evas allows placing an object to top and bottom layer of the canvas object stack. The of _raise_cb callback puts the canvas background on the top position of the screen. The call of _lower_cb callback puts the background to the bottom.

          - -
          static void
          -_lower_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   evas_object_lower(ad->bg);
          -}
          -
          -static void
          -_raise_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          -{
          -   App_Data *ad = (App_Data *)data;
          -
          -   evas_object_raise(ad->bg);
          -   ad->isBgOnTop = EINA_TRUE;
          -}
          - -

          Figure: Canvas background by default and on top

          -

          Canvas background by default and on top

          - - - - - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/evas_map_animation_n.htm b/org.tizen.ui.guides/html/native/efl/evas_map_animation_n.htm deleted file mode 100755 index d265764..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_map_animation_n.htm +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - - - Evas Map Effects - - - - - -
          - -

          Evas Map Effects

          - -

          Evas Map animations allow you to apply transformations to all types of objects by way of UV mapping.

          - -

          In UV mapping, you map points in the source object to 3D space positions in the target object. This allows for rotation, perspective, scale, and other transformation effects, depending on the map. In addition, each map point can carry a multiplier color, which, if properly calculated, can be used to apply 3D shading effects on the target object.

          - -

          Evas provides both raw and easy-to-use functions for UV mapping. The raw functions allow you to create UV maps outside Evas and import them into your application, for example by loading them from an external file. The easy-to-use functions allow you to create UV maps directly in Evas by calculating the map points based on high-level parameters, such as rotation angle and ambient light.

          - -

          Map Points

          - -

          A map consists of a set of points. (Currently, only four points are supported.) Each point contains X and Y canvas coordinates that can be used to alter the geometry of the mapped object, and a Z coordinate that indicates the depth of the point. The Z coordinate does not normally affect the map, but several utility functions use it to calculate the right position of the point given the other parameters.

          - -

          First, create an Evas_Map object using the evas_map_new() function. This function creates the specified number of map points (currently only up to four points). Each point is empty and ready to be modified with Evas_Map functions.

          - -
          Evas_Map *m = evas_map_new(4);
          - -

          If you want to get the size (number of points) of an existing map, use the evas_map_count_get() function.

          - -

          To set the coordinates for each point, use the evas_map_point_coord_set() function:

          - -
          evas_map_point_coord_set(Evas_Map *m, int idx, Evas_Coord x, Evas_Coord y, Evas_Coord z)
          - -

          The following example shows a common way to define a map that matches the geometry of a rectangle (a square in this case):

          - -
          -evas_map_point_coord_set(m, 0, 100, 100, 0);
          -evas_map_point_coord_set(m, 1, 300, 100, 0);
          -evas_map_point_coord_set(m, 2, 300, 300, 0);
          -evas_map_point_coord_set(m, 3, 100, 300, 0);
          -
          - -

          Figure: Map

          -

          Map

          - -

          The following examples all produce the same result as the above example, but with simpler code:

          - -
            -
          • -

            To create a rectangle map using the starting X and Y coordinates combined with width and height, use the evas_map_util_points_populate_from_geometry() function:

            -
            evas_map_util_points_populate_from_geometry(Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord z)
            -

            The following example creates the same map as above:

            -
            evas_map_util_points_populate_from_geometry(m, 100, 100, 200, 200, 0);
            -
          • -
          • -

            To create a map based on the geometry of a given object, use the evas_map_util_points_populate_from_object() or evas_map_util_points_populate_from_object_full() function. The former sets the Z coordinate of all points to 0, whereas the latter allows you to define the same custom Z coordinate for all points:

            -
            evas_map_util_points_populate_from_object(Evas_Map *m, const Evas_Object *obj)
            -
            evas_map_util_points_populate_from_object_full(Evas_Map *m, const Evas_Object *obj, Evas_Coord z)
            -

            The following example creates the same map as above:

            -
            -Evas_Object *o;
            -evas_object_move(o, 100, 100);
            -evas_object_resize(o, 200, 200);
            -evas_map_util_points_populate_from_object(m, o);
            -// OR
            -evas_map_util_points_populate_from_object_full(m, o, 0);
            -
          • -
          - -

          You can apply several effects to an object by simply setting each point of the map to the appropriate coordinates. The following example shows how to create a simulated perspective:

          - -

          Figure: Simulated perspective

          -

          Simulated perspective

          - -
          -evas_map_point_coord_set(m, 0, 100, 100, 0);
          -evas_map_point_coord_set(m, 1, 250, 120, 0);
          -evas_map_point_coord_set(m, 2, 250, 280, 0);
          -evas_map_point_coord_set(m, 0, 100, 300, 0);
          -
          - -

          In the above example, the Z coordinate is unused: when setting points by hand, the Z coordinate is irrelevant.

          - -

          If you want to get the actual coordinates of a map, use the evas_map_point_coord_get() function:

          - -
          evas_map_point_coord_get(const Evas_Map *m, int idx, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z)
          - -

          After you have defined the map points, apply them to your map for transformation:

          - -
          -evas_object_map_set(o, m);
          -evas_object_map_enable_set(o, EINA_TRUE);
          -
          - -

          Finally, after you are done with the map, release the memory allocated to it using the evas_map_free() function:

          - -
          evas_map_free(m);
          - -

          The utility functions described in the next section allow you to perform the above tasks with less coding work.

          - -

          Utility Functions

          - -

          Utility functions take an already configured map and allow you to easily modify it to produce specific effects. For example, to rotate an object around its center, you need the rotation angle and the coordinates of each corner of the object to perform the math required to get the new set of coordinates that needs to be set for the map. Evas provides a utility function that does the math for you:

          - -
          evas_map_util_rotate(Evas_Map *m, double degrees, Evas_Coord cx, Evas_Coord cy)
          - -

          This function rotates the map based on the angle and the center coordinates of the rotation provided as arguments. A positive angle rotates the map clockwise, while a negative angle rotates the map counter-clockwise.

          - -

          The following example shows how to rotate an object around its center point by 45 degrees clockwise. In the following figure, the center of rotation is the red dot.

          - -
          -evas_object_geometry_get(o, &x, &y, &w, &h);
          -m = evas_map_new(4);
          -evas_map_util_points_populate_from_object(m, o);
          -evas_map_util_rotate(m, 45, x + (w / 2), y + (h / 2));
          -evas_object_map_set(o, m);
          -evas_object_map_enable_set(o, EINA_TRUE);
          -evas_map_free(m);
          -
          - -

          Figure: Rotating around the center point

          -

          Rotating around the center point

          - -

          You can rotate the object around any other point simply by setting the last two arguments of the evas_map_util_rotate() function to the appropriate values:

          - -
          evas_map_util_rotate(m, 45, x + w - 20, y + h - 20);
          - -

          Figure: Rotating around other points

          -

          Rotating around other points

          - -

          You can also set the center of the window as the center of the rotation using the appropriate coordinates of the Evas canvas:

          - -
          -evas_output_size_get(evas, &w, &h);
          -m = evas_map_new(4);
          -evas_map_util_points_populate_from_object(m, o);
          -evas_map_util_rotate(m, 45, w, h);
          -evas_object_map_set(o, m);
          -evas_object_map_enable_set(o, EINA_TRUE);
          -evas_map_free(m);
          -
          - -

          Zoom

          - -

          The evas_map_util_zoom() function zooms the points of the map from a center point, defined by cx and cy. The zoomx and zoomy arguments specify how much to zoom in on the X and Y axes. A value of 1.0 means no zoom, 2.0 means double the size, 0.5 means half the size, and so on. All the coordinates are global canvas coordinates.

          - -
          -evas_map_util_zoom(Evas_Map *m, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
          -
          - -

          3D Maps

          - -

          Maps can also be used to achieve a 3D effect. In a 3D effect, the Z coordinate of each point is meaningful: the higher the value, the further back the point is located. Smaller values (usually negative) mean that the point is closer to the user.

          - -

          3D also introduces the concept of the back face of an object. An object is said to be facing the user when all its points are placed in a clockwise formation, as shown in the left map in the following figure. Rotating the map around its Y axis swaps the order of the points into a counter-clockwise formation, making the object face away from the user, as shown in the right map in the following figure. The back face is especially relevant in lighting (see below).

          - -

          Figure: Rotating around the Y axis

          -

          Rotating around the Y axis

          - -

          To determine whether a map is facing the user, use the evas_map_util_clockwise_get() function. This function returns EINA_TRUE if the map is facing the user and EINA_FALSE if the map is facing away from the user. This is normally done after all the other operations are applied to the map.

          - -
          evas_map_util_clockwise_get(Evas_Map *m)
          - -

          3D Rotation and Perspective

          - -

          The evas_map_util_3d_rotate() function transforms a map to apply a 3D rotation to the mapped object. You can apply the rotation around any point in the canvas (including a Z coordinate). You can also apply the rotation around any of the three axes.

          - -
          evas_map_util_3d_rotate(Evas_Map *m, double dx, double dy, double dz, Evas_Coord cx, Evas_Coord cy, Evas_Coord cz)
          - -

          Starting from this simple setup, and setting the maps so that the blue square rotates around the Y axis, we get the following:

          - -

          Figure: 3D rotation

          -

          3D rotation

          - -

          A simple overlay over the image shows the original geometry of each object and the axis around which they are being rotated. The Z axis is not shown, since it is orthogonal to the screen. To show the Z axis, that is, to add 3D perspective to the transformation, use the evas_map_util_3d_perspective() function on the map after its position has been set:

          - -
          evas_map_util_3d_perspective(Evas_Map *m, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
          - -

          The result makes the vanishing point the center of each object:

          - -

          Figure: Adding perspective

          -

          Adding perspective

          - -

          Color and Lighting

          - -

          Each point in a map can be set to a color, which will be multiplied with the object’s own color and linearly interpolated between adjacent points. To set the color separately for each point, use the evas_map_point_color_set() function:

          - -
          evas_map_point_color_set(Evas_Map *m, int idx, int r, int g, int b, int a)
          - -

          To set the same color for every point, use the evas_map_util_points_color_set() function:

          - -
          evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
          - -

          When using a 3D effect, colors can be used to improve its look by simulating a light source. The evas_map_util_3d_lighting() function makes this task easier by taking the coordinates of the light source and its color, along with the color of the ambient light. Evas then sets the color of each point based on its distance to the light source, the angle at which the object is facing the light source, and the ambient light. Here, the orientation of each point is important.

          - -
          evas_map_util_3d_lighting(Evas_Map *m, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab)
          - -

          If the map points are defined counter-clockwise, the object faces away from the user and is therefore obscured, since no light is reflecting back from it.

          - -

          Figure: Obscured object

          -

          Obscured object

          - -

          Mapping

          - -

          Images need special handling when mapped. While Evas can easily handle objects, it is completely oblivious to the contents of images. This means that each point in a map needs to be mapped to a specific pixel in the source image. Failing to do this can result in unexpected behavior.

          - -

          Let's get started with the following three images, each sized at 200 × 200 pixels:

          - -

          Figure: Starting point

          -

          Starting point

          - -

          The following three images illustrate the case where a map is set to an image object without setting the right UV mapping for each map point. The objects themselves are mapped properly to their new geometries, but the images are not displayed correctly within the mapped objects.

          - -

          Figure: Questionable result

          -

          Questionable result

          - -

          To transform an image correctly, Evas needs to know how to handle the image within the map. You can do this using the evas_map_point_image_uv_set() function, which allows you to map a given point in a map to a given pixel in a source image:

          - -
          -evas_map_point_image_uv_set(Evas_Map *m, int idx, double u, double v)
          -
          - -

          To match our example images to the maps above, all we need is the size of each image, which we can get using the evas_object_image_size_get() function.

          - -
          -// Tux 1: Some cropping and stretch up
          -evas_map_point_image_uv_set(m, 0, 0, 20);
          -evas_map_point_image_uv_set(m, 1, 200, 20);
          -evas_map_point_image_uv_set(m, 2, 200, 180);
          -evas_map_point_image_uv_set(m, 3, 0, 180);
          -evas_object_map_set(tux1, m);
          -evas_object_map_enable_set(tux1, EINA_TRUE);
          -
          -// Inverted texture for shadow:
          -evas_map_point_image_uv_set(m, 0, 0, 180);
          -evas_map_point_image_uv_set(m, 1, 200, 180);
          -evas_map_point_image_uv_set(m, 2, 200, 20);
          -evas_map_point_image_uv_set(m, 3, 0, 20);
          -evas_object_map_set(tux1_shadow, m);
          -evas_object_map_enable_set(tux1_shadow, EINA_TRUE);
          -
          -// Tux 2: Make it fit to the map:
          -evas_map_point_image_uv_set(m, 0, 0, 0);
          -evas_map_point_image_uv_set(m, 1, 200, 0);
          -evas_map_point_image_uv_set(m, 2, 200, 200);
          -evas_map_point_image_uv_set(m, 3, 0, 200);
          -evas_object_map_set(tux2, m);
          -evas_object_map_enable_set(tux2, EINA_TRUE);
          -
          -// Tux 3: Zoom and fit relatively to image size
          -evas_object_image_size_get(evas_object_image_source_get(tux3), &w, &h);
          -evas_map_point_image_uv_set(m, 0, 0.1 * w, 0.1 * h);
          -evas_map_point_image_uv_set(m, 1, 0.9 * w, 0.1 * h);
          -evas_map_point_image_uv_set(m, 2, 0.9 * w, 0.9 * h);
          -evas_map_point_image_uv_set(m, 3, 0.1 * w, 0.9 * h);
          -evas_object_map_set(tux3, m);
          -evas_object_map_enable_set(tux3, EINA_TRUE);
          -
          - -

          Figure: Correct result

          -

          Correct result

          - -

          You can also set a map to use only part of an image, or you can even map the points in inverted order. Combined with the evas_object_image_source_set() function, you can achieve more interesting results still.

          - -

          Lighting

          - -

          Evas_Map allows you to define an ambient light and a light source within the scene. Both of these light sources have their own colors.

          - -
          evas_map_util_3d_lighting(Evas_Map *m, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab)
          - -

          The above function is used to apply lighting calculations (from a single light source) to a given map. The red, green, and blue values of each vertex will be modified to reflect the lighting based on the light source coordinates, its color, the ambient color, and the angle at which the map faces the light source. The points of a surface should be defined in a clockwise formation if the surface is facing the user, since faces have a logical side for lighting.

          - -

          To get the reflections (gradient) in the shadow of our previous example, you have to define a source of light close enough to the user and a very bright ambient light, for example:

          - -
          -evas_map_util_3d_lighting(m, // Evas_Map object
          -                          250/2, 150/2, -100, // Spot light coordinates
          -                          255, 255, 255, // Spot light color
          -                          200, 200, 200); // Ambient light color
          -
          - -

          Alpha Channel

          - -

          You can also use an alpha channel on your map by enabling the alpha channel feature:

          - -
          evas_map_alpha_set(Evas_Map *m, Eina_Bool enabled)
          - -

          Next, set the alpha value separately for each map point:

          - -
          evas_map_point_color_set(Evas_Map *m, int idx, int r, int g, int b, int a)
          - -

          Alternatively, you can set the same alpha value to all map points:

          - -
          evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
          - -

          The following code sets the shadow transparency for the first image in the above three-image example:

          - -
          -// Set object transparency to 50%:
          -evas_map_util_points_color_set(m, 255, 255, 255, 127);
          -
          -// Tux's head is almost invisible in the shadow:
          -evas_map_point_color_set(m, 3, 255, 255, 255, 15);
          -evas_map_point_color_set(m, 4, 255, 255, 255, 15);
          -
          - -

          Smoothing

          - -

          To enable smoothing when rendering a map, use the evas_map_smooth_set() function:

          - -
          evas_map_smooth_set(Evas_Map *m, Eina_Bool enabled)
          - -

          The first argument is the Evas_Map object to apply smoothing to. The second argument sets whether to enable the smoothing:

          - -
            -
          • EINA_TRUE: Enable smoothing.
          • -
          • EINA_FALSE: Disable smoothing.
          • -
          - -

          If the object is of a type that has its own smoothing settings, the smoothing settings must be disabled for both the object and the map. Map smoothing is enabled by default. To check whether map smoothing is enabled, use the evas_map_smooth_get() function.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/evas_map_effects_n.htm b/org.tizen.ui.guides/html/native/efl/evas_map_effects_n.htm deleted file mode 100755 index 3184eee..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_map_effects_n.htm +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - Creating Evas Map Effects - - - - - - -
          -

          Creating Evas Map Effects

          - - -

          This tutorial demonstrates how you can use Evas map functions to create an application in which you can change the map point coordinates of Evas objects. You can modify the map point U and V texture source point using Evas map mapping APIs. "U" and "V" denote the axes of the 2D texture.

          - -

          Figure: Evas map mapping application

          -

          Evas map mapping application

          - -

          Creating the Basic Application

          -

          To create a basic application:

          -
            -
          1. -

            To use the required APIs, include the following libraries:

            - -
            #include <app.h>
            -#include <Elementary.h>
            -#include <system_settings.h>
            -#include <efl_extension.h>
            -
          2. - -
          3. -

            Create an Evas object for an Elementary window and a button for mapping the map information:

            - -
            typedef struct appdata 
            -{
            -   Evas_Object *win;
            -   Evas_Object *button;
            -Evas_Object *default_btn;
            -} 
            -appdata_s;
            -
          4. -
          5. -

            To create an Elementary window, use the elm_win_util_standard_add() function and give the name and title of the application. To set a callback on hardware Back button, the use eext_object_event_callback_add() function. To display the Evas object, use the evas_object_show() function.

            - -
            static void
            -create_base_gui(appdata_s *ad)
            -{
            -    Evas_Object *evas_text = NULL;
            -    Evas *evas                = NULL;
            -
            -   // Window
            -   ad->win = elm_win_util_standard_add("Extra object function", "Extra object function");
            -   elm_win_autodel_set(ad->win, EINA_TRUE);
            -
            -   // Window callbacks
            -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, back_cb, ad);
            -
            -   evas = evas_object_evas_get(ad->win);
            -
            -   evas_text = evas_object_text_add(evas);
            -   evas_object_text_text_set(evas_text, "Evas Map Mapping");
            -   evas_object_text_font_set(evas_text, "Sans", 18);
            -   evas_object_color_set(evas_text, 50, 100, 200, 255);
            -   evas_object_move(evas_text, 10, 90);
            -   evas_object_show(evas_text);
            -
            -   // Evas map source code
            -
            -   evas_object_show(ad->win);
            -}
            -
          6. - -
          7. -

            Implement callback functions to enable closing the application:

            - -
            static void
            -back_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   appdata_s *ad = data;
            -
            -   elm_win_lower(ad->win);
            -}
            -
            -static void
            -win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   ui_app_exit();
            -}
            -
          8. - -
          9. -

            Create an elementary application with a GUI:

            - -
            static bool
            -app_create(void *data)
            -{
            -   appdata_s *ad = data;
            -
            -   // Create the application UI
            -   create_base_gui(ad);
            -
            -   return true;
            -}
            -
            -int
            -main(int argc, char *argv[])
            -{
            -   appdata_s ad = {0,};
            -
            -   ui_app_lifecycle_callback_s event_callback = {0,};
            -
            -   event_callback.create = app_create;
            -
            -   // Run the main loop
            -   return ui_app_main(argc, argv, &event_callback, &ad);
            -}
            -
          10. - -
          11. -

            Create the button for mapping. Use the move and resize functions to configure the button's custom geometry:

            - -
            // Create a button for mapping
            -ad->button = elm_button_add(ad->win);
            -elm_object_text_set(ad->button, "Evas Map Mapping ");
            -evas_object_move(ad->button, 15, 100);
            -evas_object_resize(ad->button, ELM_SCALE_SIZE(250), ELM_SCALE_SIZE(200));
            -evas_object_show(ad->button);
            -
            -// Create a default button
            -ad->default_btn = elm_button_add(ad->win);
            -elm_object_text_set(ad->default_btn, "Default Button ");
            -evas_object_move(ad->default_btn, 15, 300);
            -evas_object_resize(ad->default_btn, ELM_SCALE_SIZE(250), ELM_SCALE_SIZE(200));
            -evas_object_show(ad->default_btn);
            -
          12. -
          - -

          Creating Map Data

          - -

          By using the evas_map_new() and evas_map_*() functions, you can create map data to be attached to the button:

          - -
            -
          1. -

            Get the Evas_Map object to create map data using the evas_map_new() function:

            - -
            -Evas_Map *map;
            -map = evas_map_new(4);
            - -

            The map of transformation points is used later with an Evas object.

            -
          2. - -
          3. -

            Set the coordinates for each point using the evas_map_point_coord_set() function. You can apply several effects to the Evas object by setting each point of the map to the right coordinates.

            - -
            // Set map coordinates
            -evas_map_point_coord_set(map, 0, 15, 100, 0);
            -evas_map_point_coord_set(map, 1, 265, 100, 0);
            -evas_map_point_coord_set(map, 2, 265, 300, 0);
            -evas_map_point_coord_set(map, 3, 15, 400, 0);
            -
          4. - -
          5. -

            Set UV data using the evas_map_point_image_uv_set() function, which informs the map of the correct pixels in the image it is mapping:

            - -
            // Set image UV
            -evas_map_point_image_uv_set(map, 0, 0, 0);
            -evas_map_point_image_uv_set(map, 1, 500, 50);
            -evas_map_point_image_uv_set(map, 2, 500, 400);
            -evas_map_point_image_uv_set(map, 3, 0, 200);
            -
          6. -
          - - -

          Applying the Map to the Evas Object

          - -

          To set the map on a given object, use the evas_object_map_set() function for the object. A map contains 4 points, each having canvas x, y coordinates with an optional z point value for perspective correction, if available. Each point also has U an V coordinates.

          - -
          // Apply map to button evas object
          -
          -evas_object_map_set(ad->button, map);
          - -

          Clearing Map Data and Enabling Map Features

          - -

          Free the map data and all memory associated with it when you no longer need it:

          - -
          // Free map resources
          -
          -evas_map_free(map);
          - -

          You can enable or disable the map features for the object. When enabled, the object geometry is saved, and the new geometry changes its position and size to reflect the set map geometry.

          - -
          // Enable map features
          -
          -evas_object_map_enable_set(ad->button, EINA_TRUE);
          - - - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/evas_objects_n.htm b/org.tizen.ui.guides/html/native/efl/evas_objects_n.htm deleted file mode 100755 index d0a4a7d..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_objects_n.htm +++ /dev/null @@ -1,824 +0,0 @@ - - - - - - - - - - - - - Evas Objects - - - - - -
          - -

          Evas Objects

          - -

          An Evas object is the most basic visual entity used in Evas. Everything, be it a single line or a complex list of UI components, is an Evas object.

          - -

          Primitive Renderable Objects

          -

          Primitive objects are the base upon which to build a complex interface: rectangles, lines, polygons, images, textblocks, and texts.

          -

          Rectangle

          -

          There is only one function to deal with rectangle objects. However, the rectangle is manipulated using the generic evas object functions.

          -

          The evas rectangle serves a number of key functions when working on Evas programs.

          -
            -
          • background
          • -
          • debugging
          • -
          • clipper
          • -
          - -

          Background

          -

          A common requirement of Evas programs is to have a solid color background, which can be accomplished with the following code.

          -
          Evas_Object *bg = evas_object_rectangle_add(evas_canvas);
          -
          -// Here we set the rectangles red, green, blue and opacity levels
          -evas_object_color_set(bg, 255, 255, 255, 255); // opaque white background
          -evas_object_resize(bg, WIDTH, HEIGHT); // covers full canvas
          -evas_object_show(bg);
          -
          - -

          Debugging

          -

          When debugging visual issues with evas programs, the rectangle is a useful tool. The rectangle's simplicity means that it is easier to pinpoint issues with it than with more complex objects. A common technique to use when writing an evas program and not getting the desired visual result is to replace an object for a solid color rectangle and seeing how it interacts with the other elements. This often allows us to notice clipping, parenting or positioning issues. Once the issues are identified and corrected, the rectangle can be replaced for the original object, and in all likelihood any remaining issues are specific to that object's type.

          - -

          Clipping

          -

          Clipping serves two main functions:

          -
            -
          • limiting visibility
          • -
          • applying a layer of color to an object
          • -
          - - -

          Text

          -

          An Evas text object shows a basic single-line single-style text.

          -
          Evas_Object *text = evas_object_text_add(evas_canvas);
          -evas_object_text_text_set(text, "some text");
          -evas_object_color_set(text, 127, 0, 0, 127);
          -evas_object_show(text);
          -
          - -

          To set the text, use evas_object_text_text_set(text, some_text). You can set the current text with evas_object_text_text_get(text).

          -

          To set the font, use evas_object_text_font_set(text, font, size):

          -
            -
          • text: The text object
          • -
          • font: The font name you want to use
          • -
          • size: The font size you want to use. To query the current font, use evas_object_text_font_set(text, font, size).
          • -
          -

          To set the text style, use evas_object_text_style_set(text, style). The following styles are supported:

          -
            -
          • EVAS_TEXT_STYLE_PLAIN: Plain, standard text
          • -
          • EVAS_TEXT_STYLE_SHADOW: Text with shadow underneath
          • -
          • EVAS_TEXT_STYLE_OUTLINE: Text with an outline
          • -
          • EVAS_TEXT_STYLE_SOFT_OUTLINE: Text with a soft outline
          • -
          • EVAS_TEXT_STYLE_GLOW: Text with a glow effect
          • -
          • EVAS_TEXT_STYLE_OUTLINE_SHADOW: Text with both outline and shadow effects
          • -
          • EVAS_TEXT_STYLE_FAR_SHADOW: Text with (far) shadow underneath
          • -
          • EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW: Text with outline and soft shadow effects combined
          • -
          • EVAS_TEXT_STYLE_SOFT_SHADOW: Text with (soft) shadow underneath
          • -
          • EVAS_TEXT_STYLE_FAR_SOFT_SHADOW: Text with (far soft) shadow underneath
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT: Shadow growing to bottom right
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM: Shadow growing to the bottom
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT: Shadow growing to bottom left
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT: Shadow growing to the left
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT: Shadow growing to top left
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP: Shadow growing to the top
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT: Shadow growing to top right
          • -
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT: Shadow growing to the right. To query the current style, use evas_object_text_style_get(text).
          • -
          -

          If the text does not fit, make an ellipsis on it by using evas_object_text_ellipsis_set(text, ellipsis). The (float) value specifies, which part of the text is shown.

          -
            -
          • 0.0: The beginning is shown and the end trimmed.
          • -
          • 1.0: The beginning is trimmed and the end shown.
          • -
          • Any value in between means that both ends of the text have ellipsis and the set part is shown.
          • -
          • -1.0: Ellipsis is disabled. To query the current ellipsis value, use evas_object_text_ellipsis_get(text).
          • -
          -

          When the text style is set to glow, set the glow color using evas_object_text_glow_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. The effect is placed at a short distance from the text but not touching it. For glows set right at the text, use evas_object_text_glow2_color_set(text, r, g, b, a). To query the current color, use evas_object_text_glow_color_get(text, r, g, b, a), respectively evas_object_text_glow2_color_get(text, r, g, b, a).

          -

          If your text style is set to display a shadow, use evas_object_text_shadow_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. To query the current color, use evas_object_text_shadow_color_get(text, r, g, b, a)

          -

          If your text style is set to display an outline, use evas_object_text_outline_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. To query the current color, use evas_object_text_outline_color_get(text, r, g, b, a)

          - - -

          Primitive Smart Objects

          -

          A smart object is a special Evas object that provides custom functions to handle automatically clipping, hiding, moving, resizing color setting and more on child elements, for the smart object's user. They could be, for example, a group of objects that move together, or implementations of whole complex UI components, providing some intelligence and extension to simple Evas objects.

          - -

          Primitive Container Objects

          -

          A container is a Smart object that holds children Evas objects in a specific fashion.

          -

          Table

          -

          A table is a smart object that packs children using a tabular layout.

          -
          table = evas_object_table_add(evas);
          -evas_object_table_homogeneous_set(table, EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE);
          -evas_object_table_padding_set(table, 0, 0);
          -evas_object_resize(table, WIDTH, HEIGHT);
          -evas_object_show(table);
          -
          -rect = evas_object_rectangle_add(evas);
          -evas_object_color_set(rect, 255, 0, 0, 255);
          -evas_object_size_hint_min_set(rect, 100, 50);
          -evas_object_show(rect);
          -evas_object_table_pack(table, rect, 1, 1, 2, 1);
          -
          -rect = evas_object_rectangle_add(d.evas);
          -evas_object_color_set(rect, 0, 255, 0, 255);
          -evas_object_size_hint_min_set(rect, 50, 100);
          -evas_object_show(rect);
          -evas_object_table_pack(table, rect, 1, 2, 1, 2);
          -
          -rect = evas_object_rectangle_add(d.evas);
          -evas_object_color_set(rect, 0, 0, 255, 255);
          -evas_object_size_hint_min_set(rect, 50, 50);
          -evas_object_show(rect);
          -evas_object_table_pack(table, rect, 2, 2, 1, 1);
          -
          -rect = evas_object_rectangle_add(d.evas);
          -evas_object_color_set(rect, 255, 255, 0, 255);
          -evas_object_size_hint_min_set(rect, 50, 50);
          -evas_object_show(rect);
          -evas_object_table_pack(table, rect, 2, 3, 1, 1);
          -
          - -

          In this example, we add a non-homogeneous table to the canvas with its padding set to 0.

          -

          We then add four different colored rectangles with different properties.

          -
            -
          • the first one, at the first column and first line, spans two columns and one line
          • -
          • the second one, at the first column and second line, spans one columns and two lines
          • -
          • the third one, at the second column and second line, fits in one cell
          • -
          • the fourth one, at the second column and third line, also fits in one cell
          • -
          -

          To create a table, use evas_object_table_add(evas).

          -

          To set the table layout (the cells), use evas_object_table_homogeneous_set(table, homogeneous). The following values can be homogeneous:

          -
            -
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE: This default value has columns and rows calculated based on hints of individual cells. This is flexible, but much heavier on computations.
          • -
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE: The table size is divided equally among children, filling the whole table area. If the children have a minimum size that is larger than this (including padding), then the table overflows and is aligned respecting the alignment hint, possibly overlapping sibling cells.
          • -
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM: The greatest minimum cell size is used: if no element is set to expand, the contents of the table are the minimum size and the bounding box of all the children is aligned relatively to the table object using evas_object_table_align_get(). If the table area is too small to hold this minimum bounding box, then the objects keep their size and the bounding box overflows the box area, still respecting the alignment. To set the current mode, use evas_object_table_homogeneous_get(table).
          • -
          -

          The table's content alignment is set using evas_object_table_align_set(table, horizontal, vertical), where horizontal and vertical are floating values. To see them, use evas_object_table_align_get(table, horizontal, vertical).

          -

          To set the padding, use evas_object_table_padding_set(table, horizontal, vertical). To see the current value, use evas_object_table_padding_get(table, horizontal, vertical).

          -

          _To see the current column and row count, use evas_object_table_col_row_size_get(table, columns, rows).

          - -

          Grid

          -

          A grid is a smart object that packs its children as with a regular grid layout.

          -

          Grids are added to the canvas with evas_object_grid_add(evas).

          -

          To change a grid's virtual resolution, use evas_object_grid_size_set(grid, width, height), to see it, use evas_object_grid_size_get(grid, width, height).

          -

          To add an object, use evas_object_grid_pack(grid, child, x, y, w, h), where

          -
            -
          • x is the virtual X coordinate of the child
          • -
          • y is the virtual y coordinate of the child
          • -
          • w is the virtual width of the child
          • -
          • h is the virtual height of the child
          • -
          -

          Box

          -

          A box is a simple container that sets its children objects linearly.

          -

          To add a box to your canvas, use evas_object_box_add(evas).

          -

          To add a child to the box, use

          -
            -
          • evas_object_box_append(box, child): The child is appended.
          • -
          • evas_object_box_insert_after(box, child, reference): The child is added after reference.
          • -
          • evas_object_box_insert_before(box, child, reference): The child is added before reference.
          • -
          • evas_object_box_insert_at(box, child, pos): The child is added at the specified position.
          • -
          -

          To set the alignment, use evas_object_box_align_set(box, horizontal, vertical).

          -
            -
          • horizontal: 0.0 means aligned to the left, 1.0 means to the right;
          • -
          • vertical: 0.0 means aligned to the top, 1.0 means to the bottom.
          • -
          -

          Evas has predefined box layouts available:

          -
            -
          • evas_object_box_layout_horizontal();
          • -
          • evas_object_box_layout_vertical();
          • -
          • evas_object_box_layout_homogeneous_horizontal();
          • -
          • evas_object_box_layout_homogeneous_vertical();
          • -
          • evas_object_box_layout_homogeneous_max_size_horizontal();
          • -
          • evas_object_box_layout_homogeneous_max_size_vertical();
          • -
          • evas_object_box_layout_flow_horizontal();
          • -
          • evas_object_box_layout_flow_vertical();
          • -
          • evas_object_box_layout_stack().
          • -
          - -

          Image Objects

          - - -

          Using Evas, you can create and manipulate image objects. Evas supports image loaders of various formats as plug-in modules.

          -

          The image formats that Evas supports include bmp, edj, gif, ico, jpeg, pmaps, png, psd, svg, tga, tiff, wbmp, webp, and xpm.

          - -

          Figure: Evas image loader

          -

          Evas image loader

          - -

          Evas Object Image Functions

          - -

          Evas has over 70 image object functions. The following functions are discussed in this document:

          -
          -Evas_Object *evas_object_image_add(Evas *e);
          -void evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key);
          -void evas_object_image_fill_set(Evas_Object *obj, int x, int y, int w, int h);
          -void evas_object_image_filled_set(Evas *e, Eina_Bool setting);
          -Evas_Object *evas_object_image_filled_add(Evas *e);
          -void evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smoothscale);
          -void evas_object_image_load_size_set(Evas_Object *obj, int w, int h);
          -void evas_object_image_data_set(Evas_Object *obj, void *data);
          -void *evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writing);
          -void evas_object_image_size_set(Evas_Object *obj, int w, int h);
          -void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h);
          -Eina_Bool evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags);
          -
          - -

          Creating an Image Object and Setting the Image Data Source

          -

          A common use case of an image object is to set a file as the image data source. The process has 3 steps and each one involves the following API calls:

          -
            -
          • The evas_object_image_add() function creates an image object and returns the pointer. -
            Evas_Object *evas_object_image_add(Evas *e);
            -
          • -
          • The evas_object_image_file_set() function sets a source file on the image object. The object fetches the image pixel data from the source file. -
            void evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key);
            -
          • -
          • The evas_object_image_fill_set() sets how to fill the image object's area with the given pixel data. -
            void evas_object_image_fill_set(Evas_Object *obj, int x, int y, int w, int h);
            -
          • -
          - -

          In the following code example, the main() function creates an image object and displays it on a window. The image object size is 300x300 and the source image resolution is 100x127. The image is scaled into 300 by 300 to fill the image object area using the evas_object_image_fill_set() function.

          -
          -#include <Elementary.h>
          -
          -int main(int argc, char **argv)
          -{
          -   elm_init(argc, argv);
          -
          -   // Create a window object
          -   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          -   evas_object_resize(win, 400, 400);
          -   evas_object_show(win);
          -
          -   // Return Evas handle from window
          -   Evas *e = evas_object_evas_get(win);
          -
          -   // Create an image object
          -   Evas_Object *img = evas_object_image_add(e);
          -
          -   // Set a source file to fetch pixel data
          -   evas_object_image_file_set(img, "./logo.png", NULL);
          -
          -   // Set the size and position of the image on the image object area
          -   evas_object_image_fill_set(img, 0, 0, 300, 300);
          -
          -   evas_object_move(img, 50, 50);
          -   evas_object_resize(img, 300, 300);
          -   evas_object_show(img);
          -
          -   elm_run();
          -
          -   elm_shutdown();
          -
          -   return 0;
          -}
          -
          -

          Figure: Image object display

          -

          Image object display

          - -

          Managing Images

          - -

          To manage image objects in Evas:

          - -

          Limiting Visibility

          -

          Evas always supports the image file type it was compiled with. Check your software packager for the information and use the evas_object_image_extension_can_load_get() function.

          - -

          Create the image object. Set a source file on it, so that the object knows where to fetch the image data.

          -

          Define how to fill the image object area with the given pixel data. You can use a sub-region of the original image, or have it tiled repeatedly on the image object.

          - -
          -img = evas_object_image_add(canvas);
          -evas_object_image_file_set(img, "path/to/img", NULL);
          -evas_object_image_fill_set(img, 0, 0, w, h);
          -
          - - -

          If the entire source image is to be displayed on the image object, stretched to the destination size, use the evas_object_image_filled_set() function helper that you can use instead of the evas_object_image_fill_set() function:

          - -
          -evas_object_image_filled_set(img, EINA_TRUE);
          -
          - -

          Scaling Images

          -

          Resizing image objects scales the source images to the image object size, if the source images are set to fill the object area using the evas_object_image_filled_set() function.

          -

          Control the aspect ratio of an image for different sizes with functions to load images scaled up or down in memory.

          - -

          Evas has a scale cache, which caches scaled versions of images used often. You can also have Evas rescale the images smoothly, however, that is computationally expensive.

          - -

          Users can decide how to fill the image object area with the given image pixel data by setting the position, width, and height of the image using the evas_object_image_fill_set() function. Without setting this information, the image is not displayed. If the size of the image is bigger than the image object area, only a sub-region of the original image is displayed. If the image is smaller than the area, images are tiled repeatedly to fill the object area.

          - -

          Figure: Image scaling

          -

          Image scaling

          - - - - - - - - - - - - - - -

          evas_object_image_fill_set(obj, 50, 0, 300, 300)evas_object_image_fill_set(obj, 0, 0, 200, 200)evas_object_image_fill_set(obj, 0, 0, 100, 127)
          - -

          The evas_object_image_filled_set() function scales the image to fit the object area. Resizing the image object automatically triggers an internal call to the evas_object_image_fill_set() function.

          -
          -void evas_object_image_filled_set(Evas *e, Eina_Bool setting);
          - -

          The evas_object_image_filled_add() function creates a new image object that automatically scales its bound image to the object area. This is a helper function around the evas_object_image_add() and evas_object_image_filled_set() functions.

          - -
          Evas_Object *evas_object_image_filled_add(Evas *e);
          - -

          Scaled images' quality can differ according to scaling algorithms. Smooth scaling improves the image quality in the process of size reducing or enlarging. Evas runs its own smooth scaling algorithm by default and provides an API so users can disable the function.

          - -
          -void evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smoothscale);
          - -

          The algorithm is implemented using the SIMD (Single Instruction Multiple Data) vectorization in case of software rendering. It is optimized on Intel and ARM CPU through MMX and NEON command respectively.

          - -

          There is a trade-off between image smoothness and rendering performance. The load gets bigger as the image gets bigger. Users can avoid such scaling overload by using the same size of the image object and the source image.

          - -

          In the following code, 2 image objects are created to show the effects of smooth scaling. The one with smooth scaling applied appears softer on the screen.

          - -
          -#include <Elementary.h>
          -
          -int main(int argc, char **argv)
          -{
          -   elm_init(argc, argv);
          -
          -   // Create a window object
          -   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          -   evas_object_resize(win, 400, 200);
          -   evas_object_show(win);
          -
          -   // Return Evas handle from window
          -   Evas *e = evas_object_evas_get(win);
          -
          -   // Create an image object
          -   Evas_Object *img = evas_object_image_filled_add(e);
          -   evas_object_image_file_set(img, "./logo.png", NULL);
          -   evas_object_move(img, 0, 0);
          -   evas_object_resize(img, 200, 200);
          -   evas_object_show(img);
          -
          -   // Create another image object
          -   Evas_Object *img2 = evas_object_image_filled_add(e);
          -   evas_object_image_file_set(img2, "./logo.png", NULL);
          -
          -   // Disable smooth scaling
          -   evas_object_image_smooth_scale_set(img2, EINA_FALSE);
          -   evas_object_move(img2, 200, 0);
          -   evas_object_resize(img2, 200, 200);
          -   evas_object_show(img2);
          -
          -   elm_run();
          -
          -   elm_shutdown();
          -
          -   return 0;
          -}
          -
          - - - - - - - - - - - - -
          Figure: Smooth scaling effects

          Smooth scaling effects

          Smooth scaling effects

          Smooth scaling enabledSmooth scaling disabled
          - - -

          Evas caches scaled image data and reuses them. Users can save the memory by loading the image in the scaled size to the memory at the beginning. This option is available only for jpeg format at the moment.

          -
          -void evas_object_image_load_size_set(Evas_Object *obj, int w, int h);
          - -

          An example code is as follows.

          -
          -#include <Elementary.h>
          - 
          -int main(int argc, char **argv)
          -{
          -   elm_init(argc, argv);
          - 
          -   // Create a window object
          -   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          -   evas_object_resize(win, 400, 200);
          -   evas_object_show(win);
          - 
          -   // Return Evas handle from window
          -   Evas *e = evas_object_evas_get(win);
          - 
          -   // Create an image object
          -   Evas_Object *img = evas_object_image_filled_add(e); 
          - 
          -   // Load the image scaled into the object size 
          -   // before evas_object_image_file_set() is called
          -   evas_object_image_load_size_set(img, 300, 300);
          - 
          -   evas_object_image_file_set(img, "./logo.png", NULL); 
          -   
          -   evas_object_move(img, 50, 50);
          -   evas_object_resize(img, 300, 300);
          -   evas_object_show(img); 
          - 
          -   elm_run();
          - 
          -   elm_shutdown();
          -
          -   return 0;
          -}
          -
          - -

          Setting Raw Data to Image Object

          -

          Users can set raw data to the image object manually using the evas_object_image_data_set() function instead of setting an image file as the data source. The image data should be in raw data form. In case of an 200x200 sized image with alpha channel enabled (32 bits per pixel), the size of the image data is 14000 (=200*200*4) bytes.

          - -
          void evas_object_image_data_set(Evas_Object *obj, void *data);
          - -

          Image objects fetch metadata such as width or height from the header of the image files. Since the raw data does not have the metadata, users must set the size of the image using the evas_object_image_size_set() function.

          - -
          void evas_object_image_size_set(Evas_Object *obj, int w, int h);
          - -

          The evas_object_image_data_get() function returns the data pointer of an image object and requires a parameter to determine whether the data is modified or not. If users pass EINA_TRUE for for_writing, Evas updates the image pixels in the next rendering cycle.

          - -
          void *evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writing);
          - -

          The evas_object_image_data_update_add() helps to mark the updated area for rendering efficiency.

          - -
          void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h);
          - -

          The following example code and figure show how to specify the area to update.

          -
          -evas_object_image_data_update_add(image, 100, 100, 50, 50);
          -evas_object_image_data_update_add(image, 180, 100, 50, 50);
          -evas_object_image_data_update_add(image, 85, 200, 160, 80);
          -
          - -

          Figure: Partial image update

          -

          Partial image update

          - -

          The following code creates an image object and sets a source file on it. Then it implements the blur effect to the pixel data and saves them using the evas_object_image_save() function.

          - -
          Eina_Bool evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags);
          - -
          -#include <Elementary.h>
          -
          -void image_blur(Evas_Object *img)
          -{
          -   unsigned char *img_src = evas_object_image_data_get(img, EINA_TRUE);
          -
          -   int w, h;
          -   evas_object_image_size_get(img, &w, &h);
          -   int blur_size = 4;
          -   int x, y, xx, yy;
          -   
          -   for (y = 0; y < h; y++)
          -   {
          -      for (x = 0; x < w; x++)
          -      {
          -         int avg_color[3] = {0, 0, 0};
          -         int blur_pixel_cnt = 0;
          -
          -         for (xx = x; (xx < x + blur_size) && (xx < w); xx++)
          -         {
          -            for (yy = y; (yy < y + blur_size) && (yy < h); yy++)
          -            {
          -               int idx = (yy * w * 4) + (xx * 4);
          -               avg_color[0] += img_src[idx + 0];
          -               avg_color[1] += img_src[idx + 1];
          -               avg_color[2] += img_src[idx + 2];
          -               ++blur_pixel_cnt;
          -            }
          -         }
          -         avg_color[0] /= blur_pixel_cnt;
          -         avg_color[1] /= blur_pixel_cnt;
          -         avg_color[2] /= blur_pixel_cnt;
          -
          -         for (xx = x; (xx < x + blur_size) && (xx < w); xx++)
          -         {
          -            for (yy = y; (yy < y + blur_size) && (yy < h); yy++)
          -            {
          -               int idx = (yy * w * 4) + (xx * 4);
          -               img_src[idx + 0] = avg_color[0];
          -               img_src[idx + 1] = avg_color[1];
          -               img_src[idx + 2] = avg_color[2];
          -            }
          -         }
          -      }
          -   }
          -   evas_object_image_data_update_add(img, 0, 0, w, h);
          -}
          -
          -int main(int argc, char **argv)
          -{
          -   elm_init(argc, argv);
          -
          -   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          -   evas_object_resize(win, 200, 200);
          -   evas_object_show(win);
          -
          -   Evas *e = evas_object_evas_get(win);
          -
          -   Evas_Object *img = evas_object_image_filled_add(e);
          -   evas_object_image_file_set(img, "./logo.png", NULL);
          -   evas_object_resize(img, 200, 200);
          -   evas_object_show(img);
          -
          -   image_blur(img);
          -
          -   evas_object_image_save(img, "logo2.png", NULL, "quality=100 compress=8");
          -
          -   elm_run();
          -
          -   elm_shutdown();
          -
          -   return 0;
          -}
          -
          - - - - - - - - - - - - -
          Figure: Blur effect

          Blur effect

          Blur effect

          BeforeAfter
          - -

          Giving Performance Hints

          -

          In image viewer applications, you can display an image in full size. The navigation to the adjacent images on your album must be fluid and fast. Thus, while displaying a given image, the program can load the next and previous image in the background to be able to immediately repaint the screen with a new image.

          - -

          Evas addresses this issue with image preloading:

          - -
          -prev = evas_object_image_filled_add(canvas);
          -evas_object_image_file_set(prev, "/path/to/prev", NULL);
          -evas_object_image_preload(prev, EINA_TRUE);
          -next = evas_object_image_filled_add(canvas);
          -evas_object_image_file_set(next, "/path/to/next", NULL);
          -evas_object_image_preload(next, EINA_TRUE);
          -
          - -

          If you are loading an image which is too big, set its loading size smaller.

          - -

          Load a scaled down version of the image in the memory if that is the size you are displaying (this can speed up the loading considerably):

          -
          evas_object_image_load_scale_down_set(img, zoom);
          -

          If you know you are showing a sub-set of the image pixels, you can avoid loading the complementary data:

          -
          evas_object_image_load_region_set(img, x, y, w, h);
          -
          - -

          Specifying Borders

          -

          With Evas, you can specify image margins to be treated as borders. The margins then maintain their aspects when the image is resized. This makes setting frames around other UI objects easier. The following figure illustrates the border behavior, when the image is resized.

          - -

          Figure: Borders in Evas

          -

          Borders in Evas

          - - -

          Textblock Objects

          - -

          Unlike basic text objects, a textblock handles complex text, managing multiple styles and multiline text based on HTML-like tags. However, these extra features are heavier on memory and processing cost.

          -

          The textblock objects is an object that shows big chunks of text. Textblock supports many features, including text formatting, automatic and manual text alignment, embedding items (icons, for example). Textblock has three important parts: the text paragraphs, the format nodes and the cursors.

          -

          To set markup to format text, use for example <font_size=50>Big!</font_size>. Set more than one style directive in one tag with <font_size=50 color=#F00>Big and Red!</font_size>. Please note that we used </font_size> although the format also included color. This is because the first format determines the matching closing tag's name. You can use anonymous tags, such as <font_size=30>Big</>, which pop any type of format, but it is advisable to use the named alternatives instead.

          -

          Textblock supports the following formats:

          -
            -
          • font: Font description in fontconfig such as format, for example "Sans:style=Italic:lang=hi". or "Serif:style=Bold".
          • -
          • font_weight: Overrides the weight defined in "font". For example, "font_weight=Bold" is the same as "font=:style=Bold". The supported weights are "normal", "thin", "ultralight", "light", "book", "medium", "semibold", "bold", "ultrabold", "black", and "extrablack".
          • -
          • font_style: Overrides the style defined in "font". For example, "font_style=Italic" is the same as "font=:style=Italic". The supported styles are "normal", "oblique", and "italic".
          • -
          • font_width: Overrides the width defined in "font". For example, "font_width=Condensed" is the same as "font=:style=Condensed". The supported widths are "normal", "ultracondensed", "extracondensed", "condensed", "semicondensed", "semiexpanded", "expanded", "extraexpanded", and "ultraexpanded".
          • -
          • lang: Overrides the language defined in "font". For example, "lang=he" is the same as "font=:lang=he".
          • -
          • font_fallbacks: A comma delimited list of fonts to try if finding the main font fails.
          • -
          • font_size: The font size in points.
          • -
          • font_source: The source of the font, for example an eet file.
          • -
          • color: The text color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • underline_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • underline2_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • outline_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • shadow_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • glow_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • glow2_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • strikethrough_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • align: The text alignment in one of the following formats: "auto" (according to text direction), "left", "right", "center" or "middle", which take a value between 0.0 and 1.0 or a value between 0% to 100%.
          • -
          • valign: The vertical text alignment in one of the following formats: "top", "bottom", "middle", "center", "baseline" or "base", which take a value between 0.0 and 1.0 or a value between 0% to 100%.
          • -
          • wrap: The text wrap in one of the following formats: "word", "char", "mixed", or "none".
          • -
          • left_margin: Either "reset" or a pixel value indicating the margin.
          • -
          • right_margin: Either "reset" or a pixel value indicating the margin.
          • -
          • underline: The style of underlining in one of the following formats: "on", "off", "single", or "double".
          • -
          • strikethrough: The style of text that is either "on" or "off".
          • -
          • backing_color: The background color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • -
          • backing: The background color enabled or disabled: "on" or "off".
          • -
          • style: The style of the text in one of the following formats: "off", "none", "plain", "shadow", "outline", "soft_outline", "outline_shadow", "outline_soft_shadow", "glow", "far_shadow", "soft_shadow" or "far_soft_shadow". The direction is selected by adding "bottom_right", "bottom", "bottom_left", "left", "top_left", "top", "top_right" or "right". For example, "style=shadow,bottom_right".
          • -
          • tabstops: The pixel value for tab width.
          • -
          • linesize: To force a line size in pixels.
          • -
          • linerelsize: Either a floating point value or a percentage indicating the wanted size of the line relative to the calculated size.
          • -
          • linegap: To force a line gap in pixels.
          • -
          • linerelgap: Either a floating point value or a percentage indicating the wanted size of the line relative to the calculated size.
          • -
          • item: Creates an empty space that is filled by an upper layer. Use "size", "abssize", or "relsize" to define the item"s size, and an optional vsize = full/ascent to define the item's position in the line.
          • -
          • linefill: Either a float value or percentage indicating how much to fill the line.
          • -
          • ellipsis: A value between 0.0 and 1.0 to indicate the type of ellipsis, or -1.0 to indicate that an ellipsis is not wanted.
          • -
          • password: Either "on" or "off", this is used to specifically turn replacing chars with the password mode (that is, replacement char) on and off.
          • -
          - - -

          Clipping Objects

          - -

          Limiting Visibility

          -

          An Evas object can be clipped – in other words, its visible area is restricted with the clipper object.

          - -

          It is often necessary to show only parts of an object, and while it may be possible to create an object that corresponds only to the part that must be shown (which is not always possible), it is usually easier to use a clipper. A clipper is a rectangle that defines what is visible and what is not. The way to do this is to create a solid white rectangle (by default, so you need not use evas_object_color_set()) and give it a position and size of what is wanted visible. The following code exemplifies showing the center half of my_evas_object:

          -
          Evas_Object *clipper = evas_object_rectangle_add(evas_canvas);
          -evas_object_move(clipper, my_evas_object_x / 4, my_evas_object_y / 4);
          -evas_object_resize(clipper, my_evas_object_width / 2, my_evas_object_height / 2);
          -evas_object_clip_set(my_evas_object, clipper);
          -evas_object_show(clipper);
          -
          - -

          Layer of Color

          -

          A solid white clipper does not produce a change in the color of the clipped object, only hides what is outside the clipper's area. Changing the color of an object is accomplished by using a colored clipper. Clippers with color function by multiplying the colors of the clipped object. The following code shows how to remove all the red from an object.

          -
          Evas_Object *clipper = evas_object_rectangle_add(evas);
          -evas_object_move(clipper, my_evas_object_x, my_evas_object_y);
          -evas_object_resize(clipper, my_evas_object_width, my_evas_object_height);
          -evas_object_color_set(clipper, 0, 255, 255, 255);
          -evas_object_clip_set(obj, clipper);
          -evas_object_show(clipper);
          -
          - - -

          Mapping Objects

          - -

          Evas allows different transformations to be applied to all kinds of objects. These are applied by means of UV mapping. With UV mapping, one map points in the source object to a 3D space positioning at target. This allows rotation, perspective, scale, and many other effects depending on the map that is used.

          - -

          Creating a Map

          -

          A map consists of a set of points, but currently only four are supported. Each of these points contains a set of canvas coordinates x and y that are used to alter the geometry of the mapped object, and a z coordinate that indicates the depth of that point. This last coordinate does not normally affect the map, but is used by several of the utility functions to calculate the right position of the point given other parameters.

          -

          The coordinates for each point are set with evas_map_point_coord_set(map, index, x, y, z). In the example below, there is a rectangle whose coordinates are (100, 100) and (300, 300).

          -
          Evas_Object *object = evas_object_rectangle_add(evas);
          -evas_object_move(object, 100, 100);
          -evas_object_resize(object, 200, 200);
          -Evas_Map map = evas_map_new(4);
          -evas_map_point_coord_set(map, 0, 100, 100, 0);
          -evas_map_point_coord_set(map, 1, 300, 100, 0);
          -evas_map_point_coord_set(map, 2, 300, 300, 0);
          -evas_map_point_coord_set(map, 3, 100, 300, 0);
          -
          -

          There are functions to ease the process.

          -

          Use evas_map_util_points_populate_from_geometry(map, x, y, w, h, z), where the map coordinates are set to the given rectangle, and z is the coordinate in the Z axis, which is the same for all points.

          -
          Evas_Object *object = evas_object_rectangle_add(evas);
          -evas_object_move(object, 100, 100);
          -evas_object_resize(object, 200, 200);
          -Evas_Map map = evas_map_new(4);
          -evas_map_util_points_populate_from_geometry(map, 100, 100, 200, 200, 0);
          -
          - -

          You can also use evas_map_util_points_populate_from_object(map, object).

          -
          Evas_Object *object = evas_object_rectangle_add(evas);
          -evas_object_move(object, 100, 100);
          -evas_object_resize(object, 200, 200);
          -Evas_Map map = evas_map_new(4);
          -evas_map_util_points_populate_from_object(map, object);
          -
          - -

          You can also use evas_map_util_points_populate_from_object_full(map, object, z), where z is the coordinate in the Z axis, which is the same for all points.

          -
          Evas_Object *object = evas_object_rectangle_add(evas);
          -evas_object_move(object, 100, 100);
          -evas_object_resize(object, 200, 200);
          -Evas_Map map = evas_map_new(4);
          -evas_map_util_points_populate_from_object_full(map, object, 0);
          -
          - -

          Manual Point Setting

          -

          Several effects are applied to an object by setting each point of the map to the right coordinates. For example, a simulated perspective is achieved as follows.

          -
          evas_map_point_coord_set(map, 0, 300, 100, 0);
          -evas_map_point_coord_set(map, 1, 450, 120, 0);
          -evas_map_point_coord_set(map, 2, 450, 260, 0);
          -evas_map_point_coord_set(map, 3, 300, 300, 0);
          -
          - -

          The Z coordinate is not used when setting points by hand; thus its value is not important.

          - -

          Applying a Map

          -

          Regardless of the specific way you create a map, to apply it to a specific object, use

          -
          evas_object_map_set(object, map);
          -evas_object_map_enable_set(object, EINA_TRUE);
          -
          - -

          Basic Utility Functions

          -

          Evas provides utility functions for common transformations:

          -
            -
          • evas_map_util_rotate(map, angle, cx, cy): This performs a rotation of the angle degrees around the center point with the coordinates (cx, cy).
          • -
          • evas_map_util_zoom(map, zoomx, zoomy, cx, cy): This performs a zoomx and zoomy zoom in the X and Y directions respectively, with the center point with the coordinates (cx, cy).
          • -
          - -

          For example, the following code rotates an object around its center.

          -
          int x, y, w, h;
          -evas_object_geometry_get(object, &x, &y, &w, &h);
          -Evas_Map *map = evas_map_new(4);
          -evas_map_util_points_populate_from_object(map, object);
          -evas_map_util_rotate(map, 45, x + (w / 2), y + (h / 2));
          -evas_object_map_set(object, map);
          -evas_object_map_enable_set(object, EINA_TRUE);
          -evas_map_free(m);
          -
          - -

          The following code rotates an object around the center of the window.

          -
          int w, h;
          -evas_output_size_get(evas, &w, &h);
          -Evas_Map *map = evas_map_new(4);
          -evas_map_util_points_populate_from_object(map, object);
          -evas_map_util_rotate(map, 45, w / 2, h / 2);
          -evas_object_map_set(object, map);
          -evas_object_map_enable_set(object, EINA_TRUE);
          -evas_map_free(m);
          -
          - -

          3D Utility Functions

          -

          Evas provides utility functions for 3D transformations.

          -

          To make a 3D rotation, use evas_map_util_3d_rotate(map, anglex, angley, anglez, cx, cy, cz). With this code, you can set the Z coordinate of the rotation center, and the angles to rotate through around all axes.

          -

          Rotating in the 3D space does not look natural. A more natural look becomes by adding perspective to the transformation, which is done with evas_map_util_3d_perspective(map, px, py, z0, focal) on the map after its position has been set.

          - -
            -
          • px and py specify the "infinite distance" point in the 3D conversion, where all lines converge to.
          • -
          • z0 specifies the Z value at which there is a 1:1 mapping between spatial coordinates and screen coordinates: any points on this Z value do not have their X and Y coordinates modified in the transform, while those further away (Z value higher) shrink into the distance, and those less than this value expand.
          • -
          • focal determines the "focal length" of the camera: this is the distance in reality between the camera lens plane (the rendering results are undefined at or closer than this) and the z0 value; this function allows for some "depth" control.
          • -
          -

          Color and Lighting

          -

          Each point in a map can be set to a color, which is multiplied with the object's own color and linearly interpolated in between adjacent points. To do this, use evas_map_point_color_set(map, index, r, g, b, a) for each point of the map, or evas_map_util_points_color_set(map, r, g, b, a) to set every point into the same color.

          -

          To add lighting for the objects, which is useful with 3D transforms, use evas_map_util_3d_lighting(map, lightx, lighty, lightz, lightr, lightg, lightb, ambientr, ambientg, ambientb):

          -
            -
          • lightx, lighty and lightz are the local light source coordinates;
          • -
          • lightr, lightg and lightb are the local light source colors;
          • -
          • ambientr, ambientg and ambientb are the ambient light colors. Evas sets the color of each point based on the distance to the light source, the angle with which the object is facing the light and the ambient light. The orientation of each point is important. If the map is defined counter-clockwise, the object faces away from the user and becomes obscured, since no light does not reflect from it.
          • -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/evas_optimization_n.htm b/org.tizen.ui.guides/html/native/efl/evas_optimization_n.htm deleted file mode 100755 index 622b72f..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_optimization_n.htm +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - Optimizing Evas - - - - - - -
          -

          Optimizing Evas

          - -

          To optimize Evas:

          - - - -

          Using a Rectangle Object instead of a Solid Color Image

          -

          When you need a solid color object, it is better (more efficient) to use a rectangle object than the image.

          - - - - - - - - - - - - - - - - - - -
          Before
          -
          -image = elm_image_add(win);
          -snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          -elm_image_file_set(image, buf, NULL);
          -evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(win, image);
          -evas_object_show(image);
          -
          After
          -
          -rect = evas_object_rectangle_add(evas_object_evas_get(win));
          -evas_object_color_set(rect, 255, 255, 255, 255);
          -evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(win, rect);
          -evas_object_show(rect);
          -
          - - -

          Making an Object Invisible instead of Setting Alpha as 0

          - -

          To make an object invisible, it is more efficient to use evas_object_hide() instead of changing the alpha value to 0.

          - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -static void
          -_invisible_cb(void *data, Evas_Object *obj, void *ev)
          -{
          -   evas_object_color_set(obj, 0, 0, 0, 0);   
          -}
          -
          -
          -static void
          -_invisible_cb(void *data, Evas_Object *obj, void *ev)
          -{
          -   evas_object_hide(obj);   
          -}
          -
          - -

          Using evas_object_image for Maximum Optimization

          - -

          If you need maximum optimization, use evas_object_image instead of elm_image and elm_icon.

          - - - - - - - - - - - - - - - - - - -
          Before
          -
          -img = elm_image_add((parent);
          -snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          -elm_image_file_set(img, buf, NULL);
          -evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(img);
          -
          After
          -
          -img = evas_object_image_add(evas_object_evas_get(parent));
          -snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          -evas_object_image_file_set(img, buf, NULL);
          -evas_object_image_filled_set(img, EINA_TRUE);
          -evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(img);
          -
          - - -

          Setting the Parent to Avoid the Elementary Tree Reconstruction

          -

          Before creating an object, make sure that the relationship between parent and child is set correctly to avoid having to reconstruct later.

          - - - - - - - - - - - - - - - -
          BeforeAfter
          -
          -win = elm_win_add();
          -
          -scroller = elm_scroller_add(win);
          -
          -box = elm_box_add(win);
          -
          -button = elm_button_add(win);
          -
          -
          -win = elm_win_add();
          -
          -scroller = elm_scroller_add(win);
          -
          -box = elm_box_add(scroller);
          -
          -button = elm_button_add(box);
          -
          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/evas_rendering_n.htm b/org.tizen.ui.guides/html/native/efl/evas_rendering_n.htm deleted file mode 100755 index e265bf6..0000000 --- a/org.tizen.ui.guides/html/native/efl/evas_rendering_n.htm +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - - - - - Evas Rendering Concept and Method - - - - - -
          - -

          Evas Rendering Concept and Method

          - -

          Evas is a canvas display library. It is markedly different from most display and windowing systems as the canvas is structural and is also a state engine, whereas most display and windowing systems are immediate mode display targets. Evas handles the logic between a structural display via its state engine, and controls the target windowing system in order to produce rendered results of the current canvas' state on the display.

          -

          Immediate mode display systems retain very little or no state. A program executes a series of commands, as in the following pseudo code.

          -
          -draw line from position (0, 0) to position (100, 200);
          -
          -draw rectangle from position (10, 30) to position (50, 500);
          -
          -bitmap_handle = create_bitmap();
          -scale bitmap_handle to size 100 x 100;
          -draw image bitmap_handle at position (10, 30);
          -
          -

          The series of commands is executed by the windowing system and the results are typically displayed on the screen. Once the commands are executed, the display system does not know how to reproduce this image again, and has to be instructed by the application on how to redraw sections of the screen if needed. Each successive command is executed as instructed by the application and either emulated by software or sent to the graphics hardware on the device to be performed.

          -

          The advantage of such a system is that it is simple and gives a program tight control over how something looks and is drawn. Given the increasing complexity of displays and demands by users to have better looking interfaces, more work needs to be done at this level by the internals of UI component sets, custom display components and other programs. This means that more logic and display rendering code needs to be written again each time the application needs to figure out how to minimize redraws so that display is fast and interactive, and keep track of redraw logic.

          -

          For example, if in the scene below, the windowing system requires the application to redraw the area from 0, 0 to 50, 50 (also referred to as the "expose event"). Then the programmer calculates manually the updates and repaints it again.

          -
          -Redraw from position (0, 0) to position (50, 50):
          -
          -// What was in area (0, 0, 50, 50)?
          -
          -// 1. intersection part of line (0, 0) to (100, 200)?
          -   draw line from position (0, 0) to position (25, 50);
          -
          -// 2. intersection part of rectangle (10, 30) to (50, 500)?
          -   draw rectangle from position (10, 30) to position (50, 50)
          -
          -// 3. intersection part of image at (10, 30), size 100 x 100?
          -   bitmap_subimage = subregion from position (0, 0) to position (40, 20)
          -   draw image bitmap_subimage at position (10, 30);
          -
          - -

          If all elements in the above scene are opaque, the system is doing useless paints: part of the line is behind the rectangle, and part of the rectangle is behind the image. These useless paints tend to be very costly.

          -

          Evas is a structural system in which the programmer creates and manages display objects and their properties, and as a result of this higher level state management, the canvas is able to redraw the set of objects when needed to represent the current state of the canvas.

          -

          For example, see the following pseudo code.

          -
          -line_handle = create_line();
          -set line_handle from position (0, 0) to position (100, 200);
          -show line_handle;
          -
          -rectangle_handle = create_rectangle();
          -move rectangle_handle to position (10, 30);
          -resize rectangle_handle to size 40 x 470;
          -show rectangle_handle;
          -
          -bitmap_handle = create_bitmap();
          -scale bitmap_handle to size 100 x 100;
          -move bitmap_handle to position (10, 30);
          -show bitmap_handle;
          -
          -render scene;
          -
          - -

          This looks longer, but when the display needs to be refreshed or updated, the programmer only moves, resizes, shows, hides etc. the objects that need to change. The programmer thinks at the object logic level, and the canvas software does the rest of the work, figuring out what changed in the canvas since it was last drawn, how to most efficiently redraw the canvas and its contents to reflect the current state, and doing the actual drawing of the canvas.

          -

          This allows the programmer think in a more natural way when dealing with a display, and saves time and effort of working out how to load and display images, to render given the current display system etc. Since Evas is portable across different display systems, this gives the programmer the ability to port and display the code on different display systems with little work.

          -

          Evas is a display system somewhere between a UI component set and an immediate mode display system. It retains basic display logic, but does little high-level logic such as scrollbars, sliders, push buttons etc.

          - -

          For more information on the UI rendering modes (immediate and retained), see UI Rendering Mode.

          - - -

          Evas Engines Concept

          -

          Evas delegates most of the actual rendering work to its engines. Engines are the backends that Evas uses to render (primitive) objects on a canvas. The canvas can be the screen, or a buffer in the memory.

          -

          Evas can work with and provides multiple engines, such as (this list is non-exhaustive):

          -
            -
          • buffer: all the rendering takes place in a buffer
          • -
          • fb: the rendering takes place in the system's framebuffer
          • -
          • software_x11: this is the most used, using X11
          • -
          • gl_x11: this also renders to an X11 window, except that it uses OpenGL
          • -
          -

          These implement the rendering of all the basic objects by themselves, because they often can be accelerated by the hardware or backend software libraries to provide fast rendering.

          -

          If a particular engine does not have the provision for a certain primitive object, it reverts back to using a default software version.

          - -

          UI Rendering Mode

          - -

          Evas removes the need to know about the characteristics of your display system or what graphics calls are used to draw them and how. It deals on an object level where all you do is create and manipulate objects in a canvas, set their properties, and the rest is done for you. This rendering method is called the retained mode, whereas the immediate mode is an alternative rendering method.

          - -

          Immediate Mode

          - -

          The immediate mode is the most commonly used in graphics toolkit libraries, such as GTK+, GDI, and GDI+. The application is responsible for repainting the portion of the client area that is invalidated.

          - -

          Figure: Immediate mode

          -

          Immediate mode

          - -

          The application commands any drawing issues as it needs, and the display system draws some GUIs. After the drawing is done, it appears in the destination. This mode allows you to have a exact control over the render cycles. However, if the draw commands are misused, unnecessary drawing can be performed or drawing never happen at all.

          -

          The following example explains the common usage of the immediate mode:

          - -
          -void update()
          -{
          -   Image *img = load_image(NEW_IMG);
          -
          -   // Switch button image to new one
          -   update_button_image(img);
          -
          -   // Issue the invalidate area (button area) to be redrawn on the screen
          -   invalidate_area(button_x, button_y, button_w, button_h);
          -
          -   // Move rectangle from (200, 200) to (300, 300)
          -   int rect_prev_x = rect_x;
          -   int rect_prev_y = rect_y;
          -   rectangle_x = 300;
          -   rectangle_y = 300;
          -   set_rect_position(rect_x, rect_y);
          -   
          -   // Issue the invalidate area (changed area) to be redrawn on the screen
          -   int diff_x = rect_x – rect_prev_x;
          -   int diff_y = rect_y – rect_prev_y;
          -   invalidate_area(rect_prev_x, rect_prev_y, (rect_w + diff_x), (rect_h + diff_y));
          -
          -
          -   // After setting the invalidate area, request rendering to update the screen
          -   render();
          -
          -   // Now you can see how the button image and rectangle position are changed
          -}
          -
          - -

          Retained Mode

          - -

          A graphics system adopting the retained mode is basically responsible for responding to all repaint requests for rendering the application objects. Clients do not directly cause actual rendering, but objects are redrawn when parts of them are updated.

          - -

          Figure: Retained mode

          -

          Retained mode

          - -

          Since Evas works with the retained mode, there is no need to command any drawings. The following example shows how to write a GUI code with Evas for your application:

          - -
          -void create_image()
          -{
          -   // Initialize an image object to be displayed on the screen
          -   Evas_Object *img = evas_object_image_add(e);
          -
          -   // Set image resource
          -   evas_object_image_file_set(img, IMG, NULL);
          -
          -   // Set image position 
          -   evas_object_move(img, 100, 100);
          -
          -   // Set image size
          -   evas_object_resize(img, 200, 200);
          -
          -   // Set image visibility (show or hide)
          -   evas_object_show(img);
          -}
          -
          -void create_rectangle()
          -{
          -   // Initialize an rectangle object to be displayed on the screen
          -   Evas_Object *rect = evas_object_rectangle_add(e);
          -
          -   // Set rectangle color
          -   evas_object_color_set(rect, 255, 0, 0, 255);
          -
          -   // Set rectangle position
          -   evas_object_move(rect, 200, 200);
          -
          -   // Set rectangle size
          -   evas_object_resize(rect, 200, 200);
          -
          -   // Set rectangle visibility (show or hide)
          -   evas_object_show(rect);
          -}
          -
          - -

          A few main loops later you can replace the image with another one and move the rectangle. You only need to set a new image file to the image object and move the rectangle object. Evas computes the invalidate area and redraws the image and rectangle behind the application when it's on rendering time.

          - -
          -void update()
          -{
          -   // Set new image resource
          -   elm_image_file_set(img, NEW_IMG, NULL);
          -
          -   // Set new rectangle position
          -   evas_object_move(rect, 300, 300);
          -}
          -
          - -

          Evas Rendering

          - -

          Tizen Native applications work on the ecore main loop, and the loop goes on a few steps for every frame. Evas redraws some changes in the objects when the main loop goes to the idle enterer step. If there are no changes, Evas rendering is skipped. Otherwise, Evas calculates any changed portions of all display objects and redraws them.

          - -

          Figure: Evas rendering in the main loop

          -

          Evas rendering in the main loop

          - -

          To minimize the rendering, Evas tracks the states of all display objects, such as position, size, visibility, and color. Even if some of these states are changed but the object is hidden by other obscured objects, it is not redrawn. In other words, Evas draws only the necessary changes in the screen.

          - -

          The following figures illustrate how Evas redraws the changed area:

          - -
          • In the first example, there is a blue-color background object (a sky-blue color rectangle) and a partially hidden cloud image object. Above them, there are a red and green rectangle, and the "Hello out there" text is printed on the green rectangle.

            - -

            Figure: Evas redrawing example 1

            -

            Evas redrawing example 1

          • - -
          • In the second example, some of the objects have moved (the cloud image is moved to right and the green rectangle is moved downwards).

            - -

            Figure: Evas redrawing example 2

            -

            Evas redrawing example 2

          • - -
          • As a result, the third example illustrates some regions that require updates.

            - -

            Figure: Evas redrawing example 3

            -

            Evas redrawing example 3

          • - -
          • Evas decides which portions are invalid and to be redrawn. The fourth example shows the cleaned portion of the screen, which is the redrawn area.

            -

            Evas redraws the content only in the redrawn portions.

            -

            Figure: Evas redrawing example 4

            -

            Evas redrawing example 4

          • - -
          • Finally, the fifth example shows how the screen is updated and the result is visible.

            - -

            Figure: Evas redrawing example 5

            -

            Evas redrawing example 5

            - -

            If Evas worked in an immediate mode style, the application would need to calculate the changed areas themselves, adding extra work. With Evas, you can let Evas figure out the updates and you can yourself concentrate on the application and UI core and logic.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/event_handling_n.htm b/org.tizen.ui.guides/html/native/efl/event_handling_n.htm deleted file mode 100755 index 03dc326..0000000 --- a/org.tizen.ui.guides/html/native/efl/event_handling_n.htm +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - Event Handling: Managing the Event Flow - - - - - -
          - -

          Event Handling: Managing the Event Flow

          - -

          The EFLs rely on events and callbacks. In case of an event, (for example, a key press, mouse click or a battery running low), the mainloop calls the callback functions that are associated to that specific event. After the callbacks have finished, the mainloop takes over and waits for new events, upon which to trigger new callbacks.

          -

          It is important to do light work in the callbacks and to return to the mainloop relatively quickly. If there is heavy work to do, it is best to use an asynchronous mechanism like Ecore_con for network I/O or threads for CPU-intensive tasks. Failure to return quickly to the mainloop blocks the application's UI and it appears frozen.

          - -

          EFL Event Types

          -

          There are several event types in the EFLs, and their use depends on the level of the event. The event types from lower- to higher-level are:

          -
            -
          • Evas smart events are the most often used and take place on collections of evas objects (which are most typically handled). They are called "smart" because they have internal logic and can define their own events while other event types are fixed.
          • -
          • Ecore events are the lowest-level events and come directly from the system. Except for application-wide shortcuts, it is not advisable to use them.
          • -
          • Evas object events concern the objects that are on the canvas.
          • -
          • Evas events are events on the graphical canvas as a whole. They are fairly low-level and mostly useful when drawing directly on the canvas.
          • -
          - -

          Figure: Event types in the EFLs: Inner boxes are more specific than outer ones

          -

          Event types in the EFLs: Inner boxes are more specific than outer ones

          - - - - - - - - - - - - -
          Note
          There are also Edje signals, which come from program sections in themes; they can be used from high-level Elementary APIs or a low-level Edje API.
          - -

          Basic Event Flow

          -

          A realistic scenario involving various types of events is an application showing a button, which triggers the download of a file to be processed. There are progress bars for the operations.

          -

          Create the window, create a box, set it vertical and add a button and two progress bars. At first, only the button is fully visible.

          -

          When the user clicks on the button, an evas smart object event named "clicked" is emitted. The callback then starts the download in Ecore_con, displays the first progress bar and adds a callback to monitor the download progress. When the download progress changes, the callback updates the progress bar.

          -

          After the download is finished, the second progress bar is displayed and the file processing is offloaded to another thread through Ecore_thread. The processing function regularly updates the progress bar (wrapped in ecore_main_loop_thread_safe_call_async() because GUI operations are not thread-safe).

          -

          Events enable operations taking more than a few milliseconds' time to be executed outside of the mainloop, therefore not blocking UI redraws.

          -

          Below is an illustration for the event flow that follows a click on the screen.

          - -

          Figure: Event flow for a user click

          -

          Event flow for a user click

          - - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/event_types_n.htm b/org.tizen.ui.guides/html/native/efl/event_types_n.htm deleted file mode 100755 index 31182d5..0000000 --- a/org.tizen.ui.guides/html/native/efl/event_types_n.htm +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - - - - - - - - Event Types - - - - - -
          - -

          Event Types

          - -

          EFL provides various event types that you can use to monitor and react to user interactions and system events in the UI.

          - -

          Ecore Events

          - -

          Ecore events are used for low-level handling of events, such as key presses, network connections, and communication with sub-processes. In case of shortcuts, the low-level handling of key presses is particularly useful: instead of adding a signal handler to a specific graphical element, you can add one globally to guarantee that no matter which UI component is currently receiving events, the shortcut is caught correctly.

          -

          Ecore events can also be used to implement new graphical back-ends. However, they are low-level and not useful for most applications.

          - -

          In addition to using predefined Ecore events, you can create your own events with the ecore_event_type_new() function. The function generates a new unique identifier, which you can use as the event type parameter when managing your events and event handlers.

          - - -

          Shortcut Events

          - -

          The following Ecore events are available for shortcuts. The event callbacks receive additional data through a void * object, whose type depends on the received event.

          - -
            -
          • ECORE_EVENT_KEY_DOWN and ECORE_EVENT_KEY_UP events: -
            -typedef struct _Ecore_Event_Key Ecore_Event_Key;
            -
            -struct _Ecore_Event_Key 
            -{
            -   const char *keyname;
            -   const char *key;
            -   const char *string;
            -   const char *compose;
            -   Ecore_Window window;
            -   Ecore_Window root_window;
            -   Ecore_Window event_window;
            -
            -   unsigned int timestamp;
            -   unsigned int modifiers;
            -
            -   int same_screen;
            -};
            -
            - -
          • - -
          • ECORE_EVENT_MOUSE_BUTTON_DOWN and ECORE_EVENT_MOUSE_BUTTON_UP events: -
            typedef struct _Ecore_Event_Mouse_Button Ecore_Event_Mouse_Button;
            -struct _Ecore_Event_Mouse_Button 
            -{
            -   Ecore_Window window;
            -   Ecore_Window root_window;
            -   Ecore_Window event_window;
            -
            -   unsigned int timestamp;
            -   unsigned int modifiers;
            -   unsigned int buttons;
            -   unsigned int double_click;
            -   unsigned int triple_click;
            -   int same_screen;
            -
            -   int x;
            -   int y;
            -   struct 
            -   {
            -      int x;
            -      int y;
            -   } root;
            -
            -   struct 
            -   {
            -      // 0 if normal mouse, 1+ for other mouse-devices (such as multi-touch - other fingers)
            -      int device; 
            -      // Radius of press point - radius_x and radius_y if it is an ellipse (radius is the average of the 2)
            -      double radius, radius_x, radius_y; 
            -      // Pressure - 1.0 == normal, > 1.0 == more, 0.0 == none
            -      double pressure; 
            -      // Angle relative to perpendicular (0.0 == perpendicular), in degrees
            -      double angle; 
            -      // Same as x, y, root.x, root.y, but with sub-pixel precision, if available
            -      double x, y; 
            -      struct 
            -      {
            -         double x;
            -         double y;
            -      } root;
            -   } multi;
            -};
            -
            - -
          • -
          • ECORE_EVENT_MOUSE_MOVE and ECORE_EVENT_MOUSE_WHEEL events: -
            -typedef struct _Ecore_Event_Mouse_Wheel Ecore_Event_Mouse_Wheel;
            -struct _Ecore_Event_Mouse_Wheel 
            -{
            -   Ecore_Window window;
            -   Ecore_Window root_window;
            -   Ecore_Window event_window;
            -
            -   unsigned int timestamp;
            -   unsigned int modifiers;
            -
            -   int same_screen;
            -   int direction;
            -   int z;
            -
            -   int x;
            -   int y;
            -   struct 
            -   {
            -      int x;
            -      int y;
            -   } root;
            -};
            -
            -
          • -
          • ECORE_EVENT_MOUSE_IN and ECORE_EVENT_MOUSE_OUT events: -
            -typedef struct _Ecore_Event_Mouse_Move Ecore_Event_Mouse_Move;
            -struct _Ecore_Event_Mouse_Move 
            -{
            -   Ecore_Window window;
            -   Ecore_Window root_window;
            -   Ecore_Window event_window;
            -
            -   unsigned int timestamp;
            -   unsigned int modifiers;
            -
            -   int same_screen;
            -
            -   int x;
            -   int y;
            -   struct 
            -   {
            -      int x;
            -      int y;
            -   } root;
            -
            -   struct 
            -   {
            -      // 0 if normal mouse, 1+ for other mouse-devices (such as multi-touch - other fingers)
            -      int device; 
            -      // Radius of press point - radius_x and radius_y if it is an ellipse (radius is the average of the 2)
            -      double radius, radius_x, radius_y; 
            -      // Pressure - 1.0 == normal, > 1.0 == more, 0.0 == none
            -      double pressure; 
            -      // Angle relative to perpendicular (0.0 == perpendicular), in degrees
            -      double angle; 
            -      // Same as x, y, root.x, root.y, but with sub-pixel precision, if available
            -      double x, y; 
            -      struct 
            -      {
            -         double x, y;
            -      } root;
            -   } multi;
            -};
            -
            - -
          • -
          -

          Managing Ecore Event Handlers

          - -

          To manage Ecore event handlers:

          - -
          1. To add an Ecore event handler, register a callback for a specific event with the ecore_event_handler_add() function. -

            The function takes as parameters the event type (such as ECORE_EVENT_KEY_DOWN for key presses), callback function, and additional data delivered to the callback. The function returns an event handler pointer, which you can use to remove the handler later.

          2. - -
          3. Define the Ecore_Event_Handler_Cb() callback function. -

            The function takes as parameters the additional data defined in the ecore_event_handler_add() function parameters, the event type, and the event object (Ecore_Event_Key, Ecore_Event_Mouse_Button, Ecore_Event_Mouse_Wheel, or Ecore_Event_Mouse_Move). The function returns ECORE_CALLBACK_PASS_ON to allow other callbacks for that event be called, or ECORE_CALLBACK_DONE to not call them.

          4. - -
          5. When no longer needed, remove the event handler with the ecore_event_handler_del() function, using the event handler pointer as a parameter.
          - -

          The following example shows how you can set a global variable to EINA_TRUE when the Ctrl key is pressed:

          -
          -Eina_Bool ctrl_pressed = EINA_FALSE;
          -
          -static Eina_Bool
          -_key_down_cb(void *data __UNUSED__, int type __UNUSED__, void *ev)
          -{
          -   // The callback is used with the ECORE_EVENT_KEY_DOWN signal: the
          -   // parameter "void *ev" is therefore of the actual type Ecore_Event_Key
          -   // The following renders its fields accessible
          -   Ecore_Event_Key *event = ev;
          -
          -   // Test whether the key that is pressed is Ctrl.
          -   if (!strcmp("Control_L", event->key))
          -   {
          -      // If it is, store that piece of information
          -      ctrl_pressed = EINA_TRUE;
          -   }
          -
          -   // Let the event continue to other callbacks which have not been called yet
          -   return ECORE_CALLBACK_PASS_ON;
          -}
          -
          -ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
          -
          - -

          Sending Ecore Events to the Main Loop

          - -

          You can send Ecore events to the main loop yourself to handle actions of various origins through the same codepath. This is a thread-safe operation.

          -

          To send an event, use the ecore_event_add() function. The function takes as parameters the event type (such as ECORE_EVENT_KEY_DOWN for key presses), additional data delivered to the callback, the Ecore_End_Cb() function used to free the additional data after it is deliver to the callback function, and the pointer to additional data delivered to the free function. The free function and the pointer to its additional data are optional; use NULL if you do not need them.

          - - -

          Edje Events

          - -

          Edje themes have small program sections, which are triggered upon the reception of a signal that can execute actions, such as changing the state of an Edje part and running another program.

          - -

          Managing a Single Signal Emitter

          -

          The following example shoes a program section. The program is called "change_color", it is triggered on mouse clicks on the current part, and it emits a "got.a.click" signal where the source is set to "color_changer".

          -
          program 
          -{
          -   name: "change_color";
          -   signal: "mouse,clicked,*";
          -   source: "*";
          -   action: SIGNAL_EMIT "got.a.click" "color_changer";
          -}
          -
          - -

          To catch the emitted signal from the C side, use either the edje_object_signal_callback_add() or elm_object_signal_callback_add() function. Their only difference is that the previous one operates on an Edje object and the latter one on an Elementary object. Unless you do not use the Elementary library at all, use the Elementary variant.

          - -

          Both the functions take as parameters the object emitting the signal, the signal name ("*" acts as a wildcard), the signal source, the Edje_Signal_Cb() callback function called when the signal name and source match, and additional data delivered to the callback. For the signal name and source, "*" acts as a wildcard. The additional data is optional; use NULL if you do not need it.

          - -

          The callback function takes as parameters the additional data defined in the edje_object_signal_callback_add() or elm_object_signal_callback_add() function parameters, the object emitting the signal, the signal name, and the signal source.

          - - -

          Managing Multiple Signal Emitters in Layouts

          - -

          Most of the time, Edje and Elementary are used together. In particular, you can define a group in Edje and use it as a layout (containing several parts) in Elementary. The layouts enable you to perform theming and object placement in Edje while benefiting from the higher-level functions of Elementary.

          -

          Since the layout contains multiple parts, you cannot use the elm_object_signal_callback_add() and edje_object_signal_callback_add() functions, as they require a single emitter object. The solution is to use the dedicated elm_layout_signal_callback_add() function.

          - -

          The elm_layout_signal_callback_add() function works similarly as the elm_object_signal_callback_add() and edje_object_signal_callback_add() functions. The only difference is the type of the object in the first parameter. For elm_layout_signal_callback_add(), it is a pointer to an Evas_Object, which is obtained through the elm_layout_add() function. For more information, see Layout.

          - - -

          Evas Events

          - -

          Evas events happen on a canvas as a whole. These events are too low-level for writing applications and are mostly used when writing the graphical toolkit itself.

          - -

          The following Evas event types are available:

          - -
            -
          • EVAS_CALLBACK_RENDER_FLUSH_PRE: Rendering on the canvas is about to be updated.
          • -
          • EVAS_CALLBACK_RENDER_FLUSH_POST: Rendering on the canvas is updated.
          • -
          • EVAS_CALLBACK_CANVAS_FOCUS_IN: Canvas receives focus.
          • -
          • EVAS_CALLBACK_CANVAS_FOCUS_OUT: Canvas loses focus.
          • -
          • EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN: Any object on the canvas receives focus. -

            Instead of this event type, use the EVAS_CALLBACK_FOCUS_IN type with the evas_object_event_callback_add() function.

          • -
          • EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT: Any object on the canvas loses focus. -

            Instead of this event type, use the EVAS_CALLBACK_FOCUS_OUT type with the evas_object_event_callback_add() function.

          • -
          • EVAS_CALLBACK_RENDER_PRE: Rendering on the canvas starts.
          • -
          • EVAS_CALLBACK_RENDER_POST: Rendering on the canvas finishes.
          • -
          - -

          To register the event handler, use the evas_event_callback_add() function. The function takes as parameters the Evas canvas on which the event happens (to obtain the canvas, use the Evas_Object through the evas_object_evas_get() function), the event type, the Evas_Event_Cb callback function, and the pointer to the additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          - -

          The callback function takes as parameters the additional data defined in the evas_event_callback_add() function parameters, the canvas where the event happened, and the event info data, which depends on the object type and the event at play.

          - - -

          Evas Object Events

          - -

          Each Evas object on a specific Evas canvas can be manipulated independently. Each object can send events, which you can handle by registering callback functions for them. The events all relate to single objects, not the whole canvas.

          - -

          The following Evas object event types are available:

          -
            -
          • EVAS_CALLBACK_MOUSE_IN: Pointer got over an object (with no other object between the 2). This takes place no matter how the pointer becomes directly above the object. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • -
          • EVAS_CALLBACK_MOUSE_OUT: Triggered similarly to the EVAS_CALLBACK_MOUSE_IN event, but when the pointer goes outside the object area. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Out struct.
          • -
          • EVAS_CALLBACK_MOUSE_DOWN: Mouse button is pressed while the object is receiving events (either because the pointer is on top of the object or because the object had focus). The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Down struct.
          • -
          • EVAS_CALLBACK_MOUSE_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Up struct.
          • -
          • EVAS_CALLBACK_MOUSE_MOVE: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Move struct.
          • -
          • EVAS_CALLBACK_MOUSE_WHEEL: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Wheel struct.
          • -
          • EVAS_CALLBACK_MULTI_DOWN: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Down struct.
          • -
          • EVAS_CALLBACK_MULTI_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Up struct.
          • -
          • EVAS_CALLBACK_MULTI_MOVE: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Move struct.
          • -
          • EVAS_CALLBACK_KEY_DOWN: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Key_Down struct.
          • -
          • EVAS_CALLBACK_KEY_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Key_Up struct.
          • -
          • EVAS_CALLBACK_FOCUS_IN: Object gained focus. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • -
          • EVAS_CALLBACK_FOCUS_OUT: Object lost focus. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • -
          • EVAS_CALLBACK_SHOW: Object is shown by a call to the evas_object_show() function. The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_HIDE: Object is hidden by a call to the evas_object_hide() function. The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_MOVE: Object origin was moved (origin is the top-left corner at the creation time of the object). The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_RESIZE: Object is resized. The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_RESTACK: Object is re-stacked by the evas_object_stack_below() or evas_object_stack_above() function, or other events. The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_DEL: Object is deleted.
          • -
          • EVAS_CALLBACK_FREE: For internal use only. Do not use (the object resources are about to be freed). The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_HOLD: For internal use only. The event info parameter in the callback is a pointer to an Evas_Event_Hold struct.
          • -
          • EVAS_CALLBACK_CHANGED_SIZE_HINTS: Object size hints changed.
          • -
          • EVAS_CALLBACK_IMAGE_PRELOADED: Image preloaded through the evas_object_image_preload() function is loaded. The event info parameter in the callback is NULL.
          • -
          • EVAS_CALLBACK_IMAGE_UNLOADED: Image data is unloaded. The event info parameter in the callback is NULL.
          • -
          - -

          To register the callback, use the evas_event_callback_add() function. The function takes as parameters the object to which the callback is attached, the event type, the Evas_Object_Event_Cb callback function, and the pointer to the additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          - -

          The callback function takes as parameters the additional data defined in the evas_event_callback_add() function parameters, the canvas where the event happened, the object to which the event happened, and the event info data, which depends on the object type and the event at play.

          - -

          When no longer needed, remove the callback with the evas_object_event_callback_del() function.

          - - -

          Evas Smart Object Events

          - -

          Evas smart object events are the most widely-used type of events in graphical applications, since they are used for signals, such as "clicked", "clicked,double" (double-click), and "pressed". They are identified by strings, and each smart object is able to define its own events (although the names follow conventions).

          - -

          Managing Evas Smart Object Event Handlers

          - -
          1. To add an Evas Smart Object event handler, register a callback for a specific event to an object with the evas_object_smart_callback_add() function. -

            The function takes as parameters the object to which the callback is added, the event name, the callback function, and additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          2. - -
          3. Define the Evas_Smart_Cb() callback function. -

            The function takes as parameters the additional data defined in the evas_object_smart_callback_add() function parameters, the object to which the event happened, and the event info data, which depends on the object type and the event at play.

            -

            If some of the parameters are not used by the callback function, the compiler can raise the "unused parameter" warning. To avoid it, annotate the parameter with the __UNUSED__ macro, which is a compiler-independent way to let the compiler know that the parameter is unused willingly, rather than by a mistake:

            -
            void cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__);
            -
          4. - -
          5. When no longer needed, remove the event handler with the evas_object_smart_callback_del() function. -

            The function removes the first match for the given event and callback, and returns the data pointer that was used in the corresponding call to the evas_object_smart_callback_add() function.

          - -

          The following example shows the _button_clicked() function and sets it as the callback for the clicked event of an Evas_Object button:

          - -
          -static void
          -_button_clicked(void *data, Evas_Object *obj, void *event_info)
          -{
          -   // Insert function body here
          -}
          -
          -static void
          -some_function(void) 
          -{
          -   // Code to build the window object
          -   Evas_Object *button = elm_button_add(window);
          -   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          -}
          -
          - -

          For a specific object and event, callbacks are called in the order they have been registered. The evas_object_smart_callback_add() function does not execute any special processing, if it is called several times with the same callback function or data. Callbacks are called as many times as they have been added and in the order they have been added.

          - - - -

          Evas Smart Object Event Handling Examples

          - -

          The following example shows a button with a callback for the "clicked" signal:

          - -
          static void
          -_button_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
          -{
          -   fprintf(stdout, "Button clicked.\n");
          -   fflush(stdout);
          -   elm_exit();
          -}
          -
          -static void
          -_add_button(Evas_Object *window) 
          -{
          -   Evas_Object *button;
          -
          -   button = elm_button_add(window);
          -   elm_object_text_set(button, "Click Me To Exit!");
          -   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          -
          -   evas_object_show(button);
          -}
          -
          - -

          The following example shows a button with a callback for the "clicked" signal. Clicking the button removes the callback:

          - -
          static void
          -_button_clicked(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
          -{
          -   fprintf(stdout, "Button clicked.\n");
          -   fflush(stdout);
          -   evas_object_smart_callback_del(obj, "clicked", _button_clicked);
          -}
          -
          -static void
          -_add_button(Evas_Object *window) 
          -{
          -   Evas_Object *button;
          -
          -   button = elm_button_add(window);
          -   elm_object_text_set(button, "Click Me!");
          -   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          -
          -   evas_object_show(button);
          -}
          -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/font_setting_n.htm b/org.tizen.ui.guides/html/native/efl/font_setting_n.htm deleted file mode 100755 index d78572f..0000000 --- a/org.tizen.ui.guides/html/native/efl/font_setting_n.htm +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - - - - - - Fonts: Setting Application Text Fonts - - - - - -
          - -

          Fonts: Setting Application Text Fonts

          - - -

          Tizen provides various methods for setting fonts of the application text. Basically, all UI components have a default font, which can be changed according to the system settings.

          - -

          The font handling methods include:

          - -
            -
          • Setting the font for a UI component using the Elementary Fonts API (in mobile and wearable applications)
          • -
          • Setting the font using EDC
          • -
          • Changing the font and text size using the Edje Class: Text API (in mobile and wearable applications) - -

            In the application, you can set a system-wide font and font size to text(textblock) parts with text classes (except tizen). When the system applies a new system-wide font and font size to the application, the font size of text(textblock) parts with the tizen text class are not affected.

            -

            The following words in the text_class definition are reserved for the system:

            - -
              -
            • button
            • -
            • label
            • -
            • entry
            • -
            • title_bar
            • -
            • list_item
            • -
            • grid_item
            • -
            • toolbar_item
            • -
            • menu_item
            • -
            • tizen
            • -
            - - -

            Set a specific ratio to a given font size for each object through the text class. If you give a negative value as font size, it is used as the percentage of the originally given font size. The following example code show set the font size as 150% of the given font size.

            -
            -elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", -150);
            -elm_config_font_overlay_apply();
            -
            -
          • -
          - - -

          You can also set your own font.

          - -

          Applying System Font Settings

          - -

          Tizen provides a special "Tizen" font name. The "Tizen" font name does not match with any specific font; it is just an alias for a system-defined font (system font). When you create a text(textblock) part with the "Tizen" font name in the application's EDC, the system font is loaded into the user application when those objects are created. Additionally, you can apply the system font to a text or textblock part by using the text class, as described above.

          - -

          The following EDC example shows how to apply the system font to a TEXT or TEXTBLOCK part by using the "Tizen" font name and the tizen text class. As font name is "Tizen" and the font size is set to 36, the system font is loaded in size 36. If the system setting changes, this part loads the new system font. However, its font size is not changed, because the text class is tizen.

          - -
          -description 
          -{
          -   text 
          -   {
          -      font: "Tizen:style=Regular";
          -      font_size: 36;
          -      text_class: "tizen";
          -   }
          -}
          - -

          If the part has a predefined text classes other than tizen, its font size is resized as well.

          - -
          -description 
          -{
          -   text 
          -   {
          -      font: "Tizen:style=Regular";
          -      font_size: 36;
          -      text_class: "label";
          -   }
          -}
          - - -

          Supported Font Styles

          -

          The font styles supported by the EFL are listed in the following table.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Supported font styles
          Font featureStyle attribute
          font_stylenormal
          oblique
          italic
          font_widthnormal
          ultracondensed
          extracondensed
          condensed
          semicondensed
          semiexpanded
          expanded
          extraexpanded
          ultraexpanded
          font_weightnormal
          thin
          ultralight
          light
          book
          medium
          semibold
          bold
          ultrabold
          black
          extrablack
          - -

          The style attributes are not case-sensitive (however, the font feature names are).

          -

          If you set the weight or width attribute to style=, it is processed to the right attribute.

          -
          -font=TizenSans:style=Bold // Textblock
          -"TizenSans:style=Bold"; // Text font
          -<font=TizenSans:style=Bold> // Markup tag
          -
          - -

          You can also use each attribute separately:

          - -
          -font=TizenSans font_style=Regular font_weight=Bold // Textblock
          -<font=TizenSans font_style=Regular font_weight=Bold> // Markup tag
          -
          - - -

          Setting the Font for a UI Component

          - -

          You can use the Elementary Fonts API (in mobile and wearable applications) to set the font for an application.

          -

          To set a font for a UI component:

          -
            -
          • Set the font for a common UI component: - - - - - - - - - - -
            Note
            You can set the font for a textblock in the code, but not in EDC (Edje Data Collection). If you add markup tags for the font inside the text, you can change the font of the text. However, you cannot set the font for a text part in this way because the TEXT type does not support markup tags.
            - -
            -char *buf = "<font=Sans:style=Regular font_size=50>Hello</font/>Font";
            -elm_object_part_text_set(layout, "textblock1", buf);
            -
            -
          • -
          • Set the font for an entry component (in mobile and wearable applications) using the elm_entry_text_style_user_push() function. It overrides the default style of the entry component for each attribute. - - - - - - - - - - -
            Note
            The elm_entry_text_style_user_push() function only affects the main text of the UI component. To change the font of the guide text, you have to add markup tags.
            -
            -char *user_style = "DEFAULT='font=Sans:style=Regular font_size=40'";
            -elm_entry_text_style_user_push(entry, user_style);
            -elm_object_part_text_set(entry, "elm.guide",
            -   "<font=Sans:style=Regular font_size=40>Guide Text</font>");
            -
            -
          • -
          - -

          Setting the Font Using EDC

          - -

          To create a layout with text using the EDC, you can set the font for each text part or textblock:

          -
            -
          • Set the font of a text part using the font family name and a specific style of the font family: -
            -part 
            -{ 
            -   name: "text";
            -   type: TEXT;
            -   scale: 1;
            -   description 
            -   { 
            -      state: "default" 0.0;
            -      rel1.relative: 0.0 0.5;
            -      rel2.relative: 0.5 1.0;
            -      color: 0 136 170 255;
            -      color2: 0 136 170 50;
            -      color3: 0 136 170 25;
            -      text 
            -      {
            -         size: 25;
            -         font: "Sans:style=Bold";
            -         text: "Enventor";
            -         align: 0.5 0.5;
            -      }
            -   }
            -}
            -
            -
          • - -
          • Add style information, which can be used for multiple textblock parts: -
            -styles 
            -{
            -   style 
            -   { 
            -      name: "textblock_style1";
            -      base: "font=Sans:style=Regular font_size=30";
            -   }
            -}
            -
            -part 
            -{ 
            -   name: "textblock";
            -   type: TEXTBLOCK;
            -   scale: 1;
            -   description 
            -   { 
            -      state: "default" 0.0;
            -      align: 0.5 0.5;
            -      fixed: 0 0;
            -      min: 0 0;
            -      visible: 1;
            -      text.text: "TEXTBLOCK";
            -      text.style: "textblock_style1";
            -      rel1.relative: 0.16 0.18;
            -      rel2.relative: 0.88 0.38;
            -   }
            -}
            -
            -
          • -
          - -

          Using the Edje Text Class

          - -

          You can use the Edje Class: Text API (in mobile and wearable applications) to change multiple text occurrences as a batch. If you set a new font or font size to a text class, the change is applied to multiple objects.

          - - - - - - - - - - -
          Note
          Note that the text_class cannot be used in a UI component with markup text or the elm_entry_text_style_user_push() function. You must set the text_class in EDC.
          - - -

          To set the text class, you can use reserved words for text class, but you can also make your own text class:

          - -
            -
          • Set a class for a text part: - -
            -part 
            -{ 
            -   name: "text";
            -   type: TEXT;
            -   scale: 1;
            -   description 
            -   { 
            -      state: "default" 0.0;
            -      rel1.relative: 0.0 0.5;
            -      rel2.relative: 0.5 1.0;
            -      color: 0 136 170 255;
            -      color2: 0 136 170 50;
            -      color3: 0 136 170 25;
            -      text 
            -      {
            -         size: 25;
            -         font: "Sans:style=Bold";
            -         text: "Enventor";
            -         align: 0.5 0.5;
            -         text_class: "my_class";
            -      }
            -   }
            -}
            -
            -
          • -
          • Set a class for a textblock: -
            -styles 
            -{
            -   style 
            -   { 
            -      name: "textblock_style1";
            -      base: "font=Sans:style=Regular font_size=30 ... text_class=my_class";
            -   }
            -}
            -
            -part 
            -{ 
            -   name: "textblock";
            -   type: TEXTBLOCK;
            -   scale: 1;
            -   description 
            -   { 
            -      state: "default" 0.0;
            -      align: 0.5 0.5;
            -      fixed: 0 0;
            -      min: 0 0;
            -      visible: 1;
            -      text.text: "TEXTBLOCK";
            -      text.style: "textblock_style1";
            -      rel1.relative: 0.16 0.18;
            -      rel2.relative: 0.88 0.38;
            -   }
            -}
            -
            -
          • -
          • -

            You can handle font and font style per text_class. If you set your own text_class in the EDC, you can change the font and font size:

            - -
            -elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", 30);
            -elm_config_font_overlay_apply();
            -
            -
          • -
          • -

            Set a specific ratio to a given font size for each object through the text class. If you give a negative value as font size, it is used as the percentage of the originally given font size. The following example code show set the font size as 150% of the given font size.

            -
            -elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", -150);
            -elm_config_font_overlay_apply();
            -
            -
          • -
          - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/form_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/form_tutorial_n.htm deleted file mode 100755 index f4487a5..0000000 --- a/org.tizen.ui.guides/html/native/efl/form_tutorial_n.htm +++ /dev/null @@ -1,316 +0,0 @@ - - - - - - - - - - - - - - Creating a Form for a Basic Application Layout - - - - - - -
          -

          Creating a Form for a Basic Application Layout

          - - -

          This tutorial explains how to create a basic application for displaying a list of contacts, and a form for displaying and editing contact information when an item is selected on the contact list.

          - -

          Creating the Basic Application

          - -

          To create an elementary application with a single window, use the following code.

          -
          static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -   create_gui(ad);
          -   return true;
          -}
          -
          -int
          -main(int argc, char **argv)
          -{
          -   appdata_s ad = { 0 };
          -   ui_app_lifecycle_callback_s event_callback = { 0 };
          -
          -   event_callback.create = app_create;
          -
          -   // Zero out the structure
          -   memset(&ad, 0x0, sizeof(struct appdata));
          -
          -   // Run the mainloop
          -   return ui_app_main(&argc, &argv, &event_callback, &ad);
          -}
          -
          - - - -

          Use a naviframe in this application to switch between different views. The first view that is displayed is the list of contacts. When a user selects an item on this list, information on the contact is displayed in a form. Both the view list and the form are opened in a naviframe, which handles the animations between the views for you. It also manages creating a back button in the top bar and launching the back animation when you select it, deletes the form view, and shows the list of contacts again.

          - -

          Naviframe

          -

          The naviframe is the main layout of the window, so it takes all the space available. To configure this, use the elm_win_resize_object_add function. The first parameter is the main window, the second is the naviframe object. The naviframe is to be resized along with the window. The object (the naviframe) fills its parent (the main window) by calling the evas_object_resize_hint_weight_set function on the naviframe object. The naviframe object expands in both x and y directions. In the end, evas shows the naviframe object on the screen.

          -
           // Create the naviframe
          -nav = elm_naviframe_add(win);
          -evas_object_size_hint_weight_set(nav, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(win, nav);
          -evas_object_show(nav);
          -
          - -

          Contact List

          -

          Handle the contact list with the _create_contact_list function. This function takes the parent object as the parameter (in this case the naviframe) and returns the genlist. To create the genlist, use the following code.

          -
          static Evas_Object *
          -_create_contact_list(Evas_Object *parent)
          -{
          -   Evas_Object *list;
          -   int i;
          -
          -   // Create a new genlist
          -   list = elm_genlist_add(parent);
          -   evas_object_show(list);
          -
          -   // Create a new item class for the genlist
          -   itc = elm_genlist_item_class_new();
          -   itc->item_style = "default";
          -   // Set the callback used when the genlist text is created
          -   itc->func.text_get = _genlist_text_get;
          -   // Set the callback be used when the content of the item is created
          -   itc->func.content_get   = _genlist_content_get;
          -   itc->func.state_get = NULL;
          -   itc->func.del = NULL;
          -}
          -
          - -

          itc is a static variable containing the item class. The item class contains all functions that are called back when an item is created. In this case, create the callbacks _genlist_text_get (for labels) and _genlist_content_get (for icons). These functions are called when labels and icons of the genlist item are created.

          -

          The list of contacts is contained in an array of Contacts.

          -
          typedef struct _Contact Contact;
          -
          -struct _Contact
          -{
          -   const char *name;
          -   const char *mobile;
          -   const char *address;
          -   const char *email;
          -   const char *icon;
          -};
          -
          -static Contact contacts[] = 
          -{
          -   {"Alexander Holmes", "+1234567896", "", "alexander_holmes@tizen.org", "c1.png"},
          -   {"Lara Alvaréz",    "+9876543216", "", "lara_alvares@tizen.org", "c2.png"   },
          -   {"Aksel Møller",    "+1679432846", "", "aksel_moller@tizen.org", "c3.png"   },
          -   {"Anir Amghar",      "+1679432846", "", "anir_amghar@tizen.org", "c4.png"    },
          -   {"Noémie Cordier",    "+1679432846", "", "noemie_cordier@tizen.org", "c5.png"   },
          -   {"Henry Thompson",    "+1679432846", "", "henry_thompson@tizen.org", "c6.png"   },
          -   {"Mai Phan",       "+1679432846", "", "mai_phan@tizen.org", "c7.png"      },
          -};
          -
          - -

          Create a genlist item for each item of the array with the following code.

          -
          -// Create a genlist item for each item in the contacts array
          -for (i = 0; i < EINA_C_ARRAY_LENGTH(contacts); i++)
          -{
          -   // Append the item, add a callback when the item is selected, and use the
          -   // current contact item as data pointer for the callbacks
          -   elm_genlist_item_append(list, itc,
          -                     &contacts[i],
          -                  NULL,
          -                     ELM_GENLIST_ITEM_NONE,
          -                     _contact_selected_cb,
          -                     &contacts[i]);
          -}
          -
          - -

          Attach the _contact_selected_cb callback function to the genlist item. When an item is selected in the list, the data pointer passed as the argument calls this function. Here it is a pointer on the contact. Pass the contact in the array to all the Item Class callbacks.

          -

          Push the list at the top of the naviframe with the following code.

          -
          -// Create the list of contacts
          -list = _create_contact_list(win);
          -
          -// Push the list on top of the naviframe
          -elm_naviframe_item_push(nav, NULL, NULL, NULL, list, NULL);
          -
          - -

          The Item class functions are called, the _genlist_text_get first.

          -
          -static char *
          -_genlist_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
          -{
          -   Contact *contact = data;
          -
          -   // Return a new allocated string for the contact name
          -   return strdup(contact->name);
          -}
          -
          - -

          These functions show the index of the contact in the array and return a freshly allocated string with the name of the contact.

          -

          When the user selects an item in the list, a callback registers on the select signal and calls the corresponding function; in this case, _contact_selected_cb(). The user retrieves the index of the array passed in the data and creates the form on contact information based on this index.

          -

          The _genlist_content_get function is called several times depending on the style of the created item. In this case, with the default style for the genlist item, there are two different swallow parts. A swallow part is a container in the edje file of the genlist item, which may contain an evas object. The following figure shows the layout of different parts in the theme.

          - - -

          Figure: Genlist item

          -

          Genlist item

          - - -

          There are two elm.swallow parts. When the callback function for the creation of icons is called, the part name is passed via the part variable. Compare this variable to elm.swallow.icon for the first object and to elm.swallow.end for the icon at the end.

          - -

          Icon

          -

          Create the icon when the callback is recognized. In this example, we use an elm_icon object.

          -
          -static Evas_Object *
          -_genlist_content_get(void *data, Evas_Object *obj, const char *part)
          -{
          -   Contact *contact = data;
          -
          -   // Test which part is being created
          -   if (!strcmp(part, "elm.swallow.icon"))
          -   {
          -         char filename[PATH_MAX];
          -      // Create a new icon
          -      Evas_Object *ic = elm_icon_add(obj);
          -      // Set the filename of the file which is to be loaded
          -      snprintf(filename, sizeof(filename), "%s%s", ICON_PATH, contact->icon);
          -      elm_image_file_set(ic, filename, NULL);
          -      // Keep the ratio squared
          -      evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
          -
          -      // Return the icon
          -      return ic;
          -   }
          -
          -   return NULL;
          -}
          -
          - -

          Note that in case of elm.swallow.end the return is NULL, and no icon is added.

          -

          The user may question the complexity of creating a genlist, and the benefits of callbacks for the creation of items. In a genlist with thousands of elements, graphical items are not created. Only the ones currently displayed on the screen are created with the callbacks in the Genlist Item Class. Otherwise, objects are created by calling the respective callback function when the user scrolls the list.

          - - - - - - - - - - -
          Note
          When the genlist is first created, the Elementary needs to know the height of the list. All elements in the list are not necessarily the same size due to different kind of styles. Thus, the Elementary creates all elements once to know the size, and displays the scroll bars correctly. If all your items have the same height, use the elm_genlist_homogeneous_set to impose the same height to all items. The Elementary does not create the complete list as the global size is a multiple of the height of the first item. It saves you cpu time.
          - -

          Contact Form

          -

          The contact list is created inside the _create_contact_form function. This function takes a parent Evas_Object and a contact item as parameters, and returns an Evas_Object. The parent is the naviframe object, and the contact item contains the information on the contact.

          -

          To display the various information about the contact, we use boxes in this example.

          - -

          Figure: Form contact layout

          -

          Form contact layout

          - - -

          The first box is an vertical box.

          -
          vbox = elm_box_add(parent);
          -elm_box_align_set(vbox, 0, 0);
          -evas_object_show(vbox);
          -
          - -

          elm_box_align_set keeps the box element aligned to the top left corner.

          -

          To add an icon, use the _genlist_content_get function to create the icon in the genlist item. For a bigger icon, set the minimum size of the icon object to 96x96 px.

          -

          The most important function in this case is elm_box_pack_end. It adds the icon object at the end of the vbox. As the icon is the first object added, it is displayed on top of the box.

          -
          -ic = elm_icon_add(vbox);
          -snprintf(filename, sizeof(filename), "%s%s", ICON_PATH, contact->icon);
          -elm_image_file_set(ic, filename, NULL);
          -evas_object_size_hint_min_set(ic, 96, 96);
          -evas_object_show(ic);
          -elm_box_pack_end(vbox, ic);
          -
          - -

          In the following example, add the information on the contact: the name, the mobile phone number, the postal address and the e-mail address. For each information item, create a label and an edit line. The label contains the kind of the information, and the edit box, the information itself. To set the UI components in a horizontal layout, use a horizontal box.

          -
          -hbox = elm_box_add(vbox);
          -elm_box_horizontal_set(hbox, EINA_TRUE);
          -elm_box_padding_set(hbox, 32, 32);
          -evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0);
          -evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, 0);
          -evas_object_show(hbox);
          -
          - -

          Change the orientation of the box with elm_box_horizontal_set. To get space between the elements of the vbox, set the padding to 32px. To set the item of the box not to expand vertically, use evas_object_size_hint_weight_set.

          -

          Create the label object, which is an elm_label. Set its text, and do not align or expand it.

          -
          -label = elm_label_add(hbox);
          -elm_object_text_set(label, form_items[i]);
          -evas_object_size_hint_weight_set(label, 0, 0);
          -evas_object_size_hint_align_set(label, 0, 0);
          -evas_object_show(label);
          -
          - -

          Create the edit line, which is an elm_entry.

          -
          -edit = elm_entry_add(hbox);
          -evas_object_size_hint_weight_set(edit, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(edit, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(edit);
          -
          - -

          Add the label and the edit inside the horizontal box and add the horizontal box to the vertical box.

          -
          -elm_box_pack_end(hbox, label);
          -elm_box_pack_end(hbox, edit);
          -
          -elm_box_pack_end(vbox, hbox);
          -
          - -

          Figure: Form tutorial: form

          -

          Form tutorial: form

          - -

          Figure: Form tutorial: list

          -

          Form tutorial: list

          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/genlist_tutorial_mn.htm b/org.tizen.ui.guides/html/native/efl/genlist_tutorial_mn.htm deleted file mode 100755 index 7e89479..0000000 --- a/org.tizen.ui.guides/html/native/efl/genlist_tutorial_mn.htm +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - - - - - - - - - Creating Mobile Genlists - - - - - - -
          -

          Creating Mobile Genlists

          - - -

          This tutorial deals with genlists, a list component for large sets of elements. It uses callbacks to populate entries. The same UI component handles both flat lists and trees.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - - -

          Initializing the Application

          - -

          Figure: Example of a genlist

          -

          Example of a genlist

          -

          The code below shows a typical elementary application that creates a window entitled "Genlist Basic Tutorial". It is consisted of a conformant component that contains a naviframe component. The genlist goes inside the naviframe.

          -
          static bool
          -_app_create(void *data)
          -{
          -   appdata_s *app = data;
          -
          -   app->win = elm_win_util_standard_add("main", "Genlist Basic Tutorial");
          -   elm_win_conformant_set(app->win, EINA_TRUE);
          -   evas_object_show(app->win);
          -   evas_object_resize(app->win, 480, 800);
          -   elm_win_autodel_set(app->win, EINA_TRUE);
          -
          -   app->conformant = elm_conformant_add(app->win);
          -   evas_object_size_hint_weight_set(app->conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(app->win, app->conformant);
          -   evas_object_show(app->conformant);
          -
          -   app->naviframe = elm_naviframe_add(app->win);
          -   evas_object_size_hint_weight_set(app->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(app->win, app->naviframe);
          -   evas_object_show(app->naviframe);
          -   elm_object_content_set(app->conformant, app->naviframe);
          -
          -   _create_list(app);
          -   elm_naviframe_item_push(app->naviframe, NULL, NULL, NULL, app->list, NULL);
          -
          -   return true;
          -}
          -
          -int
          -main(int argc, char **argv)
          -{
          -   // Declare a few structures and zero-initialize (C99 feature)
          -   struct app_data app = { 0 };
          -   ui_app_lifecycle_callback_s event_callback = { 0 };
          -
          -   event_callback.create = _app_create;
          -
          -   // Run the mainloop
          -   return ui_app_main(&argc, &argv, &event_callback, &ad);
          -}
          -
          -

          The declaration of the struct app_data is shown below:

          -
          struct app_data
          -{
          -   Evas_Object *win;
          -   Evas_Object *naviframe;
          -   Evas_Object *conformant;
          -   Evas_Object *list;
          -   Elm_Genlist_Item_Class *itc;
          -   Elm_Genlist_Item_Class *itc2;
          -};
          -
          - -

          Creating a Genlist

          - -

          Call elm_genlist_add() to create a genlist. Then new entries can be added. In this example, first the basic windows is created, then a genlist is added to it, and then 10000 elements with text and a colored block on each side of it.

          -
          Evas_Object *list = elm_genlist_add(parent);
          -
          - -

          Adding New Entries

          - -

          Use elm_genlist_item_append() to add new elements. Its second parameter is a structure which describes how to populate entries. Typically this structure is built once and re-used across calls to elm_genlist_item_append().

          -

          -Building a Basic Item Class

          -

          The code for the minimal genlist item class is below:

          - -
          Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
          -itc->item_style = "default";
          -itc->func.text_get = NULL;
          -itc->func.content_get = NULL;
          -itc->func.state_get = NULL;
          -itc->func.del = NULL;
          -
          - -

          It creates a simple item class, sets the item_style to "default" and every other field to NULL. However, this leaves out the text_get and content_get fields which are used to add text and an icon to the list entry. This is explained in another section.

          -

          Adding the Element

          -

          Once the genlist item class object is created, a new element is added to the list by calling elm_genlist_item_append().

          -
          elm_genlist_item_append(list,
          -   itc,
          -   NULL,                    // Item data
          -   NULL,                    // Parent item for trees, NULL if none
          -   ELM_GENLIST_ITEM_NONE,   // Item type; this is the common one
          -   NULL,                    // Callback on selection of the item
          -   NULL                     // Data for that callback function
          -);
          -
          -

          With most parameters as NULL and itc having most of its members NULL, too, the elements of that list are blank and will not trigger anything when selected. This shows the APIs that are used.

          -

          Text in the List Elements

          -

          Use text_get callback to add text in the elements in the Elm_Genlist_Item_Class structure. These callbacks must have a prototype matching to the following:

          - -
          char * text_get(void *data, Evas_Object *obj, const char *part);
          -
          -

          This callbacks returns a C string that is displayed in the part named after the part parameter. This callback is called for each user-settable text part according to the current theme.

          -

          If you are not familiar with the concept of parts in the EFLs, see Writing a Simple EDC File.

          - - - - - - - - - - - -
          Note
          The value returned is freed by the EFLs: the value must be freshly-allocated, do not free it yourself and do not re-use it across list elements.
          - -

          For the default theme there is one part named elm.text. A possible implementation of the text_get callback is therefore:

          -
          static char *
          -_genlist_text_get(void *data, Evas_Object *obj, const char *part)
          -{
          -   // Check this is text for the part we're expecting
          -   if (strcmp(part, "elm.text") == 0) 
          -   {
          -      return strdup("Some text");
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          - - - - - - - - - - -
          Note
          The names and positions of parts depends on the item_style chosen when adding new items to the genlist. Setting a custom theme makes it possible to completely change genlists by adding and moving parts. Introduction to EDC Programming explains how to do that.
          - -

          The data parameter makes it possible to behave differently according to data that is given to the EFLs during the call to elm_genlist_item_append() in the data parameter. For example, given an integer in that field through casting with (void *)(uintptr_t) i, it is possible to get its value back using (int)(uintptr_t)data:

          -
          static char *
          -_genlist_text_get(void *data, Evas_Object *obj__UNUSED__, const char *part)
          -{
          -   if (strcmp(part, "elm.text") == 0) 
          -   {
          -      char *buf = malloc(16);
          -      snprintf(buf, 16, "Entry %d.", (int)(uintptr_t)data);
          -
          -      return buf;
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          - -

          Evas_Objects in the List Elements

          -

          Icons are added in a similar fashion: there is a callback named content_get which returns a pointer to an Evas_Object and is called for each part which contents can be set.

          -

          The prototype of the callback must match this one:

          -
          Evas_Object * content_get(void *data, Evas_Object *obj, const char *part);
          -
          - -

          The only difference with the text_get callback is that it returns an Evas_Object* rather than a char *.

          -

          This leads to a fairly simple dummy implementation with colored rectangles in the parts that are to be set:

          -
          -static Evas_Object *
          -_genlist_content_get(void *data, Evas_Object *obj, const char *part)
          -{
          -   int i = (int) (uintptr_t) data;
          -
          -   if (strcmp(part, "elm.swallow.icon") == 0) 
          -   {
          -      Evas_Object *bg = elm_bg_add(obj);
          -      elm_bg_color_set(bg, 255 * cos(i / (double) 10), 0, i % 255);
          -
          -      return bg;
          -   }
          -   else if (strcmp(part, "elm.swallow.end") == 0) 
          -   {
          -      Evas_Object *bg = elm_bg_add(obj);
          -      elm_bg_color_set(bg, 0, 255 * sin(i / (double) 10), i % 255);
          -
          -      return bg;
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          -

          For the default theme, this displays a red rectangle on the left of each list item and a green one on their right.

          -

          Events on Genlist Items

          -

          Genlist items triggers a callback when clicked. This callback is chosen when adding the new item (for example, when calling elm_genlist_item_append()):

          -
          elm_genlist_item_append(list,
          -   itc,
          -   NULL,                    // Item data
          -   NULL,                    // Parent item for trees, NULL if none
          -   ELM_GENLIST_ITEM_NONE,   // Item type, other values are used for trees
          -   _genlist_selected_cb,    // Callback on selection of the item
          -   NULL                     // Data for that callback function
          -);
          -
          - -

          This callback adheres to the following prototype:

          -
          void _contact_selected_cb(void *data, Evas_Object *obj, void *event_info)
          -
          - -

          The implementation below changes the item style of items when they are selected:

          -
          static void
          -_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   struct app_data *app = data;
          -
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -}
          -
          - -

          Choosing Another Item Style to Add or Remove Parts

          - -

          As mentioned above, the number of parts to fill depends on the item style that is chosen when adding a new item. This is simply a matter of setting the right value when filling the Elm_Genlist_Item_Class struct:

          -
          app->itc->item_style = "default";
          -
          -

          The Genlist component lists all available item styles.

          -

          Further customization is achieved by modifying the theme as explained in Introduction to EDC Programming.

          -

          In case the customization is only visual, it is good practice to keep the same item style names for new themes. This makes it possible to change theme and keep the code the same while also retaining the same overall item placement.

          - -

          Using Item Modes

          - -

          So far the genlist examples have all featured bare lists while the genlist component is able to display trees or even a "group" mode where scrolling keeps the item at the top of the UI component until another group comes and replaces it.

          -

          Group Mode

          -

          The group mode makes it possible to keep an element visible as long as one of its children is visible. This is most useful for "title" items.

          -

          Mark some elements as ELM_GENLIST_ITEM_GROUP and use the returned Elm_Object_Item to establish the parent-children relationship when adding the children items.

          -

          Since there are two kind of items, create two item classes. Give them different styles and callback functions. The callback functions are visible in the example, they have no functionalities:

          -
          -app->itc = elm_genlist_item_class_new();
          -app->itc->item_style = "default_style";
          -app->itc->func.text_get = _genlist_text_get_size;
          -app->itc->func.content_get = _genlist_content_get_bg;
          -app->itc->func.state_get = NULL;
          -app->itc->func.del = NULL; 
          -
          -app->itc2 = elm_genlist_item_class_new();
          -app->itc2->item_style = "icon_top_text_bottom";
          -app->itc2->func.text_get = _genlist_text_get_nosize;
          -app->itc2->func.content_get = _genlist_content_get_icon;
          -app->itc2->func.state_get = NULL;
          -app->itc2->func.del = NULL; 
          -
          - -

          Then add a group header and follow it with 10 children. This is repeated 1000 times.

          -

          The parent has type ELM_GENLIST_ITEM_GROUP while the children have type ELM_GENLIST_ITEM_NONE.

          -

          The other important point is that the value returned by lm_genlist_item_append() is stored in it and then sent to the elm_genlist_item_append() call that adds the children. This creates the parent-children relationship.

          -
          -for (i = 0; i < 1000; i++) 
          -{
          -   it = elm_genlist_item_append(app->list, app->itc2, (void *)(uintptr_t) (10 * i), NULL,
          -                                ELM_GENLIST_ITEM_GROUP, NULL, NULL);
          -   for (j = 0; j < 10; j++)
          -   {
          -      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (10 * i + j), it,
          -                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
          -   }
          -}
          -
          - -

          Tree Mode

          -

          Like group mode, tree mode uses the parenting relationship with other items. Unlike group mode, the child elements are created on-demand when their parent is expanded and deleted when it is contracted. This is done by using smart callbacks: expand,request, expanded, contract,request, and contracted. Like any smart callback, they are registered through evas_object_smart_callback_add on the genlist object:

          -
          evas_object_smart_callback_add(app->list, "expand,request",
          -   _tree_item_expand_request, NULL);
          -evas_object_smart_callback_add(app->list, "expanded",
          -   _tree_item_expanded, NULL);
          -
          -evas_object_smart_callback_add(app->list, "contract,request",
          -   _tree_item_contract_request, NULL);
          -evas_object_smart_callback_add(app->list, "contracted",
          -   _tree_item_contracted, NULL);
          -
          - -

          The callbacks expand,request and contract,request do only one thing: decide whether the element is expanded or contracted. This is done by using elm_genlist_item_expanded_set() function; if it changes the expansion status of the item, the next callback is called (either expanded or contracted, depending on whether it was an expand,request or contract,request event). A minimal implementation of these callbacks is therefore:

          -
          -static void
          -_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -
          -   elm_genlist_item_expanded_set(it, EINA_TRUE);
          -}
          -
          - - - - - - - - - - -
          Note
          The example above has an extra line: the call to elm_genlist_item_item_class_update(). It changes the item style and is explained in the Changing the item class of an item after its creation section.
          - -
          -static void
          -_tree_item_contract_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc);
          -
          -   elm_genlist_item_expanded_set(it, EINA_FALSE);
          -}
          -
          - -

          As said above, once the genlist item status is set to expanded, the expanded event is triggered and it is the duty of a callback for that event to populate the list with the item's children. This relies on the parent parameter of functions like elm_genlist_item_append(), like for the group mode.

          -

          The function below is a callback implementation for the expanded event. It adds items that are built similarly to previous items, the only change is the parent parameter which is not NULL. Conveniently, the parent Elm_Object_Item pointer that is passes to the elm_genlist_item_append() function is given in the event_info callback and needs to be cast.

          -
          static void
          -_tree_item_expanded(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
          -   int i_parent = (int)(uintptr_t) data;
          -   int i;
          -
          -   for (i = 0; i < 10; i++) 
          -   {
          -      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (i + i_parent), it_parent,
          -                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
          -   }
          -}
          -
          - -

          The following code has the callback function for the contracted event. It imply calls elm_genlist_item_subitems_clear() to clear all children (including their own children if they have any) of the given item. Again, the item that is being contracted is available through the event_info parameter to the callback.

          -
          static void
          -_tree_item_contracted(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_subitems_clear(it_parent);
          -}
          -
          - -

          Mixing Group and Tree Modes

          -

          A common UI design is to mix group and tree modes. It allows for a tree behavior while also keeping the group header item. The EFLs do not do any magic here and the way to get such a behavior is to create an item of type group, an item of type tree which parent is the group item. Then add the callbacks to populate the children of the tree item in the regular way.

          - -

          Using Other APIs

          - -

          Homogeneous Item Size

          -

          Because of the scroller, the actual height and/or width of the genlist must be computed. This means summing the sizes of all the items, the sizes must be computed. This obviously has a cost and slows down adding items to the genlist.

          -

          The elm_genlist_homogeneous_set() function alleviates this issue by assuming all the items are the same size as the first one of the list. It speeds up large insertions. However, it may lead to serious graphical issues if the items are not actually the same size. Use with care.

          - -

          Changing the Item Class of an Item After Its Creation

          -

          Changing the item class of a UI component is an easy way to change its appearance upon selection or other actions of the user. This is done by calling elm_genlist_item_class_update():

          -
          static void
          -_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   // Change the appearance and possibly content of the item being expanded.
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -
          -   elm_genlist_item_expanded_set(it, EINA_TRUE);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/genlist_tutorial_wn.htm b/org.tizen.ui.guides/html/native/efl/genlist_tutorial_wn.htm deleted file mode 100755 index 7f9a993..0000000 --- a/org.tizen.ui.guides/html/native/efl/genlist_tutorial_wn.htm +++ /dev/null @@ -1,469 +0,0 @@ - - - - - - - - - - - - - - Creating Wearable Genlists - - - - - - -
          -

          Creating Wearable Genlists

          - -

          This tutorial deals with genlists, a list component for large sets of elements. It uses callbacks to populate entries. The same UI component handles both flat lists and trees.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - - -

          Initializing the Application

          - -

          Figure: Example of a genlist

          -

          Example of a genlist

          -

          The code below shows a typical elementary application that creates a window entitled "Genlist Basic Tutorial". It is consisted of a conformant component that contains a naviframe component. The genlist goes inside the naviframe.

          -
          static bool
          -_app_create(void *data)
          -{
          -   appdata_s *app = data;
          -
          -   app->win = elm_win_util_standard_add("main", "Genlist Basic Tutorial");
          -   elm_win_conformant_set(app->win, EINA_TRUE);
          -   evas_object_show(app->win);
          -   evas_object_resize(app->win, 480, 800);
          -   elm_win_autodel_set(app->win, EINA_TRUE);
          -
          -   app->conformant = elm_conformant_add(app->win);
          -   evas_object_size_hint_weight_set(app->conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(app->win, app->conformant);
          -   evas_object_show(app->conformant);
          -
          -   app->naviframe = elm_naviframe_add(app->win);
          -   evas_object_size_hint_weight_set(app->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(app->win, app->naviframe);
          -   evas_object_show(app->naviframe);
          -   elm_object_content_set(app->conformant, app->naviframe);
          -
          -   _create_list(app);
          -   elm_naviframe_item_push(app->naviframe, NULL, NULL, NULL, app->list, NULL);
          -
          -   return true;
          -}
          -
          -int
          -main(int argc, char **argv)
          -{
          -   // Declare a few structures and zero-initialize (C99 feature)
          -   struct app_data app = { 0 };
          -   ui_app_lifecycle_callback_s event_callback = { 0 };
          -
          -   event_callback.create = _app_create;
          -
          -   // Run the mainloop
          -   return ui_app_main(&argc, &argv, &event_callback, &ad);
          -}
          -
          -

          The declaration of the struct app_data is shown below:

          -
          struct app_data
          -{
          -   Evas_Object *win;
          -   Evas_Object *naviframe;
          -   Evas_Object *conformant;
          -   Evas_Object *list;
          -   Elm_Genlist_Item_Class *itc;
          -   Elm_Genlist_Item_Class *itc2;
          -};
          -
          - -

          Creating a Genlist

          - -

          Call elm_genlist_add() to create a genlist. Then new entries can be added. In this example, first the basic windows is created, then a genlist is added to it, and then 10000 elements with text and a colored block on each side of it.

          -
          Evas_Object *list = elm_genlist_add(parent);
          -
          - -

          Adding New Entries

          - -

          Use elm_genlist_item_append() to add new elements. Its second parameter is a structure which describes how to populate entries. Typically this structure is built once and re-used across calls to elm_genlist_item_append().

          -

          -Building a Basic Item Class

          -

          The code for the minimal genlist item class is below:

          - -
          Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
          -itc->item_style = "default";
          -itc->func.text_get = NULL;
          -itc->func.content_get = NULL;
          -itc->func.state_get = NULL;
          -itc->func.del = NULL;
          -
          - -

          It creates a simple item class, sets the item_style to "default" and every other field to NULL. However, this leaves out the text_get and content_get fields which are used to add text and an icon to the list entry. This is explained in another section.

          -

          Adding the Element

          -

          Once the genlist item class object is created, a new element is added to the list by calling elm_genlist_item_append().

          -
          elm_genlist_item_append(list,
          -   itc,
          -   NULL,                    // Item data
          -   NULL,                    // Parent item for trees, NULL if none
          -   ELM_GENLIST_ITEM_NONE,   // Item type; this is the common one
          -   NULL,                    // Callback on selection of the item
          -   NULL                     // Data for that callback function
          -);
          -
          -

          With most parameters as NULL and itc having most of its members NULL, too, the elements of that list are blank and will not trigger anything when selected. This shows the APIs that are used.

          -

          Text in the List Elements

          -

          Use text_get callback to add text in the elements in the Elm_Genlist_Item_Class structure. These callbacks must have a prototype matching to the following:

          - -
          char * text_get(void *data, Evas_Object *obj, const char *part);
          -
          -

          This callbacks returns a C string that is displayed in the part named after the part parameter. This callback is called for each user-settable text part according to the current theme.

          -

          If you are not familiar with the concept of parts in the EFLs, see Writing a Simple EDC File.

          - - - - - - - - - - - -
          Note
          The value returned is freed by the EFLs: the value must be freshly-allocated, do not free it yourself and do not re-use it across list elements.
          - -

          For the default theme there is one part named elm.text. A possible implementation of the text_get callback is therefore:

          -
          static char *
          -_genlist_text_get(void *data, Evas_Object *obj, const char *part)
          -{
          -   // Check this is text for the part we're expecting
          -   if (strcmp(part, "elm.text") == 0) 
          -   {
          -      return strdup("Some text");
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          - - - - - - - - - - -
          Note
          The names and positions of parts depends on the item_style chosen when adding new items to the genlist. Setting a custom theme makes it possible to completely change genlists by adding and moving parts. Introduction to EDC Programming explains how to do that.
          - -

          The data parameter makes it possible to behave differently according to data that is given to the EFLs during the call to elm_genlist_item_append() in the data parameter. For example, given an integer in that field through casting with (void *)(uintptr_t) i, it is possible to get its value back using (int)(uintptr_t)data:

          -
          static char *
          -_genlist_text_get(void *data, Evas_Object *obj__UNUSED__, const char *part)
          -{
          -   if (strcmp(part, "elm.text") == 0) 
          -   {
          -      char *buf = malloc(16);
          -      snprintf(buf, 16, "Entry %d.", (int)(uintptr_t)data);
          -
          -      return buf;
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          - -

          Evas_Objects in the List Elements

          -

          Icons are added in a similar fashion: there is a callback named content_get which returns a pointer to an Evas_Object and is called for each part which contents can be set.

          -

          The prototype of the callback must match this one:

          -
          Evas_Object * content_get(void *data, Evas_Object *obj, const char *part);
          -
          - -

          The only difference with the text_get callback is that it returns an Evas_Object* rather than a char *.

          -

          This leads to a fairly simple dummy implementation with colored rectangles in the parts that are to be set:

          -
          -static Evas_Object *
          -_genlist_content_get(void *data, Evas_Object *obj, const char *part)
          -{
          -   int i = (int) (uintptr_t) data;
          -
          -   if (strcmp(part, "elm.swallow.icon") == 0) 
          -   {
          -      Evas_Object *bg = elm_bg_add(obj);
          -      elm_bg_color_set(bg, 255 * cos(i / (double) 10), 0, i % 255);
          -
          -      return bg;
          -   }
          -   else if (strcmp(part, "elm.swallow.end") == 0) 
          -   {
          -      Evas_Object *bg = elm_bg_add(obj);
          -      elm_bg_color_set(bg, 0, 255 * sin(i / (double) 10), i % 255);
          -
          -      return bg;
          -   }
          -   else 
          -   {
          -      return NULL;
          -   }
          -}
          -
          -

          For the default theme, this displays a red rectangle on the left of each list item and a green one on their right.

          -

          Events on Genlist Items

          - - - - - - - - - - -
          Note
          The swallow parts have no minimum size. This means that if you do not fix the minimum size, the part cannot be seen.
          - -

          Genlist items triggers a callback when clicked. This callback is chosen when adding the new item (for example, when calling elm_genlist_item_append()):

          -
          elm_genlist_item_append(list,
          -   itc,
          -   NULL,                    // Item data
          -   NULL,                    // Parent item for trees, NULL if none
          -   ELM_GENLIST_ITEM_NONE,   // Item type, other values are used for trees
          -   _genlist_selected_cb,    // Callback on selection of the item
          -   NULL                     // Data for that callback function
          -);
          -
          - -

          This callback adheres to the following prototype:

          -
          void _contact_selected_cb(void *data, Evas_Object *obj, void *event_info)
          -
          - -

          The implementation below changes the item style of items when they are selected:

          -
          static void
          -_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *app = data;
          -
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -}
          -
          - -

          Choosing Another Item Style to Add or Remove Parts

          - -

          As mentioned above, the number of parts to fill depends on the item style that is chosen when adding a new item. This is simply a matter of setting the right value when filling the Elm_Genlist_Item_Class struct:

          -
          app->itc->item_style = "default";
          -
          -

          The Genlist component lists all available item styles.

          -

          Further customization is achieved by modifying the theme as explained in Introduction to EDC Programming.

          -

          In case the customization is only visual, it is good practice to keep the same item style names for new themes. This makes it possible to change theme and keep the code the same while also retaining the same overall item placement.

          - -

          Using Item Modes

          - -

          So far the genlist examples have all featured bare lists while the genlist component is able to display trees or even a "group" mode where scrolling keeps the item at the top of the UI component until another group comes and replaces it.

          -

          Group Mode

          -

          The group mode makes it possible to keep an element visible as long as one of its children is visible. This is most useful for "title" items.

          -

          Mark some elements as ELM_GENLIST_ITEM_GROUP and use the returned Elm_Object_Item to establish the parent-children relationship when adding the children items.

          -

          Since there are two kind of items, create two item classes. Give them different styles and callback functions. The callback functions are visible in the example, they have no functionalities:

          -
          -app->itc = elm_genlist_item_class_new();
          -app->itc->item_style = "default";
          -app->itc->func.text_get = _genlist_text_get_size;
          -app->itc->func.content_get = _genlist_content_get_bg;
          -app->itc->func.state_get = NULL;
          -app->itc->func.del = NULL; 
          -
          -app->itc2 = elm_genlist_item_class_new();
          -app->itc2->item_style = "1text.1icon";
          -app->itc2->func.text_get = _genlist_text_get_nosize;
          -app->itc2->func.content_get = _genlist_content_get_icon;
          -app->itc2->func.state_get = NULL;
          -app->itc2->func.del = NULL; 
          -
          - -

          Then add a group header and follow it with 10 children. This is repeated 1000 times.

          -

          The parent has type ELM_GENLIST_ITEM_GROUP while the children have type ELM_GENLIST_ITEM_NONE.

          -

          The other important point is that the value returned by lm_genlist_item_append() is stored in it and then sent to the elm_genlist_item_append() call that adds the children. This creates the parent-children relationship.

          -
          -for (i = 0; i < 1000; i++) 
          -{
          -   it = elm_genlist_item_append(app->list, app->itc2, (void *)(uintptr_t) (10 * i), NULL,
          -                                ELM_GENLIST_ITEM_GROUP, NULL, NULL);
          -   for (j = 0; j < 10; j++)
          -   {
          -      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (10 * i + j), it,
          -                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
          -   }
          -}
          -
          - -

          Tree Mode

          -

          Like group mode, tree mode uses the parenting relationship with other items. Unlike group mode, the child elements are created on-demand when their parent is expanded and deleted when it is contracted. This is done by using smart callbacks: expand,request, expanded, contract,request, and contracted. Like any smart callback, they are registered through evas_object_smart_callback_add on the genlist object:

          -
          evas_object_smart_callback_add(app->list, "expand,request",
          -   _tree_item_expand_request, NULL);
          -evas_object_smart_callback_add(app->list, "expanded",
          -   _tree_item_expanded, NULL);
          -
          -evas_object_smart_callback_add(app->list, "contract,request",
          -   _tree_item_contract_request, NULL);
          -evas_object_smart_callback_add(app->list, "contracted",
          -   _tree_item_contracted, NULL);
          -
          - -

          The callbacks expand,request and contract,request do only one thing: decide whether the element is expanded or contracted. This is done by using elm_genlist_item_expanded_set() function; if it changes the expansion status of the item, the next callback is called (either expanded or contracted, depending on whether it was an expand,request or contract,request event). A minimal implementation of these callbacks is therefore:

          -
          -static void
          -_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -
          -   elm_genlist_item_expanded_set(it, EINA_TRUE);
          -}
          -
          - - - - - - - - - - -
          Note
          The example above has an extra line: the call to elm_genlist_item_item_class_update(). It changes the item style and is explained in the Changing the item class of an item after its creation section.
          - -
          -static void
          -_tree_item_contract_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_item_class_update(it, app->itc);
          -
          -   elm_genlist_item_expanded_set(it, EINA_FALSE);
          -}
          -
          - -

          As said above, once the genlist item status is set to expanded, the expanded event is triggered and it is the duty of a callback for that event to populate the list with the item's children. This relies on the parent parameter of functions like elm_genlist_item_append(), like for the group mode.

          -

          The function below is a callback implementation for the expanded event. It adds items that are built similarly to previous items, the only change is the parent parameter which is not NULL. Conveniently, the parent Elm_Object_Item pointer that is passes to the elm_genlist_item_append() function is given in the event_info callback and needs to be cast.

          -
          static void
          -_tree_item_expanded(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
          -   int i_parent = (int)(uintptr_t) data;
          -   int i;
          -
          -   for (i = 0; i < 10; i++) 
          -   {
          -      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (i + i_parent), it_parent,
          -                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
          -   }
          -}
          -
          - -

          The following code has the callback function for the contracted event. It imply calls elm_genlist_item_subitems_clear() to clear all children (including their own children if they have any) of the given item. Again, the item that is being contracted is available through the event_info parameter to the callback.

          -
          static void
          -_tree_item_contracted(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
          -
          -   elm_genlist_item_subitems_clear(it_parent);
          -}
          -
          - -

          Mixing Group and Tree Modes

          -

          A common UI design is to mix group and tree modes. It allows for a tree behavior while also keeping the group header item. The EFLs do not do any magic here and the way to get such a behavior is to create an item of type group, an item of type tree which parent is the group item. Then add the callbacks to populate the children of the tree item in the regular way.

          - -

          Using Other APIs

          - -

          Homogeneous Item Size

          -

          Because of the scroller, the actual height and/or width of the genlist must be computed. This means summing the sizes of all the items, the sizes must be computed. This obviously has a cost and slows down adding items to the genlist.

          -

          The elm_genlist_homogeneous_set() function alleviates this issue by assuming all the items are the same size as the first one of the list. It speeds up large insertions. However, it may lead to serious graphical issues if the items are not actually the same size. Use with care.

          - -

          Changing the Item Class of an Item After Its Creation

          -

          Changing the item class of a UI component is an easy way to change its appearance upon selection or other actions of the user. This is done by calling elm_genlist_item_class_update():

          -
          static void
          -_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
          -{
          -   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
          -
          -   // Change the appearance and possibly content of the item being expanded.
          -   elm_genlist_item_item_class_update(it, app->itc2);
          -
          -   elm_genlist_item_expanded_set(it, EINA_TRUE);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/graphical_objects_n.htm b/org.tizen.ui.guides/html/native/efl/graphical_objects_n.htm deleted file mode 100755 index 6f3c87f..0000000 --- a/org.tizen.ui.guides/html/native/efl/graphical_objects_n.htm +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - Graphical Objects: Managing and Rendering Evas Objects - - - - - -
          - -

          Graphical Objects: Managing and Rendering Evas Objects

          - -

          Evas is a clean display canvas API for several target display systems that can draw anti-aliased text, smooth super and sub-sampled scaled images, alpha-blend objects and much more.

          -

          It abstracts any need to know much about what the characteristics of your display system are, what graphics calls are used to draw them, and how. It deals on an object level where all you do is create and manipulate objects in a canvas and set their properties.

          -

          Evas optimizes the rendering pipeline to minimize effort in redrawing changes made to the canvas and so takes this work out of the programmers hand, saving a lot of time and energy.

          -

          It is designed to work on embedded systems all the way to large and powerful multi-cpu workstations. It can be compiled to only have the features you need for your target platform if you so wish. It has several display back-ends, allowing it display on several display systems, making it portable for cross-device and cross-platform development.

          - -

          Evas is not a UI component set or a UI component toolkit, but it is their base. See Elementary for a toolkit based on Evas, Edje, Ecore and other Enlightenment technologies.

          -

          It is not dependent or aware of main loops, input or output systems. Input must be polled from various sources and fed to Evas. It does not create windows or report windows updates to your system, but draws the pixels and reports to the user the areas that are changed. These operations are ready to be used in Ecore, particularly in Ecore_Evas wrapper/helper set of functions.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/guides_efl_n.htm b/org.tizen.ui.guides/html/native/efl/guides_efl_n.htm deleted file mode 100755 index 2e2ae38..0000000 --- a/org.tizen.ui.guides/html/native/efl/guides_efl_n.htm +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - EFL - - - - - - -
          -

          EFL

          - -

          EFL is an open-source UI toolkit that provides a set of libraries that offer useful features to applications. EFL covers a number of areas from UI component sets to data structures. EFL is one of the Tizen native UI modules and is available in various Tizen profiles. In Tizen, EFL is commonly used for UI applications, although you can also use it for non-UI applications.

          - -

          When creating an EFL application, make sure you understand the following main features:

          - - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/hw_input_n.htm b/org.tizen.ui.guides/html/native/efl/hw_input_n.htm deleted file mode 100755 index 27f1a9f..0000000 --- a/org.tizen.ui.guides/html/native/efl/hw_input_n.htm +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - Hardware Input Handling: Managing Hardware Events with EFL Extension - - - - - -
          - -

          Hardware Input Handling: Managing Hardware Events with EFL Extension

          - -

          The Tizen platform offers the Menu, Back, and Home keys as physical hardware keys for mobile devices and rotary component parts for wearable devices.

          - -

          Basically, EFL does not depend on any specific hardware input methods, such as hardware keys, to generate back and home events, or rotary component parts to generate rotary events. Instead these hardware input events have tightly related to the Tizen UX. As a result, EFL has created the EFL extension library to support common UX behavior between applications and hardware events.

          - -

          When the user presses the Menu or Back key, the key generates a signal with its key property. The Ecore library receives the signal and propagates it to application layers as an event. The EFL extension library consumes the events and handles the views of the application according to key properties. Otherwise, EFL extension manages the rotary events, which are generated from rotary components in wearable devices and delivered to application layers by defining an event callback or a handler function, and registering it.

          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/layout_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/layout_tutorial_n.htm deleted file mode 100755 index 5478634..0000000 --- a/org.tizen.ui.guides/html/native/efl/layout_tutorial_n.htm +++ /dev/null @@ -1,751 +0,0 @@ - - - - - - - - - - - - - - Creating UI Screen Layouts - - - - - - -
          - -

          Creating UI Screen Layouts

          - - -

          This tutorial demonstrates how you can compose a UI screen using the layout classes available in the EFL UI component library. It also highlights the capabilities of the EFL layout classes in free style layouting as well as layouting in a particular sequence (such as linear or grid).

          - - -

          Creating the UI Layout

          - -

          The sample application uses UI components, such as elm_naviframe and elm_toolbar for the view management, layout classes, such as elm_table, elm_box, and elm_grid for the composition of the screen, and UI components, such as elm_label and elm_image for the content inside the view.

          - -

          The create_base_gui() function creates the application layout. It starts by creating a window, then adds the elm_conformant component to it to decorate the window with an indicator. It then adds the elm_naviframe component which acts as a view manager for the window and provides the window title functionality. After this it creates the toolbar using the create_toolbar() function and adds it to naviframe.

          -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   Elm_Object_Item *nf_it, *tabbar_it;
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -
          -   // Naviframe
          -   ad->nf = elm_naviframe_add(ad->conform);
          -   elm_object_content_set(ad->conform, ad->nf);
          -   evas_object_show(ad->nf);
          -   nf_it = elm_naviframe_item_push(ad->nf, "UiLayout", NULL, NULL, NULL, "tabbar/icon/notitle");
          -
          -   // Tabbar
          -   ad->tabbar = create_toolbar(ad);
          -   elm_object_item_part_content_set(nf_it, "tabbar", ad->tabbar);
          -
          -   // Set the first view
          -   tabbar_it = elm_toolbar_first_item_get(ad->tabbar);
          -   elm_toolbar_item_selected_set(tabbar_it, EINA_TRUE);
          -
          -   // Show the window after the base GUI is set up
          -   evas_object_show(ad->win);
          -
          -   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, NULL);
          -}
          -
          - -

          The create_toolbar() function creates the toolbar which is then added to the naviframe.

          -
          -static Evas_Object*
          -create_toolbar(appdata_s *ad)
          -{
          -   Evas_Object *tabbar;
          -
          -   tabbar = elm_toolbar_add(ad->nf);
          -   elm_object_style_set(tabbar, "tabbar");
          -   elm_toolbar_shrink_mode_set(tabbar, ELM_TOOLBAR_SHRINK_EXPAND);
          -   elm_toolbar_transverse_expanded_set(tabbar, EINA_TRUE);
          -
          -   elm_toolbar_item_append(tabbar, NULL, "Box", tabbar_item_cb, ad);
          -   elm_toolbar_item_append(tabbar, NULL, "Grid", tabbar_item_cb, ad);
          -   elm_toolbar_item_append(tabbar, NULL, "Table", tabbar_item_cb, ad);
          -
          -   return tabbar;
          -}
          -
          - -

          The following figure illustrates the UI Layout.

          - -

          Figure: UI Layout screen

          -

          UI Layout screen

          - -

          Adding Content to the Screen

          - -

          The create_box_view() function creates the screen using a recursive composition of the box layout.

          - -
          static Evas_Object*
          -create_box_view(Evas_Object *parent)
          -{
          -   Evas_Object *box, *box1, *box2, *box3;
          -
          -   box = elm_box_add(parent);
          -   elm_box_padding_set(box, 10, 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);
          -
          -   box1 = elm_box_add(box);
          -   elm_box_horizontal_set(box1, EINA_TRUE);
          -   elm_box_padding_set(box1, 8, 8);
          -   evas_object_size_hint_weight_set(box1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(box1, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_show(box1);
          -
          -   box2 = elm_box_add(box);
          -   elm_box_padding_set(box2, 6, 6);
          -   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);
          -
          -   box3 = elm_box_add(box);
          -   elm_box_padding_set(box3, 5, 5);
          -   evas_object_size_hint_weight_set(box3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(box3, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   elm_box_homogeneous_set(box3, EINA_FALSE);
          -   evas_object_show(box3);
          -} 
          -
          - -

          Once the box layout is created, content or another box layout is added to the box. Box implements the size policy during the size calculation.

          - -
          // Add an item to the box
          -Evas_Object *item1 = create_content(box, "Item 1");
          -evas_object_size_hint_min_set(item1, 0, 40);
          -elm_box_pack_end(box, item1);
          -elm_box_pack_end(box, box1);
          -elm_box_pack_end(box, box3);
          -elm_box_pack_end(box, create_content(box, "Item 4"));
          -
          -// Add an item to the box1
          -elm_box_pack_end(box1, create_content(box1, "Item 2.1"));
          -elm_box_pack_end(box1, box2);
          -elm_box_pack_end(box1, create_content(box1, "Item 2.3"));
          -
          -// Add an item to the box2
          -elm_box_pack_end(box2, create_content(box2, "Item 2.2.1"));
          -elm_box_pack_end(box2, create_content(box2, "Item 2.2.2"));
          -
          -// Add an item to the box3
          -elm_box_pack_end(box3, create_content(box3, "Item 3.1"));
          -elm_box_pack_end(box3, create_content(box3, "Item 3.2"));
          -
          - -

          The create_table_view() function creates the screen by composing table layout with content and grid view.

          - -
          static Evas_Object*
          -create_table_view(Evas_Object *parent)
          -{
          -   Evas_Object *table, *item;
          -
          -   table = elm_table_add(parent);
          -   elm_table_padding_set(table, 10, 10);
          -   elm_table_homogeneous_set(table, EINA_TRUE);
          -   evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -
          -   item = create_content(table, "Item 1");
          -   elm_table_pack(table, item, 0, 0, 2, 1);
          -
          -   item = create_content(table, "Item 2");
          -   elm_table_pack(table, item, 2, 0, 1, 1);
          -
          -   item = create_content(table, "Item 3");
          -   elm_table_pack(table, item, 0, 1, 3, 1);
          -
          -   // Add a grid view item
          -   item = create_grid_view(table);
          -   evas_object_show(item);
          -   elm_table_pack(table, item, 0, 2, 3, 10);
          -
          -   return table;
          -}
          -
          - -

          The table layout can be used for freestyle layouting, and for standard layouts, such as lists and grids. It does not consider the size policy of the child item during size calculation.

          -

          The create_grid_view() function composes a screen using the grid layout and also uses box and table layout as a child item to pack inside a grid. It uses free style layouting, and during size evaluation of the child item, it does not take the size policy of the child item into consideration.

          - -
          static Evas_Object*
          -create_grid_view(Evas_Object *parent)
          -{
          -   Evas_Object *grid, *item;
          -
          -   grid = elm_grid_add(parent);
          -   evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -
          -   // Red background for the grid
          -   item = create_bg(grid, 255, 0, 0);
          -   elm_grid_pack(grid, item, 0, 0, 100, 100);
          -
          -   // Add the item to the grid
          -   item = create_content(grid, "Item1");
          -   elm_grid_pack(grid, item, 1, 1, 98, 98);
          -
          -   item = create_content(grid, "Item2");
          -   elm_grid_pack(grid, item, 2, 5, 20, 20);
          -
          -   item = create_content(grid, "Item3");
          -   elm_grid_pack(grid, item, 23, 5, 76, 94);
          -
          -   item = create_content(grid, "Item4");
          -   elm_grid_pack(grid, item, 2, 27, 20, 70);
          -
          -   // Black background for the box view item
          -   item = create_bg(grid, 40, 40, 40);
          -   elm_grid_pack(grid, item, 25, 10, 73, 87);
          -
          -   // Add the box view item to the grid
          -   item = create_box_view(grid);
          -   evas_object_show(item);
          -   elm_grid_pack(grid, item, 26, 11, 71, 85);
          -
          -   return grid;
          -}
          -
          - -

          Using the Base Layout

          - -

          When developing a Tizen native application, it is recommended that you base your application layout on the base layout. The base layout supports the indicator and view management. The following figure shows the wireframe and UI component hierarchy of the base layout:

          - -

          Figure: Base layout wireframe and UI component hierarchy

          -

          Base layout wireframe and UI component hierarchy

          - -

          The UI components have the following roles:

          - -
            -
          • Window (Elm_win): Every UI component from Elementary is rendered in a Window.
          • -
          • Conformant (Elm_Conformant): The Conformant supports the indicator area and resizing the application due to rotation or the ISF (keypad).
          • -
          • Naviframe (Elm_Naviframe): The Naviframe acts as a view manager and optionally provides the application title. The main layout of the application is added to the Naviframe's view area.
          • -
          - - -

          Sample Applications with the Base Layout

          - -

          Setting

          - -

          The Setting application consists of a list to show as a menu. For organizing the application, create the application layout with a screen-size-list and place the layout into the Naviframe's view area.

          - -

          Figure: Setting UI and layout

          -

          Settings UI and layout

          - -

          For more information, see the Setting sample application.

          - -

          Application Store

          - -

          For organizing the Application Store application, you need to add a scroller to the base layout, since the total height of the layout will be greater than the screen size, and you will therefore need to scroll the screen contents up and down. If the layout is larger than the screen, the scroller makes the view itself scrollable.

          - -

          You can use a list or grid if the same objects are shown repeatedly. In this sample application, however, the various items are shown in a layout.

          - -

          Figure: Application Store UI and layout

          -

          Application Store UI and layout

          - -

          For more information, see the Application Store sample application.

          - -

          Sample Applications with a Custom Layout

          - -

          Calculator - No Naviframe

          - -

          The Calculator is a good example of an exception to the base layout. The application has no view changes and no application title. As these are the two reasons why you should use a Naviframe, you do not need to add a Naviframe to the Calculator.

          - -

          You can organize the application layout with container components. Container components are used for arranging UI components, both basic UI components and other container components.

          - -

          Figure: Calculator UI and layout

          -

          Calculator UI and layout

          - -

          For more information, see the Calculator sample application.

          - -

          Email - Drawer

          - -

          The Email application shows information using a list. The main view is the same as in the Setting application, consisting of a screen-size-list for displaying emails. However, the Email application has an additional feature: the Drawer, which is used for displaying the menu with a hierarchy.

          - -

          To develop the application as a Tizen native application, add a layout on the Conformant, and add a Naviframe to the layout. This layout has a content area for the Drawer and Naviframe, and its style name is "layout/drawer/panel". To use this layout, use the following code:

          - -
          -layout = elm_layout_add(parent);
          -elm_layout_theme_set(layout, "layout", "drawer", "panel");
          -
          - -

          The style includes parts for locating the Drawer and the main view. In the Drawer area, you can add a list to indicate the menu. In the main view, you can add a Naviframe to organize the view of the layout.

          - -

          Figure: Email UI and layout

          -

          Email UI and layout

          - -

          For more information, see the Email sample application.

          - -

          Creating a Simple Clock View

          - -

          This sample creates a basic clock view that shows the time, current city, and date. This sample demonstrates how to use a box, container component, and label to create a basic layout. The application includes the following UI components:

          - -
            -
          • Elm_window: Basic canvas for rendering the screen
          • -
          • Elm_conformant: Support indicator area
          • -
          • Elm_naviframe: View manager component
          • -
          • Elm_box: Container component for layouting other UI components
          • -
          • Elm_label: Basic UI component for showing text with a tag
          • -
          - -

          The following figure illustrates the main view of the simple clock sample application and its wireframe structure.

          - -

          Figure: Simple clock screen

          -

          Simple clock screen

          - -

          The basic clock is implemented in the world_clock.c file. In this application, the data structure for application is following:

          - -
          typedef struct appdata
          -{
          -   // Save the window
          -   Evas_Object *win;
          -} 
          -appdata_s;
          -
          - -

          The information in appdata is used for the entire system. In this sample application, the information is related to handling the HW back key.

          - -

          The single callback function for application handling is app_create, and it only creates the basic GUI:

          - -
          int
          -main(int argc, char *argv[])
          -{
          -   appdata_s *ad = {0,};
          -   app_event_callback_s event_callback = {0,};
          -   int ret = 0;
          -
          -   event_callback.create = app_create;
          -   event_callback.terminate = app_terminate;
          -   event_callback.pause = app_pause;
          -   event_callback.resume = app_resume;
          -   event_callback.app_control = app_control;
          -
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          -   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          -
          -   ret = ui_app_main(argc, argv, &event_callback, &ad);
          -   if (ret != APP_ERROR_NONE) 
          -   {
          -      dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret);
          -   }
          -
          -   return ret;
          -}
          -
          -static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          -
          - -

          Use the create_base_gui() function to create a basic layout with a window, conformant and naviframe. This is the basic layout in the Tizen mobile environment.

          - -
          ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -// Conformant
          -conform = elm_conformant_add(ad->win);
          -elm_win_conformant_set(ad->win, EINA_TRUE);
          -evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(ad->win, conform);
          -evas_object_show(conform);
          -
          -// Naviframe
          -nf = elm_naviframe_add(conform);
          -elm_object_content_set(conform, nf);
          -evas_object_show(nf);
          -
          - -

          After creating a basic layout, create the main layout for the application. In this sample, it contains a box with 3 labels. The labels show the time, city and date. To add the labels to the box, use the elm_box_pack_end() function.

          - -

          After adding the labels, you must set their text. You can set or decorate the text in the labels using the elm_object_text_set() function. You can modify the text size (font_size), color (color), and thickness (b).

          - -
          -// Add the box
          -box = elm_box_add(nf);
          -// Create a label
          -label1 = elm_label_add(box);
          -// Set text to the label with a tag
          -elm_object_text_set(label1, "<font_size=110><color=#000000>07:26</color></font_size>");
          -// Add the label to the box
          -elm_box_pack_end(box, label1);
          -// Change label visibility
          -evas_object_show(label1);
          -
          -// Repeat with other labels
          -
          -evas_object_show(box);
          -
          - -

          After creating the box with labels, set the box as a new view. You can also set the title of the application. These operations are handled by the naviframe using the elm_naviframe_item_push() function:

          - -
          elm_naviframe_item_push(nf, _("World Clock"), NULL, NULL, box, "basic");
          - -

          The parameters include the title, the name of the UI component added as a new view, and the naviframe style. The basic style is used for a simple view with normal title.

          - -

          The following figure illustrates the UI component hierarchy of the application.

          - -

          Figure: Simple clock components

          -

          Simple clock components

          - -

          Set the HW key handler. The Tizen mobile environment supports the More and back keys, but only the back key is handled in this sample.

          -
          eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          -
          - -

          After setting the callback function, the win_back_cb callback is invokes when a back key is pressed. The win_back_cb callback will hide the window:

          -
          static void
          -win_back_cb(void *data , int type , void *event)
          -{
          -   appdata_s *ad = data;
          -   elm_win_lower(ad->win);
          -}
          -
          - -

          Creating a Complex Clock View

          - -

          This sample creates a complex clock view. The sample demonstrates how to organize a basic layout using boxes. The application includes the following UI components:

          - - -
            -
          • Elm_window: Basic canvas for rendering the screen
          • -
          • Elm_conformant: Support indicator area
          • -
          • Elm_naviframe: View manager component
          • -
          • Elm_box: Container component for layouting other UI components
          • -
          • Elm_label: Basic UI component for showing text with a tag
          • -
          • Elm_genlist: List component
          • -
          • Elm_button: Simple push button
          • -
          - -

          The following figure illustrates the main view of the complex clock sample application and its wireframe structure.

          - -

          Figure: Complex clock screen

          -

          Complex clock screen

          - -

          Basic GUI

          - -

          The basic clock is implemented in the world_clock.c file. In this application, the data structure for application is following:

          - -
          typedef struct appdata
          -{
          -   // Save the window
          -   Evas_Object *win;
          -} 
          -appdata_s;
          -
          - -

          The information in appdata is used for the entire system. In this sample application, the information is related to handling the HW back key.

          - -

          The single callback function for application handling is app_create, and it only creates the basic GUI:

          - -
          int
          -main(int argc, char *argv[])
          -{
          -   appdata_s *ad = {0,};
          -   app_event_callback_s event_callback = {0,};
          -   int ret = 0;
          -
          -   event_callback.create = app_create;
          -   event_callback.terminate = app_terminate;
          -   event_callback.pause = app_pause;
          -   event_callback.resume = app_resume;
          -   event_callback.app_control = app_control;
          -
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          -   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          -
          -   ret = ui_app_main(argc, argv, &event_callback, &ad);
          -   if (ret != APP_ERROR_NONE) 
          -   {
          -      dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret);
          -   }
          -
          -   return ret;
          -}
          -
          -static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          -
          - -

          The base GUI of the application contains the following elements:

          - -
            -
          • Clock
          • -
          • List
          • -
          • Main layout with buttons
          • -
          - -

          Clock

          - -

          The clock element contains 3 labels. The labels are packed as a single box component, which is part of the main layout.

          -
          static Evas_Object *
          -create_clock(Evas_Object *nf)
          -{
          -   Evas_Object *box, *label1, *label2, *label3;
          -
          -   // Box
          -   box = elm_box_add(nf);
          -
          -   label1 = elm_label_add(box);
          -   elm_object_text_set(label1, "<font_size=110><color=#000000>07:26</color></font_size>");
          -   elm_box_pack_end(box, label1);
          -   evas_object_show(label1);
          -
          -   evas_object_show(box);
          -
          -   return box;
          -}
          -
          - -

          List

          - -

          This element contains a list of cities. The UI component used is genlist, which is a complex list able to show information with various styles.

          -
          static Evas_Object *
          -create_list(Evas_Object *nf)
          -{
          -   Evas_Object* list;
          -   Elm_Genlist_Item_Class *itc = NULL;
          -   int i, num_of_item;
          -   Elm_Object_Item *it;
          -   
          -   list = elm_genlist_add(nf);
          -
          - -

          To add items to the list, use the Elm_Genlist_Item_Class class. After adding a new class, set callback function to detect, when the item is rendered.

          -
          itc = elm_genlist_item_class_new();
          -   itc->item_style = "2line.top.4";
          -   itc->func.text_get = gl_text_get_cb;
          -   itc->func.content_get = NULL;
          -   itc->func.del = NULL;
          -
          - -

          In this application, all the list items are similar and use the same callback function (gl_text_get_cb()) for setting text, so only 1 item class is created:

          -
          static char*
          -gl_text_get_cb(void *data, Evas_Object *obj, const char *part)
          -{
          -   item_data_s *id = data;
          -   char buf[1024];
          -
          -   if (id->index == 0) 
          -   {
          -      if (!strcmp(part, "elm.text.main.left.top")) 
          -      {
          -         snprintf(buf, 1023, "%s", "07:26");
          -
          -         return strdup(buf);
          -      }
          -      else if (!strcmp(part, "elm.text.sub.right.top")) 
          -      {
          -         snprintf(buf, 1023, "%s", "Cardiff");
          -
          -         return strdup(buf);
          -      }
          -      else if (!strcmp(part, "elm.text.sub.left.bottom")) 
          -      {
          -         snprintf(buf, 1023, "%s", "Wen, Jan 1");
          -
          -         return strdup(buf);
          -      }
          -      else if (!strcmp(part, "elm.text.sub.right.bottom")) 
          -      {
          -         snprintf(buf, 1023, "%s", "wales");
          -
          -         return strdup(buf);
          -      }
          -   }
          -
          -   return NULL;
          -}
          -
          - -

          Append items using the elm_genlist_item_append() function. In this application, 3 items are added:

          -
          num_of_item = 3;
          -
          -   for (i = 0; i < num_of_item; i++) 
          -   {
          -      item_data_s *id = calloc(sizeof(item_data_s), 1);
          -      id->index = i;
          -      it = elm_genlist_item_append(list,
          -                                   itc,
          -                                   id,
          -                                   NULL,
          -                                   ELM_GENLIST_ITEM_NONE,
          -                                   NULL,
          -                                   id);
          -      id->item = it;
          -   }
          -
          - -

          Main Layout with a Button

          - -

          In the main layout, the other layout elements are merged together and a button added. The following example describes handling the main layout:

          - -
          static void
          -create_base_gui(appdata_s *ad)
          -{
          -   Evas_Object *conform, *nf, *box, *clock, *layout, *rect, *button;
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   // Conformant
          -   conform = elm_conformant_add(ad->win);
          -   elm_win_conformant_set(ad->win, EINA_TRUE);
          -   evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, conform);
          -   evas_object_show(conform);
          -
          -   // Naviframe
          -   nf = elm_naviframe_add(conform);
          -   elm_object_content_set(conform, nf);
          -   evas_object_show(nf);
          -}
          -
          - -

          The box component is used to organize the main layout. The box is expanded as much as possible to fill the entire view.

          -
             // Box
          -   box = elm_box_add(nf);
          -   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);
          -
          - -

          The box contains the following elements:

          - -
            - -
          • The clock element contains 3 labels. The parameter for the evas_object_size_hint_weight_set() function is 0.1 meaning that the height of the clock box occupies 30% of the available area.

            -
               clock = create_clock(nf);
            -   evas_object_size_hint_weight_set(clock, EVAS_HINT_EXPAND, 0.3);
            -   evas_object_size_hint_align_set(clock, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   elm_box_pack_end(box, clock);
            -
            -
          • - -
          • The list element is packed into the box. As the genlist elements does not have a determined size, its size depends on the layout parameter.

            -
            -   layout = elm_layout_add(box);
            -   elm_layout_theme_set(layout, "layout", "application", "default");
            -   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);
            -   rect = create_list(nf);
            -   elm_layout_content_set(layout, "elm.swallow.content", rect);
            -   evas_object_show(rect);
            -   evas_object_show(layout);
            -   elm_box_pack_end(box, layout);
            -
            -
          • - -
          • The button element has a callback function to detect, when the button is clicked.

            -
            button = elm_button_add(box);
            -   evas_object_smart_callback_add(button, "clicked", btn_clicked_cb, NULL);
            -   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0.1);
            -   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            -   elm_object_text_set(button, "Terminate");
            -   evas_object_show(button);
            -   elm_box_pack_end(box, button);
            -
            -
          • -
          - -

          The following figure illustrates the UI component hierarchy of the application.

          - -

          Figure: Complex clock components

          -

          Complex clock components

          - -

          Add the main layout to the naviframe, and set the HW key handler:

          -
          eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          -
          - -

          After setting the callback function, the win_back_cb callback is invokes when a back key is pressed. The win_back_cb callback will hide the window:

          -
          static void
          -win_back_cb(void *data , int type , void *event)
          -{
          -   appdata_s *ad = data;
          -   elm_win_lower(ad->win);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/main_loop_n.htm b/org.tizen.ui.guides/html/native/efl/main_loop_n.htm deleted file mode 100755 index 0b1eb5e..0000000 --- a/org.tizen.ui.guides/html/native/efl/main_loop_n.htm +++ /dev/null @@ -1,409 +0,0 @@ - - - - - - - - - - - - - Handling the Main Loop - - - - - -
          - -

          Handling the Main Loop

          - -

          The EFL is event-driven. This means that the application polls for data, and listens for events to interact with it.

          - -

          The Ecore library provides the main loop abstraction. It gets data when data is available and sends the events so that costly polling threads are not needed. Ecore manages polling, timers, events, and file descriptors. When there is no ongoing event, the main loop automatically enters an idle mode, minimizing the power consumption. The loop wakes up when needed.

          - -

          Starting the Main Loop

          - -

          To start the Ecore main loop and move your application into the running state, call the ui_app_main() function. The Ecore main loop handles all general events, such as touch, mouse, key, and network events.

          - -
          -int
          -main(int argc, char *argv[])
          -{
          -   ret = ui_app_main(argc, argv, &event_callback, &ad);
          -
          -   return ret;
          -}
          -
          - -

          When your application is running:

          -
          1. Create a window and organize the UI components inside the window.
          2. -
          3. Create the application logic code to be called when callbacks or timed events occurs (for example, animators for animations and timers for timeouts).
          - - -

          Timers

          - -

          Ecore provides timers, which schedule events that are executed later at a specific time. The event can occur once or several times at specific intervals.

          - -

          A timer callback prototype looks like the my_timed_cb() callback function. This function receives data from the application, and returns a Boolean value to specify whether it is called again or completed. The following macros are also provided:

          - -
            -
          • ECORE_CALLBACK_RENEW: the function is called again after the timeout.
          • -
          • ECORE_CALLBACK_CANCEL: the function is not called again, Ecore destroys automatically everything associated with the timer.
          • -
          - -

          To create and destroy a timer:

          - -
            -
          • To create a timer, use the ecore_timer_add() function. The interval, specified in seconds, indicates when the given function is called, and receives the specified data as a parameter. It returns an Ecore_Timer object. -

            In the following example, the my_timed_cb() function is run after 2 seconds and it receives my_data. It is renewed while its count variable value is under 5, and stops after that.

            -
            -Eina_Bool my_timed_cb(void *data)
            -{
            -   static int count = 0;
            -   count++;
            -
            -   if (count < 5) 
            -      return ECORE_CALLBACK_RENEW;
            -
            -   return ECORE_CALLBACK_CANCEL;
            -}
            -ecore_timer_add(2.0, my_timed_cb, my_data);
            -
            -
          • - -
          • To delete the timer, use the ecore_timer_del() function. The timer to delete must still be running, that is, it has not returned a false value. If the timer is not running, the function cannot be called.
          • -
          - -

          To manage a timer:

          -
            -
          • To change the timer's interval, use the ecore_timer_interval_set() function. The interval is specified in seconds. If set during a timer call, this affects the next interval. Use the ecore_timer_interval_get() function to get the timer's current interval.
          • - -
          • To get the timer's pending time, use the ecore_timer_pending_get() function.
          • - -
          • To delay the timer's next occurrence, use the ecore_timer_delay() function. The function adds the specified time to the current interval. It does not change the future occurrences' interval. You can also reset the current interval to its full value by using the ecore_timer_reset() function.
          • - -
          • To pause the currently running timer, use the ecore_timer_freeze() function. The remaining time is saved and used again when the timer is resumed with the ecore_timer_thaw() function.
          • - -
          • To query the current value of the defined timer infrastructure precision, use the ecore_timer_precision_get() function. A higher delay means that more timers can be run together. It diminishes the need to use system wake-ups and thus lowers the power consumption. -

            To set the precision, use the ecore_timer_precision_set() function. This sets the precision for all timers. For example, there are 2 timers, one that expires in 2.0 seconds and another that expires in 2.1 seconds. If the precision is set to 0.1 seconds, Ecore requests the next expiration to happen in 2.1 seconds and runs both callbacks at once, instead of one at 2.0 seconds and the other one 0.1 seconds later. However, if there is no timer expiring in 2.1 seconds, the timeout is at the minimum interval, 2 seconds.

          • -
          - -

          Animators

          - -

          Animators are a specific type of timer, specially designed for on-screen animation purposes:

          - -
            -
          • The time interval is usually known when they are created.
          • -
          • They are called at each screen refresh and their interval can vary. The interval can depend on the system load, the target power consumption, and other factors. The exact interval is not relevant.
          • -
          - -

          To implement animators, Ecore provides the Ecore animator subsystem.

          - -

          Forever-running Animator

          - -

          To create an animation that runs for an indefinite time:

          - -
          -Eina_Bool my_anim_cb(void *data)
          -{
          -   static int count = 0;
          -   count++;
          -   if (count < 5) 
          -      return ECORE_CALLBACK_RENEW;
          -
          -   return ECORE_CALLBACK_CANCEL;
          -}
          -ecore_animator_add(my_anim_cb, my_data);
          -
          - -

          This example looks the same as the one using an Ecore timer. The ecore_animator_add() function takes the callback function and data to pass to it, and returns an Ecore_Animator object. The function is called at a system-defined interval until it returns ECORE_CALLBACK_CANCEL instead of ECORE_CALLBACK_RENEW.

          - -

          Specific-duration Animator

          - -

          An animator callback for an animator running a specific time has a different prototype than the forever running animator.

          - -

          This callback function receives both data and a position which represents the current time among the full timeline, 0 meaning the beginning of the animation, and 1 meaning the end of the animation, returning ECORE_CALLBACK_CANCEL to abort, or ECORE_CALLBACK_RENEW to continue.

          - -

          To create and destroy the animator:

          -
            -
          • To create the animator, use the ecore_animator_timeline_add() function. The first parameter specifies the animator duration, the second parameter is the callback function, and the third parameter is the data to pass to the callback. The data parameter is optional. -
            -Eina_Bool my_anim_cb(void *data, double position)
            -{
            -   if (position < .5) 
            -      return ECORE_CALLBACK_RENEW;
            -
            -   return ECORE_CALLBACK_CANCEL;
            -}
            -ecore_animator_timeline_add(5., my_anim_cb, my_data);
            -
            - -

            In this example, the animator is specified to run for five seconds. The function returns ECORE_CALLBACK_CANCEL as soon as the position among the timeline passes half of the duration, 2.5 seconds.

            - -

            Ecore can generate a virtual position from the original one using ecore_animator_pos_map(position, map, v1, v2). Several maps are available:

            - -
              -
            • ECORE_POS_MAP_LINEAR: linear from 0.0 to 1.0.
            • -
            • ECORE_POS_MAP_ACCELERATE: start slow, then speed up.
            • -
            • ECORE_POS_MAP_DECELERATE: start fast, then slow down.
            • -
            • ECORE_POS_MAP_SINUSOIDAL: start slow, speed up, then slow down at the end.
            • -
            • ECORE_POS_MAP_ACCELERATE_FACTOR: start slow, then speed up, v1 being a power factor: 0.0 is linear, 1.0 is standard acceleration, 2.0 is a much more pronounced acceleration (squared), and 3.0 is cubed.
            • -
            • ECORE_POS_MAP_DECELERATE_FACTOR: start fast, then slow down, v1 being a power factor: 0.0 is linear, 1.0 is standard deceleration, 2.0 is a much more pronounced deceleration (squared), and 3.0 is cubed.
            • -
            • ECORE_POS_MAP_SINUSOIDAL_FACTOR: start slow, speed up, then slow down at the end, v1 being a power factor: 0.0 is linear, 1.0 is a standard sinusoidal, 2.0 is a much more pronounced sinusoidal (squared), and 3.0 is cubed.
            • -
            • ECORE_POS_MAP_DIVISOR_INTERP: start at gradient * v1, interpolated with the power of v2 curve.
            • -
            • ECORE_POS_MAP_BOUNCE: start at 0.0, then drop like a ball bouncing to the ground at 1.0, and bounce v2 times, with a decay factor of v1.
            • -
            • ECORE_POS_MAP_SPRING: start at 0.0, then wobble like a spring to the rest position 1.0, and wobble v2 times, with a decay factor of v1.
            • -
            - -

            Figure: Position maps

            -

            Position maps

            -
          • - -
          • To destroy the animator, use the ecore_animator_del() function. The animator to destroy must be running, that is, it has not returned a false value. If the animator is not running, the function cannot be called.
          • -
          - -

          To manage the animator:

          -
            -
          • To pause the currently running animator, use the ecore_animator_freeze() function. Note that time continues ticking even if the animator is frozen, and that resuming the animation using the ecore_animator_thaw() function does not actually resume, if the full runtime has been passed in the meanwhile.
          • - -
          • To query Ecore for the interval between 2 animator calls, use the ecore_animator_frametime_get() function.
          • - -
          • To change the interval, use the ecore_animator_frametime_set(interval) function. Note that too small a value causes performance and power consumption issues, and too high a value makes the animation jerky.
          • -
          - -

          File Descriptors

          - -

          Ecore provides an infrastructure to monitor file descriptors, so that files do not have to be blocked or polled to read or write on them. Instead, monitor sockets, pipes, or other streams are used to get a file descriptor.

          - -

          To manage the file descriptors:

          -
            -
          • To set a callback, use the _my_cb_func() function. Its first parameter is the data passed to it (optional), and the second one is the Ecore file descriptor handler. Its return value is, as in most Ecore callbacks, ECORE_CALLBACK_RENEW or ECORE_CALLBACK_CANCEL. It tells Ecore whether it wants to be called again or whether its treatment is finished.
          • - -
          • To listen to events, use the ecore_main_fd_handler_add() function.
          • - -
          • To wait for incoming data (that is, to read data) on the my_fd file descriptor, passing my_data: - -
            -Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler)
            -{
            -   int fd;
            -   fd = ecore_main_fd_handler_fd_get(handler);
            -   count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block
            -
            -   return ECORE_CALLBACK_RENEW;
            -}
            -ecore_main_fd_handler_add(my_fd, ECORE_FD_READ, my_fd_cb, my_data, NULL, NULL);
            -
            -
          • - -
          • To delete a file descriptor handler, use the ecore_main_fd_handler_del() function. This does not close the file descriptor. Always delete the handlers before closing the actual file descriptors.
          • - -
          • To get the handler's file descriptor, use the ecore_main_fd_handler_fd_get() function.
          • - -
          • To select whether a flag is active on a handler, use the ecore_main_fd_handler_active_get() function. For example, the handler is set to monitor both ECORE_FD_READ and ECORE_FD_ERROR. The following example finds out whether the function was called because of an error: - -
            -Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler)
            -{
            -   int fd;
            -   fd = ecore_main_fd_handler_fd_get(handler);
            -   if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR) == EINA_TRUE) 
            -   {
            -      // We have an error!
            -
            -      return ECORE_CALLBACK_CANCEL;
            -   }
            -   count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block
            -
            -   return ECORE_CALLBACK_RENEW;
            -}
            -ecore_main_fd_handler_add(my_fd, ECORE_FD_READ | ECORE_FD_ERROR, my_fd_cb, my_data, NULL, NULL);
            -
            -
          • - -
          • To change the flags the handler is monitoring, use the ecore_main_fd_handler_active_set() function.
          • -
          - -

          Threads

          - -

          EFL is not entirely thread-safe. This means that if a task is running in another thread and, for example, an Evas object shows the status progress of this task, the object cannot be updated from within the thread. Updating can only be done from the main thread that runs the main loop.

          - -

          Ecore provides a facility to perform tasks on separate worker threads. It is not a simple wrapper around standard threads provided by the operating system. With Ecore threads, it is easier to dispatch a worker function to perform some heavy tasks and get the result once it completes. It does not block the application UI. It is also easy to cancel and reschedule threads. Several threads can be launched simultaneously, since Ecore schedules them according to the number of processors the system has and the maximum amount of concurrent threads set for the application.

          - -

          Ecore has 2 kinds of threads:

          -
            -
          • Short jobs do not give any kind of information on their status to the parent. They are best used for short computing-intensive snippets of code.
          • -
          • Feedback jobs give information on their status to the parent. They are best used for longer snippets requiring a feedback loop, such as an ongoing file download.
          • -
          - -

          Ecore creates a pool of worker threads. The exact count is computed from the number of CPUs or cores, or it can be specified by the application itself.

          - -

          When a worker thread is idle, it picks a job to execute from the waiting list until there is none left. In the following example, there are 2 threads defined by my_short_job() and my_feedback_job(). Both threads take 2 parameters: some data passed to them, and the actual thread running. Call a callback when the jobs end, whether they are cancelled (my_job_cancel()) or end normally (my_job_end()).

          - -
          -struct feedback_msg
          -{
          -   int pos;
          -};
          -
          -void my_short_job(void *data, Ecore_Thread *thread)
          -{
          -   usleep(200000);
          -}
          -
          -void my_feedback_job(void *data, Ecore_Thread *thread)
          -{
          -   int i;
          -   for (i = 0; i < 100; i++) 
          -   {
          -      usleep(50000); // You can have some real computation done
          -      struct feedback_msg *message = malloc(sizeof(struct feedback_msg));
          -      if (message) 
          -      {
          -         message->pos = i;
          -         ecore_thread_feedback(thread, message);
          -      }
          -      if (ecore_thread_check(thread))
          -         return;
          -   }
          -}
          -
          -void my_feedback_job_notify(void *data, Ecore_Thread *thread, void *msg)
          -{
          -   struct feedback_msg *message = msg;
          -   free(message);
          -}
          -
          -void my_job_end(void *data, Ecore_Thread *thread)
          -{
          -   dlog_print(DLOG_INFO, LOG_TAG, "Thread has normally ended.\n");
          -}
          -
          -void my_job_cancel(void *data, Ecore_Thread *thread)
          -{
          -   dlog_print(DLOG_INFO, LOG_TAG, "Thread has been cancelled.\n");
          -}
          -
          -ecore_thread_run(my_short_job, my_job_end, my_job_cancel, my_data);
          -ecore_thread_feedback_run(my_feedback_job, my_feedback_job_notify, my_job_end, 
          -                          my_job_cancel, my_data, EINA_FALSE);
          -
          - -

          To manage threads:

          - -
            -
          • To cancel a thread, use the ecore_thread_cancel() function. However, note that this is done cooperatively: the thread continues to run until it exists. Call the ecore_thread_check() function regularly to check whether the thread has been marked for cancellation and exit if true.
          • - -
          • To run threads that are not accounted for in the worker thread pool, use the ecore_thread_feedback_run() function with the last parameter set to EINA_TRUE. - -

            The feedback message a thread sends as notification can be any kind of data. In the above example, it is a simple integer, but it can be as complex as needed.

            -
          • - -
          • To execute a thread later, use the ecore_thread_reschedule() function. This function is added to the end of the pending tasks.
          • - -
          • To get the maximum number of concurrent threads, use the ecore_thread_max_get() function. If needed, set it by using the ecore_thread_max_set() function, or reset the default value using the ecore_thread_max_reset() function.
          • - -
          • To query the number of active threads, use the ecore_thread_active_get() function. To query the number of available worker threads, use the ecore_thread_available_get() function, which is basically the same as the ecore_thread_max_get() - ecore_thread_active_get().
          • -
          - -

          Idlers

          - -

          When the rendering is done and all work is finished, the main loop enters its idle state until the next loop. You can get the functions of your application called back before the main loop enters or exits the idle state, or when it is in the idle state. They are respectively called Ecore_Idle_Enterer, Ecore_Idle_Exiter, and Ecore_Idler.

          - -

          Figure: Idle loop

          -

          Idle loop

          - -

          The idle enterers, exiters, and idlers all have the same prototype, my_idler(), which receives data and returns ECORE_CALLBACK_RENEW or ECORE_CALLBACK_CANCEL to tell Ecore whether it wants to be called again or is finished.

          - -

          To manage the idlers:

          -
            -
          • To add an idler, use the ecore_idler_add() function.
          • -
          • To delete an idler, use the ecore_idler_del() function.
          • - -
          • To add and delete idle exiters, use the ecore_idle_exiter_add() and ecore_idle_exiter_del() functions.
          • - -
          • To add and delete idle enterers, use the ecore_idle_enterer_add() and ecore_idle_enterer_del() functions. The ecore_idle_enterer_before_add() function is also available, if you want your function to be added at the top of the list so that it is called before the others.
          • -
          - -
          -Eina_Bool my_idle_enterer_cb(void *data)
          -{
          -   return ECORE_CALLBACK_RENEW;
          -}
          -
          -Eina_Bool my_idle_exiter_cb(void *data)
          -{
          -   return ECORE_CALLBACK_CANCEL;
          -}
          -
          -Eina_Bool my_idler(void *data)
          -{
          -   return ECORE_CALLBACK_RENEW;
          -}
          -
          -ecore_idle_enterer_add(my_idle_enterer_cb, my_data);
          -ecore_idle_exiter_add(my_idle_exiter_cb, my_data);
          -ecore_idler_add(my_idler_cb, my_data);
          -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/menu_tutorial_mn.htm b/org.tizen.ui.guides/html/native/efl/menu_tutorial_mn.htm deleted file mode 100755 index 2ea5471..0000000 --- a/org.tizen.ui.guides/html/native/efl/menu_tutorial_mn.htm +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - - - - - - - - - Creating Mobile Menus - - - - - - -
          -

          Creating Mobile Menus

          - - -

          This tutorial shows how to add menus to the application. The example code creates an application with 3 views, these views are showed by an interaction with a menu bar, placed on the top of the application. The application has also a hidden menu that appears only when the menu button is pressed.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - - -

          Defining the Application "Structure"

          - -

          Define the structure of the application:

          -
          typedef struct appdata
          -{
          -   Evas_Object* win; // The main window
          -   Evas_Object* layout; // The Edje layout
          -   Evas_Object* conform; // The conform
          -   Evas_Object *nf; // The Naviframe to handle the views
          -   appmenu_s *menu; // The main menu
          -   appmenu_s *sidemenu; // The side menu
          -   mainview_s *main_view; // The main view (dayselector)
          -   calview_s *cal_view; // The calendar view
          -   dateview_s *date_view; // The date and time view
          -   settview_s *settings_view; // The settings view
          -   Eina_Bool sdmenu_up; // A Boolean variable to keep the side menu status
          -} appdata_s;
          -
          -

          This structure contains some specific variables for the views and the menus.

          -

          Define the main view by using the structure mainview, it is composed of a box (the main container), a dayselector, an image img, and a label lb_main.

          -
          typedef struct mainview
          -{
          -   Evas_Object *box; // The main container of the view
          -   Evas_Object *colorselector; // A color selector
          -   Evas_Object *img; // An image 
          -   Evas_Object *lb_day; // A label
          -} mainview_s;
          -
          -

          The date view is very similar, it contains a box, a datetime component and a label lb_date.

          -
          typedef struct dateview
          -{
          -   Evas_Object *box; // The main container of the view 
          -   Evas_Object *datetime; // A datetime component 
          -   Evas_Object *lb_date; // A label 
          -} dateview_s;
          -
          -

          The last view is the calendar, it contains a box, a calendar and a label lb_cal.

          -
          typedef struct calview
          -{
          -   Evas_Object *box; // The main container of the view 
          -   Evas_Object *calendar; // A calendar component  
          -   Evas_Object *lb_cal; // A label component
          -} calview_s;
          -
          -

          The last members of the application structure are the 2 menus. The main menu is fixed and visible, and the side menu is hidden on application starts. These menus are represented by the appmenu structure.

          -
          typedef struct appmenu
          -{
          -   Evas_Object *tb; // The toolbar
          -   Elm_Object_Item *submenu; // The submenu item
          -} appmenu_s;
          -
          - -

          Defining the Application Theme

          - -

          After the structure is defined, define the UI. In this tutorial, Basic EDC UI Application is used.

          -

          This application structure is based on this skeleton:

          - -

          Figure: Menu skeleton

          -

          Menu skeleton

          - - -

          The window, the conformant and the layout are set by the Basic EDC UI Application skeleton. Setup the containers for UI components and views.

          -

          Create the main_menu SWALLOW part in the .edc file.

          -
          -part
          -{
          -   name: "menu/main";
          -   type: SWALLOW;            
          -   description 
          -   {
          -      state: "default" 0.0;
          -      rel1.relative: 0.0 1.0;
          -      rel2.relative: 1.0 1.0;
          -   }
          -   description 
          -   {
          -      state: "up" 0.0;
          -      rel1.relative: 0.0 0.01;
          -      rel2.relative: 1.0 0.18;
          -      
          -   }
          -} // End menu/main
          -
          -

          This part has two descriptions, one for the real position named up and another out of the screen as the default position. Create these states to animate the menu on application start. The animation is run by animation,menu_main.

          -
          program
          -{ 
          -   name: "animation,menu_main";
          -   source: "";
          -   signal: "load";
          -   action: STATE_SET "up" 1.0;
          -   target: "menu/main";
          -   transition: LINEAR 0.5;
          -} // END animation,menu_main
          -
          -

          For more information about animations, see the Effects tutorial.

          -

          Create another container for the views. This container is also a "SWALLOW" part.

          -
          part 
          -{
          -   name: "view/main";
          -   type: SWALLOW;            
          -   description 
          -   {
          -      state: "default" 0.0;
          -      rel1.relative: 0.0 1.0;
          -      rel2.relative: 1.0 1.0;
          -   }
          -   description 
          -   {
          -      state: "up" 0.0;
          -      rel1.relative: 0.0 1.1;
          -      rel1.to: "menu/main";
          -      rel2.relative: 1.0 1.0;
          -      color: 0 255 0 255; 
          -   }
          -} // END view/main 
          -
          -

          This part has also two descriptions for animation purpose, like the main_menu part.

          -

          The program:

          -
          program 
          -{ 
          -   name: "animation,view_main";
          -   source: "";
          -   signal: "load";
          -   action: STATE_SET "up" 1.0;
          -   target: "view/main";
          -   transition: LINEAR 0.2;
          -} // END animation,view_main
          -
          -

          The last container is the side menu called menu/side.

          -
          -part 
          -{ 
          -   name: "menu/side";
          -   type: SWALLOW;
          -   description 
          -   { 
          -      state: "default" 0.0;
          -      rel1.relative: -0.3 0.0;
          -      rel2.relative: -0.3 1.0;
          -      color: 255 0 0 255; 
          -   }
          -   description 
          -   {
          -      state: "up" 0.0;
          -      rel1.relative: 0.0 0.01;
          -      rel2.relative: 0.3 1.0;
          -     color: 255 0 0 255;
          -   }
          -} // END menu/side
          -
          -

          By default, this container is hidden. Clicking menu button makes it appear. The second description places the container on the left of the screen. Here is the program to run animation:

          -
          - program 
          -{ 
          -   name: "animation,menu_side";
          -   source: "MenuButton";
          -   signal: "show,sidemenu";
          -   action: STATE_SET "up" 1.0;
          -   target: "menu/side";
          -   transition: LINEAR 0.2;
          -} // END animation,menu_side
          -
          -

          This program runs when it receives an event called show,sidemenu from MenuButton source.

          -

          Create a program that does the opposite and starts when it receives a signal called hide,menu_side from MenuButton source.

          -
          -program 
          -{ 
          -   name: "animation,menu_side,hide";
          -   source: "MenuButton";
          -   signal: "hide,sidemenu";
          -   action: STATE_SET "default" 1.0;
          -   target: "menu/side";
          -   transition: LINEAR 0.2;
          -} // END animation,menu_side,hide
          -
          -program 
          -{ 
          -   name: "animation,menu_side";
          -   source: "MenuButton";
          -   signal: "show,sidemenu";
          -   action: STATE_SET "up" 1.0;
          -   target: "menu/side";
          -   transition: LINEAR 0.2;
          -} // END animation,menu_side
          -
          - -

          Creating the Basic UI

          - -

          The view container view/main is structured like this:

          - - -

          Figure: Main view

          -

          Main view

          - -

          The naviframe contains and manages the boxes. For more information, see the Container programming guide. This UI component handle views. In this example each view is contained in a box and the box is contained in the naviframe.

          -

          Create the naviframe in the create_base_gui function and allocate the memory to handle the views and menus of the application.

          -
          -// Memory allocation
          -ad->main_view = calloc(1, sizeof(mainview_s)); // Allocating memory for the main view 
          -ad->cal_view = calloc(1, sizeof(calview_s));   // Allocating memory for the calendar view 
          -ad->date_view = calloc(1, sizeof(dateview_s)); // allocating memory for the date view 
          -ad->settings_view = calloc(1, sizeof(settview_s)); // allocating memory for the Settings view
          -// END of Memory allocation
          -
          -

          Use app_terminate function to free the memory:

          -
          app_terminate(void *data)
          -{
          -   // Release all resources
          -   appdata_s *ad = data;
          -
          -   free(ad->menu);
          -   free(ad->sidemenu);
          -   free(ad->main_view);
          -   free(ad->cal_view);
          -   free(ad->settings_view);
          -} // END of app_terminate
          -
          -

          Create the naviframe:

          - -

          Create the main menu after most of the containers are created. First create a new _build_main_menu function, it takes an appdata_s as a parameter. This function is called by create_base_gui.

          -
          static void _build_main_menu(appdata_s *ad)
          -{
          -   // Memory allocation for the main menu function
          -   appmenu_s *menu = calloc(1, sizeof(appmenu_s));
          -   // Putting the "main" menu in the application data
          -   ad->menu = menu;
          -
          -   // Creation of the "Menu" toolbar
          -   menu->tb = elm_toolbar_add(ad->win);
          -
          -   // Setting the "Menu" Toolbar properties
          -   elm_toolbar_shrink_mode_set(menu->tb, ELM_TOOLBAR_SHRINK_NONE);
          -   elm_toolbar_transverse_expanded_set(menu->tb, EINA_TRUE);
          -   elm_toolbar_homogeneous_set(menu->tb, EINA_FALSE);
          -
          -   // Adding menu items to the "Menu" toolbar
          -   elm_toolbar_item_append(menu->tb, ICON_DIR"/home.png", "Home", _menu_item_selected_cb, ad);
          -   elm_toolbar_item_append(menu->tb, ICON_DIR"/calendar.png", "Calendar", _menu_item_selected_cb, ad);
          -   elm_toolbar_item_append(menu->tb, ICON_DIR"/clock.png", "Date", _menu_item_selected_cb, ad);
          -   elm_toolbar_item_append(menu->tb, ICON_DIR"/settings.png", "Settings", _menu_item_selected_cb, ad);
          -
          -   // Showing the UI component
          -   evas_object_show(menu->tb);
          -
          -   // Adding the UI component to the "menu/main" SWALLOW container defined in the .edc theme file.
          -   elm_object_part_content_set(ad->layout, "menu/main", menu->tb);
          -
          -   // Set the default view 
          -   elm_toolbar_item_selected_set(elm_toolbar_first_item_get(menu->tb), EINA_TRUE);
          -}
          -
          -

          Create a toolbar with elm_toolbar_add. This toolbar is a child of the main window so set ad->win as parameter.

          -

          Setup the behavior of the toolbar, the display mode is set by using elm_toolbar_shrink_mode_set. The toolbar does not scroll under #ELM_TOOLBAR_SHRINK_NONE mode, but it enforces a minimum size, so that all the items fit inside it. It does not scroll or show the items that do not fit under #ELM_TOOLBAR_SHRINK_HIDE mode. Finally, it scrolls under #ELM_TOOLBAR_SHRINK_SCROLL mode, and it creates a button to aggregate items which did not fit with the #ELM_TOOLBAR_SHRINK_MENU mode.

          - -

          In this example, there is only a limited number of menu elements and thus ELM_TOOLBAR_SHRINK_NONE is used.

          - -

          Expand the transverse length of the item according the transverse length of the toolbar, giving EINA_TRUE as second parameter of elm_toolbar_transverse_expanded_set.

          - -

          Make the menu items have the same size by setting EINA_TRUE to elm_toolbar_homogeneous_set. This activates the homogeneous mode of the toolbar.

          -

          Add menu items to the toolbar using elm_toolbar_item_append. This function takes 4 parameters:

          -
            -
          • the target toolbar
          • -
          • the icon path for the menu item
          • -
          • the item label
          • -
          • the function to call when the item is clicked
          • -
          • the data to associate with the item for related callbacks.
          • -
          -

          For the icons, add some images in the resource directory of the application res/images and define a macro to contain this path in the application .h file. In this example it is inc/menututorial.h.

          - -
          #define ICON_DIR "/opt/usr/apps/"PACKAGE"/res/images"
          -
          -

          Use the PACKAGE macro to setup this ICON_DIR macro. This way you can add items to the toolbar using icon images placed in the resource directory of the application.

          - -

          The item label is very important, it is used in the item callback function.

          - -

          In this example, only one callback is created to manage all the items but there can be several callback functions. Pass the application data to the callback.

          - -

          This callback is an Evas_Smart_Cb, it must have this prototype:

          -
          -_mycallback(void *data, Evas_Object *obj, void *ev)
          -
          - -

          In this example, the aim of the callback is to create the view which the user has requested. It is named _menu_item_selected_cb, and in this function we recover the calling object text to call the correct view creation function.

          -
          -it = ev;
          -
          -// Get the menu item text
          -str = elm_object_item_text_get(it);
          -
          -// Comparing with the possible view names
          -if (!strcmp(str, "Calendar")) 
          -{
          -   // Build the "Calendar View"
          -   _build_calendar_view(ad);
          -   // Set the view from the application data
          -   view = ad->cal_view->box;
          -}
          -else if (!strcmp(str, "Date")) 
          -{
          -   // Build the "Date View"
          -   _build_date_view(ad);
          -   // Set the view from the application data
          -   view = ad->date_view->box;
          -}
          -else if (!strcmp(str, "Home")) 
          -{
          -   // Build the "Home or main View"
          -   _build_main_view(ad);
          -   // Set the view from the application data
          -   view = ad->main_view->box;
          -}
          -else if (!strcmp(str, "Settings")) 
          -{
          -   // Build the "Settings" view
          -   _build_settings_view(ad);
          -   // Set the view from the application data
          -   view = ad->settings_view->box;
          -}
          -else if (!strcmp(str, "Clock")) 
          -{
          -   // Build the "Date View" 
          -   _build_date_view(ad);
          -   // Set the view from the application data
          -   view = ad->date_view->box;
          -}
          -
          -// Show the view in the naviframe 
          -elm_object_content_set(ad->nf, view);
          -
          -

          The menu has views, Calendar, Date, Settings, and Home (main view). The view names are stored in the menu item label, to get the label compare the returned string with the view names. When the name matches, the view is built by calling the correct function. Store the view in the application data and set up a new content to the naviframe before exit.

          -

          This way when the user clicks a menu item, the view changes. The naviframe component destroys its content on each call of elm_object_content_set. That is why the content must be built again on each item click.

          -

          Create the functions which create the views.

          -
          static void _build_main_view(appdata_s *ad)
          -{
          -   mainview_s *view = ad->main_view;
          -   char buf[PATH_MAX];
          -
          -   // Main box
          -   view->box = elm_box_add(ad->nf);
          -   elm_box_horizontal_set(view->box, EINA_FALSE);
          -   elm_box_homogeneous_set(view->box, EINA_TRUE);
          -
          -   view->colorselector = elm_colorselector_add(view->box);
          -   elm_colorselector_mode_set(view->colorselector, ELM_COLORSELECTOR_PALETTE);
          -   elm_box_pack_start(view->box, view->colorselector);
          -   evas_object_show(view->colorselector);
          -
          -   view->img = elm_image_add(view->box);
          -   evas_object_size_hint_weight_set(view->img, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_size_hint_align_set(view->img, 0.5, 0.5);
          -   evas_object_size_hint_min_set(view->img, 256, 256);
          -   ;snprintf(buf, sizeof(buf), "%s/%s", ICON_DIR, "tizen-logo.png");
          -   if (!elm_image_file_set(view->img, buf, NULL))
          -      elm_object_text_set(view->lb_day, "Problem loading image");
          -   elm_box_pack_start(view->box, view->img);
          -   evas_object_show(view->img);
          -
          -   view->lb_day = elm_label_add(view->box);
          -   elm_object_text_set(view->lb_day, "Main view");
          -   evas_object_size_hint_weight_set(view->lb_day, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_box_pack_end(view->box, view->lb_day);
          -   evas_object_show(view->lb_day);
          -}
          -
          -static void
          -_build_calendar_view(appdata_s *ad)
          -{
          -   calview_s *view = ad->cal_view;
          -
          -   // Main box image = elm_image_add(win);
          -
          -   view->box = elm_box_add(ad->nf);
          -   elm_box_horizontal_set(view->box, EINA_FALSE);
          -   elm_box_homogeneous_set(view->box, EINA_TRUE);
          -
          -   view->calendar = elm_image_add(ad->nf);
          -   evas_object_size_hint_weight_set(view->calendar, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_size_hint_align_set(view->calendar, 0.5, 0.5);
          -   evas_object_size_hint_min_set(view->calendar, 256, 256);
          -   elm_image_file_set(view->calendar, ICON_DIR"/calendar.png", NULL);
          -   elm_box_pack_start(view->box, view->calendar);
          -   evas_object_show(view->calendar);
          -
          -   view->lb_cal = elm_label_add(view->box);
          -   elm_object_text_set(view->lb_cal, "The calendar view");
          -   evas_object_size_hint_weight_set(view->lb_cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_box_pack_end(view->box, view->lb_cal);
          -   evas_object_show(view->lb_cal);
          -} // End of_build_calendar_view
          -
          -

          Each function creates a view and stores it in the application data.

          - -

          Creating a Hidden Menu

          - -

          Add a new function called _build_side_menu to create the side Menu toolbar and add some items to it. This function takes the application data as parameter and stores the built menu in the sidemenu attribute of the structure.

          -
          static void _build_side_menu(appdata_s *ad)
          -{
          -   appmenu_s *sidemenu = calloc(1, sizeof(appmenu_s));
          -   ad->sidemenu = sidemenu;
          -
          -   sidemenu->tb = elm_toolbar_add(ad->win);
          -
          -   elm_toolbar_shrink_mode_set(sidemenu->tb, ELM_TOOLBAR_SHRINK_EXPAND);
          -   elm_toolbar_transverse_expanded_set(sidemenu->tb, EINA_TRUE);
          -
          -   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/home.png", "Home", _menu_item_selected_cb, ad);
          -   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/account.png", "Account", NULL, NULL);
          -   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/contacts.png", "Friends", NULL, NULL);
          -   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/clock.png", "Clock", _menu_item_selected_cb, ad);
          -   elm_toolbar_homogeneous_set(sidemenu->tb, EINA_FALSE);
          -   evas_object_show(sidemenu->tb);
          -   elm_object_part_content_set(ad->layout, "menu/side", sidemenu->tb);
          -   elm_toolbar_horizontal_set(sidemenu->tb, EINA_FALSE);
          -   elm_toolbar_item_selected_set(elm_toolbar_first_item_get(sidemenu->tb), EINA_TRUE);
          -}
          -
          -

          The side menu is created but hidden by default, to make it appear the use must click Home button.

          - -

          By default the Basic EDC UI application creates a function keydown_cb to handle the key down events. In the create_base_gui function an ecore_event_handler_add function is called with the ECORE_EVENT_KEY_DOWN macro and with keydown_cb as callback. In this callback, the KEY_END event puts the window on the lower state.

          -
          keydown_cb(void *data , int type , void *event)
          -{
          -   appdata_s *ad = data;
          -   Ecore_Event_Key *ev = event;
          -   if (!strcmp(ev->keyname, KEY_END)) 
          -   {
          -      // Let window go to hide state
          -      elm_win_lower(ad->win);
          -   }
          -
          -   return ECORE_CALLBACK_DONE;
          -}
          -
          -

          The key name of menu button is XF86Send. Add the menu button key press handling to the keydown_cb. The menu is shown on the first press and hidden it on the second press. Use Eina_Bool sdmenu_up on the application data to store the menu status during the application execution. If ad->sdmenu_up is EINA_TRUE the menu is visible.

          - -

          A program animation,menu_side is defined in the .edc theme file. This program is run when the signal show,sidemenu is received with the source MenuButton. Also the program who hides the side menu is defined and is called animation,menu_side,hide which start on signal hide,sidemenu.

          - -

          Test side menu status by sending the signals using elm_object_signal_emit

          -
          -if (!strcmp(ev->keyname, "XF86Send")) 
          -{
          -   if (ad->sdmenu_up == EINA_TRUE) 
          -   {
          -      // If the menu is visible send a "hide,sidemenu" signal
          -      elm_object_signal_emit(ad->layout, "hide,sidemenu", "MenuButton");
          -      // Store the new menu status (hidden)
          -      ad->sdmenu_up = EINA_FALSE;
          -   }
          -}
          -
          -

          Now the menu appears and disappears when the menu button is pressed.

          -

          The first side menu button sends back to the main view:

          -
          -// Hide the side menu if it's visible
          -if (ad->sdmenu_up == EINA_TRUE) 
          -{
          -   elm_object_signal_emit(ad->layout, "hide,sidemenu", "MenuButton");
          -      ad->sdmenu_up = EINA_FALSE;
          -}
          -
          -

          This way the menu disappears when the view is selected by the user.

          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/multiple_screens_n.htm b/org.tizen.ui.guides/html/native/efl/multiple_screens_n.htm deleted file mode 100755 index 5a93e29..0000000 --- a/org.tizen.ui.guides/html/native/efl/multiple_screens_n.htm +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - Multiple Screen Support - - - - - -
          - -

          Multiple Screen Support

          - -

          Tizen is available in various devices which support different screen sizes and resolutions. When developing Tizen applications, you must take this into account if you want your application to function well in various device models.

          -

          Before implementing multiple screen support, make sure you are familiar with the key concepts of multiple screen support.

          - -

          Key Concepts

          -

          Before building a native application for multiple resolutions using Tizen native UI framework, make sure you are familiar with the following concepts:

          - - -

          Multi-scale in Tizen Native UI Framework

          -

          Tizen native UI framework supports multiple scaling. If the application is implemented considering scalability, it is enough to change the elm_scale value in different device environments without modifying the application code.

          - -

          Scale 1.0 in Tizen native UI framework means that the application is displayed in a set size and is not scaled. Scale 1.0 is used in a display environment, such as a desktop. In the desktop environment, the monitor has a resolution between 1280 x 800 and 1920 x 1080, with a size between 20 and 27 inch, and the dpi between 80 and 100.

          - -

          If an application is scaled up or down after implementing it in a desktop environment, it can be used in another device without modifying the code. Each device has a proper scale value for adjusting the application size. Edje, which handles layout and themes in Tizen native UI framework, gets the size of an object by multiplying the size specified by an application using the scale value.

          - -

          The following figure illustrates a 50 px wide object in a 1280 px wide monitor. If the same object is displayed with not scaling in mobile environment, it looks very small. To show the object in mobile environment in the similar size as in the monitor, define the scale is 2.0, so that the object size is 100 px instead of 50 px.

          - -

          Figure: Scaling from desktop to mobile

          -

          Scaling from desktop to mobile

          - -

          Base Scale

          -

          The object scaling must be defined in the config.xml file of this application to show the application in a proper size in other devices. However, the scaling must be based on scale 1.0 or, if the application is based on another scale, this scale must be defined in the config.xml file. This predefined scale is called the "base scale".

          - -

          The size of a scalable object is multiplied with the device scale value, as illustrated in the following figure. If the scalable object (on the left) with the size 10 is created in a device with scale 1.0, the size of the object is 20 in a device with scale 2.0, and 40 in a device with scale 4.0.

          - -

          Figure: Base scale

          -

          Base scale

          - -

          The middle object has a base scale 2.0. The following example shows its scaling in a device with scale 4.0:

          - - - - - - - -
          Scale = Device scale (information in the target) / Base scale (information in the application) -

          For example: 2.0 = 4.0 / 2.0

          -
          - -

          Applying the Base Scale

          -

          To create an application that supports multiple screen sizes, you must learn how to set the base scale in:

          - - -

          Calculating the Base Scale

          - -

          To get the base scale value of your own display, you must know the DPI of the display. Based on the display DPI, you can calculate the base scale, since it is basically proportional to the display DPI with the following formula:

          - -
          -base_scale = (DPI / 90) * profile_factor
          - -

          The profile factor is the value for fitting the object size as a profile. The distance between the user eye and the display differs for each profile. This means that the object size must be different if the device display is changed.

          - -

          The following table lists the profile factors for various profiles.

          - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Profile factors
          ProfileProfile factor
          Wearable0.4
          Mobile - Small Screen (~ 4.4 inch)0.7
          Mobile - Normal Screen (4.5 inch ~)0.8
          Desktop1.0
          - -

          For example, if your display has 233 dpi and the platform uses the mobile profile(small screen), the base scale is calculated like this:

          -
          -1.8 = (233 / 90) * 0.7
          - -

          The base scale of the device is 1.8. If the application is made in the environment using 233 dpi and mobile profile, its base scale must be set to 1.8. For a desktop, the DPI is 90, and its base scale is 1.0.

          - - -

          Setting the Base Scale in EDC

          -

          The application must specify the scale its base scale. The edje objects are scaled properly if the base scale is set in the collection of the edc file, as in the following example:

          - - - - - - - - -
          Note
          The base scale for WVGA is 1.8, and for HD application, 2.4.
          -
          collections 
          -{
          -   base_scale: 1.8; // This value is for WVGA application
          -   parts 
          -   {
          -      part 
          -      {
          -         name: "box"; 
          -         type: RECT;
          -         min: 100 100;
          -         scale: 1;
          -      }
          -   }
          -}
          -
          -

          Setting the Base Scale in C

          -

          The size of the object must be specified in EDC. However, sometimes it is better for an application to the object size in a C file. If the size is defined with no scaling in the C file, the application is displayed in the same size even if the scale changes. To avoid this, use the ELM_SCALE_SIZE macro, as in the following example:

          - -
          #define ELM_SCALE_SIZE(x) x / elm_app_base_scale_get() * elm_config_scale_get()
          - -

          in the definition, the size (x) is changed to a size based on 1.0 (x/elm_app_base_scale_get()) and it is multiplied with the scale of the current target (elm_config_scale_get()).

          - -

          Set the base scale using the elm_app_base_scale_set() function:

          - -
          int app_create(void *data)
          -{
          -   elm_app_base_scale_set(1.8); // This value is for WVGA application
          -}
          -
          -

          After setting the base scale, use the ELM_SCALE_SIZE macro to set the size of an object in the application:

          - -
          evas_object_size_hint_min_set(object, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
          -evas_object_resize(object, ELM_SCALE_SIZE(50), ELM_SCALE_SIZE(50));
          -
          - -

          You can use ELM_SCALE_SIZE macro in any API related with setting objects sizes in Tizen native applications.

          - -

          Scaling without the Base Scale

          - -

          In Tizen, each device has a scale value in proportion to the display. If scaling is enabled, the objects are drawn on the display by multiplying with the user-defined object size and the device scale. If the base scale is set, the objects are drawn by dividing the user-defined object size with the base scale and multiplying it by the device scale.

          - -

          If you use the scale feature without setting the base scale, the result is the same as if you set the base scale to 1.0. Then you do not need to care about the base scale variables, because the pixels roll like a virtual pixel. For example, if you set 1 pixel in 129 dpi without setting the base scale value, the 1 pixel before scaling is equivalent to 1 real physical pixel after scaling. In case of 233 dpi, it is the same with 1.8 pixels after scaling.

          - -

          Always consider the pixel before scaling when defining the application UI, in order to ensure a proper UI display on the screen with a diversity of densities.

          - -
          int app_create(void *data)
          -[ Conversion Formula ]
          -Real physical pixel = (a pixel before scaling) x (dpi / 90) x 0.7
          -
          -

          Where 90 is the default DPI on a desktop and 0.7 is the mobile profile factor.

          - -

          The following table shows some examples.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Pixel conversions
          BaseLow-density device (such as WVGA, 4 inch)High-density device (such as HD, 5 inch)
          DPI129233294
          A pixel before scaling100100100
          Real physical pixel100180260
          Actual base scale1.01.82.6
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/multipoint_touch_n.htm b/org.tizen.ui.guides/html/native/efl/multipoint_touch_n.htm deleted file mode 100755 index 3b15f01..0000000 --- a/org.tizen.ui.guides/html/native/efl/multipoint_touch_n.htm +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - Tracking Multi-point Touch Events - - - - - - -
          -

          Tracking Multi-point Touch Events

          - - -

          This tutorial demonstrates how you can use the Evas_Object to paint on a canvas and track touch events.

          - -

          Initializing Multi-point Touch

          - -

          This sample is a fully functional application able to track multiple simultaneous clicks. For every click, a black rectangle spot is drawn on the screen. This way it is easy to test the multi-point touch operation with the application.

          - -

          Initialization is implemented in the multitouch.c file.

          -

          The appdata structure includes Evas_Object pointers, a list, and a Boolean flag.

          -
          -typedef struct appdata 
          -{
          -   Evas_Object *win;
          -   Evas_Object *conform;
          -   Evas_Object *nf;
          -   Evas_Object *button;
          -   Evas_Object *box;
          -   Evas_Object *rect;
          -   Evas_Object *label;
          -
          -   // List of mouse spots
          -   Eina_List *spots;
          -
          -   // Flag for checking the mouse down event
          -   Eina_Bool down; 
          -} 
          -appdata_s;
          -
          - -

          The main() function initializes event callbacks and calls the ui_app_main() function to start the EFL application.

          -
          -int
          -main(int argc, char *argv[])
          -{
          -   appdata_s *ad = {0,};
          -   int ret = 0;
          -
          -   ui_app_lifecycle_callback_s event_callback = {0,};
          -   app_event_handler_h handlers[5] = {NULL,};
          -
          -   event_callback.create = app_create;
          -   event_callback.terminate = app_terminate;
          -   event_callback.pause = app_pause;
          -   event_callback.resume = app_resume;
          -   event_callback.app_control = app_control;
          -
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          -   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          -
          -   ret = ui_app_main(argc, argv, &event_callback, &ad);
          -
          -   return ret;
          -}
          -
          - - -

          The following figure illustrates the Multi-point Touch.

          - -

          Figure: Multi-point Touch screens

          -

          Multi-point Touch screens

          - -

          Handling the Canvas

          - -

          The create_base_gui() function creates base GUI elements including Naviframe and the Naviframe button. Naviframe includes each view screen as an item, which in turn includes the title and a button which clears spots when clicked.

          - -
          static void
          -create_base_gui(appdata_s *ad)
          -{
          -   Elm_Object_Item *nf_it;
          -
          -   // Naviframe
          -   ad->nf = elm_naviframe_add(ad->conform);
          -   elm_object_content_set(ad->conform, ad->nf);
          -   evas_object_show(ad->nf);
          -
          -   // Button
          -   ad->button = elm_button_add(ad->nf);
          -   elm_object_text_set(ad->button, "Clear");
          -   evas_object_smart_callback_add(ad->button, "clicked", button_clicked_cb, ad);
          -
          -   // Create main view
          -   ad->box = create_main_view(ad);
          -   nf_it = elm_naviframe_item_push(ad->nf, "Multi-point Touch",
          -                                   NULL, NULL, ad->box, NULL);
          -   elm_object_item_part_content_set(nf_it, "title_right_btn", ad->button);
          -} 
          -
          - -

          The create_main_view() function creates the main view including the label and an event rectangle.

          -

          The label displays information on mouse event status and coordinates (x, y positions). The event rectangle is received completely through mouse (touch) events. To show 2 elements in a Naviframe content area, a container combining those elements is necessary. A box container functions in that role. The label and rectangle pack end the box and the box is embedded into the Naviframe content area.

          - -
          static Evas_Object *
          -create_main_view(appdata_s *ad)
          -{
          -   Evas_Object *box;
          -
          -   // Box
          -   box = elm_box_add(ad->nf);
          -   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_show(box);
          -
          -   // Label
          -   ad->label = elm_label_add(box);
          -   elm_object_text_set(ad->label, "None");
          -   evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, 0);
          -   evas_object_size_hint_align_set(ad->label, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_repeat_events_set(ad->label, EINA_TRUE);
          -   elm_box_pack_end(box, ad->label);
          -   evas_object_show(ad->label);
          -
          -   // Event Rect
          -   ad->rect = evas_object_rectangle_add(evas_object_evas_get(box));
          -   evas_object_size_hint_weight_set(ad->rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(ad->rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_color_set(ad->rect, 204, 204, 204, 255);
          -   evas_object_repeat_events_set(ad->rect, EINA_TRUE);
          -   elm_box_pack_end(box, ad->rect);
          -   evas_object_show(ad->rect);
          -}
          -
          - -

          The create_spot() function creates a rectangle, resizes the rectangle according to received size input, and moves the rectangle according to received coordinates (x, y positions) input.

          - -
          Evas_Object *
          -create_spot(Evas_Object *parent, Evas_Coord x, Evas_Coord y, int size)
          -{
          -   Evas_Object *spot;
          -   spot = evas_object_rectangle_add(evas_object_evas_get(parent));
          -   evas_object_resize(spot, size, size);
          -   // Adjust x, y positions to be center of object
          -   evas_object_move(spot, x - (size/2), y - (size/2));
          -   evas_object_show(spot);
          -
          -   return spot;
          -}
          -
          - -

          The rectangle object is stored in Eina_List (ad->spots) for managing other functions. The button_clicked_cb() function removes all evas_objects into the ad->spots list, meaning all spot rectangles are cleared.

          - -
          static void
          -button_clicked_cb(void *data, Evas *evas, Evas_Object *object, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   Evas_Object *spot;
          -
          -   EINA_LIST_FREE(ad->spots, spot)
          -   {
          -      evas_object_del(spot);
          -      spot = NULL;
          -   }
          -   elm_object_text_set(ad->label, "Clear");
          -}
          -
          - -

          Managing Touch Events

          - -

          On the bottom of the create_main_view() function, event callbacks are added to the event rectangle. An event callback is added using the evas_object_event_callback_add() function.

          - -

          The following touch event types are supported:

          -
            -
          • EVAS_CALLBACK_MOUSE_DOWN: This event is called when the given object receives the mouse down event.
          • -
          • EVAS_CALLBACK_MOUSE_UP: This event is called when the given object receives the mouse up event.
          • -
          • EVAS_CALLBACK_MOUSE_MOVE: This event is called when the given object receives the mouse move event.
          • -
          • EVAS_CALLBACK_MULTI_DOWN: This event is called when the given object has already received the mouse down event and receives the multi-mouse down event.
          • -
          • EVAS_CALLBACK_MULTI_UP: This event is called when the given object receives the multi-mouse up event.
          • -
          • EVAS_CALLBACK_MULTI_MOVE: This event is called when the given object receives the multi-mouse move event.
          • -
          -

          If the given object receives a mouse event, a callback function is called, and event information, such as coordinates (x, y positions) is passed. The mousemove_cb() function sets the mouse status, positions text in the label, and draws a spot rectangle. To distinguish down and up positions, set different colors for the down and up rectangles.

          - -
          -static void
          -mousemove_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
          -{
          -   appdata_s *ad = data;
          -   Evas_Object *spot;
          -   char buf[1024];
          -   Evas_Event_Mouse_Move *ev = event_info;
          -   Evas_Coord x = ev->cur.canvas.x;
          -   Evas_Coord y = ev->cur.canvas.y;
          -   int size = (int) 5 * elm_config_scale_get();
          -
          -   if (!ad->down)
          -      return;
          -
          -   snprintf(buf, sizeof(buf), "Mouse Move, %d, %d", x, y);
          -   elm_object_text_set(ad->label, buf);
          -
          -   // Draw spot on event position
          -   spot = create_spot(ad->rect, x, y, size);
          -   evas_object_color_set(spot, 0, 0, 0, 255);
          -   ad->spots= eina_list_append(ad->spots, spot);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/naviframe_tutorial_n.htm b/org.tizen.ui.guides/html/native/efl/naviframe_tutorial_n.htm deleted file mode 100755 index 206759b..0000000 --- a/org.tizen.ui.guides/html/native/efl/naviframe_tutorial_n.htm +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - Creating a Naviframe for Navigation - - - - - - -
          -

          Creating a Naviframe for Navigation

          - - -

          Naviframes are containers useful for implementing interfaces with several screens having a previous/next relationship.

          - - -

          Creating Naviframes

          - -

          Naviframes are containers useful for implementing interfaces with several screens having a previous/next relationship.

          - -

          This tutorial shows a UI with three naviframes. Each naviframe is made of 20 screens, each made up of a label with the text "label -<n>", a title with the same text, and previous and next buttons, which are used to navigate between the screens.

          -

          TODO: screenshots of the staged interface

          -

          The naviframe is "one-way": elements are added, and when the user clicks on the "previous" button, they are removed; there is no "next" button by default. To add it, we define a structure that holds the naviframe object along with a stack of the elements that the user has popped by using the "previous" button.

          -

          Note that it is possible to create the elements on-the-fly each time the "next" button is pressed. Both approaches are valid.

          -
          // NOTE: A zipper is a datastructure for an ordered set of elements and a
          -// cursor in this set, meaning there are elements before the cursor (which are
          -// stored inside the naviframe) and after (which are stored in the "popped"
          -// list.
          -struct naviframe_zipper 
          -{
          -   Evas_Object *naviframe;
          -   Eina_List *popped;
          -};
          -
          - -

          To add several naviframes, create a function that factors their creation and initializes the naviframe_zipper structure defined above.

          -
          static struct naviframe_zipper *
          -_naviframe_add(Evas_Object *parent)
          -{
          -   struct naviframe_zipper *z = malloc(sizeof(struct naviframe_zipper));
          -   z->naviframe = elm_naviframe_add(parent);
          -   z->popped = NULL;
          -
          -   evas_object_size_hint_weight_set(z->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(z->naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_show(z->naviframe);
          -   // By default, objects are destroyed when they are popped from the naviframe
          -   // To save and re-use them, enable "preserve_on_pop"
          -   elm_naviframe_content_preserve_on_pop_set(z->naviframe, EINA_TRUE);
          -
          -   return z;
          -}
          -
          -

          Create buttons that are at the top of the naviframe and allow the user to go back and forth between the screens. The naviframe component builds a button for "previous" by default, but allows the programmers to provide their own buttons. It has a specific slot for the "next" button.

          -
          // Save the element that is popped from the naviframe
          -static void
          -_naviframe_prev(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
          -{
          -   struct naviframe_zipper *z = data;
          -   z->popped = eina_list_prepend(z->popped, elm_naviframe_item_pop(z->naviframe));
          -}
          -
          -// Set the first element after the current one available and push it to the
          -// naviframe
          -static void
          -_naviframe_next(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
          -{
          -   struct naviframe_zipper *z = data;
          -   Evas_Object *label, *prev, *next;
          -   const char *text;
          -   Elm_Object_Item *it;
          -
          -   label = eina_list_data_get(z->popped);
          -   z->popped = eina_list_remove_list(z->popped, z->popped);
          -   if (label != NULL) 
          -   {
          -      // The UI component is saved inside the naviframe but nothing more; we need
          -      // to create new buttons and set the title text again (copy the one
          -      // from the label that is saved).
          -      text = elm_object_text_get(label);
          -      // The _button function creates a button which is either "Previous" (-1) or
          -      // "Next" (1)
          -      prev = _button(z, -1);
          -      next = _button(z, 1);
          -      it = elm_naviframe_item_push(z->naviframe, text, prev, next, label, NULL);
          -   }
          -}
          -
          -

          When a naviframe and the pages that go inside it are built, populate it.

          -

          Remember that three naviframes are created, each populated in a different way. The common bits have been factored out as a function and the specific parts are executed through a callback. The generic function is shown below.

          -
          // Generic naviframe-populate function:
          -// Its third (and last) parameter is a callback for customization, i.e. pushes
          -// the new items to a specific position; it returns a "context" value that is
          -// used between its calls and enables behaviors such as "push after the
          -// previously-pushed item" 
          -static struct naviframe_zipper*
          -_naviframe_populate_gen(Evas_Object *parent, const char *id,
          -      void * (*populate_cb) (Evas_Object *nav, const char *title, Evas_Object
          -         *prev, Evas_Object *next, Evas_Object *label, Elm_Object_Item *context)
          -      )
          -{
          -   struct naviframe_zipper *z;
          -   Evas_Object *label, *prev, *next;
          -   Elm_Object_Item *context = NULL;
          -   char buf[256];
          -   int i;
          -
          -   z = _naviframe_add(parent);
          -
          -   for (i = 0; i < 20; i++) 
          -   {
          -      label = elm_label_add(z->naviframe);
          -      snprintf(buf, sizeof(buf), "%s [%d]", id, i);
          -      elm_object_text_set(label, buf);
          -      evas_object_show(label);
          -      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);
          -      // The _button function creates a button which is either "Previous" (-1) or
          -      // "Next" (1)
          -      prev = _button(z, -1);
          -      next = _button(z, 1);
          -      // Use the populate_cb callback to provide the customization of the way the
          -      // elements are added inside the naviframe
          -      context = populate_cb(z->naviframe, buf, prev, next, label, context);
          -   }
          -
          -   return z;
          -}
          -
          -

          The prototype of the callbacks is fairly large, but that is because of the syntax for callbacks in C.

          -
          // Push items one after the other
          -static Elm_Object_Item *
          -_populate_cb__push(Evas_Object *nav, const char *title,
          -      Evas_Object *prev, Evas_Object *next, Evas_Object *label,
          -      Elm_Object_Item *context)
          -{
          -   return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
          -}
          -
          -// Push items one after the other but use insert_after for it
          -static Elm_Object_Item *
          -_populate_cb__push_then_insert_after(Evas_Object *nav, const char *title,
          -      Evas_Object *prev, Evas_Object *next, Evas_Object *label,
          -      Elm_Object_Item *context)
          -{
          -   if (context == NULL) 
          -   {
          -      return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
          -   }
          -   else 
          -   {
          -      return elm_naviframe_item_insert_after(nav, context, title, prev, next, label, NULL);
          -   }
          -}
          -
          -// Push one item and repeatedly insert new items before the last inserted
          -// item
          -static Elm_Object_Item *
          -_populate_cb__push_then_insert_before(Evas_Object *nav, const char *title,
          -      Evas_Object *prev, Evas_Object *next, Evas_Object *label,
          -      Elm_Object_Item *context)
          -{
          -   if (context == NULL) 
          -   {
          -      return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
          -   }
          -   else 
          -   {
          -      return elm_naviframe_item_insert_before(nav, context, title, prev, next, label, NULL);
          -   }
          -}
          -
          -

          Create a window with a vertical box, which holds the three naviframes from the Appcore's app_create callback.

          - -
          static bool
          -_app_create(void *data)
          -{
          -   Evas_Object *w, *box;
          -   struct naviframe_zipper *z;
          -
          -   w = elm_win_util_standard_add("Naviframe Test", "Naviframe Test");
          -
          -   box = elm_box_add(w);
          -   elm_box_horizontal_set(box, EINA_FALSE);
          -   elm_box_homogeneous_set(box, EINA_TRUE);
          -   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);
          -   elm_win_resize_object_add(w, box);
          -
          -   z = _naviframe_populate_gen(w, "Before", _populate_cb__push_then_insert_before);
          -   elm_box_pack_end(box, z->naviframe);
          -
          -   z = _naviframe_populate_gen(w, "After", _populate_cb__push_then_insert_after);
          -   elm_box_pack_end(box, z->naviframe);
          -
          -   z = _naviframe_populate_gen(w, "Push", _populate_cb__push);
          -   elm_box_pack_end(box, z->naviframe);
          -
          -   evas_object_show(w);
          -}
          -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/notification_window_n.htm b/org.tizen.ui.guides/html/native/efl/notification_window_n.htm deleted file mode 100755 index 4e26221..0000000 --- a/org.tizen.ui.guides/html/native/efl/notification_window_n.htm +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - - - - - - - Notification Windows: Supporting Notification Levels, Screenshots, and Input Generators - - - - - -
          - -

          Notification Windows: Supporting Notification Levels, Screenshots, and Input Generators

          - -

          The EFL UTIL utility package supports the following EFL functionalities:

          - - - - -

          Notification Window and Level

          - -

          The EFL UTIL API allows you to set and get the notification level of the notification window (which is of the EFL window type):

          - -
          • efl_util_set_notification_window_level()
          • -
          • efl_util_get_notification_window_level()
          - -

          To understand notification levels, you must first learn about the Tizen window layer hierarchy. Window layers are logical containers used to control the window stack order. Each window belongs to 1 layer and can change the stack order in the layer. Windows in same layer are always placed on or under a window in another layer. In addition to the default "normal layer", there exists a "notification layer", which is always placed above the normal layer.

          - - -

          Figure: Window layers

          -

          Window layers

          - - -

          Each window is set to a specific layer according to its type or properties. Most application windows belong to the normal layer. However, in case of an important alarm or other information crucial to the user, you can set the window to belong to the notification layer. This ensures that the user notices the information immediately, because the window belonging to the notification layer is always shown above the windows in the normal layer.

          - -

          Using the Notification Windows

          - -

          A window that belongs to the notification layer is called a "notification window". To make a notification window:

          - -
          1. Set the window type to NOTIFICATION, by calling the elm_win_add() function with the third parameter set to ELM_WIN_NOTIFICATION.
          2. -
          3. Set the notification level by calling the efl_util_set_notification_window_level() function. -

            The notification level defines the priority of the window, and the notification layer contains 3 levels (EFL_UTIL_NOTIFICATION_LEVEL_1, EFL_UTIL_NOTIFICATION_LEVEL_2, and EFL_UTIL_NOTIFICATION_LEVEL_3).

            -

            The default notification window level is EFL_UTIL_NOTIFICATION_LEVEL_1. Most of notification windows can be set to this level. The EFL_UTIL_NOTIFICATION_LEVEL_2 is a higher level than EFL_UTIL_NOTIFICATION_LEVEL_1, which means that the window set to EFL_UTIL_NOTIFICATION_LEVEL_2 is always on the EFL_UTIL_NOTIFICATION_LEVEL_1 level window. The EFL_UTIL_NOTIFICATION_LEVEL_3 is the highest level in notification windows. Very few applications can use this level.

            - -

            If there are notification windows that have the same level, the most recently created notification window is placed on top of the other window.

            - -
          - -

          Figure: Notification levels

          -

          Notification levels

          - - -

          The following code snippets shown how to make a notification window with a higher level.

          - -
          -#include <Elementary.h>
          -#include <efl_util.h>
          -#include <dlog.h>
          -
          -static Evas_Object *create_win(const char *name)
          -{
          -   Evas_Object *eo;
          -   efl_util_error_e error;
          -   // Create the NOTIFICATION window object
          -   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          -
          -   if (!eo) return NULL;
          -
          -   // Set the NOTIFICATION level
          -   error = efl_util_set_notification_window_level(eo, EFL_UTIL_NOTIFICATION_LEVEL_1);
          -
          -   elm_win_title_set(eo, name);
          -   elm_win_autodel_set(eo, EINA_TRUE); 
          -   evas_object_smart_callback_add(eo, "delete,request", _quit_cb, NULL); 
          -	
          -   return eo;
          -}
          - -

          Use the efl_util_get_notification_window_level() function to get the currently set notification level of a window. If the window is not of the notification type, the function returns the -EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE error.

          -
          -#include <Elementary.h>
          -#include <efl_util.h>
          -#include <dlog.h>
          -
          -void get_notification_level (Evas_Object *eo)
          -{
          -   efl_util_error_e error;
          -   efl_util_notification_level_e  notification_level;
          -
          -   if (!eo) return;
          -
          -   // Get the window notification level
          -   error = efl_util_get_notification_window_level (eo, &notification_level);
          -
          -   // Check the return value
          -   if (error== EFL_UTIL_ERROR_NONE)
          -   {
          -      switch (notification_level)
          -      {
          -         case EFL_UTIL_NOTIFICATION_LEVEL_1:
          -            // Do something for level 1
          -            break;
          -
          -         case EFL_UTIL_NOTIFICATION_LEVEL_2:
          -            // Do something for level 2
          -            break;
          -      }
          -   }
          -   else
          -   {
          -      // Error handling
          -   }
          -}
          - -

          Screenshot

          - -

          The EFL UTIL SCREENSHOT API (in mobile and wearable applications) allows you to get the screen image to the user.

          - -

          First you must make the efl_util_screenshot_h structure and initialize the structure members with the efl_util_screenshot_initialize() function. To take the actual screenshot, create screen capture data and return it to the tbm_surface handler with the efl_util_screenshot_take_tbm_surface() function.

          -

          When no longer needed, remember to free the efl_util_screenshot_h structure with the efl_util_screenshot_deinitialize() function.

          - - -

          Input Generator

          - -

          The EFL UTIL INPUT API (in mobile and wearable applications) allows you to generate input events (such as key and touch events).

          - -

          First you must create the efl_util_inputgen_h structure and initialize the structure members with the efl_util_input_initialize_generator() function. To generate actual key or touch events, use the efl_util_input_generate_key() or efl_util_input_generate_touch() function.

          -

          When no longer needed, remember to free the efl_util_inputgen_h structure with the efl_util_input_deinitialize_generator() function.

          - - - - -

          Initializing EFL Utility

          - -

          To use the EFL UTIL API, the following header file has to be included:

          -
          #include <efl_util.h>
          - -

          Creating a Notification Window and Setting a Notification Window Level

          - -

          To create a notification window and set the window level, use the efl_util_set_notification_window_level() function. If the window type is not notification type, the function returns an error.

          -
          #include <Elementary.h>
          -#include <dlog.h>
          -
          -void create_win() 
          -{
          -   Evas_Object *eo;
          -   efl_util_error_e error;
          -   char *name = "Notification window";
          -   
          -   // Create notification window
          -   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          -   if (!eo) return;
          -   
          -   // Set notification level
          -   error = efl_util_set_notification_window_level
          -           (eo, EFL_UTIL_NOTIFICATION_LEVEL_1);
          -   if (error != EFL_UTIL_ERROR_NONE)
          -   {
          -      // Do error handling
          -   }
          -}
          -
          - -

          Getting the Notification Window Level

          - -

          To get the notification window level, use the efl_util_get_notification_window_level() function:

          - -
          void create_win() 
          -{
          -   Evas_Object *eo;
          -   efl_util_error_e error;
          -   efl_util_notification_level_e notification_level;
          -   char *name = "Notification window";
          -   
          -   // Create notification window
          -   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          -   if (!eo) return;
          -   
          -   // Get notification level
          -   error = efl_util_get_notification_window_level
          -           (eo, &notification_level);
          -   if (error == EFL_UTIL_ERROR_NONE) 
          -   {
          -      switch (notification_level) 
          -      {
          -         case EFL_UTIL_NOTIFICATION_LEVEL_1:
          -            // Do something for notification level 1
          -            break;
          -         case EFL_UTIL_NOTIFICATION_LEVEL_2:
          -            // Do something for notification level 2
          -            break;
          -      }
          -   }
          -}
          - -

          Getting a Screenshot

          - -

          To get a screenshot:

          - -
          1. Initialize with the efl_util_screenshot_initialize() function: -
            -#include <tbm_surface.h>
            -#include <X11/Xlib.h>
            -
            -void capture()
            -{
            -   efl_util_screenshot_h screenshot = NULL;
            -   tbm_surface_h tbm_surface = NULL;
            -   tbm_surface_info_s tsuri;
            -
            -   screenshot = efl_util_screenshot_initialize(width, height);
            -
          2. - -
          3. After getting the efl_util_screenshot_h structure, execute the efl_util_screenshot_take_tbm_surface() function to get the tbm_surface handler which has the screenshot data. -
            -   if (screenshot) 
            -   {
            -      tbm_surface = efl_util_screenshot_take_tbm_surface(screenshot);
            -      if (tbm_surface) 
            -      {
            -         // Treat tbm_surface handler (screenshot data)
            -      }
            -
          4. - -
          5. Free the resources with the efl_util_screenshot_deinitialize() function: -
            -      efl_util_screenshot_deinitialize(screenshot);
            -   }
            -}
          - -

          Generating a Key Input Event

          - -

          To generate key input events:

          - -
          1. Execute the efl_util_input_initialize_generator() function: -
            -void key_event_generator()
            -{
            -   int ret = EFL_UTIL_ERROR_NONE;
            -   efl_util_inputgen_h inputgen = NULL;
            -
            -   inputgen = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_KEYBOARD);
            -   if (!inputgen)
            -   {
            -      // Failed to initialize the input generator system
            -
            -      return;
            -   }
            -
            -
          2. - -
          3. After setting input device type, execute the efl_util_input_generate_key() function to generate key input events: -
            -   ret = efl_util_input_generate_key(inputgen, "XF86Menu", 1);
            -   if (ret != EFL_UTIL_ERROR_NONE) 
            -   {
            -      // Failed to generate a "XF86Menu" key press event
            -      ret = efl_util_input_deinitialize_generator(inputgen);
            -      if (ret != EFL_UTIL_ERROR_NONE)
            -      {
            -         // Failed to deinitialize the input generator system
            -      }
            -      return;
            -   }
            -
            -   ret = efl_util_input_generate_key(inputgen, "XF86Menu", 0);
            -   if (ret != EFL_UTIL_ERROR_NONE) 
            -   {
            -      // Failed to generate a "XF86Menu" key release event
            -      ret = efl_util_input_deinitialize_generator(inputgen);
            -      if (ret != EFL_UTIL_ERROR_NONE)
            -      {
            -         // Failed to deinitialize the input generator system
            -      }
            -      return;
            -   }
            -
          4. - -
          5. Free the resources with the efl_util_input_deinitialize_generator() function: -
            -   ret = efl_util_input_deinitialize_generator(inputgen);
            -   if (ret != EFL_UTIL_ERROR_NONE)
            -   {
            -      // Failed to deinitialize the input generator system
            -   }
            -}
            -
          - - - -

          Generating a Touch Input Event

          - -

          To generate touch input events:

          - -
          1. Execute the efl_util_input_initialize_generator() function: -
            -void touch_event_generator()
            -{
            -   int ret = EFL_UTIL_ERROR_NONE;
            -   efl_util_inputgen_h inputgen = NULL;
            -
            -   inputgen = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN);
            -   if (!inputgen)
            -   {
            -      // Failed to initialize the input generator system
            -
            -      return;
            -   }
            -
          2. -
          3. After setting input device type, execute the efl_util_input_generate_touch() function to generate touch input events: -
            -   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_BEGIN, 100, 100);
            -   if (ret != EFL_UTIL_ERROR_NONE) 
            -   {
            -      // Failed to generate a first finger touch press event on (100, 100)
            -      ret = efl_util_input_deinitialize_generator(inputgen);
            -      if (ret != EFL_UTIL_ERROR_NONE)
            -      {
            -         // Failed to deinitialize the input generator system
            -      }
            -      return;
            -   }
            -   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_UPDATE, 110, 110);
            -   if (ret != EFL_UTIL_ERROR_NONE) 
            -   {
            -      // Failed to generate a first finger touch move event to (110, 110)
            -      ret = efl_util_input_deinitialize_generator(inputgen);
            -      if (ret != EFL_UTIL_ERROR_NONE)
            -      {
            -         // Failed to deinitialize the input generator system
            -      }
            -
            -      return;
            -   }
            -   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_END, 110, 110);
            -   if (ret != EFL_UTIL_ERROR_NONE) 
            -   {
            -      // Failed to generate a first finger touch release event to (110, 110)
            -      ret = efl_util_input_deinitialize_generator(inputgen);
            -      if (ret != EFL_UTIL_ERROR_NONE)
            -      {
            -         // Failed to deinitialize the input generator system
            -      }
            -
            -      return;
            -   }
            -
          4. -
          5. Free the resources with the efl_util_input_deinitialize_generator() function: -
            -   ret = efl_util_input_deinitialize_generator(inputgen);
            -   if (ret != EFL_UTIL_ERROR_NONE)
            -   {
            -      // Failed to deinitialize the input generator system
            -   }
            -}
            -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/panes_tutorial_mn.htm b/org.tizen.ui.guides/html/native/efl/panes_tutorial_mn.htm deleted file mode 100755 index f53dd1f..0000000 --- a/org.tizen.ui.guides/html/native/efl/panes_tutorial_mn.htm +++ /dev/null @@ -1,324 +0,0 @@ - - - - - - - - - - - - - - Creating Panes - - - - - - -
          -

          Creating Panes

          - - -

          This tutorial explains how to use Panes in the application.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          Initializing the Application

          - -

          This is how to start an Appcore application.

          -
          #include <Elementary.h>
          -#include <app.h>
          -
          -struct _appdata 
          -{
          -   const char *name;
          -   Evas_Object *win;
          -};
          -
          -static void app_terminate(void *user_data)
          -{
          -   struct _appdata *ad;
          -
          -   if (!user_data)
          -      return;
          -
          -   ad = user_data;
          -
          -   if (ad->win)
          -      evas_object_del(ad->win);
          -}
          -
          -static bool app_create(void *user_data)
          -{
          -   struct _appdata *ad;
          -   Evas_Object *win, *conformant, *naviframe, *panes, *panes_h, *nav_it, *bt;
          -
          -   if (!user_data)
          -      return false;
          -
          -   ad = user_data;
          -
          -   // Create window 
          -   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
          -   win = elm_win_util_standard_add("panes", "Panes tutorial");
          -   elm_win_autodel_set(win, EINA_TRUE);
          -
          -   if (!win)
          -      return false;
          -
          -   ad->win = win;
          -
          -   // Add elm_conformant 
          -   conformant = elm_conformant_add(win);
          -   elm_win_resize_object_add(win, conformant);
          -   evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   evas_object_show(conformant);
          -
          -   // Add naviframe to conformant 
          -   naviframe = elm_naviframe_add(conformant);
          -   elm_object_content_set(conformant, naviframe);
          -   evas_object_show(naviframe);
          -
          -   evas_object_resize(win, 320, 400);
          -   evas_object_show(win);
          -
          -   return true;
          -}
          -
          -int main(int argc, char **argv)
          -{
          -   appdata_s *ad = {0,};
          -   int ret = 0;
          -
          -   ui_app_lifecycle_callback_s event_callback = {0,};
          -   app_event_handler_h handlers[5] = {NULL,};
          -
          -   event_callback.create = app_create;
          -   event_callback.terminate = app_terminate;
          -   event_callback.pause = app_pause;
          -   event_callback.resume = app_resume;
          -   event_callback.app_control = app_control;
          -
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          -   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          -   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          -
          -   ret = ui_app_main(argc, argv, &event_callback, &ad);
          -
          -   return ret;
          -}
          -
          -

          The code above creates a window entitled "Panes tutorial", composed of a conformant component that contains a naviframe component. To add a new Panes object, use the _create() function.

          - -

          Creating a Panes Component

          - -

          The elm_panes component adds a draggable bar between two contents. When dragged, this bar resizes the contents' size. To create a new Panes into an Elementary object, use the elm_panes_add() function:

          -
          // Add an elm_panes 
          -panes = elm_panes_add(naviframe);
          -evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -elm_win_resize_object_add(win, panes);
          -evas_object_show(panes);
          -
          -nav_it = elm_naviframe_item_push (naviframe, "Panes view", NULL, NULL, panes, NULL);
          -
          -

          Here the Panes is created and added in the naviframe.

          - -

          Configuring the Panes

          - -

          By default, the orientation of the Panes is vertical. To modify the orientation, use the elm_panes_horizontal_set() function.

          -
          // Add a horizontal elm_panes 
          -panes_h = elm_panes_add(naviframe);
          -elm_panes_horizontal_set(panes_h, EINA_TRUE);
          -
          -

          The code above creates another Panes object and sets the horizontal orientation. To add content in a panes, use the elm_object_part_content_set() function. Here we add the horizontal Panes (panes_h) to the "left" part of the first created Panes (panes).

          -
          elm_object_part_content_set(panes, "left", panes_h);
          -
          - -

          This is how to set a button object to the "right" side of our vertical Panes component.

          -
          // Create a button object 
          -bt = elm_button_add(naviframe);
          -elm_object_text_set(bt, "Right");
          -evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(bt);
          -
          -// and set it to the "right" part of the vertical Panes 
          -elm_object_part_content_set(panes, "right", bt);
          -
          - -

          The content of the horizontal Panes is set with two button objects (up and down). When populating a vertically displayed Panes, the left content is placed at the top, and the right content is placed at the bottom.

          -
          // Create a "Up" button 
          -bt = elm_button_add(naviframe);
          -elm_object_text_set(bt, "Up");
          -evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(bt);
          -elm_object_part_content_set(panes_h, "left", bt);
          -
          -// Create a "Down" button 
          -bt = elm_button_add(naviframe);
          -elm_object_text_set(bt, "Down");
          -evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -evas_object_show(bt);
          -elm_object_part_content_set(panes_h, "right", bt);
          -
          - -

          The elm_panes can be dragged with the mouse but the proportion can also be set with the elm_panes_content_left_size_set() and elm_panes_content_right_size_set() functions. As an example, this is how to set the left size of both panes to 80%.

          -
          // Set the proportion of the panes to 80% 
          -elm_panes_content_left_size_set(panes, 0.8);
          -elm_panes_content_left_size_set(panes_h, 0.8);
          -
          - -

          The Panes proportions can also be fixed so that the user is not able to drag them. To do this, use the elm_panes_fixed_set() function.

          -
          // Fix the Panes proportion 
          -elm_panes_fixed_set(panes_h, EINA_TRUE);
          -
          - -

          Handling Signals

          - -

          The Panes components emit four different signals, depending on the users' interaction with the draggable bar.

          -
            -
          • "press" - The pane is pressed.
          • -
          • "unpressed" - The pane is released after being pressed.
          • -
          • "clicked" - The pane is clicked.
          • -
          • "clicked,double" - The pane is double clicked.
          • -
          -

          We add a callback function for each of them.

          - -

          "clicked" Signal

          - -

          The callback function for the clicked signal prints "Clicked" to standard output.

          -
          // clicked callback 
          -static void
          -_clicked_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   dlog_print(DLOG_INFO, PANES_TAG, "Clicked\n");
          -}
          -
          - -

          This is how to register this callback function to the vertical panes.

          -
          evas_object_smart_callback_add(panes, "clicked", _clicked_cb, panes);
          -
          - -

          "press" Signal

          - -

          The callback function for the "press" signal prints "Pressed" to the standard output.

          -
          // press callback 
          -static void
          -_press_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   dlog_print(DLOG_INFO, PANES_TAG, "Pressed\n");
          -}
          -
          - -

          This is how to register this callback function to the vertical panes.

          -
          evas_object_smart_callback_add(panes, "press", _press_cb, panes);
          -
          - -

          "unpress" Signal

          - -

          For the "unpress" signal, the proportion size of the left content of the Panes component is printed to the standard output. To do this, use the elm_panes_content_left_size_get() function.

          -
          // unpress callback 
          -static void
          -_unpress_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   dlog_print(DLOG_INFO, PANES_TAG, "Unpressed, size : %f\n",
          -      elm_panes_content_left_size_get(obj));
          -}
          -
          -

          This is how to register this callback function to the Panes.

          -
          evas_object_smart_callback_add(panes, "unpress", _unpress_cb, panes);
          -
          - -

          "clicked,double" Signal

          - -

          Hide the left part of the Panes component on the "clicked,double" signal and set the left proportion to 0.0. To restore the left part proportion with a double click on the hidden part of the Panes component, use the elm_panes_content_left_size_get() and elm_panes_content_left_size_set() functions, and a variable to store the value of the current proportion.

          - -
          // double clicked callback 
          -static void
          -_clicked_double_cb(void *data, Evas_Object *obj, void *event_info)
          -{
          -   static double size = 0.0;
          -   double tmp_size = 0.0;
          -   tmp_size = elm_panes_content_left_size_get(obj);
          -   if (tmp_size > 0)
          -   {
          -      elm_panes_content_left_size_set(obj, 0.0);
          -      dlog_print(DLOG_INFO, PANES_TAG, "Double clicked, hidden.\n");
          -   }
          -   else
          -   {
          -      elm_panes_content_left_size_set(obj, size);
          -      dlog_print(DLOG_INFO, PANES_TAG,
          -            "Double clicked, restoring size.\n");
          -   }
          -   size = tmp_size;
          -}
          -
          - -

          This is how to register this callback function to the Panes.

          -
          evas_object_smart_callback_add(panes, "clicked,double", _clicked_double_cb,
          -            panes);
          -
          - -

          Figure: Panes tutorial in action

          -

          Panes tutorial in action

          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/popup_tutorial_wn.htm b/org.tizen.ui.guides/html/native/efl/popup_tutorial_wn.htm deleted file mode 100755 index 37b4ad8..0000000 --- a/org.tizen.ui.guides/html/native/efl/popup_tutorial_wn.htm +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - Creating Wearable Popups - - - - - - -
          -

          Creating Wearable Popups

          - - -

          This tutorial teaches the basics of the popup component interactions.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          Initializing the Popup Application

          - -

          This use case creates an application with a window entitled "Popup Basic Tutorial". The window consists of a conformant component, and a popup is placed inside the conformant.

          - -

          To create a typical elementary application:

          - -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   // Window
          -   ad->win = elm_win_util_standard_add("main", "Popup Basic Tutorial");
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          -
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          -   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -
          -   create_popup(ad->conform);
          -
          -   // Show the window after the base GUI is set up
          -   evas_object_show(ad->win);
          -}
          -
          -static bool
          -app_create(void *data)
          -{
          -   appdata_s *ad = data;
          -   create_base_gui(ad);
          -
          -   return true;
          -}
          -
          -int
          -main(int argc, char **argv)
          -{
          -   struct app_data ad = {0,};
          -   ui_app_lifecycle_callback_s event_callback = {0,};
          -
          -   event_callback.create = app_create;
          -
          -   return ui_app_main(&argc, &argv, &event_callback, &ad);
          -}
          - -

          Using Popup Styles

          - -

          To create popups using various styles:

          - -
          • Create a basic text-only popup: - -
            -Evas_Object *popup;
            -struct appdata *ad;
            -ad = (struct appdata *) data;
            -
            -popup = elm_popup_add(ad->win_main);
            -evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            -eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            -elm_object_text_set(popup, "This has only texts");
            -evas_object_show(popup);
            -
          • - -
          • Create a popup with a title and text. The title,text attribute is the title area text part that defines the title label. -
            -Evas_Object *popup;
            -struct appdata *ad;
            -ad = (struct appdata *) data;
            -
            -popup = elm_popup_add(ad->win_main);
            -evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            -elm_object_part_text_set(popup, "title,text", "Title");
            -elm_object_text_set(popup,"This Popup has title area and text");
            -eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            -evas_object_show(popup);
            -
          • - -
          • Create a popup with a title, text, and 2 buttons: -
            -Evas_Object *popup;
            -Evas_Object *btn;
            -struct appdata *ad = (struct appdata *) data;
            -
            -popup = elm_popup_add(ad->win_main);
            -evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            -elm_object_part_text_set(popup, "title,text", "Title");
            -eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            -elm_object_text_set(popup, "This is title text 2button popup");
            -
            -btn = elm_button_add(popup);
            -elm_object_style_set(btn, "popup");
            -evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_object_text_set(btn, "Cancel");
            -elm_object_part_content_set(popup, "button1", btn);
            -evas_object_smart_callback_add(btn, "clicked", _response_cb, popup);
            -
            -btn = elm_button_add(popup);
            -elm_object_style_set(btn, "popup");
            -evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_object_text_set(btn, "OK");
            -elm_object_part_content_set(popup, "button2", btn);
            -evas_object_smart_callback_add(btn, "clicked", _response_cb, popup);
            -
            -evas_object_show(popup);
            -
          • - -
          • Create a toast popup: -
            -Evas_Object *popup;
            -struct appdata *ad = (struct appdata *) data;
            -
            -popup = elm_popup_add(ad->win_main);
            -elm_object_style_set(popup, "toast");
            -elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
            -evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            -elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            -eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            -elm_object_part_text_set(popup,"elm.text", "Saving Contacts to sim");
            -
            -evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
            -elm_popup_timeout_set(popup, 2.0);
            -evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
            -
            -evas_object_show(popup);
            -
          • -
          - -

          Managing Popup Events

          -

          The Elementary popups respond to user interactions with several events.

          -

          To manage popup events:

          - -
            -
          • Handle timeout events: -

            The "timeout" event is triggered whenever a popup is closed as a result of timeout.

            -
            -static void _timeout_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   evas_object_del(obj);
            -}
            -elm_popup_timeout_set(popup, 3.0);
            -evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
            -
          • - -
          • Handle the block,clicked events: -

            The "block,clicked" event is triggered whenever the user taps on a blocked event area.

            -
            -static void _block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
            -{
            -   evas_object_del(obj);
            -}
            -evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
            -
          • - -
          - - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/scalability_n.htm b/org.tizen.ui.guides/html/native/efl/scalability_n.htm deleted file mode 100755 index de81e0a..0000000 --- a/org.tizen.ui.guides/html/native/efl/scalability_n.htm +++ /dev/null @@ -1,762 +0,0 @@ - - - - - - - - - - - - - Scalability Support - - - - - -
          - -

          Scalability Support

          -

          To ensure that your application works well in diverse devices, you must consider scalability when designing the application layout:

          - - -

          Key Concepts

          - -

          When designing the application layout to be scalable, you must pay attention to the following key concepts:

          - -
          • Understand the character of the relative position and the fixed position - -

            In the relative position, the size is determined in proportion to the size of the referred object. For example, if an orange rectangle occupies 30% of the green rectangle, and the green rectangle is expanded, the orange rectangle is expanded accordingly. However, if the scaling value is changed and the green rectangle is not scaled, the orange rectangle remains unchanged too.

            - -

            Figure: Relative position

            -

            Relative position

            - -

            In the fixed position, the size is determined by a value set for the object. For example, the orange rectangle set to the size of 10. If the green rectangle is expanded, the orange rectangle does not change. However, if the scaling value is, for example, doubled, the size of the orange rectangle grows to 20.

            - -

            Figure: Fixed position

            -

            Fixed position

          • - -
          • Use the relative position -

            If you set the object size as a percentage, the ratio remains fixed regardless of the changes in the screen size or resolution. If you want the object size changed in proportion of the window size, use the relative position.

            - -

            Figure: Scaling relative position

            -

            Scaling relative position

          • - -
          • Multiply the scaling value, if you use the fixed size -

            If you use the EDC file to set up the layout, you can set the scale in the part element:

            -
            -parts 
            -{
            -   part 
            -   { 
            -      name: "box"; 
            -      type: RECT;
            -      scale: 1;
            -   }
            -}
            -
            - -

            If you set the fixed size in C code, you can use the ELM_SCALE_SIZE macro:

            -
            evas_object_size_hint_min_set(object, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
            - -

            For more information see Applying the Base Scale.

          • - -
          • Do not fill the width or height out with a fixed size only -

            If you fill the entire height out with a fixed size only and it is scaled, the end result can be larger than the screen size.

            - -

            Figure: Height filled with a fixed size

            -

            Height filled with a fixed size

            - -

            If you set a partial width or height with a fixed size and leave the remaining area flexible, the layout does not expand outside the screen.

            - -

            Figure: Height with a flexible area

            -

            Height with a flexible area

          - - - -

          Scalability Using Elementary UI Components

          - -

          The Tizen platform provides a UI component toolkit library, called Elementary, that includes an extensive set of UI components. You can use elementary UI components to compose your application user interface (UI). While creating the UI, you can set specific properties for the UI components to control the scalable behavior of the UI. Before you try to create a scalable UI using elementary UI components, make sure you understand the following core concepts on how scalability works with elementary UI components.

          - - - - - - - - - - -
          Note
          The Elementary library provides 3 groups of APIs: -
          • Infrastructure: to control the behavior of elementary.
          • -
          • Container: UI components that can contain other UI components.
          • -
          • UI components: elementary UI components, such as buttons, lists, and check and radio boxes.
          - -

          Using Containers for Effective Layouts

          - -

          The Elementary library provides several containers to display UI components in an effective layout. The containers have no visual identity of their own.

          - -
          • Box - -

            The box container makes a layout where child UI components are stacked in either horizontal or vertical direction. The box size is the sum of its child UI components' size:

            -
            • A vertical box calculates its height as the sum of its children's height and its width as the width of the widest child.
            • -
            • A horizontal box calculates its width as the sum of its children's width and its height as the height of the tallest child.
            - -

            Figure: Box layout

            -

            Box layout

            - -

            The box-based linear layout is the best solution to ensure a minimum size for the child UI components in any device or any orientation.

          • - -
          • Grid - -

            The grid container makes a layout where child UI components set their position and size relative to the container position and size. You can define the virtual width and height of the grid (by default: 100 x 100). You then packs the child UI components into the grid while setting their position and size based on the virtual size of the grid.

            - -

            Figure: Grid layout

            -

            Grid layout

            - -

            The grid-based relative layout can always fill the full screen in any device or any orientation. However, the size of the child UI components is changed based on the screen size.

          - - -

          Using Weight and Align Properties

          - -

          To make a layout scalable with UI components, the UI components must be packed into a container using only the weight and align properties based on their minimum size. Do not resize the UI components directly using pixels.

          - -

          The weight and align properties are associated with every elementary UI component, and they serve as hints for the container they are in. They tell the container how the UI component wants to occupy the space and pack itself with other UI components in the container.

          - -

          Weight

          - -

          You can set the weight property with the evas_object_size_hint_weight_set(x_weight, y_weight) function:

          - -
          • Containers use the weights of the child UI components by normalizing them across all child UI components along both X and Y directions.
          • -
          • The parameter values can be 0 or positive values (default: 0.0). -

            0.0 means that the container allocates a minimum size of the UI component area.

            -

            1.0 (EVAS_HINT_EXPAND) means that the container allocates all of the remaining area to the UI component.

          • -
          • If the container has several UI components, it allocates the UI component area relative to the weights of other UI components.
          - -

          Figure: Weight hint

          -

          Weight hint

          - -

          Figure: Weight hint across multiple child UI components

          -

          Weight hint across multiple child UI components

          - -

          Align

          - -

          You can set the align property with the evas_object_size_hint_align_set(x_align, y_align) function:

          - -
          • UI components use the alignment for their position or size along both X and Y directions.
          • -
          • The parameter values can be from 0.0 to 1.0 or -1.0 (default: 0.5).
          • -
          • The values define positions as follows: left is (x=0.0), right is (x=1.0), top is (y=0.0), and bottom is (y=1.0). The center is (x=0.5, y=0.5). -

            -1.0 (EVAS_HINT_FILL) means that the UI component fills all of the allocated area.

          - -

          Figure: Alignment hint

          -

          Alignment hint

          - -

          Scalability Using Edje

          - -

          The Tizen platform provides a complex graphical design and layout library called Edje, which provides an abstraction layer between the application code and the interface. You can use Edje in your Tizen applications to create visual elements and control the layout, look, and feel.

          -

          Internally, Edje holds a geometry state machine and a state graph that defines, for example, what is visible, where, at what size, and with what colors. These details are described to Edje using an Edje .edj file. The file can be produced by using Edje_cc to take a text file (a .edc file) and "compile" an output .edj file that contains the state graph information, images, and any other needed data.

          - -

          While creating Edje, you set specific element properties to control the scalable behavior of the UI. Before creating a scalable UI using Edje, you must be familiar with the following scalability properties and part types.

          - -

          Part

          -

          Parts are used to represent the most basic layout elements, such as a line in a border or a text on an image.

          -

          The parts can have the following property:

          -
          • scale: 0-1 -

            Specifies whether the part scales its size with the scaling factor (Tizen has a scaling factor to resize the application layout and object). This property is used to scale properties, such as font size or min/max size of the part.

            -

            The default value is 0 (off) and the default scaling factor is 1.0. To make a part scalable, set the property to 1 (on).

            -
          - -

          Description

          -

          Every part can have one or more description blocks to define the layout properties of the part.

          -

          The descriptions can have the following properties:

          - -
          • min/max: width height -

            Specifies the minimum or maximum size of the part in pixels. It has no effect on the container size.

            -

            When the scale property of the part is set to 1 (on), the size is multiplied by the scaling factor.

          • - -
          • fixed: 0-1 0-1 -

            When the min or max property is set, this property sets a boolean value for each dimension (horizontal and vertical, respectively) that tells the application whether it must be scaled when resized.

            -

            The default value is 0 0. To fix a part size to its min or max, set the value to 1.

          • - -
          • align: X-axis Y-axis -

            When the displayed object size is smaller than its container, this property moves it along both axes using the relative position.

            -

            To move the property, use x = 0.0 to move to left, x = 1.0 to move to right, y = 0.0 to move to the top, and y = 1.0 to move to the bottom. The x = 0.5, y = 0.5 value sets the object at the center of its container.

            -

            The default value is 0.5 0.5.

          • - -
          • rel1/rel2 -

            Specifies the position of the left-top and bottom-right corners of the part's container.

            -
            • relative: X-axis Y-axis -

              Specifies the relative position of the part's container.

              -

              The default value is 0.0 0.0 for rel1.relative and 1.0 1.0 for rel2.relative.

            • -
            • to/to_x/to_y -

              Specified that a corner must be positioned relatively to another part's container.

              -

              By default, the corners of a part are placed to the whole interface.

            - - - - - - - - -
            Table: Edje part property example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -                                                                 
            -      images 
            -      {
            -         image: "panorama.png" COMP;
            -      }  
            -                                                                 
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "rect1";
            -            type: RECT;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.3 0.4;}
            -               rel2 {relative: 0.7 0.6;}
            -               color: 0 127 255 255;
            -            }
            -         }
            -         part 
            -         {
            -            name: "rect2";
            -            type: RECT;
            -            // Affected by scaling factor
            -            scale: 1; 
            -            description 
            -            {
            -               state: "default" 0.0;
            -               fixed: 0 1;
            -               // Height: 100 pixels (when the scaling factor is 1.0)
            -               min: 0 100;
            -               rel1 {relative: 0.0 1.0;}
            -               rel2 {relative: 1.0 1.0;}
            -               // Bottom-aligned
            -               align: 0.5 1.0;
            -               color: 255 127 0 255;
            -            }
            -         }
            -         part 
            -         {
            -            name: "image";
            -            // Affected by scaling factor
            -            scale: 1;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               fixed: 1 1;
            -               // Image size: 720 x 180 pixels (when the scaling factor is 1.0)
            -               min: 720 180;
            -               // Y-axis is positioned relative to "rect2" part
            -               rel1 {relative: 0.5 0.0; to_y: "rect2";}
            -               rel2 {relative: 0.5 0.0; to_y: "rect2";}
            -               // Bottom-aligned
            -               align: 0.5 1.0;
            -               image.normal: "panorama.png";
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Part example

            -
          • - -
          • aspect: min max -

            Specifies the width to height ratio to keep when the part is resized. When both values are the same, the ratio is fixed. When they differ, the part is forced to keep the ratio between the min and max properties when resized.

            -

            The default value is 0.0 0.0.

          • - -
          • aspect_preference: dimension -

            Specifies the scope of the aspect property to a given dimension.

            -

            The possible values are BOTH, VERTICAL, HORIZONTAL, and NONE. The default is NONE.

            - - - - - - - - -
            Table: Edje part property aspect example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -
            -      images 
            -      {
            -         image: "island.png" COMP;
            -      }
            -   
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "image";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.0;}
            -               rel2 {relative: 1.0 1.0;}
            -               image.normal: "island.png";
            -               aspect: 8/5 8/5;
            -               // Keep the aspect ratio based on the part width
            -               aspect_preference: HORIZONTAL;
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Part aspect example

            -
          - -

          Text

          -

          The text elements are used to display text on the screen.

          -

          The texts can have the following properties:

          - -
          • size: font-size -

            Specifies the font size for the text. When the scale property of the part is set to 1 (on), the size is multiplied by the scaling factor.

          • - -
          • min: horizontal vertical -

            Specifies a pair of boolean values that define whether the container can be reduced further than the text size. The property is used to prevent the container from chopping the text.

            -

            When min is set horizontally or vertically, the minimum height or width of the part is decided by the text size.

            -

            The default value is 0 0.

          • - -
          • max: horizontal vertical -

            Specifies a pair of boolean values that define whether the container can be expanded further than the text size.

            -

            When max is set horizontally or vertically, the maximum height or width of the part is decided by the text size.

            -

            The default value is 0 0.

            - - - - - - - - -
            Table: Edje text property example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "text";
            -            type: TEXT;
            -            scale: 1;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.0;}
            -               rel2 {relative: 1.0 0.0;}
            -               align: 0.5 0.0;
            -               color: 108 108 108 255;
            -               text 
            -               {
            -                  font: "TIZEN";
            -                  // Affected by scaling factor
            -                  size: 80;
            -                  // Minimum height of the part container is decided by the text size
            -                  min: 0 1;
            -                  text: "Test properties!!";
            -               }
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Text example

            - -
          • -
          • fit: horizontal vertical -

            Specifies a pair of values that define whether the text is scaled to fill its container horizontally and/or vertically.

            -

            The default value is 0 0.

            - - - - - - - - -
            Table: Edje text property fit example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "text";
            -            type: TEXT;
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.0;}
            -               rel2 {relative: 1.0 0.1;}
            -               color: 108 108 108 255;
            -               text 
            -               {
            -                  font: "TIZEN";
            -                  // Resize text to fill the container height
            -                  fit: 0 1;
            -                  text: "Test properties!!";
            -               }
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Text fit example

          - - -

          Image

          -

          The image elements are used to display images on the screen.

          -

          The images can have the following properties:

          - -
          • border: left right top bottom -

            Specifies the border size of the image in pixels. This property sets the area of each side of the image to be displayed as a fixed size border, preventing the corners from being changed on a resize.

          • - -
          • border_scale -

            Specifies whether the border scales its size according to the scaling factor.

            -

            The default value is 0 (off). To make the border scalable, the value must be set to 1 (on).

            - - - - - - - - -
            Table: Edje image property example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -
            -      images 
            -      {
            -         image: "00_button_01_normal.png" COMP;
            -      }
            -
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "image";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.6;}
            -               rel2 {relative: 1.0 0.7;}
            -               image.normal: "00_button_01_normal.png";
            -            }
            -         }
            -         part 
            -         {
            -            name: "ninepatch_image";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.8;}
            -               rel2 {relative: 1.0 0.9;}
            -               image 
            -               {
            -                  normal: "00_button_01_normal.png";
            -                  border: 4 4 0 0;
            -                  // Affected by scaling factor
            -                  border_scale: 1;
            -               }
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Image example

            - -
          -

          Image Set

          -

          The image set elements are used to display a specific image on the screen based on the container size.

          -

          The image sets can have the following properties:

          - -
          • name: image-name -

            Specifies the name of the image file.

          • - -
          • size: minw minh maxw maxh -

            Specifies the minimum and maximum size that causes a specified image to be selected and shown.

            -

            The image set is used to control resource quality when the image part is scaled to multiple devices. According to the size of the part's container, an appropriate image is loaded.

            - - - - - - - - -
            Table: Edje image set property example
            -
            -collections 
            -{
            -   group 
            -   {
            -      name: "property_test";
            -
            -      images 
            -      {
            -         set 
            -         {
            -            name: "alternative_animal";
            -            image 
            -            {
            -               image: "pig.png" COMP;
            -               size: 640 800 1200 1500;
            -            }
            -            image 
            -            {
            -               image: "monkey.png" COMP;
            -               size: 400 500 639 799;
            -            }
            -            image 
            -            {
            -               image: "cat.png" COMP;
            -               size: 240 300 399 499;
            -            }
            -            image 
            -            {
            -               image: "mouse.png" COMP;
            -               size: 80 100 239 299;
            -            }
            -            image 
            -            {
            -               image: "snail.png" COMP;
            -               size: 0 0 79 99;
            -            }
            -         }
            -      }
            -
            -      parts 
            -      {
            -         part 
            -         {
            -            name: "image1";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.0;}
            -               rel2 {relative: 1.0 0.45;}
            -               image.normal: "alternative_animal";
            -               aspect: 4/5 4/5;
            -               aspect_preference: BOTH;
            -            }
            -         }
            -         part 
            -         {
            -            name: "image2";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.5;}
            -               rel2 {relative: 1.0 0.75;}
            -               image.normal: "alternative_animal";
            -               aspect: 4/5 4/5;
            -               aspect_preference: BOTH;
            -            }
            -         }
            -         part 
            -         {
            -            name: "image3";
            -            description 
            -            {
            -               state: "default" 0.0;
            -               rel1 {relative: 0.0 0.8;}
            -               rel2 {relative: 1.0 1.0;}
            -               image.normal: "alternative_animal";
            -               aspect: 4/5 4/5;
            -               aspect_preference: BOTH;
            -            }
            -         }
            -      }
            -   }
            -}
            -

            Image set example

            -
          - -

          Part Types

          -

          You can use fixed and flexible parts:

          - -
          • Fixed parts - -
            • Fixed parts have a minimum size (at least width or height).
            • -
            • When the part scale property is set to 1 (on), the scaling factor has an effect on the minimum size.
            • -
            • Fixed parts are used when the parts must keep a fixed size in any device or any orientation.
          • -
          • Flexible parts -
            • Flexible parts resize according to the container size and other fixed parts' size.
            • -
            • Flexible parts are used when the parts can be resized in any device or any orientation.
          - -

          Figure: Fixed and flexible parts

          -

          Fixed and flexible parts

          - - -

          Aspect Ratio

          - -

          In Tizen, the application generally fills out the screen. However, sometimes you want the application to be shown in a specific aspect ratio, regardless of the screen size.

          -

          As images are scaled in different devices, they are resized based on the container size. The images have specific properties that define the area to be shown when resized.

          - -

          For example, the following table illustrates what happens to the parts marked with yellow rectangles in the following figures, when scaling properties are applied.

          - -

          Figure: Original image [1920x1280 (8:5)]

          -

          Original image [1920x1280 (8:5)]

          - - - - - - - - - - - -
          Note
          To set the required aspect ratio, use the evas_object_size_hint_aspect_set() function or the aspect_preference attribute in the EDC.
          - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Image resizing effects with a specific aspect ratio
          AspectContainer area
          720x384 (15:8)720x640 (9:8)
          HORIZONTAL -

          Resizing based on the container width while keeping the image aspect ratio.

          -

          Extra height goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          VERTICAL -

          Resizing based on the container height while keeping the image aspect ratio.

          -

          Extra width goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          BOTH -

          Resizing based on the container area while keeping the image aspect ratio.

          -

          No extra width or height goes outside the image area, so the entire image is always shown.

          Scaling effect

          Scaling effect

          NONE -

          Resizing to fill the available area while keeping the image aspect ratio.

          -

          Extra width or height goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          - -

          Setting the Image Aspect Ratio

          -

          In case of an image object, you can set its aspect ratio with additional APIs:

          - -
          • elm_image_fill_outside_set() -

            If the function is set to TRUE, the image resizes to fill the entire area while keeping its aspect ratio. It lets the extra width or height go outside of the area (same result as with the aspect NONE in the above table).

          • - -
          • elm_image_aspect_fixed_set() - -

            If the function is set to FALSE, the image resizes to fill the entire area without keeping its original aspect ratio. The image can be distorted to fit the area.

            - - - - - - - - - - - - - - -
            Table: Image resizing without keeping the aspect ratio
            Container area
            720x384 (15:8)720x640 (9:8)

            Scaling effect

            Scaling effect

            -
          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/theme_n.htm b/org.tizen.ui.guides/html/native/efl/theme_n.htm deleted file mode 100755 index 00ac2ce..0000000 --- a/org.tizen.ui.guides/html/native/efl/theme_n.htm +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - Themes: Specifying the UI Look and Feel - - - - - -
          - -

          Themes: Specifying the UI Look and Feel

          - - -

          Tizen provides powerful theme features you can use to easily change your applications' UI look and feel. A theme is a collection of visual identities, which provide the graphical appearance of applications. A theme comprises a layout, shapes, fonts, and colors for the UI components.

          - -

          The Tizen platform provides a default theme for UI components implemented based on the Tizen UX design concept (AIR – light and simple). To change the current look and feel, you can replace the default theme with a customized theme package.

          - -

          The Edje library used by Elementary provides themes. You can also use Edje to create your own objects to modify the application appearance with a unique GUI. The UI components are customizable so that each application can have its own customized theme to overlay the default theme.

          - -

          Edje supports separation between layout and logic. While it is possible to implement both GUI and logic in the C code, a loose coupling of GUI and logic is more convenient when you want to revise, add, or delete application UI components. In EFL, the GUI is handled by Edje, while application logic is handled in the C code.

          - -

          Edje was designed as a theme layer for moving the look, feel, and animation of objects into separate data files loaded at runtime. Using a plain text EDC file you can create your application's layout without writing a single line of code. EFL can even change the theme of application at runtime without restarting the application.

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/threads_n.htm b/org.tizen.ui.guides/html/native/efl/threads_n.htm deleted file mode 100755 index 0e837b2..0000000 --- a/org.tizen.ui.guides/html/native/efl/threads_n.htm +++ /dev/null @@ -1,507 +0,0 @@ - - - - - - - - - - - - - Using Threads - - - - - -
          - -

          Using Threads

          - -

          Threads are concurrent execution environments that are lighter than full-blown processes because they share some operating system resources. Threads make it possible to do several things at the same time while using less resources and offering simpler synchronization and data exchange compared to processes.

          - -

          If you move a blocking operation to a separate thread, it cannot block the event loop and keeps the user interface reactive. Blocking the event loop and using long-running callbacks means the application cannot update its graphical user interface.

          - -

          While threads can be useful, they are not always the best choice:

          - -
          • The first rule to using threads is to avoid them as much as possible, as there are often better tools and approaches. For example, to do network transfers, use Ecore_Con that integrates with the event loop to use a function based on callbacks. Being able to use such a function means that specific support work has been done in libraries. In some cases, using a function and libraries is impossible, and in those situations threads are required.
          • -
          • Use threads in CPU-intensive tasks and disk IOs. For example, a thread is the appropriate way to apply filters to an image or to a video without blocking the interface.
          • -
          • Use threads to take advantage of multiple available CPU cores, if the workload can be split into several units of work and spread across the cores. A typical example for an image processing application on a quad-core CPU is to process 4 images at once, each on 1 thread. For such tasks, the thread pool helps with the creation and scheduling of the threads, handling all the grunt work.
          - -

          Thread Safety

          - -

          If several strings have to work on the same resources, conflicts can happen as the threads are run in parallel. For example, if thread A modifies several values while thread B is reading them, it is likely that some of the values read by B are outdated. Similar issues can happen if both threads are modifying data concurrently.

          - -

          These kinds of conflicts are called race-conditions: depending on which thread is faster, the output changes and can be incorrect. Avoiding such issues is called thread safety. Thread safety involves critical sections, which are blocks of code that operate on shared resources and must not be accessed concurrently by another thread.

          - -

          The usual solution for ensuring exclusive access to shared resources is mutual exclusion: only 1 thread can operate on the data at any given time. Mutual exclusion is often implemented through locks. Before attempting to operate on a shared resource, the thread waits until it can lock something called a mutex (stands for mutual exclusion), then operates on the resource, and unlocks the mutex. Operating systems guarantee that only 1 thread can lock a mutex at a given time: this ensures that only 1 thread operates on the shared resource at one time.

          - -

          For more information on thread safety, see Low-level Functions.

          - -

          Thread Pools

          - -

          Threads are operating system resources: while much lighter than processes, they still have a cost. Moreover, spawning a thousand threads means that each of them only gets 1/1000th of the total CPU time: each thread is progressed slowly and, in the worst case, the system wastes all of its time switching between threads without doing any actual work.

          - -

          Thread pools solve this problem. In thread pools, upto a maximum number of threads are created on-demand and used to execute tasks. When the tasks are finished, they are kept alive but sleeping. This avoids the cost of creating and destroying them.

          - -

          In EFL, the thread pool is controlled by a thread_max parameter, which defines the maximum number of threads running at the same time. Another control feature is the func_end() callback that runs from the main loop thread after a task has completed and is typically used to extract the data from the finished task and make it available to the main loop.

          - -

          To manage the maximum number of threads:

          - -
            -
          • To retrieve the current value, use the ecore_thread_max_get() function. -
          • - -
          • To set the value, use the ecore_thread_max_set() function. The value has a maximum of 16 times the CPU count. -
          • - -
          • To reset the maximum number of threads, use the ecore_thread_max_reset() function. - -
          • - -
          • To get the number of available threads in the pool, use the ecore_thread_available_get() function. The function returns the current maximum number of threads minus the number of running threads. The number can be a negative value, if the maximum number of threads has been lowered. -
          • -
          - -

          The following figures illustrate the thread pool. The first figure shows the occupancy of a hypothetical thread pool. There are several tasks, of which 4 are running. The thread_max parameter of the pool is 4, and the other tasks are waiting. There is no thread with its func_end() callback currently called.

          - -

          Figure: Thread pool, step 1

          -

          Thread pool, step 1

          - -

          When a task, applying the sepia filter on image1, finishes, the corresponding func_end() function is invoked from the main loop.

          - -

          Figure: Thread pool, step 2

          -

          Thread pool, step 2

          - -

          With the task done, one of the threads from the pool becomes available, and another thread, adding the reverberation effect on audio3, can run in it.

          - -

          Figure: Thread pool, step 3

          -

          Thread pool, step 3

          - -

          As long as there are tasks to be done, the thread pool continues the same way, running tasks in its threads whenever a thread is available.

          - - -

          Thread Management with Ecore

          - -

          Ecore offers a simplified API for managing threads in EFL applications. The Ecore API applies to a typical scenario where the main thread creates another thread, which in turn sends data back to the main thread or calls GUI-related functions. GUI-related functions are not thread-safe.

          - -

          Creating Threads with Ecore

          - -

          The threads created with Ecore are by default integrated with the thread pool and offer simple callback-based ways to interact with the main loop. New threads are created as needed until the maximum capacity of the thread pool is reached.

          - -
          • To return values to the main thread: -

            Use the ecore_thread_feedback_run() function to send intermediate feedback from the thread to the main loop.

          • - -
          • To return only the final value to the main thread: -

            To create and run a thread, use the ecore_thread_run() function. It runs a function inside a thread from the thread pool and takes care of all the low-level work. It returns the corresponding thread handler or NULL on failure.

            - -

            The most common way to return data from one thread to the main thread is to put a pointer to it in the data. When the thread is aborted or finishes, either func_cancel() or func_end() is called from the main loop. The functions are running in the simpler context of a single thread running at once and therefore avoid race-conditions.

            - -

            The data pointer approach can only be used when the data is shared between the one thread and the main thread only. However, this does not prevent you from using the func_end() callback to merge the results into a single data structure. For example, you can add all the values computed by the threads to an Eina_List, as all the operations on the list happen from a single thread and therefore one after the other and not concurrently.

          - - -

          Running Callbacks from the Main Loop

          - -

          If you are performing operations in another thread and want to update a progress bar, the update operation must be done from the main thread. The simplest way is to use the ecore_main_loop_thread_safe_call_async() function, which takes a function and some data as parameters and instructs the main loop to execute the given function with the given data.

          - -

          Depending on the kind of thread the function is called from, the process differs:

          -
            -
          • If the function is called from a thread that is not the main one, the function sends a message to the main loop and returns quickly. The message is processed in order, similarly to others.
          • - -
          • If the function is called from the main thread, the function is called immediately as if it were a direct call.
          • -
          - -

          If you want to wait until the callback is called and returns, use the ecore_main_loop_thread_safe_call_sync() function, which is similar but synchronous. Since it is synchronous, it can also return the value returned by the callback.

          - -

          Low-level Functions

          - -

          Eina offers low-level functions that are portable across the operating system, such as locks, conditions, semaphores, barriers, and spinlocks. The functions follow closely the logic of pthreads.

          - -

          While these functions are useful, they are building blocks and not usually useful in EFL applications considering the higher-level functions that are available in Ecore.

          - -

          For an introduction to threads and pthreads in particular, see:

          - - - -

          If you are already familiar with threads, see the standard pthreads documentation and the Eina reference documentation, or the following function lists. Remember that the Eina functions map very closely to the pthreads functions.

          - - - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Locks (mutual exclusions)
          pthreads functionEina equivalent
          pthread_mutex_new()eina_lock_new()
          pthread_mutex_destroy()eina_lock_free()
          pthread_mutex_lock()eina_lock_take()
          pthread_mutex_trylock()eina_lock_take_try()
          pthread_mutex_unlock()eina_lock_release()
          none (prints debug information on the lock)eina_lock_debug()
          - - - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Conditions (notifications when condition objects change)
          pthreads functionEina equivalent
          pthread_cond_init()eina_condition_new()
          pthread_cond_destroy eina_condition_free()
          pthread_cond_wait()eina_condition_wait()
          pthread_cond_timedwait()eina_condition_timedwait()
          pthread_cond_broadcast()eina_condition_broadcast()
          pthread_cond_signal()eina_condition_signal()
          - - - ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -
          RWLocks (Read-write locks, for multiple-readers/single-writer scenarios)
          pthreads functionEina equivalent
          pthread_rwlock_init() -eina_rwlock_new()
          pthread_rwlock_destroy()eina_rwlock_free()
          pthread_rwlock_rwlock_rdlock() -eina_rwlock_take_read()
          pthread_rwlock_rwlock_wrlock() -eina_rwlock_take_write()
          pthread_rwlock_unlock() -eina_rwlock_release()
          - - - ---- - - - - - - - - - - - - - - - - - - - - - - -
          TLS (Thread-Local Storage)
          pthreads functionEina equivalent
          pthread_key_create()eina_tls_new()
          pthread_key_delete()eina_tls_free()
          pthread_getspecific()eina_tls_get()
          pthread_setspecificeina_tls_set()
          - - - ---- - - - - - - - - - - - - - - - - - - - - - - -
          Semaphores (access restrictions for a set of resources)
          pthreads functionEina equivalent
          sem_init()eina_semaphore_new()
          sem_destroy()eina_semaphore_free()
          sem_wait()eina_semaphore_lock()
          sem_post()eina_semaphore_release()
          - - - ---- - - - - - - - - - - - - - - - - - - -
          Barriers
          pthreads functionEina equivalent
          pthread_barrier_init()eina_barrier_new()
          pthread_barrier_destroy()eina_barrier_free()
          pthread_barrier_wait()eina_barrier_wait()
          - -

          Thread Use Examples

          - -

          The following examples display a window with a label. An auxiliary thread semi-regularly changes the text of the label. If you want to display a regular animation, use the Ecore animators described in the Main Loop guide.

          - -

          To use the ecore_thread_feedback() function:

          - -
            - -
          1. Implement the GUI function that sets the text of a label and can be called from the main thread. - -
            -static void
            -_set_label_text(void *data, Ecore_Thread *thread __UNUSED__, void *msgdata)
            -{
            -   char buf[64];
            -   appdata_s *ad = data;
            -   snprintf(buf, sizeof(buf), "Tick %d", (int)(uintptr_t)msgdata);
            -   elm_object_text_set(ad->label, buf);
            -}
            -
            -
          2. -
          3. Send the feedback from the other thread using the ecore_thread_feedback() function. The following function does nothing besides sending the feedback and sleeping. - -
            -static void
            -_long_function(void *data __UNUSED__, Ecore_Thread *thread)
            -{
            -   int iteration;
            -   // Change the text roughly every 1 second. This is only an example; if you
            -   // want regular animations, use Ecore animators!
            -   for (iteration = 0; ; iteration++) 
            -   {
            -      // Since you are running from another thread, you need to take special
            -      // care and instead send data to the main thread and have it run the
            -      // feedback function given when creating the thread
            -      ecore_thread_feedback(thread, (void*)(uintptr_t)iteration);
            -      // Sleep for roughly one second
            -      sleep(1);
            -   }
            -}
            -
            -
          4. - -
          5. Create an end function that is called when the thread exits. In this example, the end function is called only right before the application exits. However, if the blocking function is more complex, it can trigger the end function. - -
            -static void
            -_end_func(void *data, Ecore_Thread *thread __UNUSED__)
            -{
            -   appdata_s *ad = data;
            -   elm_object_text_set(ad->label, "Ticks over");
            -}
            -
            -
          6. - -
          7. Call the ecore_thread_feedback_run() function to start the thread: - -
            -ecore_thread_feedback_run(_long_function, _set_label_text, _end_func, NULL, ad, EINA_FALSE);
            -
            -
          8. -
          - -

          To use the ecore_main_loop_thread_safe_call_sync() function:

          - -
            -
          1. Implement the GUI function that sets the text of a label and can be called from the main thread. The function receives data as a structure and alternatively displays "Tick d" or "Tock d". - -
            -struct thd 
            -{
            -   appdata_s *ad;
            -   Eina_Bool tick_not_tock;
            -   int iteration;
            -};
            -static void *
            -_set_label_text_tick_tock(void *data)
            -{
            -   char buf[64];
            -   struct thd *thd = data;
            -   snprintf(buf, sizeof(buf), "%s %d", (thd->tick_not_tock ? "Tick" : "Tock"), thd->iteration);
            -   elm_object_text_set(thd->ad->label, buf);
            -
            -   return NULL;
            -}
            -
            -
          2. - -
          3. Use the ecore_main_loop_thread_safe_call_sync() function call the GUI function. Differentiate between the ticks and the tocks: - -
            -static void
            -_long_function_tick_tock(void *data, Ecore_Thread *thread __UNUSED__)
            -{
            -   struct thd *thd = malloc(sizeof(struct thd));
            -   thd->ad = data;
            -   for (thd->iteration = 0; ; (thd->iteration)++) 
            -   {
            -      thd->tick_not_tock = EINA_TRUE;
            -      ecore_main_loop_thread_safe_call_sync(_set_label_text_tick_tock, thd);
            -      sleep(1);
            -      thd->tick_not_tock = EINA_FALSE;
            -      ecore_main_loop_thread_safe_call_sync(_set_label_text_tick_tock, thd);
            -      sleep(1);
            -   }
            -   free(thd);
            -}
            -
            -
          4. - -
          5. Start the thread through the ecore_thread_run() function: - -
            -ecore_thread_run(_long_function_tick_tock, _end_func, NULL, ad);
            -
            -
          6. -
          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/tools_n.htm b/org.tizen.ui.guides/html/native/efl/tools_n.htm deleted file mode 100755 index eba7d01..0000000 --- a/org.tizen.ui.guides/html/native/efl/tools_n.htm +++ /dev/null @@ -1,243 +0,0 @@ - - - - - - - - - - - - - Tools - - - -
          -
          -

          Mobile native Wearable native

          -
          - - -
          - -
          - -

          Tools

          -

          Eina provides a number of tools, such as string manipulation, that make your life easier when coding applications:

          - -
            -
          • Convert fast: conversion from, for example, strings to integers and double
          • -
          • Counter: measures the number of calls and their time
          • -
          • Error: error identifiers
          • -
          • File: file list and path split
          • -
          • Lazy allocator: lazy allocator
          • -
          • Log: full-featured logging system
          • -
          • Magic: provides runtime type checking
          • -
          • Memory Pool: abstraction for various memory allocators
          • -
          • Module lists: loads and shares modules using the Eina_Module standard
          • -
          • Rectangle: rectangle structure and standard manipulation methods
          • -
          • Safety Checks: extra checks that report unexpected conditions and can be disabled during compilation
          • -
          • String: set of functions that manage C strings
          • -
          - -

          String

          - -

          When creating applications, you always need to manipulate strings. Eina provides a very useful API for manipulating C strings:

          - -
          • - -

            The most common string manipulation is the "split". If you have a string, such as "Rasterman:Bluebugs:Tasn:Illogict:billiob:Puppet_Master", and you want to print it in an easily readable format, you can use the eina_str_split() function to split the string using a delimiter. The first parameter is the string to split, the second determines where to split the string, and the final parameter is the maximum number of strings to split the string into. If you set a number less than 1, it splits the string as many times as possible.

            -

            The function returns a newly-allocated NULL-terminated array of strings, or NULL, if it fails to allocate the array. Always remember to free the memory allocated by the eina_str_split() function.

            - -
            -char *nicks = "Rasterman:Bluebugs:Tasn:Illogict:billiob:Puppet_Master";
            -char **result_arr;
            -int i;
            -
            -// Splitting the string with ':' delimiter
            -result_arr = eina_str_split(names, ":", 0);
            -// Printing the result
            -for (i = 0; result_arr[i]; i++)
            -   printf("Nick : %s\n", result_arr[i]);
            -// Remember to free memory
            -free(arr[0]);
            -free(arr);
            -
          • - - -
          • To change the string to lowercase or uppercase, use the eina_str_tolower() and eina_str_toupper() functions. They change the case for all characters of the given string. These functions modify the original strings.

            - -
            -char *str;
            -// Initialize the string
            -str = malloc(sizeof(char) * 4);
            -strcpy(str, "bsd");
            -// Change the string to uppercase
            -eina_str_toupper((char **)&str);
            -printf("%s\n", str);
            -// Change the string to lowercase
            -eina_str_tolower(&str);
            -printf("%s\n", str);
            -// Free the allocated memory
            -free(str);
            -
          • -
          • If you need to "join" 2 strings of known length, use the eina_str_join() function. The fist parameter is the buffer to store the result, the second is the size of the buffer, the third is the separator between the 2 strings, and the 2 final parameters are the stings to be joined.

            - -
            -char *part1 = "Tizen powered by";
            -char *part2 = "Enlightenment Foundation Libraries";
            -char *res;
            -size_t size;
            -// Calculate the string size + 1 for the delimiter
            -size = strlen(part1) + strlen(part2) + 1
            -// Allocate memory for the result
            -res = malloc(sizeof(char) * size);
            -// Join the strings
            -eina_str_join(res, size, ' ', part1, part2);
            -printf("%s\n", res);
            -// Free the allocated memory
            -free(res):
            -
          • -
          • To check whether a string starts or ends with another string, use the eina_str_has_prefix() or eina_str_has_suffix() function. You can also check whether a string has a particular extension with the eina_str_has_extension() function.

            - -

            These functions return EINA_TRUE if the given string contains the specified prefix, suffix, or extension, and EINA_FALSE if it does not.

            - -
            -char *names = "Carsten;Cedric;Tom;Chidambar;Boris;Philippe"
            -if (eina_str_has_prefix(names, "Carsten"))
            -   printf("String starts with 'Carsten'")
            -if (eina_str_has_suffix(names, "Philippe"))
            -   printf("String ends with 'Philippe'")
            -if (eina_str_has_extension(names, "philippe"))
            -   printf("String has extension 'philippe'")
            -else
            -   printf("String does not have extension "philippe)
            -
          - -

          Memory Pool

          - -

          The Eina_Mempool tool provides memory pool functionality. With a memory pool, you can preallocate fixed-size memory spaces for easy memory management.

          - -

          The following mempools are available:

          -
            -
          • buddy
          • -
          • chained_pool
          • -
          • ememoa_fixed and ememoa_unknown
          • -
          • fixed_bitmap
          • -
          • pass_through
          • -
          • one_big
          • -
          - -

          Safety Checks

          - -

          Eina safety checks are a set of macros that can be used to check for parameters or values that must never occur. The concept is similar to the assert() function, but safety checks log the parameter or value and return instead of aborting your program.

          - -

          The following safety checks are available:

          -
            -
          • EINA_SAFETY_ON_NULL_RETURN(exp)
          • -
          • EINA_SAFETY_ON_NULL_RETURN_VAL(exp, val)
          • -
          • EINA_SAFETY_ON_NULL_GOTO(exp, label)
          • -
          • EINA_SAFETY_ON_TRUE_RETURN(exp)
          • -
          • EINA_SAFETY_ON_TRUE_RETURN_VAL(exp, val)
          • -
          • EINA_SAFETY_ON_TRUE_GOTO(exp, label)
          • -
          • EINA_SAFETY_ON_FALSE_RETURN(exp)
          • -
          • EINA_SAFETY_ON_FALSE_RETURN_VAL(exp, val)
          • -
          • EINA_SAFETY_ON_FALSE_GOTO(exp, label)
          • -
          • EINA_ARG_NONNULL(...)
          • -
          - -

          To return if a variable is NULL, use the EINA_SAFETY_ON_NULL_RETURN() function. This macro calls return if the given parameter is NULL.

          - -
          -Eina_Bool myfunction(char *param) 
          -{
          -   // If my param is NULL, EINA_SAFETY_ON_NULL_RETURN calls "return"
          -   EINA_SAFETY_ON_NULL_RETURN(param);
          -
          -   printf("My pram is : %s\n", param);
          -
          -   return EINA_TRUE;
          -} 
          -
          - -

          To return a specific value, use the EINA_SAFETY_ON_NULL_RETURN_VAL() function instead of the EINA_SAFETY_ON_NULL_RETURN() function. This macro returns the given value.

          - -
          -Eina_Bool void myfunction(char *param)
          -{
          -   // If the parameter is NULL, return EINA_FALSE;
          -   EINA_SAFETY_ON_NULL_RETURN_VAL(param, EINA_FALSE);
          -   printf("My pram is : %s\n", param);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          To call another function if a parameter is NULL, use the EINA_SAFETY_ON_NULL_GOTO() function. This macro works similarly to the EINA_SAFETY_ON_NULL_RETURN() function except that it calls goto with the given function instead of return.

          - -
          -static void isnullcb()
          -{
          -   printf("The parameter is NULL\n");
          -}
          -Eina_Bool void myfunction(char *param)
          -{
          -   // If the parameter is NULL we return EINA_FALSE;
          -   EINA_SAFETY_ON_NULL_GOTO(param, isnullcb);
          -   printf("My pram is : %s\n", param);
          -
          -   return EINA_TRUE;
          -}
          -
          - -

          Eina also provides macros that check whether a given value is TRUE or FALSE. For example, to call return if a given value is TRUE, use the EINA_SAFETY_ON_TRUE_RETURN() function. To call "goto" in a given function if a given value is TRUE, use the EINA_SAFETY_ON_NULL_GOTO() function.

          - - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/touch_gesture_n.htm b/org.tizen.ui.guides/html/native/efl/touch_gesture_n.htm deleted file mode 100755 index e295894..0000000 --- a/org.tizen.ui.guides/html/native/efl/touch_gesture_n.htm +++ /dev/null @@ -1,265 +0,0 @@ - - - - - - - - - - - - - - Handling Component Touch Gestures - - - - - - -
          -

          Handling Component Touch Gestures

          - - -

          This tutorial demonstrates how you can implement different types of gestures provided by the EFL library and instructions on how to use them.

          - -

          Initializing Touch Gestures

          - -

          The EFL library provides a wide range of touch gestures, such as tap, double tap, triple tap, long tap, momentum, line, zoom and rotate, which can be used by the application to build a dynamic user interface interaction which is simple to use as well as intuitive.

          -

          The create_base_gui function creates the application layout. It starts by creating a window, then adds the elm_conformant component to it to decorate the window with an indicator. It then adds the elm_naviframe component which acts as a view manager for the window and provides the window title functionality. After this it creates a gesture view by using the create_main_view() function and adds it to naviframe.

          -
          -static void
          -create_base_gui(appdata_s *ad)
          -{
          -   Elm_Object_Item *nf_it, *tabbar_it;
          -   // Window
          -   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          -   elm_win_autodel_set(ad->win, EINA_TRUE);
          -   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          -   // Conformant
          -   ad->conform = elm_conformant_add(ad->win);
          -   elm_win_conformant_set(ad->win, EINA_TRUE);
          -   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          -   elm_win_resize_object_add(ad->win, ad->conform);
          -   evas_object_show(ad->conform);
          -   // Naviframe
          -   ad->nf = elm_naviframe_add(ad->layout);
          -   // Calendar View
          -   create_main_view(ad);
          -   elm_naviframe_item_push(ad->nf, "Calendar", NULL, NULL, ad->calendar, NULL);
          -   elm_object_part_content_set(ad->layout, "elm.swallow.content", ad->nf);
          -   // Show window after the base GUI is set up
          -   evas_object_show(ad->win);
          -}
          -
          - -

          The create_main_view function creates the application layout by arranging the labels and rectangles by using recursive composition of the box layout:

          -
          -static void
          -create_main_view(appdata_s *ad)
          -{
          -   // Box
          -   ad->box = elm_box_add(ad->nf);
          -   evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, VAS_HINT_EXPAND);
          -   elm_box_padding_set(ad->box, 0, 5 * elm_config_scale_get());
          -   evas_object_show(ad->box);
          -   // Event Rect
          -   ad->rect = evas_object_rectangle_add(evas_object_evas_get(ad->box));
          -   evas_object_size_hint_weight_set(ad->rect, EVAS_HINT_EXPAND, VAS_HINT_EXPAND);
          -   evas_object_size_hint_align_set(ad->rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
          -   evas_object_color_set(ad->rect, 204, 204, 204, 255);
          -   evas_object_repeat_events_set(ad->rect, EINA_TRUE);
          -
          -   ad->gl = create_gesture_layer(ad);
          -
          -   elm_box_pack_end(ad->box, ad->rect);
          -   evas_object_show(ad->rect);
          -}
          -
          - -

          A gesture layer is added to the rectangle object. This layer is able to receive the gesture event:

          -
          -static Evas_Object *
          -create_gesture_layer(appdata_s *ad)
          -{
          -   Evas_Object *g = elm_gesture_layer_add(ad->win);
          -   elm_gesture_layer_attach(g, ad->rect);
          -}
          -
          - -

          The following figure illustrates the Gesture Detector.

          - -

          Figure: Gesture Detector screen

          -

          Gesture Detector screen

          - -

          Implementing Touch Gestures

          - -

          The elm_gesture_layer_attach() is the function to which a gesture layer for a particular object is attached.

          -

          A gesture can have 4 different states:

          -
            -
          • ELM_GESTURE_STATE_START
          • -
          • ELM_GESTURE_STATE_MOVE
          • -
          • ELM_GESTURE_STATE_ABORT
          • -
          • ELM_GESTURE_STATE_END
          -

          Every gesture starts with the ELM_GESTURE_STATE_START state and finishes with either the ELM_GESTURE_STATE_END or ELM_GESTURE_STATE_ABORT state depending on whether the gesture is completed or aborted on that object.

          -

          If an application only needs to track a finished gesture, it can listen for the finished state only. For a more complete control of the gesture, an application can listen for all state changes for that particular gesture.

          -

          The elm_gesture_layer_cb_set() function is used for registering state change callback for a particular gesture.

          -

          For more information about the gestures, see the gesture documentation.

          - -

          To detect touch gestures:

          -
            -
          • The following example adds callbacks for listening to the tap gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            -   ELM_GESTURE_STATE_START, n_finger_tap_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            -   ELM_GESTURE_STATE_END, n_finger_tap_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            -   ELM_GESTURE_STATE_ABORT, n_finger_tap_abort, ad);
            -
          • -
          • The following example adds callbacks for listening to the double tap gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            -   ELM_GESTURE_STATE_START, dbl_click_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            -   ELM_GESTURE_STATE_MOVE, dbl_click_move, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            -   ELM_GESTURE_STATE_END, dbl_click_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            -   ELM_GESTURE_STATE_ABORT, dbl_click_abort, ad);
            -
          • - -
          • The following example adds callbacks for listening to the triple tap gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            -   ELM_GESTURE_STATE_START, triple_click_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            -   ELM_GESTURE_STATE_MOVE, triple_click_move, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            -   ELM_GESTURE_STATE_END, triple_click_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            -   ELM_GESTURE_STATE_ABORT, triple_click_abort, ad);
            -
          • -
          • The following example adds callbacks for listening to the long tap gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_START, momentum_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_END, momentum_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_ABORT, momentum_abort, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_MOVE, momentum_move, ad);
            -
          • - -
          • The following example adds callbacks for listening to the momentum gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_START, momentum_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_END, momentum_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_ABORT, momentum_abort, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            -   ELM_GESTURE_STATE_MOVE, momentum_move, ad);
            -
          • - -
          • The following example adds callbacks for listening to the line gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            -   ELM_GESTURE_STATE_START, line_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            -   ELM_GESTURE_STATE_MOVE, line_move, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            -   ELM_GESTURE_STATE_END, line_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            -   ELM_GESTURE_STATE_ABORT, line_abort, ad);
            -
          • - -
          • The following examples add callbacks for listening to the flick gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            -   ELM_GESTURE_STATE_START, flick_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            -   ELM_GESTURE_STATE_END, flick_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            -   ELM_GESTURE_STATE_ABORT, flick_abort, ad);
            -
          • - -
          • The following examples add callbacks for listening to the zoom gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            -   ELM_GESTURE_STATE_START, zoom_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            -   ELM_GESTURE_STATE_END, zoom_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            -   ELM_GESTURE_STATE_ABORT, zoom_abort, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            -   ELM_GESTURE_STATE_MOVE, zoom_move, ad);
            -
          • - -
          • The following example adds callbacks for listening to the rotate gesture:

            -
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            -   ELM_GESTURE_STATE_START, rotate_start, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            -   ELM_GESTURE_STATE_END, rotate_end, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            -   ELM_GESTURE_STATE_ABORT, rotate_abort, ad);
            -elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            -   ELM_GESTURE_STATE_MOVE, rotate_move, ad);
            -
          • - -
          • The following example adds a callback for getting the tap gesture finishing notification:

            -
            -static Evas_Event_Flags
            -n_finger_tap_end(void *data, void *event_info)
            -{
            -   appdata_s *ad = data;
            -   Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
            -   return EVAS_EVENT_FLAG_ON_HOLD;
            -}
            -
          • -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/ui_components_mn.htm b/org.tizen.ui.guides/html/native/efl/ui_components_mn.htm deleted file mode 100755 index 4137e3d..0000000 --- a/org.tizen.ui.guides/html/native/efl/ui_components_mn.htm +++ /dev/null @@ -1,1092 +0,0 @@ - - - - - - - - - - - - - Mobile UI Components - - - -
          -
          -

          Mobile native

          -
          - - -
          - -
          - -

          Mobile UI Components

          - -

          The EFL Elementary is a set of fast, finger-friendly, scalable, and themeable UI component libraries. The number of supported UI components is around 80, including both containers and non-containers. Originally, the Elementary was developed as part of the Window Manager development on Desktop devices. For the mobile profile, Tizen reused the proper UI components and created new ones, and then enhanced and adjusted all of them for Tizen native applications.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          The UI components are mobile-friendly: for example, the Naviframe component supports view-managing for multiple views, the Entry component supports many modes (such as Password, Single/Multi-line, Edit/No-Edit), the Index component supports fast access to another group of UI items, and the Toolbar component shows a menu when an item is selected.

          -

          The mobile UI components were designed to allow the user to interact with touch screen-equipped mobile devices. Therefore, when developing mobile applications, you can easily use them through the mobile-related infrastructure in company with view managing and when reacting to touch events and the user finger size.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Available UI components -
          Component nameDescription
          BackgroundThe background component can be used to set a solid background decoration to a window or a container object. It works like an image, but has some background specific properties, such as setting it to tiled, centered, scaled, or stretched.
          ButtonThe button component is a simple push button. It is composed of a label icon and an icon object, and has an auto-repeat feature.
          CheckThe check component toggles the value of a Boolean between true and false.
          ColorselectorThe colorselector component provides a color selection solution to the user. It has different modes available, each of them showing a different configuration of the color selection.
          CtxpopupThe ctxpopup component is a contextual popup that can show a list of items.
          DatetimeThe datetime component can display and input date and time values.
          EntryThe entry component is a box to which the user can enter text.
          FlipThe flip component can hold two Evas objects and let the user flip between these objects using a variety of predefined animations.
          GengridThe gengrid component displays objects on a grid layout and renders only the visible objects.
          GenlistThe genlist component displays a scrollable list of items. It can hold a lot of items while still being fast and memory-efficient (only the visible items are allocated memory).
          GLViewThe GLView component can render OpenGL in an Elementary object, hiding EvasGL complexity.
          IconThe icon component inherits from the image component. It is used to display images in an icon context.
          ImageThe image component can load and display an image from a file or from memory.
          IndexThe index component provides an index for fast access to another group of UI items.
          LabelThe label component displays text with simple HTML-like markup.
          ListThe list component is a very simple list for managing a small number of items. If you need to manage a lot of items, use the genlist component instead.
          MapThe map component can display a geographic map. The default map data is provided by the OpenStreetMap project (http://www.openstreetmap.org/).
          NotifyThe notify component displays a container in a specific region of the parent object. It can receive some content, and it can be automatically hidden after a certain amount of time.
          PanelThe panel component is an animated object that can contain child objects. It can be expanded or contracted by clicking on the button on its edge.
          PhotoThe photo component can be used to display a photo, such as a contact image. If no photo is set, the UI component displays a person icon to show that it is a photo placeholder.
          PhotocamThe photocam component is designed to display high-resolution photos taken with a digital camera. It allows you to zoom photos, load photos fast, and fit photos. It is optimized for JPEG images and has a low memory footprint.
          PlugThe plug component allows you to show an Evas object created by another process. It can be used anywhere like any other Elementary UI component.
          PopupThe popup component shows a pop-up area that can contain a title area, a content area, and an action area.
          ProgressbarThe progressbar component can be used to display the progress status of a given job.
          RadioThe radio component can display 1 or more options, but the user can only select one of them. The UI component is composed of an indicator (selected/unselected), an optional icon, and an optional label. Even though it is usually grouped with 2 or more other radio components, it can also be used alone.
          SegmentcontrolThe segmentcontrol component is a horizontal control made of multiple segment items, each segment item functioning similar to discrete two state button.
          SliderThe slider component is a draggable bar that is used to select a value from a range of values.
          SpinnerThe spinner component enables the user to increase or decrease a numeric value by using arrow buttons.
          ToolbarThe toolbar component is a scrollable list of items. It can also show a menu when an item is selected. Only one item can be selected at a time.
          TooltipThe tooltip component is a smart object used to show tips or information about a parent object when the mouse hovers over the parent object.
          TransitThe transit component can apply several transition effects to an Evas object, such as translations and rotations.
          WinThe win component is the root window component that will be often used in an application. It allows you to create some content in it, and it is handled by the window manager.
          - -

          Mobile UI Component Styles

          - -

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          - -

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component. For more detailed information, see the Themes.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Button styles
          StyleSampleText partSwallow partNotes
          elm/button/base/default elm.textelm.swallow.content
          elm/button/base/anchorelm.textelm.swallow.content
          elm/button/base/bottomelm.textelm.swallow.contentThis style is used widely at the bottom of the screen.
          elm/button/base/circleelm.textelm.swallow.content
          elm/button/base/dropdownelm.text
          elm/button/base/hoversel_horizontal/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_horizontal_entry/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_vertical/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_vertical_entry/defaultelm.textelm.swallow.content
          elm/button/base/icon_reorder
          elm/button/base/naviframe/drawers
          elm/button/base/naviframe/title_cancel
          elm/button/base/naviframe/title_done
          elm/button/base/option
          - - - --- - - - - - - - - - - - - - - - - - -
          Table: Check styles
          StyleSample
          elm/check/base/default
          elm/check/base/favorite
          elm/check/base/on&off
          - - - - - - - - - - - - - - - -
          Table: Colorselector styles
          StyleSampleNotes
          elm/colorselector/item/color/colorplaneUse the following command: elm_colorselector_mode_set(colorselector, ELM_COLORSELECTOR_PALETTE);
          - - - - - - - - - - - - - - - - - -
          Table: Progressbar styles
          StyleSample
          default
          wheel
          - - - --- - - - - - - - - - -
          Table: Radio styles
          StyleSample
          default
          - - - - - - - - - - - - - - - - - -
          Table: List styles
          StyleSampleText partSwallow part
          defaultelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          - - - - - - - - - - - - - - - - - -
          Table: Multi Button Entry styles
          StyleSampleText partNotes
          elm/multibuttonentry/base/defaultelm.text, guideThe guide text part is used when there is no item in the Multi Button Entry. It is removed automatically when an item is appended in the Multi Button Entry.
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Toolbar styles
          StyleSampleText partSwallow partNotes
          elm/toolbar/base/default
          elm/toolbar/base/navigationbar
          elm/toolbar/base/tabbar_with_title
          elm/toolbar/item/defaultelm.textelm.swallow.iconThis style is for the toolbar's item. Check the elm_toolbar_item_append() function to set the text and the icon.
          elm/toolbar/item/navigationbarelm.textThis style is for the toolbar's item. Check the elm_toolbar_item_append() function to set the text and the icon.
          - - - --- - - - - - - - - - -
          Table: Flipselector styles
          StyleSample
          default
          - -

          The style of the genlist's item is not set by external APIs. Check the guide of Genlist to check how to use the item class to set the item's style.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          default_styleelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          double_labelelm.text: for the main text. -

          elm.text.sub: for the sub text.

          elm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          end_iconelm.textelm.swallow.icon
          fullelm.swallow.contentThe swallow part is the full size of the item. There is no padding in the item.
          group_indexelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          one_iconelm.textelm.swallow.icon
          messageelm.text: for the text on the top. -

          elm.title.1: for the text in the middle.

          -

          elm.title.2: for the text on the bottom.

          - -

          The style of the gengrid's item is not set by external APIs. For more information on using the item class to set the item's style, see the guide of gengrid.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Gengrid styles
          StyleSampleText partSwallow partNotes
          defaultelm.swallow.icon
          album-previewelm.textelm.swallow.icon
          blockThis style is used to show an empty area.
          group_indexelm.textelm.swallow.icon
          default_gridelm.swallow.icon
          default_gridtext2elm.textelm.swallow.icon
          default_gridtextelm.textelm.swallow.icon
          default_styleelm.textelm.swallow.icon
          - - - - - - - - - - - - - -
          Table: Segmentation Control styles
          StyleSample
          default
          - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Index styles
          StyleSampleNotes
          defaultThis style is for supporting the vertical style.
          defaultThis style is for supporting the horizontal style. To set a horizontal index, use the elm_index_horizontal_set.
          pagecontrolThis style is used for the "page control" layout. For more information, refer to the Core Control sample application.
          - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Contextual Popup (Ctxpopup) styles
          StyleSampleNotes
          default
          dropdown/listThe size of the item and the ctxpopup follow the size of the screen.
          dropdown/labelThe size of the item and the ctxpopup follow the maximum length of the item.
          - - - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Icon styles
          StyleSample
          apps
          arrow_down
          arrow_left
          arrow_right
          arrow_up
          chat
          clock
          close
          delete
          edit
          file
          home
          media_player/forward
          media_player/info
          media_player/next
          media_player/pause
          media_player/play
          media_player/prev
          media_player/rewind
          media_player/stop
          menu/apps
          menu/arrow_down
          menu/arrow_left
          menu/arrow_right
          menu/arrow_up
          menu/chat
          menu/clock
          menu/close
          menu/delete
          menu/edit
          menu/file
          menu/folder
          menu/home
          menu/refresh
          no_photo
          photo/no_photo
          refresh
          toolbar/apps
          toolbar/arrow_down
          toolbar/arrow_left
          toolbar/arrow_right
          toolbar/arrow_up
          toolbar/chat
          toolbar/clock
          toolbar/close
          toolbar/delete
          toolbar/edit
          toolbar/file
          toolbar/folder
          toolbar/home
          toolbar/more_menu
          toolbar/refresh
          - - - - - - - - - - - - - - - - - - - -
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. -

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          - - - --- - - - - - - - - - - - - - - - - - -
          Table: Datetime styles
          StyleSample
          date_layout
          time_layout
          time_layout_24hr
          - - - - - - - - - - - - - - - - - -
          Table: Panel (drawer) styles
          StyleSampleSwallow partNotes
          defaultelm.swallow.contentFor more information on the drawer, see the [UI Sample] Core Control guide.
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          horizontal/center_pointelm.swallow.icon
          vertical/center_point
          vertical/default
          - - - --- - - - - - - - - - - - - - -
          Table: Popup styles
          StyleSample
          default
          toast
          - - - --- - - - - - - - - - - - - - -
          Table: Spinner styles
          StyleSample
          horizontal
          vertical
          - -

          For more details about customizing the look and feel of the UI components with custom styles which are not provided as defaults, see the ThemeExtension sample.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/ui_components_n.htm b/org.tizen.ui.guides/html/native/efl/ui_components_n.htm deleted file mode 100755 index c1a5317..0000000 --- a/org.tizen.ui.guides/html/native/efl/ui_components_n.htm +++ /dev/null @@ -1,694 +0,0 @@ - - - - - - - - - - - - - UI Components: Handling Elementary UI Component Libraries - - - - - -
          - -

          UI Components: Handling Elementary UI Component Libraries

          - -

          Before writing an application, you should already have an answer to the following question: What is an application? An application is a process launched by the user. Every application has at least one window for presenting its content. Users can interact with the content through events. Different sources of events can modify the life cycle of the application. The application may receive data from a network connection, and it may also receive touch and key events. From the computer's point of view, an application is a collection of code that reacts to events and displays content on the screen. Elementary bridges this divide between the user and the code.

          - -

          Elementary provides a variety of pre-built UI components, such as layout objects and components, that allow you to build rich graphical user interfaces for your applications. Every Elementary application has at least one window for presenting its content. The window provides the area in which to display the content and where the Evas canvas is placed.

          - -

          There are three main groups of objects provided by Elementary:

          - -
            -
          • UI components: These are the components with which you build your application UI.
          • -
          • Containers: These are the containers that hold the components.
          • -
          • Infrastructure: These are the modules that deal with Elementary as a whole.
          • -
          - -

          Using UI Components

          - -

          The Elementary library is a simple toolkit. It provides several UI components than can be used to compose the user interface of your application. UI components allow you to build your application without having to reinvent basic objects, such as buttons, lists, or text entries. UI components will often generate signals that can be caught in the application when the user interacts with the UI components. This guide teaches you the basics of Elementary, describes selected concepts of the Elementary configuration framework, and describes the most common UI components.

          - -

          Figure: Elementary

          -

          Elementary

          - - -

          Getting Started with the Elementary Library

          - - -

          Elementary UI components are built in a hierarchical fashion. The idea is to factorize as much code as possible between UI components that behave in a similar manner to facilitate the creation of new UI components. The Elementary UI components inherit a lot of their code from the container UI components and the layout component (a container component that takes a standard Edje design file and wraps it very thinly). You can use the container and layout functions on the Elementary UI components, as well as the Elementary object functions, such as elm_object_part_content_set(), elm_object_part_content_get(), and elm_object_part_content_unset().

          - -

          To use the Elementary library:

          - -
          1. Initialize the Elementary library with the elm_init() function.
          2. -
          3. Start the Elementary main loop with the elm_run() function. -

            The function does not return, instead, it constantly loops and runs the event and the processing tasks.

          4. -
          5. Add Elementary UI components in the main loop. -

            Generally, an Elementary UI component can be added with the elm_<UI component name>_add() function, which returns an Evas object (Evas_Object*). The Evas object is passed to the functions that are used to configure the UI component.

          6. -
          7. Stop the main loop and return to the main() function with the elm_exit() function.
          8. -
          9. When your application terminates, shut down the Elementary library with the elm_shutdown() function. -

            The function frees the Elementary objects that were allocated in the main loop, so you do not need to separately deallocate them.

          - - -

          The following code snippet shows the main() function of a minimal Elementary application:

          - -
          -#include <Elementary.h>
          -int main(int argc, char **argv)
          -{
          -   elm_init(argc, argv);
          -   elm_run();
          -   elm_shutdown();
          -
          -   return 0;
          -}
          - - -

          Elementary Objects

          - -

          All objects created using Elementary are of the Evas_Object* type. This means that both Evas and Elementary functions can be used on an Elementary object. However, use Elementary functions on Elementary objects only when you do not know which API to use.

          - -

          Since an Elementary object can take up a lot of memory, the Elm_Object_Item type has been created for situations where you need to use a lot of items, such as in a genlist or gengrid component, and to save memory. Using the Elm_Object_Item type, an Elementary UI component can, in theory, contain a lot of items while maintaining a small memory footprint. In practice, the Elm_Object_Item instance is bigger than expected, but can still help in saving memory.

          - -

          For more information, see Evas Objects.

          - -

          Elementary Callbacks

          - -

          Several callbacks can be registered to handle Elementary object events:

          - -
            -
          • Evas event callback -

            Use the evas_object_event_callback_add() function to add a callback for input events (key up, key down, mouse wheel) on an Evas object. In case of an Elementary object, the callback is registered on the underlying Evas object without considering the Elementary object infrastructure (no event propagation).

            -
          • - -
          • Evas smart callback -

            Use the evas_object_smart_callback_add() function to add a callback for a smart event emitted by an Elementary object. Smart callbacks can only be registered on smart objects, and the "smart event" to register must be implemented by the corresponding smart object. Otherwise, the callback does nothing. The callback does not apply to input events (keyboard or mouse).

            -
          • - -
          • Edje signal callback -

            Use the edje_object_signal_callback_add() function to add a callback for a signal coming from an Edje object (a theme object).

            -
          • - -
          • Elementary signal callback -

            Use the elm_object_signal_callback_add() function to add a callback for a signal coming from an Elementary UI component's theme. The callback does not apply to input events (keyboard or mouse).

            -
          • - -
          • Elementary event callback -

            Use the elm_object_event_callback_add() function to add a callback for an input event (keyboard or mouse) coming from an Elementary object. In contrast to the Evas event callback, the Elementary event callback takes the hierarchy of the object into account: the event can be propagated to the parents of the object, and the parents can process the event.

            -
          • -
          - -

          For more information about events related to Elementary objects, see Event Handling. For more information about Evas objects and smart objects, see Evas Rendering Concept and Method.

          - -

          Managing Elementary Profiles

          - -

          An Elementary profile is a set of preconfigured options that affects the entire look and feel of an application. The options linked to a specific profile form an Elementary configuration, which can be used to store the desired set of options for use in multiple sessions. Once loaded, the Elementary profile configures all the options and sets the look and feel of your Elementary application.

          - -

          To manage Elementary profiles:

          -
            -
          • List the existing profiles: -
            -Eina_List *list = elm_config_profile_list_get();
            -
            -
          • -
          • Set a particular profile: -
            -elm_config_profile_set("myprofile");
            -
            -
          • -
          • Get the current profile: -
            -char *profile = elm_config_profile_get();
            -
            -
          • -
          • To save the current option values as an Elementary configuration for later use, use the Elementary Configuration Save function: -
          • -
          • To reload the Elementary configuration saved for the current profile: -
            -elm_config_reload();
            -
            -
          • -
          - -

          Configuring Elementary Options

          - -

          You can set the following options in the Elementary configuration. In addition, you can customize themes and manage focus.

          -
            - -
          • To scale UI components: -

            You can configure UI component scaling in terms of both interactive and readable areas.

            -
              -
            • Set the global scaling factor (for example, setting it to 2.0 doubles the size of all scalable UI components): -
              -elm_config_scale_set(2.0);
              -
              -
            • - -
            • Set the finger size: -
              -elm_config_finger_size_set(1.5);
              -
              -
            • -
            -
          • - -
          • To manage caches: -
              -
            • Enable the globally configured cache flush, and set the flush interval (in this example, to 60 seconds): -
              -elm_config_cache_flush_enabled_set(EINA_TRUE);
              -elm_config_cache_flush_interval_set(60);
              -
              -
            • - -
            • Configure the font and image cache sizes (to 500 and 5 000 000 bytes, respectively): -
              -elm_config_cache_font_cache_size_set(500);
              -elm_config_cache_image_cache_size_set(5000000);
              -
              -
            • - -
            • Set the Edje collection and Edje file cache sizes: -
              -elm_config_cache_edje_file_cache_size_set(500);
              -elm_config_cache_edje_collection_cache_size_set(500);
              -
              -
            • -
            -
          • - - -
          • To configure the gesture layer: -

            You can set the duration of the long tap and double tap events on the gesture layer objects. The following example sets the duration to 500 ms.

            - -
            -elm_config_glayer_long_tap_start_timeout_set(0.5);
            -elm_config_glayer_double_tap_timeout_set(0.5);
            -
            -
          • -
          • To manage scrolling: -
              -
            • Make the scroller bounce when it reaches its viewport's edge during scrolling by using the elm_config_scroll_bounce_enabled_set() function: -
              -elm_config_scroll_bounce_enabled_set(EINA_TRUE);
              -
              -
            • - -
            • Control the inertia of the bounce animation by using the elm_config_scroll_bounce_friction_set() function: -
              -elm_config_scroll_bounce_friction_set(0.5);
              -
              -

              You can also set the friction for a page scroll, include animations, and zoom animations.

              -
            • - -
            • Set the scroller to be draggable by using the elm_config_scroll_thumbscroll_enabled_set() function. You can configure several drag options, such as friction, sensitivity, acceleration, and momentum. - -

              The following example sets the scroller to be draggable, defines that the number of pixels one must travel while dragging the scroller view to actually trigger scrolling is 20 pixels.

              -
              -elm_config_scroll_thumbscroll_enabled_set(EINA_TRUE);
              -elm_config_scroll_thumbscroll_threshold_set(20);
              -
              -
            • -
            -
          • - -
          • To configure long press events: -

            Get the current timeout before a long press event is retrieved, and modify it. The following example increases the timeout by 1 second.

            -
            -double lp_timeout = elm_config_longpress_timeout_get();
            -elm_config_longpress_timeout_set(lp_timeout + 1.0);
            -
            -
          • - -
          • To configure tooltips: -

            Set the duration after which a tooltip is shown. The following example sets the delay to 2 seconds.

            - -
            -elm_config_tooltip_delay_set(2.0);
            -
            -
          • - -
          • To configure the password show last feature: -

            The password show last feature enables the user to view the last input entered for a few seconds before it is masked.

            - -
              -
            • Enable the password show last feature: -
              -elm_config_password_show_last_set(EINA_TRUE);
              -
              -
            • -
            • Set the visibility timeout (how many seconds the input is visible): -
              -elm_config_password_show_last_timeout_set(5.0);
              -
              -
            • -
            -
          • -
          • To set the Elementary engine: -

            You can define the rendering engine that Elementary uses to draw the windows. The following rendering engines are supported:

            - -
              -
            • "software_x11"
            • -
            • "fb"
            • -
            • "directfb"
            • -
            • "software_16_x11"
            • -
            • "software_8_x11"
            • -
            • "xrender_x11"
            • -
            • "opengl_x11"
            • -
            • "software_gdi"
            • -
            • "software_16_wince_gdi"
            • -
            • "sdl"
            • -
            • "software_16_sdl"
            • -
            • "opengl_sdl"
            • -
            • "buffer"
            • -
            • "ews"
            • -
            • "opengl_cocoa"
            • -
            • "psl1ght"
            • -
            - -
            -elm_config_engine_set("opengl_x11");
            -
            -
          • - -
          • To activate the access mode: -

            Set the access mode as active, so that information about an Elementary object is read when the object receives an EVAS_CALLBACK_MOUSE_IN event:

            - -
          • - -
          • To configure the selection mode: -

            Set the selection mode so that the selection is cleared when the entry component is unfocused:

            -
            -elm_config_selection_unfocused_clear_set(EINA_TRUE);
            -
            -
          • - -
          • To enable mirroring: -

            Elementary allows UI mirroring both on a single object and on the entire UI. If mirroring is enabled, an Elementary UI component displays as if there was a vertical mirror in the middle of it. Only the controls and the disposition of the UI component are mirrored. Text is not mirrored.

            - -
            -elm_config_mirrored_set(EINA_TRUE);
            -
            -
          • - -
          • To set the frame rate: -

            Define the frames per second (FPS) value for the ecore_animator_frametime and edje_frametime calculations. This example sets the FPS 60.

            - -
            -elm_config_fps_set(60.0);
            -
            -
          • -
          - -

          Customizing Themes

          - -

          Elementary uses Edje to theme its UI components. Edje provides a default theme for each UI component in an application. You can change the theme using the ELM_THEME environment variable. You can also modify the theme globally with the elementary_config utility.

          - -

          For custom styles, use extensions. Extensions allow you to write styles for specific UI components. Add a new extension to the list of Elementary themes with the elm_theme_extension_add() function, and apply the new style to the UI component with the elm_object_style_set() function. Once set, the extension replaces the default theme of the UI component.

          - - - - - - - - - - -
          Note
          When developing an extension, to respect the signals emitted and the elements that need to be in place, you must know how the UI component is themed. If something is missing from the extension, it can break the UI component's behavior.
          - -

          To modify Elementary themes, you can also use overlays. An overlay can replace the look of all UI components by overriding the default styles. As with extensions, you must write the correct overlay theme for a UI component. When looking for a theme to apply, Elementary first checks the list of overlays, then the set theme, and finally the list of extensions. To add or remove an overlay, use the elm_theme_overlay_add() and elm_theme_overlay_del() functions.

          - - - - - - - - - - -
          Note
          With overlays, you can replace the default view and affect every UI component. This is very similar to setting the theme for the whole application, and probably clashes with end user options. Using overlays also runs the risk of non-matching styles across the application. Unless you have a very good reason to use them, avoid overlays.
          - -

          Managing Focus

          - -

          When an Elementary object has the focus, input events are directly passed to that object in the application window. The focused object can also change its decoration to show the user where the focus is. In an Elementary application, only one object can have the focus at a time.

          - -

          To set the focus to a new Elementary object and take the focus away from the previous focused object, use the elm_object_focus_set() function. You can make an object unfocusable with the elm_object_focus_allow_set() function.

          - - - - - - - - - - -
          Note
          Only visible objects can have the focus.
          - -

          Elementary supports focus chains that allow you to cycle through all the focusable objects in a window. By default, the focus chain is defined by the order in which the UI components are added to the code. It is also possible to define custom focus chains, when needed.

          - -

          For more information on focus, see Component Focus.

          - -

          To manage the focus:

          - -
            -
          • To define a custom focus chain, create an Eina_List, and add the Elementary objects to it in the desired focus order. Use the elm_object_focus_custom_chain_set() function to set the final list as the custom focus chain of the parent object (in the following example, container_object is the parent object). - -
            Eina_List *obj_list = NULL;
            -
            -list = eina_list_append(list, obj1); 
            -list = eina_list_append(list, obj4);
            -list = eina_list_append(list, obj2); 
            -list = eina_list_append(list, obj3);
            -
            -elm_object_focus_custom_chain_set(container_object, list);
            -
          • - -
          • To remove the custom focus chain and use the default focus chain instead, use the elm_object_focus_custom_chain_unset() function. -
          • - -
          • To programmatically cycle through the focus chain, use the elm_object_focus_next() function. -
          • - -
          • To show a highlight on the focused object: - -
            -elm_config_focus_highlight_enabled_set(EINA_TRUE);
            -
            -
          • - -
          • To activate an animation when the focus shifts from one object to another: - -
            -elm_config_focus_highlight_animate_set(EINA_TRUE);
            -
            -
          • -
          - -

          Scaling UI Components

          - -

          Elementary, through its configuration API (elm_config), provides a way to scale UI components with two different parameters. Finger size parameter is used when the interactive zones (clickable, editable) of the UI components need to be scaled in order to be comfortably used with a finger. Scale parameter is responsible for scaling readable parts of a UI component (text or icons for example), so that it is more visible in the user interface.

          - -

          Finger Size

          - -

          Finger size parameter scales UI components based on the user's finger size. This is useful when using a touchscreen with a finger rather than with a stylus. The finger size parameter is in pixels and determines the minimum size of a square on the screen that is reliably hittable with a finger. This parameter scales the input and interactive areas.

          - -

          The global finger size is set with the elm_config_finger_size_set() function. This adjusts the size and hit area of UI components so they are easy to hit with a finger. The current value is retrieved with the elm_config_finger_size_get() call. The finger size is always in pixel.

          - -

          To increase the current global finger size by 20px:

          - -
          -Evas_Coord finger_size;
          -
          -// Get the current finger size
          -finger_size = elm_config_finger_size_get();
          -
          -// Add 20px to finger size parameter and set it 
          -// to the global Elementary configuration
          -elm_config_finger_size_set(finger_size + 20);
          -
          - -

          Scale

          - -

          This parameter only scales the readable areas of the UI component (text, icons). Parts that must stay pixel-perfect like the highlights, shading, textures and decorations stay as they are.

          - -

          elm_config_scale_set() function is used to set the global scaling factor, that affects to all the UI components. It is also possible to use elm_object_scale_set() to set the scaling factor on a given Elementary UI component and all its children.

          - - - - - - - - - - -
          Note
          The scaling factor is multiplicative, if a child already has a scale size set, it is multiplied by its parent's scale size.
          - -

          The following example sets the global scaling factor to 2.0. Then, the scaling factor of an existing Elementary object is set to 2.0, meaning that this object appears as if it had a 4.0 scale factor, the rest of the application is displayed with a 2.0 scaling factor:

          - -
          -Evas_Object *button;
          -
          -// The button object is created and configured
          -
          -// Set the global scale factor to 2.0
          -elm_config_scale_set(2.0);
          -
          -// Set the scaling factor of the button component to 2.0, this component
          -// appears 4 times bigger than its initial size
          -elm_object_scale_set(button, 2.0);
          -
          - -

          Example

          - -

          This chapter shows the visual result of finger size and scaling factors modification.

          - -

          Figure: elementary_config application

          -

          elementary_config application

          - -

          The previous picture shows the elementary_config application that enables the user to set global scale factor and finger size parameter. As the user drags the sliders, the UI is updated, directly showing the result of the new parameter value.

          - -

          The next picture shows the behavior when the finger size parameter has been increased to 1.30. The text of the sliders and the text of the items in the toolbar are bigger.

          - -

          Figure: Scale increased (1.30)

          -

          Scale increased (1.30)

          - -

          A finger size increase is showed in the image below (increase from 50px to 90 px). Now, the buttons in the toolbar are bigger, so the user can more reliably hit them with a big finger.

          - -

          Figure: Finger size increased (90px)

          -

          Finger size increased (90px)

          - - - - - - - - - - -
          Note
          It is up to the theme (Edje file) to set the parts that are scalable. This is something that needs to be taken into account when developing a new Edje theme. This can be done in EDC with the scale parameter. For more information on how to do that, see Introduction to EDC Programming.
          - -

          Creating Scalable EDC Objects

          - -

          Scale Parameter

          - -

          This chapter explains how to make a scalable Edje object and give hints how to write an EDC file that is scalable. The example shows a basic button that is composed of a background image part and a swallow part that can receive some content.

          - -
          -group 
          -{ 
          -   name: "button";
          -   images 
          -   {
          -      image: "bg.png" COMP;
          -   }
          -   parts 
          -   {
          -      part 
          -      { 
          -         name: "bg";
          -         type: IMAGE;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            image.normal: "bg.png";
          -         }
          -      }
          -      part 
          -      { 
          -         name: "elm.swallow.content";
          -         type: SWALLOW;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            visible: 0;
          -         }
          -         description 
          -         { 
          -            state: "visible" 0.0;
          -            visible:1;
          -         }
          -      }
          -   }
          -}
          -
          - -

          To have a scalable object, set the scale parameter to 1 on the parts you want to be scalable. Here the bg and elm.swallow.content parts must be scalable.

          - -
          -group 
          -{ 
          -   name: "button";
          -   images 
          -   {
          -      image: "bg.png" COMP;
          -   }
          -   parts
          -   {
          -      part 
          -      { 
          -         name: "bg";
          -         type: IMAGE;
          -         scale: 1;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            image.normal: "bg.png";
          -         }
          -      }
          -      part 
          -      { 
          -         name: "elm.swallow.content";
          -         type: SWALLOW;
          -         scale: 1;
          -         description 
          -         { 
          -            state: "default" 0.0;
          -            visible: 0;
          -         }
          -         description 
          -         { 
          -            state: "visible" 0.0;
          -            visible:1;
          -         }
          -      }
          -   }
          -}
          -
          - -

          Image Set

          - -

          If your application needs to be used at different resolutions it is recommended to have 2 images for the background image bg.png. Here the bg_low.png is added to the application. It is used when the size of the image is under 500 px, and a bg_high.png image is for higher resolutions. Use a set on the bg.png image.

          - -
          -group 
          -{ 
          -   name: "button";
          -   images 
          -   {
          -      set 
          -      {
          -         name: "bg.png";
          -         image
          -         {
          -            image: "bg_low.png" COMP;
          -            size: 0 0 200 100;
          -         }
          -         image
          -         {
          -            image: "bg_high.png" COMP;
          -            size: 201 101 5000 5000;
          -         }
          -      }
          -   }
          -}
          -
          - -

          The image below shows three buttons with only a background part visible (the SWALLOW part is empty).

          - -

          Figure: Image set example

          -

          Image set example

          - -

          The first button's size is 100x50 pixels, the background image (bg_low.png) is the same size. The second button is twice bigger than the first one (200x100 pixels). The image is scaled and it does not render well, the borders are quite blurry.

          - -

          To prevent this, the image set has a bigger image to use when the size is bigger than 200x100 pixels (bg_high.png). The third button size is 201x101 pixels and it uses the new image, which has a better quality than the scaled image.

          - -

          Image Borders

          - -

          When the button is resized, the image part is also resized because it is marked as scalable. To get the image resized but to keep the image border as it is, use the border parameter. It specifies the border size which is not resized even if the image is.

          - -

          To add a 40 pixel border on the left and right part of the bg image and a 20 pixel border on top and bottom borders:

          - -
          -parts 
          -{
          -   part 
          -   { 
          -      name: "bg";
          -      type: IMAGE;
          -      scale: 1;
          -      description 
          -      { 
          -         state: "default" 0.0;
          -         image.normal: "bg.png";
          -         image.border: 40 40 20 20;
          -      }
          -   }
          -}
          -
          - -

          The image below shows that when resizing the button, the corners keep their initial ratio. Only the middle part of the button is resized.

          - -

          Figure: Border example

          -

          Border example

          - - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/native/efl/ui_components_wn.htm b/org.tizen.ui.guides/html/native/efl/ui_components_wn.htm deleted file mode 100755 index 36d62e9..0000000 --- a/org.tizen.ui.guides/html/native/efl/ui_components_wn.htm +++ /dev/null @@ -1,876 +0,0 @@ - - - - - - - - - - - - - Wearable UI Components - - - - - -
          - -

          Wearable UI Components

          - -

          The EFL Elementary is a set of fast, finger-friendly, scalable, and themeable UI component libraries. The number of supported UI components is around 80, including both containers and non-containers. Originally, the Elementary was developed as part of the Window Manager development on Desktop devices. For the wearable profile, Tizen reused the proper UI components and created new UI styles for rectangular and circular wearable devices, and then enhanced and adjusted all of them for Tizen native applications.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The UI components are wearable-friendly: for example, the Circle Datetime component extends the elm_date_time by visualizing the selected field, the Circle Genlist component provides a scrollbar with circular movement, and the Circle progress bar/scroller/slider components are adjusted to the circular design.

          -

          The wearable UI components were designed to allow the user to interact with small touch screen-equipped wearable devices with rotary component parts. Therefore, when developing wearable applications, you can easily use them through the wearable-related infrastructure in company with full notification and when reacting to touch and rotary events and the user finger size.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Available UI components -
          Component nameDescription
          BackgroundThe background component can be used to set a solid background decoration to a window or a container object. It works like an image, but has some background specific properties, such as setting it to tiled, centered, scaled, or stretched.
          ButtonThe button component is a simple push button. It is composed of a label icon and an icon object, and has an auto-repeat feature.
          CheckThe check component toggles the value of a Boolean between true and false.
          CtxpopupThe ctxpopup component is a contextual popup that can show a list of items.
          DatetimeThe datetime component can display and input date and time values.
          EntryThe entry component is a box to which the user can enter text.
          GenlistThe genlist component displays a scrollable list of items. It can hold a lot of items while still being fast and memory-efficient (only the visible items are allocated memory).
          GLViewThe GLView component can render OpenGL in an Elementary object, hiding EvasGL complexity.
          IconThe icon component inherits from the image component. It is used to display images in an icon context.
          ImageThe image component can load and display an image from a file or from memory.
          IndexThe index component provides an index for fast access to another group of UI items.
          LabelThe label component displays text with simple HTML-like markup.
          ListThe list component is a very simple list for managing a small number of items. If you need to manage a lot of items, use the genlist component instead.
          NotifyThe notify component displays a container in a specific region of the parent object. It can receive some content, and it can be automatically hidden after a certain amount of time.
          PlugThe plug component allows you to show an Evas object created by another process. It can be used anywhere like any other Elementary UI component.
          PopupThe popup component shows a pop-up area that can contain a title area, a content area, and an action area.
          ProgressbarThe progressbar component can be used to display the progress status of a given job.
          RadioThe radio component can display 1 or more options, but the user can only select one of them. The UI component is composed of an indicator (selected/unselected), an optional icon, and an optional label. Even though it is usually grouped with 2 or more other radio components, it can also be used alone.
          SliderThe slider component is a draggable bar that is used to select a value from a range of values.
          TransitThe transit component can apply several transition effects to an Evas object, such as translations and rotations. The use of the transit component is documented in the Creating Animations and Effects guide.
          WinThe win component is the root window component that will be often used in an application. It allows you to create some content in it, and it is handled by the window manager.
          - -

          The following UI components were designed for specific circular wearable devices which have rotary component parts. In a circular device, you can draw round UI components, such as a slider, progressbar, and scroller. Generally, wearable UI components provide compatibility between the rectangular and circular wearable devices. However, use circular UI components for circular wearable devices only, because they have a dependency with the round UX and rotary events. For more information on the compatibility of the UI components between rectangular and circular, see the Wearable Design Guidelines.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Available circular UI components -
          Component nameDescription
          Circle DatetimeThe circle datetime extends elm_datetime by visualizing the selected field.
          Circle GenlistThe circle genlist provides a scrollbar with circular movement. It is also operated with rotary events to move to the next or previous item.
          Circle ObjectThe circle object extends elementary components in a form of circular design. Sometimes a circle object merely provides additional UI features to elementary component, and sometimes it works as an independent component with UI and functionalities.
          Circle ProgressbarThe circle progressbar aims to show the progress status of a given task with circular design. It visualizes the progress status within a range.
          Circle ScrollerThe circle scroller changes corresponding to the rotary events. It shows the whole scrollable area with a circular scroll bar.
          Circle SliderThe circle slider changes corresponding to rotary events. The circle slider not only extends the UI feature of the elm_slider, but also replaces the functionalities of the elm_slider in a circular design.
          Circle SurfaceThe circle surface manages and renders circle objects. Multiple circle objects can be connected to one circle surface as candidates of an object to be rendered.
          - -

          Wearable Rectangular UI Component Styles

          - -

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          - -

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component. For more detailed information, see the Themes.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Button styles
          StyleSampleText partSwallow partNotes
          default elm.textelm.swallow.content
          greenelm.textelm.swallow.content
          orangeelm.textelm.swallow.content
          redelm.textelm.swallow.content
          nextdepth
          naviframe/title_iconelm.swallow.contentThe icon can be set with the elm_object_part_content_set(btn, "icon", ic) function.
          - - - --- - - - - - - - - - - - - - -
          Table: Check styles
          StyleSample
          default
          on&off
          - - - - - - - - - - - - - - - -
          Table: Contextual popup (Ctxpopup) styles
          StyleSampleNotes
          defaultUse the elm_ctxpopup_item_append() function to add both text and an icon to the list.
          - - - --- - - - - - - - - - - - - - -
          Table: Datetime styles
          StyleSample
          datepicker_layout
          timepicker_layout
          - - - - - - - - - - - - - - - - - - - -
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. -

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          group_indexelm.text: for the main text. -

          elm.text.1: for the sub text.

          elm.icon
          1textelm.text
          1text.1iconelm.textelm.icon
          2textelm.text: for the main text. -

          elm.text.1: for the sub text.

          2text.1elm.text: for the main text. -

          elm.text.1: for the sub text.

          1text.1icon.dividerelm.textelm.icon: for the icon. -

          elm.divider: for the icon divider.

          1text.1icon.1elm.textelm.icon
          2text.1icon.1elm.text: for the main text. -

          elm.text.1: for the sub text.

          elm.icon
          multiline/1textelm.text: for the multi-line text.
          multiline/2textelm.text: for the main text. -

          elm.text.1: for the multi-line sub text.

          - - - - - - - - - - - - - - - - - - -
          Table: Index styles
          StyleSample
          thumbnail
          tab
          - - - --- - - - - - - - - - - - - - -
          Table: Popup styles
          StyleSample
          default
          toast
          - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Progressbar styles
          StyleSample
          default
          pending_list
          process
          process/groupindex
          - - - --- - - - - - - - - - -
          Table: Radio styles
          StyleSample
          default
          - - - - - - - - - - - - - - - - -
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          - - -

          Wearable Circular UI Component Styles

          - -

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          - -

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component.

          - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Button styles
          StyleSampleText partSwallow partNotes
          default elm.textelm.swallow.content
          bottomelm.textelm.swallow.content
          - - - --- - - - - - - - - - - - - - - - - - -
          Table: Check styles
          StyleSample
          default
          small
          on&off
          - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Contextual popup (Ctxpopup) styles
          StyleSampleNotes
          select_mode
          select_mode/topPair this style with select_mode/bottom.
          select_mode/bottomPair this style with select_mode/top.
          - - - --- - - - - - - - - - - - - - -
          Table: Datetime styles
          StyleSample
          datepicker/circle
          timepicker/circle
          - - - - - - - - - - - - - - - - - - - -
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. -

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. -

          elm.swallow.end: for the icon on the right.

          titleelm.text
          groupindexelm.text
          1textelm.text
          1text.1iconelm.textelm.icon
          2textelm.text: for the main text. -

          elm.text.1: for the sub text.

          1text.1icon.dividerelm.textelm.icon: for the icon. -

          elm.divider: for the icon divider.

          1text.1icon.1elm.textelm.icon
          2text.1icon.1elm.text: for the main text. -

          elm.text.1: for the sub text.

          elm.icon
          editfieldelm.text
          - - - - - - - - - - - - - - - - - - -
          Table: Index styles
          StyleSample
          thumbnail
          circle
          - - - --- - - - - - - - - - - - - - -
          Table: Popup styles
          StyleSample
          circle
          toast/circle
          - - - - - - - - - - - - - - - - - -
          Table: Progressbar styles
          StyleSample
          process
          process/small
          - - - --- - - - - - - - - - -
          Table: Radio styles
          StyleSample
          default
          - - - - - - - - - - - - - - - - -
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          - -

          For more details about customizing the look and feel of the UI components with custom styles which are not provided as defaults, see the ThemeExtension sample.

          - - - - - - - - - - -
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/ui_containers_n.htm b/org.tizen.ui.guides/html/native/efl/ui_containers_n.htm deleted file mode 100755 index 5db93d6..0000000 --- a/org.tizen.ui.guides/html/native/efl/ui_containers_n.htm +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - UI Containers: Creating Layouts Using Container UI Components - - - - - -
          - -

          UI Containers: Creating Layouts Using Container UI Components

          - -

          All applications use containers to create the layout of the UI. The EFL and Elementary support several ways to create this layout. You can use predefined layouts or animated layouts, or you can create your own layouts. It is important to note that container UI components do not have their own visual identity - only logical structures for assignment or placement of the UI components.

          - -

          When you use container components, such as naviframe, conformant, button, and box, you need to understand certain APIs related to alignment, and EDC parts for, for example, the core layout and animated layout. For more information on the containers EDC parts, see Positioning and Laying out Parts Using the EDC File. The use of the container UI components only differs from the use of the UI components through their absence of a visual identity.

          - -

          Most of the time, your application has to manage multiple views. The easiest way to handle them with the EFL is to create a naviframe object. This object is a container. At first, it is used to contain the pages your application is composed of. Every Tizen application can use this top-layer object to facilitate navigation. More details can be found in Creating a Naviframe for Navigation.

          - -

          Another interesting object that has to be present in every application is the conformant object. Conformant is a container component that accounts for the space taken up by the indicator, virtual keyboard, and softkey windows. The conformant content will be resized and positioned based on the space available. When the virtual keyboard is displayed, the content does not change.

          - -

          Figure: Basic EFL application structure

          -

          Basic EFL application structure

          - -

          Container Components

          - -

          The following table lists the available UI container components.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Available container components -
          Container nameDescription
          BoxOne of the most simple containers in the EFL is a box.
          ConformantA conformant is a container component that accounts for the space taken by the indicator, virtual keyboard, and softkey windows.
          GridIn a grid, objects are placed at specific positions along a fixed grid.
          LayoutA layout is a container component that takes a standard Edje design file and wraps it very thinly in a UI component.
          MapbufA mapbuf is a container component that uses an Evas map to hold a content object. This UI component is used to improve the moving and resizing performance of complex UI components.
          NaviframeA naviframe component consists of a stack of views. New views are pushed on top of previous ones, and only the top-most view is displayed.
          Panes
          (in mobile applications only)
          A panes component adds a draggable bar between two sections of content. The sections are resized when the bar is dragged.
          ScrollerA scroller holds (and clips) a single object and allows you to scroll across it.
          TableA table is like a box but with 2 dimensions.
          - - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/ui_scalability_n.htm b/org.tizen.ui.guides/html/native/efl/ui_scalability_n.htm deleted file mode 100755 index 483202a..0000000 --- a/org.tizen.ui.guides/html/native/efl/ui_scalability_n.htm +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - Scaling: Handling Screen and Object Sizes - - - - - -
          - -

          Scaling: Handling Screen and Object Sizes

          - -

          Supporting UI scalability in a user interface toolkit means that container components and UI components are scaled properly when the resolution or screen size changes. The Elementary library allows you to manipulate scaling on a per-UI-component basis using a scale factor based on the screen resolution, size, and profile configurations.

          - -

          Tizen native applications can run on different types of devices, such as wearable, phone, tablets, and TVs. Tizen also supports various resolutions (WVGA - XQXGA) with the same layouts and resources. However, remember that you must always polish your work to create an optimal application for each device.

          - -

          The main scalability features are:

          -
            -
          • Multiple Screen Support

            Enables you to design applications for different kinds of screens.

          • -
          • Scalability Support

            Enables you to design applications so that their UI can be scaled for diverse devices without problems.

          • -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/guides_n.htm b/org.tizen.ui.guides/html/native/guides_n.htm deleted file mode 100755 index b98fee6..0000000 --- a/org.tizen.ui.guides/html/native/guides_n.htm +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - Tizen Native UI Guides - - - - - - -
          -

          Tizen
          -Native UI Guides

          - -

          The UI framework features include various aspects of creating a visual outlook for the user application to ensure the best possible user experience.

          - -

          The UI framework is a universal, reusable software environment that provides the essential building blocks as part of the Tizen platform to facilitate the development of Tizen native applications. The framework provides the window, UI components, and scene-based graphic rendering architecture needed to manage your application user interface. In addition, the framework provides animations and effects needed to make your application more fresh and vivid, event handling and the main loop to interact with the user and system, and more features, such as scalability, and font setting.

          - -

          The Tizen platform provides the following native UI toolkit frameworks for developing a native application:

          - -
            -
          • EFL (Enlightenment Foundation Libraries) -

            EFL provides streamlined graphic core libraries you need to create powerful applications. EFL needs lower memory but provides high performance, and supports a retained mode graphics system and user-centric features, such as themes, 2D/3D effects, and accessibility. In addition, EFL supports various resolutions with the same layout, fast and small file systems, a variety of programming language bindings, and a separate UI and logic.

            -

            Generally, select the EFL UI toolkit if you are creating a 2D-based Tizen native application. However, EFL supports 2.5D and 3D effects and 3D objects as well.

          • -
          • DALi (Dynamic Animation Library) -

            DALi is based on OpenGL ES 2.0 and 3.0; however it hides the complexity of the OpenGL ES API from you. DALi requires a GPU (Graphical Processing Unit) on the device.

            -

            Select the DALi 3D UI toolkit if you are creating a high-performance rich UI application.

          • -
          - - - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/scripts/common.js b/org.tizen.ui.guides/html/scripts/common.js deleted file mode 100755 index d46479a..0000000 --- a/org.tizen.ui.guides/html/scripts/common.js +++ /dev/null @@ -1,1752 +0,0 @@ -$(document).ready(function(){ - $('#contents table').each(function(){ - if (!$(this).parent().hasClass('table')) { - $(this).wrap('
          '); - } - }); - - // Lnb Menu Initialize - if($('div#contents').find('.lnb').length){ - if($("ul li.events_news").size() > 0) { - $("ul.lnb").after("

          \"Samsung

          "); - } - initLnb(); - initScript(staticURL + "/js/fixednavbar.js", function(){}); - } - - //family site - if($('div#footer').find('dl#familySlider').length){ - fn_rollToEx('familySlider', 'sliderBanner', 1, true); - } - - // Svn Commit Test - - // Language Selection - if($('div#header').find('.util').length){ - var $lang = $('div#header').find('.util'); - $lang.find('a.lang').toggle(function(){ - $(this).css('background-image', $(this).css('background-image').replace('.gif','_.gif')).next('ul.language').show(); - },function(){ - $(this).css('background-image', $(this).css('background-image').replace('_.gif','.gif')).next('ul.language').hide(); - }); - - $lang.bind('mouseleave',function(){ - $(this).find('ul.language').hide(); - $lang.find('a.lang').css('background-image', $lang.find('a.lang').css('background-image').replace('_.gif','.gif')); - }); - - $lang.find('ul.language').children().last().on("keydown", function(e) { - if(e.which == 9 && e.shiftKey) { - return true; - } - - if(e.which == 9) { - e.preventDefault(); - $lang.find('ul.language').hide(); - $lang.find('a.lang').css('background-image', $lang.find('a.lang').css('background-image').replace('_.gif','.gif')); - setTimeout(function() { - $("#searchTop").focus(); - }, 1); - } - }); - } - - // Open the Sitemap - var $open = $('div#header').find('.bt-open'); - $open.bind('click',function(){ - var $self = $(this); - var $sitemap = $('div#wrapper').find('div#sitemap'); - //var source = $sitemap.is(':visible') ? $self.css('background-image').replace('_.gif','.gif') : $self.css('background-image').replace('.gif','_.gif'); - - if($sitemap.is(':visible')){ - var source = $self.css('background-image').replace('_.gif','.gif'); - //if($('body#main').length) $('#header .util').css('border-bottom','3px solid #e4e4e4'); - - $self.attr('title','open sitemap'); - }else{ - var source = $self.css('background-image').replace('.gif','_.gif'); - //if($('body#main').length) $('#header .util').css('border-bottom','3px solid #114196'); - - $self.attr('title','close sitemap'); - } - - $self.css('background-image',source); - $sitemap.slideToggle('fast'); - - $sitemap.find('ul').filter(':last').children().filter(':last').focusout(function(){ - var source = $self.css('background-image').replace('_.gif','.gif'); - $self.css('background-image',source); - $sitemap.slideToggle('fast'); - }); - - }); - - // Search Auto Complete - var $search = $('div#header').find('fieldset.search'); - var $searchList = $search.find('#topAutocomplete>ul'); - - if($search.length){ - $search.find('> input').each(function(){ - $(this).bind({ - keydown : function(e){ - - if(e.type=='keydown'&& $(this).val().length!=0){ - $search.find('#topAutocomplete').show(); - var hei = $searchList.outerHeight(); - if(hei>400){ - $searchList.css({'height':'400px','overflow-y':'auto'}); - } - } - if(e.keyCode==9){ - $search.unbind('focusout.search'); - } - if(e.keyCode==40){ - $search.find('#topAutocomplete>ul').children(':first').find('a').focus(); - //window.scrollTo(0,0); - } - }, - focusin : function(e){ - if($(this).val()==='Search'){ - $(this).val(''); - } - }, - focusout : function(e){ - if($(this).val().length==0) $(this).val('Search'); - } - }); - }); - - //$('#topAutocomplete>ul').children().find('a').bind('focusin',function(e){ - // if(e.keyCode==40){ - // $(this).parent().next().css('border','1px solid red').find('a').focus(); - // } - //}); - - $search.find('#topAutocomplete').bind('mouseleave',function(e){ - if($search.find('> input').val().length==0){ - $search.find('> input').val('Search'); - } - $search.find('#topAutocomplete').hide(); - }); - - $search.find('#topAutocomplete>ul').children().last().focusout(function(){ - $search.find('> input').val('Search'); - $search.find('#topAutocomplete').hide(); - - //$search.bind('focusout.search', function(){ - // $(this).find('> input').val('Search'); - // $(this).find('#topAutocomplete').hide(); - //}); - }); - } -}); - -// 비차단 동적 스크립트 로딩 -function initScript(url, callback){ - var script = document.createElement("script"); - script.type = "text/javascript"; - - if(script.readyState){ // 인터넷 익스플로러 - script.onreadystatechange = function(){ - if(script.readyState=="loaded" || script.readyState=="complete"){ - script.onreadystatechange = null; - callback(); - } - }; - }else{ // 다른 브라우저 - script.onload = function(){ - callback(); - }; - } - - script.src = url; - document.getElementsByTagName("head")[0].appendChild(script); -} - - -// lnb -function initLnb(){ - var sMenu = $('.lnb'); - var sItem = sMenu.find('>li'); - - sItem.each(function(){ - if($(this).find('a').hasClass('more')){ - if($(this).find('ul').is(":visible")) { - $('').insertAfter($(this).find('a').eq(0)); - } else { - $('').insertAfter($(this).find('a').eq(0)); - } - } - }); - - var setIcoArrText = function(obj) { - if(obj.next().is(":visible")) { - obj.text("close submenu"); - } else { - obj.text("open submenu"); - } - } - - sItem.find('.ico-arr').on("click", function() { - var $that = $(this); - var liBox = $that.parent(); - var ulBox = $that.next(); - - sItem.not(liBox).not(".on").find("a.more").next().next().hide(); - sItem.not(liBox).removeClass("active").find("a").removeClass("bov"); - - if(liBox.hasClass("on")) { - if(ulBox.is(":visible")) { - ulBox.hide(); - $that.addClass("ico-on"); - } else { - ulBox.show(); - $that.removeClass("ico-on"); - } - setIcoArrText($that); - return true; - } - - if(liBox.hasClass("active")) { - liBox.removeClass("active").find("a").eq(0).removeClass("bov"); - ulBox.hide(); - } else { - liBox.addClass("active").find("a").eq(0).addClass("bov"); - ulBox.show(); - } - setIcoArrText($that); - }); - - sItem.hover(function(){ - if($(this).hasClass('on')||$(this).hasClass('active')) return false; - $(this).find("a").eq(0).addClass("bov"); - },function(){ - if($(this).hasClass('on')||$(this).hasClass('active')) return false; - $(this).find("a").eq(0).removeClass("bov"); - - }); -} - -//footer rolling banner -function fn_rollToEx(container,objectId,step,auto){ - - // 롤링할 객체를 변수에 담아둔다. - var el = $('#'+container).find('#'+objectId); - var lastChild; - var speed = 3000; - var timer = 0; - var autoplay = false; - - el.data('prev', $('#'+container).find('.prev')); //이전버튼을 data()메서드를 사용하여 저장한다. - el.data('next', $('#'+container).find('.next')); //다음버튼을 data()메서드를 사용하여 저장한다. - el.data('size', el.children().outerWidth()); //롤링객체의 자식요소의 넓이를 저장한다. - el.data('len', el.children().length); //롤링객체의 전체요소 개수 - el.data('animating',false); - el.data('step', step); //매개변수로 받은 step을 저장한다. - el.data('autoStart', false); //매개변수로 받은 step을 저장한다. - - el.css('width',el.data('size')*el.data('len')); //롤링객체의 전체넓이 지정한다. - - if(arguments.length==4){ - el.data('autoStart', auto); - } - - if(el.data('autoStart')){ - if(timer==0){ - timer = setInterval(moveNextSlide, speed); - autoplay = true; - } - } - - el.bind({ - mouseenter:function(){ - if(!autoplay) return false; - - if(timer!=0 && el.data('autoStart')){ - clearInterval(timer); - timer=0; - } - }, - mouseleave:function(){ - if(!autoplay) return false; - - if(timer==0 && el.data('autoStart')){ - timer = setInterval(moveNextSlide, speed); - } - } - }); - - - //el에 첨부된 prev 데이타를 클릭이벤트에 바인드한다. - el.data('prev').bind({ - click:function(e){ - e.preventDefault(); - movePrevSlide(); - }, - mouseenter:function(){ - - $(this).find('img').addClass('btnOn'); - - if(!autoplay) return false; - - if(timer!=0 && el.data('autoStart')){ - clearInterval(timer); - timer=0; - } - }, - mouseleave:function(){ - - $(this).find('img').removeClass('btnOn'); - - if(!autoplay) return false; - - if(timer==0 && el.data('autoStart')){ - timer = setInterval(moveNextSlide, speed); - } - } - }); - - //el에 첨부된 next 데이타를 클릭이벤트에 바인드한다. - el.data('next').bind({ - click:function(e){ - e.preventDefault(); - moveNextSlide(); - }, - mouseenter:function(){ - - $(this).find('img').addClass('btnOn'); - - if(!autoplay) return false; - - if(timer!=0 && el.data('autoStart')){ - clearInterval(timer); - timer=0; - } - }, - mouseleave:function(){ - - $(this).find('img').removeClass('btnOn'); - - if(!autoplay) return false; - - if(timer==0 && el.data('autoStart')){ - timer = setInterval(moveNextSlide, speed); - } - } - }); - - function movePrevSlide(){ - if(!el.data('animating')){ - //전달된 step개수 만큼 롤링객체의 끝에서 요소를 선택하여 복사한후 변수에 저장한다. - var lastItem = el.children().eq(-(el.data('step')+1)).nextAll().clone(true); - lastItem.prependTo(el); //복사된 요소를 롤링객체의 앞에 붙여놓는다. - el.children().eq(-(el.data('step')+1)).nextAll().remove(); //step개수만큼 선택된 요소를 끝에서 제거한다 - el.css('left','-'+(el.data('size')*el.data('step'))+'px'); //롤링객체의 left위치값을 재설정한다. - - el.data('animating',true); //애니메이션 중복을 막기 위해 첨부된 animating 데이타를 true로 설정한다. - - el.animate({'left': '0px'},'normal',function(){ //롤링객체를 left:0만큼 애니메이션 시킨다. - el.data('animating',false); - }); - } - return false; - } - - function moveNextSlide(){ - if(!el.data('animating')){ - el.data('animating',true); - - el.animate({'left':'-'+(el.data('size')*el.data('step'))+'px'},'normal',function(){ //롤링객체를 첨부된 size와 step을 곱한 만큼 애니메이션 시킨다. - //전달된 step개수 만큼 롤링객체의 앞에서 요소를 선택하여 복사한후 변수에 저장한다. - var firstChild = el.children().filter(':lt('+el.data('step')+')').clone(true); - firstChild.appendTo(el); //복사된 요소를 롤링객체의 끝에 붙여놓는다. - el.children().filter(':lt('+el.data('step')+')').remove(); //step개수만큼 선택된 요소를 앞에서 제거한다 - el.css('left','0px'); ////롤링객체의 left위치값을 재설정한다. - - el.data('animating',false); - }); - } - return false; - } - -} - -function fn_slide(options){ - - var opts = jQuery.extend({},options); - - var $bt = $('#'+opts.container).find('#'+opts.bt).children(); //롤링버튼에 대한 선택자 - var $obj = $('#'+opts.container).find('#'+opts.obj); //objectId를 id로 갖는 롤링객체의 선택자 - var $prev = $('#'+opts.container).find('#'+opts.prev).hide(); //이전버튼에 대한 선택자 - var $next = $('#'+opts.container).find('#'+opts.next); //다음버튼에 대한 선택자 - var size = $obj.children().outerWidth(); //롤링객체의 각 이미지 넓이값 - var len = $obj.children().length; //롤링객체의 이미지 갯수 - var effect = false; //슬라이드효과를 위한 boolean변수 - var auto = false; - var current = 0; //현재 보여지는 이미지의 인덱스값을 저장하기 위한 변수 - var time; - - - $obj.css('width',size*len); //롤링객체의 전체넓이 지정 - effect = opts.effect; - auto = opts.auto; - - if(auto){ - time = setTimeout('slideShow()',3000); - } - - slideShow = function(){ - - if(current < len-1){ - current++; - }else{ - current=0; - } - - controllStatus(); - - moveControl('next'); - - time = setTimeout('slideShow()',3000); - } - - controllStatus = function(){ - //이미지의 인덱스값에 따라 이전,다음 버튼 활성여부 지정 - if(current>0||current=len-1){ - $prev.show(); - $next.hide(); - } - } - - moveControl = function(msg){ - if(opts.bt!=null){ - msg=='next'? $bt.eq(current-1).find('img').attr('src', $bt.eq(current-1).find('img').attr('src').replace('_.png','.png')) - :$bt.eq(current+1).find('img').attr('src', $bt.eq(current-1).find('img').attr('src').replace('_.png','.png')); //이전에 활성화된 롤링버튼을 비활성화 - $bt.eq(current).find('img').attr('src', $bt.eq(current).find('img').attr('src').replace('.png','_.png')); //현재 인덱스값을 가지는 롤링버튼을 활성화 - } - - if(effect!=true){ //action변수가 true가 아닐경우 슬라이드 효과없이 현재의 인덱스값을 갖는 이미지를 보여줌. - $obj.children().hide(); - $obj.children().eq(current).show(); - }else{ //action변수가 true일 경우 현재의 인덱스값을 갖는 이미지로 슬라이드됨 - $obj.animate({'left':'-'+size*current},'slow'); - } - } - - $obj.bind({ - mouseenter:function(){ - if(!auto) return false; - clearTimeout(time); - }, - mouseleave:function(){ - if(!auto) return false; - time = setTimeout('slideShow()',3000); - } - }); - - //롤링 버튼 클릭시 - $bt.bind({ - mouseenter:function(){ - if(!auto) return false; - clearTimeout(time); - }, - mouseleave:function(){ - if(!auto) return false; - time = setTimeout('slideShow()',3000); - }, - click:function(){ - var idx = $bt.index(this); //클릭한 롤링버튼의 인덱스값 저장 - - current = idx; //롤링버튼의 인덱스값을 이미지의 인덱스값으로 지정 - - controllStatus(); - - if(effect!=true){ //action변수가 true가 아닐경우 슬라이드 효과없이 현재의 인덱스값을 갖는 이미지를 보여줌. - $obj.children().hide(); - $obj.children().eq(current).show(); - }else{ //action변수가 true일 경우 현재의 인덱스값을 갖는 이미지로 슬라이드됨 - $obj.animate({'left':'-'+size*current},'slow'); - } - - // 모든 롤링 버튼을 비활성화 - $bt.each(function(){ - var source = $(this).find('img').attr('src').replace('_.png','.png'); - $(this).find('img').attr('src',source); - }); - - // 선택한 롤링버튼을 활성화 - var source = $(this).find('img').attr('src').replace('.png','_.png'); - $(this).find('img').attr('src',source); - - return false; - } - }); - - //이전 버튼 클릭시 - $prev.bind({ - mouseenter:function(){ - var source = $(this).find('img').attr('src').replace('.png','_.png'); - $(this).find('img').attr('src',source); - if(!auto) return false; - clearTimeout(time); - }, - mouseleave:function(){ - var source = $(this).find('img').attr('src').replace('_.png','.png'); - $(this).find('img').attr('src',source); - if(!auto) return false; - time = setTimeout('slideShow()',3000); - }, - click:function(){ - if(current==len-1) $next.show(); //이미지 인덱스값이 마지막이 아닐경우 비활성화된 다음버튼을 활성화 - current--; //이미지 인덱스값 1씩 감소 - - moveControl('prev'); - - if(current==0) $(this).hide(); //이미지 인덱스값이 0일 경우, 즉 현재 첫번째 이미지가 활성화될 경우 이전버튼을 비활성화 - - return false; - } - }); - - //다음 버튼 클릭시 - $next.bind({ - mouseenter:function(){ - var source = $(this).find('img').attr('src').replace('.png','_.png'); - $(this).find('img').attr('src',source); - if(!auto) return false; - clearTimeout(time); - }, - mouseleave:function(){ - var source = $(this).find('img').attr('src').replace('_.png','.png'); - $(this).find('img').attr('src',source); - if(!auto) return false; - time = setTimeout('slideShow()',3000); - }, - click:function(){ - current++; //이미지 인덱스값 1씩 증가 - - moveControl('next'); - - if(current>=len-1) $(this).hide(); //이미지인덱스값이 마지막일 경우, 즉 현재 마지막 이미지가 활성화될 경우 다음버튼을 비활성화 - if(current>0) $prev.show(); //이미지인덱스값이 0이 아닌경우 이전버튼 활성화 - - return false; - } - }); - -} - -// main rolling banner -function slideMotion1(){ - var $banner = $('#rolling .motionview'), - //$nav = $('#rolling ul.nav'), - banner = {prev:null, next:null}, - size = $banner.children().length; - index = 1, - speed = 3000, - timer = null, - auto = true, - width = parseInt(100/size), - rest = parseInt(100%size); - - var $nav = $('
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/circle_progressbar_ww.htm b/org.tizen.ui.guides/html/web/tau/circle_progressbar_ww.htm deleted file mode 100755 index a234ab4..0000000 --- a/org.tizen.ui.guides/html/web/tau/circle_progressbar_ww.htm +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - Creating Circle-shaped Progress Bars - - - -
          -
          -

          Wearable Web

          -
          - - -
          - -
          -

          Creating Circle-shaped Progress Bars

          - -

          You can create a circle-shaped progress bar component with the CircleProgressBar API.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the progress bar in a rectangular and circular UI.

          - -

          Figure: The circle-shaped progress bar in rectangular and circular devices

          -

          Circle-shaped progress bar in a rectangular device Circle-shaped progress bar in a circular device

          - -

          To implement the progress bar:

          - -
            -
          1. Edit the HTML code to add the component to your application screen: - -
            -<div class="ui-page ui-page-active" id="pageCircleProgressBar" data-enable-page-scroll="false">
            -   <header class="ui-header">
            -      <h2 class="ui-title">Circle Progress</h2>
            -   </header>
            -   <div class="ui-content content-padding">
            -      <div class="result" id="result"></div>
            -   </div>
            -   <footer class="ui-footer ui-grid-col-2">
            -      <a href="#" class="ui-btn" id="minus">-10%</a>
            -      <a href="#" class="ui-btn" id="plus">+10%</a>
            -   </footer>
            -   <progress class="ui-circle-progress" id="circleprogress" max="100" value="20"></progress>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set the visual style of the progress bar: - -
            -.ui-progressbar-large 
            -{
            -   position: absolute;
            -   top: 50%;
            -   left: 50%;
            -   -webkit-transform: translate3d(-50%, -50%, 0);
            -}
            -.result 
            -{
            -   font-size:35px;
            -   text-align:center;
            -   top: 33%;
            -   left: 50%;
            -   -webkit-transform: translate3d(-50%, -50%, 0);
            -   position: absolute;
            -}
            -
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   .result 
            -   {
            -      top: 50%;
            -      margin: 0;
            -   }
            -   .ui-footer 
            -   {
            -      display: none;
            -   }
            -}
            -
            -
          4. - -
          5. Edit the JavaScript code to manage the progress bar events and other functionality: - -
            -(function()
            -{
            -   var page = document.getElementById("pageCircleProgressBar"),
            -       progressBar = document.getElementById("circleprogress"),
            -       minusBtn = document.getElementById("minus"),
            -       plusBtn = document.getElementById("plus"),
            -       resultDiv = document.getElementById("result"),
            -       isCircle = tau.support.shape.circle,
            -       progressBarWidget,
            -       resultText,
            -       i;
            -
            -   function printResult() 
            -   {
            -      resultText = progressBarWidget.value();
            -      resultDiv.innerHTML = resultText + "%";
            -   };
            -
            -   function clearVariables() 
            -   {
            -      page = null;
            -      progressBar = null;
            -      minusBtn = null;
            -      plusBtn = null;
            -      resultDiv = null;
            -   };
            -
            -   function unbindEvents() 
            -   {
            -      page.removeEventListener("pageshow", pageBeforeShowHandler);
            -      page.removeEventListener("pagehide", pageHideHandler);
            -      if (isCircle) 
            -      {
            -         document.removeEventListener("rotarydetent", rotaryDetentHandler);
            -      } 
            -      else 
            -      {
            -         minusBtn.removeEventListener("click", minusBtnClickHandler);
            -         plusBtn.removeEventListener("click", plusBtnClickHandler);
            -      }
            -   };
            -
            -   function minusBtnClickHandler() 
            -   {
            -      i = i-10;
            -      if (i < 0) 
            -      {
            -         i=0;
            -      }
            -      progressBarWidget.value(i);
            -      printResult();
            -   };
            -
            -   function plusBtnClickHandler() 
            -   {
            -      i = i+10;
            -      if (i > 100) 
            -      {
            -         i=100;
            -      }
            -      progressBarWidget.value(i);
            -      printResult();
            -   };
            -
            -   function rotaryDetentHandler() 
            -   {
            -      /* Get the rotary direction */
            -      var direction = event.detail.direction,
            -          value = parseInt(progressBarWidget.value());
            -
            -      if (direction === "CW") 
            -      {
            -         /* Right direction */
            -         if (value < 100) 
            -         {
            -            value++;
            -         } 
            -         else 
            -         {
            -            value = 100;
            -         }
            -      } 
            -      else if (direction === "CCW") 
            -      {
            -         /* Left direction */
            -         if (value > 0) 
            -         {
            -            value--;
            -         } 
            -         else 
            -         {
            -            value = 0;
            -         }
            -      }
            -
            -      progressBarWidget.value(value);
            -      printResult();
            -   }
            -
            -   function pageBeforeShowHandler() 
            -   {
            -      if (isCircle) 
            -      {
            -         /* Make the circular progressbar object */
            -         progressBarWidget = new tau.widget.CircleProgressBar(progressBar, {size: "full"});
            -         document.addEventListener("rotarydetent", rotaryDetentHandler);
            -      } 
            -      else 
            -      {
            -         progressBarWidget = new tau.widget.CircleProgressBar(progressBar, {size: "large"});
            -         minusBtn.addEventListener("click", minusBtnClickHandler);
            -         plusBtn.addEventListener("click", plusBtnClickHandler);
            -      }
            -
            -      i = parseInt(progressBarWidget.value());
            -      resultDiv.innerHTML = i + "%";
            -   };
            -
            -   function pageHideHandler() 
            -   {
            -      unbindEvents();
            -      clearVariables();
            -      /* Release the object */
            -      progressBarWidget.destroy();
            -   };
            -
            -   page.addEventListener("pagebeforeshow", pageBeforeShowHandler);
            -   page.addEventListener("pagehide", pageHideHandler);
            -}());
            -
            -
          6. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/circular_ui_ww.htm b/org.tizen.ui.guides/html/web/tau/circular_ui_ww.htm deleted file mode 100755 index 5be5f3f..0000000 --- a/org.tizen.ui.guides/html/web/tau/circular_ui_ww.htm +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - Applications for Circular UI: Developing UI on Circular Wearable Applications - - - - - -
          -

          Applications for Circular UI: Developing UI on Circular Wearable Applications

          - -

          TAU for Wearable supports different types of wearable devices (rectangle and circle) in the same application. To support the circular UI along with rectangular UI, media query is required.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - - -

          Applying the Circular UI

          - -

          To support the circular UI:

          - -
            -
          1. Include the link tag for the latest tau.css file into the <head> part in HTML. Note that for the compatibility with the rectangular UI, you must use the latest version of TAU library.
          2. - -
          3. Include the link tag for the latest tau.circle.css file with media query feature (-tizen-geometric-shape: circle) next to the link tag for the tau.css. Note that adding the tau.circle.css file following the general tau.css file covers the additional circular UI.
          4. - -
          5. Include the link tag for the latest tau.js script file at the end of <body> part of HTML.
          6. - -
          7. For writing a separate code for Circular UI in JavaScript, you can use the tau.support.shape.circle property for detecting the circular device.
          8. -
          - -
          -<head name="viewport" content="width=device-width, user-scalable=no">
          -   <title>Support for Circular UI</title>
          -   <link rel="stylesheet" href="tau.css">
          -   <!-- CSS media query on a link element -->
          -   <link rel="stylesheet" media="all and (-tizen-geometric-shape: circle)" href="tau.circle.css">
          -   <link rel="stylesheet" href="css/stlye.css">
          -</head>
          -<body>
          -   <script type="text/javascript" src="tau.js"></script>
          -   <script>
          -      if (tau.support.shape.circle) 
          -      {
          -         /* Implement your code for the circular UI */
          -      } 
          -      else 
          -      {
          -          /* Implement your code for the rectangular UI */
          -      }
          -   </script>
          -</body>
          -
          - -

          The following figure shows how the media query -tizen-geometric-shape: circle works in a rectangular and circular UI.

          -

          Figure: Media query in a rectangular device and circular device

          -

          - Media query in a rectangular device and circular device -

          - -

          Overriding Circular CSS Style with Media Query

          - -

          For some styles to be applied selectively, you can use the media query feature -tizen-geometric-shape with a rectangle or circle value to distinguish type difference. Note that the -tizen-geometric-shape feature is only available in Tizen devices.

          - - - - - - - - - - - - - - - - - - - - -
          Table: -tizen-geometric-shape feature description
          -tizen-geometric-shape
          Valuerectangle | circle
          Applied toVisual media types
          Accept min/max prefixesNo
          - -
          -.className 
          -{
          -   /* Implement the basic CSS style for all types of devices (rectangular and circular) */
          -}
          -
          -@media screen and (-tizen-geometric-shape: circle) 
          -{
          -   .className
          -   {
          -      /* Implement the CSS style to be overridden in circular */
          -   }
          -}
          -
          - -

          Writing JavaScript Selectively for the Circular UI

          -

          TAU for Wearable provides the tau.support.shape.circle property that checks whether the device screen is a circle or not. If you want implement code selectively for circular UI and rectangular UI, you can use the property with a boolean value. Note that for developing in a browser environment, this property is always set to true when the tau.circle.css file is loaded.

          - -
          -if (tau.support.shape.circle) 
          -{
          -   /* Implement your code for the circular UI */
          -} 
          -else 
          -{
          -   /* Implement your code for the rectangular UI */
          -}
          -
          - -

          Supported UI Components

          -

          The following components can be used in both rectangular and circular devices.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: UI components supported by rectangular and circular UI
          ComponentDescription
          Helper ScriptShows how you to support some application components.
          Snap ListShows how you can create a snap list component.
          Expandable HeaderShows how you can create a header component.
          Circle-shaped Progress BarShows how you can create a circle progress bar component.
          Full Size Processing ComponentShows how you can create a processing component.
          Footer ButtonShows how you can create a footer button component.
          ThumbnailShows how you can create a thumbnail component.
          Popup ButtonShows how you can create a popup component.
          Index Scroll BarShows how you can create an index scroll bar component.
          More OptionsShows how you can create a more options button component.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/event_handling_w.htm b/org.tizen.ui.guides/html/web/tau/event_handling_w.htm deleted file mode 100755 index 7daf215..0000000 --- a/org.tizen.ui.guides/html/web/tau/event_handling_w.htm +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - Event Handling: Handling User Interactions - - - -
          -
          -

          Mobile Web Wearable Web

          -
          - - -
          - -
          -

          Event Handling: Handling User Interactions

          -

          The Tizen platform supports some device events for user interaction. To provide a full user experience for your application users, you must handle various events in your application.

          - -

          Hardware Key Events

          - -

          The Tizen platform supports hardware key events for user interaction on devices.

          -

          The following figures show the hardware keys and events for mobile and wearable devices.

          - -

          Figure: Menu and Back keys on a mobile device

          -

          Menu and Back keys

          -

          Figure: Back key on a wearable device

          -

          Back key

          - - - - - - - - - - - - - - - - -
          Table: hardware key events
          TypeDescriptionAttribute
          tizenhwkeyEvent is triggered when a device detects the user interaction through special point of hardware. - event.keyName -
            -
          • back for wearable
          • -
          • back, menu for mobile
          • -
          -
          -

          To bind an event callback on the tizenhwkey events, use the following code:

          -
          -window.addEventListener("tizenhwkey", function(ev)
          -{
          -   if (ev.keyName == "back") 
          -   {
          -      /* Call window.history.back() to go to previous browser window */
          -      /* Call tizen.application.getCurrentApplication().exit() to exit application */
          -      /* Add script to add another behavior */
          -   }
          -});
          -
          - -

          Exiting the Application with the Back Key

          -

          When application binds a tizenhwkey event, it checks the page ID and decides to go back or exit with several lines of app-side script.

          -

          The Tizen Device APIs provide an application exit method. Even if the application has many pages, it can handle the back/exit process.

          -

          With TAU page, just remember the ID of the main page of main page. In the following example, the ID of the main page is main.

          -
          (function()
          -{
          -   window.addEventListener("tizenhwkey", function(ev);
          -   {
          -      if(ev.keyName === "back")
          -      {
          -         var page = document.getElementsByClassName("ui-page-active")[0],
          -             pageid = page ? page.id: "";
          -         if(pageid === "main")
          -         {
          -            try
          -            {
          -               tizen.application.getCurrentApplication().exit();
          -            }
          -            catch(ignore)
          -            {
          -            }
          -         }
          -         else
          -         {
          -            window.history.back();
          -         }
          -      }
          -   });
          -}());
          - -

          Rotary Events

          - -

          The Tizen platform supports rotary events for user interaction on a wearable rotary device or sensor. The rotary device can rotate clockwise or counter-clockwise, and dispatch an event for each movement. The rotary device has points called detents. If the rotary device detects the detent point while rotating, it dispatches a separate new event about the point. The number of the available detent points depends on the device hardware.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - - -

          Figure: Rotary device

          -

          Rotary device

          -

          Rotary events are used to deliver the rotary device or sensor data to the application. The following table describes the rotary events.

          - - - - - - - - - - - - - - - -
          Table: Rotary events
          TypeDescriptionAttribute
          rotarydetentEvent is triggered when a device detects the detent point.detail.direction: the rotation direction. -

          The available values are CW for clockwise and CCW for counter-clockwise rotation.

          - -

          To bind an event callback on rotary events, use the following code:

          -
          -document.addEventListener("rotarydetent", function(ev)
          -{
          -   var direction = ev.detail.direction;
          -   /* Add behavior for detent detected event with a direction value */
          -});
          -
          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/footerbutton_ww.htm b/org.tizen.ui.guides/html/web/tau/footerbutton_ww.htm deleted file mode 100755 index 94cb2f7..0000000 --- a/org.tizen.ui.guides/html/web/tau/footerbutton_ww.htm +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - Creating Footer Buttons - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          - -

          Creating Footer Buttons

          - -

          You can create a footer button component that is supported in both rectangular and circular UI.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figures show the layout of the footer button components in a rectangular and circular UI.

          -

          Figure: Footer button in a rectangular and circular device

          -

          Footer button in a rectangular device Footer button in a circular device

          - -

          Figure: Multiple footer buttons in a rectangular and circular device

          -

          Multiple footer buttons in a rectangular device Multiple footer buttons in a circular device

          -

          The footer button on the circular UI has the ui-bottom-button class. When there are multiple buttons, the other buttons except for the first button use the drawer component in the circular UI.

          - - -

          To implement footer buttons:

          - -
            -
          • To implement a single footer button: -

            Edit the HTML code to add the footer button component to your application screen.

            - -
            -<div class="ui-page ui-page-active" id="bottomButtonPage" >
            -   <header class="ui-header">
            -      <h2 class="ui-title">Bottom Button</h2>
            -   </header>
            -   <div class="ui-content content-padding">
            -      It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
            -   </div>
            -   <footer class="ui-footer ui-bottom-button">
            -      <a href="#" class="ui-btn">Button</a>
            -   </footer>
            -</div>
            -
            -
          • -
          • To implement multiple footer buttons: - - -
              -
            1. Edit the HTML code to add the footer button components to your application screen. -

              When there are multiple buttons, the buttons except for the first button use drawer in Circular UI.

              - -
              -<div class="ui-page ui-page-active" id="bottomButtonWithMorePage" >
              -   <header class="ui-header">
              -      <h2 class="ui-title">Multiple Buttons</h2>
              -   </header>
              -   <div class="ui-content content-padding">
              -      It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
              -
              -   </div>
              -
              -   <a class="drawer-handler"></a>
              -
              -   <!-- Circle Profile -->
              -   <div id="moreoptionsDrawer" class="ui-drawer drawer-elem" data-drawer-target="#bottomButtonWithMorePage" data-position="right" data-enable="true" data-drag-edge="1">
              -      <div id="selector" class="ui-selector">
              -         <div class="ui-item show-icon" data-title="2"></div>
              -         <div class="ui-item human-icon" data-title="3"></div>
              -      </div>
              -   </div>
              -
              -   <footer class="ui-footer ui-grid-col-3 ui-bottom-button">
              -      <a href="#" class="ui-btn">1</a>
              -      <a href="#" class="ui-btn">2</a>
              -      <a href="#" class="ui-btn">3</a>
              -
              -   </footer>
              -</div>
              -
              -
            2. - -
            3. Edit the CSS code to set the visual style of the buttons: - -
              -.drawer-elem 
              -{
              -   display: none;
              -}
              -
              -@media all and (-tizen-geometric-shape: circle) 
              -{
              -   .drawer-handler 
              -   {
              -      width:24px;
              -      height: 115px;
              -      position: fixed;
              -      top: 122px;
              -      right: 0;
              -      color: transparent;
              -      background-color: #a4a4a4;
              -      -webkit-mask-image: url(/*path of the image*/);
              -      -webkit-mask-size: 18px 36px;
              -      -webkit-mask-repeat: no-repeat;
              -      -webkit-mask-position: 0 40px;
              -   }
              -   .ui-bottom-button a + a 
              -   {
              -       display: none;
              -   }
              -}
              - 
              - -
            4. -
            5. Edit the JavaScript code to manage the footer button events and other functionalities: -
              -(function()
              -{
              -   var page = document.querySelector("#bottomButtonWithMorePage"),
              -      drawer = page.querySelector("#moreoptionsDrawer"),
              -      handler = page.querySelector(".ui-more");
              -   page.addEventListener("pagebeforeshow", function() 
              -   {
              -      if (tau.support.shape.circle) 
              -      {
              -         tau.helper.DrawerMoreStyle.create(drawer, 
              -         {
              -            handler: ".drawer-handler",
              -
              -         });
              -      }
              -   });
              -})();
              -
              -
            6. -
            -
          • -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/globalization_w.htm b/org.tizen.ui.guides/html/web/tau/globalization_w.htm deleted file mode 100755 index 6644ca6..0000000 --- a/org.tizen.ui.guides/html/web/tau/globalization_w.htm +++ /dev/null @@ -1,484 +0,0 @@ - - - - - - - - - - - - - Globalization: Supporting Internationalization and Localization - - - - - - -
          -

          Globalization: Supporting Internationalization and Localization

          - -

          The TAU Globalize utility supports internationalization and localization. It wraps the Globalize functionality for easy access from Tizen Web applications, and it is extended to support the right-to-left (RTL) languages.

          - -

          jQuery and Globalize

          - -

          Globalize is a jQuery JavaScript library for internationalization and localization that leverages the official Unicode CLDR JSON data. The library works both for the browser and as a Node.js module. jQuery and Globalize have dependencies with cldr.js, which is a CLDR low-level manipulation tool.

          - -

          Globalize:

          -
            -
          • Leverages the Unicode CLDR data and follows its UTS#35 specification.
          • -
          • Keeps the code separate from the i18n content. Does not host or embed any locale data in the library. Empowers you to control the loading mechanism of your choice.
          • -
          • Allows you to load as much or as little data as you need. Avoids duplicating data if using multiple i18n libraries that leverage CLDR.
          • -
          • Keeps the code modular. Allows you to load the i18n functionalities you need.
          • -
          • Runs in browsers and Node.js, and consistently across all of them.
          • -
          • Makes globalization as easy to use as jQuery.
          • -
          - -

          CLDR Data

          - -

          The Unicode CLDR provides the key building blocks for software to support the world's languages. It includes:

          -
            -
          • Locale-specific patterns for formatting and parsing dates, times, time zones, numbers, and currency values
          • -
          • Translations of names: languages, scripts, countries and regions, currencies, eras, months, weekdays, day periods, time zones, cities, and time units
          • -
          • Language and script information: characters used, plural cases, gender of lists, capitalization, rules for sorting and searching, writing direction, transliteration rules, rules for spelling out numbers, and rules for segmenting text into graphemes, words, and sentences
          • -
          • Country information: language usage, currency information, calendar preference and week conventions, and postal and telephone codes
          • -
          • ISO and BCP 47 code support (such as cross-mappings) and keyboard layouts
          • -
          - -

          CLDR uses the XML format provided by UTS #35: Unicode Locale Data Markup Language (LDML). LDML is a format used not only for CLDR, but also for the general interchange of locale data. For more information about CLDR, see CLDR release notes, and to download the JSON format file , see JSON Data from the Unicode CLDR Project.

          -

          The TAU Globalize utility uses the CLDR 26 release, and when you create a Tizen Web application project, you find CLDR in the <project>/lib/tau/<profile>js/cldr-data folder.

          - -

          Using the Globalize Utility

          - -

          To use the TAU Globalize utility in your application:

          -
            -
          1. Download the following dependency files for your application: - -
          2. -
          3. Create a folder structure, as shown in the following table. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Globalize folder structure -
            Folder structureDescription

            -

            Globalize folder structure

            -

            Globalize main folder

            cldr/: Copy the cldr.js library in this folder.
            cldr-data/: Copy the cldr-data files in this folder. -

            cldr-data/main: Copy the languages to be supported in this folder.

            - - - - - - - - - -
            Note
            Do not copy all languages, just the ones you need.
            globalize/: Copy the Globalize library in this folder.
            locale/: Make the custom locale string in this folder.
            script/: JavaScript files.
            style/: CSS, image, and other style related files.
            view/: HTML files
            -
          4. -
          5. Set the locale using the following example code: -
            -var globalize = tau.util.globalize,
            -   localeId  = "ko-KR";
            -
            -document.addEventListener('pageshow', function()
            -{
            -   globalize.setLocale(localeId)
            -   .done(function(ko)
            -   {
            -      /* "ko" is the Globalize utility instance */
            -      console.log(ko.getLocale()) /* "ko" */
            -   })
            -})
            -
            - -

            The setLocale() method is not synchronous, and it returns the deferred object with the methods then(), done(), and fail(). Use these methods to receive the Globalize utility instance.

            -

            You can specify locales in 2 ways using IETF language tags, such as en, pt-BR, or zh-Hant-TW:

            -
              -
            • Specify the locale ID in the lang attribute of the body element, such as <body lang="ko-KR">.
            • -
            • Use a string variable as an input argument of the setLocale() method (for example ko.setLocale("en")) to overwrite the body element setting.
            • -
            -

            If no lang attribute or setLocale() input argument is defined, the Globalize utility finds the locale by checking the window.navigator.language property. If the check result is false, the utility uses the default locale "en".

            -

            The following table illustrates the locale setting method order.

            - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: Locale setting methods -
            OrderLocale setting methods
            1setLocale(LocaleId)
            2<body lang="ko-KR">
            3window.navigator.language
            4Default locale "en"
            -
          6. -
          7. Make sure that you have all required CLDR files. -

            The setLocale() method automatically loads the basic CLDR data files which are match the given locale by local AJAX. During the method call, the Globalize utility also loads the basic CLDR JSON files:

            -
              -
            • cldr/main/locale/ca-gregorian.json
            • -
            • cldr/main/locale/numbers.json
            • -
            • cldr/main/locale/currencies.json
            • -
            • cldr/supplemental/likelySubtags.json
            • -
            • cldr/supplemental/scriptMetaData.json
            • -
            • cldr/supplemental/timeData.json
            • -
            • cldr/supplemental/weekData.json
            • -
            • cldr/supplemental/numberingSystems.json
            • -
            • cldr/supplemental/plurals.json (for cardinals)
            • -
            • cldr/supplemental/ordinals.json (for ordinals)
            • -
            -

            In addition to the basic files, each Globalize method requires a special set of CLDR portions. Determine which Globalize module functionalities you need, and make sure you have the required files, as defined in the following table.

            - - - - - - - - - - - - - - - - - - - - - - - - - -
            - Table: CLDR requirements -
            ModuleRequired CLDR JSON files
            Core modulecldr/supplemental/likelySubtags.json
            Date modulecldr/main/locale/ca-gregorian.json -

            cldr/main/locale/timeZoneNames.json

            -

            cldr/supplemental/timeData.json

            -

            cldr/supplemental/weekData.json

            -

            CLDR JSON files from the number module

            Number modulecldr/main/locale/numbers.json -

            cldr/supplemental/numberingSystems.json

            Plural modulecldr/supplemental/plurals.json (for cardinals) -

            cldr/supplemental/ordinals.json (for ordinals)

            -
            -
          8. -
          - -

          Using the Globalize Utility Methods

          -

          The following code snippets show how to use the TAU Globalize utility methods:

          -
            -
          • formatCurrency(): -
            -var globalize = tau.util.globalize,
            -    localeId  = "ko-KR",
            -    currency_unit = "KRW"; /* ISO 4217 */
            -
            -document.addEventListener('pageshow', function()
            -{
            -   globalize.setLocale(localeId)
            -   .done(function(ko)
            -   {
            -      console.log(ko.formatCurrency(69000, currency_unit)); /* ₩69,900 */
            -   })
            -})
            -
            -

            For more information, see the currency unit standard in ISO 4217.

            -
          • - -
          • formatDate(): -
            -var globalize = tau.util.globalize,
            -    localeId  = "ko-KR",
            -    currency_unit = "KRW"; /* ISO 4217 */
            -
            -document.addEventListener('pageshow', function()
            -{
            -   globalize.setLocale(localeId)
            -   .done(function(ko)
            -   {
            -      console.log(ko.formatDate(new Date(), {datetime:"medium"});
            -   })
            -})
            -
            -

            For more information, see date-formatter.

            -
          • - -
          • getCalendar(): -
            -var globalize = tau.util.globalize,
            -    localeId  = "ko-KR";
            -
            -document.addEventListener('pageshow', function()
            -{
            -   globalize.setLocale(localeId)
            -   .done(function(ko)
            -   {
            -      console.log(ko.getCalendar().months.format.wide, undefined, 4));
            -   })
            -})
            -
            -

            The calendar format is specified in the gregorian.json file in the CLDR data.

            -
          • - -
          • formatMessage(): -

            This method supports custom locale data.

            -
              -
            1. Create a directory for each locale that has localized content under the locales directory in the project root. The locale names are defined in the W3C IANA language subtag registry. -
              -index.html
              -locale
              -   en.json
              -   ko.json
              -
              -
            2. -
            3. Create a JSON file for the formatMessage strings (custom locale strings) in locales paths: -
              -{
              -   "en":
              -   {
              -      "like":
              -      [
              -         "{0, plural, offset:1",
              -         "=0 {Be the first to like this}",
              -         "=1 {You liked this}",
              -         "one {You and someone else liked this}",
              -         "other {You and # others liked this}",
              -         "}"
              -      ],
              -      "greeting":
              -      {
              -         "hello":"hello",
              -         "bye":"bye"
              -      },
              -      "longText":
              -      [
              -         "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi non",
              -         "quis exercitationem culpa nesciunt nihil aut nostrum explicabo",
              -         "reprehenderit optio amet ab temporibus asperiores quasi cupiditate.",
              -         "Voluptatum ducimus voluptates voluptas?"
              -      ]
              -   }
              -}
              -
              -
            4. - -
            5. Call the setLocale() method to load the custom locale files automatically: -
              -var globalize = tau.util.globalize,
              -    localeId  = "ko-KR";
              -
              -document.addEventListener('pageshow', function()
              -{
              -   globalize.setLocale(localeId)
              -   .done(function(ko)
              -   {
              -      console.log(ko.formatMessage("greeting/hello"));
              -      console.log(ko.formatMessage("greeting/bye"));
              -      console.log(ko.formatMessage("longText"));
              -   })
              -})
              -
              -
            6. -
            -
          • - -
          • messageFormatter(): -

            This method returns a function that formats a message using the ICU message format pattern. For more information, see message-formatter.

            -
              -
            1. Create a locale resource in the locales path: -
              -{
              -   "en":
              -   {
              -      "formatter":
              -      {
              -         "welcome":"Hello Mr. {0}",
              -         "thankyou":"Bye Mr. {custom}."
              -      }
              -   }
              -}
              -
              -
            2. - -
            3. Use the messageFormatter() method: -
              -var globalize = tau.util.globalize,
              -    localeId  = "en-US";
              -
              -document.addEventListener('pageshow', function()
              -{
              -   globalize.setLocale(localeId)
              -   .done(function(en)
              -   {
              -      var welcomeFormatter = en.messageFormatter('formatter/welcome'),
              -          thankyouFormatter  = en.messageFormatter('formatter/thankyou'),
              -          welcomeMessageList = ["Tom"],
              -          thankyouMessageList = {custom:"Tom"};
              -
              -      console.log(welcomeFormatter(welcomeMessageList));
              -      console.log(thankyouFormatter(thankyouMessageList));
              -   })
              -})
              -
              -
            4. -
            -
          • -
          - -

          Right-to-left (RTL) Language Support

          - -

          TAU offers 2 ways to handle right-to-left (RTL) languages:

          -
            -
          • Locale-specific CSS
          • -
          • RTL property in a locale object
          • -
          -

          When the setLocale() method is called, it automatically applies a CSS class to the body element of your DOM if the given locale has an RTL direction.

          -

          The following examples show how to use the locale-specific CSS:

          - -
            -
          • The following example has ar-EG as the given locale, and the language has an RTL direction: -
            -var globalize = tau.util.globalize,
            -    localeId  = "ar-EG";
            -
            -document.addEventListener('pageshow', function()
            -{
            -   globalize.setLocale(localeId)
            -   .done(function(ar)
            -   {
            -      ...
            -   })
            -})
            -
            -
          • - -
          • The following example has a DOM of body with a locale-specific CSS named ui-script-direction-rtl: -
            -<body class="ui-script-direction-rtl">
            -
            -
          • - -
          • The following example uses the locale-specific CSS to switch on the RTL feature for a UI component: -
            -.ui-script-direction-rtl .ui-listview
            -{
            -   direction: rtl;
            -}
            -.ui-script-direction-rtl .ui-li.ui-li-static
            -{
            -   text-align: right;
            -   unicode-bidi: bidi-override;
            -}
            -
            -
          • -
          - -

          The following example shows how to use the RTL property in a locale object (the rtl variable). If a given locale has an RTL direction, the variable is true.

          -
          -var globalize = tau.util.globalize,
          -    localeId  = "ar-EG";
          -
          -document.addEventListener('pageshow', function()
          -{
          -   globalize.setLocale(localeId)
          -   .done(function(ar)
          -   {
          -      console.log(ar.rtl) /* true */
          -   })
          -})
          -
          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/guides_tau_w.htm b/org.tizen.ui.guides/html/web/tau/guides_tau_w.htm deleted file mode 100755 index e7e2247..0000000 --- a/org.tizen.ui.guides/html/web/tau/guides_tau_w.htm +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - TAU - - - -
          -
          -

          Mobile Web Wearable Web

          -
          - -
          - -

          Related Info

          - -
          -
          - -
          -

          TAU

          - - - - - - - - - - -
          Note
          Tizen Advaced UI framework(TAU) is optional, but recommended for making web applications for Tizen. -
          - -

          The Tizen Advanced UI Framework components allow you to create and manage various kinds of UI components. The components represent a visual UI element, such as a button or slider, which gives you interaction with and manipulation features.

          -

          TAU is the standard Web UI library for Tizen platform, originated from the Tizen Web UI Framework Library (standard library for Tizen 2.2.1), which was mainly an extension to jQuery Mobile. The key features of Web UI Framework Library were coding simplification and application creation speed. The purpose of TAU is to be the "framework advanced to the next level".

          - - -

          With TAU you can take advantage of the following benefits in your code:

          -
            -
          • TAU is a standalone library, so no additional libraries are needed.
          • -
          • TAU can be used with jQuery, as it exposes a special API to the jQuery object identical to jQuery Mobile. Migration is painless.
          • -
          • TAU has been written with speed in mind, and all the code is tweaked for maximum performance.
          • -
          • Applications can be built to dramatically improve startup performance.
          • -
          • TAU is ECMAScript5- and HTML5-compliant.
          • -
          • TAU has a large and open API, TAU methods and core functions (event utility functions) are available and not hidden.
          • -
          • TAU is customizable and easy to extend (to create new UI components).
          • -
          • TAU is optimized for wearable, mobile, and TV devices.
          • -
          • TAU supports various profiles (mobile, wearable, and TV).
          • -
          - - - - - - - - - - - - - -
          Note
          TAU (Tizen Advanced UI) is the new name of the tizen-web-ui-fw. -
          Since 2.3, tizen-web-ui-fw has been deprecated (including tizen-web-ui-fw.js, tizen-web-ui-fw-libs.js, and tizen-web-ui-fw.css). -

          In all documents and source code, TAU is used instead of tizen-web-ui-fw.

          -

          Since 2.4, tizen-web-ui-fw is fully deleted and not supported anymore.

          -
          - -

          To learn to use the TAU features in your application UI, see the following topics:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/header_ww.htm b/org.tizen.ui.guides/html/web/tau/header_ww.htm deleted file mode 100755 index 83fea43..0000000 --- a/org.tizen.ui.guides/html/web/tau/header_ww.htm +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - - - - - - - Creating Expandable Headers - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating Expandable Headers

          - -

          You can create an expandable header component for your application. The expandable header offers events to support interactivity with other components.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the header component in a rectangular and circular UI.

          - -

          Figure: Header component in rectangular and circular devices

          -

          Header component in a rectangular device Header component in a circular device

          - -

          To implement the header component, edit the HTML code to add the header component to your application screen:

          -
          -<div class="ui-page ui-page-active" id="headerPage" >
          -   <header class="ui-header" id="myHeader">
          -      <h2 class="ui-title">Long title with ExpandableHeader</h2>
          -   </header>
          -   <div class="ui-content content-padding">
          -      Header is expandable in Circular UI.
          -   </div>
          -</div>
          -
          - - -

          The header component supports the following events.

          - - - - - - - - - - - - - - - - - - - - -
          Event nameDescription
          headerexpandTriggered when the header starts to expand.
          headerexpandcompleteTriggered after the header has fully expanded.
          headercollapseTriggered when the header returns to the state before expanding.
          - -

          You can use events headerexpand and headercollapse if you need to do something when the header expands and collapses.

          -

          The following examples show header events with Marquee.

          - -
          -var page = document.querySelector("#myPage");
          -
          -page.addEventListener("pagebeforeshow", function() 
          -{
          -   var textElement = page.querySelector(".ui-title"),
          -       marquee = new tau.widget.Marquee(textElement);
          -}, false);
          -
          -page.addEventListener("headercollapse", function() 
          -{
          -   if (marquee) 
          -   {
          -      marquee.reset();
          -   }
          -}, false);
          -
          -page.addEventListener("headerexpandcomplete", function() 
          -{
          -   if (marquee) 
          -   {
          -      marquee.start();
          -   }
          -}, false);
          -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/helloworld_w.htm b/org.tizen.ui.guides/html/web/tau/helloworld_w.htm deleted file mode 100755 index ad9d9af..0000000 --- a/org.tizen.ui.guides/html/web/tau/helloworld_w.htm +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - Hello World: Creating a Basic Hello World Page - - - - - -
          -

          Hello World: Creating a Basic Hello World Page

          - -

          You can import TAU into your application and create a basic Hello World page with TAU.

          - -

          The following example shows a basic TAU template:

          -
          -<!DOCTYPE html>
          -<html>
          -   <head>
          -      <meta name="viewport" content="width=device-width, user-scalable=no"/>
          -      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
          -      <link rel="stylesheet" href="myapp.css" />
          -      <title>Hello TAU</title>
          -   </head>
          -   <body>
          -      <!-- HTML BODY CONTENT -->
          -      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
          -      <script src="myapp.js"></script>
          -   </body>
          -</html>
          -
          - - -

          Scaling the UI

          -

          The Tizen Advanced UI (TAU) based template provides 2 scaling methods: device-width and fixed-width.

          -
            -
          • Device-width scaling -

            This scaling mode is suited for most mobile devices, such as Tizen, iPhone® and Android®. In this mode, the viewport width is set to device-width, enabling rem scaling using the Rem and Em units. These units calculate the size of a source element automatically based on the container font size (Em) or the base font size (Rem). In Tizen Web applications, a 320 px screen width is assumed.

            -
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
            -
          • -
          • Fixed-width scaling -

            This scaling mode is best suited for Tizen devices, since the entire screen can be scaled on the viewport level. In the viewport scaling mode, set the size of all resources to fit the 360 px screen width.

            -

            You can also use fixed-width scaling if you do not want to scale your application or if you want to set your own scale. In this case, declare a viewport but note that the default viewport scaling is overridden by the declared viewport. In the Tizen Web UI components, viewport scaling is set automatically to device-width as follows:

            -
            <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
            -

            To enable fixed-width scaling, the header must contain the <meta name="viewport"> element:

            -
            <meta name="viewport" content="width=360, initial-scale=1, user-scalable=no">
            -
          • -
          - -

          Importing TAU

          -

          You can import TAU with HTML. For better performance, all CSS files must be included in header and all scripts tags must be put before the body element's close tag:

          -
          -<!DOCTYPE html>
          -<html>
          -   <head>
          -      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
          -   </head>
          -   <body>
          -      <!-- HTML BODY CONTENT -->
          -      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
          -   </body>
          -</html>
          -
          -

          In HTML, use the <script> and <link> elements. These default elements are used to load the basic Tizen Advanced UI (TAU) libraries that must be included in Tizen Web applications. The loaded libraries are:

          -
            -
          • TAU library: tau(.min).js

            This element is mandatory, as it imports the TAU library, which you need to use the TAU JavaScript Interface.

          • -
          • TAU theme: tau(.min).css

            This element is also mandatory, as it imports the TAU theme.

          • -
          - -

          Running Custom JavaScript and CSS

          -

          You can add an additional <script src="<CUSTOM_LIBRARY>"> or <link rel="stylesheet" src="<CUSTOM_CSS>"> element to include your own scripts and style sheets. However, place them after the default <script> elements, as you can use any TAU APIs provided by the default libraries.

          -

          To load your JavaScript file, include the file in the <script> element in the HTML header. Since the TAU files are already loaded, you can use any APIs from these libraries as well.

          -
          <script src="{YOUR_SCRIPT_PATH}"></script>
          - -

          Creating a Page in the Body

          - -

          The body section of the HTML file contains 1 or more pages.

          -

          To create a page in <body>, you can use the "ui-page" class with the <div> element:

          -
          -<body>
          -   <div class="ui-page" id="main">
          -   </div>
          -</body>
          -
          - -

          Each pages has a header, mandatory content, and a footer:

          -
          -<body>
          -   <div class="ui-page" id="main">
          -      <div class="ui-header">
          -         <h1>Hello World</h1>
          -      </div>
          -      <div class="ui-content">
          -         <p>Hello TAU!</p>  
          -      </div>
          -      <div class="ui-footer">
          -         <button>OK</button>  
          -      </div>
          -   </div>
          -</body>
          -
          - -

          The following example shows a basic sample code for Hello World :

          -
          -<!DOCTYPE html>
          -<html>
          -   <head>
          -      <meta name="viewport" content="width=device-width, user-scalable=no"/>
          -      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
          -      <link rel="stylesheet" href="myapp.css" />
          -      <title>Hello TAU</title>
          -   </head>
          -   <body>
          -      <div class="ui-page" id="main">
          -         <div class="ui-header">
          -            <h1>Hello World</h1>
          -         </div>
          -         <div class="ui-content">
          -            <p>Hello TAU!</p>  
          -         </div>
          -         <div class="ui-footer">
          -            <button>OK</button>  
          -         </div>
          -      </div>
          -      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
          -      <script src="myapp.js"></script>
          -   </body>
          -</html>
          -
          - - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/helper_ww.htm b/org.tizen.ui.guides/html/web/tau/helper_ww.htm deleted file mode 100755 index f856ea7..0000000 --- a/org.tizen.ui.guides/html/web/tau/helper_ww.htm +++ /dev/null @@ -1,239 +0,0 @@ - - - - - - - - - - - - - Using Helper Script - - - - -
          -

          Using Helper Script

          - -

          You can use the TAU helper script to support some components for the Web applications. SnapListMarqueeStyle provides creating marquee-able and expandable list style with SnapListview.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          You can use the helper script as follows:

          - -
          -<script>
          -   var helperInstance = tau.helper.NameSpace
          -</script>
          -
          - -

          The SnapListMarqueeStyle helper provides a helper script to support some creating usable components for list style. It supports making the list view more effective using the SnapListview and Marquee components.

          - - - - - - - - - - -
          Note
          This helper script is supported since Tizen 2.3.
          - -

          The following example shows how to create your own style listview with SnapListMarqueeStyle. In the example, text of list item scrolls horizontally and the sub text appears if the list item is placed in the middle of the screen.

          - -

          To create a SnapListMarqueeStyle:

          - -
            -
          1. Edit the HTML code to add the SnapListMarqueeStyle component to your application screen. -

            You can add a multiline style listview as follows.

            - -
            -<div class="ui-page ui-page-active" id="snaplistTest">
            -   <header class="ui-header">
            -      <h2 class="ui-title">Bottom Button</h2>
            -   </header>
            -   <div class="ui-content">
            -      <ul class="ui-listview ui-snap-listview expand-list" id="snapList">
            -         <li class="li-has-2line">
            -            <div class="ui-marquee ui-marquee-gradient">1.SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-2line">
            -            <div class="ui-marquee ui-marquee-gradient">2.SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-2line">
            -            <div class="ui-marquee ui-marquee-gradient">3.SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-2line">
            -            <div class="ui-marquee ui-marquee-gradient">4.SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -      </ul>
            -   </div>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set your list animation style: -
            .ui-listview.expand-list li.li-has-2line .ui-marquee
            -{
            -   -webkit-transform: translate3d(0, 16px, 0);
            -   -webkit-transition: all ease .5s;
            -}
            -.ui-listview.expand-list li.li-has-2line.ui-snap-listview-selected .ui-marquee
            -{
            -   -webkit-transform: translate3d(0, 0, 0);
            -   -webkit-transition: all ease 1s;
            -}
            -
            -.ui-listview.expand-list li.li-has-2line .ui-li-sub-text
            -{
            -   -webkit-transform: translate3d(0, -20px, 0);
            -   opacity: 0;
            -   -webkit-transition: all ease .5s;
            -}
            -.ui-listview.expand-list li.li-has-2line.ui-snap-listview-selected .ui-li-sub-text
            -{
            -   -webkit-transform: translate3d(0, 0, 0);
            -   opacity: 1;
            -   -webkit-transition: all ease 1s;
            -}
            -
            -
          4. - -
          5. Edit the JavaScript code to make your list into a SnapListMarqueeStyle component and manage the list events: -
            -<script>
            -var page = document.getElementById("snaplistTest"),
            -    list = document.getElementById("snapList"),
            -    listHelper;
            -
            -page.addEventListener("pageshow", function() 
            -{
            -   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
            -});
            -
            -page.addEventListener("pagehide", function() 
            -{
            -   listHelper.destroy();
            -});
            -</script>
            -
            -
          6. -
          - -

          The following table shows the options you have in creating your SnapListMarqueeStyle component.

          - - - - - - - - - - - - - - - - - - -
          OptionInput typeDefault valueDescription
          marqueeDelaynumber0Sets the delay time for marquee component. The unit of time is millisecond.
          - -

          You can use the following methods with the SnapListMarqueeStyle:

          - -
            -
          • create -

            Creates the related components for SnapListMarqueeStyle.

            -

            This method is supported since Tizen 2.3.

            -

            The following code example shows the use of the method:

            -
            -<ul class="ui-listview ui-snap-listview" id="snapList">
            -   <li>some element or text</li>
            -</ul>
            -
            -<script>
            -   var list = document.getElementById("snapList"),
            -       listHelper;
            -
            -   /* Create the helper */
            -   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
            -</script>
            -
            -
          • -
          • destroy -

            Destroys the related components for SnapListMarqueeStyle.

            -

            This method is supported since Tizen 2.3. It has no return value.

            -

            The following code example shows the use of the method:

            -
            -<ul class="ui-listview ui-snap-listview" id="snapList">
            -   <li>some element or text</li>
            -</ul>
            -
            -<script>
            -   var list = document.getElementById("snapList"),
            -       listHelper;
            -
            -   /* Create the helper */
            -   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
            -
            -   /* Destroy the helper */
            -   listHelper.destroy();
            -</script>
            -
            -
          • -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/indexscrollbar_ww.htm b/org.tizen.ui.guides/html/web/tau/indexscrollbar_ww.htm deleted file mode 100755 index 604c0ab..0000000 --- a/org.tizen.ui.guides/html/web/tau/indexscrollbar_ww.htm +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - Creating Index Scroll Bars - - - - - -
          -

          Creating Index Scroll Bars

          - -

          You can create a circle or rectangle shaped index scroll bar component with the CircularIndexScrollBar and IndexScrollBar API.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the index scroll bar in a rectangular and circular UI.

          - -

          Figure: The circle-shaped progress bar in rectangular and circular devices

          -

          index scroll bar in a rectangular device Circle-shaped index scroll bar in a circular device

          - - - -

          Implementation

          -

          To implement the index scroll bar:

          - -
            -
          1. Edit the HTML code to add the component to your application screen: -
            <div class="ui-page ui-page-active" id="pageIndexScrollbar" >
            -   <header class="ui-header ui-header-small">
            -      <h2 class="ui-title ui-title-text-fadeout">Index Scroll Bar</h2>
            -   </header>
            -   <div id="indexscrollbar"></div>
            -   <section class="ui-content">
            -      <ul class="ui-listview ui-snap-listview" id="list1">
            -         <li class="ui-listview-divider">A</li>
            -    <li>Anton</li>
            -    <li class="ui-listview-divider">B</li>
            -    <li>Barry</li>
            -    <li>Bob</li>
            -    <li class="ui-listview-divider">C</li>
            -    <li>Carry</li>
            -    <li class="ui-listview-divider">D</li>
            -    <li>Daisy</li>
            -    <li class="ui-listview-divider">E</li>
            -    <li>Eric</li>
            -    <li class="ui-listview-divider">F</li>
            -    <li>Fay</li>
            -    <li class="ui-listview-divider">G</li>
            -    <li>Garry</li>
            -     </ul>
            -   </section>
            -</div>
            -
            -
          2. - -
          3. Edit the JavaScript code to manage the progress bar events and other functionality: -

            How to create a component selectively

            -
            -var indexScrollbarElement = document.getElementById("indexscrollbar");
            -
            -if (!tau.support.shape.circle) 
            -{
            -   // Create IndexScrollbar
            -   indexScrollbar = new tau.widget.IndexScrollbar(indexScrollbarElement);
            -} 
            -else 
            -{
            -   // Create CircularIndexScrollbar
            -   indexScrollbar = new tau.widget.CircularIndexScrollbar(indexScrollbarElement);
            -}
            -
            - -

            To use the callback:

            -
            -indexScrollbarElement.addEventListener("select", function( event ) 
            -{
            -   var index = event.detail.index;
            -   // Do something using the index
            -   console.log(index);
            -});
            -
            - -

            In the following example, the list scrolls to the position of the list item defined using the ui-listview-divider class, selected by the index scroll bar.

            -

            Note that in a rectangular UI, touching the index generates the selection, but in a round UI, the selection occurs when using the rotary.

            - -
            -(function() 
            -{
            -   var page = document.getElementById("pageIndexScrollbar"),
            -       listviewElement = document.getElementById("list1"),
            -       isCircle = tau.support.shape.circle,
            -       scroller,
            -       indexScrollbar;
            -
            -   page.addEventListener("pageshow", function(ev) 
            -   {
            -      var indexScrollbarElement = document.getElementById("indexscrollbar"),
            -          listDividers = listviewElement.getElementsByClassName("ui-listview-divider"), // List dividers
            -          dividers = {}, // Collection of list dividers
            -          indices = [],	// Index list
            -          divider,
            -          i, idx;
            -
            -      // For all list dividers,
            -      for(i = 0; i < listDividers.length; i++) 
            -      {
            -         // Add the list divider elements to the collection
            -         divider = listDividers[i];
            -         idx = divider.innerText;
            -         dividers[idx] = divider;
            -
            -         // Add the index to the index list
            -         indices.push(idx);
            -      }
            -
            -      scroller = tau.util.selectors.getScrollableParent(listviewElement);
            -
            -      if (!isCircle) 
            -      {
            -         indexScrollbar = new tau.widget.IndexScrollbar(indexScrollbarElement, {index: indices, container: scroller});
            -      }
            -      else 
            -      {
            -         // Create IndexScrollbar
            -         indexScrollbar = new tau.widget.CircularIndexScrollbar(indexScrollbarElement, {index: indices});
            -
            -         // Add SnapListview item "selected" event handler.
            -         listviewElement.addEventListener("selected", function (ev) 
            -         {
            -            var indexValue = ev.target.textContent[0];
            -            indexScrollbar.value(indexValue);
            -         });
            -      }
            -
            -      // Add IndexScrollbar index "select" event handler.
            -      indexScrollbarElement.addEventListener("select", function (ev) 
            -      {
            -         var divider,
            -             idx = ev.detail.index;
            -
            -         divider = dividers[idx];
            -         if (divider && scroller) 
            -         {
            -            // Scroll to the ui-listview-divider element
            -            scroller.scrollTop = divider.offsetTop - scroller.offsetTop;
            -         }
            -      });
            -   });
            -
            -   page.addEventListener("pagehide", function(ev) 
            -   {
            -      indexScrollbar.destroy();
            -   });
            -} ());
            -
            -
          4. -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/list_ww.htm b/org.tizen.ui.guides/html/web/tau/list_ww.htm deleted file mode 100755 index c29d705..0000000 --- a/org.tizen.ui.guides/html/web/tau/list_ww.htm +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - - - Creating Snap Lists - - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating Snap Lists

          - -

          You can create a snap list component with the marquee component using the SnapListview API and the helper script.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the list component in a rectangular and circular UI.

          -

          Figure: List component in rectangular and circular devices

          -

          List component in a rectangular device List component in a circular device

          - -

          To implement the list component:

          - -
            -
          1. Edit the HTML code to add the list component to your application screen: -
            -<div class="ui-page ui-page-active" id="snapListPage" >
            -   <header class="ui-header">
            -      <h2 class="ui-title">Snap List</h2>
            -   </header>
            -   <div class="ui-content">
            -      <ul class="ui-listview ui-snap-listview expand-list" id="snapList">
            -         <li class="li-has-3line">
            -         <div class="ui-marquee ui-marquee-gradient">1.3line SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-3line">
            -            <div class="ui-marquee ui-marquee-gradient">2.3line SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-3line">
            -            <div class="ui-marquee ui-marquee-gradient">3.3line SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-3line">
            -            <div class="ui-marquee ui-marquee-gradient">4.3line SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -         <li class="li-has-3line">
            -            <div class="ui-marquee ui-marquee-gradient">5.3line SnapListview with Marquee SnapListview with Marquee</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -            <div class="li-text-sub ui-li-sub-text">sub-text</div>
            -         </li>
            -      </ul>
            -   </div>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set the visual style of the list: -
            -.ui-listview li .li-text-sub 
            -{
            -   display: block;
            -   text-overflow: ellipsis;
            -   overflow: hidden;
            -   line-height: 32px;
            -   color: rgb(51, 51, 51);
            -}
            -
            -.ui-listview li.li-has-3line 
            -{
            -   padding-top: 0;
            -   padding-bottom: 0;
            -   height: 115px;
            -}
            -
            -.ui-listview.expand-list li.li-has-3line .ui-marquee
            -{
            -   -webkit-transform: translate3d(0, 30px, 0);
            -}
            -
            -.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-marquee
            -{
            -   -webkit-transform: translate3d(0, 0, 0);
            -   -webkit-transition: all ease 1s;
            -}
            -
            -.ui-listview.expand-list li.li-has-3line .ui-li-sub-text:nth-child(2)
            -{
            -   -webkit-transform: translate3d(0, -10px, 0);
            -   opacity: 0;
            -}
            -
            -.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-li-sub-text:nth-child(2)
            -{
            -   -webkit-transform: translate3d(0, 0, 0);
            -   opacity: 1;
            -   -webkit-transition: all ease 1s;
            -}
            -
            -.ui-listview.expand-list li.li-has-3line .ui-li-sub-text:last-child
            -{
            -   -webkit-transform: translate3d(0, -42px, 0);
            -   opacity: 0;
            -}
            -
            -.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-li-sub-text:last-child
            -{
            -   -webkit-transform: translate3d(0, 0, 0);
            -   opacity: 1;
            -   -webkit-transition: all ease 1s;
            -}
            -
            -
          4. - -
          5. Edit the JavaScript code to manage the list events and other functionality: -
            -var page = document.querySelector("#snapListPage"),
            -    listHelper;
            -
            -page.addEventListener( "pagebeforeshow", function() 
            -{
            -   var list = document.getElementById("snapList");
            -
            -   if (tau.support.shape.circle) 
            -   {
            -      listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
            -   }
            -});
            -
            -page.addEventListener( "pagehide", function() 
            -{
            -   if (tau.support.shape.circle) 
            -   {
            -      if (listHelper) 
            -      {
            -         listHelper.destroy();
            -      }
            -   }
            -});
            -
            -
          6. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/managing_page_w.htm b/org.tizen.ui.guides/html/web/tau/managing_page_w.htm deleted file mode 100755 index 44dde0a..0000000 --- a/org.tizen.ui.guides/html/web/tau/managing_page_w.htm +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - - - - - Managing Page: Creating and Routing a Page - - - - - -
          -

          Managing Page: Creating and Routing a Page

          - -

          The basic building block of an application UI in the TAU library is the Page element, which includes all other elements. The element is optional and extendable, so you can have any element for grouping controls you want.

          - -

          Page Structure

          -

          The page consist of:

          -
            -
          • Header area -

            Shows the user which page is currently open. The header can contain buttons, menus, and toolbars. The header is optional.

          • -
          • Content area -

            Contains the main application content. The content area has an optional scroll bar.

          • -
          • Footer area -

            Contains a status line or buttons. The footer is optional.

          • -
          -

          All the page areas are specified by a corresponding class attribute.

          - -

          Figure: Page content

          -

          Application UI Schema

          - -

          If there is no Page element in the markup, TAU creates one. For example, if no Page element exists:

          -
          <span>I have no page</span>
          -

          TAU creates a page:

          -
          <div class="ui-page"><span>I have no page</span></div>
          -
          - - -

          Creating a Single Page

          - - -

          To create a page:

          -
            -
          1. Create a single page with the following code:

            -
            <div class="ui-page">
            -   Simple page
            -</div>
            -
            - -

            To create a page for your application, use the class attribute with the ui-page value. TAU uses that information to properly acquire the div element and bind the DOM element to its JavaScript component implementation.

            -
          2. -
          3. Create a header area by using the class="ui-header" attribute:

            -
            <div class="ui-page">
            -   <div class="ui-header">This is a header</div>
            -</div>
            -
          4. -
          5. Create a footer area by using the class="ui-footer" attribute:

            -
            <div class="ui-page">
            -   <div class="ui-footer">This is a footer</div>
            -</div>
            -
          6. - -
          7. Create the main content area by using the class="ui-content" attribute:

            -
            <div class="ui-page">
            -   <div class="ui-header">MyApplication header</div>
            -   <div class="ui-content">
            -      Hello world!
            -   </div>
            -   <div class="ui-footer">Application status line</div>
            -</div>
            -
          8. -
          9. The previous example shows a full page structure. The header and footer areas can contain multiple UI components, such as buttons or images.

            -

            The following example shows a title bar with a More Options button and an icon:

            -
            <div class="ui-page">
            -   <div class="ui-header">
            -      <h2 class="ui-title ui-icon" style="background-image: url(image.png);">Title</h2>
            -      <button type="button" class="ui-more ui-icon-overflow">More Options</button>
            -   </div>
            -   <div class="ui-content">MyApplication content</div>
            -</div>
            -
            -
          10. -
          11. -

            You can also create a popup for your page:

            -
            <div class="ui-page">
            -   <div class="ui-header">Popup Open Page</div>
            -   <div class="ui-content">
            -      <a href="#popup" class="ui-btn" data-rel="popup">Popup Open</a>
            -   </div>
            -
            -   <div id="popup" class="ui-popup">
            -      <div class="ui-popup-header">Popup Page</div>
            -      <div class="ui-popup-content">Popup Content</div>
            -   </div>
            -</div>
            -
            -

            The popup works because TAU opens (makes visible) the page whose id attribute corresponds to the #hashtag page. This is basic page routing; for more information see Page Routing.

            -
          12. -
          - -

          Creating Multiple Pages in One HTML Code

          - - -

          You can implement a template containing multiple page containers in the application's index.html file.

          -

          In a multi-page layout, the main page is defined with the ui-page-active class. If no page has the ui-page-active class, the framework automatically sets up the first page in the source order as the main page. You can improve the launch performance by explicitly defining the main page to be displayed first. If the application has to wait for the framework to set up the main page, the page is displayed with some delay only after the framework is fully loaded.

          -
          -<body>
          -   <div class="ui-page ui-page-active" id="first">
          -      <div class="ui-content">
          -         <!--CONTENT-->
          -      </div>
          -   </div>
          -
          -   <div class="ui-page" id="two">
          -      <div class="ui-content">
          -         <!--CONTENT-->
          -      </div>
          -   </div>
          -</body>
          -
          - -

          Page Routing

          - -

          TAU is basically a UI framework, but since its purpose is to ease application building, it also provides basic functionality for changing pages in multi-page applications. The mechanics behind page routing are simple, and works without any additional JavaScript code. You can use the JavaScript API to get more powerful page routing functionalities.

          - -

          To manage page routing:

          - -
            -
          • To route without JavaScript: -

            TAU routing is based on URL hash changes, and it has a built-in mechanism for history tracking. The framework responds to #hashtag changes and tries to display the page that has the id attribute equal to the hashtag value. This approach works for pages defined inside the same HTML document.

            -

            TAU uses every <a> element in the page and binds routing methods for them. In addition, all button instances that are based on that tag and have a proper href attribute work with the framework router. The active page has a ui-page-active class assigned. Set that class yourself to be sure the correct page is displayed.

            -
            <!--pageOne.html-->
            -<div class="ui-page ui-page-active" id="first">
            -   <div class="ui-content">
            -      <a href="pageTwo.html">Go to page two</a>
            -   </div>
            -</div>
            -
            -<!--pageTwo.html-->
            -<div class="ui-page" id="two">
            -   <div class="ui-content">
            -      <a href="pageOne.html">Go to page one</a>
            -   </div>
            -</div>
            -
            -

            With multiple pages in one HTML code, you can use only the ID of the page in the href attribute:

            -
            -<div class="ui-page ui-page-active" id="first">
            -   <div class="ui-content">
            -      <a href="#two">Go to page two</a>
            -   </div>
            -</div>
            -
            -<div class="ui-page" id="two">
            -   <div class="ui-content">
            -      <a href="#first">Go to page one</a>
            -   </div>
            -</div>
            -
            -
          • -
          • To route using the API: -

            You can change pages through the TAU API by using the tau.changePage() method:

            -
            <!--pageTwo.html-->
            -<div class="ui-page ui-page-active" id="first">
            -   <div class="ui-content">
            -      You are viewing the first page of the example.
            -      <button id="first-button">Click here to change to page two</button>
            -   </div>
            -   <script>
            -      var el1 = document.getElementById("first-button");
            -      el1.addEventListener("click", function ()
            -      {
            -         tau.changePage("pageTwo.html");
            -      });
            -   </script>
            -</div>
            -
            -<!--pageTwo.html-->
            -<div class="ui-page" id="second">
            -   <div class="ui-content">
            -      This is the second page of the example.
            -      <button id="second-button">Click here to change to page one</button>
            -   </div>
            -   <script>
            -      var el2 = document.getElementById("second-button");
            -      el2.addEventListener("click", function ()
            -      {
            -         tau.changePage("pageOne.html");
            -      });
            -   </script>
            -</div>
            -
            -
          • - -
          • To load pages from external resources: -

            When an external page is supplied to the routing engine, TAU fetches that page and appends it to the current document, while changing the base element's href attribute to that page path. This ensures that all other resources, such as CSS, JS, or images, are loaded from the correct path without no real page reloads. Instead, TAU simply switches the current page to the new page.

            -

            To load pages from external resources, define the proper local address in the href attribute of the link:

            -
            <div class="ui-page">
            -   <div class="ui-content">
            -      <a href="external_text.html">Change to external</a>
            -   </div>
            -</div>
            -
            -

            To create an external link that is not supposed to be handled by the TAU router, use the rel="external", data-ajax="false", or target="_self" attribute:

            -
            <div class="ui-page">
            -   <div class="ui-content">
            -      <a href="external_text.html" target="_self">Change to external</a>
            -   </div>
            -</div>
            -
            -
          • -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/moreoptions_ww.htm b/org.tizen.ui.guides/html/web/tau/moreoptions_ww.htm deleted file mode 100755 index 34aa90b..0000000 --- a/org.tizen.ui.guides/html/web/tau/moreoptions_ww.htm +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - Implementing More Options - - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Implementing More Options

          - - -

          In rectangular UI, you can implement more options using button and popup components. In the circular UI, the Selector component provides the more options button. This sample shows how to create a more options button for the circular UI.

          - - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the more options components in a rectangular and circular UI.

          -

          Figure: More options component in rectangular and circular devices

          -

          More options component in a rectangular device More options component in a circular device

          - -

          To implement the more options components:

          -
            - -
          1. Edit the HTML code to add the more options component to your application screen: -
            <div id="moreoptionsPage" class="ui-page">
            -   <link rel="stylesheet"  href="./moreoptions.css">
            -   <header class="ui-header ui-has-more">
            -        <h2 class="ui-title">More Options</h2>
            -        <button type="button" class="ui-more ui-icon-overflow">More Options</button>
            -   </header>
            -   <div class="ui-content content-padding">
            -        It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
            -
            -   </div>
            -
            -   <!-- Rectangular Profile -->
            -   <div id="moreoptionsPopup" class="ui-popup" data-transition="slideup">
            -        <div class="ui-popup-header">Options</div>
            -        <div class="ui-popup-content">
            -            <ul class="ui-listview">
            -               <li><a href="#">1</a></li>
            -               <li><a href="#">2</a></li>
            -               <li><a href="#">3</a></li>
            -            </ul>
            -        </div>
            -   </div>
            -
            -   <!-- Circular Profile -->
            -   <div id="moreoptionsDrawer" class="ui-drawer" data-drawer-target="#moreoptionsPage" data-position="right" data-enable="true" data-drag-edge="1">
            -      <div id="selector" class="ui-selector">
            -         <div class="ui-item show-icon" data-title="Show"></div>
            -         <div class="ui-item human-icon" data-title="Human"></div>
            -         <div class="ui-item delete-icon" data-title="Delete"></div>
            -         <div class="ui-item show-icon" data-title="Show"></div>
            -         <div class="ui-item human-icon" data-title="Human"></div>
            -         <div class="ui-item delete-icon" data-title="Delete"></div>
            -         <div class="ui-item x-icon" data-title="X Icon"></div>
            -         <div class="ui-item fail-icon" data-title="Fail"></div>
            -         <div class="ui-item show-icon" data-title="Show"></div>
            -         <div class="ui-item human-icon" data-title="Human"></div>
            -         <div class="ui-item delete-icon" data-title="Delete"></div>
            -         <div class="ui-item show-icon" data-title="Show"></div>
            -         <div class="ui-item human-icon" data-title="Human"></div>
            -      </div>
            -   </div>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set the visual style of the buttons: - -
            -#moreoptionsDrawer
            -{
            -   display: none;
            -}
            -
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   #moreoptionsDrawer
            -   {
            -      display: block;
            -      background-color: rgba(255, 255, 255, 0.1);
            -      border-radius: 100%;
            -   }
            -   #moreoptionsPopup
            -   {
            -      display: none;
            -   }
            -}
            -
            - -
          4. -
          5. Edit the JavaScript code to manage the option button events and other functionality: - -
            -(function()
            -{
            -   var page = document.querySelector("#moreoptionsPage"),
            -      popup = page.querySelector("#moreoptionsPopup"),
            -      handler = page.querySelector(".ui-more"),
            -      drawer = page.querySelector("#moreoptionsDrawer"),
            -      selector = page.querySelector("#selector"),
            -      helper,
            -      clickHandlerBound;
            -
            -   function clickHandler(event)
            -   {
            -      tau.openPopup(popup);
            -   }
            -   page.addEventListener( "pagebeforeshow", function()
            -   {
            -      if (tau.support.shape.circle)
            -      {
            -         helper = tau.helper.DrawerMoreStyle.create(drawer,
            -         {
            -            handler: ".drawer-handler"
            -         });
            -      }
            -      else
            -      {
            -         // Shape is square
            -         clickHandlerBound = clickHandler.bind(null);
            -         handler.addEventListener("click", clickHandlerBound);
            -
            -      }
            -
            -   });
            -
            -   page.addEventListener( "pagebeforehide", function() 
            -   {
            -      if (tau.support.shape.circle)
            -      {
            -         handler.removeEventListener("click", clickHandlerBound);
            -         helper.destroy();
            -      }
            -   });
            -})();
            -
            -
          6. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/notepad_w.htm b/org.tizen.ui.guides/html/web/tau/notepad_w.htm deleted file mode 100755 index 9719b18..0000000 --- a/org.tizen.ui.guides/html/web/tau/notepad_w.htm +++ /dev/null @@ -1,448 +0,0 @@ - - - - - - - - - - - - - Creating a Notepad UI Application - - - -
          -
          -

          Mobile Web Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating a Notepad UI Application

          - -

          The notepad application shows all the notes in the main page, and allows the user to add new notes, edit existing notes, and delete notes by swiping them. The notes on the main page can be scrolled and edited, and a button is provided for adding a new note. After you click a note, it is displayed in the edit page for editing.

          - -

          To create a simple notepad application using the TAU library:

          - -
            -
          1. Generate an application from the Tizen SDK. -

            Create a simple basic application that can be used for further development:

            -
            1. In the IDE menu, go to - File > New > Tizen Web Project > WEARABLE-2.4 > Wearable UI > Basic Application.
            2. -
            3. Enter the application name as Notes and click Finish.
            -

            The IDE creates the application with a default file structure.

            -
          2. -
          3. Edit the section header for the index.html file. -

            Because the application runs on mobile or wearable devices, make sure that you have the correct tau.css styles for the corresponding profile:

            -
            • Mobile: -
              <link rel="stylesheet" type="text/css" href="lib/tau/mobile/theme/default/tau.min.css"/>
            • -
            • Wearable: -
              <link rel="stylesheet" type="text/css" href="lib/tau/wearable/theme/default/tau.min.css"/>
              -
            -

            Add also your own styles for the application:

            -
            <link rel="stylesheet" type="text/css" href="css/style.css"/>
            -
            - -

            The following example shows how the section header looks after editing:

            -
            -<head>
            -   <meta charset="utf-8" />
            -   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
            -   <meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
            -
            -   <title>Notepad</title>
            -
            -   <!--Use 'mobile' or 'wearable' to choose the device TAU profile-->
            -   <link rel="stylesheet" type="text/css" href="lib/tau/mobile/theme/default/tau.css"/>
            -   <link rel="stylesheet" type="text/css" href="css/style.css"/>
            -</head>
            -
          4. -
          5. Create the pages: the main page for displaying the notes and the editing page for adding and editing notes. -
              -
            1. The main page is the first page, defined with the div block with the ui-page class and main id. -
              1. Add the title header (Notes) for the page: -
                -<div id="main" class="ui-page">
                -   <header class="ui-header">
                -      <h1>Notes</h1>
                -   </header>
                -</div>
                -
              2. -
              3. Add content for the main page by adding a div element with - the _ui-content class. Add to this a ul element, which creates the list of notes. -

                Set the data-scroll="y" and data-handler="true" attributes.

                -

                The item in the list is represented as a li element. When a note on the main page is clicked, the application triggers the changepage event to the editor page and shows the item.

                -
                -<div class="ui-content" data-scroll="y" data-handler="true">
                -   <ul class="ui-listview" id="notesList"></ul>
                -</div>
                -
              4. -
              5. Add a navigation button to the application to change to the editor page. The button is placed in the footer, and it is created from an a element, - which has the id="newBtn" attribute. -
                -<div class="ui-footer">
                -   <a class="ui-btn" href="javascript:void()" id="newBtn">New note</a>
                -</div>
                -
              -

              The above examples apply to a wearable application. The following example shows the full code for the main page in a mobile application:

              -
              -<div class="ui-page" id="main">
              -   <div class"ui-header" data-position="fixed">
              -      <h1>Notes</h1>
              -   </div>
              -   <div class="ui-content" data-scroll="y" data-handler="true">
              -      <ul class="ui-listview" id="notesList"></ul>
              -   </div>
              -   <div class="ui-footer">
              -      <a class="ui-btn" href="javascript:void()" id="newBtn">New note</a>
              -   </div>
              -</div>
              -
              - - - - - - - - - -
              Note
              In mobile applications, pages are constructed using the data-role attribute, while the wearable applications use the class attribute. In addition, the value of the data-role attribute in mobile applications differs from the class attribute value in the wearable applications.
              -
            2. - -
            3. On the editing page, the header and footer are similar to main page. -

              The only difference is that the action triggered after pressing the button adds an item to the items array and adds the item to the top of the visible list. The editing page is defined with a div block with the id="editor" and class="ui-page" attributes.

              -

              The editing page is needed for adding or editing a selected note. It has a textarea element to allow the user to edit the selected note.

              - -
              -<!--This code applies to wearable applications-->
              -<div class="ui-page" id="editor">
              -   <div class="ui-header">
              -      <h1>Editor</h1>
              -   </div>
              -   <div class="ui-content">
              -      <textarea id="editorField" placeholder="enter note"></textarea>
              -   </div>
              -   <div class="ui-footer">
              -      <a href="javascript:void()" id="saveBtn">Save</a>
              -   </div>
              -</div>
              -
          6. - -
          7. Link to the TAU library sources and add the script to the application: -
            -<script src="lib/jquery.js"></script>
            -<script type="text/javascript" src="lib/tau/mobile/js/tau.js" data-build-remove="false"></script>
            -<script src="js/main.js"></script>
            -
            - -

            The index.html file is now ready.

            -
          8. - -
          9. Add styles for the content: -
            -a
            -{
            -   color: #FFF;
            -}
            -
            -#notesList.ui-listview
            -{
            -   width: 100%;
            -}
            -
            -#notesList.ui-listview li
            -{
            -   margin: 0;
            -   white-space: nowrap;
            -}
            -
            -#notesList.ui-listview li .ui-inline
            -{
            -   position: absolute;
            -   right: 5px;
            -   top: 5px;
            -}
            -
            -#notesList.ui-listview li .ui-swipe-item-cover-inner
            -{
            -   text-overflow: ellipsis;
            -   overflow: hidden;
            -}
            -
            -#editor .ui-scrollview-view
            -{
            -   height: 100%;
            -}
            -
            -#editor textarea
            -{
            -   height: 95%;
            -   width: 100%;
            -}
            -
            -
          10. -
          11. Create the main.js file and create a function to close the application. -

            The application is started when the HTML content is ready.

            -
            -document.addEventListener("DOMContentLoaded", function ()
            -   {
            -      'use strict';
            -
            -      var newBtn = document.getElementById('newBtn'),
            -          saveBtn = document.getElementById('saveBtn'),
            -          editorField = document.getElementById('editorField'),
            -          notesList = document.getElementById('notesList'),
            -          editorPage = document.getElementById('editor'),
            -
            -          mainPageId = '#main',
            -          editorPageId = '#editor',
            -
            -          currentIndex = null,
            -
            -          EMPTY_CONTENT = '(empty)',
            -          STORAGE_KEY = 'notepad';
            -
            -      /**
            -      * Get data from local storage
            -      * @return {Array}
            -      */
            -      function getStorage(key)
            -      {
            -         return JSON.parse(window.localStorage.getItem(key)) || false;
            -      }
            -
            -      /**
            -      * Add data to local storage
            -      * @param {Array} data
            -      */
            -      function addStorage(data)
            -      {
            -         window.localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
            -      }
            -
            -      /**
            -      * Return current page ID
            -      * @returns
            -      */
            -      function getCurrentPageId()
            -      {
            -         return $('.ui-page:visible')[0].id;
            -      }
            -
            -      /* Refresh current page */
            -      function refreshCurrentPage()
            -      {
            -         $('#' + getCurrentPageId()).trigger('create');
            -      }
            -
            -      /**
            -      * Get notes from storage
            -      * @return {Array}
            -      */
            -      function getNotes()
            -      {
            -         return getStorage(STORAGE_KEY) || [];
            -      }
            -
            -      /* Clear list with notes */
            -      function clearNotesList()
            -      {
            -         notesList.innerHTML = '';
            -      }
            -
            -      /* Delete note from storage */
            -      function deleteNote(index)
            -      {
            -         var notes = getNotes();
            -
            -         if (notes[index] !== undefined)
            -         {
            -            notes.splice(index, 1);
            -            addStorage(notes);
            -         }
            -         else
            -         {
            -            console.error('deleteNote: note not found');
            -         }
            -
            -         showNotes();
            -         refreshCurrentPage();
            -         event.stopPropagation();
            -      }
            -
            -      /**
            -      * Edit note using array index
            -      * @param index
            -      */
            -      function editNote(index)
            -      {
            -         var notes = getNotes();
            -
            -         if (notes[index] !== undefined)
            -         {
            -            currentIndex = index;
            -            editorField.value = getNotes()[index];
            -            tau.changePage(editorPageId);
            -         }
            -         else
            -         {
            -            console.error('editNote: note not found');
            -            showNotes();
            -            refreshCurrentPage();
            -         }
            -      }
            -
            -      /* Show all notes extracted from local storage */
            -      function showNotes()
            -      {
            -         var notes = getNotes(),
            -             notesLen = notes.length,
            -             li = {},
            -             swipeCover = {},
            -             swipeItem = {},
            -             deleteBtn = {},
            -             i = 0,
            -             notesListInst;
            -
            -         clearNotesList();
            -
            -         for (i; i < notesLen; i += 1)
            -         {
            -            li = document.createElement('li');
            -            li.addEventListener('click', editNote.bind(this, i), false);
            -
            -            deleteBtn = document.createElement('button');
            -            deleteBtn.className('ui-btn');
            -            deleteBtn.setAttribute('data-inline', 'true');
            -            deleteBtn.innerText = 'Delete';
            -
            -            deleteBtn.addEventListener('click', deleteNote.bind(this, i), false);
            -
            -            li.innerText = notes[i].replace(/\n/g, ' ') || EMPTY_CONTENT;
            -            li.appendChild(deleteBtn);
            -            notesList.appendChild(li);
            -            notesListInst = tau.widget.getInstance(notesList);
            -            tau.widget.Button(deleteBtn);
            -            notesListInst.refresh();
            -         }
            -      }
            -
            -      /* Clear editor textarea */
            -      function clearEditor()
            -      {
            -         editorField.value = '';
            -      }
            -
            -      /* Save note to storage */
            -      function saveNote()
            -      {
            -         var notes = getNotes();
            -
            -         if (currentIndex !== null)
            -         {
            -            notes[currentIndex] = editorField.value;
            -         }
            -         else
            -         {
            -            notes.push(editorField.value);
            -         }
            -
            -         addStorage(notes);
            -
            -         clearEditor();
            -         showNotes();
            -         tau.changePage(mainPageId);
            -      }
            -
            -      /* New note button handler */
            -      function newNote()
            -      {
            -         currentIndex = null;
            -         clearEditor();
            -
            -         tau.changePage(editorPageId);
            -      }
            -
            -      /* On editor page show handler */
            -      function onEditorPageShow()
            -      {
            -         editorField.focus();
            -      }
            -
            -      /* Attach events */
            -      function events()
            -      {
            -         newBtn.addEventListener('click', newNote);
            -         saveBtn.addEventListener('click', saveNote);
            -
            -         editorPage.addEventListener('pageshow', onEditorPageShow);
            -
            -         window.addEventListener('tizenhwkey', function (e)
            -         {
            -            if (e.keyName === "back"
            -               && window.tizen
            -               && window.tizen.application)
            -            {
            -               switch (getCurrentPageId())
            -               {
            -                  case 'main':
            -                     window.tizen.application.getCurrentApplication().exit();
            -                     break;
            -                  default:
            -                     window.history.back();
            -                     break;
            -               }
            -               return false;
            -            }
            -         }, false);
            -      }
            -
            -      /* Initialize */
            -      function init()
            -      {
            -         showNotes();
            -         events();
            -      }
            -
            -      init();
            -   }, false);
            -
            -

            Now the application is ready and you can deploy it to a device or Emulator.

            -
          12. -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/popup_ww.htm b/org.tizen.ui.guides/html/web/tau/popup_ww.htm deleted file mode 100755 index 406406e..0000000 --- a/org.tizen.ui.guides/html/web/tau/popup_ww.htm +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - Creating Popup Buttons - - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating Popup Buttons

          - -

          You can create bottom and side popup button components with the Popup API.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figures show the layout of the popup component in a rectangular and circular UI.

          - -

          Figure: Bottom popup component in rectangular and circular devices

          - -

          Bottom popup in a rectangular device Bottom popup in a circular device

          - -

          Figure: Side popup component in rectangular and circular devices

          - -

          Side popup component in a rectangular device Side popup component in a circular device

          - -

          To implement the popup button component:

          - -
            -
          • To implement a bottom popup button component: - -

            Edit the HTML code to add the bottom popup button component to your application screen. To add the bottom button to the circular UI, you must add the ui-bottom-button class to the popup footer. The popup can have only 1 bottom button.

            -
            -<div id="bottomBtnPopup" class="ui-popup">
            -   <div class="ui-popup-content">
            -      Turning on Power
            -      saving mode will
            -      limit the maximum
            -      power
            -   </div>
            -   <div class="ui-popup-footer ui-bottom-button">
            -      <button id="bottomBtn" class="ui-btn">Check</button>
            -   </div>
            -</div>
            -
            -
          • - -
          • To implement a side popup button component: -

            Edit the HTML code to add the side popup button component to your application screen. To add side buttons for the circular UI, you must add the ui-side-button class to the popup footer. The popup can have only 2 side buttons.

            -
            -<style>
            -   .btn-icon-cancel::before {-webkit-mask-image: url(./cancel.png)}
            -   .btn-icon-ok::before {-webkit-mask-image: url(./ok.png)}
            -</style>
            -<div id="sideBtnPopup" class="ui-popup">
            -   <div class="ui-popup-content">
            -      Turning on Power
            -      saving mode will
            -      limit the maximum
            -      power
            -   </div>
            -   <div class="ui-popup-footer ui-grid-col-2 ui-side-button">
            -      <button id="sideBtn-1" class="ui-btn btn-icon-cancel">Cancel</button>
            -      <button id="sideBtn-2" class="ui-btn btn-icon-ok">OK</button>
            -   </div>
            -</div>
            -
            -
          • -
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/processing_ww.htm b/org.tizen.ui.guides/html/web/tau/processing_ww.htm deleted file mode 100755 index 51696b3..0000000 --- a/org.tizen.ui.guides/html/web/tau/processing_ww.htm +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - Creating Full Size Processing Components - - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating Full Size Processing Components

          - -

          You can create a full size processing component with the Processing API.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the processing component in a rectangular and circular UI.

          -

          Figure: The processing component in rectangular and circular device

          - -

          Processing component in a rectangular device Processing component in a circular device

          - -

          To implement the processing component:

          -
            -
          1. Edit the HTML code to add the processing component to your application screen: -
            -<div class="ui-page ui-page-active" id="pageProcessing" data-enable-page-scroll="false">
            -   <header class="ui-header">
            -      <h2 class="ui-title">Processing</h2>
            -   </header>
            -   <div class="ui-content content-padding">
            -      <div class="ui-processing"></div>
            -      <div class="ui-processing-text">
            -         Description about progress
            -      </div>
            -   </div>
            -   <div class="ui-processing ui-processing-full-size"></div>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set the visual style of the processing component: -
            -.ui-processing-full-size 
            -{
            -   display: none;
            -}
            -
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   .ui-processing 
            -   {
            -      display: none;
            -   }
            -   .ui-processing.ui-processing-full-size 
            -   {
            -      display: block;
            -   }
            -}
            -
            -
          4. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/thumbnail_ww.htm b/org.tizen.ui.guides/html/web/tau/thumbnail_ww.htm deleted file mode 100755 index dfa05f3..0000000 --- a/org.tizen.ui.guides/html/web/tau/thumbnail_ww.htm +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - Creating Thumbnails - - - -
          -
          -

          Wearable Web

          -
          - -
          -

          Related Info

          - -
          -
          - -
          -

          Creating Thumbnails

          - -

          You can create thumbnail component with the SectionChanger API.

          - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          The following figure shows the layout of the thumbnail component in a rectangular and circular UI.

          - -

          Figure: Thumbnail in rectangular and circular devices

          - -

          Thumbnail in a rectangular device Thumbnail in a circular device

          - - -

          To implement the thumbnail component:

          -
            -
          1. Edit the HTML code to add the thumbnail component to your application screen: -
            -<div class="ui-page ui-page-active" id="sectionChangerPage" data-enable-page-scroll="false" >
            -   <div id="sectionChanger" class="ui-content ui-section-changer">
            -      <div id="scroller">
            -         <section class="ui-section-active">
            -            <div class="thumbnail">1</div>
            -         </section>
            -         <section>
            -            <div class="thumbnail">2</div>
            -         </section>
            -         <section>
            -            <div class="thumbnail">3</div>
            -         </section>
            -      </div>
            -   </div>
            -</div>
            -
            -
          2. - -
          3. Edit the CSS code to set the visual style of the thumbnail: -
            -section 
            -{
            -   padding: 0 10px 0 10px;
            -   height: 100%;
            -}
            -.thumbnail 
            -{
            -   height: 300px;
            -   width: 200px;
            -   background-color: #80482f;
            -   top: 50%;
            -   transform: translate3d(0, -50%, 0);
            -   position: relative;
            -   text-align: center;
            -   line-height: 300px;
            -}
            -.ui-section-active .thumbnail
            -{
            -   background-color: #000000;
            -   border: 1px solid #a06322;
            -}
            -
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   section 
            -   {
            -      padding: 0;
            -   }
            -   .thumbnail 
            -   {
            -      height: 200px;
            -      width: 200px;
            -      border-radius: 50%;
            -      background-color: #802532;
            -      top: 50%;
            -      position: relative;
            -      text-align: center;
            -      line-height: 200px;
            -      transform: scale(0.8) translate3d(0, -60%, 0);
            -      transition: transform 300ms;
            -   }
            -   .ui-section-active .thumbnail'
            -   {
            -      transform: scale(1) translate3d(0, -50%, 0);
            -   }
            -}
            -
            -
          4. -
          5. Edit the JavaScript code to manage the thumbnail events and other functionalities: -
            -(function()
            -{
            -   var page = document.getElementById("sectionChangerPage"),
            -       sectionChanger = document.getElementById("sectionChanger");
            -
            -   page.addEventListener("pagebeforeshow", function() 
            -   {
            -      tau.widget.SectionChanger(sectionChanger, 
            -      {
            -         orientation: "horizontal",
            -         fillContent: false
            -      });
            -   });
            -})();
            -
            -
          6. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/tau/ui_component_w.htm b/org.tizen.ui.guides/html/web/tau/ui_component_w.htm deleted file mode 100755 index 2e52d9f..0000000 --- a/org.tizen.ui.guides/html/web/tau/ui_component_w.htm +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - UI Components: Managing UI Components - - - - - -
          -

          UI Components: Managing UI Components

          - - -

          Each UI component in TAU has its own selector for auto detecting in a HTML file. The most popular selectors are classes. The old style of selectors is the data-role, which is deprecated. Some UI components have also simple HTML selectors such as button (button component), or input[type=checkbox] (CheckboxRadio component).

          - - -

          Defining UI Components

          - -

          You can define UI components in 2 different ways using selectors:

          -
            -
          • With a class selector -

            It is recommended to use the class selector for each component. Class selectors in TAU are composed with ui-prefix and <COMPONENT_NAME>.

            -

            The following example shows the creation of some components with a class selector:

            -
            -<!-- Create Expandable component -->
            -<div class="ui-expandable" id="expandable-test">
            -   <h1>Expandable head</h1>
            -   <div>Content</div>
            -</div>
            -
            -<!-- Create ToggleSwitch component -->
            -<select class="ui-toggleswitch">
            -   <option value="off"></option>
            -   <option value="on"></option>
            -</select>
            -
          • -
          • With a data-role selector -

            The data-role selector in TAU composed with <COMPONENT_NAME> in lowercase.

            -

            The following example shows the creation of some components with a data-role selector:

            -
            -<!-- Create TextEnveloper component -->
            -<div data-role="textenveloper"></div>
            -
            -<!-- Create Drawer component -->
            -<div data-role="drawer">
            -   <ul data-role="listview">
            -      <li><a href="#">List item 1</a></li>
            -   </ul>
            -</div>
            -
          • -
          - -

          Setting UI Component Options

          - -

          TAU supports several ways of setting options for a UI component. For more information, see Mobile UI Components and Wearable UI Components.

          -

          You have the following options for setting the options:

          -
            -
          • Initializing options with the data- attribute -

            Various options can be set with data- attribute when the component is being created. This type of setting options is called only when the component is created. After creating the component, changing the data attributes on the HTML element do not change the component options.

            -

            The following example shows a SectionChanger code with a data- option:

            -
            <div id="hasSectionchangerPage" class="ui-page">
            -   <header class="ui-header">
            -      <h2 class="ui-title">SectionChanger</h2>
            -   </header>
            -   <div class="ui-section-changer" data-orientation="horizontal" data-circular="true" data-use-tab="true">
            -      <div>
            -         <section>
            -            <h3>LEFT1 PAGE</h3>
            -         </section>
            -         <section class="ui-section-active">
            -            <h3>MAIN PAGE</h3>
            -         </section>
            -         <section>
            -      </div>
            -   </div>
            -</div>
            -

            data-circular and data-use-tab are the initial options for creating a SectionChanger.

            -
          • - - -
          • Setting options with a manual constructor -

            Options can be also set as argument to component constructor. When using options as argument you must use the camelCase name.

            -

            The following example shows the use of manual constructor:

            -
            <div id="hasSectionchangerPage" class="ui-page">
            -   <header class="ui-header">
            -      <h2 class="ui-title">SectionChanger</h2>
            -   </header>
            -   <div class="ui-section-changer" id="sectionchanger">
            -      <div>
            -         <section>
            -            <h3>LEFT1 PAGE</h3>
            -         </section>
            -         <section class="ui-section-active">
            -            <h3>MAIN PAGE</h3>
            -         </section>
            -      </div>
            -   </div>
            -</div>
            -<script>
            -   var sectionEl = document.getElementById("sectionchanger"),
            -       sectionChangerWidget = tau.widget.SectionChanger(sectionEl, 
            -   { 
            -      orientation: "horizontal",
            -      circular: true
            -      useTab: true
            -   });
            -</script>
            -
            -
          • - -
          • Setting options with a method call -

            To set options dynamically, use the option() method.

            -
            <div id="hasSectionchangerPage" class="ui-page">
            -   <header class="ui-header">
            -      <h2 class="ui-title">SectionChanger</h2>
            -   </header>
            -   <div class="ui-section-changer" data-orientation="horizontal" data-circular="true" data-use-tab="true">
            -      <div>
            -         <section>
            -            <h3>LEFT1 PAGE</h3>
            -         </section>
            -         <section class="ui-section-active">
            -            <h3>MAIN PAGE</h3>
            -         </section>
            -         <section>
            -      </div>
            -   </div>
            -</div>
            -<script>
            -   var sectionEl = document.getElementById("sectionchanger"),
            -       sectionChangerWidget = tau.widget.SectionChanger(sectionEl);
            -
            -   sectionChangerWidget.option("circular", true);
            -</script>
            -
            -
          • -
          - -

          Managing UI Components with jQuery

          -

          You can use jQuery with TAU for convenience. Also for backward compatibility, TAU supports the jQuery interface for UI components. However, it is strongly recommended to use new TAU style.

          -

          To manage the UI components if the jQuery library is loaded:

          -
            -
          1. Create the UI component: -
            <div class="ui-indexscrollbar" id="indexscrollbar"></div>
            -<script>
            -   $("#indexscrollbar").indexscrollbar();
            -</script>
            -
          2. -
          3. Use the call methods: -
            $(".selector").componentName("methodName", argument1, argument2, ...);
            -
            <div class="ui-indexscrollbar" id="indexscrollbar"></div>
            -<script>
            -   /* If the IndexScrollBar component is created */
            -   $("#indexscrollbar").indexscrollbar("destroy");
            -</script>
            -
          4. -
          - - - - -
          - -Go to top - - - - - - - diff --git a/org.tizen.ui.guides/html/web/w3c/animation_w.htm b/org.tizen.ui.guides/html/web/w3c/animation_w.htm deleted file mode 100755 index 3d34691..0000000 --- a/org.tizen.ui.guides/html/web/w3c/animation_w.htm +++ /dev/null @@ -1,336 +0,0 @@ - - - - - - - - - - - - - CSS Animations Module Level 3: Creating Animations - - - - - - -
          -

          CSS Animations Module Level 3: Creating Animations

          - -

          Animations (like transitions) change the presentational value of the CSS properties over time. The principal difference between animations and transitions is that while transitions are triggered implicitly when property values change, animations are explicitly executed when the animation properties are applied. This means that for animations, you must use animation keyframes to define explicit values for the properties being animated.

          - -

          When using the CSS animation properties, the Tizen browser requires the -webkit- prefix.

          - -

          Keyframes

          -

          The CSS animations work based on @-webkit-keyframes rules defined for specific elements. The rules can define various property changes complementing the simple running of a transition.

          -

          If the animation only has one set of changes over its whole iteration, the rule values can be assigned with a from {} to {} rule, where from is the beginning of the animation at 0% and to is the end at 100%. If there are multiple changes required, you can define their exact time periods using multiple <number>% {} rules that together cover the entire animation iteration from 0% to 100%.

          -

          The following code snippet demonstrates how to use keyframes. For a complete source code, see animation_keyframes.html

          -
          -<style type="text/css">
          -
          -   @-webkit-keyframes boxani 
          -   {
          -      from {left: 0; top: 0;}
          -      to {left: 100px; top: 100px;}
          -   }
          -   @-webkit-keyframes boxani_case01 
          -   {
          -      0% {left: 0; top: 0;}
          -      25% {left: 100px; top: 0;}
          -      50% {left: 100px; top: 100px;}
          -      75% {left: 0; top: 100px;}
          -      100% {left: 0; top: 0;}
          -   }
          -
          -</style>
          -
          - -

          Animation Properties

          - -

          You can define various properties for an animation to control how it is played:

          - -
            -
          • animation-name -

            This property uses the name defined in the @-webkit-keyframes rules to play the animation.

          • - -
          • animation-duration -

            This property defines how long one iteration of the animation takes.

          • - -
          • animation-iteration-count -

            This property defines how many times the animation is repeated. If the value is set as infinite, the repetitions are unlimited.

          • - -
          • animation-timing-function -

            This property defines the pace of the animation.

          • - -
          • animation-direction -

            This property defines the replay direction. The reverse value plays the animation from 100% keyframe to 0% keyframe, while the alternate value plays the animation normally during odd iterations, and from 100% keyframe to 0% keyframe during even iterations.

          • - -
          • animation-play-state -

            This property defines the replay status of the animation. The paused value temporarily stops the animation.

          • -
          • animation-delay -

            This property defines the delay time before the start of the animation.

          • - -
          • animation-fill-mode -

            This property defines the state of the animation before or after the animation is played. The forwards value maintains the last value of the keyframe rule when the animation is over, while the backwards value fills up the first value of the keyframe rule when the animation with the animation-delay property is in a standby state. The both value covers both the start and the end of the animation.

          - -

          The following code snippet demonstrates how to use animation properties. For a complete source code, see:

          - - -
          -<head>
          -   <style type="text/css">
          -      .box 
          -      {
          -         -webkit-animation-name: boxani;
          -         -webkit-animation-duration: 5s;
          -         -webkit-animation-iteration-count: infinite;
          -         -webkit-animation-timing-function: linear;
          -         -webkit-animation-direction: normal;
          -         -webkit-animation-delay: 1s;
          -         -webkit-animation-fill-mode: none;
          -      }
          -
          -      .box.case01: hover 
          -      {
          -         -webkit-animation-play-state: paused;
          -         -webkit-animation-fill-mode: forwards;
          -      }
          -   </style>
          -</head>
          -
          -<body>
          -   <h1>animation-name</h1>
          -   <div class="boxarea">
          -      <div class="box">
          -         <p>animate</p>
          -         <p>animation-name: boxani;</p>
          -      </div>
          -   </div>
          -   <div class="boxarea">
          -      <div class="box case01">
          -         <p>animate</p>
          -         <p>animation-name: boxani_case01;</p>
          -      </div>
          -   </div>
          -</body>
          -
          - - - - - - - - - -
          Note
          The hover pseudo class in Tizen maintains a mouseover state when an element is tapped, and becomes a mouseout state when another element is tapped.
          - -

          The animation property allows you to define all the animation properties in a shorthand mode in the order of animation-name | animation-duration | animation-timing-function | animation-delay | animation-iteration-count | animation-direction | animation-fill-mode. If you omit a property value, a default value is used instead.

          - -
          -<style type="text/css">
          -   .box 
          -   {
          -      width: 150px; height: 100px; background: Coral; position: relative;
          -      -webkit-animation: boxani 3s ease 1s infinite alternate backwards;
          -   }
          -</style>
          -
          - -

          Creating a Logo Animation

          - -

          To enhance the user experience of your application, you must learn to create a logo animation, where element properties can be assigned and changed for each element and keyframe. The logo animation is similar to the animation that appears when a Tizen device (or Emulator) is switched on:

          - -
            -
          1. No elements are initially shown on the screen.
          2. -
          3. The Tizen logo gradually appears in the middle of the screen, and as it moves to the right, it becomes smaller.
          4. -
          5. Each letter in the word "TIZEN" consecutively comes in from the left of the screen and moves to the right to its correct location.
          6. -
          -

          Figure: Logo animation (in mobile applications only)

          -

          Logo animation

          -

          To create a logo animation:

          -
            -
          1. Create the HTML layout for the animation. To be able to manage the movement of each animation part separately, you must define individual elements for each part. -
            -<div class="animation-holder">
            -   <span class="tizen-txt t"></span>
            -   <span class="tizen-txt i"></span>
            -   <span class="tizen-txt z"></span>
            -   <span class="tizen-txt e"></span>
            -   <span class="tizen-txt n"></span>
            -   <span class="tizen-txt tm"></span>
            -   <span class="tizen-logo"></span>
            -</div>
            -
            -
          2. -
          3. Define the basic style for the animation: -
            -.example-body {width: 320px; height: 480px; background: #000; margin: 0 auto; 
            -               position: relative; border: 2px solid #fff; overflow: hidden;}
            -.animation-holder {width: 280px; height: 88px; position: absolute; 
            -                   left: 50%; top: 50%; margin: -54px 0 0 -140px;} 
            -
            -.tizen-txt, .tizen-logo {position: absolute; display: block; 
            -                         background-repeat: no-repeat; background-position: 50% 50%}
            -.tizen-txt.t {width: 48px; height: 56px; background-image: url(images/txt_t.png);}
            -.tizen-txt.i {width: 15px; height: 56px; background-image: url(images/txt_i.png);}
            -.tizen-txt.z {width: 46px; height: 56px; background-image: url(images/txt_z.png);}
            -.tizen-txt.e {width: 45px; height: 56px; background-image: url(images/txt_e.png);}
            -.tizen-txt.n {width: 54px; height: 58px; background-image: url(images/txt_n.png);}
            -.tizen-txt.tm {width: 11px; height: 6px; background-image: url(images/txt_tm.png);}
            -.tizen-logo {width: 220px; height: 211px; left: 30px; top: -61px; 
            -             background-image: url(images/logo_tizen.png); background-size: 100% 100%;}
            -
            -
          4. -
          5. Create the animation: -
              -
            1. To ensure that all the animation elements are played within the same time frame, some common properties are defined for the animation. The animation movement time is 7 seconds, and the animation repeats infinitely. -

              When an animation that repeats itself is activated, it can look unnatural when it suddenly returns to its initial position after finishing an iteration. To make the repetition move naturally, set the animation-direction property to alternate. The alternate direction means that during the odd iterations the animation proceeds in the normal direction (from the 0% keyframe to the 100% keyframe), while during the even iterations the keyframes are played in the opposite direction from 100% to 0%.

              -
              -.tizen-txt, .tizen-logo 
              -{
              -   -webkit-animation-duration: 7s;
              -   -webkit-animation-iteration-count: infinite;
              -   -webkit-animation-direction: alternate;
              -}
              -
              -
            2. -
            3. Create the keyframes to implement the flow for the Tizen logo: -
                -
              • During the first 25% of the animation total playing time (7 seconds), the transparency disappears and the Tizen logo appears.
              • -
              • During the 25 - 50% of the playing time, the logo size becomes smaller as the width and height values are reduced, and due to the left and top value, the logo is positioned to the top right corner of the screen.
              • -
              • During the 50 - 100% of the playing time, the values do not change, and the logo remains in its new position.
              • -
              -

              -
              -@-webkit-keyframes tizen-logo 
              -{
              -   0% {width: 220px; height: 211px; left: 30px; top: -61px; opacity: 0;}
              -   25% {width: 220px; height: 211px; left: 30px; top: -61px; opacity: 1;}
              -   50% {left: 247px; top: 0px; width: 33px; height: 32px; opacity: 1;}
              -   100% {left: 247px; top: 0px; width: 33px; height: 32px; opacity: 1;}
              -}
              -
              - - - - - - - - - - -
              Note
              If the 100% keyframe is not defined, the animation is executed based on the original properties, and the logo size increases to its original size at the end.
            4. -
            5. Create the keyframes to implement the flow for each letter in the word "TIZEN": -
                -
              • To hide the letter initially, the property has been assigned outside the screen at the 0% keyframe. To allow the Tizen logo to appear first, the first letter is introduced at the 30% keyframe.
              • -
              • To create a slight collision animation, the letter element moves to -10 px of the final value at the 40% keyframe before reaching its final 0 px value at the 45% keyframe.
              • -
              • The animation-timing-function property can be changed for each keyframe point, and is used to determine the pace of the animation. When the letter is actually shown on the screen and moved to its final location, the ease in and out timing functions are used.
              • -
              - -

              To show the letters one at a time, the timing is pushed back a bit more for each consecutive letter:

              -
              -<!--Letter T-->
              -@-webkit-keyframes tizen-txt-t 
              -{
              -   0% {left: 340px; top: 31px;}
              -   30% {left: 340px; top: 31px; animation-timing-function: ease-in;}
              -   40% {left: -10px; top: 31px; animation-timing-function: ease-out;}
              -   45% {left: 0; top: 31px;}
              -   100% {left: 0; top: 31px;}
              -}
              -
              -<!--Letter I-->
              -@-webkit-keyframes tizen-txt-i 
              -{
              -   0% {left: 340px; top: 31px;}
              -   40% {left: 340px; top: 31px; animation-timing-function: ease-in;}
              -   50% {left: 47px; top: 31px; animation-timing-function: ease-out;}
              -   55% {left: 57px; top: 31px;}
              -   100% {left: 57px; top: 31px;}
              -}
              -
              -<!--Remaining letters-->
              -
            6. - -
            7. After creating all the keyframes, define the animation-name property for each element:

              -
              -.tizen-txt.t 
              -{
              -   -webkit-animation-name: tizen-txt-t;
              -}
              -.tizen-txt.i 
              -{
              -   -webkit-animation-name: tizen-txt-i;
              -}
              -
            8. - -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/background_w.htm b/org.tizen.ui.guides/html/web/w3c/background_w.htm deleted file mode 100755 index 609ad9e..0000000 --- a/org.tizen.ui.guides/html/web/w3c/background_w.htm +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - - - CSS Backgrounds and Borders Module Level 3: Specifying Background and Border Styles - - - - - - -
          -

          CSS Backgrounds and Borders Module Level 3: Specifying Background and Border Styles

          - -

          You can manage the CSS properties for specifying the border style or background of any HTML element.

          - -

          When creating a background for an element, you can use the following properties:

          -
            -
          • background-color -

            Defines the color of the background.

          • -
          • background-image -

            Defines the image to be used. You can add images as separate layers to an element. To add multiple images, separate them by commas to add each image as a separate layer. The images are added in the order they are defined.

          • -
          • background-position -

            Defines the exact position of the image.

          • -
          • background-repeat -

            Defines whether the image is repeated to fill the entire background (in case the image is too small to do it otherwise).

          • -
          • background-origin -

            Defines the position of the initial background for the item.

          • -
          • background-size -

            Defines the size of the image in the background.

          • -
          • background-clip -

            Defines the area of the cropped background element.

          • -
          - -

          The border properties specify the line thickness, style, and color for the element border. You can define the border using 3 separate properties (border-width, border-style, and border-color), or by listing the values for all 3 properties together in 1 border property. To define rounded corners for the border, you can additionally use the border-radius property.

          - -

          To define shading for an element, you can define the horizontal and vertical offset, blur radius, and the spread distance values within the box-shadow property. To switch the shadow from outside to inside the element, add the inset keyword to the property too.

          - -

          The following image shows a simple background color (top left), a background image (top right), multiple images with a solid black border (bottom left), and an element with shading and a solid black border with rounded corners (bottom right). The background image at top right is automatically repeated to cover the entire background, while the images at bottom left are not repeated due to the background-repeat property value.

          - -

          Figure: Background examples

          -

          Background examples

          -

          The following code snippet demonstrates how to set the background color, images, borders, and shadings.

          - -
          -<!--Background color-->
          -#one 
          -{
          -   width: 180px;
          -   height: 40px;
          -   background-color: lightblue;
          -}
          -
          -<!--Background image--> 
          -#one 
          -{
          -   width: 200px;
          -   height: 100px;
          -   background-color: #00F;
          -   background-image: url(t3.png);
          -}
          -
          -<!--Multiple images--> 
          -#multi 
          -{
          -   width: 155px;
          -   height: 100px;
          -   border: 1px solid #000;
          -   background-color: #87CEFA;
          -   background-image: url(t1.png), url(t2.png), url(t3.png);
          -   background-position: center center, 20% 100%, top left;
          -   background-repeat: no-repeat;
          -}
          -
          -<!--Shading and border with rounded corners-->
          -#shading 
          -{
          -   width: 160px;
          -   height: 40px;
          -   border: 1px solid #000;
          -   border-radius: 20px;
          -   background-color: #88f;
          -   box-shadow: #888 10px 10px;
          -}
          -
          - -

          Creating Backgrounds

          - -

          To enhance the user experience of your application, you must learn to create a multilayer background with the parallax effect using the CSS box model. The background consists of 3 images on separate layers, and 2 of the layers can be moved over each other.

          - -

          Figure: Background with the parallax effect

          -

          Background with the parallax effect

          - -
          1. Prepare 3 images (tizen.png, tizen2.png, and dot.png), each with a transparent background. - -

            tizen.png, tizen2.png, and dot.png images

          2. - -
          3. Create a div element with id="parallelexample" and a slider input element with the minimum, maximum, and initial value: -
            -<div id="parallelexample"></div>
            -<input id="position" type="range" min="1" max="200" value="50">
            -
          4. - -
          5. Define the needed styles for the div element in the <head> section using the parallelexample ID. -

            Define a background using the prepared images in the correct order. The images are shown in the order they have been added, with the first image on the topmost layer. Use the same order when defining the background position for each image.

            -
            -#parallelexample
            -{
            -   width: 300px;
            -   height: 300px;
            -   background-image: url(tizen2_32.png), url(tizen3_32.png), url(dot.png);
            -   background-position: 6.25em 8em, 3.125em 4em, center top;
            -   background-repeat: repeat, repeat, repeat;
            -   border: 1px solid black;
            -   margin: 0px auto;
            -}
            -
          6. -
          7. To create the parallax effect, create a method that moves the background layers by changing the horizontal position values of the images in the div element. To determine the position value change, add an onchange event handler for the slider to determine the change based on the slider handle movement. -
            -function moveLayers() 
            -{
            -   /* Get slider value */
            -   var poz = document.getElementById('position');
            -   /* Get the div element */
            -   var example = document.getElementById('ParallaxExamle');
            -   /* Add the event handler */
            -   poz.onchange = function()
            -   {
            -      var layer1 = this.value/8, layer2 = this.value/16;
            -      example.style.backgroundPosition = layer1 +'em 8em, ' 
            -                                         + layer2 + 'em 4em, center top';
            -   }
            -}
            -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/basic_ui_w.htm b/org.tizen.ui.guides/html/web/w3c/basic_ui_w.htm deleted file mode 100755 index 3090acb..0000000 --- a/org.tizen.ui.guides/html/web/w3c/basic_ui_w.htm +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - CSS Basic User Interface Module Level 3 (CSS3 UI): Applying Styles to HTML Documents - - - - - - -
          -

          CSS Basic User Interface Module Level 3 (CSS3 UI): Applying Styles to HTML Documents

          - -

          You can apply styles to HTML documents.

          -

          The CSS3 version has caused changes in the Selector, Color, Web Form, and Fonts CSS modules. In addition, the CSS3 UI API also handles changes related to the following user interface items:

          -
            -
          • User interface selectors -

            The CSS Selector is an essential module for applying a CSS to HTML in order to enable the DOM element selection. The pseudo-element selectors can be used to assign the user interface state. With the selectors, you can change the Web form style according to the user input without using JavaScript.

          • - -
          • Box model properties -

            A box model refers to all DOM elements excluding design elements, such as <br> and <i>. The box model area is set as defined in the following figure.

            -
              -
            • Content: Content area
            • -
            • Padding: Gap between the content and boundary
            • -
            • Border: Boundary
            • -
            • Margin: Overall size of the box model
            • -
            -

            Figure: Box model structure

            -

            Figure: Box model structure

            - -

            You can use the box model properties to assign styles to the selected DOM elements:

            -
              -
            • The box-sizing property assigns the box size range.
            • -
            • The outline properties make the box outstanding.
            • -
            • The text-overflow property handles the text extending outside the box.
            -
          • -
          - -

          Using Pseudo-element Selectors

          - -

          To enhance the user experience of your application, you must learn how to use pseudo-element selectors:

          -
            -
          1. Use the pseudo-classes, such as :enabled and :disabled, to add different styles based on the state of the DOM elements:

            -
            input: enabled {border: 1px solid blue}
            -input: disabled {border: 1px solid red}
            - - - - - - - - - -
            Note
            In the versions prior to CSS3, pseudo-elements, such as :hover, :active, and :focus, were used, and required an attribute selector. Since the :enabled and :disabled classes are not influenced by the display and visibility attributes, they improve the accessibility.
          2. -
          3. To control the state of the HTML5 Web Forms (in mobile or wearable applications), use the :in-range and :out-of-range pseudo-classes. -

            They check for any values that have exceeded the inserted range. (The following figure applies to mobile applications only.)

            -
            -<!--HTML--> 
            -<input type="number" step="10" min="10" max="100">
            -
            -
            -<!--CSS-->
            -input[type="number"]: in-range {border: 3px solid blue; width: 90%}
            -input[type="number"]: out-of-range {border: 3px solid red; width: 90%}
            -
            -

            Element ranges (in mobile applications only)

          4. -
          5. To apply different styles to required input items and option items, use the :required and :optional pseudo-classes. (The following figure applies to mobile applications only.) -
            -<!--HTML-->
            -<fieldset>
            -   <legend>required and optional</legend>
            -   <label>email: <input type="email" required></label>
            -   <label>password: <input type="Password" placeholder="required area" required></label>
            -
            -   <label>date: <input type="date" placeholder="You know what to do, huh?"></label>
            -   <textarea placeholder="Comment"></textarea>
            -</fieldset>
            -
            -<!--CSS-->
            -input: required, textarea: required {border: 1px solid red}
            -input: optional, textarea: optional {border: 1px solid #777}
            -
            -

            Required and optional elements (in mobile applications only)

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - -

          Using Box Model Properties

          - -

          To enhance the user experience of your application, you must learn how to use box model properties:

          - - - - - - - - - -
          Note
          The properties dependent on mouse and keyboard functions are not discussed in this tutorial.
          -
            -
          1. To assign the area that is included in the width and height of the box automatically, use the box-sizing property. To assign the width without a margin, use the box-sizing: border-box property. -
            -div.content-box {box-sizing: content-box} <!--width (height) = content-->
            -div.border-box {box-sizing: border-box} <!--width (height) = content + padding + border-->
            -div.border-box: before {height: 40px}
            -
          2. - -
          3. To draw an outline without using up the area, use the outline property: -
            -.Test-Box {outline: 5px dashed red}
            -.outline: before {outline: 2px dashed red}
            -.outline-offset: before {outline-offset: 35px}
            -
          4. - -
          5. To handle text that exceeds the area of the box model, use the text-overflow property. The text-overflow: ellipsis property is used to indicate the text exceeded the padding area as '...'. -
            div 
            -{
            -   width: 250px;
            -   margin: 20px auto;
            -   padding: 20px 30px;
            -   background-color: #eee;
            -   color: #333;
            -   border: 5px solid #333;
            -   font-weight: bold;
            -   overflow: hidden;
            -   white-space: nowrap;
            -}
            -
            -.clip {text-overflow: clip}
            -.ellipsis {text-overflow: ellipsis}
          6. -
          - -

          The following figure illustrates the box model properties; from left to right, it shows the effects of the box sizing, outline, and text overflow properties.

          -

          Figure: Box model properties (in mobile applications only)

          -

          Box model properties (in mobile applications only)

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/clipboard_mw.htm b/org.tizen.ui.guides/html/web/w3c/clipboard_mw.htm deleted file mode 100755 index aede950..0000000 --- a/org.tizen.ui.guides/html/web/w3c/clipboard_mw.htm +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - - - - - - - - Clipboard API and events: Transferring Content Between Applications - - - - - -
          -

          Clipboard API and events: Transferring Content Between Applications

          - - -

          The clipboard and events feature is used for cutting, copying, and pasting content to easily transfer it between Web applications.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          The main features of Clipboard API and events include:

          - - -

          Copying Content

          - -

          To enhance the user experience of your application with clipboard operations, you must learn to use the copy event:

          -
            -
          1. Add an event listener to detect the copy event: -
            -<script>
            -   document.addEventListener("copy", function(e)
            -   {
            -      copyHandler(e);
            -   }, false);
            -
          2. -
          3. When you start copying, the copy event is fired and the copyHandler() method is called.

            -

            Stop the system clipboard basic operation and set the range you want to copy:

            -
               function copyHandler(e) 
            -   {
            -      e.preventDefault();
            -
            -      var range = window.getSelection();
            - - - - - - - - - -
            Note
            If the current selection is not influenced and there is no selected range, the clipboard imports the setData() method. The copied content cannot be edited apart from adding a DataTransferItemList item.
            -
          4. -
          5. Store the data of the selected range: -
                  e.clipboardData.setData("text/plain", range);
            -   };
            -</script>
            -
            -
          6. -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Cutting Content

          - -

          To enhance the user experience of your application with clipboard operations, you must learn to use the cut event:

          -
            -
          1. Add an event listener to detect the cut event: -
            -<script>
            -   document.addEventListener("cut", function(e) 
            -   {
            -      cutHandler(e);
            -   }, false);
            - -
          2. -
          3. When you start cutting, the cut event is fired and the cutHandler() method is called.

            -

            Stop the system clipboard basic operation and set the range you want to cut:

            -
               function cutHandler(e) 
            -   {
            -      e.preventDefault();
            -
            -      var range = window.getSelection();
            - -
          4. -
          5. Store the data of the selected range: -
                  e.clipboardData.setData("text/plain", range);
            -   };   
            -</script>
            -
            - - - - - - - - - -
            Note
            Before the setData() method is imported, the basic motion of the system event must be cancelled using the preventDefault() method. Otherwise, the data to be allocated to the clipboard is overwritten by the system clipboard.
            -
          6. -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Pasting Content

          - -

          To enhance the user experience of your application with clipboard operations, you must learn to use the paste event:

          -
            -
          1. Add an event listener to detect the paste event: -
            -<script>
            -   document.addEventListener("paste", function(e)
            -   {
            -      pasteHandler(e);
            -   }, false);
            -
          2. -
          3. When you start pasting, the paste event is fired and the pasteHandler() method is called.

            -

            Stop the system clipboard basic operation:

            -
               function pasteHandler(e) 
            -   {
            -      e.preventDefault();
            -
          4. -
          5. Paste the clipboard data to the target using the getData() method: -
            -      pasteTarget.innerHTML = e.clipboardData.getData("text/plain");
            -   };              
            -</script>
            -
            -
          6. -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Copying and Pasting Content into an Editable Element

          - -

          To enhance the user experience of your application with clipboard operations, you must learn to copy content and paste it in an editable HTML element:

          - -
            -
          1. Define the editable element into which copied data is to be pasted:

            -
            -<head>
            -   <style>
            -      .log {border: 1px solid #d9d9d9; margin: 10px; padding: 5px;}
            -      .target {border: 1px solid #36c; margin: 10px; padding: 5px;}
            -   </style>
            -</head>
            -<body>
            -   <h1>Clipboard API</h1>
            -   <div style="width: 300px; height: 100px; border: 1px solid #d9d9d9" contenteditable>
            -      Edit Section
            -   </div>
            -   <div  class="target">
            -      <h4>Target Element</h4>
            -      <p id="target contenteditable">Paste content</p>
            -   </div>
            -   <div id="ev-log" class="log">Event log</div>
            -   <div contenteditable>
            -      This section is informative
            -      This specification defines the common clipboard operations of cutting, 
            -      copying and pasting, in such a way that they are exposed to Web Applications 
            -      and can be adapted to provide advanced functionalities. 
            -      Its goal is to provide for compatibility where possible with existing implementations.
            -   </div>
            -<body>
            -
            -
          2. - -
          3. Add event listeners to detect the copy and paste events:

            -
            -<script>
            -   var pasteTarget = document.getElementById("target");
            -   var evLogBox = document.getElementById("ev-log");    
            -
            -   document.addEventListener("copy", function(e)
            -   {
            -      copyHandler(e);
            -   }, false);
            -
            -   document.addEventListener("paste", function(e)
            -   {
            -      pasteHandler(e);
            -   }, false);
            -
            -
          4. - -
          5. When the copy event occurs, stop the system clipboard basic operation and set the range you want to copy: -
            -   function copyHandler(e) 
            -   {
            -      e.preventDefault();
            -
            -      var range = window.getSelection();
            -
          6. -
          7. Store the data of the selected range: -
                  e.clipboardData.setData("text/plain", range);
            -      evLogBox.innerHTML = "Event log : copy";
            -   };
            -
          8. -
          9. When the paste event occurs, stop the system clipboard basic operation and paste the clipboard data to the target using the getData() method: -
               function pasteHandler(e) 
            -   {
            -      e.preventDefault();
            -
            -      pasteTarget.innerHTML = e.clipboardData.getData("text/plain");
            -      evLogBox.innerHTML = "Event log : paste";
            -   };  
            -</script>
            -
            -
          10. -
          - -

          Figure: Copying and pasting

          -

          Copying and pasting

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/color_w.htm b/org.tizen.ui.guides/html/web/w3c/color_w.htm deleted file mode 100755 index 1a478a5..0000000 --- a/org.tizen.ui.guides/html/web/w3c/color_w.htm +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - CSS Color Module Level 3: Specifying Color and Opacity - - - - - - -
          -

          CSS Color Module Level 3: Specifying Color and Opacity

          - -

          You can manage the CSS properties for specifying the color and opacity of an HTML element, and the CSS color value type.

          - - - - - - - - - - -
          Note

          The CSS2 System Color values have been deprecated in favor of the CSS3 UI 'appearance' property.

          - -

          You can specify the color of an element with the following formats:

          -
            -
          • Keyword values -

            You can use basic keywords, such as red, green, blue, or deepskyblue, as defined in Extended color keywords.

            -

            The currentColor keyword can be used with all properties that accept a color value (borders, box shadows, outlines, or backgrounds). The computed value of the currentColor keyword is the computed value of the color property. If the currentColor keyword is set on the color property itself, it is treated as color: inherit. -

            -

            You can use the transparent keyword with all properties that accept a color value (borders, box shadows, outlines, or backgrounds), to turn the element in question transparent (invisible).

            -
          • -
          • RGB values -
              -
            • In hexadecimal notation -

              The format is '#' followed by either 3 or 6 hexadecimal characters. The 3-digit RGB notation (#rgb) is converted into a 6-digit form (#rrggbb) by replicating digits. For example, #fc0 expands to #ffcc00.

            • -
            • In functional notation -

              The format is 'rgb(' followed by a comma-separated list of 3 numerical values (integer or percentage) followed by ')'. The integer value 255 corresponds to 100%, and to F or FF in a hexadecimal notation: rgb(255, 255, 255) = rgb(100%, 100%, 100%) = #FFF. White space characters are allowed around the numerical values. -

            • -
            -
          • -
          • RGBA values -

            The RGB color model is extended to include "alpha" to allow the color opacity to be specified. The RGBA values are defined using functional notation where the final value is the alpha (range from 0.1 to 1). For example: rgba(255, 0, 0, 0.7).

            -
          • -
          • HSL value -

            You can use numerical hue-saturation-lightness (HSL) colors as an alternative to numerical RGB colors. The HSL colors are encoded as a triple (hue, saturation, lightness). The hue is represented as the angle of the color circle, where by definition red=0°=360° and other colors are spread around the circle. The saturation and lightness are represented as percentages, where 100% is full saturation or black lightness, and 0% is a shade of gray or white lightness. 50% lightness is "normal". For example: hsl(0, 100%, 50%). -

          • -
          • HSLA value -

            The HSL color model is extended to include "alpha" to allow the color opacity to be specified. The HSLA values are defined using the HSL notation where a final alpha value is added (range from 0.1 to 1). For example: hsla(120, 100%, 50%, 0.8).

          • -
          -

          The following code snippet demonstrates how to specify a color for an element. For a complete source code, see:

          - -
          -<!--Keywords-->
          -#one
          -{
          -   color: blue;
          -   background: white;
          -   border: 1px solid springgreen;
          -}
          -#one span 
          -{
          -   background: currentColor;
          -}
          -#one span.hide
          -{
          -   color: transparent;
          -}
          -
          -<!--RGB-->
          -#two
          -{
          -    color: #ff0000;
          -}
          -
          -<!--RGBA-->
          -#three
          -{
          -   color: rgba(100%, 0, 0, 0.5);
          -}
          -
          -<!--HSL-->
          -#four
          -{
          -   color: hsl(0, 100%, 50%);
          -}
          -
          -<!--HSLA-->
          -#five
          -{
          -   color: hsla(0, 100%, 50%, 0.5);
          -}
          -
          - -

          Creating a Color Generator

          - -

          To enhance the user experience of your application, you must learn to create a HSLA color generator to set the color value for an element in the HSLA format.

          - -

          Figure: HSLA color generator

          -

          HSLA color generator

          - - - -
          1. To create the color generator, define 2 <div> elements for displaying the HSLA value as text and in a color box. You also need 4 slider inputs for defining the HSLA color: -
              -
            • The first input has a range of 0 - 360 and represents hue.
            • -
            • The second and third inputs have a range of 0 - 100 and represent saturation and lightness.
            • -
            • The last input has a range of 0 - 10 and represents alpha transparency. -

              The range should be 0.1 - 1, but the minimum value of the min attribute is 0 so the value can be divided by 10.

            - -
            -<div id="color-generator">
            -   <div id="text-box"></div>
            -   <div id="color-box"></div>
            -
            -   <label>Hue</label>
            -   <input id="hue" value="0" type="range" min="0" max="360">
            -
            -   <label>Saturation</label>
            -   <input id="saturation" value="100" type="range" min="0" max="100">
            -
            -   <label>Lightness</label>
            -   <input id="lightness" value="50" type="range" min="0" max="100">
            -
            -   <label>Alpha</label>
            -   <input id="alpha" value="10" type="range" min="0" max="10">
            -</div>
            -
          2. -
          3. Obtain the values from the slider inputs with the getElementById method. Remember to divide the alpha value by 10 to reach the correct range of 0.1 - 1. -
            -var h = document.getElementById('hue').value,
            -    s = document.getElementById('saturation').value,
            -    l = document.getElementById('lightness').value,
            -    a = document.getElementById('alpha').value / 10;
            -
          4. -
          5. Set the HSLA text and the color of the color box by defining the color from the inputs in the HSL and HSLA formats. -

            If the alpha is 1, the HSL format is displayed. Otherwise, the HSLA format is used.

            -
            -/* Define formats */
            -hsl = 'hsl(' + h + ', ' + s + '%, ' + l + '%)';
            -hsla = 'hsla(' + h + ', ' + s + '%, ' + l + '%, ' + a + ')';
            -
            -/* Set the color of the box */
            -cBox = document.querySelector('#color-box'),
            -
            -/* Set the text */
            -tBox = document.querySelector('#text-box');
            -
          6. - -
          7. Add an event handler to the input sliders to change the displayed text and color box color when the slider values change. -
            -var inputs = document.querySelectorAll('#color-generator input[type=range]');
            -			
            -for (i = 0; i < inputs.length; i++)
            -{
            -   inputs[i].onchange = function()
            -   {
            -      /* Show color */
            -   }
            -}
            -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/drag_drop_mw.htm b/org.tizen.ui.guides/html/web/w3c/drag_drop_mw.htm deleted file mode 100644 index 86924fd..0000000 --- a/org.tizen.ui.guides/html/web/w3c/drag_drop_mw.htm +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - - - - - - - - HTML5 Drag and drop: Handling Drag and Drop Events - - - - - -
          -

          HTML5 Drag and drop: Handling Drag and Drop Events

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          HTML5 drag and drop activates through event-based JavaScript and added attributes. -

          -

          -The main features of the HTML5 Drag and drop API include: -

          -
            -
          • Using drag and drop -

            To make an element draggable, add the draggable="true" attribute to it. Only elements thus defined as draggable can generate drag and drop events.

            -

            A drag and drop requires a source, target, and data. It is used through the following events:

            -
            • dragstart
            • -
            • drag
            • -
            • dragleave
            • -
            • dragenter
            • -
            • dragover
            • -
            • drop
            • -
            • dragend
            -

            The dragstart and drop events send data through the DataTransfer interface.

            -
          • -
          • Transferring data -

            You can transfer data from the drag source to the drop target. The DataTransfer interface instance receives the dragstart event and fills itself with the data to be transferred. It then receives a drop event, and puts the data into the drop target.

          • -
          - - - - - - - - - - -
          Note
          To use drag and drop in a Tizen device, long-press the draggable element. When the context menu appears, select the Drag menu.
          - -

          Handling Drag and Drop Events

          - -

          Learning how to handle drag and drop events is a basic user interaction skill:

          - - -
            -
          1. Define the draggable elements by adding the draggable="true" attribute to them:

            -
            -<h1>Drag and drop tutorial</h1>
            -<div class="example_body">
            -   <div id="drag-list">
            -      <div class="drag-row" draggable="true">1</div>
            -      <div class="drag-row" draggable="true">2</div>
            -   </div>
            -   <div>Drag state: <span id="log"></span></div>
            -</div>
            -
            -
          2. - -
          3. Add event listeners for the various drag and drop events: -
            -<script>
            -   var cols = document.querySelectorAll('#drag-list_.drag-row');
            -   var colsLength = cols.length;
            -
            -   for (var i = 0; i < colsLength; i++) 
            -   {
            -      cols[i].addEventListener('dragstart', dragStart, false);
            -      cols[i].addEventListener('drag', dragIng, false);
            -      cols[i].addEventListener('dragenter', dragEnter, false);
            -      cols[i].addEventListener('dragover', dragOver, false);
            -      cols[i].addEventListener('dragleave', dragLeave, false);
            -      cols[i].addEventListener('drop', dragDrop, false);
            -      cols[i].addEventListener('dragend', dragEnd, false);
            -   };
            -</script>
            -
            -
          4. - -
          5. Define event handlers for the events. In this case, each event handler displays a text on the screen. -
            -function dragStart(e) 
            -{
            -   log.innerHTML = "dragStart"
            -};
            -
            -function dragIng(e) 
            -{
            -   log.innerHTML = "drag"
            -};
            -
            -function dragOver(e) 
            -{
            -   e.preventDefault();
            -   log.innerHTML = "dragOver"
            -};
            -
            -function dragEnter(e) 
            -{
            -   log.innerHTML = "dragEnter"
            -};	
            -
            -function dragLeave(e) 
            -{
            -   log.innerHTML = "dragLeave"
            -};
            -
            -function dragDrop(e) 
            -{
            -   e.stopPropagation();
            -   log.innerHTML = "dragDrop"	
            -};
            -	
            -function dragEnd(e) 
            -{
            -   log.innerHTML = "dragEnd"
            -};
            -
            -
          6. -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Transferring Data over Drag and Drop

          - -

          Learning how to transfer data in a simple drag and drop puzzle is a basic user interaction skill:

          - -
            -
          1. Define the draggable elements by adding the draggable="true" attribute to them. -

            In this example, the Tizen logo image has been divided and allocated randomly. Each imager part is defined as draggable, so that the user can rearrange the image parts in the correct order.

            -
            -<h1>Drag and drop tutorial</h1>
            -<div class="example_body">
            -   <div>Drag state: <span id="log"></span></div>
            -   <div class="holder">
            -      <div>
            -         <img src="images/logo.png">
            -         <p class="txt">Complete the puzzle to see a picture</p>
            -      </div>
            -      <ul id="puzzle">
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_06.png">
            -         </li>
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_02.png">
            -         </li>
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_04.png">
            -         </li>
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_05.png">
            -         </li>
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_01.png">
            -         </li>
            -         <li class="puzzle-piece" draggable="true">
            -            <img src="images/puzz_03.png">
            -         </li>
            -      </ul>
            -   </div>
            -</div>
            -
            -
          2. - -
          3. Add event listeners for the dragover, dragleave, dragstart, and drop events: -
            -<script>
            -   var cols = document.querySelectorAll('#puzzle_.puzzle-piece');
            -   var colsLength = cols.length;
            -   for (var i = 0; i < colsLength; i++) 
            -   {
            -      cols[i].addEventListener('dragstart', dragStartHandler, false);
            -      cols[i].addEventListener('dragover', dragOverHandler, false);
            -      cols[i].addEventListener('dragleave', dragLeaveHandler, false);
            -      cols[i].addEventListener('drop', dragDropHandler, false);
            -   };
            -</script>
            -
            -
          4. - -
          5. Transfer data (in this case, image parts): -
              -
            1. Declare the dragElem variable, which is an empty object for the data exchange: -
              -var dragElem = null;
              -
              -
            2. - -
            3. Use the DataTransfer interface in the dragStartHandler() and dragDropHandler() event handlers to exchange image parts: -
              -function dragStartHandler(e) 
              -{
              -   /* Set data */
              -   dragElem = this;
              -   e.dataTransfer.effectAllowed = 'move';
              -   e.dataTransfer.setData('text/html', this.innerHTML);
              -   this.classList.add('over');
              -   for (var i = 0; i < colsLength; i++)
              -   {
              -      cols[i].classList.add('start');
              -   };
              -};
              -function dragDropHandler(e) 
              -{
              -   /* Get data */
              -   dragElem.innerHTML = this.innerHTML;
              -   this.innerHTML = e.dataTransfer.getData('text/html');
              -   for (var i = 0; i < colsLength; i++)
              -   {
              -      cols[i].className = "puzzle-piece";
              -   };
              -   /* Check key */
              -   puzzleCheck();
              -};
              -
              -
            4. - -
            5. Check the completion of the puzzle by making a user key using a simple array, and comparing the user key against the puzzle key (correct answer): -
              -var puzzleKey =  ["01", "02", "03", "04", "05", "06"];
              -var puzzleArray = [];
              -
              -function puzzleCheck() 
              -{
              -   /* Initialize the user key */
              -   puzzleArray = [];
              -   /* Insert the keys in the array */
              -   for (var i = 0; i < colsLength; i++) 
              -   {
              -      puzzleArray.push(cols[i].children[0].getAttribute('src').substring(12, 14));
              -   };
              -   originKey = puzzleKey.join();
              -   userKey = puzzleArray.join();
              -
              -   if (originKey === userKey)
              -   {
              -      alert("Success !");
              -   };
              -};
              -
              -
            6. -
            -
          6. -
          -

          Figure: Drag and drop puzzle

          -

          Drag and drop puzzle

          -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/flexible_w.htm b/org.tizen.ui.guides/html/web/w3c/flexible_w.htm deleted file mode 100755 index 5bd3406..0000000 --- a/org.tizen.ui.guides/html/web/w3c/flexible_w.htm +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - - - - - - - CSS Flexible Box Layout Module: Adjusting the Layout - - - - - -
          -

          CSS Flexible Box Layout Module: Adjusting the Layout

          - -

          CSS attributes, such as float, display, and position, can be used to adjust and align the screen layout according to various resolutions. However, operating the layout accurately among changing screen sizes is difficult.

          - -

          Tizen supports the CSS Flexible Box Layout Module API that enables you to create an easily manageable flexible layout, which fluidly adjusts the layout according to viewport size changes. When you create and use a flexible box layout, the alignment method or object (flex item) size within a specific area (flex container) can be adjusted.

          -

          The main components of the flexible box layout include:

          -
            -
          • Flex container, which refers to flex or inline-flex DOM elements assigned by the display.

            You can use the flex container to assign a flex area and the flex items included in it. The flex container properties are used to assign the indication area and alignment method.

          • -
          • Flex item, which refers to the child nodes of the flex container. -

            The flex item changes its size fluidly according to the area of the flex container. You can define flex item properties to assign the sizes of the respective items and the alignment method.

          • -
          -

          Figure: Flexible box layout

          -

          Flexible box layout

          - -

          Using the Flex Container

          -

          To enhance the user experience of your application, you must learn how to assign size and alignment to the flex container:

          - -
            -
          1. Assign the area (flex container) where the flexible box layout is applied by using the display: flex property: -
            <style>
            -   .flex_container {display: -webkit-flex}
            -</style>
            -
            -<div class="flex_container">
            -   <div class="flex_item">A</div>
            -   <div class="flex_item">B</div>
            -   <div class="flex_item">C</div>
            -   <div class="flex_item">D</div>
            -<div>
            - -

            The child nodes within the assigned flex container become flex items.

            -
          2. -
          3. Define the necessary properties for the flex container to assign the alignment of the flex items within it:

            -
              -
            • flex-direction property sets the alignment direction of the flex items: -
                -
              • row: Align from left to right.
              • -
              • row-reverse: Align from right to left.
              • -
              • column: Align from top to bottom.
              • -
              • column-reverse: Align from bottom to top.
              • -
            • - -
            • flex-wrap property sets the line changing of the flex items: -
                -
              • nowrap: Reduces the size of the flex items without changing lines.
              • -
              • wrap: The flex items reaching beyond the flex container area are divided into multiple lines using the cross axis direction of the current writing mode.
              • -
              • wrap-reverse: The flex items reaching beyond the flex container area are divided into multiple lines using the opposite cross axis direction than in the wrap value.
              • -
            • - -
            • justify-content property sets the handling of gaps between the flex items on the main axis: -
                -
              • flex-start: Gathers the items at the alignment starting point.
              • -
              • flex-end: Gathers the items at the alignment finishing point.
              • -
              • center: Gathers the items in the center.
              • -
              • space-between: Aligns the start and end item at both ends, and creates equal gaps in between the rest of the items.
              • -
              • space-around: Creates equal gaps between all items.
              • -
              - - - - - - - - - -
              Note
              This property is similar to text-align, but the alignment direction and the starting point are based on the flex-direction and flex-wrap properties.
            • - -
            • align-content property sets the handling of gaps between the flex items on the cross axis. It has the same values as the justify-content property, and 1 additional value: -
                -
              • stretch: Extends the size of the flex items and aligns them without gaps.
              • -
            • -
            • align-items property sets the relative location and size between the flex items on the cross axis: -
                -
              • flex-start: Aligns the items vertically to the top.
              • -
              • flex-end: Aligns the items vertically to the bottom.
              • -
              • center: Aligns the items vertically to the middle.
              • -
              • baseline: Aligns the items vertically to the baseline.
              • -
              • stretch: Extends the height of the flex items and aligns them without gaps.
              • -
              - - - - - - - - - -
              Note
              If the flex-wrap property is set to wrap-reverse, the start and end points of the alignment are reversed.
          -

          The following figure shows examples of flex containers and how their flex items have been aligned.

          -

          Figure: Flex container properties (in mobile applications only)

          -

          Flex container properties (in mobile applications only)

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - -

          Using the Flex Items

          - -

          To enhance the user experience of your application, you must learn how to assign size and alignment to the flex items:

          - -
            -
          1. Assign the area (flex container) where the flexible box layout is applied, and define the flex items for it: -
            <style>
            -   .flex_container {display: -webkit-flex}
            -</style>
            -
            -<div class="flex_container">
            -   <div class="flex_item">A</div>
            -   <div class="flex_item">B</div>
            -   <div class="flex_item">C</div>
            -<div>
            -
          2. - -
          3. Define the necessary properties for the flex items:

            -
              -
            • align-self property is similar as the align-items property of the flex container. - - - - - - - - - -
              Note
              If both the align-self and align-items properties are used simultaneously, the align-items property is ignored.
            • - -
            • flex property is a shorthand expression defining the flex item size handling: -
                -
              • flex-grow: Sets whether the spaces between flex items are filled.
              • -
              • flex-shrink: Sets whether the width of the flex items is reduced according to the size of the flex container.
              • -
              • flex-basis: Sets the default width of the relevant flex items.
              • -
          -

          The following figure shows examples of how flex items can be placed and sized within a flex container.

          -

          Figure: Flex items (in mobile applications only)

          -

          Flex items (in mobile applications only)

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - -

          Creating a Flexible Layout with CSS3

          - -

          To enhance the user experience of your application, you must learn how to create flexible box layout:

          -
            -
          1. Define the HTML content for the flexible layout. In this example, create 2 articles areas, 1 for a text list and 1 for an icon list: -
            <div class="container">
            -   <article class="events">
            -      <h2>UPCOMING EVENTS</h2>
            -      <ul>
            -         <li>
            -            <div class="date"><span>APR</span><br> 15</div>
            -            <p class="title">
            -               Linux Foundation Collaboration Summit <span class="local">San Francisco, CA</span>
            -            </p>
            -         </li>
            -         <!--Other text items-->
            -      </ul>
            -   </article>
            -   <article class="schedule">
            -      <h2>SCHEDULE</h2>
            -      <div class="img_list">
            -         <img src="folder.png" alt="folder">
            -         <img src="alert.png" alt="alert">
            -         <!--Other icons-->
            -      </div>
            -   </article>
            -</div>
          2. - -
          3. Define styles to decorate the article areas. (The following figure applies to mobile applications only.) -
            <!--Border for the article areas-->
            -.container article > * {border: 1px solid #ccc;}
            -
            -<!--Font style for the article area titles-->
            -.container .events > h2, .container .schedule > h2 
            -{
            -   padding: 10px 20px;
            -   text-shadow: 1px 1px 2px #fff, -1px -1px 2px #000;
            -}
            -
            -<!--List styles-->
            -.container .events > ul, .container .schedule .img_list  
            -{
            -   height: 100%; 
            -   padding: 10px;
            -}
            -
            -<!--Text style for the text list item title-->
            -.container .events > ul > li .title 
            -{
            -   color: #51809e;
            -   text-shadow: 1px 1px 2px #000;
            -}
            -
            -<!--Text style for the text list item location info-->
            -.container .events > ul > li .title .local 
            -{
            -   text-indent: 10px;
            -   text-shadow: 0 0 0 #fff;
            -}
            -
            -<!--Styles for the text list item date box-->
            -.container .events > ul > li .date 
            -{
            -   text-align: center;
            -}
            -.container .events > ul > li .date 
            -{
            -   background-color: #ddd;
            -   border-radius: 10px;
            -   box-shadow: inset -2px -2px 4px rgba(0, 0, 0, .5);
            -}
            -.container .events > ul > li .date > span 
            -{
            -   background-color: #fff;
            -   border-radius: 5px;
            -}
            -

            Article areas with styles defined (in mobile applications only)

          4. - - -
          5. Define a flexible alignment for the article areas to support screen orientation changes and ensure that the content fills up the entire available screen area regardless of the orientation: -
              -
            1. Define the text list items and the icon list as flex containers using the display: -webkit-flex; property: -
                -
              • For the text list items, align them vertically in the middle, define a 0 margin at the top for the first item, and center-align the text for the date box.
              • -
              • For the icon list, align the icon list so that the first and last icon are placed at the ends and the gaps between the rest of the icons are equal.
              -

              (The following figure applies to mobile applications only.)

              -
              <!--Flexible alignment of text list-->
              -.container .events > ul > li 
              -{
              -   display: -webkit-flex;
              -   -webkit-align-items: center;
              -}
              -.container .events > ul > li: first-child 
              -{
              -   margin-top: 0;
              -}
              -
              -.container .events > ul > li .date 
              -{
              -   -webkit-flex: 0 0 20%;
              -   text-align: center;
              -}
              -
              -<!--Flexible alignment of icon list-->
              -.container .schedule .img_list 
              -{
              -   display: -webkit-flex;
              -   -webkit-justify-content: space-between;
              -}
              -

              Article areas with a flexible box layout defined (in mobile applications only)

            2. - - -
            3. Special consideration can be given for some screen sizes. The following example defines a specific layout for small screens (where the screen width is less than 390 pixels). (The following figure applies to mobile applications only.) -
              -@media screen and (min-width: 390px) 
              -{
              -   .container .schedule .img_list 
              -   {
              -      display: -webkit-flex;
              -      -webkit-flex-wrap: wrap;
              -      -webkit-justify-content: space-between;
              -      -webkit-align-content: space-around;
              -   }
              -
              -   .container {display: -webkit-flex;}
              -   .container > * {-webkit-align-content: center;}
              -   .container article {height: 250px;}
              -}
              -

              Article areas with a flexible box layout for small screens (in mobile applications only)

              -

              For more information on defining screen-size-specific rules, see Media Queries.

              -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/font_w.htm b/org.tizen.ui.guides/html/web/w3c/font_w.htm deleted file mode 100755 index 68537ab..0000000 --- a/org.tizen.ui.guides/html/web/w3c/font_w.htm +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - CSS Fonts Module Level 3: Manipulating Fonts - - - - - - -
          -

          CSS Fonts Module Level 3: Manipulating Fonts

          - -

          You can change the text fonts easily.

          - -

          The new text features in CSS Fonts Module Level 3 API include:

          -
            -
          • Font properties -

            You can use CSS font properties, such as font-style, font-weight, font-variant, font-size, and font-family, to modify the appearance of text.

          • -
          - - -

          Manipulating Fonts

          - -

          To enhance the user experience of your application, you must learn to handle fonts using CSS font properties:

          - -
            -
          1. Define the font-style property within a <style> element in the <head> section of the Web page to apply different font styles:

            - -
            -<head>
            -   <style>
            -      p:nth-child(1) em{font-style: normal}
            -      p:nth-child(2) em{font-style: italic}
            -      p:nth-child(3) em{font-style: oblique}
            -   </style>
            -</head>
            -<body>
            -   <p>font-style: <em>normal</em></p>
            -   <p>font-style: <em>italic</em></p>
            -   <p>font-style: <em>oblique</em></p>
            -</body>
            -
            - -
          2. - -
          3. Define the font-weight property, -which controls the weight of the text:

            - -
            -<head>
            -   <style>
            -      p:nth-child(1) {font-weight: normal}
            -      p:nth-child(2) {font-weight: bold}
            -      p:nth-child(3) {font-weight: 300}
            -      p:nth-child(4) {font-weight: 500}
            -      p:nth-child(5) {font-weight: 700}
            -   </style>
            -</head>
            -<body>
            -   <p>font-weight: <em>normal</em></p>
            -   <p>font-weight: <em>bold</em></p>
            -   <p>font-weight: <em>300</em></p>
            -   <p>font-weight: <em>500</em></p>
            -   <p>font-weight: <em>700</em></p>
            -</body>
            -
            - -
          4. - -
          5. Define the font-variant property to -change the font to, for example, use small capital letters: -
            -<head>
            -   <style>
            -      p:nth-child(1) {font-variant: normal}
            -      p:nth-child(2) {font-variant: small-caps}
            -   </style>
            -</head>
            -<body>
            -   <p>font-variant: <em>normal</em></p>
            -   <p>font-variant: <em>small-caps</em></p>
            -</body>
            -
            - -
          6. - -
          7. Define the font-size property, which controls the size of the font: -
            -<head>
            -   <style>
            -      p:nth-child(1) {font-size: 150%}
            -      p:nth-child(2) {font-size: 1.2em}
            -   </style>
            -</head>
            -<body>
            -   <p>font-size: <em>150%</em></p>
            -   <p>font-size: <em>1.2em</em></p>
            -</body>
            -</html>
            -
            -
          8. - -
          9. Define the line-height property, which controls the height of a text line: -
            -<head>
            -   <style>
            -      p:nth-child(1) {line-height: 1}
            -      p:nth-child(2) {line-height: 1.5}
            -      p:nth-child(3) {line-height: 5}
            -   </style>
            -</head>
            -<body>
            -   <p>line-height: <em>1</em></p>
            -   <p>line-height: <em>1.5</em></p>
            -   <p>line-height: <em>5</em></p>
            -</body>
            -
            - -
          10. - -
          11. Define the font-family property, which assigns a specific font or its representative to an element. The list order within the <style> element determines the property priority. -

            If the assigned font is not installed on the target, a different font is obtained based on the user system.

            -
            -<head>
            -   <style>
            -      p:nth-child(1) {font-family: serif}
            -      p:nth-child(2) {font-family: sans-serif}
            -      p:nth-child(3) {font-family: monospace}
            -      p:nth-child(4) {font-family: cursive}
            -      p:nth-child(5) {font-family: fantasy}
            -      p:nth-child(6) {font-family: 'Arial Black', sans-serif}
            -      p:nth-child(7) {font-family: Tahoma, sans-serif}
            -      p:nth-child(8) {font-family: Verdana, sans-serif}
            -      p:nth-child(9) {font-family: Arial, sans-serif}
            -   </style>
            -</head>
            -<body>
            -   <p>font-family: <em>serif</em></p>
            -   <p>font-family: <em>sans-serif</em></p>
            -   <p>font-family: <em>monospace</em></p>
            -   <p>font-family: <em>cursive</em></p>
            -   <p>font-family: <em>fantasy</em></p>
            -   <p>font-family: <em>'Arial Black', sans-serif</em></p>
            -   <p>font-family: <em>Tahoma, sans-serif</em></p>
            -   <p>font-family: <em>Verdana, sans-serif</em></p>
            -   <p>font-family: <em>Arial, sans-serif</em></p>
            -</body>
            -</html>
            -
            -
          12. -
          - - -

          The following figure shows examples of manipulating the text font properties.

          -

          Figure: Font properties (in mobile applications only)

          -

          Font properties (in mobile applications only)

          - - - - - - - - - - -
          Note
          For a complete list of CSS Fonts Module Level 3 font properties (in mobile or wearable applications) and their possible values, see the Property index.
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/frame_flattening_mw.htm b/org.tizen.ui.guides/html/web/w3c/frame_flattening_mw.htm deleted file mode 100755 index 2f5d3c9..0000000 --- a/org.tizen.ui.guides/html/web/w3c/frame_flattening_mw.htm +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - Frame Flattening: Expanding Content According to Size - - - - - -
          -
          - -
          -
          -

          Mobile Web

          -
          - -

          Frame Flattening: Expanding Content According to Size

          - -

          In the Tizen WebKit, content placed within the <frame> and <iframe> tags is expanded automatically according to the content size. This enables users to view the whole content at once without scrolling.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          The Tizen WebKit supports this feature since scrolling through small subframes on small screen devices is a tedious task and, occasionally, causes confusion between scrolling subframes and scrolling the Web page itself.

          -

          To implement scrollable content in the Tizen WebKit, use the CSS overflow: scroll or webkit-overflow-scrolling: touch property instead of iframe.

          - - - -
          - -Go to top - - - - - - - - diff --git a/org.tizen.ui.guides/html/web/w3c/guides_w3c_w.htm b/org.tizen.ui.guides/html/web/w3c/guides_w3c_w.htm deleted file mode 100755 index 9083b94..0000000 --- a/org.tizen.ui.guides/html/web/w3c/guides_w3c_w.htm +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - W3C - - - - - - -
          - -

          W3C

          - -

          The W3C specifications provide HTML and CSS, which are the core technologies for building Web pages and Web applications.

          - -

          To learn to use the W3C features in your application UI, see the following topics:

          - - - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/html5forms_w.htm b/org.tizen.ui.guides/html/web/w3c/html5forms_w.htm deleted file mode 100644 index b92cdda..0000000 --- a/org.tizen.ui.guides/html/web/w3c/html5forms_w.htm +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - - - HTML5 Forms: Managing User Input - - - - - -
          - -

          HTML5 Forms: Managing User Input

          - -

          The HTML5 forms provide a convenient way to create consistent screens in your application for accepting user input. In the past, the Web form allowed you to accept user input before transmitting it to a server. With HTML5, you can now improve the user experience without having to use JavaScript by adding simple features, for example, email validity checks and date pickers, and using more advanced functionality, such as security checks and input value pattern definitions.

          - -

          New HTML5 Elements

          -

          The following table lists the new elements available for your forms in HTML5. For a complete source code, see elements.html.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: New HTML5 elements
          ElementDescriptionExample
          datalist

          Defines a set of option elements that represent predefined options for other controls. The element is used together with the input element to predefine its value.

          -

          In Tizen, the value selected in the datalist element can be edited.

          -
          -<input type="text" list="search">
          -<datalist id="search">
          -   <option value="Tomato">Tomato</option>
          -   <option value="banana">banana</option>
          -   <option value="Watermelon">Watermelon</option>
          -</datalist>
          -
          -
          keygen

          Defines a control for generating a public-private key pair and for submitting the public key from that key pair. The element creates an encrypted key with the value of the name attribute, saves it in the user's computer and Web server, and activates the next procedure when the 2 values match.

          -
          -<label>user:<input type="text" name="user_name"></label>
          -<label>keygen:<keygen name="keygen"></label>
          -
          -
          meter

          Represents a scalar measurement within a known range (the distribution of the assigned range), or a fractional value.

          -
          -<meter value="75" min="0" max="100" low="60" high="80" optimum="81">
          -   75/100
          -</meter>
          -
          -
          output

          Represents the result of a calculation. The element generally shows the calculated result of the value that the user has entered, and is used within the form element.

          -
          -<fieldset onsubmit="return false"
          -          oninput="foobar.value = parseInt(foo.value) * parseInt(bar.value)">
          -   <input type="number" id="foo" name="foo"> *
          -   <input type="number" id="bar" name="bar"> =
          -   <output for="foo bar" name="foobar"></output>
          -</fieldset>
          -
          -
          progress

          Represents the progress of a task.

          -
          -<progress value="75" max="100">
          -   75/100
          -</progress>
          -
          - -

          New Input Element Types

          -

          The following table lists the new input element types available for your forms in HTML5. Many of the new elements activate a specific keyboard suitable for the type of value the user is expected to enter (for example, an email or URL). For a complete source code, see types.html.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: New input element types
          TypeDescriptionExample
          color

          Select an HSL color from the color picker. The value format is HEX (#0099ff).

          -
          -
          -<input type="color"
          -       value="#ff0000">
          -<input type="datetime"
          -       value="2012-12-12T03:30Z">
          -<input type="email"
          -       required>
          -<input type="number"
          -       step="3">
          -<input type="range"
          -       min="1" max="10">
          -<input type="tel">
          -<input type="url">
          -
          -
          date

          Enter a date with no time zone (yyyy-mm-dd).

          -
          datetime

          Enter a date and time with the (UTC) time zone (yyyy-mm-ddTtt:mmZ).

          - -
          datetime-local

          Enter a date and time with no time zone (yyyy-mm-ddTtt:mm).

          -
          email

          Enter an email address with the email keyboard.

          -

          If the required attribute is used, the system checks whether the input format is in line with the ABNF regular expression (1*(atext / ".") "@" ldh-str 1*("." ldh-str)).

          -
          month

          Enter a year and month with no time zone (yyyy-mm).

          -
          number

          Enter numbers with the number keyboard.

          -
          range

          Select a value from the slider.

          -
          search

          No specific functionality is defined for this element in the HTML5 specifications.

          -
          tel

          Enter a phone number with the number keyboard.

          -
          time

          Enter a time with no time zone (tt:mm:ss).

          -
          url

          Enter a URL with the URL keyboard.

          -
          week

          Enter a year and week with no time zone (yyyy-week).

          -
          - -

          New Input Element Attributes

          - -

          The following table lists the new input element attributes available for your forms in HTML5. For a complete source code, see attributes.html.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: New input element attributes
          AttributeDescriptionExample
          autocomplete

          Prefilling feature, which helps the users by, for example, prefilling the user's address based on earlier user input.

          -

          The text used by the user before (such as an input element) is listed in a datalist form. The attribute can be used in all form elements, and is activated if the value is "on" and deactivated if the value is "off".

          -
          -
          -<input type="range" min="1" max="10">
          -<input type="tel" pattern="[0-9]+" required>
          -<input placeholder="You know what to do, huh?">
          -<input type="number" step="3">
          -
          -
          min and max

          Allowed range of values for the element.

          -
          pattern

          Regular expression against which the control's value is checked.

          -

          The attribute can be used to check the validity of the form data. During service, a guide requiring the input format from the user is necessary.

          -
          placeholder

          Short hint intended to aid the user with the data entry.

          -

          The attribute can be used in the majority of form elements for various purposes, such as hint text or advertisement.

          -
          required

          Boolean attribute which, when specified, defines that the element is mandatory.

          -
          step

          Granularity expected of the value, limiting the allowed values.

          -
          - -

          Creating a Basic Login Form

          - -

          To create simple user input forms, you must learn to use the HTML5 features in Web forms:

          - -
            -
          1. Create a simple form where the user can enter their login details (email address and password):

            -
            -<form action="" method="">
            -   <label>email: <input type="text"></label>
            -   <label>password: <input type="password"></label>
            -    
            -   <input type="submit" value="Login">
            -</form>
            -
          2. -
          3. To check the validity of the entered email address automatically, add the required attribute to the input element with the email type:

            -
            -<label>email: <input type="email" required></label>
            -
          4. -
          5. Define the password field as mandatory by using the required attribute in that input element too:

            -
            -<label>password: <input type="password" required></label>
            -
          6. -
          7. Because a device has limited space on the screen, remove the field labels and replace them with hint texts using the placeholder attribute:

            -
            -<input type="email" placeholder="e-mail address" required>
            -<input type="password" placeholder="password" required>
            -
          - -

          The final form that checks the email validity and requires the mandatory password input is complete:

          -
          -<form action="" method="">
          -   <fieldset>
          -      <legend>Login</legend>
          -      <input type="email" placeholder="e-mail address" required>
          -      <input type="password" placeholder="password" required>
          -   </fieldset>
          -    
          -   <input type="submit" value="Login">
          -</form>
          -
          - -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Creating an Advanced Login Form

          - -

          To create advanced user input forms, you must learn to use the HTML5 features in Web forms:

          - -
            -
          1. Create a login form that checks the email validity and requires the mandatory password input:

            -
            -<form action="" method="">
            -   <fieldset>
            -      <legend>Login</legend>
            -      <input type="email" placeholder="e-mail address" required>
            -      <input type="password" placeholder="password" required>
            -   </fieldset>
            -    
            -   <input type="submit" value="Login">
            -</form>
            -
          2. - -
          3. When the form page is loaded on the screen, put the focus automatically to the email field by using the autofocus attribute:

            -
            -<input type="email" placeholder="e-mail address" required autofocus>
            -
          4. - -
          5. -

            To spare the user from filling in information that they have given previously, use the autocomplete attribute, which shows the previously successfully inserted entries in a datalist, from which the user can select and use them.

            -

            You can apply the autocomplete attribute to a specific field by adding it to the appropriate input element. If you add it to the form element, it applies to all child elements within the form.

            - -
            -<form action="" method="" autocomplete="on">
            -
            -
          6. -
          7. In general, apply the autocomplete attribute to the form element, and then separately set it to off for those fields that must not use it.

            -

            In the following example, the password field must not use autocomplete, to prevent unauthorized access by any user.

            -
            -<input type="password" placeholder="password" required autocomplete="off">
            -
            -
          8. -
          9. Protect the password with private and public key pair using the keygen element.

            -

            The element is used to transform the data sent from the connected form to a pair of encrypted keys using the RSA (Rivest Shamir Adleman) method. When the input data is sent from the form, the private key is saved in the local computer, and the public key is delivered to the server. Only if the keys match, the login process proceeds forwards.

            - -
            -<keygen name="keyvalue">
            -
          10. - -
          11. Use the pattern attribute to perform a validity check that ensures that the password field value matches the given regular expression. The required attribute is used to ensure that the field value must be entered and then the validity check can be performed.

            -

            In the following example, the password only accepts numbers and letters of the alphabet. If an invalid value is entered, the login cannot proceed.

            - -
            <input type="password" placeholder="password" required
            -       pattern="[a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*" 
            -       autocomplete="off">
            -
          12. -
          13. Define the required length of the password within the pattern attribute.

            -

            In the following example, the password must be 6 to 12 characters long.

            - -
            -<input type="password" placeholder="password" required 
            -       pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
            -       autocomplete="off">
            -
          14. -
          - -

          The final form with autofocus and autocomplete features, strengthened security, and password value requirements is complete:

          - -
          -<form action="" method="" autocomplete="on">
          -   <fieldset>
          -      <legend>Login</legend>
          -      <input type="email" placeholder="e-mail address" required autofocus>
          -      <input type="password" placeholder="password" required 
          -             pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
          -             autocomplete="off">
          -   </fieldset>
          -
          -   <keygen name="keyvalue">
          -    
          -   <input type="submit" value="Login">
          -</form>
          -
          - - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/html_priority_w.htm b/org.tizen.ui.guides/html/web/w3c/html_priority_w.htm deleted file mode 100755 index 4714abf..0000000 --- a/org.tizen.ui.guides/html/web/w3c/html_priority_w.htm +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - - - - - - - HTML Priorities: Understanding HTML Behavior - - - - - -
          - -

          HTML Priorities: Understanding HTML Behavior

          - -

          The HTML markup is not as important as before, because JavaScript APIs can be used to create various functionalities. For example, graphics APIs (in mobile or wearable applications) can be used for making games, media APIs (in mobile or wearable applications) for creating video chats, and communication APIs (in mobile or wearable applications) for various types of messaging. However, HTML remains the basis of Web applications, and it is useful to be familiar with its behavior.

          - -

          The structure of the HTML document can be classified into DOCTYPE and HTML DOM (Document Object Model). When an HTML document is loaded, the browser renders the contents in its screen as follows:

          -
            -
          1. HTML is parsed referring to the rules defined in the <!DOCTYPE> element.
          2. -
          3. HTML DOM tree is established.
          4. -
          5. DOM elements, including references to JavaScript, are arranged based on the information defined in the head element. This is called rendering.
          6. -
          7. The elements are painted on the screen based on CSS rules.
          8. -
          - -

          <!DOCTYPE> Element

          - -

          The <!DOCTYPE> element informs the browser of the HTML version and which rules it must follow. It is not a composition element of the HTML.

          - -

          The browser, based on the version defined in the <!DOCTYPE> element and DTD (Document Type Definition), decides how to handle the HTML before interpreting it. Therefore, the <!DOCTYPE> element must be declared at the beginning of an HTML document.

          - -
          <!--HTML5-->
          -<!DOCTYPE html>
          -
          -<!--Prior to HTML5-->
          -<!DOCTYPE html PUBLIC "{HTML Version Information}" "{DTD (Document Type Definition) file link defined by Rule in HTML DOM}">
          -
          - -

          HTML DOM Tree

          - -

          HTML DOM is a structured model to control Web elements. It is an official W3C standard to express the document regardless of platforms or languages, and the foundation of the HTML5 APIs.

          - -

          The <html> element is the top-level element of the HTML DOM tree that wraps the entire document, and it has the <head> and <body> elements as child nodes:

          - -
          <!DOCTYPE html>
          -<html>
          -   <head>
          -      <!--Content-->
          -   </head>
          -   <body>
          -      <!--Content-->
          -   </body>
          -</html>
          - -

          <head> element

          - -

          The <head> element contains the information that the browser refers to when rendering the body element to interpret information, such as the title of HTML document, CSS, JavaScript, and favicon:

          - -
          <!DOCTYPE html>
          -<html>
          -   <head>
          -      <meta charset="utf-8" />
          -      <title> Tizen (in mobile applications) or Tizen Wearable (in wearable applications) </title>
          -      <link rel="stylesheet" href="css/style.css" />
          -      <script src="/common/js/ui.js"></script>
          -   </head>
          -   <body>
          -      <!--Content-->
          -   </body>
          -</html>
          - -

          The <head> contains the following subelements:

          - -
            -
          • <title>: Defines the title of the document.
          • -
          • <meta>: Defines information, such as encoding, creator, and keywords of the document. - - - - - - - - - - -
            Note
            The viewport element, which sets the screen area, is included in the meta information.
          • -
          • <style>, <link>: Sets the styles of the document.
          • -
          • <script>, <noscript>: Adds functions to the document.
          • -
          - -

          <body> element

          - -

          The <body> element defines the area displaying content on the browser screen:

          - -
          <!DOCTYPE html>
          -<html>
          -   <head>
          -      <!--Content-->
          -   </head>
          -   <body>
          -      <section id="tizen_wrap">
          -         <header>
          -            <h1>Tizen Web App (in mobile applications) or Tizen Wearable Wep App (in wearable applications)</h1>
          -         </header>
          -         <section id="contents">
          -            <!--Content-->
          -         </section>
          -         <footer>
          -            <p>&copy; All rights reserved.</p>
          -         </footer>
          -      </section>
          -   </body>
          -</html>
          - -

          CSS Rule Priorities

          -

          The basic rule of HTML, CSS, and JavaScript is that the code is applied from the top to the bottom of the document. Sometimes the lack of understanding of the CSS rule priorities can cause a result you do not expect.

          -

          The following figure illustrates this problem in mobile applications by applying a font color to a black background.

          - -

          Figure: Expected and actual result of applying a font color (in mobile applications only)

          -

          Expected and actual result of applying a font color (in mobile applications only)

          - -

          Basic CSS Rules

          - -

          When creating a CSS document, the following rules apply:

          - -
            -
          • When more than 1 overlapping styles are applied to the same element, only the last style is visible: - -
            p {color: red}
            -p {color: blue}
            -<!--Blue color is applied-->
            -
          • -
          • The style applied in the parent node at the DOM tree is inherited. For more information, see W3C inheritance documentation. -
          • -
          • The style that has the highest CSS specificity is applied. The specificity of different elements is defined as follows: -
              -
            • ID attribute = 100
            • -
            • Class attribute = 10
            • -
            • Element = 1
            • -
            - -
            <body>
            -   <p id="target" class="target">Hello World</p>
            -</body>
            -
            -<style>
            -   p#target {color: black} /* Specificity: 101 */
            -   p#target {color: red} /* Specificity: 101 */
            -   p.target {color: blue} /* Specificity: 11 */
            -   p {color: tomato} /* Specificity: 1 */
            -</style>
            -<!--Red color is applied-->
            -
          • -
          • When the !important attribute is used, it has the highest priority: -
            <body>
            -   <p id="target" class="target">Hello World</p>
            -</body>
            -
            -<style>
            -   p#target {color: black !important}
            -   p#target {color: red}
            -   p.target {color: blue}
            -   p {color: tomato}
            -</style>
            -<!--Black color is applied-->
            -
          • -
          - -

          Keeping these rules in mind, you can use any of the following ways to achieve the expected result illustrated in the figure above:

          -
          .contents {color: #999 !important;}
          -
          -section.contents {color: #999;}
          -
          -body .contents {color: #999;}
          -
          -#container > .contents {color: #999;}
          -
          - -

          Using CSS with HTML

          - -

          There are various ways to connect CSS with HTML. Creating a separate CSS file and managing it separately is convenient when it comes to applying changes in the future. The file is connected to the HTML file using a <link> tag in the <head> element.

          - -

          In the following example, the applied order of the CSS elements is as follows:

          -
            -
          1. <link> tag in the <head> element
          2. -
          3. <style> tag in the <head> element
          4. -
          5. @import attribute in the CSS area
          6. -
          7. style attribute in a HTML element
          8. -
          - -
          <!DOCTYPE html>
          -<html>
          -   <head>
          -      <!--Link in head-->
          -      <link rel="stylesheet" href="css/style.css"/>
          -
          -      <!--Style tag in head-->
          -      <style>
          -         p {color: tomato}
          -      </style>
          -
          -      <!--@import in CSS area-->
          -      <style>
          -         @import url("css/style.css");
          -      </style>
          -   </head>
          -
          -   <body>
          -      <!--Style attribute in HTML element-->
          -      <p style="color: red">Hello World</p>
          -   </body>
          -</html>
          -
          -

          However, the priority order of the elements is as follows:

          -
            -
          1. style attribute in a HTML element
          2. -
          3. <style> tag in the <head> element
          4. -
          5. @import attribute in the CSS area
          6. -
          7. <link> tag in the <head> element
          8. -
          - -

          The style attribute in the HTML element has the highest priority after the !important attribute.

          - -

          Using the order above, if all other color styles are applied to <p> elements, the style attribute is used to apply the red color that has been directly defined in the HTML. This rule differs from the CSS specificity rules.

          - -

          Generally, when the @import attribute is used, connect to the top of CSS file that has been linked externally, as illustrated in the figure below. If the attribute is applied in the middle of the CSS file, it is difficult to know the point where CSS has been applied, and to find the file connected to the source in the future. Therefore, group the CSS file at the top.

          - - - - - - - - - - -
          Note
          Using the @import attribute gives the same result as connecting an external file, but it does not function correctly in older browsers (IE 5.5 and below).
          -

          Figure: Using the @import attribute

          -

          Using the @import attribute

          - -

          The markup in the corresponding files is as follows:

          -
            -
          • In the HTML code: -
            <head>
            -   <link rel="stylesheet" href="css/style.css"/>
            -</head>
            -
          • -
          • In the style.css file: -
            @import url("priorities1.css");
            -
            -p: after {content: " : linked in head"}
            -
            -

            Figure: Result of linking the @import attribute

            -

            Result of linking the @import attribute

          • -
          • In the priorities1.css file: -
            p: after {content: " : Using @import in CSS area"}
            -
            -

            Figure: Result of using the @import attribute in the CSS area

            -

            Result of using the @import attribute in the CSS area

          • -
          - -

          JavaScript Behavior

          -

          With the advent of HTML5, numerous powerful HTML5 APIs have been introduced. Since the usage of JavaScript has increased, it has become important to use it accurately in accordance with optimized JavaScript performance.

          - -

          JavaScript used in Web applications can be divided into the core, ECMAScript, and DOM, which all manipulate HTML. ECMAScript is executed when a method is called, or it can be executed when an event is fired within a HTML document through a linkage with DOM.

          - -

          Using JavaScript with HTML

          -

          Used with HTML, JavaScript works as follows:

          -
            -
          1. During HTML parsing, the content of the <script> tag is parsed to JavaScript Interpreter.
          2. -
          3. The Interpreter parses the received script code.
          4. -
          5. Requests that need not be handled immediately are suspended.
          6. -
          7. The handled result is passed over to the browser, which continues to parse HTML.
          8. -
          - -

          The following example shows how you can use JavaScript with HTML either by linking to a JavaScript file, or embedding it directly in the HTML code:

          -
          /* Linking from HTML */
          -<script src="js/main.js"></script>
          -
          -/* Direct use in HTML */
          -<script>
          -   var obj = document.querySelector(".animated");
          -    
          -   function animate() 
          -   {
          -      /* Execute */
          -   };
          -    
          -   /* Call the animation function when the event is fired */
          -   webkitRequestAnimationFrame(animate);  
          -</script>
          -
          -
          -

          Both ways described above give the same result in behavior. However, the position of the JavaScript code affects the order in which the methods are called.

          - - - - - - - - - -
          Note
          Previously, adding JavaScript code within head tag was recommended because it is easy to maintain. Currently, adding it to the end of the body and executing it after parsing the HTML document is common.
          - -

          JavaScript Events

          - -

          JavaScript generally calls a method when a specific event is fired. More than 70 types of events, such as onload and onclick are available.

          - -

          The following example shows the use of a simple event:

          - -
          <!--HTML-->
          -<body onload="touchEventHandler()">
          -
          -<script>
          -   /* JavaScript */
          -   /* Directly assigning */  
          -   window.onload = touchEventHandler; /* Assigns the name of the subject method */
          -    
          -   /* Event listener (W3C standard) */
          -   document.addEventListener("touchstart", touchEventHandler, false);
          -</script>
          -

          Prefer using W3C standard event listener methods. The inline JavaScript code applied directly to an HTML tag is difficult to maintain. Assigning a method directly to an event is also difficult when passing parameters, as the method needs to be assigned for every event.

          - -

          JavaScript Priorities

          - -

          The rendering order of JavaScript code is based on the following rules:

          -
            -
          • JavaScript within the <head> element is temporarily saved, but not handled.
          • -
          • JavaScript within the <body> element is immediately handled when it is parsed.
          • -
          • When the temporarily saved JavaScript content is executed, the <head> element content is rendered first, and the <body> element content after it.
          • -
          - - -

          Using JavaScript Code within HTML

          - -

          To provide users with JavaScript-based features, you must learn to use JavaScript code within an HTML document:

          - -
            -
          • To use JavaScript code in the <head> element, place the relevant JavaScript content in a <script> tag: -
            -<head>
            -   <script src="js/jquery_1.9.0_min.js"></script>
            -   <script>       
            -      window.onload = function() 
            -      {
            -         testLog('head onload');
            -      };
            -
            -      $(document).ready(function() 
            -      {
            -         testLog('head ready');
            -      });
            -   </script>
            -</head>
            - -

            The JavaScript code within the <head> element is sent to Interpreter. As there are no methods to be handled immediately, its execution is suspended.

            -
          • -
          • To use JavaScript code in the <body> element, place the relevant JavaScript content in a <script> tag: -
            -<body>
            -   <script src="js/jquery_1.9.0_min.js"></script>
            -   <script>
            -      function testLog(txt) 
            -      {
            -         var logText = document.querySelector('.log');
            -         logText.innerHTML += '<li>JavaScript in HTML ' + txt + '</li>';
            -      };
            -    
            -      window.onload = function() 
            -      {
            -         testLog('body onload');
            -      };
            -
            -      $(document).ready(function() 
            -      {
            -         testLog('body ready');
            -      });
            -
            -      testLog('body');
            -
            -      (function() 
            -      {
            -         testLog('body anonymous function');
            -      }();
            -   </script>
            -</body>
            -
            -

            The JavaScript code within the <body> element is sent to Interpreter. The anonymous method is immediately executed, and the HTML DOM structure is set up. The methods in the $(document).ready method and in the onload event are executed in the stored order.

            -
          - - - - - - - - - - - -
          Note
          jQuery has to be called from both the <head> and <body> elements. The logText variable has to be called from the <body> element. The method connected to the onload event in the <head> element is not executed.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/media_query_w.htm b/org.tizen.ui.guides/html/web/w3c/media_query_w.htm deleted file mode 100755 index 64dd6e0..0000000 --- a/org.tizen.ui.guides/html/web/w3c/media_query_w.htm +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - Media Queries: Labeling Output Devices in Style Sheets - - - - - -
          -

          Media Queries: Labeling Output Devices in Style Sheets

          - -

          Media queries allow you to apply the CSS differently according to the media type (type of device) and media features (viewport status). Previously, you were able to use the media type only and create Web services with fixed layouts. However, smart phones, tablets, and other devices with various resolutions require a liquid layout. HTML5 now makes various characteristics and conditional defining possible, and can be used to implement responsive Web design (RWD), which is a liquid layout that mainly reacts according to the device resolution.

          - -

          You can use media queries in 3 ways:

          - -
            -
          • In CSS -

            You can define attribute values depending on given conditions:

            -
            @media only screen and (max-width: 480px) {styles}
            -
            - - - - - - - - - -
            Note
            This approach is popular since it can reduce style overlapping; however, if all the styles are applied to 1 CSS, the maintenance work efficiency decreases.
            -
          • -
          • In an @import rule in CSS -

            You can import from CSS a file that matches the condition:

            -
            @import url(example.css) not screen and (min-width: 480px)
            -
            -
          • -
          • In HTML -

            You can directly import the CSS file that matches the condition:

            -
            <link rel="stylesheet" media="all and (max-width: 480px)" href="example.css">
            - - - - - - - - - -
            Note
            The disadvantage of this approach is that every time the condition is expanded, the HTML file must be edited. However, since this approach only imports the CSS files that match the condition, the file transmission amount can be reduced.
            -
          • -
          - -

          For more information on the CSS priorities when different media queries are used, see Media Query Priorities.

          - -

          Media Query Conditions

          - -

          You can define the following conditions for the media queries:

          - -
            -
          • Combination and relevancy -

            You can combine multiple conditions into 1 Boolean query with the and operator. To define a negative condition (something not being relevant), use the not operator.

            -
            @media not screen and (min-width: 320px), screen and (max-width: 480px) 
            -{
            -   .example: after {content: "width: 320px ~ 480px"}
            -}
            -
            -
          • -
          • Viewport width -

            You can define the query to match to a specific viewport width range using the min-width and max-width attributes.

            -
            @media all and (min-width: 320px) and (max-width: 480px) 
            -{
            -   .example: after {content: "width: 320px ~ 480px"}
            -}
            -
            -
          • -
          • Device and viewport height -

            The height attribute refers to restoring the viewport's height, and the device-height attribute refers to restoring the resolution set in the device.

            -

            The same difference applies to the width and aspect-ratio attributes, which can assign 'device-'.

            -
            @media screen and (min-device-height: 700px) 
            -{
            -   .example: after {content: "min-device-height"}
            -}
            -@media screen and (min-height: 550px) 
            -{
            -   .example: after {content: "min-height"}
            -}
            -
            -

            In the above example, a device with the width-height resolution of 480/720 has the {content: "min-height"} rule applied as a priority in a portrait screen, but the {content "min-device-height"} rule applied in a landscape screen.

            - -
          • -
          • Device aspect ratio -

            You can use the device-aspect-ratio attribute to check the width-length ratio (aspect ratio) of the printing device.

            -
            @media all and (device-aspect-ratio: 9/16) and (orientation: portrait),  
            -       all and (device-aspect-ratio: 2/3) and (orientation: portrait) 
            -{
            -   .example: after {content: "aspect-ratio, portrait"}
            -}
            -
            - - - - - - - - - -
            Note
            The device aspect ratio is a reliable way to distinguish the portrait and landscape modes of a smart phone. However, because the aspect ratio of all the devices has to be specified, a precise rule is hard to define. (Currently wildly used screen ratios are 15:9, 16:10, 16:9, 3:2, and 4:3, but devices with other screen ratios may be added in the future.)
            -
          • -
          - -

          Media Query Priorities

          - -

          When multiple media queries and conditions are defined, CSS is applied with the following priorities:

          -
            -
          • In case of the CSS reiteration declaration, the CSS that has been declared last is applied.
          • -
          • In case of specificity, the CSS with the highest specificity is applied. -

            The specificity is calculated as follows:

            • id attribute = 100
            • -
            • class attribute = 10
            • -
            • element = 1
            -

            Selectors, such as section#content > .title p, carry the specificity of 112.

          • -
          • In case of user override, the user CSS is applied instead of the creator CSS.
          • -
          • CSS is applied first based on the conditions in the @import rule, then based on the conditions in CSS, and finally based on the conditions in HTML.

          • -
          • In media queries, regardless of CSS priority, CSS which has not been imported still exists based on the conditions.

          • -
          - -

          To apply media query, consider an example with the following files:

          -
          -<!--example.html-->
          -<link rel="stylesheet" media="all and (max-width: 768px)" href="c.css">
          -<link rel="stylesheet" media="all and (max-width: 768px)" href="a.css">
          -<link rel="stylesheet" media="all and (min-width: 768px)" href="b.css">
          -<style>
          -   @media all and (max-width: 400px) 
          -   {
          -      .example: after {content: "In HTML head"}
          -   }
          -</style>
          -
          -<!--a.css-->
          -body {background-color: #ccc}
          -
          -@media screen and (max-width: 480px) 
          -{
          -   .example: after {content:"a.css : width: ~ 480px"}
          -}
          -@media screen and (min-width: 480px) and (max-width: 768px) 
          -{
          -   .example: after {content: "a.css : width: 480px ~ 768px"}
          -}
          -
          -<!--b.css-->
          -@import url("c.css");
          -
          -body {background-color: #333; color: #fff}
          -
          -@media screen and (min-width: 768px) and (max-width: 1024px) 
          -{
          -   .example: after {content: "b.css : width: 768px ~ 1024px"}
          -}
          -
          -<!--c.css-->
          -body {background-color: tomato}
          -
          -@media screen and (min-width: 768px) and (max-width: 1024px) 
          -{
          -   .example: after {content: "c.css : width: 768px ~ 1024px"}
          -}
          -@media screen and (min-width: 1024px) and (max-width: 1280px) 
          -{
          -   .example: after {content: "c.css : width: 1024px ~ 1280px"}
          -}
          -
          - -

          The CSS is applied based on the viewport:

          -
            -
          • If the viewport is 320 px: -
              -
            • The a.css file is applied (based on content: "a.css : width: ~ 480px").
            • -
            • The c.css and b.css files are not imported.
            • -
            • CSS is applied instead of the HTML <head> (the a.css file has higher priority than content: "In HTML head").
            • -
          • -
          • If the viewport is 700 px: -
            • The a.css file is applied (based on content: "a.css : width: 480px ~ 768px").

            • -
            • The c.css and b.css files are not imported.
          • -
          • If the viewport is 900 px: -
              -
            • The b.css file is imported.
            • -
            • c.css is applied (based on content: "c.css : width: 768px ~ 1024px").
            • -
            • The a.css file is not imported.
            • -
            • The b.css file is applied (based on content: "b.css : width: 768px ~ 1024px").
            • -
          • -
          - - -

          Creating a Liquid Layout

          -

          To enhance the user experience of your application, you must learn to define media queries to determine the styles to be used in the Web document. This example creates a simple Web document with a liquid layout that organically changes according to the device resolution to show the optimized layout on both portrait and landscape modes.

          - - -
            -
          1. Define a page with title and content elements: -
            -<header>
            -   <h1>Media queries tutorial</h1>
            -   <h1><img src="logo.png" alt="Tizen"></h1>
            -</header>
            -<div class="container">
            -   <section class="contents">
            -      <h2>Section Title</h2>
            -      <p class="desc">
            -         The quick brown fox jumps over a lazy dog.  The quick brown...
            -      </p>
            -   </section>
            -   <aside>
            -      Aside
            -   </aside>
            -</div>
            -
          2. -
          3. Define basic styles for the page, using a flexible box (in mobile or wearable applications) and multi-column (in mobile applications only) layout with 2 columns. (The following figure applies to mobile applications only.) -
            -.container 
            -{
            -   display: -webkit-flex;
            -}
            -.container aside 
            -{
            -   -webkit-flex: 1 0 20%;
            -}
            -.contents 
            -{
            -   -webkit-columns: 5em 3;
            -   -webkit-column-rule: 1px solid #999;
            -   -webkit-column-gap: 2em;
            -   -webkit-flex: 1 1 auto;
            -}
            -.contents h2 
            -{
            -   -webkit-column-span: all;
            -}
            -
            - -

            Fixed layout example (in mobile applications only)

            -

            The page is easy to view as long as the screen width is about 600 px; however, in a smaller screen below 400 px, the legibility rapidly decreases. You can edit the layout by reducing the number of columns to 1 and moving the Aside area at the bottom of the screen, but those changes then decrease legibility on a wider screen.

            - -
          4. -
          5. -

            To solve the problem, use a media query to define a liquid layout that changes according to the screen resolution:

            - -
            -@media all and (max-width: 480px) and (orientation: portrait) 
            -{
            -   .contents {-webkit-columns: 1;}
            -}
            -@media all and (min-width: 480px) and (max-width: 768px) 
            -{
            -   .contents {-webkit-columns: 2;}
            -   .container {display: -webkit-flex;}
            -}
            -
            -

            With the above media query, the normal resolution has 2 columns (shown on the right in the figure), while in a smaller resolution in a portrait mode only 1 column is used (shown on the left). (The following figure applies to mobile applications only.)

            -

            Liquid layout example (in mobile applications only)

            - -
          6. -
          7. If you need to define specific styles for a certain resolution range, simply add more media queries. However, too many conditions make the maintenance harder, so carefully consider what kind of resolution ranges you need. -

            - -

            The following conditions are generally used and cover all possibilities up to a Web browser in a PC:

            -
            -<!--Portrait mode of a smart phone-->
            -@media screen and (max-width: 480px) and (orientation: portrait) {<!--Specific layout-->}
            -
            -<!--Landscape mode of a smart phone and a small tablet-->
            -@media screen and (min-width: 480px) and (max-width: 768px) {<!--Specific layout-->}
            -
            -<!--Tablet and a small laptop-->
            -@media screen and (min-width: 768px) and (max-width: 1024px) {<!--Specific layout-->}
            -
            -<!--PC browser-->
            -@media screen and (min-width: 1024px) {<!--Specific layout-->}
            -@media print {<!--Specific layout-->}
            -
          8. - -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/multi_mw.htm b/org.tizen.ui.guides/html/web/w3c/multi_mw.htm deleted file mode 100755 index 798e73d..0000000 --- a/org.tizen.ui.guides/html/web/w3c/multi_mw.htm +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - - - - - - - - CSS Multi-column Layout Module: Creating Multi-column Layouts - - - - - -
          -

          CSS Multi-column Layout Module: Creating Multi-column Layouts

          - - -

          You can arrange the screen content into columns. Using the CSS column- properties, the content elements can flow between columns when the column height or number changes. You can use the properties alone to create a basic layout, or add JavaScript code to make the layout dynamic.

          - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          You can manage the following column-related features:

          - - - - - - - - - - - -
          Note
          Up to Tizen SDK version 2.2, most CSS properties and values used in Tizen required the -webkit- prefix. To ensure future compatibility, these properties can now be used with or without the prefix.
          - -

          Setting the Column Number and Width

          - -

          When the layout is set to a constant number of columns using the column-count (or -webkit-column-count) property, the column width is set to fill the available horizontal space.

          -

          In the following code snippet and figure, the column number is set to 4. As a result, on a 480 x 800 display (shown on the top), the column width is 116 px, whereas on a 720 x 1280 display (shown on the bottom), the column with is 143 px.

          -

          The following code snippet demonstrates how to use the column-count property. For a complete source code, see multi_column_column_count/renamed_index.html.

          -
          -article
          -{
          -   column-count: 4;
          -   -webkit-column-count: 4;
          -   margin: 10px;
          -}
          -
          - -

          Figure: 4 columns on different resolution displays

          -

          4 columns on different resolution displays

          - -

          The column-width (or -webkit-column-width) property sets the base column width.

          -

          In the following code snippet and figure, the column width is set to 153 px, but the effective column width is 288 px for a 480 x 800 display (shown on the left) and 154 px for a 720 x 1280 display (shown on the right). The parameter sets the column to at least the defined width, but not wider than the available display space or twice the defined width. The actual column width is calculated using a pseudo-algorithm.

          -

          The code snippet shows how the multi-column layout is implemented when the vertical space is limited. If there is more content than fits the available space, the next column is set outside the available space. Using the overflow: scroll property, the column can be scrolled horizontally.

          -

          The following code snippet demonstrates how to use the column-width property. For a complete source code, see multi_column_column_width/renamed_index.html.

          -
          -article
          -{
          -   width: 90vw;
          -   height: 90vh;
          -   column-width: 153px;
          -   -webkit-column-width: 153px;
          -   margin: 5vw;
          -   background: #c3c8ca;
          -   overflow: scroll;
          -}
          -
          - -

          Figure: Column width 153 px on different resolution displays

          -

          Column width 153 px on different resolution displays

          - -

          Setting the Column Gap

          -

          The column-gap (or -webkit-column-gap) property sets the distance between columns. The property affects the column width, as the column width, gap, and margins all take available space. In the following code snippet and figure, the column gap is set to 17 px.

          -

          The following code snippet demonstrates how to use the column-gap property. For a complete source code, see multi_column_column_gap/renamed_index.html.

          -
          -article 
          -{
          -   height: 303px;
          -   column-width: 153px;
          -   -webkit-column-width: 153px;
          -   column-gap: 17px;
          -   -webkit-column-gap: 17px;
          -   margin: 7px;
          -   padding: 3px;
          -   background: #c3c8ca;
          -}
          -
          - -

          Figure: Column gap

          -

          Column gap

          - -

          Setting the Column Rule

          -

          The column-rule (or -webkit-column-rule) property displays a vertical line in the middle of the column gap.

          -

          The rule has analogical parameters, such as width, line style, and color, but its size is not included in the available space, and it is a drawing similar to the background.

          - -

          Rules are only displayed in the content area. If the padding property is set in the same element, the rule appears shorter than the background. In the following code snippet and figure, the rule width is set to 5 px.

          -

          The following code snippet demonstrates how to use the column-rule property. For a complete source code, see multi_column_column_rule/renamed_index.html.

          -
          article 
          -{
          -   -webkit-column-rule-width: 5px;
          -   -webkit-column-rule-color: rgb(92, 203, 246);
          -   -webkit-column-rule-style: solid;
          -}
          -
          - -

          Figure: Column rule

          -

          Column rule

          - - - - - - - - - - -
          Note
          In Tizen SDK version 2.2, to avoid displaying the rules incorrectly, do not use the column-rule (or -webkit-column-rule) property with horizontal scrolling of the columns.
          - -

          Setting the Column Span

          -

          By default, all elements within the columns are no wider than the column width. The column-span (or -webkit-column-span) property can be used to display content across all columns.

          -

          When using this property with column elements which have the column-count or column-width property set, the following restrictions apply:

          -
            -
          • Column element height is not used and elements in columns take more vertical space than is set in height.
          • -
          • If the column element has the overflow property set to hidden, the column-span property is ignored.
          • -
          • An element using the column-span property does not have to be a direct child of the column element.
          • -
          -

          In the figure below, the blue arrow shows the order of the column elements. In the upper header area, the column-span property is not used, and in the lower header area, the column-span property is set to all, as in the following code snippet.

          -

          The following code snippet demonstrates how to use the column-span property. For a complete source code, see multi_column_column_span/renamed_index.html.

          -
          -article.left header 
          -{
          -   column-span: all;
          -   -webkit-column-span: all;
          -}
          -
          - -

          Figure: Column span

          -

          Column span

          - -

          Setting the Column Break

          -

          By default, column elements are broken to balance column height. The break-before (or -webkit-column-break-before), break-after (or -webkit-column-break-after), and break-inside (or -webkit-column-break-inside) properties can be used to define that an element cannot be broken between columns (set to avoid), or that an element must begin or end within a given column.

          - -

          The following code snippet and figure illustrate the use of the break- property. In the upper header area, the break- property is not used, and in the lower header area, the break-before property is set to always.

          -

          The following code snippet demonstrates how to use the column-break property. For a complete source code, see multi_column_column_break/renamed_index.html.

          -
          -article.lower section
          -{
          -   break-before: always;
          -   -webkit-column-break-before: always;
          -}
          -
          - -

          Figure: Column break

          -

          Column break

          - -

          Creating a Basic Layout

          - -

          To enhance the user experience of your application by providing a consistent behavior across a wide range of displays with different resolution and orientation, you must learn to create a basic layout using CSS:

          - -
            -
          1. -

            Create the HTML layout, defining separate sections for the column content and including an image file:

            -
            -<body>
            -   <article id="article">
            -      <section>
            -         <header>
            -            <h1>Section 1</h1>
            -         </header>
            -         <p>Lorem ipsum dolor (...), id.</p>
            -         <img src="images/pinwheel_green.png" alt="">
            -         <p>Maecenas at (...)tortor.</p>
            -      </section>
            -      <section>
            -         <header>
            -            <h1>Section 2</h1>
            -         </header>
            -         <img src="images/Tizen_Pinwheel_Secondary_Confetti.png" alt="">
            -         <p>Nullam bibendum (...) Curabitur.</p>
            -         <img src="images/Tizen_WhiteFold_4.png" alt="">
            -      </section>
            -      <section>
            -         <header>
            -            <h1>Section 3</h1>
            -         </header>
            -         <p>Sed sagittis, (...) Vivamus sed est sit amet.</p>
            -         <img id="figure" src="images/pinwheel_yellow.png" alt="">
            -         <p>Pellentesque habitant (...). Duis lobortis, nibh.</p>
            -      </section>
            -   </article>
            -</body>
            -
          2. - -
          3. Set the CSS column properties: -
              -
            1. -

              The article element acts as a multi-column container. Set the column-width (or -webkit-column-width) property to enable the multi-column layout:

              - -
              -article 
              -{
              -   width: 80vw;
              -   column-width: 119px;
              -   -webkit-column-width: 119px;
              -
              -   margin: 2vh 5vw;
              -   padding: 2vh 5vw;
              -   background: #c3c8ca;
              - -

              The column-width property defines the default column width but the visible width is not always similar. An algorithm calculates the width according to available space. Normally, a column has a different display width from the one set in the property because as the columns are sized to fill all available space.

              -

              For example, on a 480 x 800 display with portrait orientation, the device width is 123 px, whereas on a 720 x 1280 display with a landscape orientation, the width is 120 px. The space available for columns is the width attribute value reduced by padding, in this case 80vw - (2 * 5vw) = 70vw, which means 70/100 width of the device display.

              -
            2. -
            3. -

              Use the column-gap (or -webkit-column-gap) property to set the distance between columns:

              -
              -   column-gap: 10px;
              -   -webkit-column-gap: 10px;
              -
              -
            4. -
            5. - -

              Use the column-rule (or -webkit-column-rule) property to draw a vertical line between columns. Define the width, color, and style of the rule:

              - -
              -   -webkit-column-rule-width: 1px;
              -   -webkit-column-rule-color: #677784;
              -   -webkit-column-rule-style: solid;
              -   column-rule-width: 1px;
              -   column-rule-color: #677784;
              -   column-rule-style: solid;
              -}
              - -

              The rule width does not increase the distance between columns. It is drawn under the column gap and can be even wider than the gap.

              - -
            - -

            The figure below shows the layout with the column-rule width set to 40 px and the column-gap set to 10 px.

            - -

            Figure: Column settings

            -

            Column settings

            -
          4. -
          5. -

            Define the footer element with the display height set to 5/100 and padding set to 2 * 2vh:

            - -
            -footer 
            -{
            -   padding: 2vh;
            -   height: 5vh;
            -   background: rgba(103, 119, 132, 0.2);
            -}
            -
            -
          6. -
          7. -

            Define the section elements setting the border-bottom and vertical padding values. It is not necessary to define horizontal padding, as it has been defined for the article element.

            - -
            -article>section
            -{
            -   border-bottom: 1px solid #d8d9d4;
            -   padding: 4px 0;
            -   text-align: center;
            -}
            -
            -
          8. -
          9. -

            Set image elements to have an automatic margin to center them within the column.

            -

            In case of the image whose id attribute is set to figure, set it to be a floating element with text drawn around it.

            - -
            -img{
            -   display: block;
            -   margin: 4px auto;
            -}
            -
            -#figure
            -{
            -   float: right;	
            -   margin: 4px;
            -}
            -
            -
          - -

          The following figures illustrate the created layout in different display sizes and orientations.

          - -

          Figure: Basic layout on a 480 x 800 display

          -

          Basic layout on a 480 x 800 display

          - -

          Figure: Basic layout on a 720 x 1280 display

          -

          Basic layout on a 720 x 1280 display

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - -

          Creating a Layout with Dynamic Content

          - -

          To enhance the user experience of your application by providing a consistent behavior across a wide range of displays with different resolution and orientation, you must learn to create a layout displaying a varying amount of content using CSS:

          -
            -
          1. -

            Create the HTML layout. The article element displays the columns, and the nav element contains buttons to add and remove content in the columns.

            -
            -<body>
            -   <article id="article">
            -   </article>
            -   <nav>
            -      <a id="addSections" href="#">Add images</a> 
            -      <input type="number" id="howMany" value="3"> 
            -      <a id="removeGroup" href="#">Remove last Group</a>
            -   </nav>
            -   <footer> Multicolumn Layout Tutorial 02</footer>
            -</body>
            -
            -
          2. -
          3. Set the CSS properties: -
              -
            1. -

              Define the CSS display and column properties:

              -
              -body 
              -{
              -   display: flex;
              -   display: -webkit-flex;
              -   flex-direction: column;
              -   -webkit-flex-direction: column;
              -   background: #fefffa;
              -}
              -
              -
            2. -
            3. -

              Set the article, nav and footer elements in one column using the flexible box layout.

              -

              The nav element is also a flexible box layout container to set UI elements in.

              -
              -nav 
              -{
              -   height: 20vh;
              -   padding-left: 20%;
              -   padding-top: 10px;
              -   display: flex;
              -   display: -webkit-flex;
              -   flex-flow: row wrap;
              -   -webkit-flex-flow: row wrap;
              -   flex: none;
              -   -webkit-flex: none;
              -   justify-content: space-around;
              -   -webkit-justify-content: space-around;
              -   align-items: center;
              -   -webkit-align-items: center;
              -   background: url(../images/white_logo.png) no-repeat;
              -   background-position: 2%;
              -   background-size: auto 70%;
              -}
              -
              -
            4. -
            5. -

              Define the styles for the a elements within the nav element to make them appear as buttons:

              -
              -nav a 
              -{
              -   margin: 3px;
              -   border-radius: 5px;
              -   padding: 5px 15px;
              -   background: rgba(103, 119, 132, 0.2);
              -   text-align: center;
              -   font-weight: bold;
              -}
              -
              -

              When the user taps the Add images button, the images and their descriptions are displayed.

              -
            6. -
            7. -

              Define the input element (with the property type set to number) style with an increased height to match the buttons around it:

              -
              -nav input
              -{
              -   width: 50px;
              -   height: 2em;
              -}
              -
              -
            8. -
            9. -

              The article element contains the column properties. Use the -webkit-column-width property to set the column width. The real width is calculated based on available space.

              -
              -article 
              -{
              -   width: 90vw;
              -   column-width: 136px;
              -   -webkit-column-width: 136px;
              -   margin: 1vh 2vh;
              -   padding: 1vh;
              -   background: #c3c8ca;
              -}
              -
              -
            10. -
            11. -

              Set the images within the article element with a block display to separate them from text:

              -
              -article img 
              -{
              -   margin: 0 auto;
              -   display: block;
              -}
              -
              -
            12. -
            13. -

              Define the column-span property as all for the h1 elements:

              -
              -article>h1 
              -{
              -   background: rgba(103, 119, 132, 0.5);
              -   padding: 4px;
              -   text-align: center;
              -   color: #eed484;
              -   column-span: all;
              -   -webkit-column-span: all;
              -}
              -
              -

              As a result, the h1 elements are spread across the columns. When the column-span property is used, you cannot have more columns than can fit in the available horizontal space.

              -
            14. -
            15. -

              Define the break-inside property as avoid to avoid breaking elements between columns:

              -
              -article>section 
              -{
              -   break-inside: avoid;
              -   -webkit-column-break-inside: avoid;
              -   border-bottom: 1px solid #d8d9d4;
              -   padding: 4px 0;
              -   text-align: center;
              -}
              -
              -
            16. -
            17. -

              Set the footer size:

              -
              -footer 
              -{
              -   padding: 2vh;
              -   height: 5vh;
              -   background: rgba(103, 119, 132, 0.2);
              -}
              -
              -
            18. -
            -
          4. -
          5. Add the JavaScript code to make the content dynamic: -
              -
            1. -

              Declare a variable for the images. Elements included in the variable amount to data displayed in a column layout, such as a newsfeed:

              -
              -var images = ["images/pinwheel_green.png",
              -              "images/Tizen_Pinwheel_Secondary_Confetti.png", 
              -              "images/Tizen_WhiteFold_4.png", 
              -              "images/pinwheel_yellow.png"];
              -
              -
            2. -
            3. -

              Declare a variable for the input element for selecting the number of images added to the content:

              -
              -var howManyInput;
              -
              -
            4. -
            5. -

              Use the addGroup() method with the input parameter value to add random images to the column layout and initialize the button events:

              - -
              -window.onload = function() 
              -{
              -   addGroup(4);
              -   howManyInput = document.getElementById('howMany');
              -   var addBtn = document.getElementById('addSections');
              -   addBtn.onclick = function() 
              -   {
              -      addGroup(howManyInput.value);
              -
              -      return false;
              -   };
              -   var removeBtn = document.getElementById('removeGroup');
              -   removeBtn.onclick = function() 
              -   {
              -      removeGroup();
              -
              -      return false;
              -   };
              -};
              -
              -
            6. -
            7. -

              Declare the h1No variable containing the number of h1 elements included in the article elements, and one added to next lines.

              - -

              Declare the newHTML variable to add new content to the column layout. Each added element contains an h1 element as a header, and section elements. Include an img element with a text description in each section element to display a random image. The art variable is initialized, and new HTML code (newHTML) is concatenated with the existing one (innerHTML):

              -
              -function addGroup(howMany) 
              -{
              -   var h1No = document.querySelectorAll('article>h1').length + 1;
              -   var newHTML = "<h1>Group " + h1No + "</h1>";
              -   var i;
              -
              -   for (i = 0; i < howMany; ++i) 
              -   {
              -      newHTML += "<section><img alt='' src='";
              -      newHTML += images[Math.floor(Math.random() * 4)];
              -      newHTML += "'>Lorem ipsum dolor sit amet diam sodales rutrum.</section>";
              -   }
              -   var art = document.getElementById("article");
              -   art.innerHTML += newHTML;
              -}
              -
              -
            8. -
            9. -

              When the user taps the Remove last Group button, the removeGroup() method is called to remove the group of images that was added last. Use the all variable to select all h1 elements in the content using the querySelectorAll() method. If the last value is less than 0, there is no element to remove. Use the removeNextSibling() method to recursively delete the next sibling element, and the removeChild() method to remove the h1 elements from its parent.

              -
              -function removeGroup() 
              -{
              -   var all = document.querySelectorAll('article>h1');
              -   var last = all.length - 1;
              -   if (last < 0) 
              -   {
              -      return;
              -   }
              -   removeNextSibling(all[last].nextSibling);
              -   all[last].parentElement.removeChild(all[last]);
              -}
              -
              -
            10. -
            -
          -

          The following figures illustrate the created layout in different display sizes and orientations.

          - -

          Figure: Dynamic layout on a 480 x 800 display

          -

          Dynamic layout on a 480 x 800 display

          - -

          Figure: Dynamic layout on a 720 x 1280 display

          -

          Dynamic layout on a 720 x 1280 display

          -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/multiple_screens_mw.htm b/org.tizen.ui.guides/html/web/w3c/multiple_screens_mw.htm deleted file mode 100755 index 6af563d..0000000 --- a/org.tizen.ui.guides/html/web/w3c/multiple_screens_mw.htm +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - - - - - - - Multiple Screen Support: Supporting Different Screen Sizes - - - - - -
          -

          Multiple Screen Support: Supporting Different Screen Sizes

          - -

          Tizen is available in various devices which support different screen sizes and resolutions. When developing Tizen Web applications, you must take this into account if you want your application to function well in various device models.

          - - - - - - - - - - - -
          Note
          This feature is supported in mobile applications only.
          - -

          Before implementing multiple screen support, make sure you are familiar with the key concepts of multiple screen support.

          -

          Tizen provides the UI scalability resolution feature, which allows you to create scalable applications.

          -

          To optimize images used in Web applications, images based on a single resource can be used in various resolutions.

          -

          Key Concepts

          -

          Before building a Web application for multiple resolutions, make sure you are familiar with the following W3C Web content scaling standards, which must be taken into account when developing Web applications:

          -
            -
          • Viewport meta tag
          • -
          • CSS media query
          • -
          -

          Viewport Meta Tag

          -

          A viewport defines the application area that displays the Web page content.

          -

          In a Web browser, the viewport size depends on the browser window size. If the viewport is smaller than the Web content size, horizontal and vertical scrollbars are displayed for page navigation. The Web browser viewport does not support the zoom feature. However, in a mobile Web browser, there are no window scrollbars and the viewport supports the zoom feature.

          -

          The viewport meta tag enables you to customize the viewport size and zoom levels in a majority of mobile Web browsers. Using this tag, you can set the width, height, initial scale, and scale range for Web pages.

          -

          To use the viewport meta tag while developing Web applications, you must note the following:

          -
            -
          • The device-height and device-width attributes defined in the viewport meta tag are not the same as the real device width and height in pixels.
          • -
          • Using the viewport meta tag, the Web browsers of different devices display the same content with different layout size and scale factor. The scale factor is calculated using the device pixel ratio (DPR).
          • -
          -

          CSS Media Query

          -

          The CSS media query enables you to set conditions for particular media features and types to apply different CSS files for the application content. For Web content scaling, you can use the CSS media query to, for example:

          -
            -
          • Define the image resource to be used based on the screen dots per inch (DPI) ratio.
          • -
          • Determine the CSS layout to be used based on the screen width.
          • -
          -

          -

          UI Scalability

          -

          With UI scalability, you can support multiple screen resolutions in a single Tizen Web application. Tizen automatically converts and translates the size and position values that are defined in the application's logical resolution to the physical resolution at runtime. The Tizen Advanced UI (TAU) uses the viewport meta tag to fit the Web page into the device screen, and the rem unit to determine the size of the Tizen Web UI components.

          -

          Setting the Viewport

          -

          Tizen devices support a variety of screen resolutions and dots per inch (DPI) values. If the viewport meta tag is not defined, TAU uses the default viewport width and scale factor. This ensures that Web content layout varies between different screen resolutions.

          -

          In the following example, the viewport width is set to device-width, which is determined by the width of the Tizen device. The device-width value is retrieved to set similar virtual DPI values and to display UI components with similar physical sizes across all devices. (TAU uses the example value by default, if no other viewport value is defined.)

          -
          <meta name="viewport"
          -      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
          -

          If the viewport width is set to device-width, the width and scale factor values are calculated by the Web browser. The following table shows different layout sizes and scale factors of the Tizen Web site (http://tizen.org) on different devices with the viewport width set to device-width.

          -
          <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - Table: Layout size and scale factor -
          Device screen resolutionReal screen DPIDevice DPIWeb browser pageViewport widthScale factor
          720 x 1280306320captured screen1360 px2.0
          480 x 800218240captured screen2320 px1.5
          -

          Working with Tizen Web Winsets

          -

          The default sizes of Tizen Web winsets (such as Popup, Button, and Checkbox) are designed based on the reference viewport DPI of 160. Therefore, these winsets are of similar sizes on any Tizen device if the viewport width is set to device-width.

          -

          If you manually set the viewport width of your application to a fixed value, the Tizen Web winsets may not fit appropriately in the application. To avoid the problem, Tizen Web winsets use the rem unit for the winset length, which depends on the base font size of the winset. Each Tizen Web winset theme has its own base font size, and the <html> element font size is also set to the base font size. If the viewport width is set to a fixed value, this base font size is recalculated and set to the <html> element to adjust the Tizen Web winset sizes accurately.

          -

          Creating Applications Supporting Multiple Screens

          -

          To create an application that supports multiple screen sizes, you must consider the following while coding your application:

          -
            -
          • Configuring the viewport
          • -
          • Optimizing resources
          • -
          • Creating screen resolution-independent UI
          • -
          -

          Configuring the Viewport

          -

          To use UI scalability in your application, set the viewport meta tag while creating a Web application project in IDE. To configure the viewport in the Tizen Web applications, add the viewport meta tag in the <head> section of the index.html file:

          -
          <meta name="viewport"
          -      content="width=device-width, initial-scale=1.0,
          -               minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
          -

          Optimizing Resources

          -

          By default, the Tizen Advanced UI (TAU) consists of the HD Web winsets. The winset scale is lowered for lower screen resolution devices. To optimize resources for different screen resolutions and devices, use the CSS media query for different resolutions available in Tizen. You can use CSS media queries in the HTML or CSS files.

          -

          In the HTML file:

          -
          <link media="only screen and (min-resolution: 320dpi)"
          -      href="high-quality-images.css" type= "text/css" rel="stylesheet">
          -

          In the CSS file:

          -
          @media screen and (max-resolution: 159dpi)
          -{
          -   <!--Set styles-->
          -}
          -
          -@media screen and (min-resolution: 160dpi and max-resolution: 239dpi)
          -{
          -   <!--Set styles-->
          -}
          -
          -@media screen and (min-resolution: 240dpi and max-resolution: 319dpi)
          -{
          -   <!--Set styles-->
          -}
          -
          -@media screen and (min-resolution: 320dpi)
          -{
          -   <!--Set styles-->
          -}
          -
          -

          You can also set different layout and resources for the portrait and landscape views in the CSS file:

          -
          @media screen and (orientation: portrait)
          -{
          -   <!--Set styles-->
          -}
          -
          -@media screen and (orientation: landscape)
          -{
          -   <!--Set styles-->
          -}
          -
          -

          Creating Screen Resolution-independent UI

          -

          The Tizen base font size is 22 px. This base font size value varies based on the device screen resolution. However, to create a screen resolution-independent UI, the Web browser engine renders the base font size as a logical pixel size instead of a physical pixel size.

          -

          Image Resolution Optimization

          - -

          In Web applications, optimization of applications for various platforms (regarding devices, OS, and resolution) is efficient.

          -

          Media Queries and Flexible Box Layout can be used to create flexible layouts, and to build the deployable package easily.

          - -

          Images can be used in Web applications in the following ways:

          - -

          When selecting an option from the list above, consider the type of the image resource you are going to use.

          -

          You can use the following types of image resources:

          - -

          Photos

          -

          An image can be added to an application using the HTML img tag, or CSS background property as shown in the following example:

          -
          <!--HTML-->
          -<img src="images/sample.jpg" alt="sample image" />
          -
          -<!--CSS-->
          -.photo
          -{
          -   background: url(../images/sample.jpg) 0 0 no-repeat;
          -   background-size: 100%;
          -   width: 100%;
          -   height: 200px;
          -}
          -
          -

          In terms of performance, there is no difference between the options.

          - -

          The image color is expressed based on pixels. Therefore, the higher resolution an image has, the better it looks on a large screen. For full HD display, a resolution bigger than the image size displayed on the screen is needed. However, since a high resolution image tends to have a large size, limit the image size as to fit the maximum screen size:

          -
          • 1024 x 768 px: 90 KB
          • 300 x 200 px: 39 KB
          • 300 x 200 px: 15 KB
          -

          Current full HD displays have a resolution that is 1.5 to 2 times bigger than the actual screen size. The image quality is guaranteed if you size images as 2 times bigger than their original size.

          -
          img
          -{
          -   max-width: 100%;
          -}
          -
          - -

          Figure: Enlarging a low-resolution image

          -

          Enlarging a low-resolution image

          -

          Icons

          -

          Icons generally have a fixed size. Size icon images as 2 times bigger than their original size. Using the CSS3 background-size property, you can add an image with the size of, for example, 40 x 40 px, compressed as 20 x 20 px.

          -
          .prev_icon, .next_icon
          -{
          -   padding-left: 30px;
          -   height: 30px;
          -   line-height: 30px;
          -   font-size: 1.2em;
          -   background-repeat: no-repeat;
          -   background-position: 0 50%;
          -   background-size: auto 20px;
          -}
          -
          -.prev_icon.icon1
          -{
          -   background-image: url(../images/page_navi_arrow_left_01.png);
          -}
          -
          - -

          When multiple icons are used on a page, all the image files are called separately. This slows down the loading speed and causes a large number of network roundtrips, as illustrated in the figure below.

          - -

          Figure: Network speed when calling each image separately

          -

          Calling each of image separately

          - -

          You can use the sprite image technique (grouping multiple images as one and showing the only desired images defined with the background-position property) to noticeably reduce the page loading speed without any loss in quality of the image, as the following example shows. -

          -
          .prev_icon, .next_icon
          -{
          -   background-size: 20px auto; <!--Full HD Display-->
          -   background-image: url(../images/page_navi_arrow.png);
          -}
          -
          -.prev_icon.icon1
          -{
          -   background-position: 0 0;
          -}
          -
          -.prev_icon.icon2
          -{
          -   background-position: 0 -50px;
          -}
          -
          -

          Figure: Network speed when using sprite images

          -

          Network speed when using sprite image

          -

          Animated Images

          -

          Animated images can be created in various formats and with many tools, such as GIF, JavaScript, Canvas, and SVG.

          - -

          To create a simple and repetitive animation effect as below as effectively as possible, use GIF images, JavaScript, or the CSS3 animation attribute.

          -

          Figure: JAVA mascot character in GIF (source: http://lea.verou.me)

          -

          JAVA mascot character  in GIF


          - -

          Below, the network capacity usage and timeline using the following animation types are compared using the Web Inspector:

          - - -

          GIF Animation

          - -

          Using GIF animation, the resource usage is as follows:

          -
          • Events: Fires only the painting event
          • -
          • Memory: 3 ~ 4 MB
          • -
          • Network: 10 ~ 25 ms
          • -
          - -

          Figure: Events for a GIF image

          -

          Events


          -

          Figure: Memory usage of a GIF image

          -

          Memory


          -

          Figure: Network capacity usage of a GIF image

          -

          Network


          - -

          GIF animation can be created in various resolutions without quality loss, when you use the option introduced in Photos. This, however, increases memory occupancy.

          - -

          JavaScript Animation

          - -

          JavaScript animation is less affected by enlarging or reducing its screen size. However, it uses a lot of device resources compared to using CSS3 animations:

          -
          • -Events: Event is fired every 100 ms, the interval of setInterval().
          • -Memory: Increases in proportion to time, from the initial size 90 KB.
          • -Network: Used until the animation is stopped.
          -

          Figure: Events for a JavaScript animation

          -

          Events


          -

          Figure: Memory usage of a JavaScript animation

          -

          Memory


          -

          Figure: Network capacity usage of a JavaScript animation

          -

          Network


          -

          The following example shows how JavaScript animation can be implemented:

          -
          <script>
          -   var obj = document.querySelector(".animated img"), flag = 0;
          -   function animate()
          -   {
          -      obj.src = './images/sprite_' + ((flag++) % 10) + '.png';
          -   };
          -   setInterval(animate, 100);
          -</script>
          -
          - -

          You can use the requestAnimationFrame() method of the Timing control for script-based animations API to prevent animation freezes that occur occasionally:

          - -
          <script>
          -   var obj = document.querySelector(".animated img"), flag = 0, i = 0;
          -   function animate()
          -   {
          -      if (!(i % 6)) obj.src = './images/sprite_' + ((flag++) % 10) + '.png';
          -         i++;
          -      -webkit-RequestAnimationFrame(animate);
          -   };
          -   -webkit-RequestAnimationFrame(animate);
          -</script>
          -
          - -

          CSS3 Animation

          - -

          CSS3 animation has a low usage of events, memory, and network capacity. It is efficient for animations that have a fixed size. However, since CSS3 animation is pixel-based, it is difficult to use for animations that need to be enlarged or reduced, in which case JavaScript is a better option:

          -
          • -Events: Fires only rendering and painting events
          • -Memory: 50 ~ 90 KB
          • -Network: 9 ~ 21 ms
          - -

          Figure: Events for a CSS3 animation

          -

          Events


          -

          Figure: Memory usage of a CSS3 animation

          -

          Memory


          -

          Figure: Network capacity usage of a CSS3 animation

          -

          Network


          - -

          The following example shows how CSS3 animation can be implemented:

          -
          <style>
          -   .css_animation
          -   {
          -      width: 50px;
          -      height: 70px;
          -      background-image: url(../images/sprite.png);
          -      -webkit-animation: cssAni .8s steps(10) infinite;
          -   }
          -
          -   @-webkit-keyframes cssAni
          -   {
          -      from {background-position: 0px;}
          -      to {background-position: -500px;}
          -   }
          -</style>
          -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/selector_w.htm b/org.tizen.ui.guides/html/web/w3c/selector_w.htm deleted file mode 100644 index 8753b68..0000000 --- a/org.tizen.ui.guides/html/web/w3c/selector_w.htm +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - Selectors API Level 1 and Level 2: Selecting DOM Elements - - - - - -
          -

          Selectors API Level 1 and Level 2: Selecting DOM Elements

          - -

          The selectors allow you to select element nodes in the DOM tree by matching them against a group of selectors, and testing whether the element matches a particular selector. Using selectors makes searching and selecting complex elements faster.

          - -

          You can use the querySelector() and querySelectorAll() methods to retrieve the element nodes. Both methods accept a single parameter, a string selector. The string selector is a selector or a group of selectors that can be surrounded by whitespace. If you use a selector group as the string selector with the querySelector() method, the method returns the first element (if any) that matches any of the selectors in the group.

          - -

          The main features of the Selectors API Level 1 and Level 2 include:

          - -

          You can also create an accordion menu.

          - -

          Selecting a Single Node

          -

          To enhance the user experience of your application, you must learn to use selectors to handle page elements, and to select a single node:

          -
            -
          1. To select the first matching element found in the child nodes, use the querySelector() method with CSS selectors. You get the same result as when using the getElementById(), getElementsByTagName(), and getElementsByClassName() methods. -
            var obj1 = document.getElementsByTagName('td')[0]; /* First <td> element in the document */
            -var obj2 = document.getElementById('foo'); /* Element with the ID #foo */
            -var obj3 = document.getElementsByClassName('bar')[0]; /* First element in the bar class */
            -  
            -var obj4 = document.querySelector('td'); /* Same as obj1 */
            -var obj5 = document.querySelector('#foo'); /* Same as obj2 */ 
            -var obj6 = document.querySelector('.bar'); /* Same as obj3 */
            -

            The querySelector() method returns the first matching element node within the subtrees of the context node. If no matching element is found, the method returns null.

          2. -
          3. You can use the CSS selectors to ensure that elements with complex structures can be easily selected. -

            For example, the following example selects the last element among the child nodes of the second <tr> element, which is a child of the <tbody> element in the second <table> element of the document.

            -
            var obj = document.querySelector('table:nth-child(2) tbody > tr:nth-child(2) :last-child');
          4. -
          5. You can use method chaining to select an element: -
            var obj = document.querySelector('table:nth-child(2)');
            -var targetObj = obj.querySelector('tbody > tr:nth-child(2) :last-child')
          6. -
          - -

          Figure: Single node selection (in mobile applications only)

          -

          Single node selection (in mobile applications only)

          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Selecting Multiple Nodes

          -

          To enhance the user experience of your application, you must learn to use selectors to handle page elements, and to select multiple nodes in a node list:

          -
            -
          1. Select an element in the node list using the querySelector() method: -
            var obj = document.querySelector('table:nth-child(2)');
            -

            The querySelector() method returns the first matching element node within the subtrees of the context node. If no matching element is found, the method returns null. The query above selects the second <table> element in the document as a single element.

            -
          2. - -
          3. Select multiple elements in the node list using the querySelectorAll() method, and define a variable to represent the length of the targetObj node list: -
            var targetObj = obj.querySelectorAll('thead th, tbody td');
            -var i = targetObj.length;
            -

            The querySelectorAll() method returns an array containing all of the matching element nodes within the subtrees of the context node, in the document order, and saves the elements in a node list. If there are no matching nodes, the method returns an empty array. The query above selects the <th> elements in the table head and the <td> elements in the table body.

            -
          4. -
          5. Apply a defined style to all elements stored in the targetObj node list: -
            while (0 < i) 
            -{
            -   i--;
            -   targetObj[i].style.backgroundColor = 'orange';
            -   targetObj[i].textContent = 'Exam 3' + i;
            -}
          - -

          Figure: Multiple node selection (in mobile applications only)

          -

          Multiple node selection (in mobile applications only)

          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Creating an Accordion Menu

          - -

          To enhance the user experience of your application, you must learn to retrieve element nodes from the DOM tree to create a simple accordion menu.

          -

          The accordion menu is created using the CSS3 Basic User Interface Module Level 3 API (in mobile or wearable applications). When a title is touched, the relevant content is shown, and other content is hidden.

          -
            -
          1. Create the HTML layout: -
            <ul class="accordion">
            -   <li>
            -      <p class="title current">Title 1<p>
            -      <div>contents 1</div>
            -   </li>
            -   <li>
            -      <p class="title">Title 2</p>
            -      <div>contents 2</div>
            -   </li>
            -   <!--Other list elements-->
            -</ul>
          2. - -
          3. Use CSS transitions to add sliding effects when content appears: -
            .accordion  > li  > div 
            -{
            -   padding: 0 15px;
            -
            -   <!--Assign time for CSS transformation-->
            -   -webkit-transition: all .5s;
            -   opacity: 0;
            -   height: 0;
            -   box-shadow: inset 1px 1px 4px rgba(0, 0, 0, .5);
            -   line-height: 2;
            -}
            -<!--Assign styles to be applied in case the current class is added to p.title-->
            -.accordion  > li  > p.current 
            -{
            -   background: -webkit-linear-gradient(top, #666, #000);
            -   color: #fff;
            -}
            -.accordion > li > p.current + div 
            -{
            -   opacity: 1;
            -   height: 200px;
            -}
          4. -
          5. Use the querySelector() and querySelectorAll() methods to change the class of the subject in the elements where the event is fired: -
            var testAccordion = function(obj) 
            -{
            -   var targetObj = document.querySelector(obj);
            -   var targetLength = document.querySelectorAll(obj + 'li').length;
            -
            -   /* In case the elements are not selected */
            -   if (targetLength <= 0) 
            -      return false;
            -
            -   targetObj.onclick = function(e) 
            -   {
            -      var that = e.target;
            -
            -      /* In case the e.target class is not title */
            -      if ((that.className !== 'title')) return false;
            -
            -      for (var i = 0; i < targetLength; i++) 
            -      {
            -         /* Change all classes of the 'li p' elements at the bottom of .accordion to title */
            -         targetObj.querySelectorAll('li p')[i].className = 'title';
            -      }
            -      /* Define the e.target class as current */
            -      that.className += 'current';
            -   }
            -}
            -
          6. -
          7. Define the elements that use the accordion menu: -
            testAccordion('.accordion');
          - -

          Figure: Accordion menu (in mobile applications only)

          -

          Accordion menu (in mobile applications only)

          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/session_history_w.htm b/org.tizen.ui.guides/html/web/w3c/session_history_w.htm deleted file mode 100644 index 3908cec..0000000 --- a/org.tizen.ui.guides/html/web/w3c/session_history_w.htm +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - HTML5 session history of browsing contexts: Managing Browsing Contexts - - - - - -
          - - -

          HTML5 session history of browsing contexts: Managing Browsing Contexts

          - -

          You can manage the session history of browsing contexts.

          -

          The history interface is used to save in the session history the page information that has been read by the user. You can also use the state object to directly store the page information which has already been analyzed in the URL, or general information which is not stored in the URL (such as location, or the scroll state of the page or a certain DOM element).

          - - -

          The main features of the HTML5 session history of browsing contexts API include:

          -
            -
          • Adding entries to the session history -

            You can use the pushState() method of the history interface to add an entry to the session history. With the replaceState() method, you can update the session history details. -

          • -
          • Detecting session history status changes -

            The popstate event is fired when the user navigates to a page stored in the session history. The popstate event -references the information stored with the pushState() or replaceState() methods, and enables you to change the status of the page based on the stored session history (such as moving focus to a certain DOM element).

            -
          • -
          - -

          Managing Session History Entries

          - -

          Learning how to manage the session history enhances the user browsing experience in your application:

          - -
            -
          1. To add an entry to the session history, use the pushState() method of the history interface: -
            -<script>
            -   history.pushState({index: currentIndex}, document.title);
            -</script>
            -
            - - - - - - - - - -
            Note
            The pushState() method accepts the data, title, and url (optional) parameters. The title parameter refers to the key value used to search for entries saved in the session history, and is currently ignored in all browsers.
            -
          2. - -
          3. To update the entry details, use the replaceState() method: -
            -<script>
            -   history.replaceState({index: currentIndex}, document.title, '#page' + currentIndex);
            -</script>
            -
            -

            The replaceState() method uses the same parameters as the pushState() method. The history_sample.html is the url parameter, which refers to the address of the page that is to be changed.

            -
          4. - -
          5. To use the session history information: -
              -
            1. Implement a page with the Prev and Next buttons: -
              -<nav class="paging">
              -   <a href="#">Prev</a>
              -   <a href="#">Next</a>
              -</nav>
              -<p>Current Index: <output> </output></p>
              -
              -<a href="http://tizen.org/">Tizen.org</a>
              -
              -
            2. -
            3. When the user clicks the buttons, the current index value (representing page numbers) is changed and stored in the state object of the history interface: -
              -var currentIndex = 0;
              -var prev = document.querySelector('.paging > a:nth-child(1)');
              -var next = document.querySelector('.paging > a:nth-child(2)');
              -
              -/* Prev button click event */ 
              -prev.onclick = function() 
              -{
              -   currentIndex -= 1;   
              -   setState(currentIndex);
              -    
              -   return false;
              -};
              -    
              -/* Next button click event */ 
              -next.onclick = function() 
              -{
              -   currentIndex += 1;  
              -   setState(currentIndex);
              -    
              -   return false;
              -};
              -
              -
            4. - -
            5. If the state object has data in it, use the replaceState() method to change the previously stored information. Otherwise, add new info with the pushState() method. -
              -function setState(currentIndex) 
              -{
              -   if (history.state) 
              -   {
              -      history.replaceState({index: currentIndex}, document.title, '#page' + currentIndex);
              -   } 
              -   else 
              -   {
              -      history.pushState({index: currentIndex}, document.title);
              -   }
              -   output.textContent = currentIndex;
              -}
              -
              -
            6. -
            -
          6. -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Detecting Session History Changes

          - -

          Learning how to track session history changes enhances the user browsing experience in your application:

          - -
          1. A page with data stored in the session history fires a popstate event when the page is loaded (for example, because it is refreshed or moved to from the previous page). -

            Register the event listener:

            - -
            -window.addEventListener("popstate", foo, false);
            -
          2. - -
          3. Define the event handler for the event. You can use the data stored in the state object to retrieve the correct location on the page to be loaded. -
            -var output = document.querySelector('output');
            -
            -window.onpopstate = function() 
            -{
            -   currentIndex = history.state.index;
            -   output.textContent = currentIndex;
            -}
            -
            -

            In the snippet above, when a popstate event is fired, it saves the index value stored in the state object to the currentIndex variable, and outputs the <output> element from the correct index location. -

            - -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - - - -
          - -Go to top - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/text_module_w.htm b/org.tizen.ui.guides/html/web/w3c/text_module_w.htm deleted file mode 100755 index bd570e1..0000000 --- a/org.tizen.ui.guides/html/web/w3c/text_module_w.htm +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - - - CSS Text Module Level 3: Manipulating Text - - - - - - -
          -

          CSS Text Module Level 3: Manipulating Text

          - -

          You can apply various text effects easily.

          - -

          The new text features in CSS Text Module Level 3 include:

          -
            - -
          • Text properties -

            You can use CSS text properties, such as text-transform, text-align, text-indent, letter-spacing, and word-spacing, to manipulate and transform text.

          • -
          - -

          Manipulating Text

          - -

          To enhance the user experience of your application, you must learn to handle line breaking, justification, alignment, white space handling, and text transformations using CSS text properties:

          - -
            -
          1. Define the text-transform property within a <style> element in the <head> section of the Web page to control the text capitalization: - -
            -<head>
            -   <style>
            -      p:nth-child(1) {text-transform: none;}
            -      p:nth-child(2) {text-transform: capitalize;}
            -      p:nth-child(3) {text-transform: uppercase;}
            -      p:nth-child(4) {text-transform: lowercase;}
            -      p:nth-child(5) {text-transform: full-width;}
            -   </style>
            -</head>
            -<body>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -</body>
            -
            - -
          2. - -
          3. Define the text-align property, which controls the text alignment: - -
            -<head>
            -   <style>
            -      p:nth-child(1) {text-align: start;}
            -      p:nth-child(2) {text-align: end;}
            -      p:nth-child(3) {text-align: left;}
            -      p:nth-child(4) {text-align: right;}
            -      p:nth-child(5) {text-align: center;}
            -      p:nth-child(6) {text-align: justify;}
            -   </style>
            -</head>
            -
            - -
          4. - -
          5. Define the text-indent property, which controls the text indentation: - -
            -<head>
            -   <style>
            -      p:nth-child(1) {text-indent: 0}
            -      p:nth-child(2) {text-indent: 1em}
            -      p:nth-child(3) {text-indent: -1em}
            -      p:nth-child(4) {text-indent: 5%}
            -      p:nth-child(5) {text-indent: -5%}
            -   </style>
            -</head>
            -
            - -
          6. - -
          7. Define the letter-spacing property, which controls the letter spacing: -
            -<head>
            -   <style>
            -      p:nth-child(1) {letter-spacing: .5em}
            -      p:nth-child(2) {letter-spacing: -.1em}
            -   </style>
            -</head>
            -
            - -
          8. - -
          9. Define the word-spacing property, which controls the space between words: -
            -<head>
            -   <style>
            -      p:nth-child(1) {word-spacing: 1em}
            -      p:nth-child(2) {word-spacing: -.1em}
            -   </style>
            -</head>
            -
            - -
          10. - -
          11. Define the word-break property, which determines the line breaking rules for non-CJK (Chinese, Japanese, and Korean) scripts: -
            -<head>
            -   <style>
            -      p:nth-child(1) {word-break: normal}
            -      p:nth-child(2) {word-break: keep-all}
            -      p:nth-child(3) {word-break: break-all}
            -   </style>
            -</head>
            -
            - -
          12. - -
          13. Define the white-space property, which determines the handling of empty space within an element: -
            -<head>
            -   <style>
            -      p:nth-child(1) {white-space: normal}
            -      p:nth-child(2) {white-space: pre}
            -      p:nth-child(3) {white-space: nowrap}
            -      p:nth-child(4) {white-space: pre-wrap}
            -      p:nth-child(5) {white-space: pre-line}
            -   </style>
            -</head>
            -<body>
            -   <p>The quick brown fox jumps
            -   over a lazy dog.</p>
            -   <p>The quick brown fox jumps
            -   over a lazy dog.</p>
            -   <p>The quick brown fox jumps
            -   over a lazy dog.</p>
            -   <p>The quick brown fox jumps
            -   over a lazy dog.</p>
            -   <p>The quick brown fox jumps
            -   over a lazy dog.</p>
            -</body>
            -</html>
            -
            - -
          14. - -
          15. Define the text-shadow property, which adds a shadow effect to text: -
            -<head>
            -   <style>
            -      p:nth-child(1) {text-shadow: 0.1em 0.1em 0.2em rgba(0, 0, 0, .7)}
            -      p:nth-child(2) {text-shadow: -0.2em 0.2em 0.2em #000, 0.2em -0.2em 0.2em #f00}
            -      p:nth-child(3) {color: #fff; text-shadow: 0 0 .7em #000;}
            -      p:nth-child(4) {color: #fff; text-shadow: 0 0 1px #f00;}
            -   </style>
            -</head>
            -
            - -
          16. - -
          17. Define the word-wrap and overflow-wrap properties, which control forced line breaks when the length of a word is longer than the area where it is displayed: -
            -<head>
            -   <style>
            -      p:nth-child(1) {word-wrap: normal}
            -      p:nth-child(2) {word-wrap: break-word}
            -      p:nth-child(3) {overflow-wrap: normal}
            -      p:nth-child(4) {overflow-wrap: break-word}
            -   </style>
            -</head>
            -<body>
            -   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
            -   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
            -   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
            -   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
            -</body>
            -
            - -
          18. - -
          - - -

          The following figure shows examples of manipulating the text properties.

          -

          Figure: Text properties (in mobile applications only)

          -

          Text properties (in mobile applications only)

          - - - - - - - - - - -
          Note
          For a complete list of CSS Text Module Level 3 text properties (in mobile or wearable applications) and their possible values, see the Property index.
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/transform_w.htm b/org.tizen.ui.guides/html/web/w3c/transform_w.htm deleted file mode 100755 index ecffd0a..0000000 --- a/org.tizen.ui.guides/html/web/w3c/transform_w.htm +++ /dev/null @@ -1,772 +0,0 @@ - - - - - - - - - - - - - CSS Transforms: Manipulating Elements - - - - - - -
          -

          CSS Transforms: Manipulating Elements

          - -

          Transforms allow you to modify the coordinate space where each element is positioned. The elements can be translated, rotated, and scaled in 2- or 3-dimensional space. According to the API, the coordinate system is a visual formatting model, and positions and sizes in the coordinate space are expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

          - -

          To enhance the rendering performance and user experience, you can use hardware acceleration and create fade effects.

          - -

          When using the CSS transform properties, the Tizen browser requires no prefix, the Firefox browser requires the -moz- prefix, the Chrome and Safari browsers require the -webkit- prefix, and the Opera browser requires the -o- prefix.

          - -

          Transform Properties

          - -

          You can define various properties to control the elements within the coordinate space:

          - -
            -
          • transform-origin -

            This property changes the location of the transformed element. It can only be used with elements for whom the transform property has been declared.

          • - -
          • transform-style -

            This property defines the rendering of the inherited element in the 3D space. Animation property has been added in the example for easier comprehension.

          • - -
          • perspective -

            This property changes the perspective of the element being expressed. A 3D transform element must be used together with this property to emphasize the expression of the X axis.

          • - -
          • perspective-origin -

            This property defines the location facing the element.

          • -
          • backface-visibility -

            This property defines whether the backface of the transformed element is expressed.

          • -
          - -
          -<head>
          -   <style type="text/css">
          -      .box 
          -      {
          -         transform: rotate(30deg);
          -         transform-origin: 30% 30%;
          -         perspective: 220;
          -         animation: trans-ani 10s infinite linear;
          -         backface-visibility: visible;
          -
          -         /* Chrome and Safari browsers */
          -         -webkit-transform: rotate(30deg);
          -         -webkit-transform-origin: 30% 30%;
          -         -webkit-perspective: 220;
          -         -webkit-animation: trans-ani 10s infinite linear;
          -         -webkit-backface-visibility: visible;
          -      }
          -      .box.case01 
          -      {
          -         transform-style: preserve-3d;
          -         perspective-origin: 30% 30%;
          -
          -         /* Chrome and Safari browsers */
          -         -webkit-transform-style: preserve-3d;
          -         -webkit-perspective-origin: 30% 30%;
          -      }
          -   </style>
          -</head>
          -<body>
          -   <h1>transform-origin</h1>
          -   <div class="boxarea">
          -      <div class="box">
          -         <p>transform</p>
          -         <p>transform-origin: 30% 30%;</p>
          -      </div>
          -      <div class="box case01">
          -         <p>box</p>
          -      </div>
          -   </div>
          -</body>
          -
          - -

          In addition to transform properties, you can also use various 2D and 3D transform functions.

          - -

          2D and 3D Transform Functions

          - -

          The CSS Transforms API supports various transform functions in 2D and 3D.

          - -

          In 2D transforms, all transform functions are expressed based on a matrix. The X and Y values of the translate(), scale(), and skew() functions can be expressed in individual functions. For example, the X and Y values of the translate() function can be expressed with the translateX(number) and translateY(number) functions.

          - -
          -<head>
          -   <style type="text/css">
          -      .box-translate 
          -      {
          -         transform: translate(30px, 30px);
          -         -webkit-transform: translate(30px, 30px);
          -      }
          -
          -      .box-scale 
          -      {
          -         transform: scale(1.2, 1.2);
          -         -webkit-transform: scale(1.2, 1.2);
          -      }
          -
          -      .box-rotate 
          -      {
          -         transform: rotate(45deg);
          -         -webkit-transform: rotate(45deg);
          -      }
          -
          -      .box-skew 
          -      {
          -         transform: skew(20deg, 20deg);
          -         -webkit-transform: skew(20deg, 20deg);
          -      }
          -
          -      .box-matrix 
          -      {
          -         transform: matrix(0.8, 0.5, 0.9, 0.9, 0, 0);
          -         -webkit-transform: matrix(0.8, 0.5, 0.9, 0.9, 0, 0);
          -      }
          -   </style>
          -</head>
          -<body>
          -   <h1>2d transform</h1>
          -   <h2>translate</h2>
          -   <div class="boxarea">
          -      <div class="box no-transform">
          -         <p>Original</p>
          -      </div>
          -      <div class="box transformed box-translate">
          -         <p>transform</p>
          -         <p>transform: translate(30px, 30px);</p>
          -      </div>
          -   </div>
          -</body>
          -
          - -

          In 3D transforms, the Z axis has been added (for example, translateZ(number) and scale3dZ(number)). When handling 3D transforms, pay attention to the following:

          -
            -
          • If a transform function is used together with the perspective property, the z axis is emphasized.
          • -
          • The X, Y, and Z values of the translate3d(), scale3d(), and rotate3d() functions can be expressed in individual functions.
          • -
          • In the rotate3d(number, number, number, angle) function, the element rotates according to the assigned parameter (angle) with the X, Y, and Z directional vectors as the center. Each vector can be expressed as an individual function: for example, the rotateX(<angle>) and rotate3d(1, 0, 0, <angle>) functions perform the same task.
          • -
          -

          The following code snippet demonstrates how to implement a 3D transform. For a complete source code, see 3d_transform.html.

          -
          -<head>
          -   <style type="text/css">
          -      .first-transform {opacity: .5; background: #3399cc;}
          -      .transformed {opacity: .8;}
          -      /* translate3d */
          -      .box-translate3d: hover .first-transform 
          -      {
          -         transform: translate3d(-5px, -5px, -60px) rotateY(70deg);
          -         -webkit-transform: translate3d(-5px, -5px, -60px) rotateY(70deg);
          -      }
          -      .box-translate3d: hover .transformed 
          -      {
          -         transform: translate3d(15px, 15px, 60px) rotateY(70deg);
          -         -webkit-transform: translate3d(15px, 15px, 60px) rotateY(70deg);
          -      }
          -      /* scale3d */
          -      .box-scale3d: hover .first-transform 
          -      {
          -         transform: scale3d(1, 1, 1) rotateY(70deg);
          -         -webkit-transform: scale3d(1, 1, 1) rotateY(70deg);
          -      }
          -      .box-scale3d: hover .transformed 
          -      {
          -         transform: scale3d(0.6, 0.6, 2) rotateY(70deg);
          -         -webkit-transform: scale3d(0.6, 0.6, 2) rotateY(70deg);
          -      }
          -      /* rotate3d */
          -      .box-rotate3d: hover .first-transform 
          -      {
          -         transform: rotate3d(-1, -1, -1, 110deg);
          -         -webkit-transform: rotate3d(-1, -1, -1, 110deg);
          -      }
          -      .box-rotate3d: hover .transformed 
          -      {
          -         transform: rotate3d(1, 1, 1, 110deg);
          -         -webkit-transform: rotate3d(1, 1, 1, 110deg);
          -      }
          -      /* matrix3d */
          -      .box-matrix3d: hover .first-transform 
          -      {
          -         transform: matrix3d(0.3, 0.2, -0.9, 0, 0.2, 0.8, 0.2, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 1);
          -         -webkit-transform: matrix3d(0.3, 0.2, -0.9, 0, 0.2, 0.8, 0.2, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 1);
          -      }
          -      .box-matrix3d: hover .transformed 
          -      {
          -         transform: matrix3d(0.4, -0.5, 0.8, 0, 0.2, 0.8, 0.2, 0, -0.6, 0, 0.4, 0, 0, 0, 0, 1);
          -         -webkit-transform: matrix3d(0.4, -0.5, 0.8, 0, 0.2, 0.8, 0.2, 0, -0.6, 0, 0.4, 0, 0, 0, 0, 1);
          -      }
          -   </style>
          -</head>
          -<body>
          -   <h1>3D transform</h1>
          -   <h2></h2>
          -   <p><strong>First box value:</strong> transform: translate3d(-5px, -5px, -60px) rotateY(70deg);</p>
          -   <p><strong>Second box value:</strong> transform: translate3d(15px, 15px, 60px) rotateY(70deg);</p>
          -   <div class="boxarea box-translate3d">
          -      <div class="box first-transform">
          -         First box
          -      </div>
          -      <div class="box transformed">
          -         <p>Second Box</p>
          -         Mouse over or tab here to animate
          -      </div>
          -   </div>
          -</body>
          -
          - - -

          Creating an Animation with Transforms

          - -

          To enhance the user experience of your application, you must learn to use transforms with animations. This example uses the animation from the Creating a Logo Animation use case as a basis, and adds a more diverse visual effect to it with the transform property. In the modified animation:

          - -
            -
          • As in the original animation, no elements are initially shown on the screen.
          • -
          • The Tizen logo gradually appears in the middle of the screen, and as it moves to the right, it becomes smaller. With the transform property, the logo is made to rotate.
          • -
          • Each letter in the word "TIZEN" consecutively comes in from the left of the screen and moves to the right to its correct location. With the transform property, the letters are translated in the 3D space and rotated around the Y axis.
          • -
          - -

          Figure: Tizen logo to be transformed

          -

          Tizen logo to be transformed

          - - -
            -
          1. Create the HTML layout to control the movement of each individual animation element: -
            -<div class="animation-holder">
            -   <span class="tizen-txt t"></span>
            -   <span class="tizen-txt i"></span>
            -   <span class="tizen-txt z"></span>
            -   <span class="tizen-txt e"></span>
            -   <span class="tizen-txt n"></span>
            -   <span class="tizen-txt tm"></span>
            -   <span class="tizen-logo"></span>
            -</div>
            -
            -
          2. -
          3. Define the basic style of the animation elements. Add the perspective property to increase the Z axis effect of the 3D transform. -
            -.animation-holder 
            -{
            -   -webkit-perspective: 1000px;
            -   height: 88px;
            -   left: 50%;
            -   margin: -54px 0px 0px -140px;
            -   position: absolute;
            -   top: 50%;
            -   width: 280px;
            -}
            -.tizen-txt,
            -.tizen-logo 
            -{
            -   background-position: 50% 50%;
            -   background-repeat: no-repeat;
            -   display: block;
            -   position: absolute;
            -}
            -.tizen-txt.t 
            -{
            -   background-image: url("images/txt_t.png");
            -   height: 56px;
            -   left: 0px;
            -   top: 31px;
            -   width: 48px;
            -}
            -
            -
          4. -
          5. Create the animation: -
              -
            1. -

              Assign keyframes for the logo element to transform it. In order to rotate the logo, use the -webkit-transform: rotate() function, which defines the angle of the rotation. -

              -
              -@-webkit-keyframes tizen-logo 
              -{
              -   0% 
              -   {
              -      -webkit-animation-timing-function: ease-in;
              -      height: 211px;
              -      left: 30px;
              -      opacity: 0;
              -      top: -61px;
              -      -webkit-transform: rotate(0deg);
              -      width: 220px;
              -   }
              -   30% 
              -   {
              -      -webkit-animation-timing-function: ease-out;
              -      height: 211px;
              -      left: 30px;
              -      opacity: 1;
              -      top: -61px;
              -      -webkit-transform: rotate(720deg);
              -      width: 220px;
              -   }
              -   50% 
              -   {
              -      height: 32px;
              -      left: 247px;
              -      opacity: 1;
              -      top: 0;
              -      -webkit-transform: rotate(1440deg);
              -      width: 33px;
              -   }
              -   100% 
              -   {
              -      height: 32px;
              -      left: 247px;
              -      opacity: 1;
              -      top: 0;
              -      -webkit-transform: rotate(1440deg);
              -      width: 33px;
              -   }
              -}
              -
              - - - - - - - - - -
              Note
              For a rotation, the image has to be carefully created to ensure the correct end result. The rotation occurs with the center of the element as the center. If the rotation center must be moved because the image center is not aligned, use the transform-origin property to adjust the rotation location.
            2. -
            3. Create the keyframes for the first letter in the word "TIZEN". In the animation, due to the translate3d() and rotateY() methods, each letter transforms slightly from the right to the left as it comes in. - -

              Animation

              - -
              -@-webkit-keyframes tizen-txt-t 
              -{
              -   0% 
              -   {
              -      opacity: 0;
              -      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
              -   }
              -   30% 
              -   {
              -      opacity: 0;
              -      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
              -   }
              -   35% 
              -   {
              -      opacity: 1;
              -      -webkit-transform: translate3d(0, 0, 0) rotateY(0deg);
              -   }
              -   100% {}
              -}
              -
            4. -
            5. To emphasize the fact that the letters are being created on the right, change the location of the transform. If the transform-origin property is declared for the entire animation element, the logo rotation changes. Consequently, you must only declared it for the letters. -
              -.tizen-txt 
              -{
              -   -webkit-transform-origin: 100% 50%;
              -}
              -
            6. - -
            7. Create the keyframes for the other letters similarly:

              -
              -@-webkit-keyframes tizen-txt-i 
              -{
              -   0% 
              -   {
              -      opacity: 0;
              -      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
              -   }
              -   32% 
              -   {
              -      opacity: 0;
              -      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
              -   }
              -   37% 
              -   {
              -      opacity: 1;
              -      -webkit-transform: translateX(0) rotateY(0deg);
              -   }
              -    100% {}
              -}
              -
            - -
          6. -
          - -

          The following figure shows the full Tizen logo animation with the transform properties.

          -

          Figure: Full Tizen logo animation

          -

          Full Tizen logo animation

          - -

          Source Code

          -

          For the complete source code related to this use case, see the following files:

          - - -

          Creating Fade Animation Effects

          - - -

          To enhance the user experience of your application, you must learn to use fade animation effects.

          -

          The modal layer pop-up can be used to, for example, show enlarged thumbnail images or notice messages. The modal layer pop-up has the following basic properties:

          -
            -
          • If an event is fired, it gradually becomes visible. This is known as the Fade In effect.
          • -
          • The existing background is covered with a translucent layer to make the user focus on the pop-up.
          • -
          • When the pop-up is closed, it gradually becomes transparent. This is known as the Fade Out effect.
          • -
          - -

          Figure: Fade effect

          -

          Fade effect

          - -

          You can control UI events and change the DOM elements in the following ways:

          -
            -
          • Events can be controlled with JavaScript, and DOM elements can be devised with CSS.
          • -
          • You can use JavaScript frameworks, such as jQuery, Prototype, and Dojo.
          • -
          - -

          To create fade effects:

          - -
            -
          • Create a modal layer pop-up using jQuery: - -
            -(function($) 
            -{
            -   function showModalPopup(url) 
            -   {
            -      $('body').append('<div class="mask"></div>'); /* Mask in body appended */
            -      $('.mask').css({'height': $(window).height()}); /* Mask area set */
            -
            -      /* Target layer position set */
            -      $(url).css(
            -      {
            -         'top': ($(window).height()/2 + $(document).scrollTop() - $(url).height()/2) + 'px', 
            -         'left': ($(window).width()/2 + $(document).scrollLeft() - $(url).width()/2) + 'px'
            -      });
            -
            -      /* Fade effect */
            -      $('.mask').fadeTo('slow', 0.7);
            -      $(url).fadeTo('slow', 1);
            -   };
            -
            -   $('.layerpopupActive a').on('click', function()
            -   {
            -      var targetUrl = $(this).attr('href');
            -
            -      showModalPopup(targetUrl);
            -
            -      return false;
            -   });
            -  
            -   /* End processing - Fade Out effect */
            -    
            -   $('body').on('click', function(e) 
            -   {
            -      if (e.target.className === 'mask') 
            -      {
            -         $('.layerpop').fadeOut();
            -         $('.mask').fadeOut(400, function() 
            -         {
            -            $('.mask').remove();
            -         });
            -      };
            -   });
            -})(jQuery);
            - -

            If the animation effect is created by using JavaScript, the browser executes the following tasks:

            -
              -
            1. A structure layer is created and added to the document. This is a CPU task.
            2. -
            3. The added layer is painted as a default value. This is a GPU task.
            4. -
            5. The layer is painted once again according to the change of value. This is a CPU operation.
            6. -
            - -

            Steps a and c incur CPU tasks, which affect performance the most.

            -

            In case of step a, only 2 layers are created, but as the number of layers created increases, the efficiency of page rendering work drops. In case of step c as well, the more steps it undergoes, the slower the rendering becomes.

            -

            In certain browsers, even if the style of just 1 layer is changed, the entire document is repainted. As the repainting takes only a moment, any animation effects that are supposed to happen cannot be executed in such a short time. This issue occurs frequently in Android™ with severe fragmentation.

            - - - - - - - - - - -
            Note
            If a new layer is created in Android 4.0X version, and if the fade effect is used, it only shows the initial value and the result value of the layer style.
            - -

            To avoid such a situation to the maximum possible extent, CPU tasks must be reduced to the minimum, and it is better to use transition or animation that uses the internal timer of the browser.

            - - - - - - - - - - -
            Note
            In case of using 3D effects, -webkit-transform: translateZ(0); can be used to accelerate the hardware. However, since hardware acceleration support varies between the OS and devices, the actual resulting effects can vary too. Moreover, in the case of version Android™ 2.1, iOS™3.X and below, note that transition and animation may not be realized.
            -
          • -
          • Create a modal layer pop-up using CSS3: -
            -<!--CSS-->
            -.mask 
            -{
            -   opacity: 0;
            -   z-index: -1;
            -   -webkit-transition: all 400ms ease-in-out;
            -}
            -
            -.mask.active 
            -{
            -   opacity: .7;
            -   z-index: 498;
            -}
            -
            -<!--Layer pop-up public styles-->
            -.layerpop 
            -{
            -   opacity: 0;
            -   z-index: -1;
            -   -webkit-transition: all 300ms ease-in-out;
            -}
            -
            -.layerpop.active 
            -{
            -   opacity: 1;
            -   z-index: 499;
            -}
            -/* JavaScript */
            -function showModalPopup(url) 
            -{
            -   url.className += 'active';
            -}
            -
          • -
          -

          Performance Differences

          - -

          There can be a difference in performance depending on how the modal layer pop-up is used.

          -

          The following figures illustrate the difference in event performance, when using JavaScript and CSS3.

          -

          Figure: Event performance using JavaScript

          -

          Events using JavaScript

          - -

          Figure: Event performance using CSS3

          -

          Events using CSS3

          - -

          The following figures illustrate the difference in memory performance, when using JavaScript and CSS3.

          -

          Figure: Memory performance using JavaScript

          -

          Memory when using JavaScript

          - -

          Figure: Memory performance using CSS3

          -

          Memory when using CSS3

          - -

          When the styles are applied using JavaScript, the UI thread is used to create the pop-up. The UI thread increases the usage of CPU memory in proportion to the number of pop-ups used.

          - - - - - - - - - - -
          Note
          Tizen provides remote debugging through the JavaScript Debugger tool.
          - - - - - - - - - - -
          Note

          If CSS is used, the handling of JavaScript events and UI DOM operations becomes unnecessary, so the load of the UI thread decreases, and the usage of CPU memory decreases as well. However, CSS3 transitions cannot be applied to versions below Android™ 2.3 and for versions above iOS™ 4.3, which are still widely used, so attention is needed when distributing it to various devices.

          - -

          Using Hardware Acceleration

          - -

          The rendering performance of a Web application depends on both the Tizen platform and application design.

          -

          In hardware acceleration, GPU is used to perform a function faster than is possible if the application is running on the CPU. It enhances the rendering performance in the dynamic objects used in Web applications.

          - -

          Using CSS Transition and 3D Transform

          -

          To improve the rendering performance, separate moving elements to independent layers as much as possible. You can use CSS transition with the -webkit-transition CSS attribute, or 3D transform with the -webkit-transform attribute. For the best performance, set the -webkit-transform attribute to the 3D type.

          -

          In all the following examples, a blue box moves from top left to bottom right for a second.

          -

          Figure: Blue box

          -

          Blue box

          - -
            -
          • Use CPU painting: -

            JavaScript performs CPU painting for a moving element for each frame at 16 ms interval using the setTimeout() method over the changing top-left coordinate. This approach does not use hardware acceleration, but only running on the CPU.

            -
              -
            1. Construct the blue box and set its position on the screen: -
              <!DOCTYPE html>
              -<html xmlns="http://www.w3.org/1999/xhtml">
              -   <head>
              -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
              -      <title>JavaScript transition sample</title>
              -      <style>
              -         #box 
              -         {
              -            position: absolute;
              -            width: 100px;
              -            height: 100px;
              -            background-color: blue;
              -            left: 0px;
              -            top: 50px;
              -         }
              -      </style>
              -
            2. -
            3. -

              Perform CPU painting for a moving element at a rate of 1 frame per 16 ms (62.5 frames per second) using the setTimeout() method:

              -
                    <script>
              -         var delta = 0;
              -         function startTransition() 
              -         {
              -            process();
              -         }
              -         function process ()
              -         {
              -            document.getElementById('box').style.left = delta + "px";
              -            document.getElementById('box').style.top = delta + 50 + "px";
              -            delta += 4;
              -            if (delta <= 200)
              -               setTimeout(function() {process();}, 16);
              -         }
              -      </script>
              -   </head>
              -   <body>
              -      <div id='box' onclick='startTransition()'>click me!</div>
              -   </body>
              -</html>
          • -
          • Use CSS transition: -

            Separate a moving element to an independent layer with the -webkit-transition CSS attribute. This approach uses hardware acceleration, and can enhance performance while an element is moving.

            -
            <!DOCTYPE html>
            -<html xmlns="http://www.w3.org/1999/xhtml">
            -   <head>
            -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            -      <title>-webkit-transition sample</title>
            -      <style>
            -         #box 
            -         {
            -            position: absolute;
            -            width: 100px;
            -            height: 100px;
            -            left: 0px;
            -            top: 50px;
            -            background-color: blue;
            -            -webkit-transition-duration: 1s;
            -            -webkit-transition-timing-function: linear;
            -         }
            -      </style>
            -      <script>
            -         function startTransition()
            -         {
            -            document.getElementById('box').style.webkitTransform = "translate(200px, 200px)";
            -         }
            -      </script>
            -   </head>
            -   <body>
            -      <div id='box' onclick='startTransition()'>click me!</div>
            -   </body>
            -</html>
            -
          • -
          • Use 3D transform: -

            Use the -webkit-transform: translate3d 3D transform attribute. The element is separated to an independent layer and uses hardware acceleration irrespective of its movement:

            -
            <!DOCTYPE html>
            -<html xmlns="http://www.w3.org/1999/xhtml">
            -   <head>
            -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            -      <title>-webkit-transition with translate3d sample</title>
            -      <style>
            -         #box 
            -         {
            -            position: absolute;
            -            width: 100px;
            -            height: 100px;
            -            left: 0px;
            -            top: 50px;
            -            background-color: blue;
            -            -webkit-transform: translate3d(0, 0, 0);
            -            -webkit-transition-duration: 1s;
            -            -webkit-transition-timing-function: linear;
            -         }
            -      </style>
            -      <script>
            -         function startTransition() 
            -         {
            -            document.getElementById('box').style.webkitTransform = "translate3d(200px, 200px, 0px)";
            -         }
            -      </script>
            -   </head>
            -   <body>
            -      <div id='box' onclick='startTransition()'>click me!<p></div>
            -   </body>
            -</html>
            -
          • -
          -

          Using Accelerated Overflow Scroll

          -

          If a page has an overflow scroll, use the -webkit-overflow-scrolling attribute. It separates overflow scroll to an independent layer and enhances rendering performance:

          -
          #scroll_area 
          -{
          -   overflow: scroll;
          -   -webkit-overflow-scrolling: touch;
          -}
          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/transition_w.htm b/org.tizen.ui.guides/html/web/w3c/transition_w.htm deleted file mode 100755 index c21bc1e..0000000 --- a/org.tizen.ui.guides/html/web/w3c/transition_w.htm +++ /dev/null @@ -1,382 +0,0 @@ - - - - - - - - - - - - - CSS Transitions Module Level 3: Changing Element Styles - - - - - - -
          -

          CSS Transitions Module Level 3: Changing Element Styles

          - -

          Transitions allow you to enable implicit transitions, which describe how the CSS properties can be made to change smoothly from one value to another over a given duration. To enhance the rendering performance, you can use hardware acceleration.

          - -

          When using the CSS transition properties, the Tizen browser requires the -webkit- prefix.

          - -

          Transition Properties

          - -

          You can define various properties to control the element transitions:

          - -
            -
          • transition-property -

            This property defines the element property that is changed during the transition. In the following code snippet, both the width and height of the element change when the mouse hovers over it, but the transition effect is applied to the width property only.

          • - -
          • transition-duration -

            This property defines the duration of the transition. You must define as many instances of the property as you have elements in the transition-property property.

          • - -
          • transition-timing-function -

            This property defines the pace of the transition. The value of the property is defined as a stepping function or a cubic Bézier curve. The ease stepping function equals cubic-bezier(0.25, 0.1, 0.25, 1), and the linear stepping function equals cubic-bezier(0, 0, 1, 1).

          • - -
          • transition-delay -

            This property defines the delay time before the start of the transition.

          • - -
          - -

          The following code snippet demonstrates how to use transition properties. For a complete source code, see transition_property.html.

          - -
          -<head>
          -   <style type="text/css">
          -      body{font-size: 12px}
          -
          -      .box 
          -      {
          -         -webkit-transition-property: width;
          -         -webkit-transition-duration: 2s;
          -         -webkit-transition-timing-function: ease;
          -         -webkit-transition-delay: 0.5s;
          -      }
          -
          -      .box: hover 
          -      {
          -         width: 300px;
          -         height: 200px;
          -         background: CornflowerBlue;
          -      }
          -   </style>
          -</head>
          -<body>
          -   <h1>CSS transitions tutorial</h1>
          -   <div class="box">
          -      <p>Mouse over or tap here to animate</p>
          -      <p>transition-property: width, height, background</p>
          -   </div>
          -</body>
          -
          - - - - - - - - - -
          Note
          The hover pseudo class in Tizen maintains a mouseover state when an element is tapped, and becomes a mouseout state when another element is tapped.
          - -

          The transition property allows you to define all the transition properties in a shorthand mode in the order of transition-property | transition-duration | transition-timing-function | transition-delay. If you omit a property value, a default value is used instead.

          - -
          -<style type="text/css">
          -   .box 
          -   {
          -      -webkit-transition: width 1s ease 1s;
          -   }
          -</style>
          -
          - -

          The transition property connects movement more naturally than the more generally used the pseudo classes, such as :hover or :active. The smooth effect can be achieved more conveniently and easily with the transition property than with JavaScript or Flash, and the transition property also supports the browser side to provide excellent performance.

          - - -

          Modifying Element Properties

          - -

          To enhance the user experience of your application, you must learn to use transitions to change element property values naturally. This example uses a partial section of the http://tizen.org Web site, where the current "UPCOMING EVENTS" area only has the text-decoration: underline property in a mouseover state (the text gets underlined when the mouse hovers over it). To improve the effects, the example adds various transitions properties in this area.

          - - -

          Figure: Tizen site section to be transitioned

          -

          Tizen site section to be transitioned

          - - -
          1. Add a background color change to the "UPCOMING EVENTS" area during a mouseover state:

            - -
            1. Originally, the area on the site is defined as follows:

              - -
              -<h2 class="block-title">Upcoming Events</h2>
              -
              - - -

              Additionally, a transition property is declared in the block-title class:

              - -
              -.block-title 
              -{
              -   -webkit-transition: all 2s ease;
              -}
              -
              -

              The all value in the transition property means that the transition effect applies to all CSS properties of the element.

              -
            2. - -
            3. Define the mouseover state for the block-title class: - -
              -.block-title: hover {background: #eaeaea;}
              -
              - -

              Due to the CSS characteristics, adding a class through an event allows immediate rendering in the screen.

            - -

            When the mouse is moved over the "UPCOMING EVENTS" area, the background color changes.

            - -

            Background color change

          2. - -
          3. - -

            Apply the transition effect in other elements:

            - -
            1. To avoid unnecessary repetition, tie a list of transition elements together into groups a and span: - -
              -.location, .date, .location .anibg, h3 > a, .day > span 
              -{
              -   -webkit-transition: all 1s ease;
              -}
              -
            2. - -
            3. When the mouse hovers over the date element, change the background of the date and the font size of all the elements tied into the span group. When the mouse hovers over the title element, change the color of all elements tied into the a group.

              -
              -.date: hover {background: #d2ecff !important;}
              -.date: hover .day > span {font-size: 1.9em;}
              -
              -.event-info: hover h3 > a {color: #ec4986;}
              -
            - -

            Before mouseover -

          4. -
          5. - -

            Emphasize the location phrase by adding an empty element. The emphasis is made by filling the background with black from left to right, and changing the font color to an appropriate value for the black background.

            -
              -
            1. Add the empty element:

              - -
              -<div class="location">San Francisco, CA<span class="anibg"></span></div>
              -
            2. -
            3. Create the effect using the width value of the added element:

              -
              -.location {position: relative; z-index: 3; margin-top: 3px;}
              -.location .anibg 
              -{
              -   position: absolute; 
              -   left: -3px; top: 0; 
              -   display: block; 
              -   width: 0; height: 100%; 
              -   background: #000; 
              -   z-index: -1;
              -}
              -
              - -

              The effect is defined by using the position property. The location element position is declared relative, while the anibg child element position is declared as absolute. The width of the child element basic state is set as 0. Since the child element layer covers the location text, the child element has been defined to come out from the back of the text in the z-index value of the child.

            4. -
            5. Define the state to be changed:

              -
              -.location, .date, .location .anibg, h3 > a, .day > span 
              -{
              -   -webkit-transition: all 1s ease;
              -}
              -
              -.event-info: hover .location {color: #fff;}
              -.event-info: hover .location .anibg {width: 100%; color: #fff;}
              -
              - -

              The transition takes place when the property in question is at the front on the screen. The event-info class is used as the subject for the change, and it has been defined so that the transition occurs simultaneously in the .location and .anibg elements when the mouse hovers over any of the elements tied together as group a. -

            6. - -

            Location phrase emphasis

            -
          -

          Source Code

          -

          For the complete source code related to this use case, see the following file:

          - - -

          Using Hardware Acceleration

          - -

          The rendering performance of a Web application depends on both the Tizen platform and application design.

          -

          In hardware acceleration, GPU is used to perform a function faster than is possible if the application is running on the CPU. It enhances the rendering performance in the dynamic objects used in Web applications.

          - -

          Using CSS Transition and 3D Transform

          -

          To improve the rendering performance, separate moving elements to independent layers as much as possible. You can use CSS transition with the -webkit-transition CSS attribute, or 3D transform with the -webkit-transform attribute. For the best performance, set the -webkit-transform attribute to the 3D type.

          -

          In all the following examples, a blue box moves from top left to bottom right for a second.

          -

          Figure: Blue box

          -

          Blue box

          - -
            -
          • Use CPU painting: -

            JavaScript performs CPU painting for a moving element for each frame at 16 ms interval using the setTimeout() method over the changing top-left coordinate. This approach does not use hardware acceleration, but only running on the CPU.

            -
              -
            1. Construct the blue box and set its position on the screen: -
              <!DOCTYPE html>
              -<html xmlns="http://www.w3.org/1999/xhtml">
              -   <head>
              -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
              -      <title>JavaScript transition sample</title>
              -      <style>
              -         #box 
              -         {
              -            position: absolute;
              -            width: 100px;
              -            height: 100px;
              -            background-color: blue;
              -            left: 0px;
              -            top: 50px;
              -         }
              -      </style>
              -
            2. -
            3. -

              Perform CPU painting for a moving element at a rate of 1 frame per 16 ms (62.5 frames per second) using the setTimeout() method:

              -
                    <script>
              -         var delta = 0;
              -         function startTransition() 
              -         {
              -            process();
              -         }
              -         function process ()
              -         {
              -            document.getElementById('box').style.left = delta + "px";
              -            document.getElementById('box').style.top = delta + 50 + "px";
              -            delta += 4;
              -            if (delta <= 200)
              -               setTimeout(function() {process();}, 16);
              -         }
              -      </script>
              -   </head>
              -   <body>
              -      <div id='box' onclick='startTransition()'>click me!</div>
              -   </body>
              -</html>
          • -
          • Use CSS transition: -

            Separate a moving element to an independent layer with the -webkit-transition CSS attribute. This approach uses hardware acceleration, and can enhance performance while an element is moving.

            -
            <!DOCTYPE html>
            -<html xmlns="http://www.w3.org/1999/xhtml">
            -   <head>
            -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            -      <title>-webkit-transition sample</title>
            -      <style>
            -         #box 
            -         {
            -            position: absolute;
            -            width: 100px;
            -            height: 100px;
            -            left: 0px;
            -            top: 50px;
            -            background-color: blue;
            -            -webkit-transition-duration: 1s;
            -            -webkit-transition-timing-function: linear;
            -         }
            -      </style>
            -      <script>
            -         function startTransition()
            -         {
            -            document.getElementById('box').style.webkitTransform = "translate(200px, 200px)";
            -         }
            -      </script>
            -   </head>
            -   <body>
            -      <div id='box' onclick='startTransition()'>click me!</div>
            -   </body>
            -</html>
            -
          • -
          • Use 3D transform: -

            Use the -webkit-transform: translate3d 3D transform attribute. The element is separated to an independent layer and uses hardware acceleration irrespective of its movement:

            -
            <!DOCTYPE html>
            -<html xmlns="http://www.w3.org/1999/xhtml">
            -   <head>
            -      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            -      <title>-webkit-transition with translate3d sample</title>
            -      <style>
            -         #box 
            -         {
            -            position: absolute;
            -            width: 100px;
            -            height: 100px;
            -            left: 0px;
            -            top: 50px;
            -            background-color: blue;
            -            -webkit-transform: translate3d(0, 0, 0);
            -            -webkit-transition-duration: 1s;
            -            -webkit-transition-timing-function: linear;
            -         }
            -      </style>
            -      <script>
            -         function startTransition() 
            -         {
            -            document.getElementById('box').style.webkitTransform = "translate3d(200px, 200px, 0px)";
            -         }
            -      </script>
            -   </head>
            -   <body>
            -      <div id='box' onclick='startTransition()'>click me!<p></div>
            -   </body>
            -</html>
            -
          • -
          -

          Using Accelerated Overflow Scroll

          -

          If a page has an overflow scroll, use the -webkit-overflow-scrolling attribute. It separates overflow scroll to an independent layer and enhances rendering performance:

          -
          #scroll_area 
          -{
          -   overflow: scroll;
          -   -webkit-overflow-scrolling: touch;
          -}
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/ui_layout_ww.htm b/org.tizen.ui.guides/html/web/w3c/ui_layout_ww.htm deleted file mode 100755 index afecdf8..0000000 --- a/org.tizen.ui.guides/html/web/w3c/ui_layout_ww.htm +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - - - - - - - - Multiple UI Layouts: Designing Applications for Multiple Devices - - - - - -
          -

          Multiple UI Layouts: Designing Applications for Multiple Devices

          - -

          To ensure the largest possible market for your application, you have to design your application layout so that your application can run on multiple Tizen devices.

          - - - - - - - - - - -
          Note
          This feature is supported in wearable applications only.
          - -

          Although the Web was originally designed to structure documents for large-scaled Internet world, with CSS (Cascading Style Sheet), JavaScript, and various device APIs, it is quickly evolving to a complete runtime environment for applications. In addition, its W3C open development model and the flexibility of its CSS-based presentation make it every developer's choice as the next development platform. CSS is the key technology for flexible presentation, and it is used to describe the look and formatting of HTML documents. The role of CSS is to determine how the logical structure of the document is displayed to the user.

          - -

          The Tizen Web engine provides the basic mechanisms for fitting the application content to the target screen. However, to ensure that the application runs well on multiple devices, you must understand those mechanisms in detail. In general, select a relative layout rather than a fixed layout, because a relative layout helps to maintain usability even when the application runs on unexpected devices. To enhance usability even further, use different layouts for each device category.

          - -

          Using some CSS techniques and Tizen Web engine mechanisms, you can design your application UI layout so that it displays properly on multiple devices:

          -
          • You can use a single layout and take advantage of the auto-fitting mechanism of the Tizen Web engine to ensure that a single layout covers multiple devices.
          • -
          • You can use multiple layouts to define a separate optimal layout for each device category.
          - -

          Single Layout for Multiple Devices

          -

          A typical application developer designs an optimized UI for a target device with a fixed layout and high-quality resources. This approach usually results in a nice look for the end user, but can sometimes result in an ugly layout, which makes the application unusable. And this unfortunate result can occur merely due to a change in the device form factor.

          -

          Since the presentation and business logic are strictly separated in a Web application, it handles the device form factor change better than native applications. One single layout, taking advantage of Web technology, can ensure usability even on multiple devices with different form factors.

          - -

          To design applications with a single layout, you must consider the following issues:

          - - - -

          For a complete application layout that considers all the above issues, see Single Layout Example.

          - -

          Viewport and Other Meta Tags

          - -

          The viewport is a screen area that the Web engine displays in the UI and, in the Web world, the viewport meta tag is used to inform the Web engine that this content is written for a specific form factor, such as device width. The viewport meta tag was introduced by Apple to fill the screen resolution gap between initial Smartphone (for example, 320 px) and PC (for example, 980 px). Basically, the viewport meta tag helps the Web engine to determine the scale factor for the content on the current device.

          - -

          To use the tag in an HTML file, set its name and content:

          -
          -<meta name="viewport" content="XXX">
          -
          - -

          As shown in the following code snippet, use the viewport meta tag to tell the Web engine which device width is targeted by the application. The Web engine can estimate the scale factor based on the target content size and the real screen width. For example, usually almost all wearable applications have the following viewport meta tag, which sets the viewport width to the appropriate size based on each device:

          -
          -<meta name="viewport" content="width=device-width, user-scalable=no">
          -
          - -

          If you want to set your content layout to the target width of 320 px on every wearable device, use the following meta tag:

          -
          -<meta name="viewport" content="width=320">
          -
          - -

          The viewport meta tag has other properties, such as height, initial-scale, minimum-scale, maximum-scale, and user-scalable. However, do not use those properties unless you understand their exact meaning. Wrong values can cause the Web engine to incorrectly fit the application content to the current device.

          - -

          Relative Layout

          - -

          The relative layout concept means that the element size of all content is set as a relative unit (such as percentage), and not as absolute values (such as pixels or points). In responsive Web design, this concept is also known as fluid grid (for more information, search for responsive web design in your Web browser). To achieve a layout that works on multiple devices, you only need to know about relative layout, not all the other concepts of responsive Web design.

          -

          To implementing a relative layout, you only have to set the width and height of each element as a percentage, as shown in the following example and figure. In the example, the width and height of the number_pad element is set to 100% and 70%, not 320 px and 224 px.

          - -

          Figure: 320x320 calculator

          -

          number_pad {width: 100%; height: 70%;}

          -

          320x320 calculator

          - -

          An application with this relative layout is auto-fitted when it runs on an unexpected device, such as the device with a 360x480 resolution shown in the following figure. Even though this adjusted layout may not be as good as the original, it is good enough, since it shows a usable application UI.

          - - -

          Figure: 360x480 calculator with a relative layout

          -

          360x480 calculator with a relative layout

          - -

          The following figure shows what happens if you use an absolute 320x320 layout. The presentation is definitely ugly (with an empty white space at the bottom) and usability reduced, although the calculation logic itself still works.

          -

          Figure: 360x480 calculator with an absolute 320x320 layout

          -

          number_pad {width: 320px; height: 224px;}

          - - -

          360x480 calculator with an absolute 320x320 layout

          - - - -

          While the content layout itself becomes the application UI layout on a Web page, a typical wearable application layout consists of a header area, content area, and footer area. With this trend, many wearable Web applications are designed by separating the 3 areas explicitly.

          -

          Figure: Typical wearable Web application layout

          -

          Typical wearable Web application layout

          - -

          Not setting the place of the header and footer areas clearly can easily cause problems for your layout. In case of the header, the side-effect is relatively small. However, a wrongly defined footer area can be quite visible and lead to poor usability. The following figure shows the original layout of a pedometer application that consists of a header, content, and footer, with a Stop button set in the footer area.

          -

          Figure: 320x320 sample Web application

          -

          320x320 sample Web application

          - -

          In this case, if the position of the footer is not defined explicitly or if the position and bottom properties do not have proper values, an ugly layout can be displayed on an unexpected device, such as the 360x480 screen shown in the following figure.

          -

          Figure: Layout on 360x480

          -

          Layout on 360x480

          - -

          To make the layout correct, define the position property as fixed and set the bottom property explicitly as 0 px:

          - -
          -.footer {position: fixed; bottom: 0px;}
          -
          - -

          The following figure shows the same Web application running on the unexpected device after the footer properties are defined properly. With the correct values, the Web application is usable even on a new target, not planned during the development phase. Note that if a relative layout is also applied to the content area, the result is an even better layout and further improved usability.

          -

          Figure: Usable layout on 360x480

          -

          Usable layout on 360x480

          - -

          Flexible Media

          - -

          One of key elements used in the content area is a media element, including image and video. As all other elements, the media elements also must be placed within a relative layout to allow the application flexibly handle resolution changes. When such relative sizing is applied to a media element, it is called flexible media in responsive Web design.

          -

          The main issue when making a media element size relative is to ensure that the usable ratio does not change. The following figure shows a video element that works on both 320x320 and 360x480 resolutions, even though the aspect ratio of the screen is changed and scaled up. Basically, when handling media elements, you want to keep the size or ratio of the element the same as in the initially targeted device, even when displayed using a different resolution and aspect ratio. To achieve this, set the width and height properties of the media element with percentage and the auto keyword.

          - -

          Figure: Flexible media on 320x320 and 360x480

          -

          .video iframe {width: 100%; height: auto;}

          -

          Flexible media on 320x320 and 360x480

          - - -

          The following figure shows an example of wrong usage, where usability decreases as the video element is simply scaled up based on the aspect ratio change. If you set the video element size using a fixed size like this, you get no benefit from the increased resolution, and the layout on the whole screen becomes inharmonious, decreasing usability.

          - - -

          Figure: Fixed size media element

          -

          .video iframe {width: 320px; height: 240px;}

          -

          Fixed size media element

          - -

          Single Layout Example

          - -

          This section illustrates a complete application layout that takes advantage of the issues discussed in previous sections. In particular, it shows how to set the viewport properly to help the Web engine scaling mechanism and how to create a CSS-based layout.

          - - -

          First of all, set the targeted size of the content area as 320 px in the viewport meta tag, and disable the user-scalable property, as shown in the following code snippet.

          - -
          -<html>
          -   <head>
          -      <link href="css/style.css" rel="stylesheet" type="text/css">                                             
          -      <meta name="viewport" content="width=320px, user-scalable=no" />                                                 
          -   </head>                                                                                                           
          -   <body>
          -      <main>
          -         <div class="tile left">
          -            <div id="box1" class="box"></div>
          -         </div>            
          -         <div class="tile right">
          -            <div id="box2" class="box"></div>
          -         </div> 
          -         <div class="tile left">
          -            <div id="box3" class="box"></div>                                                                       
          -         </div>
          -         <div class="tile right">
          -            <div id="box4" class="box"></div>                                                                       
          -         </div> 
          -      </main>
          -   </body> 
          -</html>
          -
          - -

          In the above HTML code, the content area consists of 4 <div> box elements, and their UI layout is described in the style.css file. The following CSS code programs the layout and the specific box element styles that were defined in the HTML file.

          -

          The code snippet shows that the content size is set to be same as the viewport size. Each box is filled with a different color and placed so that it fills a quarter of the content area. Because each box size is defined with the width and height of 100%, the relative size of each box element remains the same even if the viewport size changes.

          - -
          -<!--Default, used for all-->
          -* {box-sizing: border-box;}
          -body, div, h1 {margin: 0px; padding: 0px;}
          -html, body {width: 100%; height: 100%; overflow-x: hidden;}
          -
          -#box1 {background-color: rgb(255, 255, 141);}
          -#box2 {background-color: rgb(165, 241, 238);}
          -#box3 {background-color: rgb(248, 179, 179);}
          -#box4 {background-color: rgb(192, 161, 246);}
          -.tile 
          -{
          -   width: 50%;
          -   height: 50%;
          -   float: left;
          -}
          -.left {padding: 10px 5px 5px 10px;}
          -.right {padding: 10px 10px 5px 5px;}
          -
          -.box 
          -{
          -   width: 100%;
          -   height: 100%;
          -}
          -
          - - -

          The following figure shows a final view when the 320 px is set as a target device in the HTML file. As defined in the CSS file, the content area fills the whole screen, 320x320 pixels, and the 4 box elements equally divide the area.

          - -

          Figure: Original layout on a target device

          -

          Original layout on a target device

          -

          The following figure shows that the relative layout and scaling are correctly applied even when the same application is run on a mobile device with the aspect ratio of 16:9.

          -

          Figure: Scaled layout on a 16:9 mobile device

          -

          Scaled layout on a 16:9 mobile device

          -

          The following code snippet shows an example where the background color is replaced with an image while the layout is exactly same as in the 4 box example. The following figures show how the layout including media elements (such as images) functions exactly like the basic box layout.

          - -
          -<!--Default, used for all-->
          -* {box-sizing: border-box;}
          -body, div, h1 {margin: 0px; padding: 0px;}
          -html, body {width: 100%; height: 100%; overflow-x: hidden;}
          -
          -#box1 {background-color: rgb(255, 255, 141);}
          -#box2 {background-color: rgb(165, 241, 238);}
          -#box3 {background-color: rgb(248, 179, 179);}
          -#box4 {background-color: rgb(192, 161, 246);}
          -.tile 
          -{
          -   width: 50%;
          -   height: 50%;
          -   float: left;
          -}
          -.left {padding: 10px 5px 5px 10px;}
          -.right {padding: 10px 10px 5px 5px;}
          -
          -.box 
          -{
          -   width: 100%;
          -   height: 100%;
          -   padding: 20px;
          -   background: no-repeat center;
          -   background-size: 100% 100%;
          -}
          -
          -#box1 {background-image: url('../a.png');}
          -#box2 {background-image: url('../b.png');}
          -#box3 {background-image: url('../c.png');}
          -#box4 {background-image: url('../d.png');}
          -
          - - - -

          Figure: Image-based layout on a target device

          -

          Image-based layout on a target device

          - -

          Figure: Image-based scaled layout on a 16:9 mobile device

          -

          Image-based scaled layout on a 16:9 mobile device

          - - -

          Multiple Layouts for Multiple Devices

          - -

          In many cases, the desired end result for your application can be achieved using scaling and a relative layout within a single layout. However, this approach does not always provide the best quality for the end user.

          -

          You can support the best possible layout and usability with some additional development efforts. For instance, you can create an application which, on a tablet, shows the main information (clock face) and also delivers more meaningful information (calendar), while on a watch device the same application only displays the main information (clock face). This kind of end result, as shown in the following figure, cannot be achieved by only scaling up the whole layout of the watch device.

          -

          Figure: Application for a watch and tablet

          -

          Application for a watch and tablet

          - -

          W3C CSS3 Media Queries already support the majority of techniques needed to provide category-based layouts. To support the optimal layout using CSS techniques and design applications with multiple layouts, you must consider the following issues:

          - - - - -

          Since the 2.3.1 version, Tizen also supports a special media query feature to provide device shape-based layouts. If you want to create an application for both square-shaped and circular-shaped devices, you can easily migrate your application to support both shapes.

          -

          Figure: Application for a square and circular device

          -

          Application for a square and circular device

          - - -

          Viewport Setting for Multiple Layouts

          -

          The difference between multiple and single layouts is that, in the multiple layouts, the content width of the viewport meta tag is set to "device-width". This sets the layout viewport width to the ideal viewport width and tells the Web engine that the application adapts to the device width. In short, the "device-width" setting is needed to create an adaptive and responsive Web application.

          - -

          To use the meta tag in an HTML file, set its name and content:

          -
          -<meta name="viewport" content="width=device-width, user-scalable=no">
          -
          - -

          Category Classification

          - -

          When creating multiple layouts, you must first configure the layout categories. In other words, a classifying category is needed to fit the layout on the current executable environment. Media queries are supported in CSS3 to give Web application information to the executable environment.

          - -

          W3C Media Queries

          -

          Media queries consist of a media type and expressions of media features.

          - -

          The media types indicate the media on which the current Web application is running. They are defined in HTML4. The following media types are supported:

          -
          • aural
          • -
          • braille
          • -
          • handheld
          • -
          • print
          • -
          • projection
          • -
          • screen
          • -
          • tty
          • -
          • tv
          • -
          - -

          You can declare that sections apply to certain media types inside a CSS style sheet. As in the following example, you can declare screen as a media type and describe its layout inside {...}. That code applies the layout inside {...} when the Web application is run on the screen type executable context.

          - -
          -@media screen {...}
          -
          - -

          Several media queries can be combined in a media query list to configure the executable environment and define the detailed layout configuration, as needed. The following example shows a case in which the Web application runs on the executable environment having a screen media type and a 500 pixel minimum width. Its final view shows the layout inside {...} to the end user.

          - -
          -@media screen and (min-width: 500px) {...}
          -
          - -

          The following table lists the CSS media features, which you can use to specify the layout utilizing the media queries.

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          Table: Media features
          FeatureValueMin/MaxDescription
          colorintegeryesNumber of bits per a color component
          color-indexNumber of entries in the color lookup table
          device-aspect-ratiointeger/integerAspect ratio
          device-heightlengthOutput device height
          device-widthOutput device width
          gridintegernoSet to true for a grid-based device
          heightlengthyesRendering surface height
          monochromeintegerNumber of bits per pixel in a monochrome frame buffer
          resolutionresolution (dpi or dpcm)Resolution
          scanprogressive or interlacednoScanning process of the tv media types
          widthlengthyesRendering surface width
          - -

          Tizen Specialized Media Query

          -

          Tizen supports a special media query feature for a circular device shape. The following table lists the supported media features.

          - - - - - - - - - - -
          Note
          This feature is supported since 2.3.1.
          - - - - - - - - - - - - - - - - - - - -
          Table: Tizen specialized media feature
          FeatureValueMin/MaxDescription
          -tizen-geometric-shape"rectangle" | "circle"NoDevice shape
          - -

          You can combine this media query feature with the W3C type in your code. The final view shows the layout inside {...} to the end user:

          -
          -@media all and (-tizen-geometric-shape: circle) {...}
          -
          - - -

          Classification for Display Modes

          - -

          The display mode can be classified as portrait or landscape for a rectangle-shaped device, or circular for a circular device.

          - -

          Portrait and Landscape

          - -

          You can configure the device landscape and portrait mode using the device-aspect-ratio attribute in media queries. This approach is already commonly used in creating mobile Web applications. The following example shows how the max-device-aspect-ratio feature is used.

          -

          If you use the orientation:portrait/landscape feature, the layout can change unexpectedly when the virtual keypad is displayed. To avoid the problem, use the device-aspect-ratio to configure the portrait and landscape mode.

          -
          -@media screen and (max-width: 320px) and (max-device-aspect-ratio: 1/1) 
          -{
          -   <!--For portrait mode-->
          -}
          -@media screen and (max-width: 640px) and (min-device-aspect-ratio: 11/10) 
          -{
          -   <!--For landscape mode-->
          -}
          -
          - -

          Circular Device

          - -

          You can configure the device circular mode using the -tizen-geometric-shape attribute in the Tizen environment. The following example shows how to use the -tizen-geometric-shape feature.

          - - - - - - - - - - -
          Note
          This feature is supported since 2.3.1.
          - - -
          -@media all and (-tizen-geometric-shape: circle) 
          -{
          -   <!--For a circular device-->
          -}
          -
          - -

          Application Migration to a Circular Device

          - -

          This section illustrates an example for how you can migrate a basic application from a rectangular device (such as Gear 2 or Gear S) to a circular device. Use this example as the best practice to improve your layout.

          - -

          The example uses the following HTML and CSS code for the sample application and its layout.

          - -
          -<!--HTML code-->
          -<section id="main">
          -   <header>HEADER</header>
          -   <article id="content">
          -      lt;ul>
          -         <li>List Item 1</li>
          -         <li>List Item 2</li>
          -         <li>List Item 3</li>
          -         <li>List Item 4</li>
          -         <li>List Item 5</li>
          -         <li>List Item 6</li>
          -         <li>List Item 7</li>
          -         <li>List Item 8</li>
          -         <li>List Item 9</li>
          -         <li>List Item 10</li>
          -      </ul>
          -   </article>
          -   <footer>FOOTER</footer>
          -</section>
          -
          -<!--CSS code-->
          -html, body 
          -{
          -   height: 100%;
          -   width: 100%;
          -   padding: 0;
          -   margin: 0;
          -   font-size: 24px;
          -   overflow: hidden;
          -}
          -
          -section 
          -{
          -   width: 100%;
          -   height: 100%;
          -   overflow: auto;
          -   padding: 70px 0;
          -}
          -
          -header, footer 
          -{
          -   width: 100%;
          -   height: 70px;
          -   min-height: 70px;
          -   line-height: 70px;
          -   font-size: 30px;
          -   text-align: center;
          -   position: fixed;
          -}
          -
          -header 
          -{
          -   top: 0;
          -}
          -
          -footer 
          -{
          -   bottom: 0;
          -}
          -
          -article ul li 
          -{
          -   border-top: 1px solid rgba(52, 52, 52, 1);
          -   padding: 15px 20px;
          -   color: rgba(209, 209, 209, 1);
          -   font-size: 40px;
          -}
          -
          -article ul li:first 
          -{
          -   border-top: 0 none;
          -}
          - -

          To migrate the application, use the following steps:

          - -
            -
          1. Use a relative layout. - -

            To achieve a responsive layout for different devices, implement a relative layout. Simply set the width: 100% attribute to the layout elements in the CSS code:

            -
            -section 
            -{
            -   width: 100%;
            -   height: 100%;
            -   ...
            -}
            -
            -header, footer 
            -{
            -   width: 100%;
            -   ...
            -} 
            - - - - - - - - - -
            Note
            The relative layout concept is described in more detail in Relative Layout.
            -
          2. -
          3. Set extra spaces both at the top and bottom. - -

            During the migration, you can see how a certain portion of the rectangle view is covered over by the circular view, especially the header and the footer. To make them fully and consistently visible in the circular view, provide a "padding" space at the top and bottom of the page. In the following example migrating to a circular gear device from a rectangular Gear S, extra 77 px padding is used:

            -
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   section {padding: 77px 0;}
            -}
            -
            - -

            Figure: Top and bottom padding

            -

            Top and bottom padding

            -
          4. -
          5. Set the header and footer position. - -

            After setting the top and bottom padding, set the header and footer position for scrolling in the circular view.

            -

            For a rectangular device with a lengthwise screen, especially Gear S, the best option is to make only the content area scrollable.

            - -

            Figure: Scrolling with a rectangular screen

            -

            Scrolling with a rectangular screen

            -

            In a circular screen, it is better to make the whole page scrollable, including the top and bottom space.

            -

            Figure: Scrolling with a circular screen

            -

            Scrolling with a circular screen

            - -

            To implement the header and footer position, use the CSS position attribute:

            -
            -<!--Rectangular device-->
            -header, footer 
            -{
            -   position: fixed;
            -}
            -
            -<!--Circular device-->
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   header, footer 
            -   {
            -      position: static;
            -   }
            -}
            -
            - -
          6. -
          7. Move the display to the initial position. - -

            To provide a better user experience, show the entire display at the beginning, including the "top padding" space. A few seconds after the application launch, move the display back to its initial position, where the header is placed on the top without any space between itself and the edge of the screen. When the display moves like this, the users can perceive the existence of the top space.

            - -

            Figure: Moving to the initial position

            -

            Moving to the initial position

            - -

            The scroll move requires several lines of JavaScript code. In the following sample, the few (N) seconds is set to 1500 ms, but you can change the value as needed.

            -
            -(function initScrollPosition() 
            -{
            -   var SCROLL_DELAY_TIME = 1500,
            -       page = document.getElementById("main"),
            -       scrollPosition = window.parseInt(window.getComputedStyle(page)["padding-top"]),
            -       initScrollTimeoutId = null,
            -       mql = window.matchMedia("(-tizen-geometric-shape: circle)");;
            -
            -   /* The effect is applied to a circular device only, so use mediaquery */
            -   if (mql.matches) 
            -   {	
            -      page.addEventListener("scroll", function clearInitScrollCallback() 
            -      {
            -         window.clearTimeout(initScrollTimeoutId);
            -         page.removeEventListener("scroll", clearInitScrollCallback, false);
            -      }, false);
            -
            -      initScrollTimeoutId = window.setTimeout(function() 
            -      {
            -         page.scrollTop = scrollPosition;
            -      }, SCROLL_DELAY_TIME);
            -   }
            -}());
            -
            - -
          8. -
          9. Set extra attributes for a better view. - -

            Extra attributes are not mandatory in the migration process, but they can be helpful for a better application view.

            -

            Sometimes changing the layout of the basic elements is not enough to achieve a user-friendly view, and changes in other elements' layout are needed too. For example, consider setting the text-align: center attribute for the header and list items in the circular view (this attribute is already defined in the above circular screenshots). If the list is aligned to left in a circular view, the list items may not be all visible when placed out of the middle space.

            - -
            -<!--Common style for header and footer text-->
            -header, footer 
            -{
            -   text-align: center;
            -}
            -
            -<!--In a circular screen, list item has a center position-->
            -@media all and (-tizen-geometric-shape: circle) 
            -{
            -   article ul li 
            -   {
            -      text-align: center;
            -      line-height: 60px;
            -   }
            -}
            -
            -
          10. -
          - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/html/web/w3c/woff_w.htm b/org.tizen.ui.guides/html/web/w3c/woff_w.htm deleted file mode 100755 index fa02e72..0000000 --- a/org.tizen.ui.guides/html/web/w3c/woff_w.htm +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - WOFF File Format 1.0: Changing Fonts Using WOFF - - - - - - -
          -

          WOFF File Format 1.0: Changing Fonts Using WOFF

          - -

          You can decode and restore font data easily.

          - -

          The new text features in WOFF File Format 1.0 include:

          -
            - -
          • WOFF file format 1.0 -

            WOFF (Web Open Font Format) is a packaging format used to decode and restore font data according to the @font-face rule to display it identically with the input font. The @font-face rule is a CSS rule that allows linking to fonts and finding a suitable font to display if the original font is not available. You can use WOFF within a Web page.

          • -
          - -

          Using the WOFF File Format

          - -

          To enhance the user experience of your application, you must learn to use the WOFF (Web Open Font Format) file format 1.0, which is a W3C standard font packaging format used in Web pages:

          - -
            -
          1. Download and use fonts installed on the Web server by creating @font-face rules. Within the rules, you can define the following properties: -
              -
            • font-family -

              Defines a name for the font. This property is mandatory.

            • -
            • src -

              Defines the URL of the font file on the server. This property is mandatory. If the local attribute is defined, the font resource is not downloaded from the server if it already exists in the local storage.

            • -
            • font-stretch -

              Defines the way the font is stretched. This property is optional.

            • -
            • font-style -

              Defines the font style. This property is optional.

            • -
            • font-weight -

              Defines the font weight. This property is optional.

            • -
            -

            Define the rules with in a <style> element in the <head> section of a Web page:

            -
            -<head>
            -   <style>
            -   @font-face
            -   {
            -      font-family: MuseoSans;
            -      src: local('MuseoSans'),
            -           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_1_0.woff') format('woff');
            -   }
            -
            -   @font-face
            -   {
            -      font-family: MuseoSans;
            -      font-weight: bold;
            -      src: local('MuseoSans'),
            -           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_0_0.woff') format('woff');
            -   }
            -
            -   @font-face
            -   {
            -      font-family: MuseoSans;
            -      font-weight: 900;
            -      src: local('MuseoSans'),
            -           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_2_0.woff') format('woff');
            -   }
            -
            -   p:nth-child(2) {font-family: MuseoSans}
            -   p:nth-child(3) {font-family: MuseoSans; font-weight: bold;}
            -   p:nth-child(4) {font-family: MuseoSans; font-weight: 900;}
            -   </style>
            -</head>
            -
          2. -
          3. In the <body> section, create <p> elements containing text in which the font rules are implemented: -
            <body>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -   <p>The quick brown fox jumps over a lazy dog.</p>
            -</body>
            -</html>
            -
            -
          4. -
          -

          Figure: Implementing the @font-face rules (in mobile applications only)

          -

          Implementing the @font-face rules (in mobile applications only)

          - - - - -
          - -Go to top - - - - - - - \ No newline at end of file diff --git a/org.tizen.ui.guides/index.xml b/org.tizen.ui.guides/index.xml deleted file mode 100755 index 78f30e1..0000000 --- a/org.tizen.ui.guides/index.xml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/org.tizen.ui.guides/plugin.xml b/org.tizen.ui.guides/plugin.xml deleted file mode 100755 index 4c22a91..0000000 --- a/org.tizen.ui.guides/plugin.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/org.tizen.ui.practices/.project b/org.tizen.ui.practices/.project new file mode 100644 index 0000000..0e416e7 --- /dev/null +++ b/org.tizen.ui.practices/.project @@ -0,0 +1,22 @@ + + + org.tizen.ui.practices_2.4.0 + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/org.tizen.ui.practices/META-INF/MANIFEST.MF b/org.tizen.ui.practices/META-INF/MANIFEST.MF new file mode 100644 index 0000000..9f596bf --- /dev/null +++ b/org.tizen.ui.practices/META-INF/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 1 +Bundle-Name: Tizen UI Practices +Bundle-SymbolicName: org.tizen.ui.practices;singleton=true +Bundle-Version: 2.4.0 +Bundle-Vendor: The Linux Foundation + diff --git a/org.tizen.ui.guides/about.html b/org.tizen.ui.practices/about.html old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/about.html rename to org.tizen.ui.practices/about.html diff --git a/org.tizen.ui.practices/build.properties b/org.tizen.ui.practices/build.properties new file mode 100644 index 0000000..b84ff38 --- /dev/null +++ b/org.tizen.ui.practices/build.properties @@ -0,0 +1,8 @@ +bin.includes = plugin.xml,\ + META-INF/,\ + html/,\ + build.properties,\ + .project,\ + about.html,\ + index.xml + diff --git a/org.tizen.ui.practices/html/cover_page.htm b/org.tizen.ui.practices/html/cover_page.htm new file mode 100644 index 0000000..f355edc --- /dev/null +++ b/org.tizen.ui.practices/html/cover_page.htm @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + Tizen UI Practices + + + + +

          Tizen
          +UI Practices

          + +

          Click the application type you want:

          +

          Web Application Native Application

          + + + + + + + + + + + + diff --git a/org.tizen.ui.practices/html/css/snippet.css b/org.tizen.ui.practices/html/css/snippet.css new file mode 100644 index 0000000..f880409 --- /dev/null +++ b/org.tizen.ui.practices/html/css/snippet.css @@ -0,0 +1,52 @@ +/* Pretty printing styles. Used with prettify.js. */ + +/* SPAN elements with the classes below are added by prettyprint. */ +.pln { color: #000 } /* plain text */ + +@media screen { + .str { color: #793AFF } /* string content */ + .kwd { color: #7F0055 } /* a keyword */ + .com { color: green} /* a comment */ + .typ { color: #1C1C1C } /* a type name */ + .lit { color: black } /* a literal value */ + /* punctuation, lisp open bracket, lisp close bracket */ + .pun, .opn, .clo { color: #1C1C1C} + .tag { color: #008 } /* a markup tag name */ + .atn { color: #606 } /* a markup attribute name */ + .atv { color: #080 } /* a markup attribute value */ + .dec, .var { color: #606 } /* a declaration; a variable name */ + .fun { color: red } /* a function name */ +} + +/* Use higher contrast and text-weight for printable form. */ +@media print, projection { + .str { color: #060 } + .kwd { color: #006; font-weight: bold } + .com { color: #600; font-style: italic } + .typ { color: #404; font-weight: bold } + .lit { color: #044 } + .pun, .opn, .clo { color: #440 } + .tag { color: #006; font-weight: bold } + .atn { color: #404 } + .atv { color: #060 } +} + +/* Put a border around prettyprinted code snippets. */ +pre.prettyprint { overflow: auto; padding: 2px; border: 1px solid #888 } + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L5, +li.L6, +li.L7, +li.L8 { list-style-type: none } +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { background: #eee } diff --git a/org.tizen.ui.practices/html/css/styles.css b/org.tizen.ui.practices/html/css/styles.css new file mode 100644 index 0000000..4c8f5a8 --- /dev/null +++ b/org.tizen.ui.practices/html/css/styles.css @@ -0,0 +1,756 @@ +@charset "utf-8"; + +body { + background: white; + color: #1C1C1C; + margin-right: 20px; + margin-left: 20px; + font-size: 9pt; + font-weight: normal; + font-family: Arial, Helvetica, sans-serif; +} + +h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ol, dl, dd, dt, footer { + font-family: Arial, Verdana, Helvetica, sans-serif + } + +/* Set default font to 9 pt */ +table, div, p, dl, td, caption, th, ul, ol, li, dd, dt, pre, code { + font-size: 9pt; +} + +pre, code { + font-family: "Courier New", Courier, monospace; + border: 1px solid #719cc7; + margin: 6px 1.5px; + padding: 1px 1px 1px 1px; + font-weight: normal; + font-style: normal; +} + +h1 {font-size: 24pt; color: #0E437D;} +h2 {font-size: 18pt; color: #0E437D;} +h3 {font-size: 14pt; color: #1C1C1C;} +h4 {font-size: 12pt; color: #1C1C1C;} +h5 {font-size: 10pt; color: #1C1C1C;} + +h1, h2, h3, h4, h5 { + font-weight: bold; + font-style: normal; + line-height: normal; + margin-top: 16pt; +} + +caption, p.caption { + font-size: 9pt; + color: #1C1C1C; + font-weight: bold; + text-align: left; + margin-top: 20px; + margin-bottom: 0px; +} + +ol { + margin-bottom: 20px; +} + +ul ul , ol ul, ul ol, ol ol{ + margin-top: 10px; +} + +ul li, ol li { + margin-bottom: 10px; +} + +ol.tutorstep li { + border-top: 2px solid #719cc7; + list-style-position: inside; + font-weight: bold; + margin-top: 30px; + margin-left: -20px; + padding-top: 3px; + font-size: 12pt; +} + +ol.tutorstep li p{ + font-size: 9pt; + font-weight: normal; + margin-top: 10px; +} + +ol.tutorstep ol li, ol.tutorstep li ol li, ol.tutorstep li ul li { + font-size: 9pt; + list-style-position: outside; + margin-left: 0px; + font-weight: normal; +} + +ol.tutorstep ol li p, ol.tutorstep ul li p { + font-size: 9pt; + font-weight: normal; + margin-top: 5px; +} + +ol li p, ul li p { + font-size: 9pt; + font-weight: normal; + margin-bottom: 2px; + margin-top: 2px; +} + +ol ol , ol.tutorstep ol{ + font-size: 9pt; + font-weight: normal; + list-style-type: lower-alpha; + color: #1C1C1C; + border-style: none; + margin-top: 10px; +} + +ol.tutorstep ul { + margin-top: 10px; + font-size: 9pt; +} + +ol ol li, ol ul li, ol.tutorstep ol li, ol.tutorstep ul li { + border-style: none; + margin-top: 5px; + font-size: 9pt; +} + +ul { + font-size: 9pt; + font-weight: normal; + color: #1C1C1C; +} + + +/* End of font face declarations */ + +/* Set table borders and heading row background */ +table { + border: 0px; + border-collapse: collapse; + width: 100%; + margin-top: 20px; + margin-bottom: 20px; + background: white; +} + +th { + border-top: 2px solid #719cc7; + border-right: 1px solid #c6d9f1; + border-left: 1px solid #c6d9f1; + background-color: #f3f7fb; + padding: 4px; + color: #719cc7; + font-size: 9pt; + font-weight: bold; +} + +td { + border: 1px solid #c6d9f1; + vertical-align:top; + padding: 3px 20px 5px 20px; + } + +td.middle { + border: 1px solid #c6d9f1; + vertical-align:middle; + padding: 3px 20px 5px 20px; + } + +/* Notes stand out using a light top & bottom borders with yellow background */ +table.note { + border-top: 2px solid #719cc7; + border-left: 0px; + border-right: 0px; + width: 100%; +} + +tr.note { + text-align: left; +} + +th.note { + text-align: left; + background-color: #ddd9c3; + background-image: note.gif; + border-top: 2px solid #719cc7; + border-bottom:1px solid #719cc7; + border-right: none; + +} + +td.note, p.note { + background-color: #eeece1; + color: #1C1C1C; + padding: 5px; + margin-top:12px; + margin-bottom:12px; + border: none; +} + +/* Figure titles are centered and bolded */ +p.figure , ol.tutorstep li p.figure, ol.tutorstep ol li p.figure, ol.tutorstep ul li p.figure { + text-align: center; + font-weight: bold; +} + +/* Red background and white text for things that need fixing before release */ +.fix { + background-color: red; + font-weight: bold; + color: white; + } + +/* Classes for creating collapsible content */ +#banner { + padding: 8px 4px 8px 4px; + /* top right bottom left */ + border: 1px solid #7f7f7f; + width: 100%; + background-image: url("banner.png"); + text-align: left; + font-weight: bold; + font-size: 9pt; + color: #ffffff; +} + +#toc-navigation {width: 20%; position: fixed; right: 17px; top: 0; bottom: 51px; /* overflow: auto; *//* min-width: 200px; *//* background: white; */z-index: 100;padding-top: 10px;/* padding-bottom: 88px; */margin-bottom: 89px;} +#toc {padding: 0px 20px 5px 20px; /* border: 2px solid #567a9c; */ border-radius: 15px;position: absolute;top: 78px;bottom: 9px;overflow: auto;/* margin-bottom: 5px; */padding-bottom: 5px;border-bottom: 3px transparent solid;margin-left: 5px;} +#main {width: 75%; height: 90%;} +#container {width:100%;} +#container #contents {padding:0px 0 20px; overflow: auto;position: fixed;top: 0;bottom: 0;margin-bottom: 64px;right: 200px;left: 20px;} +body.no-toc #container #contents {right: 0;padding-right:30px;} +body.no-toc #toc-navigation {width: auto;} +body.no-toc .top {right: 19px; /* float:none; */ width: 28px;} +body.no-toc #profile {float: right;right: -32px;} +body.no-toc #profile p {padding: 0; margin: 0;} +#container #contents:after {content: "."; display: block; height: 20px; clear: both; visibility: hidden;} + #container #contents>.content {/* width:75%; */min-width: 600px;/* right: 300px; *//* position: fixed; */padding-right: 5px;} + #container #contents>.content>.cont { margin-bottom:80px; padding-bottom:80px; } + +.devicespecs-util {float:right; margin-top:25px;} + .devicespecs-util ul.dutil {margin:0; padding-bottom:0; height: 11px; list-style-type:none;} + .devicespecs-util ul.dutil:after {content: "."; display: block; height: 0px; clear: both; visibility: hidden;} + .devicespecs-util ul.dutil li {float:left; margin-right:8px; padding-right:8px; background:url('../images/bg_util_bar.gif') no-repeat right center; color:#666;} + .devicespecs-util ul.dutil li.none {margin-right:0; padding-right:0; background-image:none;} + .devicespecs-util ul.dutil li a { font-size:11px; color:#666; line-height: 11px;} + .devicespecs-util ul.dutil li a:hover { color:#222; } + .devicespecs-util ul.dutil li a:active { color:#222; } + +ul.devicespecifications {clear:both; width:100%; margin:0; padding: 0;} +ul.devicespecifications > li { width:100%; margin-top:0; padding-left:0; list-style-type:none; border:1px solid #799cd3; padding: 5px 0px 5px 0px;} +ul.devicespecifications li div.devicespec-con {width:90%; margin:10px 0 20px 0; padding:0 14px; font-size: 13px;} +ul.devicespecifications li div.devicespec-tit {/*height:22px;*/ padding-right: 71px; background-color:#ffffff; position: relative;} + ul.devicespecifications li div.devicespec-tit .items-tit { /*float:left;*/ margin:0 0 0 14px; padding:0; color:#567a9c; line-height: 22px; font-size: 14px; font-style:normal; font-weight: bold;} + + ul.devicespecifications li div.devicespec-tit .items-tit-h2 { /*float:left;*/ margin: 0px 0px 0px 14px; padding:0; line-height: 22px; font-size: 18pt; color: #0E437D; font-style:normal; font-weight: bold;} + ul.devicespecifications li div.devicespec-tit .items-tit-h3 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 14pt; color: #1C1C1C; font-style:normal; font-weight: bold;} + ul.devicespecifications li div.devicespec-tit .items-tit-h4 { /*float:left;*/ margin:0 0 0 14px; padding:0; line-height: 22px; font-size: 12pt; color: #1C1C1C; font-style:normal; font-weight: bold;} + + ul.devicespecifications li div.devicespec-tit > span {position: absolute; top: 0; right:0;background:#416cbb; display:block; height:22px; margin-right:0; border-left: solid 1px #7a9bd4; } + ul.devicespecifications li div.devicespec-tit > span a.bt-arr {display:block; width: 55px; height:15px; margin-left:0; padding-top:5px; padding-left: 14px; text-align:left; background: url('../images/ico_arr_hidden.gif') 46px 9px no-repeat;} + ul.devicespecifications li div.devicespec-tit > span a.bt-arr em {display:inline-block; height: 14px; line-height:11px; font-size:11px; color:#fff; font-style:normal; margin-right: 8px;} + ul.devicespecifications li div.devicespec-tit > span * {vertical-align:middle;} + + ul.devicespecifications li div.devicespec-con ul.con-list { width:100%; } + ul.devicespecifications li div.devicespec-con ul.con-list li {line-height: 18px; margin:0; padding:0 0 0 7px; background: url("../images/ico_bullet_2_7.gif") 0 8px no-repeat; } + +.ul.ul, .ul.ul li {margin-bottom: 10px; list-style-type: disc; border: none;} +.ul.ul ul, .ul.ul ul li, .ol.ol ul, .ol.ol ul li {list-style-type: circle;} +.ol.ol, .ol.ol li {list-style-type: decimal; border: none;} +.ol.ol ol, .ol.ol ol li, .ul.ul ol, .ul.ul ol li {list-style-type: lower-alpha;} + +.static-cont {width:100%; margin-bottom:40px;} + +.top {text-align: right;} +.toc, ul.toc{ + margin: 10px 0px 0px 0px; + padding-left: 13px; + list-style: disc; + font-size: 9pt; + line-height: 115%; + } + +.toc-title { + font-size: 12pt; + color: #0E437D; + font-weight: bold; + font-style: normal; + line-height: normal; + margin-top: 16pt; +} + +a.top { + display:block; + float: right; + position:fixed; + width: 28px; + height:89px; + bottom:50px; + z-index: 101; + right: 19%; + } + +a img {border: 0;} + +/* Footer includes space and a gray line above */ +#footer { + position: fixed; + /* width: 100%; */ + bottom: 0px; + text-align: center; + border-top: 1px solid #CCCCCC; + background-color: #FFFFFF; + left: 21px; right: 21px; +} + +.footer {font-size: 8pt;} + +caption { + font-size: 9pt; + color: #1C1C1C; + font-weight: bold; + text-align: center; + margin-top: 20px; + margin-bottom: 0px; +} + +div.qindex, div.navpath, div.navtab{ + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a:link { + color: #719cc7; + text-decoration: underline; + font-weight: bold; +} + +a:hover { + color: #0e437d; +} + +a:visited { + text-decoration: underline; + color: #719cc7; + font-weight: bold; +} + +a.qindex { + font-weight: bold; + padding: 2px; +} + +a.qindex:hover { + text-decoration: underline; + color: #0e437d; + padding: 2px; +} + +a.qindex:visited { + text-decoration: underline; + font-weight: bold; + color: #719cc7; + padding: 2px; +} + +a.qindexHL { + text-decoration: underline; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + padding: 2px 6px; + border: 1px double #9295C2; +} + +a.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; + padding: 2px 6px; +} + +dl.el { + margin-left: -1cm +} + +.fragment { + font-family: monospace, fixed; + font-size: 105%; +} + +pre.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 4px 6px; + margin: 4px 8px 4px 2px; +} + +div.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 6px; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +td.md { + background-color: #f5f5f5; + font-weight: bold; +} + +td.mdname1 { + background-color: #f5f5f5; + font-weight: bold; + color: #602020; +} + +td.mdname { + background-color: #f5f5f5; + font-weight: bold; + color: #602020; + width: 600px; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +td.indexkey { + background-color: #eeeeff; + font-weight: bold; + border: 1px solid #CCCCCC; + margin: 2px 0px 2px 0; + padding: 2px 10px; +} + +td.indexvalue { + background-color: #eeeeff; + border: 1px solid #CCCCCC; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #f0f0f0; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { +} + +img.formulaInl { + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { color: #008000 } +span.keywordtype { color: #604020 } +span.keywordflow { color: #e08000 } +span.comment { color: #800000 } +span.preprocessor { color: #806020 } +span.stringliteral { color: #002080 } +span.charliteral { color: #008080 } +span.vhdldigit { color: #ff00ff } +span.vhdlchar { color: #000000 } +span.vhdlkeyword { color: #700070 } +span.vhdllogic { color: #ff0000 } + +.mdTable { + border: 1px solid #868686; + background-color: #F4F4FB; +} + +.mdRow { + padding: 8px 10px; +} + +/* @group Member Descriptions */ + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F4F4F4A; + border: none; + margin: 4px; + padding: 3px 8px 4px 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memItemLeft, .memItemRight, .memTemplParams { + border-top: 1px solid #DBDBDB; +} + +.memTemplParams { + color: #606060; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} + +.memnav { + background-color: #eeeeff; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.memitem { + padding: 0; +} + +.memname { + white-space: nowrap; + font-weight: bold; +} + +.memproto, .memdoc { + border: 1px solid #9BBCDD; +} + +.memproto { + padding: 0; + background-color: #D5E2EF; + font-weight: bold; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; +} + +.memdoc { + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; +} + +.memdoc p, .memdoc dl, .memdoc ul { + margin: 6px 0; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #853E0E; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} + +/* @end */ + +.search { color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #eeeeff; +} + +td.tiny { + font-size: 75%; +} + +.highlight { + background-color:#E2E2FF; +} + +/*---------- ide-eclipse Styles ---------*/ +.sh_ide-eclipse{font-family: "Courier New", Courier, monospace; + margin: 0px 0px; + padding: -30px -30px -30px -30px; + font-weight: normal; + font-style: normal;} +.sh_ide-eclipse .sh_sourceCode{background-color:#fff;color:#000;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_keyword{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_type{color:#7f0055;font-weight:bold;font-style:normal;} +/*.sh_ide-eclipse .sh_sourceCode .sh_string{color:#00f;font-weight:normal;font-style:normal;}*/ +.sh_ide-eclipse .sh_sourceCode .sh_string{color:#2A00FF;font-weight:normal;font-style:normal;} + +.sh_ide-eclipse .sh_sourceCode .sh_regexp{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_specialchar{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_comment{color:#238E23;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_number{color:#000;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_preproc{color:#3f5fbf;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_function{color:#000;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_url{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_date{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_time{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_file{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_ip{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_name{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_variable{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_oldfile{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_newfile{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_difflines{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_selector{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_property{color:#7f0055;font-weight:bold;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_value{color:#00f;font-weight:normal;font-style:normal;} +.sh_ide-eclipse .sh_sourceCode .sh_unknown{font-family: "Courier New", Courier, monospace;} + +/*------------- STYLE FOR NAMES FROM XML FILE -------------*/ +.sh_styleFromXML{color:#800000;font-weight:bold;} +/*-------------------------------------------------------*/ + +/*-------- Snippet Base Styles ----------*/ +.snippet-wrap {position:relative;} +*:first-child+html .snippet-wrap {display:inline-block;} +* html .snippet-wrap {display:inline-block;} +.snippet-reveal{text-decoration:underline;} +.snippet-wrap .snippet-menu, .snippet-wrap .snippet-hide {position:absolute; top:-99999px; right:15px; font-size:.9em;z-index:1;background-color:transparent;} +.snippet-wrap .snippet-hide {top:auto; bottom:1px;} +*:first-child+html .snippet-wrap .snippet-hide {bottom:1px;} +* html .snippet-wrap .snippet-hide {bottom:1px;} +.snippet-wrap .snippet-menu pre, .snippet-wrap .snippet-hide pre {background-color:transparent; margin:1; padding:0;} +.snippet-wrap .snippet-menu a, .snippet-wrap .snippet-hide a {padding:1px; text-decoration:underline;} +.snippet-wrap pre.sh_sourceCode{padding:1px;line-height:120%;overflow:auto;position:relative; +-moz-border-radius:0px; +-webkit-border-radius:0px; +border-radius:0px; +box-shadow: 1px 1px px #000; +-moz-box-shadow: 2px 2px 1px #000; +-webkit-box-shadow: 1px 1px 1px #000;} +.snippet-wrap pre.snippet-textonly {padding:1em;} +*:first-child+html .snippet-wrap pre.snippet-formatted {padding:0.5em 0.5em;} +* html .snippet-wrap pre.snippet-formatted {padding:0em 0.3em;} +.snippet-reveal pre.sh_sourceCode {padding:0em 0em; text-align:right;} +.snippet-wrap .snippet-num li{padding-left:2px;} +.snippet-wrap .snippet-no-num{list-style:none; padding:0em 0em; margin:0;} +.snippet-wrap .snippet-no-num li {list-style:none; padding-left:0;} +.snippet-wrap .snippet-num {margin:1em 0 1em 1em; padding-left:2px;} +.snippet-wrap .snippet-num li {list-style:decimal-leading-zero outside none;} +.snippet-wrap .snippet-no-num li.box {padding:0 6px; margin-left:-6px;} +.snippet-wrap .snippet-num li.box {border:1px solid; list-style-position:inside; margin-left:0px; padding-left:2px;} +*:first-child+html .snippet-wrap .snippet-num li.box {margin-left:-2px;} +* html .snippet-wrap .snippet-num li.box {margin-left:-2px;} +.snippet-wrap li.box-top {border-width:0px 0px 0 !important;} +.snippet-wrap li.box-bot {border-width:0 0px 0px !important;} +.snippet-wrap li.box-mid {border-width:0 0px !important;} +.snippet-wrap .snippet-num li .box-sp {width:10px; display:inline-block;} +*:first-child+html .snippet-wrap .snippet-num li .box-sp {width:20px;} +* html .snippet-wrap .snippet-num li .box-sp {width:2px;} +.snippet-wrap .snippet-no-num li.box {border:1px solid;} +.snippet-wrap .snippet-no-num li .box-sp {display:none;} + +/* Layout fixing */ +.clfix:after {content: "."; display: block; height: 0px; clear: both; visibility: hidden;} +.clfix {display: inline-block;} +.clfix {display: block;} +* html .clfix {height: 1%;} /* Hides from IE-mac */ +.clfix {zoom:1;} /*for IE 5.5-7*/ + +.fl {float:left !important;} +.fr {float:right !important;} +.cl {clear:both;} +.rel {position:relative;} +.abs {position:absolute;} +.ac {text-align:center !important;} +.ar {text-align:right !important;} +.al {text-align:left !important;} +.at {vertical-align:top !important;} +.am {vertical-align:middle !important;} +.ab {vertical-align:bottom;} +.hand {cursor:pointer;} +.bgnone {background:none !important;} +.brnone {border:none !important;} +.b {font-weight:bold !important;} +.n {font-weight:normal !important;} +.invisible{display:block; overflow:hidden; visibility:hidden; width:0; height:0; margin:0; font-size:0; line-height:0;} +.mt5 {margin-top:5px !important;} +/* //Layout fixing */ + +@media print { .hide, .show { display: none; }} + +div#profile { + position: relative; +} +#profile p { + text-align: right; +} + +div#toc_border { + border: 2px solid rgb(86, 122, 156); border-top-left-radius: 15px; border-top-right-radius: 15px; border-bottom-right-radius: 15px; border-bottom-left-radius: 15px; height: 565px; +} + +#contents li { + padding-top: 3px; + margin-top: 5px; + /* overflow: auto; */ +} + +p { + /* overflow: auto; */ +} + +div.table { + /* overflow: auto; */ +} \ No newline at end of file diff --git a/org.tizen.ui.guides/html/images/4_columns.png b/org.tizen.ui.practices/html/images/4_columns.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/4_columns.png rename to org.tizen.ui.practices/html/images/4_columns.png diff --git a/org.tizen.ui.guides/html/images/9patch.png b/org.tizen.ui.practices/html/images/9patch.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/9patch.png rename to org.tizen.ui.practices/html/images/9patch.png diff --git a/org.tizen.ui.guides/html/images/9patch_buffer.png b/org.tizen.ui.practices/html/images/9patch_buffer.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/9patch_buffer.png rename to org.tizen.ui.practices/html/images/9patch_buffer.png diff --git a/org.tizen.ui.guides/html/images/9patch_resource.png b/org.tizen.ui.practices/html/images/9patch_resource.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/9patch_resource.png rename to org.tizen.ui.practices/html/images/9patch_resource.png diff --git a/org.tizen.ui.guides/html/images/9patch_zoomed.png b/org.tizen.ui.practices/html/images/9patch_zoomed.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/9patch_zoomed.png rename to org.tizen.ui.practices/html/images/9patch_zoomed.png diff --git a/org.tizen.ui.guides/html/images/accordion_menu.png b/org.tizen.ui.practices/html/images/accordion_menu.png similarity index 100% rename from org.tizen.ui.guides/html/images/accordion_menu.png rename to org.tizen.ui.practices/html/images/accordion_menu.png diff --git a/org.tizen.ui.guides/html/images/actor_coordinates.png b/org.tizen.ui.practices/html/images/actor_coordinates.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/actor_coordinates.png rename to org.tizen.ui.practices/html/images/actor_coordinates.png diff --git a/org.tizen.ui.guides/html/images/actor_position.png b/org.tizen.ui.practices/html/images/actor_position.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/actor_position.png rename to org.tizen.ui.practices/html/images/actor_position.png diff --git a/org.tizen.ui.guides/html/images/actor_types.png b/org.tizen.ui.practices/html/images/actor_types.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/actor_types.png rename to org.tizen.ui.practices/html/images/actor_types.png diff --git a/org.tizen.ui.practices/html/images/after_resize.png b/org.tizen.ui.practices/html/images/after_resize.png new file mode 100644 index 0000000000000000000000000000000000000000..369052877202324a13db70963c9b32fc202149ec GIT binary patch literal 13700 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 pFI51;qZ&=8oP)=vEzV6Tax<0S#^}geH&PtG9 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 Q;8zD^V|mV^>Wm-xAL2lvz5oCK literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/circular_support.png b/org.tizen.ui.practices/html/images/circular_support.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/circular_support.png rename to org.tizen.ui.practices/html/images/circular_support.png diff --git a/org.tizen.ui.guides/html/images/coin_flip_effect.png b/org.tizen.ui.practices/html/images/coin_flip_effect.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/coin_flip_effect.png rename to org.tizen.ui.practices/html/images/coin_flip_effect.png diff --git a/org.tizen.ui.guides/html/images/color_colorplane.png b/org.tizen.ui.practices/html/images/color_colorplane.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/color_colorplane.png rename to org.tizen.ui.practices/html/images/color_colorplane.png diff --git a/org.tizen.ui.guides/html/images/colorsel.png b/org.tizen.ui.practices/html/images/colorsel.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/colorsel.png rename to org.tizen.ui.practices/html/images/colorsel.png diff --git a/org.tizen.ui.guides/html/images/colorselector_tree.png b/org.tizen.ui.practices/html/images/colorselector_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/colorselector_tree.png rename to org.tizen.ui.practices/html/images/colorselector_tree.png diff --git a/org.tizen.ui.guides/html/images/column_break.png b/org.tizen.ui.practices/html/images/column_break.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_break.png rename to org.tizen.ui.practices/html/images/column_break.png diff --git a/org.tizen.ui.guides/html/images/column_gap.png b/org.tizen.ui.practices/html/images/column_gap.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_gap.png rename to org.tizen.ui.practices/html/images/column_gap.png diff --git a/org.tizen.ui.guides/html/images/column_rule.png b/org.tizen.ui.practices/html/images/column_rule.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_rule.png rename to org.tizen.ui.practices/html/images/column_rule.png diff --git a/org.tizen.ui.guides/html/images/column_settings.png b/org.tizen.ui.practices/html/images/column_settings.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_settings.png rename to org.tizen.ui.practices/html/images/column_settings.png diff --git a/org.tizen.ui.guides/html/images/column_span.png b/org.tizen.ui.practices/html/images/column_span.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_span.png rename to org.tizen.ui.practices/html/images/column_span.png diff --git a/org.tizen.ui.guides/html/images/column_width.png b/org.tizen.ui.practices/html/images/column_width.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/column_width.png rename to org.tizen.ui.practices/html/images/column_width.png diff --git a/org.tizen.ui.guides/html/images/conformant.png b/org.tizen.ui.practices/html/images/conformant.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/conformant.png rename to org.tizen.ui.practices/html/images/conformant.png diff --git a/org.tizen.ui.guides/html/images/contextual_bottom_o_wn.png b/org.tizen.ui.practices/html/images/contextual_bottom_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/contextual_bottom_o_wn.png rename to org.tizen.ui.practices/html/images/contextual_bottom_o_wn.png diff --git a/org.tizen.ui.guides/html/images/contextual_select_o_wn.png b/org.tizen.ui.practices/html/images/contextual_select_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/contextual_select_o_wn.png rename to org.tizen.ui.practices/html/images/contextual_select_o_wn.png diff --git a/org.tizen.ui.guides/html/images/contextual_top_o_wn.png b/org.tizen.ui.practices/html/images/contextual_top_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/contextual_top_o_wn.png rename to org.tizen.ui.practices/html/images/contextual_top_o_wn.png diff --git a/org.tizen.ui.guides/html/images/contextual_wn.png b/org.tizen.ui.practices/html/images/contextual_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/contextual_wn.png rename to org.tizen.ui.practices/html/images/contextual_wn.png diff --git a/org.tizen.ui.guides/html/images/copy_pasting.png b/org.tizen.ui.practices/html/images/copy_pasting.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/copy_pasting.png rename to org.tizen.ui.practices/html/images/copy_pasting.png diff --git a/org.tizen.ui.guides/html/images/css_bg1.png b/org.tizen.ui.practices/html/images/css_bg1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_bg1.png rename to org.tizen.ui.practices/html/images/css_bg1.png diff --git a/org.tizen.ui.guides/html/images/css_bg_tutorial1.png b/org.tizen.ui.practices/html/images/css_bg_tutorial1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_bg_tutorial1.png rename to org.tizen.ui.practices/html/images/css_bg_tutorial1.png diff --git a/org.tizen.ui.guides/html/images/css_bg_tutorial2.png b/org.tizen.ui.practices/html/images/css_bg_tutorial2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_bg_tutorial2.png rename to org.tizen.ui.practices/html/images/css_bg_tutorial2.png diff --git a/org.tizen.ui.guides/html/images/css_color_tutorial1.png b/org.tizen.ui.practices/html/images/css_color_tutorial1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_color_tutorial1.png rename to org.tizen.ui.practices/html/images/css_color_tutorial1.png diff --git a/org.tizen.ui.guides/html/images/css_result.png b/org.tizen.ui.practices/html/images/css_result.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_result.png rename to org.tizen.ui.practices/html/images/css_result.png diff --git a/org.tizen.ui.guides/html/images/css_transforms1.png b/org.tizen.ui.practices/html/images/css_transforms1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_transforms1.png rename to org.tizen.ui.practices/html/images/css_transforms1.png diff --git a/org.tizen.ui.guides/html/images/css_transforms2.png b/org.tizen.ui.practices/html/images/css_transforms2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_transforms2.png rename to org.tizen.ui.practices/html/images/css_transforms2.png diff --git a/org.tizen.ui.guides/html/images/css_transforms5.png b/org.tizen.ui.practices/html/images/css_transforms5.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/css_transforms5.png rename to org.tizen.ui.practices/html/images/css_transforms5.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup1.png b/org.tizen.ui.practices/html/images/ctxpopup1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup1.png rename to org.tizen.ui.practices/html/images/ctxpopup1.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup2.png b/org.tizen.ui.practices/html/images/ctxpopup2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup2.png rename to org.tizen.ui.practices/html/images/ctxpopup2.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup3.png b/org.tizen.ui.practices/html/images/ctxpopup3.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup3.png rename to org.tizen.ui.practices/html/images/ctxpopup3.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup_default.png b/org.tizen.ui.practices/html/images/ctxpopup_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup_default.png rename to org.tizen.ui.practices/html/images/ctxpopup_default.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup_dropdown.png b/org.tizen.ui.practices/html/images/ctxpopup_dropdown.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup_dropdown.png rename to org.tizen.ui.practices/html/images/ctxpopup_dropdown.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup_dropdown_label.png b/org.tizen.ui.practices/html/images/ctxpopup_dropdown_label.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup_dropdown_label.png rename to org.tizen.ui.practices/html/images/ctxpopup_dropdown_label.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup_tree.png b/org.tizen.ui.practices/html/images/ctxpopup_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup_tree.png rename to org.tizen.ui.practices/html/images/ctxpopup_tree.png diff --git a/org.tizen.ui.guides/html/images/ctxpopup_wn.png b/org.tizen.ui.practices/html/images/ctxpopup_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ctxpopup_wn.png rename to org.tizen.ui.practices/html/images/ctxpopup_wn.png diff --git a/org.tizen.ui.guides/html/images/dali_component.png b/org.tizen.ui.practices/html/images/dali_component.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/dali_component.png rename to org.tizen.ui.practices/html/images/dali_component.png diff --git a/org.tizen.ui.practices/html/images/dali_threads.png b/org.tizen.ui.practices/html/images/dali_threads.png new file mode 100644 index 0000000000000000000000000000000000000000..8010ca627175b1c6612af3abe33111c88295b837 GIT binary patch literal 52405 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
        • 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%0DB2mac5(*@ELIKOz%hiumM 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 uE^~G_eZT=c)hFw;FvnbHeut(~dsBKKlEi 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/mobile_s_w.png b/org.tizen.ui.practices/html/images/mobile_s_w.png new file mode 100644 index 0000000000000000000000000000000000000000..f86df299f50fc9facb4af6a847925599a7277c0d GIT binary patch literal 2183 zcmb7Gc~ld39#0i2TOI*%46Z~XR>Xn;PbQ25gF&G< zWzThRGXk;NC=HE(BKQGxkwS(Qnq;tAnG!}L5Sx9qN}(tLgn(EuPAX@hW*eGOfK<#t zeM08r`ARkzFZEAVfg!1aP*G}vh$cq)`T(1?beKQ}LP9_*OO&hWS_W!~mkzH@$2b(Q zBmyNcP`?=!!4Cr13Ka;Dv0fMvp5O^kXjlT-i$bG#07Q6?!&7lYJO)prlSyDd{*|a&j^@nS@oS;&22SjfTS$aYP~pmcXb}q>?HjsX`8z7=^J44a7jfmj32~Oc^YVi-**2$mQzgV8LO-X@yE00gK0}mSjx+ zt)Te)cOzu7H_~b-82sJ%Kjc@3rYJ#NFsN2&R3bQw64$p>y<3q3-1)on3gpHTVg^3)6NFxK~5Rbz^X*5zXorb4!DNGiVL*P<4TmpefVv{&5PZpj- z!*e-!+6uwjKv)-63}cy|ets-AlSyQ;Ndy9y%%pLdTrQFA$H8-0EI;N7mM2$3Lb(Vu zDK%lGzhi0d#M0R+PzWhhp$bLfN;L(=DO7{g9=jqYuw5C?2OYg5FLfm)?X~-JhHdhVF2?-p8QS=b z`Z&Mi-4acMS+;z>ru5!M8<7`L*Aly-#?CP^`q*%U+g$2UfIeox;oJJYPamFQ8W=Bv z$L=@VrF`m6Exv376=eSIvp-**cyvkUt?#}{BMmUp#>$R5EPUOW(^Qc|J7G4nt(Qq| zwa11&o=y4EG4H#|{O*4h)}+RcWG~eBJQ^qJx-uWOKT6d+nGH5RXwywFG(QBfsn@E_zL^$((sU_GH>&%Rv`V7MJmojJ8my*9g`>LyAMD%_6;+(89vbZbrg@Qiw6y7Jm$@5hV{g|#8v7zYcZ;uX zn|c4~RJ4CwOMcBqg9#p;AN@otyX&y|y)74ui+8Rqu@#!nJ`Ib{jLwsXcUfkgXf>3C zq@|^?%WgK`b31;U5RieR+I@c{FB|{j@Z)K#A<^0}7n(EiXGd!wJkL1lEvb!|csbH% zNjlT|L&e0chHXk>I3n`HoC6&P_8z&=Iy>K~x-*skwD&(*1(_QxhxZF!W9@y!;Gc4{ zc!I)Hx8iU6+MTz*QQIq@F%0}@3}L;#cA@#z1C+(}n=>~t+R>iwH3tS`w0!}hoa|_C z<33=>FtSLg9{1%C3&G2b%L9Y;MFN5~Z`3?wG`u*3(BCng*)|h;Jg7%EIgUPRFC^;f z)UGilqx!8qoz|6p!&`#&p4scQnp^H|QPZ@~FAhdtYWVJH*|jh!-u-OZk9qr=#I-xn z-%2h-8p8kf)wVObnxqQ@Q%dTM2`I4lNcC9faFyFHTTi2O&K~pjfmHozi}PRLT^o!1 ztwHPU#4B~FHv148HFSOdmAFm+Ti~FIx31Sbd-m*vv9i)?a8)>JT?F^D%i8In9R~ER zZDv%9g33Z7?-0k~;OcW9G)=7f7|M${S1V{cFw$}x@ZTTP3U%)J_x8QW@M-e-##NKz zqA7`&+pDJ8LyQ^I`%AAe^S#Hr%BD|udnuD4XsW2Ee6`3S-N(mg=%)k+h4o3APR6_hx~Kr!CBL<0go%-RIy^Regy(Dg&_a{ literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/mobile_s_w_optional.png b/org.tizen.ui.practices/html/images/mobile_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..0434b73d0359bffb3ac4dee8806df0bba6dd2924 GIT binary patch literal 2021 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 S-UP0EgOZj|5U&;m1^gfAUqi0| literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/more_option_main.png b/org.tizen.ui.practices/html/images/more_option_main.png new file mode 100644 index 0000000000000000000000000000000000000000..b03b67ec8f66d463fa6e51b08289a54d6df9e097 GIT binary patch literal 14004 zcmXY&WmFtp+pK}$1PK;g0t9z=g1fuBySoHSa3{FS4DK!=xVyW%yPkgD^ZgiRHLzx; zXLaAZ>Z;nm73C$65%CZqARv&XBt?~h=NRA-4G#tUJV%uO@UwHxr%AJsyLXtdKfvIK`0to*}F2x zi>Z>hvof$VFf%dTI_E(^aF9uf{!sPQKg)vC#MD?AsDa?9?iZe2tbVYc)vWm{+PB{J zGv7Eec~M9#xF4OG#vQ}wqLj)|L+DF+jmKE(fz)+J)y2zON*!+hQjfA~!oYp9ujbo>%S%T6gzB5!@Km_++n3vj>&499Nz|?(DDkuk)si+ zF)N+t$j5%g{dg9%xVVVVY5)4N@iCA3z-bkL3O-+Lae2Ny>hQU5ZEc-@Yqbx0g>gO@ zMn;~;tw@B`7C&LU_Km0X$fijyo2}5{>=q=sRXrTb;0*Y9^LQJYww7sA?eMz!{_R`O zzkdZT2jiiL*xm{|plC+IPTR%YtzTPY!XhFDUH(}d$P8mjcgJ&OS-c)7L~PBjL(}d{ zr))fLxz$6Ki4-o_<11jZvcSMVohJJuGiiMK3dOtgwYHH|Mg<(fJlP`_OL~*AD8$+2 z*FRLcrH(5ccCkeK5m`q?uZ3qbDtFg=BVGbG+KrZJ+$#H@k61Oew2JDaDL-EgbNDP) zsc%b!Hn@%9u}k2E8{3Q(vq>bGm2HZ4v~P4NUbC_-_T?}638^JO|!O2OiH zCv#Ow9pb;YDGaX?(ZcvLHMH}DL;Is}UG|2tI&O(O{P4i~9loIy$qZ`RqrXyEea3kj zPFyeM*X){CF7y7q+?_9!NmL1RJl|fdbU9pfo~<-iX}4H6mMn~L5%}nf)HO9(eo!ifkYAr_7X`-Lk7LB+&o?os-UHpU!{;2^6 z2MhgP{Rl_wkTaC{9rakSw9ICKXwAD@y-VP2xzYY4ZX>9G&00=x@VI8gdSMi_wCh0W zuv*Rhjc7sOB$Fba&IGb}$X;u^UchKUrJZAsWfPN-@U@XdEQ%R^swJ(@jJO+=PxH6ZZFvY8pCIB=0Gj5IjB zx4-}R;MHh3yoiR5uH3ufm`WHb(1rIP@_@0^^BpRT%>{eY;*pAn<@tbK&_steKo>!+ zc|fg9T`q@%5d2H05TBedhJrw4s(QLaM&U{Zt*M3v<64d=lv+jswT49;ls(mVgE9J7Gd`{Zdet$HbENrgL;$obT*P>}6hMmeniUX}m zHjO2(M3`Pnyf}~>-J1}RD=yhr@8D!`P_lzTxvEG&O(K?vUZXNI|Cj60v=ZytQp3U0 zj79p zviWfJXiMfd&ntAAkln2VUz>kGfqx}YdJqK!1aycigNj(xBv6Qr%%~&ck{k>_g2-j? z@HBf8R3IcHI==Yu+_Hs6PRmiPwmY%r5dkmXZBiI6fOR_4WSdq?T@vvH5u48QaFbL8 zoA|2-Eyw+SFmKZZY0TdeYatF$Zbue>Sz^4DZwjM9<${cL{cNH2Pyz)C3IZRblVS#^ z-S-WZV%LlHj?%%>tDSz2^Vt@i1$(Y~qBS2yn6HfLnZv0KplX;<@++jTbhlm67)|F*#IU044yB-(oEoNRA7Q|ieaV?#qvoSQ z?j!OSd>C(!>t}G^;YG9`&$pMw$dYB?Qkxt$j^~nortqlBy}Q?HbHTu`70clhWF=_* z#a$0G{T=nX(A1^;n(xPglGMkSMxU*i#&=AH)mtX1RIUi4U`g&#xk@cdORnfOb~*iM z0i)>lq^(PFv7=6QuibJs!g+W3%grKI@7G`Ab@syvc+aW$b240&#Pmjo1%bV+^qA_EYF8UVTBNdC#|b6Bbl#evXhttPusa8A z;YtiRaC_`&XNFa*a5`XAevisAl*Brm%o9Q6HJcjvnpX_PClGMuvVvh(d~)8CiexX5p-GTU z9`LuN9eEVt|MahiVPldUPk8R}YA0G5hR5x+m+dY>##`o#TH^PkbBt;DLRjG@>p8@W z5(auBcnL@~U_NLu1^iv-_c4MpBjj-$Y)GV?7e^@1d97Hfsj1n92!;ywJ$M=BBs*KF zpGcwC8IGjMvj-@HPcS)b~!_zv5*NBc39IHkV*(zx(24}n7^LVJ=`0^a;M$#z9r zKrQks1(r*R670bw(cgq6?YeliMhGF0GPA3 zriB3nQHfShaeEm2sk-8<%g%^6Tzga$(e4S%fM}$ zy{K@N-IIwv<-B$Z-SBiQ)7m$+(Rkd_Re#AFO_kkt2jklfcIV)Y;I$s{Ic-%F-1bF^ znS2*76JjW+afUv<+?~NuS$%zG2$5_Uz6{wi+TzKE3f`Z{*r;)F9a_u7P{1MBe=^}6b??n{hG;&!s zu(h^%(3F*)ID^fA{(-^3*TkPfs?O6|z8!dR*l5h6YVbXBZrZZX(&gdC_6T{O-9{iG za^bH22n3=3dFFifUVYh>{h@dS4mnw5NnJk0v1cjx7NF^!5cA}U`Ti6Wm9;;!XpC~z zZBCKF_ur>wa@!brsmz&v&HVTACO$C2|%N6v_1aJ)|PxpZn%Y z6mm!^sIl@8i%{V|f1W+ztTCrn>w3G#Z;6g#C@IXRQEC@GQLmtOez`valqc=A^Pb8P zD2#5s3Ne7)s;3Z`6U-vzaK_MwlGpqXU(TIRLd>O!@iLj){M;|N*B{Q;O!_PznGjPJ z{)MAD^sZjw>>1hEl)3xyVD)aqis?FRRPz63py@e9#G)&_q~r%C{Oj%zMn}pRhYTp4 z)dyuK!fAIf`;#|^!?N%BDK|DI)+3+~E{VQuec9df^M0tQt1HM*x{3HY4Hm6I2c}2Y z&9lATrFOp-R=xFc5~y0gS<&bym-~1p@W#Ax?3APDY)AA zp(nAF3RomD$#nwOy|-Rr`n~S1v1p9z0d-}wP=0p2oJ<~PpPxUT#e33V+o&a~CMo&L znONo@EV9SNa&%JQTuBm{?PW^VA{?%JN9!G?5*ykL%Ul%E^%M!qY^B=Dg-=(RMrDHK zuaA&(m?7~=+3?&~{}PBxm&#Ntzwu)Y?VVNU{mX^s87qaqc1gAgLo9)vfc=D64#5p*1zMKKyuT=!(+i_Ra7Q~25~(Ci-tx0NV!N0<~O$Z zuyR8Ct8MR6zF35FGfPnyp`-m^mA!bP^8Lg zxE!X|QW4#;QCh%MIuvpIZe)gbw>pi+Vj5T&wRCMdsyDm5EH3eA8*J@de>5I& z!)9mzjwvu1QeG}=zCv%HMGU1oXx8*|0(K%&A&vHkwRh%Rd#d{SM7eK(+`+a@)|9%1 zb$WJjkb{M_&3w61*{@;SoBpv<%jfzdDhohKj%B4Y-s&~eII00|wCSx~F3VdHN+F9! zO-aeqvpGBXAwvrM`uZx05;nO?2#buvPP;dD!ihg`H<(4snS2V!hl{nA@L$%X5Haxz zGjwXW*0=T7{`TxAopYl;>H-tx{UPR~TiyP43Ns{RgXt8s#W#;mJ#snKp=-JM3sw3e z3h%y89_Nd{TQz$<1*0P-&syD16yrs2r-%yf2--KIRQ~hZ+kFu(e-s;R78uyo5aYt6 ztN(H$dt$}Pa`t6ID~h$GnuCTli(8Tx2+LX&Ty2fiKKVB`4hd)Ho>}1~w4bfDX~-o* z<$p5M0&ac=gVxU?rSR`;eu~Qzf**i%iy`DMwh*3+Qek&k=i?SHU9L6??gtYI`pU+U zQ|i`wBK&o%+1S=#G+1kKJ9wPhfiE;i0;^Z)XNiNRi+mf8Rz~a7ZzhLdKy%G?xYC?5 z*5yCJbZK?A0LI9Rpd*kbLBNW~7{5tN1rWq0`(H+bc2RC%K!&OJl~{xOV{psel~;OjuXaOA`D&GzW9m}R63f$X2s$*tSX$e;@D)RQlbXd9CC=yK`(PH z6!7LV>5pQQ#_A5Vtuv>aqY{~u$0ZydXzMH-`t5H87+q?bZ#Vh5nSu@iG~ZT)xmk-R zgo=m?_^9-(=SsyC2N0wzRC|MV`lD6KN(VK>>^C|q4tA={L%@TBgQrV%wE0Y;IqQD2 zs$b#^`_{&?7DV7sjda3M3GdU-*-bCe!l6)@N{SKFGPAO9MRA$NAREyXa-RmF2Ca)Z zdcs7-aK?@%XDkDfUZ|Q$@p~Ii*BkKNkcm0k75@q^;?{`pm;~g?pYh;fRp_=TPYf80 z!K-D8_I9gxyR^7tiXW1{F05u+<#cUV3nZ}DRI7_@lCf&tf(0>B%W zKp|19<$7w0*_(rjf7{aOIV$N^h_PwJnpbWg!BfPN2viWr;qQhtu6cpq% zM3{I;>$PUg1?irGW?>j9uM&$yx8*zLnw3oW7}wa~-UWjev8(KKn)GUH`)UdX20v58 zHhb^UfFQ`fNFSQ~jsQ-h_&{84jyT|TYKmgZ;>tYNSL9hNn^Ce?h9?DDEE2Qmd+M9? z+}j6s{~`8 z1UROcs9-@HvYtJ2k(EYBD4ZBhra}7Q4YprvRU-+2l%vcg9vY5Nu$e30o1F#euX#H^ zsii;FZnCmX+KdeklXi)mX*XnWvy0?7e`K+V_?eHS$T7ekgCc(aCXH2nh=XRdh{@z{ zeaH>rao=4WYtF#jnsqX==uwBMz+-n#;@b@_7Pw@M62ASN;B$A{a2sAUtD~x&KQWV6 z0{D~FwbjV4^zy|2PJ(znPGxgx`1o|6exStB)dBYK<>5Tw_3)~$WP+*=)P$>7iChP# z%N1bsSiPmia&n%e5hDkSXjZSEDDW0gQ9k{hqeRAl-)vl@5~1FH?s@XBh{ATjhjHmd zi9&WZuaEs;F6s57&D|F8^-AVipUhVbn|Op!#wrm-^)-iST*I8Ex+o?d3>DD&C+8&s zymOjC;pfQjxAuk4lazL&hs-#N+t0q&wnN(#T&xWOD@`^zLUWB3E2dS8)Z=GU1rq5x z5K&M(27CcuaM1qn``n8LRN5lqbri~3nl_^4D@-tFb5V}mwHQAk-c596t?*JRx&aDh zZT%6S?YA3~?NBom&yEYF+@Ic>p%E4~X{n6KL0bg!8Jjufhd8X8XVnZm2BnAO(?20q zrl11!(sVW_^fpHjx6A%&mqS28r!e%O6WKm2HF5#%Pwf~}%Mc8;Qbi+xIA32-v*lQK zhuD?dCAiXuy+>t!{yQr)2;k-)uz9QQq-guIo{yWPRnl;cRbmDzoo8iwZSGKN*RO;E zhqE;pUr>#c|3S16`(tCwpK1ufjm~>?GLn&lxkO6YzkSi{k4N_Ha8(g7MqO@ds-qke zbJk;eJh9F&dWK%y*vx=E-teJ*6Vt{GLKaA_OQO;@UYs3Q9)n3ti4jH-=JLw4Z*iX zx=^JvK~1X6pASXOh3l-0fl42uO-3hDUS~O#|4XydwgvFei)IZX97%_Y-2h`XSSVLw zwMi+b!lbPkF(2?>ZSBbNlNv|>`165dG(?n0#3}du%)&xygyOZDewkVYfP11x8`E%U z4Ay-mD@|yF-2fHfvOD-Up@>8YshDU6{qWYxrp?KuC(#jN-}!a%ilI_(uyUo*e&uhA zNLwRt<5-Fn60ewlE|f}SF&kFh zE&FEc*cyh6=YR3g5gtC!l-Q})?&-AN?lp&iLR0qQwg#YndO^FRg(_kq0hj&JI`c8( zOlp@7dFjEPiyi3#)jdP0X_>Ts%HDVLkw?Hk7k2L+OB z0n#56QsFe4b2}lO+Aj!fF5;Dk#XGTSW{3>vFr80ig9JkFu~5Nx!6~E0s~d zw$e=mf6$J|I(jhnw9Wm9CcUqvLcgQc6*O(Tva^}Fl_f2*y z^J8Pt$awDiySu$%-oEPzqF&y|&NR!Dq$2TkKZ0R_FyQkgDh`(+2`~3WrCuA8?oqJM zZT3k8wk&@xg(2GN9k7&Q`3Ym0R$Ic$JLq@i`8&J1lDiahgbJ6Rb-#a#K=f-(!9U_kjoB)h?R_d<> zx+!=t{59YkfLH{$AdV*U{sE|pO?B&Sk>uF-<*Z3A!#az}ASskIg6Q>e@3cA-3xV5L)x#taJNwQBi2J zk#6DTdTWvMisFcA_r+?XC=+t^np%KHB&{Rn4hIwomJB=zi+gHvA^kA%^)$M#Hg)~K zZya7tGj_EfS?%xNzwrI_c@g~eOLgW=_H%gP{n4p6XBjyxqERX}v;s}6Wn3o1KwFs| zp~nK$c;)kNKWX@?|L>w;N*_tZIG4tzKf12Mpfsr*Fci7`OUwIkzO+*4gn?OhpHk0Z zx6BliLetx~a_B#0=vYErFmi!D^r=SrU;8JL$)!4r-^8tX$h#b<4dM}BXY^`MrwYQ+ z$WSJ0LdeKo;2!^>wO|<6ThD=o-k|`cQxaQOS9dA>5B&HG`R=j3Z_RG8IfyAmFu?yh zCO0>?)9*RK-t}ZY`n6iC&U~g=zCb4$j~$y{+tk5f;^3 zS={W89sP6f@V;9lxg(iM9q=#3C*IluCWHVW=!cVO>%y-nqjH$ct}*GNLgGY&`KeN~ z=}d==Hx=mri0_N$&6ng;5lp1W={UB_q|)7eOc^{dwxxVXy88j7zgg)7+mGSRh&mbe zTZaTz-k&L4JUp_VZ%LuKLg;d1@-UjT#q*7FI^v3vHl(w7@#&Zq)FL&cyi1CBgrZ-= zveNMT5K*Gpk;HwX7z_l0+CLxFiwtqG-H$Xn^E4Q;_$PG3hkW+>6_QU&)#9U5!r)G` zS&>eO)5oOEHp71x>{QBvQM%mV^0n<2$>>tiHrRm4GgXk-ZZgM390r zjVlx`NUBGO9>s=|NFU{ro_XI#V=rNKvunglHaaUg`n`1vOd1gU<&2T)0U}nZ%=vn`btXf}onk z=arx<^AzQ;#bS|%_PZT@2*I&EEE+w<+qdX-QR6rP{=*rjwX4F`w1ivvuD)vg#OGXNv)S0~?A zP%QtQv3QGmiYgi^7Kpb7j1}WP{7=-qTxFlgwg2k)A|sr8m>3Z;oQ#`TU;7ZL=J}uWBOrV$M&s7;1{7>gv&y`aE zIu~n`IQQrl*9sE2TG4-^m-4t>CnZ#ULy-tes|p>p z%<3p=ZTWHwLTXS}&nSsrW|ukLsR(;pE#FQ`t`~(^;6FWmx8l$hA7S~78=A=isE4^S zHHU>_z1Va9R*w^TbIl5C_7>KpVs7%#K!hZQ#H7m+qV=CciIgLIzQ{Vhs)r-O*AAk) z^!T@sEKpUag^MK&rXt)-Y9!LtfLfa7YVtT=DxjpXo~y-b!H2qx54CBvjL%0U;zI*Y zA-|=qWyO^3;M3mI+Gv+V6VZRG%5wCz&flyR4-Wgq#ReM! z*pjHNylD-On7sjniAuq^1A>cUzBTgJpv$#$969Q4f?Sw99(#d%l`Ar%M2WT zI=74YI03grG=Z2FYry&|KvX}$q3nv{&Xgq4Lkp2h7bTKX%7K2>rf#Q(>Vu3acp`si z^vqJL+^t%cdcQq4fDY6LjsM0`*NOeqflaN3_6=(BB^6>VsLEBUi(fucjkIgQ7g3rO>qQ<1ZQnTh;K<6tEDgaTx)ur4g zf#>}Uhh3BgOl1m-(~YXGeE}_2!#)Wy@p$4tJZ%L91C!^mOsq`XoXb@YKw ziPcPTp7$zACi8VqD3X&a&e)^VPJANwzntEv^$zbUWPP0ycS3c0MMX5o-|C&ZUMRh2 z78BWWt9=F2;ith|Ij4ieL9%hly}rpUAI=x4lPY<=l5Au&=^SS108x0&&i`h)6F0PR ze2&eoIt5$?x8=Q@^lBeZ69Jkn$DeRQ4TVmX?294Gv*1qd9IvSqp{PwP~#+n$VpfE@*fEW``c?%6E+;Ape3~5{};z#&511u0Q!e+k9fiO-_ zPY3OnCdLVtT&hcq{)M4;j3m=ba0fXI0zD0$>hRZm%`a;Ud2s_<1V}T-Dmo~zAhiN@ z-BX_rc;b&n(;@V6$#)j-SxZ&6>JOm-^q7HILX7~VU!W{Lr-Z{1l4Is6ZcuP`@?&vP zg!}0sb01tjbr=rLN2XhYOE4HfDsD%sp~&TrPjv^5zd2$Fc=C%QL=NMw56WGd+3q;x zZc=7VdL9w}Yy!20y_V$Z*|lm2{bc@O@!B(eRW`q6*Sj+Yi0CbI9xe|l1&y zudyY?5nMl!*{m0T{h0k{eCsXnZY^Hw{jy(iZQ~RFsV>yl%oPIiWTAp`;NMnl5*KcK zl$p=%r4q85q%4=zZw9*XNfP>{bvh8*#n<-lf6{0$;M)6SMn2jhCo#SdLH^fJP*QPw zDV7&IJ}Cc`pSm?OAFU`>@H1Xp)A?2opVMkrv9#wn{!=4^Uc0FzR`>p{(*SW0SOIF= z7-$IrRY=#wxfkFAv1l$QGAvBuIg%O%_a}Bik=wM$m1@t;-Dg-R}*&)=lwsYz#mA*LqRs#}<*%~kqkBEa1QRE%@#xm27xIMel3TbF) zBDQmaaeI6!n~chP)YCcarO{;*@Gx=eZI4)-H{wi4@xWYhaWAOF5p$nsC$zp^y4P$N zA49(e1O`ByBsa~0Rmp5v3#I*^NobZkY?}T*Rk!Tri7|yo#0;A;4Fviah1gHWWmN!2 zU1_jM6*TY(g89RS zXS1_XUd6>mKt`1!4mA2m2nx8}wv(0#UGQ4!&2FK-8g>u}cybwZ`qt{dF9|IaNvHIL zQvJ}YgaoURE0)1q2Q0s;%$IA;6vd@1r@d)7?&7U9*6 zVFMPw!)v`WW~vDw>U}`7GK6ZXnhH~j;|R}2q-g#Xf#*MS*|gz5L%XIalSva(rCO8l z>u0DwS3pohxA#=0CL}v{B|1i7*e04vW$fD{@@M&O_hr|Fl#wC-eE?VdYdEx-G!z#L zVRQ8~{D9o^dQ>$B+Irs68J53Q#0pXxhb+nR(F8T44pMKaZ8hk`Nmhvw(-_NOf6&{Md5q_S5)~6y`jF3JX;2^2c5Wt61}RhA zR4Sy4sZKGGp-baxYuT$JU_uWBvlXO}o_t9th1)US(R3oG78QV8ISsm?h)hkQ zEm7$$F_tlhlS;ae$W$OY5}UIV^cU9ewA}iJz$(6%)F(ZX%DJ)N)+sIs+_P#`>TB!c z`uDWrY4kRYlaq@7KdsJ(frA@4gwhg7H<#{W`2g&7O|9e1BXq-sI*HTy>XOUZN<&GP z66MX0AK$}DKf!$t`ONApT}`^-;xx~%)SZ+WM)Om+A!6`ZJca^S_2@X4n|F);`0M>}uJ?Z}266c`Rtfnrtuctii401{ zEzGY~+2lqkk0lT=HE~OdJaHGwTPN9cDL=#GwNZ9or?*BhNGYqa#9(DeHm(8xGG-aV z5u6k7tW~8lqMZQBhk=E)9=ArURh9UR|JQd@d_Qbz^JMB*EnHYWSpkR@7^}^4m6%;B z>K+M1jAUPw*4S$Pem-37G6-nMM2y3>bf*#W#Ma7~zlybE#+k>IB)eO#Zw3k|%e7`B zR4i;IoY1Xx4K-`eH|lrFX3Ib_mTkgM4FP+L&t%z6GFf5M)Dw!BxCRc!&CA&RvzT%C zGx|WxBhe+kDnb>c8(J8tS_jOsmo65Dn-HVsrL($=<(84jLc^GEyW63Wg+I%Q#!8?F z`hiN17Iw<+4_S*_%bgE}68%+T_&(XVd60rnoRR-!OLl~4d2V)al>G4>LM2*$h=gVTOI{xS~sRX7WR!K?rxH*3`ywT4O9)G$9yeW1s4O$#?R7l#lzvkg5c#If#bG(Eav@ zXDf3vkKi_aqzFTymH0e_NNjZUoDI`&`X|+?^-jN&)6?>Jab!{A$$;*%)T$&cBPt-X zcC2NswUC0vj@jv}j^9P1Cb)1U;yViN49QG2rKbla2Q<7!2Ht-8c z6beuXwL12?JTk|be_REj z<3}k|u%k(1$|Ss-L&T#$)tZfoD^5lAD?Xa4s8gsenbnbD@4tOxB*IFq%!^n6>N=x} zYBj=rfVDVkNGVTI23tC;w;!#7>cm+f^P4Q!e?Epw!rOGnH0^U9WkB8CD0&9Wf76 zWvhS~IPtq|`qP^1Ci_2|?U3Jcc$`|zhNR=tN|4gb-Vgk(<_AE}cdB4IEgpF-HB6?l z%Akv3B25K#aOFQpn@FlQ$ZEYyWm+&8j6QDZnG%jlT)XLN(27qBd4=e4zB*+?14Hjt zn&08|5=L!RNS+c$0ciBdj0CNtS*Mfnq#>0{A1>_0bS8T!5@{G%=zN%lT208vH*6Eg zF!9MYi=HfQQO}s48iD3o*QXZvG87a2D6_UeG7}Y=An@jcs*tgC zE1?lw0gEZn1>UJ&LACJ}USx^y3T@6$h|b`V@2s0qNoTz#cb4Uab}NlX zZt>n{!HQx&*SiQ(6~7oXpfWfeXaZf6E8Lhfw^2+FZB~wn>f&l^>76M9% z&*@EZAp_)pB@##64iG1Aq`v zEP`6Q`)o6koCP<`vK$&p^BU+!vD}<+-!D{Y5Qi5>1;RMene;%O!^8bYbZRXYzY+dw zAqoyx1^)R^%G%!5H@*%CN8#>?J@0pyb_T>5$d2}WA91QG{jt9{eEp4Xqbm3Tbj0Im ztbpAT&TejIEx)l(&rW~eb0I6G;aT2v2YoVylU*q#g7FRc*)twOZI686@xJPHJsOSA z;T?15YJD6s6*pqLUhnnVd=*mms~VnyQRq&{zpesTi^LhdX_EKLl%hOM&)dtx!^sR| zV)XgbS7%HFJD^48KTcfi=Loh8c)bdbZBhWV^dEGW0wt_DkY2d9HBeUs8fmTOcX;SQ z$8+F=!E6zp!PjWvR11s2Y91=mn(tkUHGXhIL@`c}lUqQIxqv8cU?0N=*qlO0Ku|vZ zV?0OD09^Qf&Z~mPeCr&O(`1-N@u# z|0mjgGw>8?qTTm$Ru&dz!GEZ$0z_)lKx6J;d)pY*=&CjD8oQbvu@>4AtT|4JkBGwjJQbn8nlR#1OVyWW*sNT#f?3*+wh$Poz zP|9yUOJ%aPRzoXmz0hC(t1{+6#tB%&JCbthi?F~+?w6Z?(^xI$s|<2_^$NHOgkI{e_l6ZRc+P-bGvq;N z;)L{H1E{;O>2+tD^Ue*Pr`QJYLOZfLOq?WuR6K*jj^*ZGeeA|Gf!Z`xpZ#j{54-<1 zCeh&E6o1!(jdm^p%t;}BfjF?q!Bukvn;zJCFetI>kX|rr_zF;pqt%w1Bx)5&FJQ$k zOC_UkV3SU6t*Hl4AU}{D0HGJV?PRreGB{tip%T&*o;KY)licP6=uiPMZJkDyet|@+ zfd45Mk!C<={qj4ks?~D9`%Mnu?|{iMwy@CT*LDw7HT8JgjJ*)y5PV-@=!y$uBvMfr s7IBkQzFw@h%v@*m&4|8S1bm>L>TJ4-AZ~sIHkCn0iOGvr3LF0Xe?(`o00000 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/more_option_sub.png b/org.tizen.ui.practices/html/images/more_option_sub.png new file mode 100644 index 0000000000000000000000000000000000000000..ea191dbb6e4cd967732084a5ddafedc9cca807df GIT binary patch literal 14348 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/moving1.png b/org.tizen.ui.practices/html/images/moving1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/moving1.png rename to org.tizen.ui.practices/html/images/moving1.png diff --git a/org.tizen.ui.guides/html/images/moving2.png b/org.tizen.ui.practices/html/images/moving2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/moving2.png rename to org.tizen.ui.practices/html/images/moving2.png diff --git a/org.tizen.ui.guides/html/images/multi_button_default.png b/org.tizen.ui.practices/html/images/multi_button_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/multi_button_default.png rename to org.tizen.ui.practices/html/images/multi_button_default.png diff --git a/org.tizen.ui.guides/html/images/multi_node_selection.png b/org.tizen.ui.practices/html/images/multi_node_selection.png similarity index 100% rename from org.tizen.ui.guides/html/images/multi_node_selection.png rename to org.tizen.ui.practices/html/images/multi_node_selection.png diff --git a/org.tizen.ui.guides/html/images/multi_threading.png b/org.tizen.ui.practices/html/images/multi_threading.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/multi_threading.png rename to org.tizen.ui.practices/html/images/multi_threading.png diff --git a/org.tizen.ui.guides/html/images/multi_threading2.png b/org.tizen.ui.practices/html/images/multi_threading2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/multi_threading2.png rename to org.tizen.ui.practices/html/images/multi_threading2.png diff --git a/org.tizen.ui.guides/html/images/multiple_layout_example.png b/org.tizen.ui.practices/html/images/multiple_layout_example.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/multiple_layout_example.png rename to org.tizen.ui.practices/html/images/multiple_layout_example.png diff --git a/org.tizen.ui.guides/html/images/multipoint_touch.png b/org.tizen.ui.practices/html/images/multipoint_touch.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/multipoint_touch.png rename to org.tizen.ui.practices/html/images/multipoint_touch.png diff --git a/org.tizen.ui.practices/html/images/mw_division.png b/org.tizen.ui.practices/html/images/mw_division.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a86554c0f51d87d18159b353881fc6e8d010e9 GIT binary patch literal 163486 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≈mQ6Zfoi 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/mw_icon.png b/org.tizen.ui.practices/html/images/mw_icon.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/mw_icon.png rename to org.tizen.ui.practices/html/images/mw_icon.png diff --git a/org.tizen.ui.guides/html/images/mw_icon_optional.png b/org.tizen.ui.practices/html/images/mw_icon_optional.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/mw_icon_optional.png rename to org.tizen.ui.practices/html/images/mw_icon_optional.png diff --git a/org.tizen.ui.practices/html/images/n_division.png b/org.tizen.ui.practices/html/images/n_division.png new file mode 100644 index 0000000000000000000000000000000000000000..5a0b8f6607b9adf76556fa07e07addd91d1c916f GIT binary patch literal 163502 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/network.png b/org.tizen.ui.practices/html/images/network.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/network.png rename to org.tizen.ui.practices/html/images/network.png diff --git a/org.tizen.ui.guides/html/images/network2.png b/org.tizen.ui.practices/html/images/network2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/network2.png rename to org.tizen.ui.practices/html/images/network2.png diff --git a/org.tizen.ui.guides/html/images/network3.png b/org.tizen.ui.practices/html/images/network3.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/network3.png rename to org.tizen.ui.practices/html/images/network3.png diff --git a/org.tizen.ui.guides/html/images/network_speed_sprite.png b/org.tizen.ui.practices/html/images/network_speed_sprite.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/network_speed_sprite.png rename to org.tizen.ui.practices/html/images/network_speed_sprite.png diff --git a/org.tizen.ui.guides/html/images/nine_patch_dali.9.png b/org.tizen.ui.practices/html/images/nine_patch_dali.9.png similarity index 100% rename from org.tizen.ui.guides/html/images/nine_patch_dali.9.png rename to org.tizen.ui.practices/html/images/nine_patch_dali.9.png diff --git a/org.tizen.ui.guides/html/images/nine_patch_expanded.png b/org.tizen.ui.practices/html/images/nine_patch_expanded.png similarity index 100% rename from org.tizen.ui.guides/html/images/nine_patch_expanded.png rename to org.tizen.ui.practices/html/images/nine_patch_expanded.png diff --git a/org.tizen.ui.guides/html/images/nine_patch_explained.png b/org.tizen.ui.practices/html/images/nine_patch_explained.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/nine_patch_explained.png rename to org.tizen.ui.practices/html/images/nine_patch_explained.png diff --git a/org.tizen.ui.guides/html/images/notify_tree.png b/org.tizen.ui.practices/html/images/notify_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/notify_tree.png rename to org.tizen.ui.practices/html/images/notify_tree.png diff --git a/org.tizen.ui.guides/html/images/object_size_16.png b/org.tizen.ui.practices/html/images/object_size_16.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/object_size_16.png rename to org.tizen.ui.practices/html/images/object_size_16.png diff --git a/org.tizen.ui.guides/html/images/object_size_22.png b/org.tizen.ui.practices/html/images/object_size_22.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/object_size_22.png rename to org.tizen.ui.practices/html/images/object_size_22.png diff --git a/org.tizen.ui.guides/html/images/object_size_44.png b/org.tizen.ui.practices/html/images/object_size_44.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/object_size_44.png rename to org.tizen.ui.practices/html/images/object_size_44.png diff --git a/org.tizen.ui.guides/html/images/padding-hints.png b/org.tizen.ui.practices/html/images/padding-hints.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/padding-hints.png rename to org.tizen.ui.practices/html/images/padding-hints.png diff --git a/org.tizen.ui.guides/html/images/pane_tuto.png b/org.tizen.ui.practices/html/images/pane_tuto.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/pane_tuto.png rename to org.tizen.ui.practices/html/images/pane_tuto.png diff --git a/org.tizen.ui.guides/html/images/panel_default.png b/org.tizen.ui.practices/html/images/panel_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/panel_default.png rename to org.tizen.ui.practices/html/images/panel_default.png diff --git a/org.tizen.ui.guides/html/images/panel_tree.png b/org.tizen.ui.practices/html/images/panel_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/panel_tree.png rename to org.tizen.ui.practices/html/images/panel_tree.png diff --git a/org.tizen.ui.guides/html/images/panes.png b/org.tizen.ui.practices/html/images/panes.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/panes.png rename to org.tizen.ui.practices/html/images/panes.png diff --git a/org.tizen.ui.guides/html/images/parent_origin.png b/org.tizen.ui.practices/html/images/parent_origin.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/parent_origin.png rename to org.tizen.ui.practices/html/images/parent_origin.png diff --git a/org.tizen.ui.guides/html/images/path_animation.png b/org.tizen.ui.practices/html/images/path_animation.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/path_animation.png rename to org.tizen.ui.practices/html/images/path_animation.png diff --git a/org.tizen.ui.guides/html/images/perspective_buttons.png b/org.tizen.ui.practices/html/images/perspective_buttons.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/perspective_buttons.png rename to org.tizen.ui.practices/html/images/perspective_buttons.png diff --git a/org.tizen.ui.guides/html/images/perspective_screen.png b/org.tizen.ui.practices/html/images/perspective_screen.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/perspective_screen.png rename to org.tizen.ui.practices/html/images/perspective_screen.png diff --git a/org.tizen.ui.guides/html/images/perspective_swallow.png b/org.tizen.ui.practices/html/images/perspective_swallow.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/perspective_swallow.png rename to org.tizen.ui.practices/html/images/perspective_swallow.png diff --git a/org.tizen.ui.guides/html/images/photo_tree.png b/org.tizen.ui.practices/html/images/photo_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/photo_tree.png rename to org.tizen.ui.practices/html/images/photo_tree.png diff --git a/org.tizen.ui.guides/html/images/photocam_tree.png b/org.tizen.ui.practices/html/images/photocam_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/photocam_tree.png rename to org.tizen.ui.practices/html/images/photocam_tree.png diff --git a/org.tizen.ui.guides/html/images/plug_tree.png b/org.tizen.ui.practices/html/images/plug_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/plug_tree.png rename to org.tizen.ui.practices/html/images/plug_tree.png diff --git a/org.tizen.ui.guides/html/images/popup.png b/org.tizen.ui.practices/html/images/popup.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup.png rename to org.tizen.ui.practices/html/images/popup.png diff --git a/org.tizen.ui.guides/html/images/popup_circle_o_wn.png b/org.tizen.ui.practices/html/images/popup_circle_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_circle_o_wn.png rename to org.tizen.ui.practices/html/images/popup_circle_o_wn.png diff --git a/org.tizen.ui.guides/html/images/popup_default.png b/org.tizen.ui.practices/html/images/popup_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_default.png rename to org.tizen.ui.practices/html/images/popup_default.png diff --git a/org.tizen.ui.guides/html/images/popup_default_wn.png b/org.tizen.ui.practices/html/images/popup_default_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_default_wn.png rename to org.tizen.ui.practices/html/images/popup_default_wn.png diff --git a/org.tizen.ui.guides/html/images/popup_toast.png b/org.tizen.ui.practices/html/images/popup_toast.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_toast.png rename to org.tizen.ui.practices/html/images/popup_toast.png diff --git a/org.tizen.ui.guides/html/images/popup_toast_o_wn.png b/org.tizen.ui.practices/html/images/popup_toast_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_toast_o_wn.png rename to org.tizen.ui.practices/html/images/popup_toast_o_wn.png diff --git a/org.tizen.ui.guides/html/images/popup_toast_wn.png b/org.tizen.ui.practices/html/images/popup_toast_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_toast_wn.png rename to org.tizen.ui.practices/html/images/popup_toast_wn.png diff --git a/org.tizen.ui.guides/html/images/popup_tree.png b/org.tizen.ui.practices/html/images/popup_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_tree.png rename to org.tizen.ui.practices/html/images/popup_tree.png diff --git a/org.tizen.ui.guides/html/images/popup_wn.png b/org.tizen.ui.practices/html/images/popup_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/popup_wn.png rename to org.tizen.ui.practices/html/images/popup_wn.png diff --git a/org.tizen.ui.guides/html/images/pos_map_all.png b/org.tizen.ui.practices/html/images/pos_map_all.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/pos_map_all.png rename to org.tizen.ui.practices/html/images/pos_map_all.png diff --git a/org.tizen.ui.guides/html/images/progressbar.png b/org.tizen.ui.practices/html/images/progressbar.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar.png rename to org.tizen.ui.practices/html/images/progressbar.png diff --git a/org.tizen.ui.guides/html/images/progressbar_default.png b/org.tizen.ui.practices/html/images/progressbar_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_default.png rename to org.tizen.ui.practices/html/images/progressbar_default.png diff --git a/org.tizen.ui.guides/html/images/progressbar_default_wn.png b/org.tizen.ui.practices/html/images/progressbar_default_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_default_wn.png rename to org.tizen.ui.practices/html/images/progressbar_default_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_group_wn.png b/org.tizen.ui.practices/html/images/progressbar_group_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_group_wn.png rename to org.tizen.ui.practices/html/images/progressbar_group_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_pending_wn.png b/org.tizen.ui.practices/html/images/progressbar_pending_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_pending_wn.png rename to org.tizen.ui.practices/html/images/progressbar_pending_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_process_o_wn.png b/org.tizen.ui.practices/html/images/progressbar_process_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_process_o_wn.png rename to org.tizen.ui.practices/html/images/progressbar_process_o_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_process_wn.png b/org.tizen.ui.practices/html/images/progressbar_process_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_process_wn.png rename to org.tizen.ui.practices/html/images/progressbar_process_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_small_o_wn.png b/org.tizen.ui.practices/html/images/progressbar_small_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_small_o_wn.png rename to org.tizen.ui.practices/html/images/progressbar_small_o_wn.png diff --git a/org.tizen.ui.guides/html/images/progressbar_tree.png b/org.tizen.ui.practices/html/images/progressbar_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_tree.png rename to org.tizen.ui.practices/html/images/progressbar_tree.png diff --git a/org.tizen.ui.guides/html/images/progressbar_wheel.png b/org.tizen.ui.practices/html/images/progressbar_wheel.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_wheel.png rename to org.tizen.ui.practices/html/images/progressbar_wheel.png diff --git a/org.tizen.ui.guides/html/images/progressbar_wn.png b/org.tizen.ui.practices/html/images/progressbar_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/progressbar_wn.png rename to org.tizen.ui.practices/html/images/progressbar_wn.png diff --git a/org.tizen.ui.guides/html/images/pseudo_elements_selector_range.png b/org.tizen.ui.practices/html/images/pseudo_elements_selector_range.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/pseudo_elements_selector_range.png rename to org.tizen.ui.practices/html/images/pseudo_elements_selector_range.png diff --git a/org.tizen.ui.guides/html/images/pseudo_elements_selector_required.png b/org.tizen.ui.practices/html/images/pseudo_elements_selector_required.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/pseudo_elements_selector_required.png rename to org.tizen.ui.practices/html/images/pseudo_elements_selector_required.png diff --git a/org.tizen.ui.guides/html/images/push_button.png b/org.tizen.ui.practices/html/images/push_button.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/push_button.png rename to org.tizen.ui.practices/html/images/push_button.png diff --git a/org.tizen.ui.guides/html/images/radio.png b/org.tizen.ui.practices/html/images/radio.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio.png rename to org.tizen.ui.practices/html/images/radio.png diff --git a/org.tizen.ui.guides/html/images/radio_button.png b/org.tizen.ui.practices/html/images/radio_button.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_button.png rename to org.tizen.ui.practices/html/images/radio_button.png diff --git a/org.tizen.ui.guides/html/images/radio_default.png b/org.tizen.ui.practices/html/images/radio_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_default.png rename to org.tizen.ui.practices/html/images/radio_default.png diff --git a/org.tizen.ui.guides/html/images/radio_default_o_wn.png b/org.tizen.ui.practices/html/images/radio_default_o_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_default_o_wn.png rename to org.tizen.ui.practices/html/images/radio_default_o_wn.png diff --git a/org.tizen.ui.guides/html/images/radio_default_wn.png b/org.tizen.ui.practices/html/images/radio_default_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_default_wn.png rename to org.tizen.ui.practices/html/images/radio_default_wn.png diff --git a/org.tizen.ui.guides/html/images/radio_state_changes.png b/org.tizen.ui.practices/html/images/radio_state_changes.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_state_changes.png rename to org.tizen.ui.practices/html/images/radio_state_changes.png diff --git a/org.tizen.ui.guides/html/images/radio_tree.png b/org.tizen.ui.practices/html/images/radio_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_tree.png rename to org.tizen.ui.practices/html/images/radio_tree.png diff --git a/org.tizen.ui.guides/html/images/radio_wn.png b/org.tizen.ui.practices/html/images/radio_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/radio_wn.png rename to org.tizen.ui.practices/html/images/radio_wn.png diff --git a/org.tizen.ui.guides/html/images/rectangular_footer.png b/org.tizen.ui.practices/html/images/rectangular_footer.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_footer.png rename to org.tizen.ui.practices/html/images/rectangular_footer.png diff --git a/org.tizen.ui.guides/html/images/rectangular_header.png b/org.tizen.ui.practices/html/images/rectangular_header.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_header.png rename to org.tizen.ui.practices/html/images/rectangular_header.png diff --git a/org.tizen.ui.guides/html/images/rectangular_index.png b/org.tizen.ui.practices/html/images/rectangular_index.png similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_index.png rename to org.tizen.ui.practices/html/images/rectangular_index.png diff --git a/org.tizen.ui.guides/html/images/rectangular_list.png b/org.tizen.ui.practices/html/images/rectangular_list.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_list.png rename to org.tizen.ui.practices/html/images/rectangular_list.png diff --git a/org.tizen.ui.guides/html/images/rectangular_moreoption.png b/org.tizen.ui.practices/html/images/rectangular_moreoption.png similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_moreoption.png rename to org.tizen.ui.practices/html/images/rectangular_moreoption.png diff --git a/org.tizen.ui.guides/html/images/rectangular_multibtn.png b/org.tizen.ui.practices/html/images/rectangular_multibtn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_multibtn.png rename to org.tizen.ui.practices/html/images/rectangular_multibtn.png diff --git a/org.tizen.ui.guides/html/images/rectangular_popup_bottom.png b/org.tizen.ui.practices/html/images/rectangular_popup_bottom.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_popup_bottom.png rename to org.tizen.ui.practices/html/images/rectangular_popup_bottom.png diff --git a/org.tizen.ui.guides/html/images/rectangular_popup_side.png b/org.tizen.ui.practices/html/images/rectangular_popup_side.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_popup_side.png rename to org.tizen.ui.practices/html/images/rectangular_popup_side.png diff --git a/org.tizen.ui.guides/html/images/rectangular_processing.png b/org.tizen.ui.practices/html/images/rectangular_processing.png similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_processing.png rename to org.tizen.ui.practices/html/images/rectangular_processing.png diff --git a/org.tizen.ui.guides/html/images/rectangular_progress.png b/org.tizen.ui.practices/html/images/rectangular_progress.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_progress.png rename to org.tizen.ui.practices/html/images/rectangular_progress.png diff --git a/org.tizen.ui.guides/html/images/rectangular_thumbnail.png b/org.tizen.ui.practices/html/images/rectangular_thumbnail.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rectangular_thumbnail.png rename to org.tizen.ui.practices/html/images/rectangular_thumbnail.png diff --git a/org.tizen.ui.guides/html/images/redrawing01.png b/org.tizen.ui.practices/html/images/redrawing01.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/redrawing01.png rename to org.tizen.ui.practices/html/images/redrawing01.png diff --git a/org.tizen.ui.guides/html/images/redrawing02.png b/org.tizen.ui.practices/html/images/redrawing02.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/redrawing02.png rename to org.tizen.ui.practices/html/images/redrawing02.png diff --git a/org.tizen.ui.guides/html/images/redrawing03.png b/org.tizen.ui.practices/html/images/redrawing03.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/redrawing03.png rename to org.tizen.ui.practices/html/images/redrawing03.png diff --git a/org.tizen.ui.guides/html/images/redrawing04.png b/org.tizen.ui.practices/html/images/redrawing04.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/redrawing04.png rename to org.tizen.ui.practices/html/images/redrawing04.png diff --git a/org.tizen.ui.guides/html/images/redrawing05.png b/org.tizen.ui.practices/html/images/redrawing05.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/redrawing05.png rename to org.tizen.ui.practices/html/images/redrawing05.png diff --git a/org.tizen.ui.guides/html/images/rel1_rel2_offsets.png b/org.tizen.ui.practices/html/images/rel1_rel2_offsets.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rel1_rel2_offsets.png rename to org.tizen.ui.practices/html/images/rel1_rel2_offsets.png diff --git a/org.tizen.ui.guides/html/images/rel1_rel2_offsets_and_relative.png b/org.tizen.ui.practices/html/images/rel1_rel2_offsets_and_relative.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rel1_rel2_offsets_and_relative.png rename to org.tizen.ui.practices/html/images/rel1_rel2_offsets_and_relative.png diff --git a/org.tizen.ui.guides/html/images/removing_padding.png b/org.tizen.ui.practices/html/images/removing_padding.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/removing_padding.png rename to org.tizen.ui.practices/html/images/removing_padding.png diff --git a/org.tizen.ui.guides/html/images/rendering1.png b/org.tizen.ui.practices/html/images/rendering1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rendering1.png rename to org.tizen.ui.practices/html/images/rendering1.png diff --git a/org.tizen.ui.guides/html/images/retained_mode.png b/org.tizen.ui.practices/html/images/retained_mode.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/retained_mode.png rename to org.tizen.ui.practices/html/images/retained_mode.png diff --git a/org.tizen.ui.guides/html/images/rotary_event.png b/org.tizen.ui.practices/html/images/rotary_event.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/rotary_event.png rename to org.tizen.ui.practices/html/images/rotary_event.png diff --git a/org.tizen.ui.practices/html/images/rotary_selector.png b/org.tizen.ui.practices/html/images/rotary_selector.png new file mode 100644 index 0000000000000000000000000000000000000000..23d7a6c3b186764353c92c16cfb7e46e56ca9644 GIT binary patch literal 30917 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/rotary_selector_item.png b/org.tizen.ui.practices/html/images/rotary_selector_item.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb84cb738f7d7d72705f6f12b0ce54f9d963c7f GIT binary patch literal 14948 zcmW+-1yCF78iis7ic_GtySuwXaf-V;1&Tw8TXA=HDaGC0-HU5+w-Dammzj{+Fv(6< z&UfsOP*IXWLBdCZf`USkla*8hUX%ZOe*6IZ-Rxn(174tA)nvq>YNiNJfDKqHv9DrK zP=8{P!6tCPHlnkvjw=)tYX5&v=wYWabKp&UHz{p5btg+V4-*#)C>0YMM>l3ADGgG0 z4rVT9HdfX;HHMup zS345r!?EZjSRfXou3wRn{9ZTvRXX)AkC&HcXITtdHGy!*;w$T9MqR#Mw}(txHTu5| zJE;}ZYC-RitE;Q`w@c96y)e8lEZCsS_xWn4KMIG5Ub8|20)F06RO|i|FXZEX%&1xr z92Pd5FA>()*XRFyfNO*P<@1-M?k)dUly`1mkHUU0*z_8*YFDoz(b3VBl?-OQo>$w- zB5#z@j6r1m*D{JX*VpB0#Yj_M)%L?etE;O!JN=p+|6ajP=LjXjXRyVoKE3Y6ihLC5 z4?`OcvY5=^s%Ne>nma}aOioUYiW*O0(sSHsA&Y*M*z3QQc{w^d(rR`z=tKKtF_uK9 zkiy94vQN6Oy1M$APA$0G-W3~(kN)JQvru}e3X8+)frATWEa~J|@xi3&puf}n;a0i& zyO6(r#%Nei*#6~Z_xons54+Vmi;&**w6wI0j9qRbBBJ#soAp-pqZ)%Y_tUj%f%i6d zvsg2(Ves?KJZ2zOafyiY?v~{gVJ_W#H#N0)v1kBDCIWhGfYwFZkAE>=gbv#e zww|kRC484(YV_(IC;xF(YSkG2u^(*tJ>1LC^yKw84Hw0f(L9n!qwKBT!su$rB~c!K zIQjlnG08F$;`tj42M5RHv`M%qN>JNSXRp%TyFjPj+1b(T@VCkAHRitSbZ26CJgoaF ztm@65NuOD_#d>6$OeLJ`;i&^b`sCs;hr>$Aw|u5?_Rr*khSUUu>+Mzsx6dx$JLGWk zk;i5~KX#ghh##CN)ZS)sFm@T;_c*Y%SgD18MyyD#bR5|F;TgH5wKaakAiC50ZSCGp z>-qOH0Rff|`%}@oJ19->r1R!ga|^kbob1OyEk<9eX}HQtnF$4UHt`>48p+mLS|+r)<0+Ow5hHhzsHNs zcF-l{{As<}aZ}uJvjuS_y!&&k+Ei%H-!=;dY}4>S@v68~iLg(fW3U;{Rtrmmf`Vqh zI$NhO%2Pw=^?7%ONs@z4lAdNbKpN#0f^2i65e2epVr^u8&lJi!wZ_mVp`n8Fiu>tC zvCsGk#KN84zmO{)k$AaN* z91*frP?U3x!@CzNsB)t|xx05c?*tY_-HGwvcsyO1SXo)+oWncI^8r(0n<9FQ=M^&alyBkx7Wm z)_b6k8dV@J*}JCH_&tA!U99+8h(uVQ81d7fVU&Q^&cE3!?d00qwMO370|_URR)nIT z5fP2i_dlUwas<7|ZHCKOg+blmoAFd5f4UP2L`p{Nlbxgf2(KH#kZpP?FjnBY2F65A zZM{jQ@22N$quo->i>*fLltD1E!$!-WkdP47y0lQFJqnUulCl1tshE)AB|~iemvytx zhp@@YnB2mdUK2Ju5pg3c0z6J*(MJ49iLYNAEvd=fqVc)NDJZCjzMx4TULK665(&6t z|3eq8$J=TspTEkgrBcRh3J=sS3ax(<_~?JHztUREVREL*y~olzu^SR)qPi!({H&D8 z9nFZH&uqV0)!NwDsQQ$7t9vpseZD?!CVDZvg(Qfj?z=W?lGz82F?xZFNSXIvD-s%c#JkRVsXYuKD6}(qyRvNatNX;e18!JMlaz(bC2(5*zSmq7LdtZ#|Z(_BY4K!&0MgSyCDvrdUxyuaB23DtSLSd-i{J z2f!eh`u1UwJG+wY28Oi{clo{g%Y#p@3x_kg9s3S3b7_XQel54muY2s)bdP@ACNTSa zkTh5hKKQ9yVu^so@xxm-d253Vtbgx$xla1$69k8o#tC-n)I>{}V
          bT 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/rotary_selector_sub.png b/org.tizen.ui.practices/html/images/rotary_selector_sub.png new file mode 100644 index 0000000000000000000000000000000000000000..87647f6d2867234f20ed400268f3400f074832a0 GIT binary patch literal 14980 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 UG~WFGQ=~A8vT8DQQs$xm0g#5RumAu6 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/round_footer.png b/org.tizen.ui.practices/html/images/round_footer.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c63b44f25c608d6832727e3ed447670612c570 GIT binary patch literal 30337 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 LqGXM@VetO}{oqK@ literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/round_header.png b/org.tizen.ui.practices/html/images/round_header.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_header.png rename to org.tizen.ui.practices/html/images/round_header.png diff --git a/org.tizen.ui.guides/html/images/round_index.png b/org.tizen.ui.practices/html/images/round_index.png similarity index 100% rename from org.tizen.ui.guides/html/images/round_index.png rename to org.tizen.ui.practices/html/images/round_index.png diff --git a/org.tizen.ui.guides/html/images/round_list.png b/org.tizen.ui.practices/html/images/round_list.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_list.png rename to org.tizen.ui.practices/html/images/round_list.png diff --git a/org.tizen.ui.practices/html/images/round_moreoption.png b/org.tizen.ui.practices/html/images/round_moreoption.png new file mode 100644 index 0000000000000000000000000000000000000000..adec378ac63da6d7b1072140b9e8345d680435f6 GIT binary patch literal 20736 zcmXt=WmH?;5{84jySux)I|Yh6G`LG~cXuo96nA&m;_mJ)1&YJX_v0?sAz7QOBSBsp10RnTM8e+Miy=(o@mG&|@4+W4D{B;f16pZxC9WY7ql zqpXfI0Dyq;-vI{5%*F)`!nnvOO2O2L5T~?Z_+Ad}^hJtEp$|}jDqRb2kS~RdxF(tu%Vx6IS zp-_>Agot`&O=dl9e|+3gC)3p`QImCS&(P#iayV>vI$uBKdQZ2X_@VUIPANC)R)?H; zoF_r?3wR_}ZIMXxvd+nvY0(}UaHdV#Hg0sldr&np0owne|N z4tv4ZX#*@E%GePN#R2laeymtq=M^j>jvaX9=DjfV`9pEOD};aR1}JbHiLdLJt^=N~ zFBAYGURm_L;IIBLLycRc(<_S|Vf_U3Y^n#OE6c}vo4dI$4Eg>A$02$cz5CGhwb7?Z;|2q z_o^RYANNhs5Y6>uNSlGhlEFTWP@7=7Z(5>XJ^{AM6v>+Mp-nW_Nc!?qmX|*W>;ACd zk4cLu_#qb-is>8UZua5=lfRHivz7)9!J`twj&&*4-*8}U|1u=RMh)aA%Ld~HlIDnt z!}7+3E*V3O)&q5xW7XhQF#GSB+w_?u3ZF$FZ2xkA|8#z~;|U=2T?lGI9~#O(OhL6$ zuTm%4!Y8GHjEIVnv{gX7G;(7N5lx~5h)POAUb+crr$T|v9=a4ZRKS;h$0;f=heI4J ztGpEj-t2k$&CbwmJ~@LwFpll<#FmAkZLI!wKK0DxaopfQzIwEUU%hg3QIeO`PA5uH zl}!p+UDc+fq$K6%$6rJmKi&yJotb&LKT+{Gg!SWhg(sZAn_HdQ`Lw{erXV65f)phV z@Vwp;1J6i*d!+bS7}zl^m)Y^;Vv$%m>i76mX()7 zkqyz-wSu*w^tHrQRSWRvXEirOdCvXixp5h=ZZsN8=pUP$lvG#81O#<-@MrUSf(y7` z2SuM4HLtnYULez=!&6cYk+TUC14!l2laiAYlalt?xE3=>VRw0v@$m3uWn}}l?4Pz98)E(Xr*R5ZQ*w}5Mf#pB|TXQv!bCmS`hOyE)PN0TH zhG;$hj>nqmsB38*6v&txU&UVln{_29y1Cb1TO0{H+~go88uC*LolmA^m6SB08cAVK zw>o)hdOy8FLPO82ZvpLs@2tz8w-i;}m1uTC5hpJ~z2Le;lRapNT-BHRcOy2nd#$}6 zOxa2n$}%Xa?m8*7C`CY|b)F}a^jEsmnIyx1kSW;+eB?|ok zU=XCR;unWbUoI@|mSHddZUse7wM4Vn*>pd#CBY_op20yc4 zo&IgQuIqxS84Z65?Fu>PW?C247leQ}X3DbmI0W;ZSTwmL#~Gm~ z;Mi_|#lOF=j|6qQjZmZ^cggJ`StZ*ci4-!l;54AyxNw~t_9XHQKr~VZRAKMmPe^ck z7Y=_l8h*)yga@j^%hRD_U|{tt&Ku-zDPT z(?urHeI)wpwF^cxZppeEm`{y^I@?3Whr|jYD((Z`V!I6)J_rV&Wnq!=^bDO5LO{VW z2CWLedJRuU=~(>GZC|gquH5wWfT1BtK){r_#AjKwiiSaTaf?E(DO`_S3OPd~gSKXF zHXk2f)NXV{MBiiv$DUKWkD-X~Ip^`TFO?`ZafU2<$%iNY>%Xg_HI%HWu=hj?6%CEz z{Co|f5d`e@17_6pr?%!sGFF73fKg)aMF?}iYP|`KX07fO+>~c{VM^)@5&<{xW-MZq5k%^UZ)aYkdE`Ff*S>54vc&)4fA z>K&-F^+M4TEvv1~OC3WJKQbacQ~B}sB%yE1$cT*~{PDo?-8fFy2D*bb>iOfwA#mbI zT-Pgeh6{s6KX^3P1DtsQ4ZIK|oCCcQq3JsuENz(u$55{hBlh9pVZe#!@EeW$b&OcB zle*%sV_397*37-`NDS)T`q9thRD{PyeoQe%0AihPwf8!~;v^IV2bm#|x&oLA#ZRoL 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/round_multibtn.png b/org.tizen.ui.practices/html/images/round_multibtn.png new file mode 100644 index 0000000000000000000000000000000000000000..77b6d6b7d242e3a628c0cd3f6d9bb4cdf8798ffb GIT binary patch literal 25103 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 CAzh{b literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/round_popup_bottom.png b/org.tizen.ui.practices/html/images/round_popup_bottom.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_popup_bottom.png rename to org.tizen.ui.practices/html/images/round_popup_bottom.png diff --git a/org.tizen.ui.guides/html/images/round_popup_side.png b/org.tizen.ui.practices/html/images/round_popup_side.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_popup_side.png rename to org.tizen.ui.practices/html/images/round_popup_side.png diff --git a/org.tizen.ui.practices/html/images/round_processing.png b/org.tizen.ui.practices/html/images/round_processing.png new file mode 100644 index 0000000000000000000000000000000000000000..7b59fe24c8f8ab9684a7e7d17d25689325470c3b GIT binary patch literal 23821 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 J+Nf+F^?$<9x99)> literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/round_progress.png b/org.tizen.ui.practices/html/images/round_progress.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_progress.png rename to org.tizen.ui.practices/html/images/round_progress.png diff --git a/org.tizen.ui.guides/html/images/round_thumbnail.png b/org.tizen.ui.practices/html/images/round_thumbnail.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/round_thumbnail.png rename to org.tizen.ui.practices/html/images/round_thumbnail.png diff --git a/org.tizen.ui.guides/html/images/scalable_group1.png b/org.tizen.ui.practices/html/images/scalable_group1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scalable_group1.png rename to org.tizen.ui.practices/html/images/scalable_group1.png diff --git a/org.tizen.ui.guides/html/images/scalable_group2.png b/org.tizen.ui.practices/html/images/scalable_group2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scalable_group2.png rename to org.tizen.ui.practices/html/images/scalable_group2.png diff --git a/org.tizen.ui.guides/html/images/scale.png b/org.tizen.ui.practices/html/images/scale.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale.png rename to org.tizen.ui.practices/html/images/scale.png diff --git a/org.tizen.ui.guides/html/images/scale_1.3_finger_50.png b/org.tizen.ui.practices/html/images/scale_1.3_finger_50.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_1.3_finger_50.png rename to org.tizen.ui.practices/html/images/scale_1.3_finger_50.png diff --git a/org.tizen.ui.guides/html/images/scale_1_finger_50.png b/org.tizen.ui.practices/html/images/scale_1_finger_50.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_1_finger_50.png rename to org.tizen.ui.practices/html/images/scale_1_finger_50.png diff --git a/org.tizen.ui.guides/html/images/scale_1_finger_90.png b/org.tizen.ui.practices/html/images/scale_1_finger_90.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_1_finger_90.png rename to org.tizen.ui.practices/html/images/scale_1_finger_90.png diff --git a/org.tizen.ui.guides/html/images/scale_align_hint.png b/org.tizen.ui.practices/html/images/scale_align_hint.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_align_hint.png rename to org.tizen.ui.practices/html/images/scale_align_hint.png diff --git a/org.tizen.ui.guides/html/images/scale_box.png b/org.tizen.ui.practices/html/images/scale_box.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_box.png rename to org.tizen.ui.practices/html/images/scale_box.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_1.png b/org.tizen.ui.practices/html/images/scale_effect_1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_1.png rename to org.tizen.ui.practices/html/images/scale_effect_1.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_10.png b/org.tizen.ui.practices/html/images/scale_effect_10.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_10.png rename to org.tizen.ui.practices/html/images/scale_effect_10.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_2.png b/org.tizen.ui.practices/html/images/scale_effect_2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_2.png rename to org.tizen.ui.practices/html/images/scale_effect_2.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_3.png b/org.tizen.ui.practices/html/images/scale_effect_3.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_3.png rename to org.tizen.ui.practices/html/images/scale_effect_3.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_4.png b/org.tizen.ui.practices/html/images/scale_effect_4.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_4.png rename to org.tizen.ui.practices/html/images/scale_effect_4.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_5.png b/org.tizen.ui.practices/html/images/scale_effect_5.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_5.png rename to org.tizen.ui.practices/html/images/scale_effect_5.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_6.png b/org.tizen.ui.practices/html/images/scale_effect_6.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_6.png rename to org.tizen.ui.practices/html/images/scale_effect_6.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_7.png b/org.tizen.ui.practices/html/images/scale_effect_7.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_7.png rename to org.tizen.ui.practices/html/images/scale_effect_7.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_8.png b/org.tizen.ui.practices/html/images/scale_effect_8.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_8.png rename to org.tizen.ui.practices/html/images/scale_effect_8.png diff --git a/org.tizen.ui.guides/html/images/scale_effect_9.png b/org.tizen.ui.practices/html/images/scale_effect_9.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_effect_9.png rename to org.tizen.ui.practices/html/images/scale_effect_9.png diff --git a/org.tizen.ui.guides/html/images/scale_example_image.png b/org.tizen.ui.practices/html/images/scale_example_image.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_image.png rename to org.tizen.ui.practices/html/images/scale_example_image.png diff --git a/org.tizen.ui.guides/html/images/scale_example_image_set.png b/org.tizen.ui.practices/html/images/scale_example_image_set.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_image_set.png rename to org.tizen.ui.practices/html/images/scale_example_image_set.png diff --git a/org.tizen.ui.guides/html/images/scale_example_part.png b/org.tizen.ui.practices/html/images/scale_example_part.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_part.png rename to org.tizen.ui.practices/html/images/scale_example_part.png diff --git a/org.tizen.ui.guides/html/images/scale_example_part_aspect.png b/org.tizen.ui.practices/html/images/scale_example_part_aspect.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_part_aspect.png rename to org.tizen.ui.practices/html/images/scale_example_part_aspect.png diff --git a/org.tizen.ui.guides/html/images/scale_example_text.png b/org.tizen.ui.practices/html/images/scale_example_text.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_text.png rename to org.tizen.ui.practices/html/images/scale_example_text.png diff --git a/org.tizen.ui.guides/html/images/scale_example_text_fit.png b/org.tizen.ui.practices/html/images/scale_example_text_fit.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_example_text_fit.png rename to org.tizen.ui.practices/html/images/scale_example_text_fit.png diff --git a/org.tizen.ui.guides/html/images/scale_fixed.png b/org.tizen.ui.practices/html/images/scale_fixed.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_fixed.png rename to org.tizen.ui.practices/html/images/scale_fixed.png diff --git a/org.tizen.ui.guides/html/images/scale_fixed_flexible.png b/org.tizen.ui.practices/html/images/scale_fixed_flexible.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_fixed_flexible.png rename to org.tizen.ui.practices/html/images/scale_fixed_flexible.png diff --git a/org.tizen.ui.guides/html/images/scale_fixed_height.png b/org.tizen.ui.practices/html/images/scale_fixed_height.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_fixed_height.png rename to org.tizen.ui.practices/html/images/scale_fixed_height.png diff --git a/org.tizen.ui.guides/html/images/scale_flexible_height.png b/org.tizen.ui.practices/html/images/scale_flexible_height.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_flexible_height.png rename to org.tizen.ui.practices/html/images/scale_flexible_height.png diff --git a/org.tizen.ui.guides/html/images/scale_grid.png b/org.tizen.ui.practices/html/images/scale_grid.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_grid.png rename to org.tizen.ui.practices/html/images/scale_grid.png diff --git a/org.tizen.ui.guides/html/images/scale_original_image.png b/org.tizen.ui.practices/html/images/scale_original_image.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_original_image.png rename to org.tizen.ui.practices/html/images/scale_original_image.png diff --git a/org.tizen.ui.guides/html/images/scale_relative.png b/org.tizen.ui.practices/html/images/scale_relative.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_relative.png rename to org.tizen.ui.practices/html/images/scale_relative.png diff --git a/org.tizen.ui.guides/html/images/scale_relative_scaled.png b/org.tizen.ui.practices/html/images/scale_relative_scaled.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_relative_scaled.png rename to org.tizen.ui.practices/html/images/scale_relative_scaled.png diff --git a/org.tizen.ui.guides/html/images/scale_testing_app.png b/org.tizen.ui.practices/html/images/scale_testing_app.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_testing_app.png rename to org.tizen.ui.practices/html/images/scale_testing_app.png diff --git a/org.tizen.ui.guides/html/images/scale_values.png b/org.tizen.ui.practices/html/images/scale_values.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_values.png rename to org.tizen.ui.practices/html/images/scale_values.png diff --git a/org.tizen.ui.guides/html/images/scale_values2.png b/org.tizen.ui.practices/html/images/scale_values2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_values2.png rename to org.tizen.ui.practices/html/images/scale_values2.png diff --git a/org.tizen.ui.guides/html/images/scale_weight_hint.png b/org.tizen.ui.practices/html/images/scale_weight_hint.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_weight_hint.png rename to org.tizen.ui.practices/html/images/scale_weight_hint.png diff --git a/org.tizen.ui.guides/html/images/scale_weight_hint_multiple.png b/org.tizen.ui.practices/html/images/scale_weight_hint_multiple.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scale_weight_hint_multiple.png rename to org.tizen.ui.practices/html/images/scale_weight_hint_multiple.png diff --git a/org.tizen.ui.guides/html/images/scaling.png b/org.tizen.ui.practices/html/images/scaling.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scaling.png rename to org.tizen.ui.practices/html/images/scaling.png diff --git a/org.tizen.ui.guides/html/images/screenshot_1.png b/org.tizen.ui.practices/html/images/screenshot_1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/screenshot_1.png rename to org.tizen.ui.practices/html/images/screenshot_1.png diff --git a/org.tizen.ui.guides/html/images/screenshot_2.png b/org.tizen.ui.practices/html/images/screenshot_2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/screenshot_2.png rename to org.tizen.ui.practices/html/images/screenshot_2.png diff --git a/org.tizen.ui.guides/html/images/scrollview.png b/org.tizen.ui.practices/html/images/scrollview.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/scrollview.png rename to org.tizen.ui.practices/html/images/scrollview.png diff --git a/org.tizen.ui.guides/html/images/segm_control_default.png b/org.tizen.ui.practices/html/images/segm_control_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/segm_control_default.png rename to org.tizen.ui.practices/html/images/segm_control_default.png diff --git a/org.tizen.ui.guides/html/images/segment.png b/org.tizen.ui.practices/html/images/segment.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/segment.png rename to org.tizen.ui.practices/html/images/segment.png diff --git a/org.tizen.ui.guides/html/images/segment_control_tree.png b/org.tizen.ui.practices/html/images/segment_control_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/segment_control_tree.png rename to org.tizen.ui.practices/html/images/segment_control_tree.png diff --git a/org.tizen.ui.guides/html/images/segment_text.png b/org.tizen.ui.practices/html/images/segment_text.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/segment_text.png rename to org.tizen.ui.practices/html/images/segment_text.png diff --git a/org.tizen.ui.guides/html/images/setting_sd.png b/org.tizen.ui.practices/html/images/setting_sd.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/setting_sd.png rename to org.tizen.ui.practices/html/images/setting_sd.png diff --git a/org.tizen.ui.guides/html/images/show_frametime.png b/org.tizen.ui.practices/html/images/show_frametime.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/show_frametime.png rename to org.tizen.ui.practices/html/images/show_frametime.png diff --git a/org.tizen.ui.guides/html/images/signal_slot.png b/org.tizen.ui.practices/html/images/signal_slot.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/signal_slot.png rename to org.tizen.ui.practices/html/images/signal_slot.png diff --git a/org.tizen.ui.guides/html/images/single_node_selection.png b/org.tizen.ui.practices/html/images/single_node_selection.png similarity index 100% rename from org.tizen.ui.guides/html/images/single_node_selection.png rename to org.tizen.ui.practices/html/images/single_node_selection.png diff --git a/org.tizen.ui.guides/html/images/slider.png b/org.tizen.ui.practices/html/images/slider.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider.png rename to org.tizen.ui.practices/html/images/slider.png diff --git a/org.tizen.ui.guides/html/images/slider_hor.png b/org.tizen.ui.practices/html/images/slider_hor.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_hor.png rename to org.tizen.ui.practices/html/images/slider_hor.png diff --git a/org.tizen.ui.guides/html/images/slider_hor_center.png b/org.tizen.ui.practices/html/images/slider_hor_center.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_hor_center.png rename to org.tizen.ui.practices/html/images/slider_hor_center.png diff --git a/org.tizen.ui.guides/html/images/slider_hor_wn.png b/org.tizen.ui.practices/html/images/slider_hor_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_hor_wn.png rename to org.tizen.ui.practices/html/images/slider_hor_wn.png diff --git a/org.tizen.ui.guides/html/images/slider_tree.png b/org.tizen.ui.practices/html/images/slider_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_tree.png rename to org.tizen.ui.practices/html/images/slider_tree.png diff --git a/org.tizen.ui.guides/html/images/slider_ver.png b/org.tizen.ui.practices/html/images/slider_ver.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_ver.png rename to org.tizen.ui.practices/html/images/slider_ver.png diff --git a/org.tizen.ui.guides/html/images/slider_ver_center.png b/org.tizen.ui.practices/html/images/slider_ver_center.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_ver_center.png rename to org.tizen.ui.practices/html/images/slider_ver_center.png diff --git a/org.tizen.ui.guides/html/images/slider_wn.png b/org.tizen.ui.practices/html/images/slider_wn.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/slider_wn.png rename to org.tizen.ui.practices/html/images/slider_wn.png diff --git a/org.tizen.ui.guides/html/images/spin.png b/org.tizen.ui.practices/html/images/spin.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/spin.png rename to org.tizen.ui.practices/html/images/spin.png diff --git a/org.tizen.ui.guides/html/images/spinner_hor.png b/org.tizen.ui.practices/html/images/spinner_hor.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/spinner_hor.png rename to org.tizen.ui.practices/html/images/spinner_hor.png diff --git a/org.tizen.ui.guides/html/images/spinner_tree.png b/org.tizen.ui.practices/html/images/spinner_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/spinner_tree.png rename to org.tizen.ui.practices/html/images/spinner_tree.png diff --git a/org.tizen.ui.guides/html/images/spinner_ver.png b/org.tizen.ui.practices/html/images/spinner_ver.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/spinner_ver.png rename to org.tizen.ui.practices/html/images/spinner_ver.png diff --git a/org.tizen.ui.guides/html/images/spiral.png b/org.tizen.ui.practices/html/images/spiral.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/spiral.png rename to org.tizen.ui.practices/html/images/spiral.png diff --git a/org.tizen.ui.guides/html/images/stereo_projection.png b/org.tizen.ui.practices/html/images/stereo_projection.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/stereo_projection.png rename to org.tizen.ui.practices/html/images/stereo_projection.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_def.png b/org.tizen.ui.practices/html/images/styleguide_genlist_def.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_def.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_def.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_defstyle.png b/org.tizen.ui.practices/html/images/styleguide_genlist_defstyle.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_defstyle.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_defstyle.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_doublelabel.png b/org.tizen.ui.practices/html/images/styleguide_genlist_doublelabel.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_doublelabel.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_doublelabel.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_end.png b/org.tizen.ui.practices/html/images/styleguide_genlist_end.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_end.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_end.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_full.png b/org.tizen.ui.practices/html/images/styleguide_genlist_full.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_full.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_full.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_group.png b/org.tizen.ui.practices/html/images/styleguide_genlist_group.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_group.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_group.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_message.png b/org.tizen.ui.practices/html/images/styleguide_genlist_message.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_message.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_message.png diff --git a/org.tizen.ui.guides/html/images/styleguide_genlist_oneicon.png b/org.tizen.ui.practices/html/images/styleguide_genlist_oneicon.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/styleguide_genlist_oneicon.png rename to org.tizen.ui.practices/html/images/styleguide_genlist_oneicon.png diff --git a/org.tizen.ui.guides/html/images/tableview.png b/org.tizen.ui.practices/html/images/tableview.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/tableview.png rename to org.tizen.ui.practices/html/images/tableview.png diff --git a/org.tizen.ui.practices/html/images/tau_animation_1.png b/org.tizen.ui.practices/html/images/tau_animation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..03962f780f74a085cbaf0252d6a4173be112e331 GIT binary patch literal 43968 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/tau_animation_3.png b/org.tizen.ui.practices/html/images/tau_animation_3.png new file mode 100644 index 0000000000000000000000000000000000000000..69a8d82de9164e7d936468fb38cfc1e74814d12c GIT binary patch literal 9950 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 DrpKW1 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/tau_animation_4.png b/org.tizen.ui.practices/html/images/tau_animation_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d6430ee09b5ac32333ba3bd6e5d68ea3b58962 GIT binary patch literal 12468 zcmcI~g;!Kj_x2zn9fGtV7~}u~g3_gQNDmBMLw9#0EexFk(gTbjC7qIkv~;(Cl$5~l zj_>=e_b>R?nprdJ+;i^P``PvEb8qB(Wf?*|8axmPL?|cwRt*Hg_y~LnaP9#k=3X8J zzz?pYtd0u^MAU`;VtjWfF$00{RIH?=-oLkWaCLC8bZ}&llagX^bat??vNZ>RJZH1j zVH)Z?6e8z~r;-XE0+SRR)W~rd)Fh(=A0;rcG2)WQe_+g;Ay@5q`0m|(+P+U8FyrC^ zW5`v(1W|ZDvDX>%<3b8PL=9Z8_!QVoHJ@(|-_}lxZXr&xYeul!aR^dmc~$uW2}&jD zA1;S{@9te$=M)dZd+rD#!KpE0bh&wk0lM%P7G{6ij@=5v@Epg-0ktb-w!eHFaYwu> znXZQs7>d#En(#&eC-4zS+&fOP2qZ3z5tyCEqz?LYA7nIWYO)4;&jB)G4%i$A1!iBQ z`(S{eNsQzepAtX}Wab~N@n8TCDT<_QW-2R)KL))qcuuO!)G1CUCu7H)hl@Gc07!{LOjt<6c# zf|8?Tf5dNm&p1Pzv(qb`nkVQL@$$(K2=pm|9MJaU#uG(Ui9+$m)e#wT?6y6)dun2` zcDpfB?kEldt+@J+-h#PmXaa>E1lrx^zc{#WX@LL9?L69|npnIR^l4{S`@|8A&AYsh zjWaVF>+3(|yCtE<1KNJKuuj8v?Hk)mf8oF9XUnat&x3gMgJkYsEO!o_Di%H-NyH5` zncs|;`CE^F_m^(`X}6q7BZTeInkuPN+}n(p6Q07Sk&=n5Juk-Y%vP7c*O;P9d?2K? zD27i0M~S{E<{t%S5{PU2>NyB>+~m+P!GePsXc@9H;&FE^lw!^!8H_8&ZPyw1W!V{@`&3)_e#4UnBld$>-gjk|dINW`U2LjaU)Ek}ToF zNIEtnt_g9vSM92n;c!PH&Q8q+A`wU8D`T9T4wmL1-1`!JIAq3*vmY=_q9D)Wa46Hm zE*Lvx?~_J9XXyX%NcE{g0-r3mT9gKZrYzmDi1R&x2tDa<2||4!p5VXX%`)6cLDi}v z69lzVjU}&XLZ$QZf0(&)XT(!{%KYK{l}03nKX2kyocyr5aH}_R1|oU^s+APNA?O zKY5(SlG5_rs%qQy+rx!qdgas~+GB$|GTW)!n5P~DgyG~N-#@@us57assbJI|R8?t; zMbzWb)ZaB;zUJOb+e#-+chH2e)v@`KCk)^v%O^7>)3R}Cl$I5hEtcVHo@fqg#FrYV z`&CM7@~W?u;!dQLYnEld-&3bmhm{JIM3liw95lo}`|I39KG5k>>{5~XtorGT;aYPq z1HLJBjVGAVhOj)`Er_q1>C5npuRB{)+6`S(v`ATLo`4juJg;_*+DVdy81`D4(?yo6 zGVT^jaq5YG)Z(K<)>T&8qF0KI+~#^VWhtpCkaF2_)pD7=7XHfp;_RZ9cTGCiK|~VY z<(c)EWnl3rtn4lI8TEx?ykZI^5y7)c&N7=q+PtQ>9⪻2WdI227x(>4#kUJEn8QQ z{kU#4ZtSj#&twQ74{8XWKbRvxQ3?0(IXMW^aebdVQkBy05|=78PBuR zj+G{kvFg=Zd%kAZYu8)A^ni(xNkM5>=^#T*sj-N)NJvpg@%!-5aQ^UAI$x#;_cYH| z=2qr(=2E?puBR@zuB5KPT&{Xuw@BxpuGv0JS3su_qN%H2BVCbQ@nWi}qN(^{aicO^ zxjbhI)`dK(>#r-Vr$%o4d@xs8XIJNE3^SpG)%R3(9l%@Qe&76JZ$z*OBW8%o>2&G* zUA{U$64Vl0%s^!wi23!LrtEORAR{CrKY7>c$Oc)vt+LfK$7NuYutt}VlMm663c-V% zsiK^jw7m;`E$i~GXHNPn-eYIknKhZ6`z3Q#2mA+C2NCnRL$7jKb98uJesuLoEvs&f zis9!bzqDCG_^U{%1i@;zo^hFSC1_VnBkK!2%Fc}sDMkN?I_Iv5t_i;7qjOSZvs05T1QP_L`?WrHw#+$~`UH$~jVG&{4;bL))A0RZN z+^KvXqw`WOOK-2gYw-CJ17|LAwv00H&aUoMM zha$tB!H!2nu!TD$G2x?=WErCpybiVt+q7^WM3{$F-}cx?*K^S)WB1$Cd_-XBaNyNR z7Hw?T#p_q9_i{acv4m283xItGF}YB6l~@HO!^!uQB*|ehMkx`Y8<|tFi1Aem1dv4H1I1IF<&nJB?E$?nL8?hL(*x6j< z$bk~2l%;N_64?{Z%zhLap)ih5hIOtxxlxSHC9bpv~tuqW!INni!f&lNOWa*K*f2=VFzSWjhxs*LM09 z%63ls-!aE9Z?K;c)lD}}Owx^sXsE?cvG2(ceSgw=n|1n_?g??$D`6ck z`4f$PtJ$64aX9RFBqlpK+s~i#a^7ezzs_gN6t!ec>~Q#v#C2ut-CgvSP_qz9@3_JB zxO#4bOuIolqe{@wZr62J_!d5{^1UgmDWkGc&!+LfyQS90;(UiT=QV2Kw8iU);%;g( zM?hqu<;2_JyyyIEiDJRunfV4a*fit8d{EJ>(rkDtzArH&wGc5W2ECpCc{m?n-R|+} zWOQEU{6SdA$Zf(|Jh2p3e0uy~IAQo+&KpqyfmJc*o1MSKQX^&~OgWUd`L~0WloVY4 z7n6I_sL{01ywu}Vc$=MX;mvOQ9(C1RZ)Y!kYriKix525_^?rxPya(N3!4k2`x-UZj z%bn%rmoxPr#n*6ZIQ;HDX4=VLQ(lfafNwIG%Bm@WK;ADvpui9i=<*Ku-2s8zUV=co zMj()28VE$`kZ9N=4FbJbl6xzm;W_&&d&dPjonFlS1jdwoa4Gu4qRdvc>23eQ&hrI* zIdehYafPxmk$teT45?h?Q}S`>YPa0%7aaSP{qDNwoQaBopS7%)a6jG`Cp`~tZ-E^6 zqZ;wW)s7R}Ohok(^XU{;?|p1&KP)}zP*o#W;Lr75TJjt5@qGjW2?rAg+y{Yh@By*G zAW$e42t+~w0*OQZHx`Ke-x$ak^xvNecGD6MTPeT5zfTmhnBYXQnUQ$L< zMvN{~t)fNd1h>^sl@bp88iiIm@v5G=C1Fcoh$5;6~p&w-e!kIEX z(oL(m9nT~V@%+aQ(#16oE zlj3`mmm7FURKxQJE^*C0)f#(C>q%!9K2yl=t_9N%Zma8vuu=z`m}%s1Yw(sRv*abc zANcvKNr$Oczbbu#=Lz5E-13DVS@&?t1;flUHO6Ea@=rrI)C&d${SI)&1X~o8RUilY zPx+>u?DyThHAH#Ya;f3h-#6MDgdb^gDwd?K?eZx%_1l~m)xMXfrTiNCm41X~Jdu$_ zTKQSEv{|<0gHhbPBp!al(ix_nEi90+W;U{#?b6Z~t5bJv2l^&D*k!OD&R8n+{48`c zpoI&Zi#PJRxZ{Jby`-DaxJ{NfeELAy<{Ym3G(sgG)LF)399iw;?b_PL9#Qi(7z&=J z_{^01I6)<*k6G$C;(UX)*&_WS^|3f)@;Sn)|Ba?{r|#wsQU7@&2}K~XOc8Q~SV`f{ zA)B(4ulYd=Xk8Y{m%!~U!h*>8_?Vm#49J&`?0wfF^xSJut5|v?2l;q}>fh3LfS=5L zUP;mpOYWoYLxMsz^*g`iPN>9rDnbrYyORivF>uN=Le06oh4Qiqyb#U1_=B)sGu0sU zRFO`TBvtQhbrEL7B641=(o8eBLlxL70m+i5y=v{z=Yyg3GQUqyVw;Eo!A6=Q(bvPO zf@kxxtVECvEmJH~QQ9peE80s1vcPz$r^tsBip7AiCQXs=6F0lD7o}8%P%=+mR#Jd) z%H=}~w?7BW!#lt6073a5nKIP-WlVFLFMYGs7tH;E3^2(EhDYHEtSK2UC|ff9iTj5{ za#D;sJur#q`GU$WMb0-6iIygA^dL3hdkzyWK3{aGB|x^)sL0J0z89pS|j^u(fK4?nOZhA;4-M*ttC zf9#U_pdiZn-xMaCJSpy;=yPY3G&vnwnX`75NdiHVv(HFQWj07STIxup1g2zu7#+MTeqRpz=NlLzUnnvj$I#};H+|7eF6){DDT)$)0 zrk66rqnIzVVodw~-7k#L4FOxYvp~x<{B`cedwCbFWFwsz3a~|s$=Ih)s8lRHLU3Aza;Mb)j2S)#mTeA@3_k;wF?I1+z1fg6K8qbV`em)f_mgSw zTe=Vl2@Q7l)u)Cw!xDTPrI4N1;p2ykD8jc%2}vnQkrJh*qXL=3KZp2PO_Rh8K%KJ? zMd?Fjo17-upOh&o5y{;H9)oEy1A>=5J&Ij{o}TZ8g<1Fsqhdo=J21X*GW^=3{Bs_S zjoqz{Dqi}QA;A6AFkP)6pVOw>%(d4-wiOgwYy47PN!sCfkxa`0A}UgZGcXYPj%64M zPMM;`4(sjkGUgD8J}x81xxNm=#P}l0@>n3#|HhiCozIl!3@8 z9fwZeQcp;D_=K-iNJl>`xx*vKK_(S-4t3UU+ z8~gcanlE!+WVJELZd%$U5KuHgLNI%|D`%{q_MWi1T9Xhfb3ti4;z73*X3wLkRM)uZ ze(m=Nd>mjT#bq^9yXO0$LKpm`pVAcUP#qk$jxP=wv`=uR!If^VCn#rrPOMVq8dgqY zVM{>;-@EGRCB@%U=(-O7)KCR@5+2}5h6eIanzHd@`p@CkPi0&s>7r4n5nl-d5{e5R zTeyWr!N2T8qpegIEVIi2=a!CN7@*sxoSM-xO!UQCNatEv4*Y%Gc$%rr^JE^*smx*; zoTC}pZ`onOOHrfvHI{?|(#~DVKwJF%5f^9Iw|*=3tG8+O5akzb%}EAl%$@mzHvXIJ zENEmJFwdoSra3JH?boklHs)|SSgF5B?Elkgk`rO&Q6Gan9lI!JiIVpZ$ES#nx=P4% zl|q6;&kF6<@?P{$cVHa#)T}yGnZ+-qaw?U;sk7Chyzx8Btc`nIqz!-ibnfB~KI>0j z@Xh%$lgwJn*?@sDrEAej6TEuszp^xfV>j(`fy6P^Y(g^ecsu;`nY;GxJZ?bV1K8Ir z6A-jO0OuelDKoxfV&rjwDZzh*@QpQHwo%&++d#aAZ$zHrg_@@y^jU6-xBGMo3bRaM zhYI0V7;*awh9b)#5GMS>uk;RhHf#lRwwG<{8A&mzBgK0mi)2%I7)LNElc&W(o(wph zWx7;_b^QlQHVXz#vfFsJlpUhZOj6gV!RoMlAs<&c8ePLNzBlO(x7vb@k3n!rZ(S-Lb)`OMl%L2By4t z+h>=!2vo|vZ~%xb=5znBs{ z#?+xXx$l7z-eNqH-Mf3zi5cc+?8T7Ja^)Phq3rOO{!ufP(Ii$+uAw4KGg!_8r+hZ7 zkk-{x{>D;KRD_=^7^tbVDL#_U9>I z|4ja_!Pf%ViYeECWIlglbA+@*WNe;v{EXbx`t)z8HTXJ5e$fO78#j#6=+4<`uG4r{ zFZ^5_MzDBkKRw;xXNm%ff)qJB_$v&sduzAe3_UFy3%a%c0QJXGor@&T2dy=`w3CUP!O8lu#RD&gy7 z&rSkH=@R4P`+)3fev7kZw;311f4}8T(2HhIt##)IKobx&CL23UtT?0)+o)C$_wIzr zP0>1Yf@jMkD>H^v(k+BVFo7>oHIjvvwSU>U*R1!$hpUoLODfj&WV3|IO{CgfN@ZKj zlkE-8FkPrc5wB^D5bpkuK*zq2$m^iM-%qr8qa?W3h>U{>HRnjH8m*z=nN4DsN$HBP zJHo;wk}|UV?YF#rJa_SU{CiK}#P_?U9hA|2Tg?#;!tcCiVEsP${dL@P@Ja?ULD~o;$?G+66BF*$*!f&<-6T^dz_4KCBZ~Y7yf~u^B(Pz zG6mS(T)qMyCpKq3=tbR9U%EvCCV2334gYmd&(Ph4{@--1gMffH3t~({OqpNuIB@W7 zKOw1Vm1fC~*Av6LLQM3#_SUE&H0>a(!g7&mZ?A=v;$R z#Zkb%f_{z$%r@MPA4ta9^Be_)5(}zRzX7DO z#@*wX&%d$`9&jeq@Srbhe0*%?^aJPJq&>17} z-XZPihur8WKl9BGamHZ+;sNf7FzmI7vw&I+%+_} zWG_wji|IfPW)@L)c5A!$Bv}eY`ZBR-jfF$8d6PMSHi((#^yS z-=DbEjGO;m&Vgo*2v zMO$N{*QRB&yH}mAcU_$mpZ|dmGknVw$OKq=wt$qZ_Ymyr*7`rnF|@u9Bla@*Bw75H zkzssyE>m1~JbOL2)2OC{k>UwqZoY4iOOSug@t?#F z#MMrXx=5Dxu;iU$7pp^O8(PY%Cs$_{`W=p4mae2$yL?CsPS={7t_Z{-M#C5>65EHB z=6jeq1W2L>JDzw6nA(cnIb;Tw+m^+}z~mD;yB_>c0MGnROE`#o~P zC`Tgo+$*5cxP>l6(S>JiUR+-)vbmy=da(W7^<2A+9G}d)Ge@QZD&pgz&IXE5EG?xD z3lFlZJc-c)sC0nOivk+6Sg5oe95CRzt+zV6_MGM`V~!j;I^S5aTjKBV5Y-<3ovbdZ z-dZ4v@X!Pzbq_P2^2t--ABS-*KiRrj`d$MpdGycpgOJhrpgS2-jRx`4&?wq4q< z{@l;9A4=5)jy?tnkT=RUd<-cyco6h`3 zqm9qc4tX>cjBMw*2afJ}d($`L8iEa@0V=x<<(O46;!2Gu&lP0>^u1eg9Oo3uUr-0i z{?WPR`>O#?tQ@kv-?7FeB5;g@it+Xal60S(ngwc7KDv2b9i!$_Tj#83t#$>E4;|iv z7;uO*30}aUYfCqdR}&?+nWsS^@<6VN$N!fB=n~Jp+y}QyRjoKM34!Pj@fo8Kt8aoY zkr+3^q61bAT-AKizGu+j;QLZj6ogAGeM=D_`TZHWOIa6FSqaam(Gj-s-MiU|WvfaF zKN12!iFXdTQO@6&)|%|k>UwF0XB;%LVo&XN>HAG|yFUUao*>d!*>K^0iuqXZuz^6X zf00{=-C3hkg*%|#wZDq9r&>SM7S$0(kAn~XSidc+CbT^aDi>wB^?p-8>q>5laqwbG zfo!0X$X{E=N`_i%oDuEc7pYuk4TvMFAjX&oWFR}(!GYTE&fcDUgFJ77KRq9Qn5}4k zmYQ8bA=C}iZFIO}bo$%c&63%JSxG{H6lpS_&>wSja!!UyKUvq=JF`_1;0p=Z1=ml^ zj-gr{r5oTsEa+0|(b{OT$Ea#DR~Zg@o~CE@VmRsjIG(c3=y)%GH!BpW>CmjZm!Fu}A;ctF$*RchLOFB8Hpict3N(WDn^gKU*)ZuHsfe?1bB|{w+M%_c z)_>>!xK~=Sh$Kvj^#XP(A7BG}J4t$-Nfvp@B8YLY?@9W-7pBTOtQ*jSTwjIpnmRA) z&MNZT7SPVB`S# zxO3vW9=JTs!^q=gpx>qh5}(w2$5b=EWSxJk;Mm&u#S)6Du!aa-b(q?i?anM=&DUjV zxjwfVyAP^{1txC^A9j{y%xA0hmYAw}_;4}4Vohio*EQ1f-_kmWU2#461bIU8=L{d{ z$il;%DvEfh932GMopnqvJDqF(l&j0zF}F31cLDj3|9TCmPfL2J-#P^udtjXMD|rri z)j55{IqnaY=6O#WfE`Wbayj+;ZSLYuj!kB-C5@D#VyYvO$R5p)k3D3a)-Q^;FngL zeXrqvu6%H&kY2=yZX0oM2={V)fd*r-jeTa*850a2jqsXsW7i%Z&{Xu=z_WqUo)4ds z<|U;>AVFz|kEv^^Y87`Oz|L^hcg1k(8+knu>cqw740Mb*i38oT{f*|>dbyK0g7^ch z;CQGy;O&z)wt5plvN5rNZX{_Re9(%`^*K~NFwV()aerBkFFMnALrI!Nu7CaZD?drX zQfso0=^H;Y!2Taz$hYc|#}%EL^Gl!^A|KI*k*``w6@Ofh_$ua4iq&ZHu<-MQK!Yl+ ziu|w|olM=B%~w3>+?73(iy!CR7jAyB(6bmE1GLYuDNUK(EWHNqLIiN1`udY5q01I> zGxl@TpUH+Rr`FjjX(`AjNI#_B(d#|p|K)+4yv;;Ng;M#zA}Ue5dh9>AC=m@qD-s`?g2|{hII2@O*YJuB`$tT z@!LRy;|gm{$@QJY3SIp8H7n>r?>1&ci<5x5y3X+OBB#HN(B1iy=kLrbs<ZxL`TU{}fJT%mVW|mzeYP=_09cOU@98sR!?yQ#7whGs4D;(bw=YHVPK|RG z)+e?WH$7Z6CRn$#zd^4x*~N=nrnDr5)+U78#hhmABdVPd>6xX&1_BvD{j;*zs z+h(2|63G#tyx^+BDP%IueKbU!`S6}G#(SE_a8k*D~AmMUeWnKFBJhhO)0aufdy^G zpTWlOO1ahMP)7o5L6r7dQjm7jb&i3J7>7IKSuz#EO4o>?(Y+b9rB24sO%6eu8p@F( zKe6a5gP5y~{1LZfJ=BF+?{nbEL{F#LgvD1zmfMl~RiCBG5`>=uEjoQyOaD?MGI%I| zLXqwAa|9LD`b>36fqQB2-)E&Shsa)+N0cKCxWhX#io*4u`}5OFa<+e5lDYkB>!X(@ zJNADqb19|x{$_Ld(kN^r%6^scw3V{pq|RGl(}#7_Cgzvb7MZ}BaSrfQ;}Lc*kg4;n zTAak^(PXszzMaVUK#QxWi0PL^Wu7+_*SF9ZtImzk0M-QNRyq<;-thnKRaEbO#+pd9@bIX`gy zb#iKpL!wi4a)3?|ucK}|tBZ-(`()-cj;OVFWHRMuP5>x!OZvk@voA_b=r^>aR0b>P zb7A{C%WE4+fL5RK)4u2|nuVxtJW*lF6&ToOnSSZ-KxsHmbJxb4Xcd;UTH0|rKVUH| zH3%%sguUB3K~Mun)}JoKN+{6%f$}q;Il9}0S~P0rkh8(+q2~R>SZXPfYMaS zQtvIFL%!wgEwB!#R`OGAFR1H4WlwCM5@7gqvyHRIIsx+loUyNoBe9~BR}*V8p?p=Z z>W?MSDn<2}0ewNt82s5-{oPCbaT+c-krPzt?)4!P-~`()`_YY>CuJ_>-?wyX?Q=AL z_Mu@fMOZ=KSp8{(Gd(-nX=NW~9Z3S^G4W)83xXrlyE*Q!9R?#=YJpa$b59 zEf?PAV}8>b1^8~;>1TjopyFa#YthZw-+5x?!g)kRLm|+G@Dd3LuP>5;>nbQt5OJ|X zH4NbQ|IBcOh3(Xv{Jmop`R~*DkB@$L|KQVfVFzUDxEGzQc2k_v_U5C# z7#$wZbrb0b3I}Uu8%h-u{%J&R1oT&3(ur5M{>C=6^&5k|wbnwHFlgfxZKFU$#YTi1 zcYQ|vq{8BtNt2w7t%iJbxPjO=gG@7G{)81C`oC-`J&U%n2HM2K^XD&OhY%Ib15kuf zO$cW2p`+K9mI|t7HVU19K?qK56JmVu3+gIE`NMz5$w-o=)=kv1O z8&UIAXs)4@Zwswb&kl*$aHa?8?C;MRhFuI@zV_s&w)SVC<5V-F6uCnPR-xp;z5x8{}>Rx~}Hmc0Ghg|H2b_I3KG z_B1U(@oatFw2(6~bGTY+_GjI~?5$;J!yAPF9b~TsA$dBKTnN3-Pgy+vVd&|nOlS*L z1s=M%2+cM?W+4e^@8u_mR)vp-95ibtPiW-=Y4EF4!dKCzUtHvX8nl=NuD#jy)-f9X zz}}0FbE6ku&A{Vm4QW#iW)OQ82kcedY>pp{XJS{{vSbGYoxmCpP?BH5nOu;cqv6#+ zIa%v7%}qo~T9v?+uS24$V9l>+4D@mu)AZAE>Jz~E1N>iX+QexjQ~(U)ya+Il4OW02 zdP+?HHjH=k`uuZMGiiC0U^y@?MtCWcM@b9GJp~FZcC0${)p{w`%ylzUo}2?~d33_} zF6U5b26$wo=)Fp71Irr5J!S!k;e7%Zz-nZKcL@PHm@b5@5#PV}v$4 z_sEs6ec0d#$a6^tzs0z4Lx+Rg&~zQUe4qkAXh38{&_K>>N`c!@eI4766{gup9*PzC z`WPWr9w>~KD()7^WzHkmv`L8sQrE!i5kY^$E3TZJ|L*q-s%{TFD_)Kj-Ww10ns4%& zlC(EZM;NW7bAiejMy^adghf|7g!c;5s#uS^T9Zt_=oDKLPf0;Qp1@VdZgnp$RTqHr zf~q!juud*M$Q&a~wgC1CqVF<0RX;yaPTv9qURvpkzlutS0U-NjK_uA*YrXnBiw54d~Op*e~1-P=Ar!dq5{_@*5$IbV% z?Jgi6wPZ`A3%v=k<$A6=>%vKdzYyTb{JE&9Izlysv(5r46~slzNarp<2_ zFy+00mXSQTiTJkrYD>r7-pyLX8Bil|V25x)c+X7s>SUT}iWL9};CN!9$pcVZKS2rL zdX)1NjQ1CCeOGWDZ3&mt@5O3$axgpTzHhe{0K#lRZUZ&CCap!=@hXL2mz#fg#rwPt z2sq^N=Bksm!(a(5;3pHGE-_S^h`j@3Uf71azIs{+tzU^5%#Xk88z5$YLGyp)Z$(P{ zM}EL7Yl3I=5yCbdTC~Y%Fg4!T=S#k+*`TvRLCK!DdUMLnI`OjQ3cP&Hz)Gqr) zsB|?$c8tJ+CPV+-v;yUw1XJ?mM0+2ROn|elBcginpKQ&qU-@(?9D~m@m(zKM{|znb zU`$4v&2A{<}YK zR~@ZmtM{rpd#&y;6(wmj6k-$r0DvYdBcTQW!2EsNmqmK_wpRSU-SoCWwv*9z1OU)` z|1B_swnbk702E~lad8zDb6Y1{M{`>{N?CDnN;?NzQ;TmV0D#+arn(tK{SaUHcKr%0 zAL^SRZ>xrfM5zXj@WqXz2T~zp%7s$pEa9nkV@XQFkqkjYVWXpcBk@$3--o08LfoPH z86A)t8b0#4>6vS_(002w{!+gP+Aq7zter&cLVBMh!==jO`@R@Vj`cfWuy0^725{#sB*aABh1darahpX&0(2>+cd?U(ykZ=IQ}tkc17W(H;y%hF z`QidZJ)*${08uFz-^>(xbpR9&@Oku$@ist(1@M`{XKxnZn|YV&2?Nkgpu&TJ#sMgC zOhP39=7NB-$xq>u04;U^uBm(=89JS;-kEWC@sXd5zu~rHQik zxTg|v`f+3Yz8nJppmBI_(Oy2gO`umyOz=iGpc}Frbt1e{8yj!G>`s>2i2?wdPTtcm z%xty9zJdt8)-ONlPT|ZAP@&GZ5vDa5qV)ji;j-qX-9K(5b7Gs9mUee`e#!NLb&W6da?%1OB7J12;PaOvS@u8n?=Jo5=2J<5&w#1r z)U|aB09>@%cF!>)!TOp9Y)-nqo{2n5L+Jp%rm{cm0RRIDT2{zNt;iq}03ZSN16GNV zTy+yNcOj5=!>@LuK7Hm51k?8QfHA=+Uwug(K7T0l2QvnbSCIifv(1T;ad)Yj2glo? zv-W5-p$pq#JQyKmbu+g4A;XCcA>kNNEr-GwhilP9BN3zq-BESRz+p$wQVxgWs#43x z@yKwfg+nMcWXLXr9p3SW=t;H22@U}`{hxx{q&X7&YE*^i-q(va7x57XO8rEg`s&1y z7K0B>pK_=p7LMf2*`F#k$5@U5i4U@O9S|aN^?hS!9q0vDe`H3E|1w%lUG~0ofVk>Y z8Ek9V^_R(NS2%1x$u4AGI9D*G5xJO*mV%bjFPS1rQd(}TWn?~N*g(}D2I}}C`8xU* ztouGfV@{3`Eg5E-1?(6cHcZb@@jgCU>@aaohUVCJvekKz8SELU85=d4L+0XiZW&^l z_~GTRRyBzH3CxsCLqR*4JH0zxJ0v?)7rH2!#-jFlcj{Y=Y9p3%M7x-~+`9-SDV$;& zxoK)^ML7^Go){f)c}{~`rD{kK4!3g}|9AkttbBg?&%{|`a{}{Qi^>D17Ob^Ia;4-c z&6&|d>4W40*elofXu)^^gP~@OMCpWxgl0spgq0}@1w^wEM1v4^K91v*{Zx!pTMaE> z1MoXu+z3jdTq1oU36Kp^TvAZ7UV^G|sWA$PDK=2|s*uv)Qr|8{o=Ym#D9KbgRwq$6 zD;6vYDKRUug^1*NYd?n}X!k1gDvRf-LaPn8+Xg66zYx{BF;iKgl?FTe@$}JGk1u_9 z0k)<*leI<&mlWsli*w0wY1XP;CYXvKZl~DaWjHAz?=u!AUwVhH7Bc~#xv##YzE+4*h_5It za9zP#VwF#l(<X8;L5qGxPGswc)n4hQSxSBT=TS0?z~i#6h@@QfZjIkw)KGZKrTH3Jr%vY z;*sKMnwnyB!G{7t1wnB1a~ocrnf>5J(bjh}VgbeJ288k$UGYj$)B zv`-t_Y=U(7wez(!bo6Vb$}`L97Fx?&3$Y5DmEx63vlh&HtIivS8;To=s&;=NtW-2u zH+UJD855W__E+?t#<$0NwRlB63nQY1ETNZ@>5zFl);Zt`d=gkso5(m7@#?=yI%G4` zn#7#^#kJjlGy0*=B2ztmR@#iftl2T(GBhGg-hY%e8N`}SGO#w(z9Z*!ZLh!SF>{@n zUYp)?QnXTe%6n>Y8nT)_#-05kOPkAas&`2Ix9aY+2x@jByVXXSx3ajhpIQAr4ciyC zIL-3Ks>XcRl3SxQ0?-Y}A$uFNEyTCZxvp(E#@E$2)Htf#Ynx>lv?1<8^ZNDG<8>NP z=t~D<1{>xl=BNAa@y_ErRcEw_z>3LD&C-cjB(zx!Pb|j2+<&*boXULYPi#5W?S9Hc z+=K;skc#)g!W5#>o>4@v_j`t*kRZ)qk!ZV6E#hg8WFFV)RdL4+i3f=!iS=|d4rTsI z7C9ausD#y0Xqm5tyG3Mx)l_?IUMo{e_M1E@KP#|;*XCQt#?#4V$X4bS>b56A3fqvr zoqNti&s9(%elaUHvp|xlLa5Tmguh~#z#{xex(ggvx@Z*l9Cj)|dO&ie z3mKrI$B#d8Z9ML@{apFXyUl?N#j$M)XbNlT0$KQJE|k`s!UF9a0YBnm?ZG8fit!C* zM`nAbE~8~8K{YS^HW7_%%8XX@$s*4uql^MU$|IS z-sYQ>Uu4u20RRs=0Khi@0JwjB+a3Y{&g=ld(PscaAO!#*u>E1!F9iTl$I42GLEM)A zthu`3&Oadj6@$M%(oprlilyIuHxnRAd1V0BRK-$Nk(i30#?K3dV8Okk@(YBEyh>P0 zwdNA!T5&Z!{x+HPjX@aV_to1c@aIbfpM0|b$pmOa#Erhy-Jxe`vZHN(3@P%f=lAfrTG-P4Cjw zIvNNUq+W@qdaHQDRlH&J8KGq0OvR#FM`m8X2`VTm)`%Zt5mEKAsT*1utf$-xKgKd(`_L4E_h!%gtSm7>SuMF6mfuSbw{ z&^<&3{Fql4l84$%lyL*C!^rW6hwOl~L+az+IpcxhRdUJsn7+Or8OJnz$E5~tsS?#6 zUc`Sr6UCr{NQk!5BE09y?nzbXaR{x-!%TuDl}9m>?N5DQ%#X-J4JHdviF-_auA=H| z48EU0>SXV6b^I8F)xq>`rKjqHQ#M_*3P~590lan*eTGhPz}D9~wGaf?5~O5>y`-Xu z-;bpu@Rp4-1@XTfkb`p>!+&C*N=6!|z|qh)snPNwagzt4Y%uLo1)|J&$WJkraz<37 zZ4%RGr{5=T8nUD2O8HNdNF-#t#)zYzbMG3rXP#Sw3^^VyDy?lGBEvP9eCq0#2lH0r zqipZ50+Zw3PpBvNE)T&X3J0nfRf|P)Nz06S_xu2Bp<^cn1kxpz^2=zc$sB`vegqT4 zzgzZMtTiN&D5Cs^c8N;!9i#EXtF;hT2Sbl*AePs`I`?1#2<@~jihfXBmJHW)QI0Hc zRbRJ!V=eX&6AUkrhc3whq3)1mNT$GsP)pGnMjtM(`c7qTWuI($j@x)JZHuETW z^ThiEeE4lzlIs5!n8}3}edP@Er{h1awjQB{#ZbLef=Z_y<}IHjE559H#D$*a1N~G3 zhJ!asa;2~=%F74Uw}FVrqoA?x=sC}>eAkDRe?pl?d?p3{gi{7j>DL>62FfrBCCrf% zB)qD+j8#yg!n>|1qlO~Svy5yXQ;E?TSFhS>)}~1ZnbaNs(C*@NpVyOon(X0pUrc?c zW4pPgNRe1r%^ZdiQDDMh4EQ; z)zZ5a;wp(Lu#hC65W=1q)3X(Gv67STlDg_eASpnGKkCE?l-j&S^5uYu6%y!76BR-B$Q30^HFybE&oy}!t9F~cOMbTLgc&1D9n$m9UofBx|sJ4|gv%{#0w!@duc0>yA&K7Q*g~f5?u9 ztM-Cws)`mOxX0l#U&$rZJkeiy95ptZ0Q@GDcJ$>A z@flzA=FwU}L)T>CuIhO-dnuxtKUje;Je5&0+m$3vQ3U;Y_D%Q?*~_d= zWfQmVFnAnCiah6)_h<#a^*axdB~LA)Y$}?;a%S@+Q*5ux_&M)xF7dtXQE>7;snb0UpnYWIjk@1R@aV%KNKc1dpYl?rWqge1H=`06^yZ z!XA(X5JiN-PQe`f&nfi()1i-ysF|9{1P$>S)>1F5hmizs$qzXB`_sSTuq~r`=!7zh zy|673{@4ydU?tGOB|_7Cftc%1ZNb-IB42|T(Lt7CpmNf>4>x|UNwm1oaPYJC22v__ zDoMv%kSP-RY|{*K@FO(jKFhdlC!AZ4JYZTikJ0I4OebQF+q!XwATZ2; zezam;;m{<9ZG>qDbl?(xwd|}KU#6nIPi5F7A8}OUBjj>ZmPK!qZc`|mtxsT*U~}R{ zigTms&nlKLS1(nbVB|~^wb`_@FaF_!#bCc0siZ2nU}^z02YffU1$Xsi$<%|8SB4Ya zZEnEhD3{zkAD&s%aBj;EU#8#nV9)DY>zz=4S$a%!(D@1MfQ;L&7bDh4u0}w<+-`9+ z$G4BC#kI5W`tl^6*0m{YNZVksB)F1LT$BGJ+Ns>@_4b$^jeNoJ@89)oiWj9_xqX3y zEbOqshnJsx_%?#Q7?3XK?~T}HbC(aXS+8l;RBRsb&aEPkTWgwwk%!qSb0QqYuYr6G zvcl%jlx^s2p0e{^U&eH8Lm`ubgEHA3wt<`*{U(JXLHQ(CX@n))(XQD2@OG_~qCq={ za^Z#ADk52LqT5T!{p`9{vxWk&NR@ zP!d~WyxM7ifi>QG?3p%)#aMMVmsTM(nn4$HA%nC1{F1_Yb-1O!OkE}V`R;J%Wjo|1 z9b}U9PH=Sj&K|}ij@09kXGjHqHolj*$cpA5?|326Ds~didih;5+XBIq$xW}^S^*Xt zk1v#7ck?+xuzVs}M)8C3n)m7tx#hR&%QHFBr+V6vMQVajz~=kL^ku=`N(`_p13{m# z*^blJ=L?cY+sf0Q9=RMg9fsC>Uc(Auz@r>Tvh@tqEbZB9E@h`#b~ZkK&+9MjVd5P> zddsW=UOsa+yx0`9StO;do6x{m9Z5m%>JwdbE1Bi?g^@575^?JR)PUeO=%5LVZ1&9@ zMoi@xYY?83GZ?5#i-`nB{hp!UUD_1=6!d+pFAQhE$#&%~$Ywi+2JS!Vas5pUcOJBy*BgwL_9>%J3Tls=?oEZA{wGhX=rW#p& zDUlv7B)+}&JMuW~aysQA7;6s&ipC>?#p9v-D`F2N5ARxL;xlW_)CL0scdD&}+d3sq zggsgb7x7JsGY^52s^WiBs8aGB^01O18L}EpF-HN?CSzjtd|W2_TeFic>r|_w30d5T zwS7mK*n616yC`co{ki$sZCoX;7c+tD*7)QLo0~Jsp!a`R;*<1nALOdGn7%G){Jit; zBH3*1ZR=swagZct2@&ou8s&92ALU1k3_dRVdExQBPERHqt(X4hn9F*>-$wtDeBzpe zGvw3J)Mxbe9@}}`Lz&8`XaOhH(h+G{GM!?5Cg+ta)!MQA?ms%kvp=Irb+{^LJFyFI zD1_Xn4TMkjK?lJ4rxm{78)6>8YUxY(4O0ueopCl9cb%EB(wHT8r)-6>m1A?c=c+^Ue2buH2_&-ebeb39V=0 zV=M>KE0Q1;@VmMruc9+Z(H~YrPa7O3T)#G*B4tDwpB!&r8^uD@+jfqE=g25S)Jf)V zYaLc;ocb1m5?V934P>S3=?zRi$EV}7*w~(QN@U5vwL+&nCSeO{jE?Jv72AuoRDt7L znilTNMr*QN(2)8cY(k9b4uy+#5&akJDX(2{+T!Id=-9+hFnWE#KUbmh;2~4(xTOf4Gcn{8XQh$(`7iViGEvrt)f*D6 ze?QI<)l=EKmZ0^t+1KC7l_=$&qeL{5A#-x`ZIF%A#4w6P$YxX79?+7Ia5; zUt@OPbOUR8DZ>+;qn3f0CH!|U!(?gSTf6@A%YgNK_R8iI6k zM8U>+;Noe^I)U7$oraqeL7!9|D78Inzy$u!&9Z#`7PP443lPb&_j-w~c1+Wbp zM@~(j=W~Moz6v}X1V!@HDvQ|xL$aU5sCr)}e(?(4Uk&H-u;vW}SJ@av<^K*2nryjT zR6I?&>K0g_+4^{3#wXgl?q{PH5bWfOUVNrExdKZz5}@Z`euHbitZOfET#!Qh|6R`JVuIq;2Bc3KK#`(TA<)37rmWF`rZt9h$*kY-ed$M>_yem} zJ7V%EyVC8Hds*Y>+d6Wb_2+~rMi#;Nm1|Ox>QHT_nCpmybW?86g7H|R_I)KHE>DS= zK`QfmS5Gark+fS{@T6CV6@{)-A-0+R58``_Tn`sP7hs69L+h>syqq`ugA!6T^VKXi z<6*9#;e$8ATnB2xN1`+l0^$`4e`0a7a?DXM4AI;>e~C_uCTX5)B&U(&=KJ3D_B}Sv z#O!L#O#Z9uSS1?i-W%p17X6cD-ke<=Hu|V-!RVDyCF38v`oy4m?h{XSi-nkMG^-64 zbMGD6*SnsZaS~@`!h7d|V>ScKX zeC4BzCVIpO155-aPF}7Z@!xz6N13g z&-nCf@l3xa#X)+U6;yM^{U0)E^#=5(OvD}}EN>^CXD@oO2I)cw$rq~U_a8r`_gEKr zg=n^)y9MA|VHCCP0V{{=9V9BFVb|&A@)4$oVbE55+T^!t5=ix*ALKJlvuS$B1FR&C zJI`%Txef!~{>9-|GV5)cf)iTt7PVqa3#)dqnAvc{qS5epxL4oV0b5=>c96bPzxWWG=~+9vaHR(-$q`Oq?2MPXBw4EkWP`5-FVg4 zC}2et%}~qdRNC4oc)8hqF2WlBY%LGtYwUtkl=W?$W|pVpWWk2Nft{20_JH#Dq)Qx} ziJ#%os=>Ao_2wPaju8uh3gN?8lJjr_u1WwHq{2x`jh`AkP#0q!Nh+ubLKI=vWa6`|Uc zuL_BWZYxRYC)7~ipGzrYkb~SITTSP(xw=o6VW3&wnUYw^eZjxe{uOHkqs~~Fb2f7c zU%v~q?*E3z?pK`Be5U2f7(QBRzHDjdL@|LB-8^f0#-w%X(>t2yDNXoC$D?@f74Swu zZ`wm5N#i~`>KP6eua*{&JDa`?0N-s*_NAnRsK(N80O++JY;| zk)gtvs8deQ_eH$1Fe|IYp-~~H>m$m)iUE(L5VZ97JWsXPEZUvN9Sk1a&vr8zX-!@w zJSOn^`@ly~8Ev@5Xf(xS!c3ew$Lrl}HR;h5@dcN*{=rBM!(%a-N zr6ZRC<6zY;W%`b^5%=G9+k5ZP}t*j2(_sUDMHMK2Dl58K=WTo#vn-DW|vGOoBZdx6P$@ zgX$;m`#d|JkWXPEQ)2e2)s#+$xZjIBle5z2J7M*Iv*6!F+y@zD34)Ve9?lwDJGniD zMeI`3q3VI@-5QP_jb|Y9)uy;@X>^KoZsVC>RFzM)M8#ov-K*$Uw>(qz3$W{?K4F641jCO^ncmOaKBJF}GWu?5(|7kSflw>J*;k zZjxkfTHOi1<+qu?M!msk@}yjr=Cx)9Zu_lYbjpce+`sJ8d%0vt?9fJ!LhKfj)=yTf z1zrTFkTWRli{T{cuoHOGI(%|%7thZkOqM;D_b)mT*LuuO7&JSVE0n=Ke~`t^BFQ-& z|NM2A70$A{X5;TRqrvVUAZj;EH8{epR)9I~=1DKOq7V}J>p7*J9LSUJ#oaWRaA+%? z`D+|r13kc-1rE&$F)AB_ZZgnxBJgdPad4m&@i|QO&`E#O^7hLeVO#L9;k@lsxrKn{ zh+w?VwYO(+{Y3(Y+Zd*R%?Cj*%d><6{Z`WHuOw?5QAcw&!!J=j2oKtZ4c*OO)Nbiv z@tG5Xlzv6{fZk?h#Yrcw$m(?!+^qfvkRW1-wU!3$gyAVotDzdh;To&u(M1vcUyW;5 zJa)3@n95k@evMx(7LRQPBv>86dU5d>%=zrzp&{e2` z$v_*{noOm8&Pr`{VbTQ;@r@tMd+H4PzzByv%jL5wA3X2Puq^?@(Qv*2Vopx;I?8V_p#N3eOKv2rne-z8f9>Q6s)uCRMn^`YHMZ$wz)k=a+}EvdW*-K#iR<{_wT)$bJ(c{muuyf|^Qnu{-IfX>|qjG8tacZ90In-}*M@%wyU zx=Vf-`@uN!{$~ccO1#O6B(K0&5p1MDSCKe*f%*M!8`;XUTHSDq;>@>1XjY56(7q7K zI!)+F9<^C}FEIpZtDAh8hMq5T!wJ^sT;u3BJgK3!5KlZ+$k!HZn11mHsB%$F_^cq^ z;Z?de>NOBWB2=cTBTG~;x-Tyu*tpbB!nr`T&}-xj^koKOwhc9J36>+ z)+8dnr<*w#w~nx@!@l-dDD(1BnMv`J{j&c((Pc!P>Lz>N(Sbrh((MZAX1xvG%14wa z|8YV;7eyo~mDgwBc{bOavJ0(>Gsn3F+IysyV=_6@vVIyVjiw{<%9i=NDsH8{a4L>@bZ|YI`$>#?u zxCvOF`@bbC-)|k^o_LO&fJCfDTa%N|u9NUK|Z8lnj7cJLnv$rZ?RarhI%vB`f>l{{v zIX&M55sw+Eg%IY4jG8ses3bs&>VWqYlfQcMfKi{s!4YuEm- z&hH@0K>*CbE5%hV2EoBY2(Hr+)jMI@sis%AQnP1-%y2Cj0MbuTq3Cc9w6N2Ofq@8k8QP6p-e&_E&Y*1>c_Tu2-N(?AhGf12n zs)-V*yP-0baH_z2^w_ zz_N#K4&f;6ib~=*S!VY-Mw=~*k)+*(Dx`C$XJdA*{`X*9Y zIUh6`g7&7^J;IYMNcDT*S*%f1uqI$2SK1C%q2z_TRNAP^sfTF@zX(1 zE#})6a(JJb)_rX*E4Pc8j#eXE~6VtIg(n{GYq-|uOExf(?Ei^7td3W#9 zV{EWSha20ZY%^l?eI;RzICV29E5ZpmTrNa#FmYMTr66Q9JP_Jnl#+{P0DV0 zywI4Wra-|4%b@i|uPtE0t?`^2k3;E?z`tSBGLFSgg0|a z_IPd&+(`vzgcd#DY1$!k{3BEE;(@gg@H>I{0^~sNaM4x>uQQDxSo3dvKSzDU7li-B zNP{RYY1x0ua!g=%9Og23GrCHDmWG>#KQn2AU~1qM zBQXRm6@RqP==r0wDhphFcSIgc3NG@MF%?xkWLemz!j6-W3r$FBEmyVFl;&6_;fS^Iq z55V)cRk7^2y5_ny2eIIR*qda0B!T!bn-VN}T4MWBC^%c+{rF7pV?y4ij5;{!wuyK- z8*JlsG}zl$(0i+qt0I#g2e(rhPeqE+{DH762KN`xU4cj;41iRm<^3Jrq(4J6u;weYL=w*?~ncVnOS-GK4^WRLub zK?%?EgGjc0`)!z(B~z6~Ps@T2m7=ScoaYM$Xu7-!!<5ye5aK^?#KrCI zlGUWJPrm!;kyMm7>O)X8TRQI_d|-PhE9vadBGGMvI3>(C#C9@p5`aS_@@88+wiEYQ ztUh$!=zSSP%np+=^DF0ENRmIH|E@*xpVQ)Aw}&qo$aNu)jcwbYP43CeZh~%~w4=@R z*$elZF5KHSVe!@x3aK{I9?reN^=ZksdAkh+9(i_Xg`IrR@R$z@z_n zfdMkJaR2}~MJrKJB_&G-R|gkM2S*ZVQBe{{X9sgDTQdN_V>L(BLQVA;OW<+yPDD05 zAX(Ny1rvruMIV`0I{$k42jVAv!T{X%f?cbTosON8^;1Lhhfnjih*3@Jq0!~X~(_wHLfg5FhW$gFN zz-0|&N8Y}j1OW0AF#nGB_T6I|sd{>vGqxGYfZ?PE>XXdac<*C>rqb~%0I=igH~T@) z)PNVj2NhuVQAl|KX{isN|NSw_ydL>$6CnS1RrA*Izqt`Fh;Lh2+5hurS!Pf~$7o#B z_rs#!pjY$V_SujB?eTuQdzT`RRWDEy@@cz&@=mUVU?veZ#CZK6PV%h<{_~A+o@`Ls zxJ`=|V^0~)DOM~q`j)kXEJ7raW{7g`({y)>{uM%Sivv(=EePhFz)-Gd0`VYAjiTk+ zyZZ|%(#DE3cX9_Qvw3ar4yY10DUnEMz!$GxMc_FiSn&?HAB z#(woyBmqa{7bBS5K451cETr%#47w5NYB-p2q!xKB40Zx=IgSO0!!vi99-1M+XCKGjJRS1>Cc(oc; z5FHWsCNp*JkZ6J8y|A2+?jj^cM8Z;9a#{+@QspEB6zr(0uw1YZAe%_0T-Y^dxknpg%c(2L7=9!T&>gqXU;?{MD)WNp%;fGHxw{yN|NZz7J)V&MK^4 zl&P{&UZ94`5%*2xXF;<{jdEByI{Wubo~d9gY1xvWg(>rRme`h$Ry9Yi?Wh|mL<(uY zH0LIcC6CgMAnx1|5JNG8N5UI5p{VrMUA^xFc%JTr8*QhZ)Ej4(eL8 z&9pw43FB}nGAUFk__R!F6+cRUZ2o{(zg3@5i>uIA^{tjrXH(s)fc>3Xss1BJ=~NY8 z)uMv0JnV->xr3Tev7h#P1eErG+<>BJv2uQ$!CvPu3A_nzg9kmS4Ps^J_dt$8s=BEa zA2-^L^moFJD1jdp1w5i`GHjX+D!0kzLeP8ZPEXmc3b2R3vb0;j$W4q(nq3j&h@Ih1XBb{)PD_%gk#z1zK%-Af{9K{X&yK&>H6 z<{!wi?#mqu8?>wi_;@f}$d& zl9fM^zsOXPZ!4uK<&)!+8=0D%Dx6x(;K&kSSz2$pZXRo{Xu+-BUxr$% zZnkUoHL@_qwrClu9=J&AO7d;@jd>SKGPBIK*Ni?vGia5gnl&$Jfo;*|5_}sT6(Jim!I&n%LB!s;SyJ#Ugdk0w`}&E?m?sOYxx{;UvuUJA3#R+XQksA8Z+(;+#N z2~&dR&!yUy689gEMwi%v4}#8ldxCrXT$`+$+6I$cy)C0H6N&>4xdxyuQGfDJ(@(F@ zSwL9;C71<7M4)h>4*2Vnmk()AtPt;-*+c!xxo~uTn=qzuT+q*;{l1^1mZN9!KS>`C z)29=rt&l)Uen*SHpp6cUq6YjBs6k;M%}}9O$8asYS(Y>o_t|w(mo2duu~f0mEDIJz zo*D)j4qCw1=Ia^pfaoqMl^cf)UR^k3f#$8!YH)mSkaU>=n+SQ&3mRI#(7dJ zbLpneCmY7s;<>Uf^FGhf`q6e0n@d7vH5mxC4!WwWdFuI{JlEj%Fu%}+YCu)-w?;P8 z+ASzno@=I6`*l%y$=d|#_l*bjHG$cj!mGpWgM3fdm(KMRwV1TGnv7mTbMOT*BO&cB3m4j`jGv;&V#|N7XxjIOxKhh4;kn9mxRvQtwG#bzE zAH>&~(x!lG9l_0_ZACr&t(|6NW7AW7LTbfocWN(coELK&O-4&k_OloG-klHZXA5gO zosaK=W8G`&VCwP<<_l)8(ytAVLe&vJj-OIr?eu;s*g2h#K+HkBLz5#lFSY$%Ae<9W zQ;A!oJC#HlA@2UjxpZeh&N)K zZn#$1?0sl5y=9H;aM_OHx-%#K8Fk3l$v3Tg)9QLtzqXIA*{YdY!)su7;(EgWku2{<({|z2)#Ppdc#NORHNA1y<#~*eq`^mxC8wc+PX{XRX> zvEojB@v~F0)8Ovwx$uhUM%aRo&d2)l<+{IhuY3OO?7HM56exJ+BjG*{S@cU>M%+Xw zV(4iuw;&JCu8{Nl@mrbbjOh$jF7`*^$3!(Y7L(u8!s*iVZ2D|L+D%$gkDX7+`$_L9 zZq3?o|1eSamZFqXP5u4eGn_d z$jC;~(9oE>JE8KqovCZs$zzH_Eulif&A=m>P$1EkZehWROPpJ9O9Smzv{F6Kpgj^gig~bv zDo{k;Kr#Aq)2kDOKbpVJ2L!4Ow0yCk@y_?x@8A3Grx7yRD8Mj3^(D#{Fw#4 zh!SMjTQ~P_qWG}Bbc@k|N|ME3kO-f#z`wW-&a2@BMTKfQ>-xfeuVap-k@8I3=%U%= z{xt;u%6psuMrj0X@Z-ZP+mto<)h z2qYWx@~df*p=$Geu;PyMjNsx4sKOZss9-NwcEsx+eM{_DG`m0=RhYmug#A7E#`lEd3`vx zeD%M22*l&LiPOwk79RZn3`Q%8X8@*2&9P9W(~R)8?o-ma&h$w-Vve~6P<5o$5Q%|2_S z6orVm8E&0rbZROm|IAQxP7k*=0VLKq5;~TkJ{73GA5yEeFg~3D1{DBD16gWioN4Y? zjGLUCo(i%$7n&XVP)#flO0Hf`~YI9IRlSi)% zr`ry`O%q_2*iArr!5Z-)g&O_wgM|rNw>jA&79}YeH7Exn6kWQJyAw8kGvZki)%YY>lQ< zBoa0skyxEW+uA{Fz?yUl};5?7=h|8;EPxW`e3w$c&1Vdn$`s=XOe`ZGi0+k?c{oolg^ z0ZLB6R;j87mcSsOQ+{8G`4^K$EIl;G8;S|y{YGO<%{u`Tw{6a1EF&o}Xm$*3k}!da z_F@fOCCqZc&nZTDdn`oD*wnh;0um$ThRuF$lOhnVezmZmW?*1wtzHw#qzw@k7w6gE zH;cv-$ZWFFK!;oDG!PE{il!)@{+XfZWZjs8P28RKMd#aCYP7|LcACrH8PUg6N0@d) z1AZlih^#F9b#WAKq>{R}jPPJVOH)R3v80nY=Du?9u;|pmOeI0Rn zJTgatRdl2>{|kIwzMllBm&FZSF>q-rnz#inOIiF+qcYk3v{0Cu`ETsrNQ2iYfi%wK z$NiCWN}90<{Hx!-g_rSHDW#9!pc$h=Z`~f992IgU^ry9NcX zxhNin%ElGB?+~|s&N$QwY0Ewzu|2KJvmNO_;LHeiCA!U&u_X-NV}|Z4X)8z9$dnWE zh0XXHGhV)(LBD;J+%sDu)ES2*M&gBX4tk8p)_Qx>CI4nCZiXaxw6eA)Lk+>v&a3BWLKcx@-h~ zb`706W!CfscP=ZCp0Tu(J@Qbryf(T(^kjvYGoF@Y)ZEJIk|g08 zR?z8M0Kh|c3_N;qT`Y+IP3XR}x*ltYO@V|X-L z;8B*R*y&6$CEuad_A_H~(bsm&ZBCCrvkiNyjI1r8Nhi~)35vyQnqLBoqyA*Wj@_dF zw<2G#^!=As!j9#7C$^mH04a*(*FRrzJXQkgNkuc5J98myHV;xDB3al+3gBjsbH2__0!P62C=nT-z~9vK0} zK*O_Z7aToYGABdw)0Q(*8*F2EaUBsQHgiU51lqnk@8xbMrX4Akf#F#5i{~_>*fr7H zkBu`sY2#4QcNfV2fsojoZN|FaM(FsIa5NBjw$d4S#nc&ntn{?9vL4MPSxrBknxk+m z)Fer=dR3LoR}ql=VngCgXbX36n)l)rETqaB#K=&g5b;9HaJ5onPTNfzw0*Y7VSHp{ zA}t;4Kw5vgCd`t-3#3N8kB*eoVgwT6{A`i={F;(CFYLX%*^1Gfz5(~{o;4lswN=X_ zR$(#>HzwkoXNV2NHD>k?CQdz13m7` z8t7$=mMtFpN3=HP#K+!rDt=b>e!I8ud%nfQDZo)!@nB5nOf`b$g#oo^xDS7s%tI;V zVvI;lE_4$ZKh(T1n|rfqJ$@TY4zqRa(EeP6=YI<;TQNb}CC4@x{?ZU;@&zr4K5NS- zSCYslJ4YKuq1?aUX50M8`ZB-w$9^5{lAIF0loIFlYhBM{dRp?x zUiX!*x0&^i4sp{4E8Y%0JoCJ1#D=oEs|163%OS8IVaOK7;^E?#&CHjRbllzBcHM6& zTRRKC9WP??3=g_Hv^qVYi)K1Q*92KpZptC_v+v<^55~$2N?GV?ZP|p@v{5{?cM0V? zZWjjQQ-y!FJ8wKIL$1a2BtKf#*2B$$Ykdq z*lc|k1YvL=#^3@WP>v&* zGr^P*)pYR1@8*m*G~1J{MbCp1pR;P`*o@Aq#|wutc!b%^27RV zgQ>2oA*&I$L`gbXEo6X{Y?e8c=7oAQR0K(ZUB*ybD^;EXk1}<&_g&~6o2UkNAceRm z<8~a+^Qex}bfV1VT;0WRVPgH`&DvVAD^TY!uP;?SYNeG^_PZ$J#k70t`;tGE+m4-& z^(L&GPFp;~Wuu8U63%l(T4@BX=}POiC$B_KZ_1K>q{jed)-?=5@NT*IX`;n*&ATj+ zzI->tW!iZ2x{UcoQPzr;fq-tJp88_Hu4VDpsb@&kc&&Vrr7~EC-r91vJNE5#`e^u^ zvFQ{E6~a{g+4aU~qLt6t2~YWb&CMQls;c|Jl+SKr}Ydp`|6f~YlZcfYnL#;tqNl*OR&zur1DkO-tIZn&b} zGG)!+Pke;@{iYESv_iLa{_1W=0y`$bNySae{ijO%y~v3f!<7@nv&Z3^*|=O``FS$? zo?G#ULCTeC3Pg)gmN!QI?o%Xv-Ig#woTU?nQ2Yy@!G9pN(S)Owm}gdrWE3i~>d<%; zK)JJ^H`Q3_JdLkE6`5*&f-WsFBKI|3JyPzM<{ASGc%Ch1l%2K|?ynZa3JeK96BQZ$ z8EP2tbvZ0jgyN9LvGZqMZ*;b!{Tz#rK|Jf{$uF90jYHHq7lTd4YN?22B7|RCtsZb9$KjOf1+c?!3H^F|+4JpgjX!D| zvzUB7WCY!m6SaV{F2m$IBRE2juGPHWWNx(b6D^o&uRAZ5vMqHr;Fx`=C2{{Er1Ly^gemn@QNFNNjVP_I} zpgLW$B~@3FnxnHQrim9$o$lg0wzd~nQ`<>D0`>ea=aUHLlZ0&&p%UC#uaO~b}6*Gxs`_!Vue0Vw4EX(Fn%|icNkPx;>szb1V-z~B1)Ch zv3Rqr8f7Vyfq|vhu`!Ll_Beko0i%sF zx=tZc;M_I3Z`46%R$W3C0O!M-L?x=&8b71U7CfAGv5)=OHG1I6Gap1BYBJkl!4SuP zkM%QGoZUFl(z>j+5sZ|wpV^538ns-P$%}mHi=;G&70DiYpqHiLOz(p?j-M;HM%No{ zp@5S$f?_zHN7rpr`gfVZ-kOkCOhTGZa$GJCPVo8=$cQ^c{^;m}l3^T3i}JiE60}Pe zHEd?H?6iqMHPsXU!%<)@wR`&GfTB=^j6is%8V~a;Q{ufm(nuc3S6KQrDm1vHD>hS~Jjcd#rFar6Br=cc8G5M1(gdpW|E<7z9o~K}rvv$+w3Q zDg$J4hDn}FQswxMN8y7CepRL_JHWa}wVlMXm7!4xhs2R_vZCb9(3lf|od(hm&_Si# zT_+pb$<&TD0V59jwKt!KT%2#m#ei{f?6ct&dL}VW_8GwEz=HKZb`s=4G!o4aa)8lu=;_<^eU+AsbbJwEdyWm30ViuYe+z^U()A2y zCb{yR%#6@=?6ZoFX{V1vI>}^gRVJaskW^EZD21>}_lcD$+GhKpq0$i{J}~T3_DqUFwN$aV zv>ith2L|)k!u)uk2N>IQSJ0Zoq~Tg<3cc2P3`QHA7d1xzh3*s`zD~MxpKWO*;d+xf zq8%>$UN0QhrBLo(XsqdUgmkEK$U=J(hl2xIQDM4@F^qEwYiPuNnbzmo#@o^^QDmfv zm@PgX!9-WhjU9pA{NUNHk<@shYG!Z>;3OIh)qV5B`VPv=7iMi-x_l$Mu=Te7=Z!eB!QZzsu=Sn>b*-NQWnDvyWJ zwi(`u{S*+!)-P=52P^ls4(0P_f>Hj_d}f>ihV?x{T!JR<>-lBtz#C zOva?;4(=1{#2W+`NO%ROKJG;mL7dl6Ac|3oEAHC-yC$VvqU*#;QljlR|0Y|vM@ zLJhzwD{FlHi-_XkQj{U9C23QJlSt@+j*0ZXZ(w8}L%N)wYSS#<+AT+l{BLFA6jPSf zdEHhh&6p7}4$dPrk*yCmY&?7Yu*;z%?RVxHgBbd+SQnoQU9FlqBTm#gp?lwNG+yCy z{hh!R`MI(yXVOQWi|{X#H#sE@JxbiAXyJK5rbNvn zS5{IIy893nZq0uISgsO3B||?zZ42*Xv_}`*Nav`QT5b}+EY;ek>`cyu6m9af92+r6 z79Z3|7arg5Oi<4%w_O6GW2jBlr<}Hg(Hcl{#ZSQ2+iY9RoG{-1U9X=E-aK55gt=HK z-#}oHUdjVpF(@Uk)g~%HX_SPnsI^*B%(T`vD+HmS6M>YiMJsvSpAZyrNfXpdY5fH_ zA#5CfE$6dU)QiN7nAA#*B4hj@Z>bIjLNaw4Z6&!92KHkun}>U7?35!U#P_n<*5?La zTEN01k6=B8=Db1TCWH>+ zmpqmq;+*+;&eDnPK3@-+aG-|0ee{GJnWH3cQi%O?_TbrUb#E}-*Pkg~=cqJBdH&!K zb;pR#xNm*PzR>j{ZB_px@>c7x))o2gLmrVX0>GZ&&;rRYfyI#X0p&En+K={G*_p>{ zUt(O~Uv@u}D%PX`9;-1BoQ8P-bCTB&j?#}SOS9V0T@np7_T<;ke{u!VMOn7b`YV+C z4S6#-65)J&Yz#GhA!ta997zP~W!v&UPkBHl zUT4^PWI+(ft$6QZ2GY}A_VmNABfKQx{?jd79n-Xq)$j&>_x)S8zu4=;KG>TCHIDyg zBm{-56glkQkTOf(eN|*AK`OLhN88o^C!+ZGB(_UP{G*oT=VQTmTW$XNrd8(urGS6U zj{iU7|Nm`iaL51kY2}X@(LWcqqa^dvs*P>6972GI=ez+e`P~qUODFIaJjm6=|+mN?iCai|{82 zL^zV~NZ)$DaPNWTzDzmaPz$=aAli+fz+IBm;(UOvowJUY{es75Q!n?sc%hZ0A9g&4MJcX^ZL|IYj9z@EYXouH%uS&;0@3VWAc&RuB(PHeCp z&UV?+$q8vnN(kBXs~>w|Cwte1-k{#Be_h=}#MTY5&^u;UAsdg8+SsRG_rv_1oBP~G zmM|Rr2q)?%d>HLUbFP8^J3fEwg2maLwAk9x)kKYd4m4LW4!;#%Q^Mzg=M2^H$r%}g z-QVL)I2F|MLG3XlK!Q`i9eL~Z z(V%u1Z{#jPJ!JB8v%BqDfp-^|S(H09_FoWvc$~haBpgG4UAo`27!=6=K4DDcejAv?cM>_@DZRmNvvo) zqWU)Pepytst?TD}Xn}hph%LLq!E{Z$^+`&1DmX#7)s?xE0$$?7zci3`1F>?rXcl+d zMZ7UBy9WO}`qN+^zh$zF|4qnW5psp7nbBYz&H=m&492-=D);g;Zd&rSFzk8G-5=iK zGo0A}1H;<*FAmsyChGgViMUvOp%VHpu+iy#RckXXksjNw&~<*7*L7Qkg!{xV(2)rOANd*TQyIpev#;f`}owVEnZmbZ6spgHF(k@j2n%2ezg z>P}=jpGKmUnA%RZGQ-e_E_EB_mhd}Enq)q$pkY1|s0{*L zp7jrq5g?fW!&4VnzHgdFnx!7t*=RReQ49Db3l~wd+37;C;D6(+F@4X~C=3oYYP$II zl?eflE4ZSlGM4)&FpD%r;a9T-`HbKVxWx?KjK@ym(M6#o6_|LtC*6dGT|P$zN~);m zJ5H%Qu6P})#n3pWt^HZ)yumR147XgKKt_9pg|p~BWMNU|l{cPt-5ud7T$$rZ)y|-8 z-mrY7R$U3Gui=2Dt(&07g~>*<#!OQ(Q|TC`bSiy#d+zaxBve6z-k|RX15Lj@d{i2f z*&Zdev$1b9$;$W-@yj`NUCEODxz-xkN@ohyQiXh8^Y~+H^Y_RU*P$OkcmB)=PT^-5 z^O@|gX21JUux1O%;7p970c0hj+=s)8EKHo?p>HqUtQ%voF*YlWEitYr=F5Y}a>S~N zK8MyC_M7sG8bP=P=F5~1h5lx`R7Q zsjNShQ=AX84**&P&aFd)B;<6us4mC*j{bIpJ`ZN8_rh+_{VcJW^TLqZbt@av+%?YRe`CQKE85%; zQ@Y4qbg(sic_>d+cZd41NBvmWJwayLUMwow_NHpEH-8voGNAf+rRXjY#&aze`o&wj z;~B6&U%mY*^om6Nn-DJ?#9Z4CQd^+?rqR)o;fG}(|t}H%ZY*h_5~ZS=Nq=c z?#JS-$JvU3v&fWRZrk4J+ig;$zxN%o9L+{wp8Y2na!(sP>USw>0X&871P9*>R*6(l ztdIYh&P;uZ4a$Jx!LHG(hxId_Mzy`M{<~CXGveDzW!}NmGLCs{1$nm#B46Ty?lZ{Y z<~}Y*%zOsV?{+3{pTnKGp$wtKVoj#`dz#}AmtXHvHGgg`sgg`Va(`pNW3RQJ+ZrN0 zvA;me=gn*OL1X<@!P@h4mtwt#fj=>AMdv_G*&JX+ zUWllBH&$~yvqU&E%|*16_i_I?N<+;yY;Usna?V}EwC&yUiEn{G$7}j$6(tf7wM$Cv zJbx%SB~}-Hd1=tM>fSuJ+tFz25&ZeKtGTSi7VM;e{Tc)%cpvQf+qGv9x%*vJe`7h8 zl|jrE27BWLvHSiSedT(N_-U?ZOK~9WW6;5YFL!x!=Sj-ix;&WX)z{qFL!zty+q>O~=qY|UaSs>f)7Zs2K`FzLJF(tp4Q zIUd~Yr-97l16Mc*;(=%xruWw@`j&ff7h47uU0)-8JR0RzWu=@Cv5va~l|DzT>P*&D ze&QQSo~qn?yfs3BBb-b{c~v2hJtXdPTjB4Lr75qzA@n>QU#=KO?;kjP;2ZSpP_%Eh z=H+d?Lv}Pku}ycU&iEa;tb0w!>k9a@T3@d5-)-Y#%n0Tw8u$~L9qa#4cp`h`e*_h>+*^IIQt>>X>S4@s09-KUq-Y>=`@nd19dR#u&m}P)pWSQezH1?RmcRd5A=p z`stlup+U@TtQi952vMHxid2R?UVl}At<}a9W0Volk4^Pmb$WY|$tP#V{{&0WZRPm4 z8Q0Y>fw+2V&XhI#_RNYBL4@vb|DId>kLOf)Ts4%E#=`$(lpnd1p2ThGMiuU!Hs0_b z7Xr2$i~X(eHGA1s!CLQUzU$XlI)mnV!%IES9E@3dlR;Y_;oh6eB96(TEmi|wsXt@b z4p(j3_FeLfu-3GnE?9YWYqMd@78WqXta*+LXRh*uK8Oz0E)K85a<`}Sl(e+uw9UTE zIxCWrgFS|ZB zSf2=fd`r%n$%?k4mB@94&HFgRZaYtnbD8pVf#qO42=vaCjLn#_<1&!bLn$*|rEYzH ze7t^^Jyh0K`)Z}l1FB;lUmMH2=m^tn!PR}Jd364)>7E!%iFw=U@f%a+^8x~E3aiS) z`}>`AUl%TKpHHWURWXeGKZwTn8`N|6&zqM_J;^Koms5e=V6y-84o)zEX4~(dsGvu( zT(3XtA|{4(rDA*jWlx3xVFWYynlerTpuAmzm6Y!W&Kuu7w>Ykh6$L`-=o`$$MoY8L zP0byChRC?7@Kr(0JRF_amzX@_>3jIWZtT#Go1yV(M9+8SRRIkLYkB+oslRcB9-I6~ z(9t*YpCd;Lw2R6u9Fi#E=(DP4rJ(!?@L&R-!1RCOHfc<}e|JD3kc-Fku1=}_UGm2qSA%QRQPG2{51 zEd8xPS|)`8g{o+#JyX>j$zq{2jRvlUbT*6UgtIGJve6A{Nl&XE+1?*Cl3P^iQ$RJ)2}qd$Q7sOn;|L+)un7sqwGmw&o9i2!T||dD_8z< z(GBTc88~cnQv}OQKqf9v?`ziP7X3;3H4;ZQv5}dBs%JJ_Tz03`yKlLkZ7G{w3|gXg zL2{9W*SG0x4p0MhYZ(F->~TV^Q4l{jovHGnNj}mrS1ZMPL?qeH#st3*|(hvW5&lagxjC&lceerooV*4WU%(!e5@t zD6YDIWb8IYLhmA)=DYUP@9;)HZE0jBJKfbr9nNv%q@KzdTl@(Rq-m6PEsN9lW`c|i zkfQ}lfHTkY$2v6d!ez6z&1`w~IOZ02VLEt;nkl5GkRtNPZSr2D!F5K$)^jC5KZC^1 zz9V4TtV=-T)4|1vKP@*2W$x6owOfy)2U69!pvG~*w%3bC6A~6yT0v(aRh7)+_Q@Y+ zPxCZT8!{L8w}hswK}v+QE3@GWQI*=P|3|!^LloXPwbQ|7$VJwolc2pugcv!f1{H^t zJ2AT*4yRyl9Md0@^fuBX42+u1`#{GRK|l8QMcd1@4%L1xhj7xan97M9eThC6W%#>n8!B z-3##&pZ%~rW4~*2zcxEeJKPt8Bjx=XeP`0j%lv(NbP+>12sNgfjcY=`yI$*3-#3Hj zi~A8&iG=2&WtkxL-epe<)~;@x+kSgqR#d7q?z0Do5GzAT7X$7q=Ok46Js`0&3`7CH zN_F3MQq2K*6xQ_`R~jk~sr7_t_#dL&?oaCVd*^Vbx5G#7B3q`OjoNUC@m_XBN4+`y z00iB52>l2Ym;yj>P(ninhab0Mw;$7E6V4q%?%xU`YCso`MmWi-GOsaS*(AQG6@B#5 zLbQPpq$HvT7nnfDV}sj}J;et9yTR5W4=M>Fb0VEq=g$P`B9}|}mWG&SeH>gkOM7{v zWh4n;kP4hpdNJ=e$0Rh`UDxK3>!0JglGz{cSP-nWfnN&)l*;34k7rjGWyXUGyIIQ@ z-CGYYwr(Ci`h1>8@=SbQPtSDgqB#c!A?xiEtLW-dwmxZs03oE#TiONSWTk;w5%Z|f zwrLmDjJg9<8b@Ds4Ktx6mPZZbo=D`XiY6IRX-SfV`+|^DCAvV;)>K}DK!)N~Lakp*1 z;5hfJ>D-qn&;RHtsSqgLW8>0Putjy9(vV|>K)3J6vk!+ir=7WhD6D`V zU6uwH%WXRicUb3)_e%T0mt6hL=~1?t-J4r;G<2x3pANU9!T#G3LX6wlGckRQMWeo# zj*tF6X_`4y`o3jZq_@K?KE|l_CRpSIOg@XIPu z@9KQG(V(T$@3)#iF>=qYp0?kmA%^uh#^@3dz%UCY7fezKl@$*zlcB=uI>p4RqQpSE%{Kwb&TEddXtJK>ZD!84m2PWS@z~6|#bbd{+Uz5hn zs-TfkMn#QISC%tc2ARSyq#(Ia2llOb2qdPepRz<(RuBosZdOI1L75v^O6EgR#5~fc zRHXCgF@4qs?D%_yEN$vd^fM%C?E|NCgks}O&=@KUjh-BTL?KPT(U<2Kxvnt6pB;TEg~*BXaL@8a{5G88}QOHd~B=({WgQK|MV^?tAnMg4kO3=Tlp0 z+0d!)+{b4;+5V?oQW6(C8R9dJTX4|xK;r|?GPHV9m2c7mSE#?S_+Y^5>S^&L5XwrA zM&nIKB5~PmG2Ff*3rHl#U|&t2)+h@Z!QIkY<8b?s&+PA-%m$S7p6C9yo~ z;doUIS{MDXA8OUy=0jvT~u*re(Q;I2$_E}>$1DQT`oBZDlb~u zhm1?ln{o`=z^o5_hSkgzH|bD;R9Pu>N7!|ppRxT-#4A^C{FJF{cyMo6RhKUWbwE^2 zte07a`!tj($@yY$?2E%~|1iwGOU)m6u8qk%@TjI8<4^=*1wCmTi11VmR?}riYgtiA zISiHo(C-)=>CS4%5rlvNUVQPW3SvRHvijOjA~v-l+$BFy@--ik|2aeM22QEpG^WqR z9v4f4R_*W<;yiR<)Ma0>i~WA(3XH$ciyhJDo;CeIf!`a=VBr@vB)+Jc4_T&1!8;5( zY<^jpMaTV!HpP_TTyI3;6<4OqGu`2+n!$9gPYlBUuu>y(mo05yN99sICojT|7|Kbo zRT=|AQV2G4u_xHb5`95C8NxV#^a{UaTSokMkn+Bt-_@eoS}ft&7H`H?yc1+-pcPKr z4?yfgMYjqp$pg{AT=8B`qx;?V%eELiO(i|GIX(q%rq!i1YBi3lC5}4S@dan*s<&f` zbX9Hg%?(;%EbIyq5_?m^ji{QMg!IUs$B%&aKFnn)m5uYpM)$pO6wIcDWbDxE-5mB7 z_xKwU44UG`&g{Z+-#@a~Y_9B=WgJE-%Ie{hrBdd0)+axl*948z`AAk)?{N~^CBTQwk zax~d?SI+Y?a#)ZVCAV;Pb+V|P9%fy9MA}hdQ&*B0Cl^a|@93}Dg(yA2@b(Qo+4`OYxz>=?6F34PX&VzZtFrJPKV*!t0u(!oVjij?yB&cQ<%Na7psPK0 z&gO(W#J|4^!LSNYbm0U;Y3|^}AKR5R{Y)yhP}SB1PFR@ZK1G~B7g~C!ti#IQo_aqEBUxQpRX?C0)AKBBYfs3(C!S}^H{QR) z2W|*zo6^e4s)Tyqh+A1kW&%hz-qMUv@7mHbH=889f;wJFM-vf>^5n|FF`F?-5`*(S z*gBji^dsVbhX>7<4Lf=Mj~fwe;UTlv&$4cf+~J zBi4HNX(5Fi1iyQ^I2=^1M4{dX`XYkAB(2S!c?5z&$6Zpbx=|44ujYK43JXqO+tH_WPJ@~jmNTff0h%^;bF9;h6nVjoqUnG+5L4RPhuazu$iDNv+9tnUiNGUmSW=5H| zUT2Y&Xn%B!(5HcW=(vUO1dIRVew|XZRgh!UH?br{B(J^D6Ub5JWp77zjzd}3B?Ph7 z^f`UqP3xSYD#SuG33eCZWyHnVzj%c&@8&{ML{xlEV6jy+`pb8WzkdHN<~%>>^i!1g z==Rh(ThdJcXL9h~!Dc}KcKcPd@OS8|HQ&!Cm%r%o@_PW2EdHLY+aRx6R0a`)Abi1R zh6tRCro1(;zIL-NOL*B{^228Gs>M~lH0G_f@|6uAC2bKoLmXdIJ$>CD-@Qc4&g{CA z!|JeNZpf8sV$K%^{|jIX(08xhSIdPr+Z&^X_rdxRXZ=D(TBUu5No0zMy{b~&z*pyk~q2cp7=Hm`$DX1Z3t&RuWqrrBBeh7y7^6-|3PW{)H_!Hg4xrBKu*I% zdc z4PnJK5-4iTCq9>5?QO6{rH{!q~$GB!hyiK%m{IQF_@+8u43g6CgokIYbY_ zmmtTdM3clH?D`ht;5pqP0#DYcdq{G726KG;pBnMUFAJ=ySS7T#l|z~a0^h?nD-y^r zJpC+iK}m{^%l)$xe3_^BZy_q~bl<5RByF(H+YjG*?qzvo>2XQOAUp~#Jf&zq5%~h? z5y>`s3%$2bd>Z2a_d?zQkkqNi$8X7ag470|v_B*X#G!tAuus)8QmxDc9Xv^Hh^Ap; zAL&+n-~OHLnLwaOtBRI&i?L?q1Aqtp2$c-!CKe4)WJ+%tZbrtGWk;oeVh*5khE9&*B#FH9S-AMh6mKcDtGF zOnL~Cl6e%o_XPRRc2#)rOT?1b$8_HTDw|tR@S{$^NMt9C>B+bW7qu;Lk@w^ckTeP; zp>K_ig=m(;Ur39W9)=83;%#9|`1PVbx=jVyFmK;3+l?okmn8v9GPgq5S^=LGXOJWt zh@V>w45E`$;gGN46bCR2)W`y8y*-IPBb~wK17Jr-93u}`c0s3g;yN=AVDUP?IvdGo zF<=B4AABB5v>Pm!BT8{cAG*c8gU^AXL_UcMX_HYn%XBKPR#f1e~XJ5Fdy%;B$gD5KIq71DglTBF0Na*6J5 ztCiPxnSybjSaxRIIaFXdOtKK;w9d&h5d8A9&>PyflS8udAB@KqNwCIK7d!<~)?XSCIs=cMZ{ewoz!>PaOX zoY$3g#mhCm>oGmj4+tP1?wj`tx3$Kwf2U^*5&_uOi0y1d=ETquwTR?$1H)c_f#q1o z16c&k5W)2;-a4qeR8Jzq1GiUjlL+Z@UyI($9E!qt{en}Fcd8{-Ra;%W|1#Nb`*-JQ zYnO~ejYl_~!vv1Aq>Z)4HSMIeZ~O#TEXa`Lbw=Ya^8g0vyjjV@*B4uHV0s~(f5^xV zY?;lLRUL6=tLYL6F->zMiUOyB$-|GNfWYHeqY(ffIP`Flk?dTXKP>z`;VTxuZ!TyC zi1ijac2`eK(Nlv0A+c(|!ajtQci=s#!*Nr&y-c)hPge~O7Bpo1+WEFusCKo9{IEc@ z-oMQ--q*Ua_;3cEbn=JaMM$N>a)JbgMkm1gAtzp$rK-p?=18wU9l^!?R)Fu*E(x8A zRLS~*EOq{gxtI5YXI$6#wp3QTwcrR5p=;T-)p~ z1)hr1wzE)8DskVU*C(7i-VwA{GEc%)PgX7{k>3stoeZJd-Zn2PV~uXjnXcyd=T|kP zX@2Gk|8#yG*JNwF^V~@Ao?|}Vu)fXIk&<@&gT*(}9KkWR9i$;JVyiFBjLdx!oZ0EC zlV_dIGS`>R)H!lRp!H~9v3|`?(2>4^+19o44A1@iG^xRqzP8Y!P5q!+Rp@}k2pwEQ$c^sq)& zhU2|<(EPG1mB1b6(1xY1CgQOnP1t@8hIxKOs=}E%YW2oe^!ZlpaTem`a?jah922(!;>nUE>i^vQYC+^yb)}Ux@VEpzAMX366*WrSf z-&dsgNM~!qgQLsUi$jfKOvf`ei~zB}mK2_OZ6x^i`J; z>fI>L=KK5T+UoHFo8JxIA!VdSKb;vCvUt!8l7_xHb39DRo5da zEp|08toJm>(+N{9wOqiRd2c)3QId_donQ*^RQ`k~o6xv_=Y7_OW!>$WyjZHGL>Y%! zC!Xn!6WkcgtNcZ_r@~_YmZ<6aCM%8jM+({?ZT`B?+IwgeiM45aIhxtn#;O{86mI8S zYrwkG6^{wYZ1Y6JDz70wR;us1GsEe~>!V*~8e+3UxUtrU1}AaD zEpbvrb}5q}_**yjs$t&yrY%nc@Qkjf@G1=_e(OQDw_Ojl^F8fLprW%LlxlE$n{aRK z3S_4tEOtUS*2euZq)17! zJl$Dk`S*S+bdCAhjlFvBM|rPx@AQ7L9Wk{x^|mBoPhK4e{8~0tXT7%sLrB7ZNm{5; z=DIl*SZ4?&zeOzHdZqtU(3z__Z)!YOaD6a7yaABRY?SFtu#mxv!yi=n5k?7ERdkw1 ze1sV{AV!UTbE|H$MSwQ8IsbUR(nzTEW3%Lg`J^l0jGFJj_?qS<=yhv^KioBX2|0J0 z^z~;I{Dw!d+>kRnm5AeAh~umJVB`zm)H{zwo*+@fV7=zFcOLKffYoW5sA5Z#D5g*c z0K88_+>tBWY7!n&!kf1vT-j96mDE&3zP$p>;GyI+zE|70^6pGNb2Vx@V(ysfUfbVa zcBTKq_g-s!T&Fsy+9`2&F&h`~$V*|S(i%AEc)}34jJ36JIcnr>#f`V-H%GrIArYQ^miEX!=q zDoQ5ca_I!2hKYp+i1d+ye%b`6aYdljplJL3GXGvFm84*^UxhxoZckNNX^msE z>d9B@_tAwCSR0mX|4iUb=^Lr9p;j0g^2!Ux})3YcCB{GG6aGu;L@|UJ`vdu+A!=fvB;^W9qDlTFk$0dRvxB zWvvN#XlQ)gn>^bSI^|w0?^gk$pKiCpmY^cr}mXZ84y_!HQX86z8C4UgkJV(9VmHES#G5GmkkJ=QC% zUSYkvGHbazA>3+zB>qV4Zm6>9IQ8~*kb}i&UYMyw-P}Xx~Kk)*MqktjE`ejk1vM$>bDoxE@oe0B!-4P zu`!`}zF!Zv5^W33rFy(>ya(>&tvvMdD^zj9wZ6U3S$Vth>dUuAm^1PRA0kn}a)#5E zgYLcvOdMFXXVw-*lGGlGpLuM4BfYNJ%j&#_GsDx_%M|R8QkXaFw)P$)OYa@)JTjX| z<&BH68HNt_EZ;0(E*oTh55sGIOf%;)Ri+reo1<52j{GFaalV`J4F=Z2U(T9o+lMvK z+`2vWE41_V(4_YW+9)pA;>!?|t4aN4&q~M8LFLb}pfBEoXrmf8g5ZC1S!S*i#?Nmo za^Ord?q69iYe*KUbfmhA-oq=dJG!pc#!r^2Gq$&t-%jy1vUAHL8k5^bC%v4Bf|54} zY(H;QTI%&I4=&yNr<=I{p{nb=X7Or+>HSPHo3p~BCy~X2y$ppay4TZ^ihLZTm?8}# z1x9wd^|c2Uy7<*diH1rbPd$k+UHR|!~SAp~8YGEtu z{dc!z>P^S25d_IA$Xi@}^jRM|64P~+{w}INlLoXsj-p*`eN~!`o;-`>VNYWG+0X%? zKgHGg9D=oUbAa`EMYhu? z>Rh66<*TlO=1zp0b)j?3O3om_1EbNSfqbYKq8 zWNAYxw>EqL!j#W0i#CBxR_|(7DFu9*;S_d7LKhX6C-Bm-vdVBrV71mvy}BrTYA^#K zUhS=wGmIj{!a2ms@<$&I3w__@gf4zp&W+UpwdGSF7}|-r<%}Hc?6-!=JzmG=-nh-Mo@zd z#W;Gx!$cZS&(e%hSMEPhm@n423-bOXXlrN)eER6v(OH+2afeBtXRrCw#i02O89<8L zAjNrVqiM1C$hk0mBx`(pl^9UNPVYFHO(suqB6vQ(eeIDcL^ zwA`O&D3$i(uF4`=S7VftqqDL7R#^9ofI|2s}oNrybJ_UpK zM=Fa68eP7e#^C4mKU$+0Fu83tg~>}a@XNpP>+Rt8b6G_9@Hss=U^)WhkZA_zba;B z!BR%o-5%ZIIr~(NH#gI-wedvOvMGLxzvUBs(uVYAshpmn_t66M!ad>{Q@8I-ekIq3 zHqugGM%0s)J@y*~jaBX?2BL6e48@_28?5%S-mi@{UAwtGp2M?1tAAnv45zhkAxlrO5)*cvj ziJSltnp+;;kJc^0E*x^j#h+1bey^f!C725g$DjqpEW z9;{z>rxyo-^6nj?E?c`Ow&P%FppT)q^he#Cgt(7^~ z8O{0iOlrG#VvDs%fdul#sgW#?IrqB|ZEAtZpJ9)y-RcNO7JB4QGTRV2l5kL4fXss} zA}7#}Q7yX4#Lhe(=e4!-hSYf-%17tO7Pf=6TN2UQ8(ZpfXav(;?1&Kc)cceau|FAO z!b=y7J78vDuF7_XW1c~#y0$1{X(xD-t(Cv2CdogPH`acbLaAjcctQt zqD(=3=9vn#pn)E)pU~c<$YxxGGoU0>R^VDmNlW4zmpJKqBrWg?0UGtXa!1iJJ8R`upOzLNUGz|-7iVm0I*>T zs*Y0t9Gx3aYiJ~2q=rI9Z@wfILOj@QFCA=ZFj3sg)ySv5L%AEh0aC6Y8RPW9P448Y z66PYsJ?p|RVkyk|#qUedN4mdOyO38C`tFg}1zsOgRp>Rl!Wdwv*P7$~gt1tLFV#?~ z6NcK0GECTe&B!dI9d{^y{JBIAd|WtI8aZ6>@awL{`|WA=&mO02ItU-__W?$Nn=S?L z-YM4`bFY}m=Qi?2Nj}^ti#yw4kgQ~v*J01p4Y@E10~EED#f0ghMQm2fmkvglPiwmzHLn29AEI|imF8B zMAYi(-Q*eqh=@;aMe2_r=BoyxAju2a`Z~ECRx5$hFACas(+7vNy({E)nma3mDU;%(9~~j*i-^ z@UVb!yNkP`SbUW7@I=Fk9{P~V9T};@@mNjNY_%lNX+4%YQh3FN3ewvtxs(YG?<>G$SxjK%7jIB=CS}2eU@mix&0;wyW{WEzsQapd8K?2RjfWkYu{L zfD9IUu~JPB0@PpkI%6T7@-x%GgXQp?WBJ>C6$||d+*>blzfv;3R3eLVNm8-WjF?%f;XJ+_m_`x<>Gz&B~NqH>N9N)YU|DeBCd7MJeTP%)IRkX)tZP*Lm3tqC- zM)78ZS3E+Jl^&!SaS>Z6vIu@&f}E|R#^U89<% z_jtyre9EiVQJS%gA{x^4>~cKr=m5pBG(S$SQ=j1{Wo$p)C!)NPba|J%hyUj&mw~|O zVR1O2zI}X#i7A&NGv9WFhl6uD0#`kd#x9v`>8zdpM_p1y_NPWu0_zI1e6y>|F#=Ur z$z(L2B*V#?3n8cjO<*|o<}F+GO(aFi&ctrO75mFcRIn*cYG2#r(*RL;klPjs7mySPqe+Bhi*|8jJZ>Bab z%*3A<9t72&oYNRNhz@rnW8VEbNHo^g&pJk9W8CT<)FyLy3Dopj79-8ja5G`VI`do9{-qRRbc8%btO^#$r+@$Bcbi(Ea+b}VYEF|jqXUlKRL;m z&z+iM`22(8#Mc&0LfNuN{eEPpt-3lx>{!0RDQ%V=v3ui&2jRO_L8H51>y8rc(Wot= zuOXHq#j?vzs`29QSfhiu16Nm3KQsY11}bD4(0v@1Yf;`$wCF5paasH;IgpzzNBbrI zsB=TSw9|Hw%;o(rqdl+qL#putf&JS3TjNFC%s%m=af+I2!%P=TsP;qhR?Z52XXA+K z-jOSvs^HU6ot^$hj^FEEK90wC034pk9bLl7L5TVxYkg%30^`d`T&JxZHT)R*583c7 zsvSdq-&PLg9jElaGn-owWQ=BQ6=19!o|%G9!x-{UrJ)z1vzJ%8zA6YzX67p#R2b50 z*Jh2B7~4!Q`m54I-PAnYCaZgAXA};2-ULB2=jTT77!yUmz1cbi7TO*cDddvQjg|&7 zUCy_xxzKj=D)5h`TZ;d@uZ{*5l=|`Hr9w>#jJM1~uE8`^*@<#G_8uLoJ;HQ6{el6V ze29N>+zP_~O~5uV3eZz!({AxNuO@;Rba}9YVk@~OBRdXogHs&p8fRKW(FE zZLk2{zj64P5TH@Y<##A<;Zj6===zR$utwzu(a7ScOFt)lD_?KJ;`}lBAeD#B;Ra7e zx>l}H9rw$fmxe$v`D=9gz-A4&*%uDL2)^$4a>fG`QUo4n5DnE>p|(Sf>6)7pdjT~8 zN2Zi#H$nJx8gm4-RJG9|>iqd>j^2xfyr3(GsC4v+;}!*vZFmr?{t-~b=ZZfLM{4{} zC|iJ=iRp2-92Iw!J}X}1hY|~O(q-Nk7WXp;(luW7Rxi5oc11xq)I1n*ss5S1BMDYl z2lgbpLwQLvi3np^PxXp4NvInq3Thno#89L_Sg`Nq2~R;kWR(UML-nx*T+l`J)j29X zlIwYwsR=l#8s7~`%m$;$(KkkqklZg3a8vlKU<=a=4f@Cj=CFKFdP5hv>f^a?cU{>M zcyyClOz#l&Lix*eIs*p?#b5t~Mi6MOdgHg;mm4oVd8$E?@F24(*{;^FI?dtCiXnn? zid)Yc_2myEGS&lpv{VN35B1@k7(tf{gq5&UefvPkaN&jJcqF zTf|x(^-d!O-t@2NNVww<%OA{>&FjXIg z14{??C=wyHgwN??0X+V4GFY`##XB#@g2M&&LAsv~#jr{psN)Ae=MX!Xyvh~lrv(Y4 zI8|s5PcX)Vb|{&Pg-FQ0MPvc}rejE#*2MFj*wDTp885e~Cs5wkIK3LBwSbp?k<;}M zHGMmVx;fkE%jLwXwzH?3t7Y2EQ_Ya~oXxe_wV<5CIazK>l573JEFA>2y@I73m8PK^ z`@Kw4OvD-4d|jxt%~5ML{^QO;`ba`S_a>WVL}CJDm!UiO^vz;@L9WRSos}xu=;04- zOGBmpS_PNkZ61!GEnjV6lz4-+@#)jAy29RwG`85FBk1(;E@4 zB@UjGElsx>suaN-Tr_HY=5!i=%R7r7y#pBx#kt+G87y%&fFfQr(8(;#EY`7^^Ital zIcF2oS``#MZ{yI`2Q(_Oi(7z~BtCGh*6xZhs``tBURP2SqSNaJ=j~y26tSf8U<6^p zXl!UpOlHKT!iM%RPWo;|ybh34>WP+G@jV}-2N)^Z;0t)@`0{az)me>E=_*Mr)M1Vn zuh~yL*-wLpKAK4oFESOSDST1{e!X*XbUIK8dgh0Qzdh=3J1=@aulQKhBsLO0z;&wc z+svqTjxFg+-*)q38tkxfekhx~G7x&1As@WW2--{k3SDW6(s}!n>>%F~dcMY{K}7Y} zBvD~$DQ8tGZ?_v}ueYIEYN|LLbQ*#bJaem+f8xM}(-No@2>%#4W z(XSViC#ei1wKb}f@ES1VX)7qZa{1;)va!5nSMDMqt5NAkdGzp7Rl;oN3O;IxavwOP zkTAJj)h$``vJ+aYh6?+Ag60<-G(}R=!nzrPN_hNkRi8#TxsAp}St_X91 z(bX-UIwCr^yUHB}=heX=6_o3W2ezWw{SggBIx$mmZmY$v!1wyO@PF7M@7z$kqu&4n zIi9P}cJ(=mBSLB5z4z3gd4XFlNlEe~+G;R4)y0xwDlFZsm7N38-p+#G`%Q4I9yn+* z``6?1YxDetd`*AAg78sR`+Y3aA6pz_iEKF$W1qD?m0I`lcbb&~?Go{xWZ!mh_>RFl zIFwLnAF@0WVdE#?u-~1&M=USH_dI1djD27#n{f(Wp$K{Ph-JKLB8J})55gurGrGd? z*SY?YZx-Ntl2(nf3;qwYKv2)Qk+s z8F{`GtC;H@p6B}s#oUU&WiWEmHojpi{1w_)dta>(f8RCY#-TW%z4wHi>^T40@9tNk zc#JTm7eVc_>B903UlvcU==N(OMx%?N?Ysy!wZ5>hTd=e1pY#PW z72#i1qmB{@NUx2XP*} zs@UY$WzQ@Ex?^-ja^6#(=C_5Hh0=OIZ}$pE1D&l2pAE;7i2q1K+<}sZTRyM>ueZ}mlm-HW4fspiMmEh-FC@dpoz6@s<7Xgzp5YMk(|;I#V!J% zqu0I2?pAx8y3t$|Y~tLG$(|&EVs!(f{P&kd#~roY+}#gPPbt#JJI?hZJ%Gpwq_MYB z&!{wg-EYUcEi*2xcwZ@1HZp{ zS7F&mMz)gJ<(&&D!~A#dqI9YseHnnwXRr4SZ2t_IX}~Me(ufGdRSIB6bk*&JzH#?*x!! zs*A1H6)@v#$PQmH8(Y8;_68H?+s_I?nEzi1kvn7=a2zJ$L#QTUtC|wil;%$v$ZPvP zN={@t9PtQe@S@m|!a{uM;d!~ZO86+V&qUl+V-o-OI*De7=UQZ-yojY-z;HS%zeaQcpydVl4@8X8*%-#&B-c4xDxzR7kA_?(x-+98co*<-UjC1^l>pMB4P@$$kGX|l z@$zA^XFm)A>3vpvpjK^U1YVmqTPu-^BH|kgKDd++XAYw}w`;mIoX(Aa2jSmDb>H4qCl<=W{kyep*0RpU zW;k)aVS_2}^Nu2_eXF9RNlYuDtNbm3F3h}^;1jEDMrqL;$ z7O2OAjm5jVp^`qA@C%k(h=Zv!b%}t0z~ZvEgbHX)^daAHdZY&ty-jiOFJ<CoX1S^p!IQ%ErLq>7CJgQc_`l5~0$k{-1@r-jt^`p0uaAEd9l?-hOU7I@k=$p6Kh z{TxOh$#UgM_FvVSLAKjuv@0K<_jPaYbG-K>^0&-2gSUaQ7}1oZPz*@l|IR(_&UxZ@ zu+TrpU2f)oyN6BgzY8xn^IzWDOkF41m-3%x*gT{E{>k#Yx$?+8^4YKf_@twK84pdB zEbP+2lm^Ia2o_BEle+3Y?jFKx(A0lC?3*=BK@~x;B)Qv1#}YR5l59|Wt21gOhF%&a ziH2?Vml{_cAFA#b0P+9=@s6-~Z1+PqWdoe=tTq0>KI0u25AS;plOJar6pbxMjekbu zDrnHBHR2;lKd=ag#w^BI;Cu@2a=eCkSx34Zf_z%s3iwT^iqE;c8<7JF%X4e`msI)O zNtI|Y6I3th`o~RXUdJt$gdAmbu#p_)xR+p6KZ)F6c~`sOzp_8e8_4`<-~PWBbn5MY z+wJA*3&aONzjN}NLJoZ@(DXF=d#U(%2v*ax&fQZ6%*^s;{ zebrYW5z6D5&gMV^+Q3J!`z#e{62$nCE0$8a5rLoQCIym(tS6Rc1Cx#HuR@$K*g;ZS zju-{~flpNb`QpQ%wvDPVFNQ!h$ zR3fBb<0(AbOx>zH%^O%p2B&z%a^NOLJXMc0pNkw;|N3 z-SARM!*!0ks0>b(*NQx$%b}$NJ0kQU(bK+bC9)Ufx#udf-~hxqC*<>TYYMjqKsD1n z?JYF-pD0v~u^I>%BF=8CO=Z5NM3YbXVho_j829@G;Y)EvUwt z^Z-ds57NCm?cj3x37HK!^pY5v+Bp&n!RV&w8LYA=@e@O`AVi`^#epc>aYcH&oj)Pr zo5!E;sUt?Ub#--mebUrv9`L+r%gke|?&GN7J0T0{g393F1yxt)v?X?pd+Q?Lv4ZPn zUC-ZWs3U@kL#*_5cI01Vaar-FUPJ!b$GlE{?u@gN9vc*xVZZmq)uu^fS+c~C{2k^8 z*~A2V{1o98B@3$PAw)%p?Yyyix&UFsJ~4?3U;Q*wP&XgLwu=q4r4p(Ldakt+;;>&b zKD;ov$7E3rwFENgyQ86yuOTiqq`D3%p!lWwP-YK4&=MOPToXqZ-q%vS8G#5cWVIj? zAi?Mfu1!pX09lKG5E~`OlU}eZngaCP_yQ%6SRl>@^O>$Shs%N(Ob4D%XTP*qh0*nZ z@v|pTmYytm(X%Vt`cTtX5p{({2p0VjU@f#MLz~zg5vR9p8RMv>w-xeM^1s#0vEJ3% zrgE3MbNRWfI5e9EzP>s$ew4{oXsURkhP^8h0g;Lz(+iIu6IOp}8iW~GOmDOJJ4p;W z&S0ds!4d#Z0tM@f2iYWy$@%k?=$9Y|HQ+-OQ0m5sYzBuB`2 z_}pGH37c~SrIATp16GT*ERbxq@5Qvo z{Vs`xm5d^0y^``&`Yko$(#f$rYcZFI!hoS>^LSsHo|7XvHfktyPDKb7M`M+THC7M_ zK$=*I*w6}c9q9^UW>DS%3pPM`$O1lA>Z=~6k_paiAUV}6mVPSuht#Q*r&2Cw`&rHKSRkFG!)GKi2Q47 zCsuG@zhdi|74+7}(=M)L6t)1xR9V6;aV4Q(+-77;B2iHo^~=Iw)uAKTOevF-lr>QI za}u8y*KnvTQmIp!Qe)w_sH5lo|(d{1xp6|wVOW%%$FoK z)AIz1I+iZ*qYX9Hg{i%SCCZ$d$}D|R1X$RTQZ#>(Q$p2$NJeYBMh{8(E%0;Xw6U@r z$*=?Nbh}IHr!mpd5Xfe`eBvRZyp%OT&dpvKANZI<@>CbjjCN*tOL0r30B(O7sgGiO zFuk@;XYyzvXUr7^3hUTrF03yRu(b5k3~+H~x!0Dg6m|tVDvMI`j?@yN!0uym@TO9* z$Cv;4_-_D`Ai+OGS&%nw%xQT5Cp# zzWyiBN-kNdUMfg06*@hgC$^%G^&4Y?^aTXbMvP=9u@16VgcAIg5$tq(`Fcw*e zc_xt}cFodSEODl-6#4cT{)Ys#Wu!wAo3O8Sh{y4G$7bfUP>(8D z2TrzMt|rcS@Jr;c{GLg2<{H~OcJ`TdE08)go%2Z!LnfseuZ8&`iQdB)fzoK1xpQ?F z5UAKjibxN^6Q|B`YDJ#uxHP})9|J!*Dfj)GGzxX-xugLAnxEpIkXEP9(S-b`+j!Kc z>c*Bo*^@yX@>aMrTX03JB}AK=o~GMkP`L0S93d)N|9@tDi_>s$F`+FjAn7J7jVn;Tl^%-+Qc*ZkFbmjT;{Q;<_O(ovTza2B7W~jt6Zx7MZJ73IDWTNd zkRLRp1uGTnE_mBX@a=4o4jn2MXx?xNk{b1Toe}$ci>T9QZ8`u~JZtQ!8h`qDm1(Vj zAYxb*Z=5e)7pNN8V;0nTJo_Yi@PB9ZrAK-nGq0+Y>V&81Rl=lWD6Gfz4ZTfE1@~(sx zX%ga^p^6|EAH8m+;lLA*O|vvKODf}|g!Y4Dq2NpGgx4Do^T+0N@3ru$h3+Ev-ywEo zM}dE2n_u*{F!NcOT+BQxDAz_4wbg^V?T>M#V89e2cmm~C?xzV9wn}{9ko;r1CI&D? z8X^sG#6(GsXl1A)0_?CpHKWB_|0`X|HqYo35IN;Oi4!;wh<$mVX>O}U1^8Ydlz|pSe5NQT83@bnOA?yPN1^^u8@?KegcVIq{Q#|Wu{Eny>S*g7L%l`L3` zm!8XCapu{mTs^IShLCXA=Y(9&i6`{+482*t=tDY-S7?14{xNLjkt0tnzBUJ{1G(~@ zrQ66)KiNvduo~HR+!-DBC{&WrV?# zY7qIi|55&24yI{3=&e(}$=8%8R0`CGC)BP_jsaa%r;6Ih`maYQm$9xG!Mr^ z#R7srn<<#;lVk>|vN-Gsd+E+OyNoOqqxmTQsq9YJFy=y0{Zo^gCdjFN17~cV+BL~@ zmN=xe-!5C~2U2vsA^5e$jU92 zF*_Ijgdq+EshmSDNfF&lJhuQCK!;zrb}`aNFkh)vNlaAwj^59L^g^6n%Q;-yV3oNt zJHkG5Bn(SWb0}}5RwXz*{XIG#Cdm-x8$6c3%D_%yhE}=2@9{@{x@Hrzhm`iZ#}$2d zosHzxmC1OpAb=P>8U$?qSagyo<2US z3FbrDA(^wW(QYI}I^vBmmdHz*rl-&s3zDzHO%Szz+&<`XBngvHr#5=#i>iJ)v@$eT zVfO<`eM+G)?G9>#<;MbJV#G)m#j@yXifUCr#F%bB5#lU}68K|<|7+}<035t5iCRZv ze9wDUduLSb3D^0{rSqKcsAua(SymRA)jWSn5|>#$4l0RaG>LvCjwF52)`WA|$T|L@ zHT~7HW;nxoD76}gX~RAH=zg$$ZHAwW(tP)NzKneh>+@_$>2=8gAE5ei ze#CT^LPXXyVkV_Z-BUNjzZVKqp;VtM{U9@$1ErpUUM7wyIdy5hC+_g;;)cCXg)gY) zkwvZ^Zlq!~?2*+(mQqoLp;#XdJ(`G?h8g2APNsWmsLGcFNp_UnV1@c4afT3;9--*h zZ3r=x6j{zwaSBPHj4}nm2b!v*heNR(B4#Q-bVLUZC^8o4p;*4`qa(276Cb#=wRy+j zlyDV|l~dtYH#4Ga51;b4)mX>m?&zgcy0^Bd*Y14!Rq~^z0F`9aVEE?qQ9K;SDZlK7 zBJ>O}WD)byBqV-+lGs8WBfRx(TpbY#@}J>h7U<4S*8DqxKib=4i#VClBu`M4RP_!R zKx~HBR^=S?amD`bkRP&0IbOn*#1^`U>E7Z7_%X%FBFl%K+fE{$HTGL2IbV@Bs(^d; zTXNvebg!2G@gw#!nN@Ghm5m2h(Mfhfk0Zb4LjOIV8B&&~zq3t*ro=4b=vopq+ICAVOOQ&rE~dmKEi+3tXP+$u4Yq=gDX zn_O6JZN?K-c~Y=slm2SyXTT>t#B!)$Y~z`{B^xzh06q%5;1}n^tw1ln#aLEMM9=W; z=O_MWY(8L}C6Wpq=Jp<7)z=i$NX&BBdSne0M;0nmAB>3q@~{FS*yH9ABTf9^L#WIC z^Hj$^i;5h4k*H_nPL>4PeuAf=g9=8^Rw=;#%5M2+Te3P@@n!7ySS7nlP3xEqC2|XC zjpv3jS8|aGJ_E|Kt*ChzFjKk1bz}WGY?~i97oRl0QfY9->Z+CdMcL>)!ZNU<5gJ)6v)E0=n&07APEr zOJihf!|YAlqXhKBn(*l_t0gy!2kgUD!$B2@Bs06uSsHx}qHAppmdN9dQX^5LV|PZ1 zX`cKLVm%nuXOCgm3YwCe8-##=#zhI>?2|~Z&AOqId7OF)w(+dAzTIw%SF$i7BW=16orX6o~q zkOef40yVS^ax~0xE~lHYg$WiX6PqoJNdQ@MtNdR%NfsSqT6_|dHn=lD6NNdJnDH&H z{wWG$VElhq95_}1 z^LS@I3*MgG!_x%(Tzq19~7^Kw)v!qn)vLf)NEGf&#SSA!( z+PVN`_zbE|>>x78xb>!}(?27DKHM;57GYU+ac0=SCHk*WpentIk-K-)M=BmG>Hk=$}AwRSr6zxitF;+!j-LvIGo?)X> zyMzG$&xq3B(ncxlnCI%)9y4`3!GpWLxD${lY@s)oi(_!-Yj*e1T-reh*C+{B<7*oK z0y~5?x=YX>)yt1)cm+#R92#g!-B+T}2QV?)K|vJFUE5jQu3#swrbqZBitCaYJda!A z$#HME$bX`nHZ{crs78e5AI`-8sh+N9lP}q!S;+ovboYr1DHJ$tlA<{bGCv@`4TY_? zN$`9%b(^91e$F)%UU~3%hGG1BHRegh(E<$i7maIJTGjC0b-JtF0&%0|$#yPxq{FNP z&Jgd5nHJUG-7$;*VYOjpTn4o&eJn!~*Kc0QcgdtQwSZ-{1ij&I4y2xj|3}m}MoHEz zT~GIP_q1)>wr$(CZBE;^ZQHi(o;Id!>#cjA=YC)Qsa31is&h_ep2&zD5qnFlvBocd z;r#O&z~7w0U#XZBCJiV>P>j>-aph-kvbr?7;meJyEQ!(d*zXfV*2t|Znde=&3tylw z{8l=d#aE-=qY~jp?2iLpy%z|p=NG7^GP#PCN`?R@&Z7rdr`WI;MTXhq9^g-r++$7# z%^*~NQfsUSu85z37CAdjxw6^B%<=%Mh!ZXG!;m1e5ly;3DPT`9oF)`(eS2L_1IiVe zqiTI|dic==J2(1y#%K1CQqFrOcbQ)*cG!sP%_1U{on7&;(FrSE8*5}y{s|d4`1(~? zkhJ+083%@fF_I4fi|la|_h!#uKrF6Xx@A^_hceTRbs#stVc@C4grKp#V@D;9i6j-*Q{8lndr zEKKVt$;_5f`d298$C2|}PWMZP>-^-9=D?Kn5WXI@L4r$Mb$xE2J1|%lKQkog5W6#$ zf^D9M7vyI)PM}Hgun;5rLj(%=#hdsY*5!WTm?w+V53)J@rBu8o_DipD&b;`xY4mV| ze)CO66%W_cLJH<_UeZ#!dU-8ij2=W1;>isTzFvmAI4nf4tw*l^7CvJF6p6mNx*Tx` z;oqgT=Z1Q&=iXDnbIV6*AwZ|~?D8~E+s+zvQpjOIj8exS2 z6Lsur@?aZxM<)QewMU<1_VE3L%}9VKLN*^W}4})PG z2`e%>s21T9%7uY0=~oftRg6GoV+mOY-5>MCEq94g#Dj25H=90g)CtyRCWU7vU1_2y zQ@ykH0T7=*xZ&%gf}2fA%) zfgoZ~%fixu*`FROE++IvyB#DpYa#jui6Tpk?uM&Bc+v^YWNQKS=h~}-j5e}b?Ad^q zrQzHF1FYRJJXlG~!m6xT-f?|rGu9@}y~l4W{3!xdr!X1Q=@~=o;YUtwxVV6kuwz{n zITbjRf2@Bfkf5Q23@aBvL}ZK z9U3O?g;{aZpG|%d!d&LX^})gv(^S7g)ECnY44kr5l$6{h9bUUgbJlpqoV-HQ;v?(@ zya1;ip#-* z;H}T53y`U8!yDV0!Kzt6YZap%Wqp!b)Ujsq(2v)- zmLJ1J1TU^Ji_~4oIdBKpxi4kH4;ba;`Bj?U$)|(34|wNtBAk}9kY{nG7^9?wlfgYa zq;&`_JhJ5R4DW$rYre2wtuy-V!572kc(P9No4qU~RU_0zY@qyiZ|qZgq~qhQa|BJ% zE0chB-jiHxqJ@?0eRR3$1*ed;SzE))T@WODVoRAtRu2j^U@mYdZzl2$bhp?9*K1#@ zHbcT0S$=u_qDY!3J9CK$vTnitJH$*W7pN@<`tBz*Q`_PiC>dfUuEmkOKigwQo3$bQo`XL zye#u$4i*k(S>mh9-_af8{KGpuh~W*^mQXk>tUl?$7<_?rcftu7Eg9gAB`ov}d?S^c zuyI&_N1Cib!EvmLL6URQ)|?zr=I(jNzX@llFPV~O zi%Ci_q6%2i!}!B4O#JVB2Y7U*MSmSd#S%!hh=`$&B$Hc7Q|gM;!Gs33-smGUh?X`1 z1@mRhX>9H72_j&1GJ*3j;MG*=riKc4#S1~xxN;SLo>6M93qLAs)RdFE;K3;%M2wg- zP@9`cv{yx_f-N+I3K0lz*&|P;_qWY<^xMvVln^N7NR7)NLadWtDn6mmjI;M#BSEcC zS=$-5)kf~k_)MwSC6v6q$*GLG`b38xpMge4C7}c-1eQLuwM7!?)XD=(LC$1l5F-FA zZfclKLR6@^EQ$T5H#7ykbhx=ym33Z*%t!)oHSpfQE}VT9l$&0;BxbjIRwUZ$O**KJ zIc2iq=+L8rg<=yJ1?2#X*3*s3FsEkyq*_n0C}?%fODI)wnGEq5vXeMLY-Iquq=jIM zh?5V^ks^5SS%rghCpeA#vQst4TR-e&J$&_3KdS(8&C8~!0nSuHA}d8(w8;{FyH?(T`Fx>Fa(qM**J!y z{oQG%Afu0b3Ceq#R&P!kA);>-$&BhH4&Ll^;Qq|STyW1f`^P+MAwz0sG`yTOd!iyf zDsxyN#K{#$hsjhPj*q0Aot))ryr!<`7MkLd1J6F9o>=A?%*o!YlV3QQr&|p%*V^|Q zGny`ErKMs};i8R~{A87E*QD9wveun&7@I9?ZB~3W3%N7QFF^l{T;Dy~AkuX4`qq1R zzxzftctPJovcl%rCQOMXl8Tghxt0V)O{VtZ_-ZfMn-8j5!TEQ4j5+L*t z0b=ZeeAaOdvYC^3Gd+S_-2563#DzHXS)qdQSZK#Gb$p&Bxu+Z49>>#mZ$OC#e6*kE z$7V5n6KfIp_1dVA9Ji7OCt$&Fx+{?EZr`|E?}%1!gI*gU29*Ex?_#+2YFNM_T$^xP zxpTEm;q_ke%0(2dqAk{zgt6)e$BB6NbItc?(-u|+iYsM}&E3&=o_A7R+#j$)4Cw9d zJf?DagE#SfBQAB`!&zhpV8!?)BZz()KVRb?rnc=ZG`?Qh{Sg;3I#91WE-etsL}lV4 zMQW4|StP=nY$q{v(A3hRm!?Wn_@A>$w+D+-ZyZuUd`5;;X?1ikzDOPy5^SI`8oU{h zlwjPDVop4Pd>vS7q%67j%G+Fy++uRSZ&i7UHNJn&J@FI4A$;0gf4k~5%k4@dXutpf z1JFmw#oD(@pPgBTj~cy9e5-e4Cm~KY)LC==|EsbAT-^B(0|Rut)-(>^0FdIOwU%gr zKID5Dnfq^LDE8&$Wd@rKW!ldR689dqz5YN0WswpSqGDn2+j4}<wmL-bF>)k`U?ZFX!xRy<(6S_6v73=KTL%1YSquIgo$1 z4B*4x{#zW}`hR=qKi~b}!q{G4%Wi$#*@7v5I^g~5y1?IL(ri^OZ%@XQ{56lLDLJ%+ zT;B2doQH6a&Z}O}qXDy1Co?$y42{O`*}X=-mY|j_RIb1YSZ0ta5t2wV3Om_i}Up2%7k30?-LyrB>fXW zct6^^|EjYN*M!rmjGsxhSAH9r#l3EQtJ8emxiXtGC~k)q3g@=KML#q*hu{4t8=H3t z;7fTs%b7|Fb-ne`d|dP_Lw8ThHtFTnRwniv=3V_e@!L7iDJr7B)j~F41EJ7DE#fh4 zen{dMmuNqDJT)^~d7 z*b%%Bsd>$ROkER)rr$2k9>?0?qa{j~(wT=qJ1(5;ryNX%>4 zENYX5VWw~LMz;k-B%rJ*d9QkE+RlZoWKdbKhKfw>$IN!}7yx}a{aVD2yIzWud!$m@5PlC##(4fR(!bJ|XGPqE)v zcX|vV2sdZ1vOC$C(?m6zr?fkgEL;$Rn8CGB!62!&`X-=gN36twGQ7VDT(7sq_n;u?2^MEX1mU{DqHJO&6zT5JqraH0zAW=UHvIHSa6%+?#$iD?dS-W9%cqPrSu zqE&J^@Xjb}kKk%gl2NaWI96tM(AS0H_ovsdsymZ4!QA%NQV_& zCmgmZ{W)S~?o`*XlZ3`^ctB++33L$%WViKtTky|7l7eU^jTUDxiB10G#*3Y<__-#3t3GCOod(mDsJ=wD z)2CjBcW&@vw?--}QRnJk9ekbdp~hBNr{ZOCJ@$}&PuzN?JCjh{peY=ny1D&EYsaeI z=)B*xGn?UdMy6-4NI8lzN_%tBP_+lxdhRqf20yu7Hf!B2{9v^>jde8#U-i2D8&66o ze<@>|e)|j2Upmru-T`Zl;8k%A<>OdsG#Y`Bv5h5Gx;YNE)|%C%n++DW-rSo#E3lO# z@Fk8$ke15?Q#|1A-xSh0ytaNJq0yKVbiS+jKGnK0qTA)GB9HUFF;~{~#8b&-FweAB z+-aSh!#Qjg+Q|cy<4)1moNpv;+xCg~k2mQ;1?x4>lpsc|yoofWgoJ1ebc{!x-0mtz zTlANR!&l%CavOe^r0w6F$2y!4)yBu89$nm9bJ&xxX?rlHv&7yNZUX2AO3ckOWeinC z+A`~r?`3&HJ;*T|I#0ueIX*8UHP)za;cAb~*!Uz<8wl8jtTH=Zj#v4limZs(zVBtQ zWnJg=k=;Ll0GU7HBqnT5<~}Mj?P<0e-q;oU6g0a}I9zsoa~X|8u?6nlU8b#@$4K*d zv7>l7w|bjJu&0O8(@UQO7#_X-O0-;IW@J*_g@5_c#Ma|TPCYI@QxbK9}l}Dro z99?&lpC`JHBr{qYxQBKy;QtvfFvmWxZBi8An*n7sb&f1TUDiwRr1H4STtG#F+}*1`0^KMZ2Ubf@kU)gr2J z{Ef^*!#3Z!QLj@)`_u1qg)b-KriUF7SyK17~jf5*mz6e9m8_tOWeC^tDA_P%|6I#lnAmiK#W?}&yHH}2Ni+ z2dcbJX4`eo=-+Cs88zRN=k})uQeCfISKZ6$#LEq_-0t7!JzrejpBa&9T3!#hI$a5o z=bX!Z$AoY@o>1o>7}~yn*k0dQO6gxFaJJf85(Qm@dJJJIYd+~d#@T2K%Ijiv|Ma`~ zJ@CC82Q#fb-ZfTn(L=X6<6ICmU)+B@wf0V{)o^D|QMoz2Cw9YgHjt`9nrF{~s`*9l zy#BGfZzn-m;l3yI`X%){HipIV?!+&1=WC_4%~%&F+bZWUhRk)rVUO))k?#Z3X^Hj9 z^Ty)oC;)=$p9B9q`o={)|LcGk@9kmK#@f}gH3+0R+U&9$RPSUA%lUCAJy@$Ny-)J zC7PKTiE4}o%hl}mER=H-b6=NkQc*pCHzixv@^(Bz-CIaKoUDGy!X?Icypt%e20&xK~akY#feJ@Zor=E?Cit307|Ui z)?~glNC;2p*b4Ngmuh~PFatjvj4#d6f%CDG(v43gO6!jE0gPyLLRo&>9MsW5-*Z4u zk53G7I)gfVJF#r;@Uw_T$%YLUh;q&J?S<(ftxZo<$QAq7#Vw7eH~1Xw*`ao)f@i=c zT8T5M@(dEx=>0<3m)1{ zPb62mji^3f6j39hScuBsxH%rX6t2)*>^eG!4bAK%a|r%%sP!Ajd+7WbIW?CTmv|$- zr?9?tBS$y#KxD^Cj^2IXrq%!8MEq@j{LUh95~F6LvY}@0%m|Zv{Q(6|@{Q`M!0I$g z`V#)C0dW)%>5vqCD%kbkRMDlBcQcR7CO;_P3kU-yV?>wMw0j5z+iJ& z#q+5mA#_k~l)d+5fKF{=OWoYj!Prg4j(o6%5EtxHpLwLcq_E!BX`D@K3>^c}k^E14 zvY`(nsMA)0+GP$rU^Riz(;60tyE26viRJK`?ie$bT3R28YjKlIacE>P%^% zo#gIaH7^4-UTSNxjzei>|F0m{;Zwd8<;!)IJ^Bx-TQ)gToS?U z(}twNV+{0?6AJ~dRH%^DC7D-cGr=H1{zE!&{zaamFbF#Ogn~IQ*q>hJ!_mJ%n&En> zk=@OfXCsu#3UP@=WShX2Umq%%()5vqDcOFft+&Hpw_W+|HL$4pzoY zajLGkdE{V^8s#TewZih>pn2b;c3Rg1YE=NocH=ig%EXyRIN zQBng00#?`|9Xz`0r*%&9dr|`6W1RZS7)>jxipnMO);LQ;m?Wxz%1MFLnW$NNje|0y zMFrgHDit(GNylG&pQU(>rr+=;tz-GkaQBVh?(hts)U@hLQLZ>kX-B?G1=R3@yV1~0 z>{(*q2i4ET0+oy=T;l`li*Y>f=%_H%nhil5i=5_?ONcePG)F}obyiH9aIl3if$BCi zgt^6WvrKEjfL> zjr1{&I9c%oV857xNa^%F$>r3{Qc6ytG&N`}*tX>5UaUM5Vp9+$)$Q5`nv%3!jW8|hZbr4n^bED{ne|>h2apL}b z*FEZQ=4qnUi0}`kL>q%WBu`y%c5@@jFl}%?wN{C) ze`HpBQVrHSm&@+$+x_^2AnJyg_G>@d`#5MMqVDPL!u!bg%J&vtb!cGxDBM}Q52lpX z4Ay|v?vsM=#m-MqMtE-L#7S`g>~b$DGD&%OpvEUvu|7;ors%4Z1d;@;m>-=$*p}{j z=b_g_6L~ywzl+WQV=Rw79ocLzKuh!9()VTY{Uwsm9euJXz3YS0_j$4u zv2k0si!4QVK&_W~VD`EGDxdL-El{>)5^P4y54-33NFlXUaePlC)Vy5 zpz6m$t%R8E&ARjXXEOc;8LE)um_@hw5A*M914|Re+&iODN}tApom&sW{?_&TmAnGz5Md<53ZS1D!Kle+B`gvWMokG`JlXfBljZ{u z5{i^y4ZD&8M%w$SJ|U9uuux}&b33JB&Oxsu7O1~klRc`{j3`9pG!-5wYuH7_=Md41 z7b2oknpPzCNy&@HkC1l3G;6t7|gFJz-Guvuk?L5cWSJe-cFmXgM^Z0*5q2 zpfpnVIQT|olyQr`Bs2YVeuh)9XI5pG6>>syQNWTv{Pix;$yz?bIS^vl)*5L@F5<)( zk$6==Mr2_ry9fPvFrsNLNiO>Ki+qAz1_lCJr=Zsi9!G9IE(~81!_)IkJe4~Lqp-X= zxI>-gGx})^_IZ&nt>oeroJp{vJ~?Cq95Hu`AC4ywLmR}EUBJf(tJxs;fuGMKJ+GJm z_6XW1kV9}>^vn=-I3G8pi=0M=<)QZm>gyTjSKG~`p0Pl;sEA@y^O73PSHy=noDYV8 zkP}sSoLEV1X3rjVO+#35hPj>Oo$W%MRqYtR9bDi#VH(0&rj~_x5W)t@pH-1(eOwwE z#B$S&OiRkwm1HT?y40S0XcLn-@#ckX<-pXd;$Gx};&N1_o_2dW=tl zZb{7~FR{uM(4Yu#c)WFVVoW3>s0Ng@pq?EF2#)>Z(CmODsakI~#2=TS63(MnBxn$Q z_Xl~2z^Opus|+X9lvrX{XK`v4J1^~Qp{wm7YdkKO`<802G)+O?Yn7%|dA0ZXc(JsA zDk}S;x8hLnD?igv*5`y3^0IkWId1VjvZvxWEM42tZTUI<^?uuV-NqU8KJfcMQ*8o; z0N?RccDb|jyE%Et`Aq$Io+Kj@nIrxe0>;a>|K8PY41icsaah_x(#3mjO+soV08Jxh z=g4*O+O-F=PBf}2MQUO4)!Sd2#qmLBoXfk8P=EKHVJDIkVwNwk+j%~i;=80Km5W4Z zQs)2f=o6bJquiQq0SzWd_3G52)`Dl`AYFCq6O+5lQt|eXorArm-b&2+3O)~X{cltY zh-(kQpX-G&uL&GR-}4om268$KU;f#Ek>>->}-*QqliTrC4-YVgC=eW*4O%12cP2tvB=_v4KSmuLSaYVgS~ZKHGG(xDLOd|GULr4>5d(u!~=hO%r zI=Hm7l;@2{0>YTUubz9Oy@Xg7Ad6&=z58Bf2;0RN!c5L(G7%H`@nc^{3E=|K|KuI- z1-=<lbFAJptW7ws#BjmD?+37Q*in@mHpYrqu3L@zNm zHV*Qpm1Aa2;kwfy3hKM(c5KHESC2|bVb!i4v(*!7f0nlw0S4v;5wIq)l$hf17jFm` z)0uk6T?lM+fOvjNC)hQ;msSlIw2ai@;MPyjM{&vSF?KB3Q%1fcgy zE*H+k-}PKlK5O9GrvF_sUX??iHeb~=RW2o#vff~OG(r5LyvoYZ_;_Y0RO&uvnU804 z4}hE^CfNHEp8mD}&mbd+yV;%S&La|QBJmPj_!|KPLHQ@`yYrmlql}$WGA+Z|JzMHQ z?qh;gIRU*`ud4$}4XH1GC2Eon*14%p=?qnm*w`RlfVphbFTkDX8(|RMn zZ&mQ7?dR#EU zg3K%|iu{ZXw<1-Sbc>E(XkjvX>bHL1@VJA&Kt4zhjv62Sd=oLwZu>i&p&@7@HB2)o zR5y>PK`thNf0mr#=}}2jj1D!eU@pd?D;j2k-O+q3B=gM!;}@~3w*Bk@RMdtOfTo!I zM!lYVw_Pg6tG-DhGzLE#0F#gcLw){z;EmvWxc#2#$&K{HaaFz*>H?kH#0m@UP6iFp z0`g(Rb(smEXjd#qialUwkGb!0tMbMpLM*-6&?IGHM#}C*q|=pJcL-niC-UI$`_;dY z5n@v6bkqKee&);4Wd5>}f#BQ|_i-HaSUOvn8G8ipxlIQD#yfVp^Eq+mcod{Vu_Hmn zvMOd^NJ5B0#D;JtAYExBr~^KrrbnRVnoHPxs|~eq6RR3%&x#py)Me+s-LkKRniz%8 zZ92XKs=u3k*9fIWg`h0wXyf!6h>`%)&jb1oUnnWS^*{rp(- zyxtmd!Ueu1xQ?0?z$T&;%Qu7fwTEYjE^6-r*wViP=mizZc)J&jzEyw)Y$gq#mL!-< z&c==*%^%X%o+^R8$FtJA+FXrHvLeGb(Ldd~*4((!EHH}_SdgeM0KJ(F=lWWtf?@S` zXAX<8fE8Yc2iPvkKtOo4=5$=V7<#ecszQ*4EyUD2q2$N`Ps&MQ z*N*J9bJv7mMTefoU1xQO`jP@moUY%3zYkuFeZn@t5Ilsz&5OsAe4sb+Z6oT3Sriu( z?2KM{yFKt?*=FV9X*}Bm6QCuc;M&|(Aur;FKQsg5ozrE-7%SIDs5~CfP|kRUhL!g% zktM^33iKpPScBkWgwzyNn6^McuzS<4iMy8HrA>7aJ|PuQpbFVG9m}U~ZtUmo0QWpn zpyOg@Ddr4IdV@$)Z)BDr0R<# z18>eBwFq}+NiU-_^wu;O1&Urm@FqbDyhVC-UO!Yt$)dRH{S-Y8 zHkhhEEs@rCc$%Oj3&6fOMluILHq#Ka66;Iqc}=GHI;KW`;kIJEWRW#sK}~J$B1lSN zA+MFGOzZ@&Eh-2o^zFqdM=qoYNKLhWWm4Cd^a?hYhiDi~E1Y~}e3Sy5i~@LgJYd;7 z5@=N|s>H(@OG3tAj@L788D#v=DW}xKX0zw`DHD(MR-@-CLGlZeJK?FbQVbK+_M3AM zMJO2f`hGj}$S7$gRicWye>L;MPSCSuWfhps;`gp;!|fcyhWEXlPRT8k>boP zZS_MJ^JpqM6JI9f@aX4ez1Wa4`~DG92JWP%HWX5_Us1}eo-(Y@IhYfuqrS33&YZj70zc<7!Rdz1hfk|3z> z*(d4xCz!tnHQ?m0xBbIu+kS)!J&3Ng`_>Z+58#nR$Hq2ZZ!ppJx@-;_+=B>IwcsHg zad~{MKRFdtz3Y!4io75K()SePKTo@E<0br%v7q;I#ELH0d~$he@cAY%m9sEY6e6Ol z-4XOM`UzzwYx4B~>ljQ(w9Z|kP(4t!jF9_q#`Nk;IvV2>8ZIJacS=U}yWoJnxH#P6 za@uHTm9wtx*N10PCt^ZIT#*<4q|EsuG=aI5^vxz235Qu(UxJ0tL_)Aet%D{vF6^6!G^@yb0o4;I=V2Tez54FbzP}3xe>ovE z`NgynFw7VB=*d{c)VUPI`z?8JXm;>J{&E9&hiRcjtZk+1%Q? zNSzuHHk2Y+^5f6WC(ijw^}#PbfXES+2Z?It^{3uIO%v)Ae35t=55sT{483z2_RS}W6x5Eiu3<7X8?GPOpa%`Hk zKdPhGQ_=J0P?E2NaMn17{j#AMBbYthbmRM&NJ^dDEgoUNI<$G6G^wPRgg%C`Ji^wh zvT_b9P8l|A*q2iG$gmczC#fzJ{16lzv?e(sq85svIIgx0<{T9x?l+yRF~=E*X=W^< zj7+6k zwL8l9#qghf^m5Pl?Ua$3Id07OaTCgS`1O8$a-aLnU9TRcSgu^(KoJbvH4Y5C9j{nE zR2a)ENsW3Cf@Ry+Kz-GIg3D^X*5}syuCr3BH%nF9HQ=(UBSwwN<(fYoAN=GV`CeA6 zbsC=Xc+1OhaNl56J)+TqVjh0(u|#SZB*e<~?3O@>TxshBXopK@@j&z$v;f!=#^UPq zw+s+O4pz4)&`#O4@4r3Uyi3kYXL>rBQ5qLNfqiufx(|hvbdscwAtg)3yHePh?mWJp zb2#55veGMp7Z+kmb6MjmQ&&MNkTpe*2+>f)GyJ;?KI<~D zWkEw-5qo3k7Zcx#$?MtV*wE*hIAArgy3{56b8jHFF`d-fPHN$bga0G!#7YH&rnE+8IUn3#D{72Nm8%&2><*pBze=%YFDBz z5h0GLvM^OvO? z7t#Ff;a-9upXZmGRbP7ejwi1?a8I2xYQ2vD`~t6gaDHQYAH#ZeUeC5QJ#Ush_u1F@ z#m4UL?o}HVwaA=*Pl15!A{8yIx0qR3W4gCDHYN_o6W6=F*!JwxIGm27oMO}4&~a&6 z4l5&uy9jHj4DvPA0;IYf94LBfM})g;ktNlHyZJ0hYE6^NZLE7e*a7xklUR~_d++>ZgY%gt73 zsXDG0+1c4!0Q0Zyz84JeAK4&MIQJ=;&T_BRQ0i;FCu+3DDGRA=SwvRLOT4oF4it<~ z9~AN)VOmIng)kjLiEwUYtnDmL?uv)h^yg2oCKu2mm>nOw{_qS5arl%x8zrLU5(_W` zGOPzr+{_5ySV^PDXdH=*Fp-j%&{~&QQ<_$HN$Qm0@2eH-Ektq0)CT=LW!wzqp0P@C zULs@n(WQ|&g=WK}Ufk9l9c~T?0}a&C@O?21FV#fS?qwftJ+}Dr6hamA=Rcqn(d9Q9 z7+A>2s_cVDzbkVND`4!w(NikfpJ6Sf7)bD(ep{7d&!>;Xl;PI0KhE-04VPraET)mI zZguZE3A2B$=x=;UF4gFg*lmTEztb0$3Tg=(sg%0WnnW_MhFA|sgLW|N?$59t(Z0u) zQ?O@gmWae8Kqt3oQt{ZiMG=uhiWaxD{^>R}ssa{L#XXHaZ6Ew&_Hj%?KxYc1S6V@B zO9!=i)#0ECp6(j`a6N1MHASQo9-Pv@4^Uz#qapNnOo*3zmW+y+MFB}Wv<0Q-J$CxqWazv%&R0R9e zpFSm0fIXKWM$GbgTK_mC+)a%h+FhX9L?Vr zxOzXK>QN-zqC1tk;{S(#Q#B&tJRwYk4APgh#1qHoPg263b&5|m4|NttG}7^m@n%mT zG_2X2W@4BK6^3aB*53=Pyhb@vGW1|wuGtN zDH<20Ib{L9NKFhg4xTE@dU__iSSYP2!_KU%KlnQ`@j>1NOgwQt8dahE6odMhPcWY`QZZvT-#NBa@%u=ugq?FqFu%g_dHR(`*s6P(l%_ME$Sj6=Q zdtl}hN{xw=rBu+Ec#7Xz0#PaG#3K40_-eNNjTP+vSP9v*fW-VaB~ zV#HT(-zxV>aulm>yegHSz}qBDrc=8Qi*hI7WI6iw_Hp*?(!_{+{=aYmu%%)-GT`{f zl!EbSLa}G&idqr#edf*$*&wDundAiuD`E`CS20>N&oX`g8g!o^Q+0u1gc;uz2a^~sgD*0JdTA>!l2?H~;i{#;OO}5FojJ5Bt675+%HWIPf(#{Da8UGk($=Wn5Y{Iv-%=x3V ztFOVNLm{cDPoA6V2E#O7bJ7JGUG;#Rt{v{h3bUxDh^~kqM5^^rZV_>NWWt)35Es<* zh46LVV(?@UN!J{Vj!t>A)sL+enJnUe{!;Xe#$L|bzkr$OlT)w@nIczST%!SC*y_Ew zS?UKKPLSJPHS+AcX9<6UUqlK}Ydun5)fz%*xO1MlF~5p-a^W7>GLOkBg%B$M=x^pI z6-fl1-XA^@sG6Z9Zv2?skJ6x!(vl!s8sDJkztnPB&%k6f z0$n1T?WqjwrT_z0{ZbLjOH-*V$H}da{h1Ke~|FNFcVa(fLsfwjj1f>B1u7nNf zDueL`Cm2hW>}s*V8g@)4X*7ekfsD54^wN(r+g=mzQ6H$FrA&GnMTJiu{Q)_uQnlXE zhzU(4PO>j9lpsAc+M?pD;~5&_;1es|^83I893Q!Xp_10U9~$wd9?FfPuG#Q221vAn z+7K-HCAML78zI!6Q9WcZF!OCa2XY=W!M&$|@4T+J=#g3+FYnh00=IqN?ReS9vMK`{Pv5&2z{fd4gsI~&NL z@%pv4=ZUSDU|g1fNoa^}{EKnxK@&m}bC$;88mqg@QtfKApn7bs3Nl@GiIj9e$ z$v{7Oa;vc?wZ{N}(+XGgQ1_@-t#8kYgL5|b8!7?bjf3)Rju7~y2-wX~Y;1^-q`!*s zUae+h_~fbDEpVL1#R6j#_j7N$tiyR^rS9h4p?a?U@JS6Gz7HXjU7VRoBxA@E7wC@b z2~Ha7YVEL~qlHvT9LI{+;5&3^=_&N{Cb8WZsaGz6V-0fD#N%d;AI{N(SdRpj#fIPV z;XWL>^5P9%-}HQmyh6O{A^qZh8F*+Q*}n2NEdM=_5Z3I-wss&?P!PnFs8KL5F(Ea1 z@pomwLkFq#dOmb~J+~^FVYQwtC@gl6Zi0g@z3n<< zul5C`&YtI?X$uT#*op;O?@;z$}xnYMLE)X3*~=!JC%bsvFhKsqgZE&FRttAN6S z1j&oz73tkPf4Q(gBwag|wfa$yxt?ZWm@`|oUJ+)}#o%0WxZ@@>#W zwNkS9HjSo!v|9O>7~};WJ0qC15F#t6gx2rt#zv}GG7tx?7!)l*aO$Imp3*308AHX! zYNkm}pP^hWaDgS{-=#71G3BVxcAwkpQ#I)+b3)*?o$cKAvV4IRo(WDSo*tHsIG zl@n^bhHon&t!I!C5Crk=<`F~fYU53<9rk4&pg&7}WVo5b1eGLEvzk9-!TQrUz3 zNIKZ6D*(*C1r|mx)8q(fDOy(7FGofkz1L{9VQbe0+H9drN2N~O?l<7{`ZY)1a>*4{ zi|j~Ub0qFLBKd^MGh+@&h6HNokCo`WvnxtT%rUV`Gb3YCfv7A)qSV)jE-I+v^+sA^ zN3B?II>8Udx#z^5zvoe*AkZ{2vY<>JG4umuSwWTw062m(mb3yiRJAi3BCQd$Tx$J?h7o~Dr&7>r%BA3<1f^qD%xStlU-Fv-C8DZEDP z;B2DIvsX9zg`%j4#q;FOte*}B1J-8V;%0hFjW^q3o|>$Efq4VdKc*k^UW9L!#ytAi zW=*&3$^s*3`uJSOK(Lu)B6&v5k$(w2nYW$eej#6eg$ai>H0r~O%u41x!bn2lWQawj z)7^3~ql1~C$wZEWV2=&%R!x~s$XiBKzJht=k;X!?C5<*gvB*%K9V2lmF!>9_TOTE# z;?c!$L7;NL|Miiwt{2QhFY8ASAmHw_|`iS;^%DcbXH?()640T*d{jO8V14&&t?gbvf9uvR ze0JOh0_t_$s}cK^F2I{=WN!~Y*|6Q%8C3?B0|O03!vnr9=WUMQD+u$lOYHN=;*NC|1wp!wrE4?QJWTa186sfa^Dl~Ib27@X&}dwyI9K57#X2{B}CJ7xj0$YaTtAxfO2{_xJOt_YC9 z|G9T~;Mx1K@^XWjs?(*SGYG$1xbbdxzR=w6>#}%kc=#LL`QHfD`B#lQ_&v@jOxUSg z`>)s+r(}pN+pWoC4%~|4#JA=_F)5@)-ronx;N&UTXNfGr)}0w&w}6CsCY& zA~_;Sl0+WT0)5RDWD>w48n}o$yH`$|+8+=aj-WmSNbkWC5D3HTA;RA<#5=H<==GLs zwg0c+r(8X+@t(fXbe04$T7fo|FOIGQ9(a*?RNGd$J3YgU39sG2t~j!gZ2mr z_=u50P{`-lGjQxZE*OCU0Rg{8D(NDH5DX0tkWQ!Rm@=JIeIu^tg7VQq5{oCWLm_&4 zIw=X5!y`HpEI zs=mO|v?e69K!fsK9M{G7M~lx$tWadaek%L&C>2X+!zLWI-+2Y3JzT%K|DfLm1WXX_ zT5CMdBaw(=nijtA;dved{r%LYQbfXGeBUP;i;>S|f<_An2nYxWguA9%mKebcFTB9& z)vHM)5&*cai)C3{bImoRQmGGT@2X7KriXcWM}!Nm_zY9V6;sIWdWnZ#J8Y_ z_3+TY{{Q%gpFYN(!2-%nv*nrF_`m<_A9-r84Ugq;c;e<;c;v->cvb}4vM`LJE&d*Td)M;V z;UE4X z$z<}wyG?rqNT2hww5G@ z02xWp)Ye2Sq?us36F$_=<-+s7#&2J>?9DCcT2ep#WWM!hr_tV;!rlH9fB9!WVC}|z zT)wpK7$LIx;h%H=o+O{S;!^g<Q8e5`N#n(St+eEasvYo@72gufTaQcE{+ortdG46VHgiC+tk7#)PANb)uu!3;l zfPlA??x3M2k-)I5u~(Jv<2X*xJOKd#0Re$AK+_do-R<}2^xz}Rl6&K+=^Gmi2DHJ0Nl^ts4Hy>5W(Z;TwOw8XyW~e~D z1?Bt@LxVj?JxIa#A>B`}3#Rcd%F+k}1D{;FkG{S-jB*JlHj8ri7Vfy`ZZ-@H>RXm@ z?QdT}Gd_K9+|9q-_5w{8{5F>?uRm&Io!tEIw~?KDBPX|ey!23-a=Ab{4|TDi;{^n~ z#UMmTf#>)Xibb>rAqAFYVOkcxA6VQ20*=o$xn}s#PP$YR^QYELxF2inqZCMKyt6x8 zwIG|2@+ddfcZXNXaOgl6M#FSE>h0jVybsF#``LV`$fTJwXs-Drw_&BPfW(mEBiX)N z%2RR$b~r-lW3tS?V;=V_ue_4WFTb4D*47Vw=e{a3QuHxvTbZ}uY$iYX*Zjr*f(4)X zEzUoA7Ee9tP|g-`XrwJ3<(VyeaQvl2%+bavQarq!tYy*M5++zxC}aX$wJq z-&6eO-~TZWEEICy}k?tP5f^S}AY6Yjc9=idD|$tg^22*0Zkd{r7| z-@!p*O&v7X+8;~U{>bjN-2c=t7hN~$t%bYqFwoP*kQZZ0M5x`aQ@QN$8uWlDBRoH z+CH+KD_th%X(G0P)i#%t=hX4QjsfPJw1R{bm}tD*2*om7_}MeL_ka9?AKpKSZ(e!| z4Piz1x+nPAkDsLR57=k9L8P1EV9TgmVK_Zf@~Whi+bTb+K= z+1adE+!Rdi0RhJhJAsgr-rgSELkE$jL2G+EmT6Ha89xDi@ArjSe~-+Q%DmEn!2 z9%Wl>8DHvXJjOVi+x0T{KfRl2XI;eN_Bb`E=*M?jzt%qLjc~AQfT>afaTb355BTeo zOH5sq1ahe22z|M3iaBUoc`e`h`UpS0|A+k7XKy8Dd1U&Bh%WpB-@fr;Ox1@WvaEaL zhx}#kb?QZ$!w0%aopm`^t!%~pMIXI=NqhuSc?@lToFD$5KjyVI7)d*HoOcahTh&5M zaW}X8?0?g@Li z`q3vAi;=9Yqpzojy?gi2*4h?SObrP5Bw{C+bL#mtpKLMm+HKtQ)Cgx>c?t8HYN$yi z*uFt9vh#UvyLCM}*37b#Pi0P12s;#`p1_v@GQykgfAsb=nEE zCoD<>huFMnGrKwm@gq$vIbkm5;9fTD=pocHhf_{jMoSd5Q{dqC^=#O&pTUBldG-mM zcEW6uApsIfBmL}tv-L!-5v_svLg)Ey9>KduSb92VENVugDUbB9dEHvJA09^8DdwGc5=&<^Vgf=M7^YFJ>7zKj;aOhT*okM= zGI#kZPMTE*(m)k6Y=89;ep=i^%apmCddhNIL(sMLWnNmd3$J!2tIj!@$ww|2+ADHs z+XmL}*vCL#&^&W7D^HwHeW-FhM-J^^?WS!U?9GvycN*udm_Zbu{cE1#rLA2=CNJXD z)0WW^0t|~}Dn%$B9=m1a4sGVSm)A2$J!fSN;DVCjf zDvKu9VE|rsfbE;tv1NZBUbva%XP(X6)cbQk|FsJDXmTFE^=JQ;#QaKT^SZYAtQ<4& zM_6(FcWHG}G{-d%W98MqL+gS~>^Rs*(UZhdZOmJ|fc7My>p1PYZxdU-pR6m9QgYU% zt;}0ApGi^3oc9gBwBzq)J$t4l$gY2zyD`UIXHwXO(Y7( zwP^3CALmPF(6sP;{@dSm;Dk(+<1)}z#Mxk_uhUl2UIgt8VvHK5{`l+wse7I+k|Y3 zcp^%~G?8dLr%a(#z;jBxa@Q~E?7f2PKX(#(+mrn4-gSf~PbWIKhFkulpKE{XDrS$W zdR1WWiw|=9a|dah-cEkqIMDJRD`Qi)I&zM4ET(bMw z+u1dk=Xbua3cK$BPu=%0yNq_`wHd6w=f`Z`^BJ!H{MocdB(@#GwoDT7II)mLX6LKi zv$cVaW!KSK8f5*`&#+!BW!AC*QMTp0vL_!vRzL#fi`vtEK)iJZp;Pv}% zWhj3gSDzN;wMQS}*)EIu^BdUq#GSnMM2z-X(}@=j@Zhg@kpKF(xnx$Hp6#!3_dTzW zT)d2i^k(k5X+8U{xR$F|OvQkTx1xYbQOqLRjzW4Dcip^?{5OAxvl=9ZX%VtRL?bcc z(I^ocI$yqvo1flC-Snxb9Z&O%LuqdO`h~QFjOz96;kkS6W0N(FCGD{0fnTtB*I8Wu zr3+~bWqI|%`*^B5#H@}wTzpV2+n@LuKYy{GNweDNf8}1b@9E~N-?*4|XNa}WKFvV; zdCZvE2z#F6=XbsaZPQ8QHgnsLdilb)u4O?o&r7%8!~@$rrp#z3l223gz_M&CTM>)J zh==V7_Z?qL3_Da=$OwsLNecU4<(I#FfS%}7+Cp2o{l~lMz2-|?IJb#`O)qfAee0>| zm`YP~nX-ESH?d!`dC0YV^2AKoi|+Bz5g`IIn#U zTB%Ag7;)tLE6-^;_EdzRY4$P#Cz*hNH%Ivj!>~xzH)7j1rE>AeeW6;(*;hWzP0e(6 zbq1^7fPhapo~kUyow0jq<$hZ~_cX4#{v>j{U*T83dXg75ck`LB1xh0gP5+^7?9W(S zdgaBOH8X+Ik_m;&mBRNFT558G2iVn_Vd`hE<%_3J1<&K?92&~B=~#X~m!4dQv~9A7 z`tZXk7N2$**RG22>ODW^zFk|{H_*YpXI>-Syn^d5JdFmojqm^6?L5Bu3}&yI1VFxj zFHgO=31iOXTz&aM`ro*Re|=yLs}G*W>|z03Kc9;(xrj;LM*ivVZX+@46s|jSGP_>6 zpPxRlo^799#Zos<+KVvnjEnionN#R~{XV{b+bg^>djVIjFwmw=$MSQz=;Q`$ThMRJ z!hCr>n|h&D4s$T;kz729mY#Ml7c6MNG9-QLpX8Yx9;e^%dCqOi^346W z^3e9DVL#b!RcIi?Ft4T`5`}iy2MFmpU2WxkMRHdN8VU}kV|IGrI^p5lG8c& z@-MQywvT6SzlFyhdx3@Xr_yd!gNT&|ET*1t7OA-&Uj7iJfBPkCHuQ4V1yMXDX_&p7 z&wTDeS}pL0w{iQk8xb=v;G&C8B-9<{Z-4j#&mTC0t7pe6DaqY3Imcl7s!O@lG|#_)D=uD0GHSxm2JU}$A5$;+HaDKuz~HXe_~p-@{emYpo=U3i5RY#ta`IPyk1OU_xY{Oc zq}k~B)X!YbIhUQwl!%9x<2sk`V%E>(^z$!fZc3ud13dlQOYF6maN{?=z}#>*5B%t- zy!6-_7SFf{l^voGpT*TzT*}P)Foym916j@Eaz+sHZ7go$sLV6(eLF%3#JhMDFQg3Q zLqNcXfJP%_#X44fp%R!1D0JmVYphVXlFBt0cmV;&-6%(Z6^;@UHfH@~8tNjXvss*| zi76FsSB8XdxH3!6FF<~P9DGiCjO=K3@$w9 zG-fxM$7ll64q=YXEgB&W>_`NN)7sKbXm5^m-vK(adAj#J$IrXoKx&_Y6{TTJBq&Oy ze!2$+I6Uwm|GeiZ+{_SexQ$rEsLW5{FyU|*JJC#2V~CPzVTa>1HMLShFWF2b2;Z=5 zB9V%VM(h0f%!$82Uw03#YC#BrX@{{xHWH|7UciF-SJ}7W0QorsD91;bCgDh!5HM*{RpVGgZ+jGOkn2wn+Y6GM1vf}zu}?CSLqOqw-|xpi+a(A|m4bWGDC z9E}o=+JsCP8Q4X?OmWuoHcSJW+orLgMX>qMemHFsmNbx-g+&+L=^TBXFZ0WP--wB# zphHYHG$Y-+Db#haY+(%sRGug(P+DME7IqkfVIFnc(I5=$kcDADxztb3aE69CvzSo> z(8}W3ExhsKK{6vyXG*M4m}o3QIQ+qaqRn732?z-IrOKYsQz%kxJpqT9#jSJzqS1CSm1P`hpx6RI5jm6;#{D^(Z+4A#IH6 zmd1NTNGk%KORfmS!1sLeMU6DWRg+MqO*JOkg(;_B#WycrLapJU5g3MM?@KS>mCEE@ zz?#@ilzO{+jvhNVAuS9;QZ6`*Zl;iT@vxER=q;_%9v_rrgnOlWs;2CNR>2)IARyo) zypOB5NbD#?b^Z}(q0vHfB$w-vn`l5lz$bTb`~JiMu9aVPWvvJq^BQP4fayJz*}J9_V5qlZR2^Zr0Eg zDYJIN8yuWA7sE^t6#~>aH(9OloFckr2FqvEa`S7?vT<6HMNNW{j6r)x^VpnITRWQt zO;7XU3s14G<09J3G9?|OV^SSLt4ihhsyMH>Xy~zhsOmnYVL^U~eLJ_)J8KRHo_&I? zZk$VJwqgpK#*oA6jcYkDbq+$rnABRw^o7evJ@q4Q-8Y$wuDXQD<8oX?Yig-=dfByU zCktyPVZ`cbowk^^2k+*YXV%hs##Fp)0js8+CIggGjIJki^%@;H%+X`6xc(OU_Ooku zH?2(rJoVBW6kASWatFvE13lc!;odEU9^cXYYHCxu2U)@9L*nJrLsTtLK8#S*cd=;_r6a3SsiF!kZg$4lrYF`+Q!~p)1W>=O|p(e*ce+p_`VwJ z-gcse`BPh2`}}h}zi1jO;(K{~&0Z4oKTmTVWL$S#5zr4=xLYP{J?Qi3rUGFrD0UJM z5b*90yt9j$)<-5f*N3{O=DJmtc}KsAF$^?PgU}V*#u58mU{nYQ_(abKR+v~kf;r}D zBC#VeVqvQ)& zi@5&k6@;U464B8BMuSK!fex9Knb8OljYSC=pfNE;nQdzxWGCZlRN{mQFZHM{A9+irc5fBvWE=~#XVU;F$DYMZCAU|u^fK5sB}`kV==2}SdKF1m0rH$QO?|GX~7 zyz{@p4QH?9E7uNk>w|alH?J6k;%%IL*_SwfZir|!idPK;m1dZDEP_?NMpigROj!s7 zhH2pCx_JKHpRl@|K{hYqs;karvH<2RVdb=StX{p16F+|;pIvx6kKgq7JQp@7m!m9b zP5?0$t~!Gq2kzkJfBwHTFFuzqUvn{+fAw0tTkhuWAN>^7SvSq_%ntLP(@8 zb6~@h{9wm@4Esq=zVu4YotpqJj~$H?4IOb?k+I2Ke*IP4dfOxX{a-(Z9c^I6)nDR* z83ts0MD@N?0+w8M4Oe=1^Th4{&eK{DZeGDxzIrj!J5J!bYX`aIzPtFF)q>>YgsWE#IqW=q2e*I!Z%HmZpRau3{4wEf*kKYeaYRHLah9BW1-ar~Jo>Z$%M&6@+v0Qi z(j`l&0Y=OS@knT5yvF+-TbcAo4v0x9DU}Kg^>wl*KaGEXMi38u@S9_$(JH>G@8+|j z>IWC_VT-Cj>I8hWqP^@FDY^xOkZ<{!noupHj~B}xv?Sp#uQG|49y@mJrM{t&Ns~J$ z7K>FYoR3>B3W~U6*1ZPc#;P*W*rm4rNbcg=~!K zg5E0^@q}GT`=}L;mtk$wjofSTRBeKsw^_JM?RCK-%1RQ6#)(EOv|Gke65FWpi+ z^5iCzu!%(~{_MvbZ#YggB=L*=yz6G>9YNqyZFWPc|P}_zQ&?t5#Njv zwT}d6YPUq*6-2@z4B?PT=Wsl*B2l7|(AZ+YbBkm%1+XF{Mz4=oCYQ@o@&(~Yj9B!D zt4zLcJHPz?&2aW_@%2*@lr@(Ngh#8HOj8^jcT=)i;&vP*#GFZN2NPXoW(a-8;9_-ad(NB#Nr| z+2r4J1ey{OVL|Le$e6FRKx=^z8m&iHR7YFkM(^wzttEz3zd73dV@MCFHTVjoWURw{ zC_=t^?7^boHybGo@=liB!)q8Q_Fx(Iu|9#-PBOoK36m4k&}eKAqMf5Rgv1Vo$3}d3RBxDJ63H-$x7w~Su*0JQ(j=OwC7O8q zW3i(()Q>Y$heAgLs5C7i=7a+$maOCL$}>qbM4~P<;TVM#8Y{*Kl2B;eUxvl#A?r#g zKH+GbSTz2&$E%zo+h2T~*LUorw-jU5rKj`eB{3z@c=D(sK>{P3AQhh2IQF>XLfS;a zO<07Y*0I;Y3KJiD*`}uU&8vo*R)o6x$k82vcx{OI+n9pva2zvS zLvrH9#}0?zyanti^$pRnh0O5&jXZS61MF9gT(V%&xa(;WOVqx}^%WT5IH~Z&qcTDf z>OzrY_h;EetT*i(#FD9Fwl6K4$cHqx%(oMJA4U+E>l?JkhiHopj|FY`zK`d5mFQ{9 zLI{B&6lLFHZ@P)R8^V-o{Ixpfp8b9gtyI=vim^fTj+2jg7yBI*uWuq&#G8D__o=S% z1tAG<=Jxbq2H|Ncf?Wd2hmxz2rl>qBe2@DWJyt0y$EbWw(FM~K*aiW=X*cI;=kF@Saf<<82(%DK24YYLAs`^&I3`p- znN{bWNo?}Fsobh?T?Y~!oO{6;ET8rGZ+%n``{hkWhXkFPJvbqRRU|5pYM5PT1PEgSDH&?(* zY$L>^#1vX$trWd7U_?a`ti4q6|HC4 zs#PCwD+VodR&dRn6`#tnB|o}NYdmd`u#3da5_vB~)(taKG6>hSGk3`JvtA0KE#s-Crme}4}t3)5zGy3 zCW~7Ia@@u}Eohw-;;ZLInID5}d7_SS9f%|iR?IM{vEKQd-swFJ)YcoEvCyIcFcKD5 zpBv@$HYhnqKKo|d9RHe9AZ^K#Sr$tgCCZ0lNn@uhu0JQj$`*-MM=bL1%1;N_3{Dd20DcWW-!RNZ8Rs4fO87Wlv~D{rCn(9EFqZW6Q=J^yc2@ z(Q6;yKhn0vp>DQr*-c;83kJp~TeyQj;VA=G8DlqI&vh|PgGeMyG!jOsO8OuvDnYD{ zZ;e$W^~(wwGr8#OC|4}EIcZjibCyT=>bX%)Y?b&P_#TwYnnGDqbTnSo+U@(AV!85D zb~V1Ptk$>ecG)_lu`01KlpRgJ`Z>oRJ?@GCpS>i)m(L7y$_$H>=ZCoBj2PFi3^6GL zB?Urh%0jSsX_WtRMVvF+479890ml=}T^8jF%PlMzTVxnQlNt6{z00N7WrDkkP@23J zEM6SrJD0~ft3{4|Q3&wd%CQ!z$6NF&=OqOAUgh<%_nhiEk6VZ!z$y8x+v&0=UCrd7 zG-apqor0rrRmHu>agS`L=xH1eWZ2-e#UYl~L$0Lo1h@sC*LQjB&uF9sw5C)(()J~< zvcM96=V|h#amVPsxtmbH@r`(k|K5v_%Y@3sS|GGwqPKhSXeS`xlT7F4wYuFyMu@Bd5o=t?|nN?u8U_Me2g`HVqAM~;-LqgVMk9n7#JS{A8T3$ zA;7ln2{&cKFt98OttVDP9Id7+Y)NxivG$b$kL*%J>MTBgZj?*rd2H<}Q#U8VMKcYe zz=4Bhp55UvSdt_fEY6u{F*_x323?-qT;^a&Vp{@JR&v#2NM_FsbNWn!sHfPv-Qkr( z9wk{38S$9F8Fsky1(%{J`2Vwap5awpXWG8kZl|do^@>nI1q6uRakp{7y~W+J6FYIr zCNW!}8$K(1;jc4xTzI6sS|M35Dc2)L~`{h`~Oo?LX$Jh@_$BBFF`VvULp0{l-s8|OCCwc+5l!K% zQw*xNMtP=7VfI*^q=6WBZ-JAi=v3#JH0-l+#E_5`M+OL`gyd9}xfL3r{ZY19;MW0L z5)}$FN_3J!Q679-aQQ-=Nx>+ux5snr$BpwaCsVR&k4+#`=bZU|l2(Oya;HPqSc4Ob z1-oi(dORBQ=K4rgLp-v}j!PdAZ>;Ekg&CCw_1#fkvlUL8?&F*yg@#6pmZ-#%0wE>+ zJvQ41B*~dNr_c1#+cC%%TVh+#({Hn{)uFN5K_nQ=8?Uo%z+zh~Oq%B7!V;+2Zz7Wo z&R?h@mJIUdfI>x?hdH^D4ZAG#EDvYT6+~YRv93KnSk}EgU0hsT{y}m2+4aT}o?EdC zCpk!H{{do^GZ@x}t=nGX*=6f!2@BGSr*q-?3oti4%S*d;7F~W0`95gg_&m>VwK@H~ z#U!=7$&*W0)6{2?Ja!uAUw9f>LWv9g;g?0Uo3~$ok(bx)Wl$thG4C|anm2(Y9lCa{ z=Ec`mQ{NK22XMhv(Gw*`D2GFm)bD~VmgHr7jp4s3rV4mmYTIZaL+S5nv}uK z=S{&cY&s5XXWw8N^JitSclBzTE6*lJiNBZ?RYf_*Y7hDk*0Qk^Tx;BVT3YNDOD2fX=TUeJ(T8DkR5b!MIeU8DYnY=UBF3FMTnI;!S7Psb_I=bsnzw#UYfBVXliO2 z@qraW5Q#)Mc<>;aHu`B1j$}|#nLf$KRVVqmdV!D1fI~xvMZ}S`wObtMbLb5_L^Z*f zY!#m>Nla8o)&=`(BRsw_O6@>As%u*D^bO6gvY<@Et`GBMF2m~}LG6lPKM0k2_n02j^l0uDCLt?%|_n>qjX3Kc=eds&W zhJ+N2i5Y?|H8I}U5aRg;m|m)**%B!Px(1z1F`il(;;*j^@^)BZ`XqyFFDQy2(rK}5 zW0(h)^z(EbOqt{%+bc%WQAW09Nd{w(lBscWp+e)%5ce$)@%Xwh+xsL|M6$2NqBAP# zA9PTYHA>SJEE`nEp?+VC=hj77+Z=D~IJU&HBzl6%X{9O$HbuB^Wt2zXh_F+rEUeNn z9PlX6anRzqRbl@8T7)*CGC5PjBf)k9t1h22q?E(HyvLpXN$uBr+4d*3pDv%OtC_mD zmh!+eoA8Z4kwqs=A|p}3cH$BBSp8}qdwv6n)6U`Y3r;84wSgyJe4AL3LS4<<>}ZVv zCc8Ior(w{G*|dhomb^{kq%*ku3uh5*U&j+KyiH7a(F7=p3dGp*%2Pc2N-epw&t%ce z47R=SFi)+n#{@cdZeVR4Oq_E93#S#*^43$_{nSQmAllo^w#_y1w3W_!)@-OnWLI2u2n9oWpuUCl?-r4g!%Zg|l&(7j0%Og@#f zPAX>C+V#}-0MP+eQIw+tSCamNwQSl}Pyf-GFlId) zx9%gc{1m=)^#ZJY8`yrZV@R_^*tupM2eol5I`c#(WQ2J6Z};-z?l2Hx&z8;X?DR3? z)Ww`KIhjpQKfq(F4-n%pt7rky-d480y@S>WFxbe_haTe1<^Xd~Tf~V|%SrP9Mh24> zp2ekCT*1P;L6$zVgx&oPsG$0i7&rS2E;#EnrjN}a+_H~Nn`>wbso)&ssrw#eOi?W!V!?u&y!W-eMnj#C_xf6$&jaEyQ9m zrca+vcXv0NH*dzWEHq7zhq#Y^94HC_>G1aU2rKFw6tAFqf|rFey);Bk3MP4(nTsiv-JooNS$OsT$dpK5of&2xcf0 z_zcR{$JlJe_s=2jv)|M2P}43c%~eVD#>KNez!5+gw)C>_=}IaorVglu+o zNJ@h$35tU`wEwCC(LtM@2qYNs&oTF2borbi#5-4-74N~KslL7*DJ2C31qdOisi`3t z43eFl{l50=qn!U}!r?Hxckd=YKcBR;v{C1=ZJTH`ieVUT;jK?2W;0v2@4_mb%efcK zr$B+w=C!m$1PF(HyEgLn{w}7D*~iY#Fb7*3*wM9}g$qw%QtB4=?`eesn|(ck@e2y+ zZCc6ZeQlHn_p)nHp`-Hv8+tZ#=4nNER0T!RAasEB+v`ZEK9h4#ok1d#h}GS}ORG22 zF})B)I{0!cm^Wtzsd_b;_8@Ca&NnnkW`;D4TN z;$UABJJ;+cIQtqdI<*p~w}IW8H`5S};T#q9bfj~HwQYKSA)dZ^`ulALom#dWFqrxE z$z&J@nO?Ywt#9ujTsa5dJKQ>|Zs7Im$3&XjckQJi5@h+M z4@lKRPQ^^7PRV9+Q4V(VpIN(nGiQ}e0yMG;$5TCR0y$a*viavcxpEUd)5aW;t|C+o zpU;oi16@s9+0djh^Qy}@eL@0<%z8mH>!_(~rK2xGPg@7=J&>OO!tjw(K9zB0@%dUL z=w3g5pUU9QwXE;(Gw-T1IbnPzYGo$vxBZq?YwMYQaxy~ol2baB>D48aBu1!v;5ByE zw=z4w$i2@#&WL+_u&9k~$GzJ-IyzXlZXH{ zi2$j|0!<36AyGM6?8tP$vcQs1Ug1ISx7pndQ%e-YfW`hn2d@e(%{Ebw!uSFeuOhLB zwr4qU_ZiC>-Rs?U07GH&SQV$&>>r*jOYDH2TUiP_LJ%b&2|{H zh7Pifi)qslq$DVKho%h=3$%x}FAykF5RN*aLogwp7jN6~!M0Up9Apl z-_Fl}{&Ti(-+s)r*I$2~JMOrH-rnAKwXWN4yN%!f{`W*85t^Hux%ARYS-N!Td)}v5 zEXH@f^Btaj_Stt8RgXra{NyJ;;jzaa!!*tJbsYBW*~3K_UBsF-YmPh56Hh$B%{Sl7 zfddEJ3+K~FG|ZrBk(`-AiZUGF5krmBDE$My=*dA6y#gDJ!s=7F1u733wFDn4oaVBCa@R4(UpSm;*v_AUZ(Efwb(@p+ZO=a&r<< zBi)!$;wdQ7!L%hPI@!6Iq|i^_fH@SgKO|5TB=%76moFg&kEReC?4-*Se;x?sz?Fi-8Z5qjK3W2zotahXBxt|(C{$QomC;&@3U zMd#!^LH%ZvgM*NvKytRuym1ccV-!xCq|v@7L|fP)$&wIIsmRr+?UgtR_%umpV~q8^ z2J@%+7}R4lN1&(MCK8eOGgQW8srQM=KjW;MXRS@m9 zSkWvwXO@RfJ%*FzVL^&y`C5~Rs-UZ&9%dJ*ft$DX8A3{Mq>YV*?O2C~UJKBqigX{n zM^IZ^%fk;p%*2TknJ{6(5z|(!TE+eM-_J!CT{JQ#=$&Y2XdpE;6)7c=NQ46i4!mp8 ze>6`$^%N~FEi7KV_=tVIgrg(em&8s>q_yd#Ggz`LINA>TWJeHq8}V5{+^f8M{-gsiUJenp30xAJ0&ef_-n)RmEAn z{$?$kx3@BWrj9Zsh2K@fy0wwF_jHpp{WKitVousn zAtTwq`gJ=9RGiNR=gvXf_cD7AY{jzUnH8!uiG-p@NlXXZ(FmsHqV;W{xiy5HlZevS z#NJj&8J`>1hLVw!A&2UC2*tH2_!xzIe4vA>ILIU1)@6J!#*ja=l*6HD2Sqp|R?UhE zPS~cVSu$;mL0(=wC8Tj*lqa^vsE-Jq-Kug%nU@>KgD@R7HaYY=Fh0xRV(kwiGA=I@)XolT;SX@?u+(_6~~& zo{zAl1BxnDB7+tiTWlf{{D2*{*}2zZQmH~llAyoGrZ1?nXu672K(S!kh7fN>Yz}q{ z2JLv>y+n|as?gtKvZdW2EWzW%FW|bp7G0AS3X%n;B~dhmsS~{j_H8M0aa#vrdWOT1p_>9c8(4z`G2cpbeCo`_ov^B-TagQjRW*lcazFm&I?3o_Y` zjp@XT71+{7S9JGe9~Q+P>1jNQ;p);yPqS?sDJ6=cpd981aro!q|5f$KX0hWqBLNdd zQASO1F${z2uDg!=@4uhAx;n;=9SgwPwQKp!Z+^q<*|RzE#1kngDFNVx7hb^Q@o@U- zr=#oo-`$Rsa^$mZ+ehr{bO%rQqFqm{~qTxZpT9AcvD%kS$ zqx_X7a-9aYHgu6W(Q_zOLD4Zph{j!OdHvN0o^UhUH*BIiX$DtbFcY=*N!E9za>>o7 zG9zv1T^G${ux=NtHg2N3dMSzUVpWpfQVr#ek$kBK}efu)aFnV!=iD|dUki| zoN&%*EG$bJ`o55^U7K0CVIwC`TZk%S>|6ajPb)=)4s2m#Zvu-hodlR@!sg(XH(2tb zMqYR~ukDI3<C`c5`nHb^hbS!Nn`KsUF_Ob zbKLn=AyHJ7emMryQBaU5h5~~&&%W5tQ-?nz6wnocM@V*T39)6!M!1Vu{%DHly!sr*Xl#dGqepAhdM$2Z1LKg7R!dxUUW4+ICshG13Z72W-v5C&?o3_G5PaTF>E<} zye$53{4>sn??p zdg_R<{(IEd*Ry2F5}KNt@OV7TpFf|ubLWnlFMjH&r}DF({fzbN*E4qPSfbG=J9g{< zptrY|0|yR_2=_-HeUyxh42p{4`KSB#?c>!~U!}3Jkw758^y$-?H*X$>VGxN#c;%H> z2nK@)Ay~F-8JAvq>8N77uC9*fo_mh=_I4^OE7`Sc7aou21LxDbd~^gWPU40yrSaP9 ztJt)r1y9}-PMuv!q7I~w=L=u{GAmwP&W>HX(31+tn>f@^OUhx=sf)REtcOV@dGYVE ztGVJ!39NYiO=@=UMh5aJoa~_Z0?a+{9D3erqOrwd&a4Z#!IQzVH`cRP&F0K&E@w_< zdfZOhb})j;D1FWBvs9|ix{lN5RU!aiuz;!4b@F_GnnU&UNn~gF0q~@bVfG9!8Jb4+ z!YjGa|2iwT?5D|zVi0$UVl1s3JtKspcw>`1B6@a*k^k= z>GCgeQgt2%kU9NCF6cI?8wjE0=P_+|HTnMd{+@LCO{Bc>GAp<3q9v(_obi)6>4God zUG_5Tw{5^iq56b56sIaE{xnXw@(T<+vz*;K50IEMfs)K3rcKw$PLx29ldt>|iLbxH znq9llb7ph>X{S&Y5ZF;KV<%6?myr_J4+&{hO__?3lj6QIKCXznM~TrL4Y0a(96A1O z#9@OPjuq|>VcVd-Jbh(UTurbo0fI|#x8UyX?k>TCYj9_9cXtZ}2@u>}gADEjcXxMt z=ezg4*MC@R7O>9rOjlR!+O@YZ5$)$J=b=HBh0o82fn6uq?)ZLFA1WA8LSR(&lFrHP(j4u{g5cl~JOR`q-v&ODI=8Ml>C)jsuo;fdn; zo2Q8a+Bk0ODG7F(10+PkavW6~`kEQTiire2YEAggp-4Oyc{{!hOufI?^}VoEEK>Zk zIj?-oL}=eJl1G$Z=9w9+V#QO;Vry1rMhIkTO7770M73bx&6uweVVUQfmaN1F4|cM$w$5*B%j)l!_+ewy z3MdJdR#pP@*0h8Io(XyHwZPp_{2~COnwh0hmI?llZEP%va*rb7XJ}hrkwt#1tom9Eav(Yb|&V%7}He9 zf%y`3eZi5}bYgygwP{->VcQ%N(Yr{W+UI`Le?P!53B9uVUT=S(%tehTPBy8{h7zvK%mU zu|%EHRq#drEz6ImHW>P*L}_iinmC+OUu`xq1s=djCz%lo*QzObWsg=EO|6iL|-o+Ue#j2DAk)9DLUY?@C?%rOv5PBfxU{Z%E5 z0d|XLXIdDCf{JQpdb$_Y?-J^~^T7ZJv1)R!e!>8XGO%;?iv|Hu2W>xZiv~g}P~Zbm z6cBsL0R#!7fYFMWYX7$ra8ag6M>q?9tn-Rp^Yq+Ye-svd29MKMh>h2M?x*#KF7V^k zj!ui?7TW0Vk`ndr-v!al9RO+U#>UkD5QqPgGfta-QyUw~($cVL=B)njK0ZPu!mnGX z)<1rj3@1@46&S80YnQ;Fj6E9S?KR1r0VPviKK5;Tt(=x`Do+{Ul$Egr)t;d zb67_OX$#2$iY+iOM0@(sxO2Zu{j-=M-I;c8M))%djt-^kNTF2BXURvGq>-U$GR=qk zEJ=u-YA`PCYPG2`2RZxv+9e)Femp!p44m2+q>ec^qV5ghB&hYJrQw@N;mOrjm!&p0 zdRSCqGb1C2yh(5xqn=b6o?^?x-CeEg5ipu~Qh_#&;y8fy?eesKvd(U$31EH8$sthx zbVYwy_httEa`$e*u%xao36I^v@p4nt!1qoQP=pq7aA1CWdsE00`U!~rYE>JIcfXEy zt7vL+&akus8p7IbuC$|Rj63_;4pf*3tZv5|fINAiF)sMj0gw^g3Mbi5l4r{A5FpN< z<%q4TV@qQ;Jog%G@34tdZcp-e#(Z6Wa0pD`zd`Ea@gqi4FL*(hm50API=_+KZ6N3l zoa-no?If+AY>%>5>$PcF09#78$k!0c+N*5E{6G!cm*N)UWCo$c>Zg;;-rHK<+I5z@ z2l6yIZE?{Ett^yO{Wz4{Hg2jC#|ad0Rg@U>#1fBKDWvk;4qm97G{#x!>453%gD=<3kv#bP~(t6r>3U5y1LdF_rVwd())>L3K=YcG8BLH96BWdFdiNr9y(YQ z0L<`kaY?zkA0ph2+Ty+hH8nLQx@8wf+O2@?#vsUfZ^=LX)E*mm@Ble%5AKj}1y}VE zkj@i4!amO<7<7NMFq`+C49uVAv2HO%zNDt_|4?AKYLf;J4D1PRLU2i^g@2J2G>-H6 zBLk+wN5(+$e^;{z`9hAu045wJ`-V+R2|PwhYO3n@@8dw2mln(a5>;S?J18^Z!GKMm z30+Ko3Hti_W)#bciuShi5sSfTX#Vc%dXKOUGj5r7 z#{t*|g`qEw33I+eesRCkq1A&JH+cWOR~4T3;bcLqA!qnn93f`EIz74P`nIFwQdjiw7E zbDRe80B@UG>shL@@^YYt>#bu@n3X_z;(!7k&Dog^N8j;N_w#%;&sGSAc84cxXJ_Xs z=-?+$Twe;Uy3|_p*q8#4^|b;CUV^k4&Bn^7s}Dp*=l{}-9AUf%xGTqPg4w_Oq1=0<%$$S96nIN7VHpV*$3CfOS# zaG>Dl&jxbT%j5FuxUqw6U?DujX8_l@q2UG^6FeAB3f#*QgI3Ox9#5h^l88`Om=`F{ zi|Xv^EA)JNp?lQ+T6jG&A@zQWoEqmh$pZRZyHeIA=O1r)r;6FPvPWs;1Y7BIe zawzs)JjCS%~X=NLuoS$iRVph@ ztcw5D@Xn;+uqMC(WVIN>eHbIG475vbdd6QiZ1vzBb?4ZYi99wCR`|)6O7eagE{%jwwEucD zS<=?#C4qaezkeMr{2Ex2=a4rDk4 zflv3pTM@^=Gf=Z!D={;37|$}NckYjRe7ghi5e!qNtLW;ESeN{C?{7#-LbvaJbLZpZ zqhS;@Q~IW@J>=kbLy!yF#{+P9B_Lu)<1iEBRUF?uwcP#FgNKIn6v$27i;9kZx~ujd zkHKSypkZX(%k@6rx&o7wR9DBVEAfVkkc!C5BQ7m1osaKtZ(p}c-QL|JL41-_jR+C{ z&-h7KD{$ju3u)-^@X%;yFjk^aRYP;2$qv|eS_TF}w7WF(Snc$^{e3py=Udf66%q}m z5gBsj_dD6$82VN#uVdl4$U4||&-eJ|TD~U%zvlrwU@Tu&YYvv@CW#&Ig;;tsBcGV> z#ROW79Uk}U@o5m}d@pvQR^PMNrw)>?iF||Ah$&t!`^o!2Qhik;bCS*9)0bb^%S%w% z#}2JtzE0}rLE6iPk((W&&HLL|4$k#kSHf%=9tFU@KxEBNZI*qA8CRSKlZ3;130rII zZw#Qbizq2_wytY2o-O?2iWG=7s3fx-@Zm65u;{BV69apuUor8`fC_$hZ*S-BDO?>1 zR`{CVkw;K!7NBqB0$qQ5dnUj%p{=bgQBx|hu}h}jQ1y<`Q&4Y@ z%HJN;FNH=f=pfKnu4iM#2@3*UiA^xx4Z?otqVb{rtMAUwTrZVUlKs4cFdNR0MF^uy zP%1bj@~vA|%mNK#5NG=vG+bcWi4`QFMikZL!B{PRX5YTByD+T#c~O%&grPmW=AP;0 z{amfJB~fRZ(qM)&6{h7c$mw38d%N|&1oDXR@rqOquVx4(c@vq&B(mbjNNe!5mMhrD z?TjOP(4vw%-B3oWyU2*2M6xN zO^L3@aR+DT#NI*bi|zB@E45gGsvQAE9jp}Ab^>?)%@}+i{*UVgu3k3jHzgl0h$kyp zNwY2)E}~y~b%w>)t0BiPx2NM9n$+D;iOKyIHP(7etqLRNg9YBVm8cBvk(D;y;h2RV zu%o-2(1|~bowc{T2!BLtTEKvEzx;%Pxv74nTlo1sR(N?Rx%ca4aQd<|^$O*oX= zV0@w52ZmPMMoRXQ`pJbAazjRGI5 zKlomrtx#WhcSb+{y187dx`+}wb;2p#QOTok^L6=1sR zWvO&*Ys0=htG0`#X}|A*?DgN&GNtX|_*PaZA}y1{-Z+1HUELkD(u8V6n3vVjL*1sl z@U~t_X+_J+x7Ypm7aE4D-P6AY_ncBR!aG!5?pJ0o9s&cC{(h+b1l++6V;ZRC))a}w zk=AlC5QO^oa1RU@+q(o^V32yfBcW)I%B9B7zRJCW&5(A_yWADe+bi=NwgWE>g$~Kt z)?5CKo!h^j6#k&nJQ;;;Rjm7J&yaS*qs=)zzkX0MhnDa&?D@;=T1@#ftGf9229(E4 zmx1o9SoRKq_j>=GKa`W~PRH67X3r=(QEl66|8H-__e{&z`EwxaT@I9hsyT zHpO{=5?}ei=HW6u+%R9T%(xV?NJQ0*<2xCfO5eYI7R{2p;r<+GboCh-*-MhdcE%lk zzamI1a`m`Ai0Y13yvAPHqHJ#auiB7jD(#cf*VUf#Wr-KB zT02;kgqeb7b|mqq$3mv1j-P@r_=^jk2_F?8Eb-9w;L1|Hf6klRbV-ecDU}ePEv@{w zTTj(^JIpB)nxNPW`eE{&cLynF5@q7>9r;_b4AX&G(Vm-Prrn%R8Uj;B}5`4 zxMA)rzp*hKiokGtPY`=Rof_iTGL;}>?Cln*6H6i4-#9T%S>AnsvZCFX+H|j_+t!yM zc;<=%H>i=4n3pN)RY!t`XbK7cNm%aT)BV5G9iwlkodFGYw(N3a2r34ev2~Wn)s>6j z-ZVa~N^PZ|x+5X7vf9(41;wF)MSH(ZO$Nt2??%Nf&xTwM*Ddov5*>o!oO8brv$@_9 zaf4NpOR+qno%QAMfRgLKM5rHZ0*eC}S zNdLy<8T7g+S8YBu*3(?QTzNrTzzyd3!GF7GPYx&P_<5)Nbcw~hnMJQ`c13IBx#`fo zy=g;x%RRTl*cK2F@EWBvMh8l!?0zS<898uVO0Vuck?*&J``RSF^cvmr!&@+Z^=89X zi48XfH^=8~K_>(9?4|e8b1KZQq2L%dEY3?odu`nLL%{fuj&)@}Q_;=V`n1TK1^Z$x z30)G4!qfG>@uA?)-%bXA*$k|8Y7)?=;@n(fz={i1gp}o(FZ7EHE#STM6(}>UXN!sC zGFf4*%hqHS#re@NZbMw7z{}`IExUXw2{=`|CzzT{C-y7v`SXh`cgBe!+(Rw58FDCpZ zg}sMtR2*C4^%oZ%^Op;T@Jsy0EcZEwQk9&P{E+cXgPdBpMjg?Kh2gl6$uK3Rrx)*H zVZt{xkpdWP-_w<*(6v}WD{E8QJbl@?f8aP|2lWLsF=YjE|5ZO{w2=Oa_baZ#_6v z7Kq6^jgXE$`O?@OMARb&oMRh3E8J{m3Hm(c?s;;APQ0_sMzOV881V9EwSgS(>|qqM zSIvY!|AA-tSU{Xgc^ufpHga})y50GoACFJ{2rR#gidg(!J@3y}{&P#K@{X}vF*7$; z)zJa%3U~!{L>=vF#?U=oQQ)xb6a^J_EezA=i5fhq8kP$U##Hl}fDD2AH;?b0D2t0W zMOm+Bx?JooK~+O(aBBmUMEf&EU_=g+4S{|bg73lBl;tZ8bKYddku*sNjqjUkkZE~_ zw;b<#A-6R&9=Fr-Wg_L#C1k2D`oR1RZB?9q%<>n_V1+Cfw&buCQjx_p2?iM%Mzbxv z(5vt|C}{a1^sA#Z%EYqx5j<)&-Ui#Tzy!uC3NsdCF_^TF1j?)5SSmkJic>Nstp0ql zFMc@)EVag9WkgWhS@<}@KzJOaP1ZJCm^fa>_7Y=t)yx;R-M%0E|Mf;%u?tW`wYIjN zPs8}ohUPf#(-!^C4Dj2P@J9h8FtL0U*p6SOxSH%RYANGXcB~PwZ%Jn7B0r*+lZI52 z_`DWf!D&c@Yp-9f1ol4BpA#3t)euJBRk_b&+2oniIR|OP%Ub$-leCpxK34_5J|Ge- z&i<2D<_Tk@tj!qy%`UH^e?s=Z5l^|=(SuhZ+cIY7^<*$sh}9U$@;hknMYnoqQG$`0 zX*nMK7%biao|N|S&p`1o&lo*TVtDr)kL;)|$(#!akFdsw%2Z$;+w6C0CGBY-s>)SA zNAUQce~t641+b1opG{g6i(QdL_vrAcj(QfPZbWJqZ-ZR_oS~L6k@DB|LF9io#YckX zoa_+{Zm?6}DR@qdIeB{68=%=ZfV^;VVfugT0+M_C9W`!;C!-H^2A-a~;C^OWKY+C7 zdO1kGb35y(t55v3VZ<@&KAPxbZA=+f+y*=PzgZjBc^)@Kn%xfEUW>h8pBO$!Lgf8> zrG8oVdODj&%>16D=+EQce+ymR+bvuhmfl3X+0C34TF`a?)a~{6 zeo<0?B}}N|G%g=8F1_dCe?80>n;*y#8`kAnr|XZNc06=b)t5vr7-)y7HAcLWZ7~r= zTlI^v3s`0Gy#5v+i!mwOVi(GA7x+pK!+Lg_a+$p=LXuBy+3fH&c@L6SGf?4Scql?RspiQp~8-a}qg@ z1+3u>G``iexA;(58$3YzgB;=Qx{%b62&6~N2CXgYt)$R$QSZ!tGHPOUkB(|mD+-mLK^lTjt zDSjZv^efO6E0}LDBCVfLUPv52o%p{|Uw5oLzJvU$Gwtgr0wjORPu5L7G*^)yIYva)gtiGgl*y0^Q+ zesq0w($mUKv)F;=>ZGMMq>E)iV*wh9skdjkBfjxfX4eao{pSu__phjY#RHp+pC@luWK4|B}a*5FMF63^p%ntcYO>hbAAeuP4}o_8mfk zKI?mkp%FhAyi4F+efWoW&`8T+dfWy_k6L~S@0zd|lfuI>@ZhY!QEXxWrM$em3+KjE zJL$@Pncf)OZ{~LTrJVF#SJF+=;I;Lv-)f^fS+O03#mc&9H}-d(384;r&|5aw3;`jy zpOqG_ByUa6eQQ@kB_&4`nD5_(*p%RD@xbA~C;kP#Rnr$tjtr$ee5P$O8B9xW?11W(>FZj1-e-ZA#TAR3CKW;lzfj^G|l=D>l1Rh{ytR z!`2@B)!}d|!$&AXjvqpHZd-PE`#y`k6zzLqD5!7r^_g1O z*n9iv^*;B4opTx&t+&bCM29O5T9bRKQG6{j&fItjy9p|)%mhhTB}8Oe1Cx+YKtad# zb0jUbt!R-8s`Bf;Kgi1k^=LqnB5XxRZ>2B2+Y32;LZ_D`y>fF*_9+Iw4VCS`%0U?> zGPq|)nT(b-f*XPzXVQG2*n4peZL7Zn+W>S){LcesNFmWyzcX;qrD~^ONoTIwFU&hn zCpcAAqHS$LzPf6wpWb2rI`dD3_c?1*x}mtaA41g9NV&35nD4Qoeo9jwm{@=E^@BUt zR&~?`Rj9wpitY1LD}^Q>O|3<)|Dhk3yVsBmx~->;VC;dxV!r>(f%DC!)Lz z3dyf3jKRY}<3N$%NOgdB840)R8DV?os>xvInfxRNueHc0Omq{4>-3Pa}Cj{-3F6+2s&D2^k@ z%?X*f#yj;7SG&tvN%gZ46?)^(YbDnMc(TlZozoEvBrz(B=BzkC%53PxmLP ziOfu;*}C?Yo1^BV4iC1tq}V|!guw#++rdbLVj9-f^&5U2$;kj zP@mnJ2Y=f%^rWS}Sn0WuM`d~XtEK@AGI<$1j^=4=%?4V-vjIiV)*cR9Cn;Kmy_S$O zs&eJ>Z~!fwS{9sGwWy#V@tym|jyCF^?E>_=&!=lGG1PfJxkRuqLm43A z1>Y;eApX2957Z8+8wiT{pA!S$40}&~pz?&#+RrK9Ups9)%dEcQtY5p;c~oxQrLmgr zn?96LWhw41c_;%d>`%$c^Wcfr- zph{)X->uI};19+=e?6;5x(|0!Vet|2k@Bf&7a2IYF}9|QD%iU7V%4a5@j7yw$?$%k z*B4+X2v|1v-)fX1IWTaeO=iR567}ZWTN_Fw{eZodRFa&q&^W@6(@%i~buvIvQ z^wlfA?ImYuys{BAUmT=F;!REWtoxFcP3FZp8?h^Q&-X0W+wU$v;Z=BFGZFiEbMh5kFIW6%JHooA4+Ky6_2{n+OAu+F*U0npQwZkf#C zO*Ue|by&cMx!E5tY-&maczn|&Fi~+#e>u)qMD5&}*Eq|U7P1E$$`Axfi?k*VqE0~) zCmXxD;ESE}2C;YF+Pv_OS81+C<^92GtwI`uAOkFGlp4z&FR>kl1m6nZQ>AnLnTg1B z{qcUJ;QpL`)DrS;b9m+pP2QU{dfIhM=ard*CGUUSG!O7%-|sq}22miRyLvg3VLacv zU|ZgrP`YmV^fI@3hpy8XShQOrMwRLJH%FwOZv5Z4_a{HX>)HEdOkovt9~NrN_3%rM zzN|eVbwAAq^I%MD{w+sfL1%}j*&NU8`I8K( zA;=ZF3fMN1toIB`g(5Pm;jVUue6+t!@~AU!Zzn@lc)zQjx0oh;JRac;Tdjc0n%yxn zyeStHI6=n`9xjt>Fh|V>lGaI4(0l|aQ*0R{yFssyt>2*8{)y}DC}p{HGN_3j`qk{Z{mV%hifZPk;eGMW(M!etcw0AP3j<&8Y9&=NnmX8J zSiu(-(YO9rviRJVdJ6I-?l%ftiNMN>E6%x7yWArin)>CY$DU*#**a{c!oK$)fGKQs z&AvS!E;gs5Febv!mR&-rsZP5hYvP^f$HSJRzy}qEO1}OqJzCCRcmLaP>oL8u{&xoU z<1d0FdTgi+3C^!>Yi1$}HQq)Brhu4`{LO3^jS)+1my)#lAHx>-6BSY$-9Nol$MDqE z0on2R;(L_kG=ZVX^#BfF`edY>+& zK}a*N1>INx-i2~%YUpZm`1tsX^_HkWYg&fFxnlF%8^v@#!Q_VGS(}7OClQhrXlz)v zUsUpjniQ1_Z8ixGpYP`j9}6utEoA_9q|u9WhFWg0vbv)fLKriI5K(=3+HZ$5%T>_E zUOA3d?7z7PZmtk#Z4-}I^6Q^($lP5GSygjRn7^r5shmD##;*>PpYYQfCd9c?NU3pA z&MFygbA-;Ap?+K$#$Wz>_A1UH?ZGJWIo7ur#|!tj|D3PaH8^w7RQnihs>;iuqA~CK z`c8o^P;)%KU_Bua=-;)aTU?B2g3bV6%naXWU&vpan3Xn>`;6VD@I|bE+MLy1jWf9} zd?Mar^XduSiprt8Hl}SZ`RR%=oqd`!fPuS^}AoHhaYSCWD<@M(n`e zugz7sk?1Xj;`c8ID5y7yTM2aZ?IZfEszRi>>ub~Q-|w8^=LW*jU5}hqJY)eQs-S5x za?0u)5oP4@7n`Gh$aRBQF@C=UBZ~-v?(aVlB0AQa|A&VOeIhJiMO6NW#PmLLhv~t* zci(L^E!` z6UQ==!}G_9pF@t+DT$onCa9EdMYQJI|EV1T6DGig`2;`2GDs=U@>s{1F1qYos+5KBE>F4(fZe=XhP5XCAF? z0!Gy<{_HW=^&z?Pb@q7s<8>u>vZd!2$RdqPJcArZ*f&-7E|rSBb5Ynn65JR=J_-TYinzOuS?X?Y{~5GY#+eoVnGVlX5cCt$g6oi#5DKWvf0=v zc+#;-)G~OUwR_!fY9D%esQ&{x9#&E!&b!L5jygq&j+MN6Q z+Fe7XUv%&1Xf!&wJ(ZND^ehFxpm8HZZZ$8}(1?R5s02}+s`SP)Skaizv??0N35!j^ zm~>HC#qHfV{_cFVk&v)85No!ZwZiKYC$JpX?41oHR^r72vtBv*KK-U*I5co*1J1iRhP#WiO&NfHO)9hS6F6{4Ik?~?IG@&HL(=9v2Cw`Fk?diJnMjgL zFn+f7mdUQkuu)o?tS0db2x_QS)8zaaqgh?^8q0a8sk6wM-9Kh>T{rp%u50+2Ql3_x z?~~yy*D=3%O8M3LO5HX`T9v`XNG0)g0}MX@vn&=uoH;r|C@bY=M#x{|f;7TJ&b^&- z_$tHU?DBv4iX-Auc1djDq;!Lcl#T_@J-|jQ*%QC_UKfAmWmr^@Yj56gSXQ0=aiH)a zIY%H&zKW2mP zwQ!+go(e0SyFy?Z5_!EO z)I`7Sv>M|^7Fk;4Bi*ZZZ-LTIYj`j6KB6z)AGNA-`LUNa2ej?4lh3y+H-zE>8kCJO)e@&AWxN$oh@xRu60is14*UW-dtPF z9JyMH2e%?1b}LU<#N$fID`H{-nX66m_V$k~wvvXX%x|o3Jq=xQej6E&T48o#PvGwH z$F=2zg_jPkx(jEM@B{ZhH;HhrFTcCH<0CNQ6w{iG30dv}}tRZ3~YPxLD5TTzLQR{5???9#)^M8bHEU&CL$kx=YUdDJueH z-2b6;PvQk%q#zJlK9M`r)3o4uyCn^}e%hPkxFdbd%<Xx58fRO`8+c1U<#j zD-bmHHEs7}WF(X&>-c_knF+h~u?K9#UFnuO9d0gtA8vYfD;?9N0hQ#E?9D+|4T8Ev{}KiEdp zVUhYQNybYb9<$rxkY(~XG&J^=bJM9$GtX2AyA>mPptP*a1n6P$D6KX*E5O!eIn@y1eWsmq68l;jmrYae2iYtDF# zHypDuT$5Q~ya|P5sUbN-Q^tKN+))9>yB*+gs{~QzbXsvWf1FLeF7&t$7Q+rz==RXo zkHVwGI_EfDNov@B(0ja2GG_`grA{n2o+@RIC>|(>IFjf0`aQ!Ggd_j3wp@~zw?<{! z&0g?N+|I}1g(4{Je$NA$EK!vyA&XpmTKBx>rZ{6=?6_tuNG+)|l49b4@;oJ8_c}6o z=hGG~az{S#O>TXvkPG1wF;EH!b`YFQB9bgsN_l^`e}*-_myOPB+DCmoo5-vCLqkMv zgHSS#2d)_AJ@vb?Kd+K6vEPG%nR~K=bOxuXlBQn`5eXZCcYk2#`tmj5QF5^K7y)RV zEDqbn_{Uz?#~YL*^U?(?JRXT;)Y!cXi&7O2}GN*x?xoDc>BjF;p*WsM$-N zrJ*=R46{Tkb|)-X&FvrIg43&+S64^%q3p^B&%@~cGgE?0&O8sJhWVx{ee|w! zN-a5hgWNMSL{gsULql?r(Wl!>K3nwW4IaoQ_h*3Jxz?71=^{krK#u=fdgl7v#IM3c zOa*dsPBdest*8^~O+^?=Yshqi??L;@0=E80BT5}H+0=wZmEK!w+xcNP)tAQw<1sG$#oge;(By$lDMCj zSjWRMj#=;T1(Tzzjs3~8%_L^buRivPBa?S)_iGpLCl3(hOu35BFE28R^3n^!IgpaU z!ND9{Tm>h5Y39=l3(|&$B*5TCVBn|c=jX$VixOZms;P+!VCDY$Wz-Lnn(p-U4YFbw zGop$4{hQ?|CA#Ihqjk4vPc3KfccVQCthY%~T=rkt5~g1a7|TCwO8+b=tLMqx@qTk$ z|BC>b6>NTjsi9QF!7d`@gtfy4T^XzBDy>4PM zCTX#0Nz&$$w0Q6^O~~sZ63-7+W={sOnbeA;lIjo`8rgweqJI-ViLnYxnw!Ur-|Y|h4$*%BvrJ(Xu4TH(X52R3=osm(L?RQy>$=V{P<<0!{Z}NG5B>{wyp^+5! z=@&>Ap*SfwORQic_$xs2@eyKfgDk~2$iormckdPm>`y!cp=MWE5htn5$|xfyZ9ZHo zxosikpqKWoD1}rs z(SFH9ETYr)s0^rddHWdT2QZQTkfneWkM;m-_b-r{``{yZY6R|x%%xdn^^gOaQi*e9 ziov~S%2#iBLX*3Cej~9i!an6vE*priC-He^t8N>6&lu5bkP3M${=P0a+-vPQ+qV=b z_ejoX9nR;Ee|@yh?e>ek4N9oZl6GfVHBy`XUE!CfMmL;nzizPrBvvT57g@zg(rzQ9 zttnE7G&|z~hB0lV(Iyq>x${c%e;rR&S=l6e+t*I;5sp@0{7JXSJ1@*yqJQ$E{xZi= z&&dw)4sZ9#g%5>UYWKzgfu1~l{RqLIa9@Wm5Wg?bGBZ;%Goyl?;^?YidPAO$7`3Ok{xRTPvaV*!`%Fywr zmNOk2ce9IRD0KL=fOMeVSe{ntd0V|==$C~*7r_V|M*Yh74k)!&pPd;WT_ITX{1qG* zNVAnOATnoWV2%A(F&#ki@IG(Jo4?M@d2m+m$SBZGW9|`=?*rKvr%)P9CBS_@xoeXq zkO79X+&1uo6S+q6mFe~nn^%LfGU7ZMtlComLjR5orZKtQT>>>W`q7X$6_5Bm(*!HI z73y!A#d|dRgP|XH=-@aTUneWp1gG+H1E zEmU`X9oKHFZ@VIH@_kTzD@trtSdEZ&e2)xglpHGO8W-*3At9WRYQ1vbnIdk#w{XxK zUg#EaVdrH|zhlP9F>D67$%?*}eu2!V0iRhvS0vzHUdF0ZJDsgMyDIiNQ=rXCsi!3B zYrz+NUWMt1jvjTYv2Ef&+1~Zc$g0{AJmzh$ZHnfWL>JCQ|J5!$Qp^<^DS2Ujhpk5d zyEtQ$oV0Cf9~Y1G_Bd%_J?L3TD<`HK@F(&-1OLDG0koGrwG$&-G(5i05WXWz4?FWd z7sY=Dr}2CQfN{4?nNW0+iH|jLM_8ld7jW%|;S$tHu|mb&*tX%x#Q5MO(Mf&~;5?L- z#UV|+GHlIjb`1MHNVz#Vfj;0^8cg}ELJL?bIa1Z~$+u+-4$C&z;#56svm4vJwP);; ziNBmKuM8CDnso^XCFV@0B$!_R{f9#QgCmo3-~eC-{P%cyMiK(ek`Y@)*T$(s`7AHq z=oc5?r{zH!$7Ai^&rQ)+!7qMA&D)1C2`S?rT zZfmJe1AeeDf<-$dlm}C)8AXtX_)ChS zhkmBh@#~H2{Jv@^ETbqIkh3{muxh+FLF`UPTn33^@16(n2EMPSvk3AbLmd$^PHyOQ z_-nshqm3wlG~QpQS6m4#cVGHGg!E&;@=7F`E9C2IJ1`M|h~QJ+6kB|WN)mcO9CIB^y>JascZw)IrR^^NL~TASJHEEPJL&fVrG&e0VbW^RJRTaC0-cKx@uVh9jZ~wGyv*PgrX@?X|a8y8{T? z);~V&GyB8M?H~!&mRf;8GjpDZuQG}(Quhl<=xZvnTye2QBvz;90|6tgnvth)l2+;G zcs5js2=FQ!@gV?f6)0Bx$u zbrCs@o%$$F_7C|mhnIV37eeDlQdq2@t!*r;c}%~S=14t8M%o@_!d`y!4JiTs*PK*= z-7O{*L@D?{=|G}2;~(Tnf6`>vAWEZvYM+L)GALIx`ICG?-m$4yabQrxZ%j8B$jGqYV8Ol zRdI#=1b+YiofjmIQRv?HV;L${fqt~-@k`7QkxRn!_x4B&4YfqyS5dF&`?pgocU(PP ziK*&1LXt?*<=Os~l@s`w?7<=dX0%a@qONN+d>?HcL=8p4>3M2%eF6Rp@g799N!k=8 zeUl9|Mu-bEsxjZm=v@pSJsU&+}deg9mvtPNa_3-Cp`x;LYB_5Uy(Bu8m zw4-EcAi4R;mOx?l?+jL5ICQ-+jTvszeMYE+IH`0_v?$puHH#u5tswZ30qzrBQq7(b zAIf(q)uu2JS-H*AF=(|4nr!dFTWy3~XjBBpn&0W|4@gORDT9ZK} z+->n*Gz}Oj^KX?3rig6^5ciNMfJ+9*;YU z;UyQFW?x@O)oXsrN{}#REttj?qlt)bIo`XP30}{})DqE56!Qg#?!8#aN9=G!F+j&L z)`mlOe0}dVz`XWVbOzde3UCk8A3`0;Gdt{;*-)p)A!Qtgcr1US;hf+2#P}9b7R9;x z;_%G%@+fH84HV~ie{>e_eGyNnD1YpvLzGj`Om%%^pB2{;of#@Q&;3MPibvsMi@y-h zdyB%Qm~DWV)IpbdB&#pnTO>?XOPDQ%22(9HfJ% z3v4I*{)G&R)EpYWjywe;=>XcfECRXU_Om@FcBrKG6wUio(NW+*y|xPu0JiPKL9X2dI1@G6G#P$x{N{y z!uv6e{SzI$q)oE3gX*Zta`ix}5y$n(XUW|*;YXM6Co&Hb`fS587G{wx?}DD;T9ZuO z>^7BRZj>G5v;?o9pekMFF27=I^IdpF3;~CR%VGY3m6U^O@A=T-XiNFUjwvH$@D!8T zCCt|5cf*lAUJ*Tc;7kC4oySuS+(VxveLw*X7ztfN^X~spb&lPUc3s!**tTukwylos zj;)Su+wM3W+fGLv+pHwjv7Wl_5APW7{sC2$ah`i;ueIi!M+XGVb+EP_3jR#@6@vjU zOXN)#6QkdOSm0}^(AH}zfQ?3GoY2AYt&8i*4lX%OXYOBh>I7mHr<396r!4hKs=_S+ zcK7NpQ&J~-4Pbzz@5OpoX|%}#Z(7^-)!Ocq$ue1aQOdbStt^nYc>DGBHBi*<^wIee-K=udsuY*sTGJ1vZheWWl1xtx3a=`j z;szH2dr)wzqbixl6{MA>PSS~ns!-rRT_Jm8zhnqF`hr$7YL$9Yfg;jy(Ur8~;5g`- z^{F`zf_1%JsL626`GUE%BAm@=fvPpDtb#z2)cH5;FMl!Y03kHOZ5gwifn>Ivb|;Ia zgn+O#3;BvUQ!_RCoUp!=-mA5?*o+-m^@mh_w(!nFw?CNax~E{=j6Q@a=E!`9)~ubh zNDr)+W~Npq{)pM|(BLVp4=Rz*fBotoc)ZXf8w3VnkZ_6TSpdAp;H_^xLA5X zv#dU}lnTX^;$afKK#qg?M;ld0n=k)HZr)5QvM+-cI)ds^RQwHVH!f@*+X8L@vtw)ovk)O(ds-+W$@*S@2!|?^<{q%45@IFwMHlwFs~dK|xImt^F1QmG2h1|LeGL z-I5w@dB|Pxi{EMJ0cFUL^QyMEjZbp==2Wk*H`*!ig?$VPt4;91??;e3LvV;c zdY$N5Y&$Q08Zz~j_wnsUx#3t|zE9yHw6 zF`VwJ9aPha1HXOr^d6}dc(-5&`O*i>HUJ-Ylz+S~t{?emIeaTFc?-ZLM#+Ip+#i*d zr9KPpYA@J-3JMJ2W(t+8%*8R<9MRf+<+o0wR{OdL-E!H5ZXQdNxOOZ7cBYT?eVJE4 zru?ytIuXiUxAA1>^8!zm#E<#8p8yHU6B}mm33R}J1IO^8URs)DiQh?x%1jDGFKJ2WdnsuWZkIW8 zAu;aQge~~ti#?R`KI?V)!p}n$uiA~bI{a8jZp*zPI~)0HuaTF`54@rS&Sp@V2-g?V|3l;}RzG)T6fj<)ncLst;tl9lFS zS9yferP1lW%P(0xMeRb;- zNaE`G`Ay~X#nclyM3&`rS)qSKi68Zq!BDhDyp|@)de^B_EUVoF-lA zlb_pyE$&!`;-jg0gPq1-bRut0PHu7@U^R5nNYS2JKXsrES>pq3vaZg)cJw*}2Z8`n z3JmbH`1faN;N1Ym=IY*OG^qA zvIB}&u4r$^>EBJX)C2eipa(mXxAHhxvsT8Ws!V(<@;)J~5bg|r-T1&gRjJ&1VnllD zT3ZSH8JA6iw$&Z0#YEIfTx4?=0|}0)qd2gNUSUnj&S|$Dii+gG_eW{e zwvtU4jx=_iX2x_Buv^kMYmpbk@$~*8_bB84{CXLkg;%9cv)qwRt%7E3pc#Rz3&&UX z=B`)_ZpzK%7e;HoNXfn$;arhF zfSM}sry2Gvi{*Ci<{5lpRLwcA5fKzDBmy0QvEsHUOn@goKX(R(h>n^yt&}t@A`~K< zJpbb@tqz&=>)e$|Ni}3H{-tt0LtjVjS%C+A9YF4@KCGr?iq_pVtey!{4uM1uPm5(^^a%` zLh0WFMD&13RGue+g-=?TJHjy^l|t{47_>k*ki z@Wo_WaVaztzM>0$amu|_Eogqf$j5;(#0Ly*bvX`S-Mg*co

          f2LCrJS5INdZHPB# zMhq@KJTB~#76ow-M{-lW2p|7(FkSH9El1Xh@zIx|P&QXkPyQ+Y71^wk%m%9xUb~x0IUN%|w<*KFgwM;w;1c03M_K#kxAW~6sAtV%%JzwVFdr1pR zme??MDw59~{6t+SMkwy)3He94M?{QxuB%JEHbiDcf0h#?YPN|^c6h3;@r{lZ@{Gju zE8d$0->}C^O{BRhq|^owC?iZZDA=Q?FlHFx4z}UUzgP)%*GK)I>Zgb0N)-iZcKdnJ zbyEJW17_quSpqbujd*Zi#?HYZ!-x=BYlPfAp_?&!v)vs%Y9?dL3}asuAJE;_BJex5 zuOk1K_bZ#Huhm^X0**TNqq+n0VX{cC=*}pWgZ~+v-9NT1P8Y^+si!jslYqcXE!$OR zwMpI-3cjsJl_zzV^WO%1#N@d!u;COV5#q}kc$Tb$!|24|RQRz6c-=oS?n(A1L9XfS)jVY@ z3jr8@m;+v+eJ)u=`LReTMtlOiJv_V3`M*rvXmr~>?f{H`*fVBhVTftcNxeu{ zTV06?%K4*lSDAX<`%I5YQ{=`d3k2M>bV|Y&$IMJ65D>Hwp`zfSYA~avs1x}kzZNZs z18?98CKW7uS~B{3U6NdIwiWF{hCXGZR3`{sVH=~vVa_tC;pn2v5SLr-ewW7qHBn_J ziYZy5>OYCL-%U@vqMmAIcZ;D&N6wNTpMG(UMzW4~=jxz(-A9A9Vax}7X_ocHQhYoz zZHlRl6vs5)?0p9f!UPwiyPM#oUUYxFsA?dw2)AdKXfRtWbfezf6B+#3vEAq%y{JBZ z!Qn~edPB6rg4+5SJ}pw<+280DO}ODdzS{F^Zrlz&N{Jb^Y{8_ky%kM%3? zSoq@ai>f=z`e^L)qfcyha>dWQp$8u0$!!$jxuDO15m~1FW)|b=5SP0%*Nx{%O|3LE zJbkIaE|j2k@RKx0D)U9~`(Wg4mG4&k(K{Xg?w&&}$|KnRSzs6R{?q{kaHAqbUwPfbDrdRAaPwM-hnbfpru<=b^jvXFMWuTX9j)bj(ont zqI`N1&{JzGLmjsCRQb4d+^6(zeO>K7Kdu&xTwT(5&FQKm$`T4B)2(mnzV12sC~e^4 zX>{C8P2=J?vuY^lvIZft{PN4sr`ego>Gy>ATS&6Mvl$eo1dat{*;kO#E5ilf1S|HH zo17Xs)R9i;#&T1QL!9e)rG^G{CuV*~5lK1^Cz9p|~QS{&F0R41C-Ll?kpF?k2;;5-ZmY*v_KY0M zw!!ARfp2>gv!^gm!NY-PE=j2S&$AVsE2NC(1x-8crcGIPj+(2;L<;8Yf_Nk~MXXte zjQ@|+Y7r$L6IMTNS!X8!6L?-rQ$@p_yX_1tU zJyJRDMZUPLsG-loriq@SA*Z4+T8WUS8`X9~-34t{weyY6cD;qsxwuQ_dDZ*0l9a<%!3nq?E82sgC~KszWk1Av~cCnbSe5 zS2O(T^-hb5=N+~K21`M$DbCqL6!A~UkvvS0q>6T_vGnP5n|HEj+UCvAIn{@UgD4-O zfeu{BpS|mOkjt;*dnm zAZSu*$Q0z!fw_20%_$HI9K;NX)YoN0;J_YkX2Jyf?Ps6O<@8xh?g)~Xkkrxg zC=C^hy$6Ra00b&iSBX0lE8BS)c>~D8eR+@q+}oap2&nnY+Zz9<5`ELW?4UIjF=n#+n` z1*Cs{KCq7&xKrrlsfMhmPq%&4CFRXOPq95i@ivKlC%EMOvxpFkC_gox`~%V1#0$xz z&J>)FN)z*R&+B!qzaPoi6OC_@eh>9paG-5_mRAncwTh?mk%b?9?Y6OVC@Qx{-Jdtv z3L{@ceCj+wr}_UfVJ^v#0*`cLNl{JSpYK2++aw~9M4(PBsMQr1_?e91&N6r<9&#UIasR{$_UrmUb!Qjpo!6jPb2383GGsKTG`^;8~=5Y?UDfRU9*G{Y?G+OpuG#x zkunkVQd*&4=a~{pj%dA6Jzn&XK$IF(+!}HHAl{u6x8WPmxkFSU#L3B3d{j6Xf>D_o zJ#3*+QboTOK)BYIfhFMA2+a>ysp)c@$xSY(}m=VB^XfdX|p>NXHRD9{26f|$h0 ziN(Hx@njlDxj0}N{>FFD5*mYJk|kf1lqS9+e*XU71vIB26{~VeZegg1!MGbruk2uW zyR%q&;m-DS=Towd?QkMKQcH;gh)@>D{~{gd*dRDa;dC`zm>sdQ9>V=d`J?B=-4(;& z?#9($IHMMn1(y%Ph4eSbMAQa#jg)?CQ~GziTwFZju^D5EqN9w3?0NO)R07CHA$+Di zgU40Fn6#Eb^yDYfMP|t-iK3tH$VXc{(c`Po8)b$^intqyKfuxX$ovHH#N!*t_qm=xs1y^ozfDWb2(>jinv;Eln6 zR`Vq%3shS#)7;qkZuCpj>v5IpR}M$CM)RR74I4#bbt<}d;1hMu96dFQ z`t+RPbsU~ZuK%uBfv+o+*?qYG%Lw~&MP}y*i-O*76G0!tx_>?jozDt9tQ0yF8(jq= zb(>NqQ&I*&e<7EnBnD7C3*|To2Q%ocex+s>7|7etWxw~=TBBDRP6j;n&bc+DxdO9a z+}piObqbV>0P2BvLDPCoUZ82B^}f7Urix}qcgXvPORLaHH~b@U{cbrC&XpN2 zwF{xdeZQNXCRhZsstA(WB1#qwiPHcfjnE084iF%@DFPS35}XCO{Q{d8m>^+l2OiY* zC<%H9-tJJ-86yrbT4-lA=uYoo<#=*8xLTll8X+{5+x+onIL2CsFH*x!00GPK?BNE( zdh=eE}QfM;hft|+&95RM-XzpcdC`g>vVg)?ZY4Ra>2t3>U4ml-SN z)?Jwfy9@hHq-SF(@*=s%6&w{?ZF8Qe4T7J(fGxl`N5p|^0Kbd@yS#k5Om*p&hBCFl zu84kbp0>P;GSymJaP~0A;tp5fHC10XOCb9%>hOj#!{ml-S zlthaImJ&)%QB_v9P+aX5{=4rmuY}NlWA!X&FP|X9V~zmQNgNyizIcxW_f*xw)pKSJ z`7I(`0}3^jNJ%jNeJ`Cc8D^eWIiX1Tg?i6hwjx}Dn+4mi#AcU*)B_rtQNT_I=)+{f z#8~@NG??p;(o(taYc~OhFG%Hi`5oc?eX8?$vCO8@(os}Tf{Oiu|MoIKSLABjyKkv< zhX5f%G(uBt>NJT&KPgg7=^181NO3i1Gc-k&B-=`(nS&ZchiS00?WsW-T@SbZOCjlv3L00Ub?)hT?5BwNLi+%dR=2+DczTnGzm_ejP@2L2FkWun zJw#De4fEA?%D-IPJGieN!7uAHCGoq|KSvsc9d#(9U{gx{yis;=N=hl=Oi5XiTc*q) z!Z}TFG+n=Q(E`n!H`gSf;TM}^PB3C(g#L^Uo^THZI67>$7Vy)g4yAlcINS?+wE>)o zPcmBmS}k#LqA(p*a4o^nQXpM$I~q1bN-&)|GDGfpCk@hHkUCGRKJpFzryc{&{oscm zZ6}%BFIhFO`qt~dP|(e^dJqdzw3k$1kSvl3ik zn#4&OpOtMnNy@=7Do5zd?Lw%W(cH7%^EQ8D)p7^T9ZfW@C^y5-F-6*zWy-n8%0*P= zE8_l?ByE#??e?+QRI#t>RoHjQ=e3PekNw;i2|$>cpdG{RWb}I>`o2i#>0~(Tw|S6; zOd>&?eYo`d%O>q~-<~M%92{9z)kQ>aKC}SlJBe;O5j$RgH!4hH)IY&$II)Seaqo~) z;l+HuW-U@t`Q_yLOWaKhWNU(veMee+XDr%e+bj=8=}Wrt(`v0vA2)L%AF|rr;3_gI zV_^?Q2?ZdEt&Y&{sF#rcvE}Ym5jqyCv+JkH@0PodQ*To}1fOuSl-c+WD2-0f4csw3 zYz&>xXqX^37zhMNzfC4-oCq<7FjKQAhw$&Ph{K{*LEd3$S<)3#%t#2^efc^h-LW2? zIVT+!8|AC)wUA|6v(NIQxv{&Jm#qw)pIt2-AA^}M+h0r+yBU~>0--Dh0;xSlShTsx zhhwa?uZ#lmV2b!6oD>n_!yN|~Egf%(4Yxu4M&fD{q(NtR{>K|~vZf~g@_5s#%^aSE0JC43XG$8fpmpAeB{>BuwYYn zW1Xam5!AtK<~`E>#BqLPb{g@e^MAoy8Gk_y97=S!9W2so-VVdrD#=93LnZ5sE-&gvVoKoMf{Zo0S}ux6k-@3cWK%;!-$MAu&3UqZ5bNy=1aW;+N*Nj z<=-(7%o?zbkTOERk5R7fj=Q!@XaB+jU09U|V)q<${LLi;P7hkIZFlN1u>;b4_ZT6M zZd-eMGQtE~l|zm2F2P1Ot%@}0)m-g8J=}e%%hM(BxXRK3d?D>3 zdp#Z~djxA>a7-U~X{ZUj8cqF(TvkiUTxm-qF_Rr?D*Gf@oo_+mDSM;qy#WZDcKT|? zkQc^~^`|gb`ZQ0H~T*p4yyc3#-p4yJTLPMsAU6P1ryD!gBUl8$iC1ty=*84Ep zi&AP1oJ}HOd0kwRzT0yYe5 zYN|^f!CJ%ErOSmhF=F_Wi0B94ERtfjss6wpUx}Sn30|3lZP~!P&6oX zSv2EG3 zC@M!evkC}^Kh*|E+6MfIp6df>aGQ`?LO>sMGEaIp>nyc_QhHKhO;dEf&pt1HQY6MGHrUjBp=X^J)A+{GJ$CE z&15j^R=L6HA5KnXg{$N8Fl@i9c?@2JAc{~IpVar_l$f!DstoiMq{{Rc(gw==kF-4f3m?5K`MbJQ>-jX*r z4TF@BmoM3u;Ad8sKgiGLTn3c))-iDik)d9LffdS=LrAka?LfxV?dd{75&~oV>d#Yb zb8sVqPkj*aIio-VfCFCS>+5UER5`@qfv1mvz`T_mEy33rUpwr)*?-AWSB9T5#QHh| zmOA+|mWeDb(-mIccXddbg`RxC2rTvfBOmPErabB0ku>n@3c4H@C>};aiH=NBkG0o9 z1i?FP0c(Q*DvcUY+(V(jj5hg9u;QDN;m$3Bb z=xx8rBY$~r_GS8A)Iuw6<2jmzWVAS(gm3%b54SfvU+O`0ieE_^UWF&YGIrTs zFM5b{NxX8YHWOPq%kEc4D=O>(7MIvXAQQ{3am$Wx>OMT?o-KC9DUQJ+{W9Gvk~46TU`rk}HBdo~ z{!W?W*<|TQ)K!#|ECGYYO|)1)bZ%qj^kH(O=QOIZQsGJ{`KYrvPaOztfKX=WQiK%w0P}II!7HG z`yK@Ne``NbP*vVk4|_NgrLu$9Tsl=9)QOU!PcH$*4h6ZGO4HG?P_bB$JIhkV;At(7 zELxM8F6HUt;su{50f6@~n~jmmlm|5I4K3!&Go8Wnfj98dC~E-iCXd-S2WM&ELqqyv z>yg%uh$S`<24TQ-lA_)1OJASVVt;f=Gv5`;xbw~c8aA>nw(zK}yRd@KAnurw7B_&t z@NMX~A}xZ49IY*G2a~?f-CZUgaJ@+r2cDn1cao?-=x2I-%)1x`A0XEFFeKQ|=V@K! z?lr=9gWqI^Z}qNI0bA8Bd=iD=m+z$-@sK=`5Tpw> z|7Gv4%0Kh$R)0D+eX52ncmGJ@boklc7UGx`vV#kQ!w0tjxdxy(|@J#z8Cp5lZk_DHp!uKyHnwr z1nww>7cjQszmLG<`guea_4r+z#dvln4J!I!E9eyBmn`z(MT39pJmW93$-gFzg z6m;qn2t0q>TN%~F1J9jcWP2W1+EN_WGF zo?$XwGarMZil=-)P5u`j?K;EhZhMS8*IDZ=cM247B31`ja2hC|ZsD1V^Nc#?Da1)oOM0%{)ee zc4O&}0iGxxU)73CpF;@fb$VmvCyc;L;qtoDyIIei#3`_t8gx!?FnM%X_|Mi~5{*U= z&_pJ|1Uq`IIx$M1vOz@%3a4s}x&#&QUX0&a46?EVSzUn^pmRpq=)e)KU}JeK#`{EZ z(HJ)j;MdbyoG-NC-^Wp!280=c+1&7M=fF*afh43KpQS&16PBk_uf|l!WVXCNngpfk zw^&YNgN`qGpS=zqvO$$U`*xD8VKwWgYMp1N?@x6N8l3O!eQtJ8EIrv{>Bz);zQm6M z>ju7~r`ej0$)1DA4_Sm4Uh4htL>YDZlVis3ObS3Qztsj4uY&OiA)+{XRyM`bO$cVj z8fa`X?)D^ckbDOp{2B~8EiD6GW7AoqlPo!#i1vv3$Tn?L`ui9y!5=qp2Lh+hm({Ho zUxG>lcQgw4gI`-}iK_fd@ZaHD0TA%zeq~7rQv5_Rk>r?I$Cft;SZYS7LkgZHn6Pwz z`eGquDI|FbOGklfdi(YM;g?;qbcxlhi{zUM@|FoJO_V^ri(Yg(DAVZyEqt2Imm6nw zP80>oLeYR1H5iDT)JyPCb@+LpD*b95D=GjCjE2FJazxKuT#?@PbU&ZDi)8<%f=HXj zD<51!@n^_9hy-YLeQ6a; zx@j32IXdz~O-JQ-ue;Z`O}xOn_LpuzP(Db9ko*3z8xW~iOr6mOBopS&_~XvaV}*{n zZP@evi7h@nrV%D>D^=5*KF2AFp^#Zu#?&8?61>;VT%EvM-_X2?@|_?IIIdcL=?xrB z7ebyh`Wx^}R%3^cW8e>sQ@|cygX`TF$x0r!g^Yih^G%BX`oKO~ve-WtEL2(}&%xxp zyY~Fs;^xlbL%hqBbQ~r6RFq}0hxWhcY-D$#)$t9OS%pLuKa^> zvq;cP)k-ey=8LeFC^IY#G0LJ$W{s1U6Dm55ys8uQa^sJe9~3B8;tBb3g6f`|nwqDc zcc$_Y7s3o?LwWxEn~y_4xsCk~vSZq?RWU~i0yd2hEYthny9a=ZF+4sdL?eX0B{>BN zA-I8mM30PL7$RQ)Cd4U@+g?tqbHP4eV7aCw;YFtKJOKfxPSA^gMck}MG$@4V3Hz>g z)!5`^^e{S1v8~sIN92bu+)8Wwwy&UZ=RT$?aR!y``z>GKos(l)xo1-+)mXT(Na6yT zvrK$N&kOR6&xLy*4~vqYJwbGuOqmUMVfT$@pzl}z9S#7wqN*cislFp*9bx_;w7cMF z_sf)k>bh2UMRUYqb0AKeHAtDNedmkC-|bvgdZsT8C@osk5}u(9Q!#(qlF5A9p7@#3 z{~ZX~RgUeotmpr^Bz|FrH=rl+@05mAWq^ZC-R*Onoz%S!$ ztP53fVJ{;kr?fRbqz`b1+Mm>Q#QFHj#<*nnv#!TmO1=qklr`8reTe_f=}v8XA&cfk z=rBx)&Q1rbe`R+*(aM3M=`A`ylL0X&l?*OdkqG&7anCjwRv7`bn-ZOMlyNr{x)=ux>X3jpkTVvn#bqZ*V^|@gU6QrR-~Hw(F!#Mf}vb zo5alL)zkB56qSShk|q*?sE-!b>aHutf+@aI7F}jQILWf2)o7RDvs5N~z$0TsW)5${ z{1rjp=-vcuTB>wJZRfwShE&EnF#+a!>|V*dL*Mn8D-1%|Diq^j-7{zYa9h5JtT3svqL z$G!B2-_L#I*z9doY2U zhqzpJn7Q1JCB3}?{RdM|0U)pv2*WVU+9fnqVgn1rKKYI!ljZhWokY~cpd{^X`;&Dg z)ruYR7IUIFmDl=gPRJJvT9X2czX!|ByhH&EwzadK7CZ-(* zYmF@XSpU42?fhYNVBbI=J@jBu)~d1-{j)1b%ufHWDGG1cHwD--+r4M_FAAedp$qQp z(zuxzk3-s+2cuo%aB!<(1g_bj^=Vpjuz0OLab9 z{qQ<}tBrrMY@wWy5!r1+G}MoW3kZ^oj6d?`YlmsbL+lfyIxoU{{Y0aXX7zu*4IS%* zBTKrUVCd_+NN53afdIR{_EQcRnR!WQFua_WD-zZ8*EjMTy`-V<&G2?LF^xx`$635l zu2*l~{MUP3%;HnbF69BB_*xl1A~0qCd@OVD*2L5c8a!#6EqDIQ_jyF_MdjC@1SfC8 z^_LIwmVEsGINM2}UN#PuxDX+R1@G}1BElNec>9KcZ<-q@?YRpJf(9fm$({3EX)^82 zeIoK^WK;JP?iGd(!zSwq)Wn8e;aCFr=dwOFq}O!PX*iGx51>DuHN#Rh-C8{E559-ObJK0>N2nDVpqJj@Qi63B(GV z_yW~D24MC4jV%WzQp?QK-|}veOFBo0cAxwZjU-9X+DRyig#S?#p@^YI4v{Gyo{jd~ zumcGNSGQHTz9x|S(n6eh{g>-eJLC^vySiVQkpl=4?Uu?V&~JJL$}flu&E>QkNlxc) z52xGi&zkEHXA<{(h3RxmaYK?UNt=g0b{ldej3zGbI-lgIQbDAh1V?>3I)+N$Thx?j z-lXiZYd+%o)J||JD2JWaY(5}PUKSr7XeWsqtWsr1VZO$IVt)MzvUk4;TE*h)_H-{Bp^P+};9GOgYSZ zaJXcu6W2)*Z$#}od#YQMkR(>rji-Rq4cvLG9#xl8k0qwqtO^m&8nU6Y13QHlApT5O zARRW_4u`ZjivG6-*bdBv+%qib0Wersk$>)lPbY!js$ZXj6GL(D1Jac?*4sA%Md`fK zYOj-Gquk-b#cB2og(j|+e{D}SUzw}Fut`>!rXJcab_tM)5uO3vS`W5SNH^SCXeGIg zmd}7Mh%+=`|69S%BGqh?UcZ(XCVtLFld$NIKDj$>1`9@z8`-Zk*kMF6za`XYdm5t9 zQDu0rXQOc8$9wz)H7vp%Vaukpclku!$X%{>Gj3jROBn1wEHE#+zk_aj>#{R#j{*(` ztX<$5^8eM-pe1ZMl>aO15k(^D24GuK7{nl2j7DGjr%P~TJ?3-){Z8Jp_F8Dgq%F-p zi(34}`+Ml$Gl$WKfj6(J70>)@@{L3xnV*NevUGms?|HX_Ii@D-<1{a0X(q68-!0z( zGBxWcUJ3R(5|r#1N#SP&i7w5}fhr6^ALCx$9)?WeXaw6T!u^uBDw%Uf)0GJlkeRTc zpM>R2pw>{u15W{h^AfNN#~P0Tg{rh8AZiuL zdI{Nt=CII;1R;^~xuK}8mH)l%ZveO?N%CcC(=u#6h8CXbgPPyeQJCLuS+>!uf$Wtm ztb|Y5BJ%gxVf1Tp*|M_kfS#lJRiAOHeZ9vrUpRFpCRMhzGi#^A#dc zA20M&V#`R<(nmeQbqO}wtja1*k6`AwZ@`eDO%?k%VKAG*!<*r%KUAe$7;R=KSE?lK z1{f~{lK&C_X9v`wmZgtrT=DFkIz#%^yH!she{<7%NG!EBw56SlbsqhTnLCHRC)a+L zNrbqhxhc6%IHt6OEaCSH&z4FhH6slrTT0Xy(2Ym3WBkwsJsJ|^ky*maoAtB&$ln1hgFDxi~YC`(B6_q0suPnZj|}%2=+SHYuo-3g4h@93NQM+^%K z`)rZCHaw-pAcxfX^RnNY7{WQ4#$P-c^~bREj{mt~gb{DnLCST{<9lwaFLa>2&?bTZ z+2U}__FvOey)ww6U+Y}c!VnIvm?|1V}ZV%r)HA={og)zRLa?)Sqxv12>{=!}U_s~QptFe?%~7Fo(tB|UZye5aAxP0; zah^7S;7_;&??*Gkf|lj;PwWt9?(Yqk{zvv#jTjbkfCatLQWun$JH83y_~RUJd3xCln8oB3Og%}a+E{7^i^RIg zu%4^-Lh5&%!lX)4irqbVdp&D-Zx$?fe_8pZiZ>aJZjG~c#%nbP<)z^!b~vVsbe_1Zay8o z>UcDHT5ynmtbbc;?eh39_)1q}etEjVLfr$g!4@M?2nha}lzsHOJ!#I3?Pro~)5Qvn z_x*bN+GQr|(?)KGgEm*I!@>R=$CgMe`!NB6iCWrH z$6@x2hFq2PBla@P)*GXFdllh17=3~}Nn-Pp!ueyIxeCpYRqb*8d7&u<1)hbB6ip@J z{Am`x++-?fWq3r5638OV{0EP#Hkc4o3~nM%=Ah*9Lhp><@hNwwhT{*`N+stjejQ&g z$F0w5((}Dxm&`e0O{QkDYY!U|?@LeGYC?AKIEKE&UA+ZDC8#K=&XUb;lWu~|XIh>k zj?~OOG1DrAvIYBpwA&LZafC+wHglXkve*!qPht>G+4gv`29%ZrtEnfzv%t&9oH0AT zKMBZUuAkyH`lCl`E9CvxhTRcdfyor6OTAtng6m>yTfNftRv#jPe6`jJP0}q0@K@)pKD6vO z*TMG}AfA9H<2TTt4MaATP9#e2Y^kcAb9RSbaVLZ7z)izz3u~>|v1&I9P_yl^*FF}`i z{yNE)a#}(s8tus*uJ$`e22p`f8tb)8@vS`3%Yr?Z91QQNo$A(OEycFG6WuPqw#M*- zU|Xyd%bF*^cSo6PET*bYUH`_pY70Ix-01ZPm=B|-yiYC6@LfC1W${JB*M@QdSWdRn zyKl`x63S8Tmh=Io-0UH?6eT?Yr$P6*);b5Wv45`_d>+@!qsUtLEH$H^0AE;7f{()I zhm;#C^|DjM#sya+D^X-;K5PT1s2L$uWUvI_my`+4h@f+mmp;7H8LiYhf6#+xd#JrW zSLU>N+}r(J8y#0~)8>RQt4e=#II+IyqLqQquL_J(mKt5MR+`m*hp<8^Z?4?@&jng&!Z8NKb;rDo_D*0ZL*K)?5;C5Ck)p2(>j z!88mRoP@nNg?dXAo5M^mk=feQyy;HfGI5CP&Rf@dk>4R4GT8S#Uk~(7fzJHH z*#FuB_UoVdgp z)@`mkfkAr3lgp4(z z1HJxei{%5N(x5fm%Q!Gb z24L%aqE9UHSaXRuNx2?)!C7c{HaI;s8~m22R{@H4I3+ zv9s@B)SC=;*f$Efd5UFhA}?0blwqZ!#?=({rwm)+8{osz0IOg9Y&hrw%C9Kk~qjSHTGD9g`uh*A6 z-zhzV#&cz(j!W&onplT^qcZ|e1}6zDU(YgO}OtDA^b@ z=KRwBS>R@Wf2&pmC7jbi6P48%cnsgx7Fms(E(6SYvW?Q_sCPvI^tQ!Zo*>hhS4}D^ zLrRs@rJrbq!G%NN@^j>B*Ios-w=HJ1;%VzDa$1z6OCw|p5dIuPJVyIH+zPTqjz)@a zj$x+|O&9Dfc;$9p0D^`dmJsy*sTiNKU6-KYsvr6Vjk_eBbi^=*`V^48S zfGa9t$l=lw7Sgy)RGn(rj}2bV8Og~3loiRUSZB~Xvk-lOH>OL|ex8zf>#A+7|2^hn zC^%0+h+ODi@O~J|YogO!5-|S z?r2^y=DMBPC(3>fk_)uqQIq?-cf`2;c*b9;)o!v?VUT2~rcXq}wFC`clAKk_)#HeT za%yU7n85&D%<5D1xq!D{x=kUP^eYlQ0uK6j;7;{&>TKSuY%2o<4L25hMQ*r)MG@f~ z5%;Myfukfb!oy+YQr-0CCn0yb;DWn=IjX0@SjEGT_3-y&Ar#iY{Y*YbZLF zf6bOVreA9NyCZ6T^*Q>;I8O%&5Boh>v$A21RT~Z}%nK#zryk6X6PKEgWX}}9&&dbd zZA@)82+uorN2Dii4Yw^e83+ZydRB#!3yi|lYX9jnp>Df%Aw=PDf_1A@Ie6F=nF0jj z9KYW|;f@Z|BB2yfc4au)Yd6z>pQ`^0$&V6-RqCpWcM#t0ebH1rL(CO5wTPOb`K$~B zC(r8zIz>J{O1GXm2J`NviGy6RLU95^lPygz{_=Yltk&%Ykj%@KBCB;EkReaske3JB z7I+)`F@vt3;efXyE_wUbi7-%6KSp8pr4nkir1Fp0c{OSH;KiH_Z%~0!Ds;TZ z5RVEj0Z*PGHU$h#s0Q_GCNM;!?sMSMRu$KtnsoUzPA&WdFcVJWfQIGLik3Sy+`W2SF%+a`^9_)9HW_1o}8K-0l=6OWCgwmzMzzRQz zjoWXIl107}GCydCt&PXRd=4iWYR%SE3$yZb(M#`IP2Qn0SpmbRcmX#)Y2ZYjX)(nV z&Opi>RO`TVkaK-o@b?+=4zN_QvnH+@N9nj$H{(9nTlJ-T$s7?%N}MFjmIZ z&MmZ;qYrU|H@orI-^?s6Jg}j>pbsAhpM8l8o*9dYEH=caSk!?IpvbtFWY$}ucbai; z1zy{&oBu~nZRc?grx#0Cp}ui?Rxx}<98nZNKaTI(jCp%~pfvF_SP5hP0JxerIY1_X zrwGOmmu?*t4WJ}B+PD51A%dH{4L3d+t5qRW@y2aZk3c3-6w_8XP1k03kWFiRJpV!A zZUR!|Ovmg(#Q4)SNpRmoLghYTUD_4)Joa_IZ*POKf1%Ts-wFcC@-_V!qt>ZyS5FIx z{Yc1m#f>!g9VIY7?5|{!um5A~t-_*g+i+o}MLMLryE~;jl@4i;5TvC?~de?YtGw$-m~W)?U5rK@KJ9zdIj2IOQ@ zIRxm0lps6s2RIfj&e8J)hO2qL3)!+`{1|n##nM{v_<2TeEhJ^{guc{I&!TSl2jnhv zvams#nEIHzMu~Z&9Y82qaNz zX}OwsDcOd#EXIrPz26^Qo={vr4D47UDT4%tt_M=RP<(q^=-$%8FaQ1}J)tRL1pl|a z?|_YH8C~T2H#qvBxGKe@uMDBx+-ik+JgH;AR72k=TW02<)BB4lEhlvk_S5JRTL=)y zgFM}J1{pLaEVrXz-lzl*sf`Q7Tac=bmG0c57d?!8sRLgvpNWxzJrXI7?Tbz&V7he6 zL@}l7#Z&!tKB^R9iFntIOgFc$+3X`rNF;yY&~#rBN(ps4cy78J^dD2991(x_`@yD;%prL z5mHr7dDhk<`dHk&-(=am8t4~x$+FF9U;Met;duDiG0ea>)NKEikbDIA>r_`rly}}e zn$zP%dPTgepSb4K#1;(vT32Q2#QRfINjDy-GF#D(nvMsfl~ySAyzV_TMt)oRx=5Dr zm?>*cxXBz0&3gw^o>0^*htD2K9P=V*XPAsLWetBRXHE+2jy_ zc81_?Ch6~3XW29yQXlWp%8(q9Bof)hx_X zvt^qFpH#L}ar_SK<6FP_{U@mMAEw|tvV-gF|U_Z70=IY4HL2P#B?*F!_{DUk%UE-Wr~8y zycTVcB2@f$0HSSy)_q36inqa6VEN!0V!XVjr5 zk6`#v{hHB4u%6*pMWoJ~*JHT<0@;4xfxD~2Uu9*o-$x3SAs4QuL^McwT0d2r$-;ln z*I1E=`<(tJDi>cQJFwT5$EX}!8@RAi3ikd=pCOBXxKct-ih1t^G#Ko{lD# z+SZ!&*^O!w)6*&17^9rISMa*Y6!bE0j-?_+wt$qaEp@_f|zIw~^PaFbCDIZyvT7rbIl|7;;#e z=C-t#wwK^tf5^zZ>`;S$$A1R4ChS;fu&G|3K#1v6bxUko;SbtF9gnS7dPVe5?8djZ zPR?pmd#bF-Skc}h!ZPbcljSb%BxH53kWu-mKbYrumFtgBPWAx&HDDBq2mpRhem<=& z1U#C;qKhNr;hVU1CJe9~PCkBhr+#>c`sw-1>m<;^w9E2dshsidh2=xU#GSWg;#$5ZbMgCvsB`P&dqs2Nv&Uf+z>VqF-EePs7TCkaybzpb zV;Cw!)3d?7;hLev>|w&rYvc& z?Jc{t6&VUcjcb+hJZ}xg+diz?RRA{xB~iSKH?LJLh%&&Ltp6fuRy@{IyojV>7DIxo zL{E_>*b+l()+1Ds>e?HM*D2W%9*x{zl4lULGwBQ+FG|OAD$Rp-*Mja(S%|o?(39( zUN}NFa2Hm)7+HBqzCgR?M&_8*7v%e0+=MIoJUg5k>6E+nc98Ie`~q6hHmrp`nxRCJUX?!r>EVdZMOVL`8^ z!br@Ywo0BN7Ibu-ONU<7b(NSTp7!b?HbZ7I>P4dS9nNBL#WTKs#b;P{XD-5#0SFSVDk>^pW8%LICeV0zcxaiMuR+TENxiB{I;@2+AV%HU z8w{poM+3&VK1T)*%w6-32+kbJ;T+9iSl}T#>ypsfBpvqoZ2yVmdLyB zDB!2twF@XF=O6jon2v2n{|-xWvfM{RZ^^TluhwXOQv)>Jxt8mZM2|{eu=x{AqTE@C znX~cN+Hzlluk9xi7Nl?o>Y}~(Y8WKSW=}g^)jsp^=Bq8dZm#zDT=#-hl`vc;}5KyL(O$q>H^C(a_>tZ%#@Y2MB9heeST!Yen% zs2($*jshY5W83Yziq(M=d>JMF;7>soG``1ZrBgH}HL#)HYA?(hIJV6$H5C&6*u4D-`yCwlV+=tU+P zwm9hM>h>-+IKtf{S3V3m=<`62*WA}MpVLjDIe)(0>i%S5dvUyF#rsfRb>0=^&gseZ z93FJPlI!bnVBJ~cN-E_4iF{5anIk%|e{Jm<12&pFutS$TJmFa%<&m}3f+=>E-sNt>Tg1^RwEmMt z)UE%{C+LS?{AHBSB+pkjy6j?hCDfShHEuR^F zy^GQ=P)JlMGU)Ud!NkOrqfHECDpH65kC{LJ{H6~M3T`s*%$hSJ?+!D+;Y^POR6sZ^ z%=Ad_VzPdp=CRq^JJanP?T$t~4`yX$x@9(wCo=!h{Dz0XMo!Dsg+qpK>{06mCl#D) zO8Rn3`E(_rzO^eMj95HbvxTU~9|7_kmQhI02%T0!Nhi>%dT)ymC;7t`#<0k{YA#=B ziPXy`LqKXJ;<)jvyxEVC%)2{7E5nsN{#(1aWm=^3+u_;w;uq7eogDV)SF7>os3NCc z$&iN9^3YCvJ34=zAz&dMFIk;>*Q#-Ojp<_(Lc%93M~xj{CWy*`V~zjm%e>9!U3j(t zJI)Ef0?Fm1-(o%g)(dnQ-SAE%0AYn>85dWHC4 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®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 L_f3`3yU70oEIB?i literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/toolbar.png b/org.tizen.ui.practices/html/images/toolbar.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/toolbar.png rename to org.tizen.ui.practices/html/images/toolbar.png diff --git a/org.tizen.ui.guides/html/images/toolbar_default.png b/org.tizen.ui.practices/html/images/toolbar_default.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/toolbar_default.png rename to org.tizen.ui.practices/html/images/toolbar_default.png diff --git a/org.tizen.ui.guides/html/images/toolbar_navigation.png b/org.tizen.ui.practices/html/images/toolbar_navigation.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/toolbar_navigation.png rename to org.tizen.ui.practices/html/images/toolbar_navigation.png diff --git a/org.tizen.ui.guides/html/images/toolbar_tabbar.png b/org.tizen.ui.practices/html/images/toolbar_tabbar.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/toolbar_tabbar.png rename to org.tizen.ui.practices/html/images/toolbar_tabbar.png diff --git a/org.tizen.ui.guides/html/images/toolbar_tree.png b/org.tizen.ui.practices/html/images/toolbar_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/toolbar_tree.png rename to org.tizen.ui.practices/html/images/toolbar_tree.png diff --git a/org.tizen.ui.guides/html/images/transit_rotation_zoom.png b/org.tizen.ui.practices/html/images/transit_rotation_zoom.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/transit_rotation_zoom.png rename to org.tizen.ui.practices/html/images/transit_rotation_zoom.png diff --git a/org.tizen.ui.guides/html/images/transitions1.png b/org.tizen.ui.practices/html/images/transitions1.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/transitions1.png rename to org.tizen.ui.practices/html/images/transitions1.png diff --git a/org.tizen.ui.guides/html/images/transitions2.png b/org.tizen.ui.practices/html/images/transitions2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/transitions2.png rename to org.tizen.ui.practices/html/images/transitions2.png diff --git a/org.tizen.ui.guides/html/images/transitions3.png b/org.tizen.ui.practices/html/images/transitions3.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/transitions3.png rename to org.tizen.ui.practices/html/images/transitions3.png diff --git a/org.tizen.ui.guides/html/images/transitions5.png b/org.tizen.ui.practices/html/images/transitions5.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/transitions5.png rename to org.tizen.ui.practices/html/images/transitions5.png diff --git a/org.tizen.ui.guides/html/images/ui_control_hierarchy.png b/org.tizen.ui.practices/html/images/ui_control_hierarchy.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ui_control_hierarchy.png rename to org.tizen.ui.practices/html/images/ui_control_hierarchy.png diff --git a/org.tizen.ui.guides/html/images/ui_controls.png b/org.tizen.ui.practices/html/images/ui_controls.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ui_controls.png rename to org.tizen.ui.practices/html/images/ui_controls.png diff --git a/org.tizen.ui.guides/html/images/uilayout_view2.png b/org.tizen.ui.practices/html/images/uilayout_view2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/uilayout_view2.png rename to org.tizen.ui.practices/html/images/uilayout_view2.png diff --git a/org.tizen.ui.guides/html/images/use_natural_size.png b/org.tizen.ui.practices/html/images/use_natural_size.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/use_natural_size.png rename to org.tizen.ui.practices/html/images/use_natural_size.png diff --git a/org.tizen.ui.guides/html/images/using_clipper.png b/org.tizen.ui.practices/html/images/using_clipper.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/using_clipper.png rename to org.tizen.ui.practices/html/images/using_clipper.png diff --git a/org.tizen.ui.guides/html/images/using_clipper2.png b/org.tizen.ui.practices/html/images/using_clipper2.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/using_clipper2.png rename to org.tizen.ui.practices/html/images/using_clipper2.png diff --git a/org.tizen.ui.guides/html/images/using_import_attribute.png b/org.tizen.ui.practices/html/images/using_import_attribute.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/using_import_attribute.png rename to org.tizen.ui.practices/html/images/using_import_attribute.png diff --git a/org.tizen.ui.guides/html/images/view_main.png b/org.tizen.ui.practices/html/images/view_main.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/view_main.png rename to org.tizen.ui.practices/html/images/view_main.png diff --git a/org.tizen.ui.practices/html/images/w_division.png b/org.tizen.ui.practices/html/images/w_division.png new file mode 100644 index 0000000000000000000000000000000000000000..443a1ea081ea7eac244b43293a0c17dcafde2c62 GIT binary patch literal 163496 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/wearable_s_n.png b/org.tizen.ui.practices/html/images/wearable_s_n.png new file mode 100644 index 0000000000000000000000000000000000000000..02e37918dbfd4a7100f5ad057e2a4f271071f4c8 GIT binary patch literal 2564 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 LPsTZ?%{%`BtxR|e literal 0 HcmV?d00001 diff --git a/org.tizen.ui.practices/html/images/wearable_s_w_optional.png b/org.tizen.ui.practices/html/images/wearable_s_w_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..cef460c854b09463be29faffd829bc08890f98a0 GIT binary patch literal 2454 zcmb7Gc~ld39*_El(N1yNQyf^c^zMs$c`uyITj4j@7 z#)g)LC=|+=>kjgfaTD_5moG-XmeDQs$Y7yl2PyqzVafy{4564}Stx|&#t6e9J|q;Y zW3NL_DAbZ#iGPqXi04HY$zpKAIUAfRMvkCSC?^+{Tqufyl;}_>Tq0#)#_H-ZXo;AC z2_*9fJUI)BkhmwpkYA#=zbG+EL=$6NoY77yIzkWwDTQcNOte%%S1~a2ymVwfw~fc3 z=S`GR49p)v1@X3^Suz+xlW`QRh(IKvsWcpsOrg@K_GkxWjVCzb9SB$gjZOyW1PAno z2ZMNn#bIQix!QTq%)B(Q}N#P+6Rkfk7huBZU|_UlJanRD2|tDn1koDH~oTl;epw0v?{X znaghh#p8V*5fk&#TA}1ae+K`T{0e`y9K!P zN&smDHb|f?5PS+meBs0hmP#P8Xdsyb5QtOpS^lt{(01jWX=b|d^q zx*!Bg;vq2ymc^jwD^HjFMGWFF65tpH0aywIKv*(BB4ZsLC{!$kOchZ=g`p%efrR;h z7ysXd!z0n)=hXIz`WChjNzY9`-X&!5@iszIq3Mi77MkLn}PM?Y5!=y z4K&W)dBAyMvC78AMyRm5i8<(`cHK;+t{+mvaG9YqiDc$x$v5tK@nX|kn^n4=-da()4hGC34De3*2H$ivY7cV{j+r6M)*da#O@jsob zs|(JBm*20ftUR@|-f~o9k?KJJ0N|{jpP#PR^pP$l1+_GiWC;}QKY+zzdwYAG>du`5 z*=#n4;}Dd#c+n5R!JaFg?_WP!R8-VRU*-CkxvGHKHK|ss1p>kA(ay_$oTpU+7Hf$| z*QKP*42E^t?a1V+ThE_w%ocB)Sci0W&z>Jg1_r{;P2d(GS`h5qS%2ot?h+4A&qIL4 z%DbVuwziv znTk-aHm3c*Y@;o!lb8~n5rm)H1t zrQ2;q6LewUx$a`ISWQh$eQOR;OHfDl6EEVQ*6;eg!Q^d6*+}DI9bxmT+osnKo~*B} zb@OU_(P%%u&Z%e<#I62Ppbz+>y4bsI2Z-yh39WQ6z}p1?6&EgS*XOU$yc#Z4nLl!` zaSj-70RIMxG%WDyU`q*&{o~IrR#&HXEH@VwXJ%#bS{mf}c0apS)z(s7 zhC5GKJpdC)o~sSV{XO?uwDWDbAx$*taekIOHd;pG*KhSLSYeHdR;X~SJc$L8viA?r&>rQWM z1aBB#d5pi|@b3M+v(tZbC9NsGxS(K*)65T-AMkyBP0jaaH4<4??>2C|$(y3i05pzH zU-=8xs^r)|^fE0am+cK! Ix`yojA5VuCwEzGB literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/win_tree.png b/org.tizen.ui.practices/html/images/win_tree.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/win_tree.png rename to org.tizen.ui.practices/html/images/win_tree.png diff --git a/org.tizen.ui.practices/html/images/wn_division.png b/org.tizen.ui.practices/html/images/wn_division.png new file mode 100644 index 0000000000000000000000000000000000000000..dca667f63938b0ec73963c2e664e4e27eb449cf6 GIT binary patch literal 163496 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 literal 0 HcmV?d00001 diff --git a/org.tizen.ui.guides/html/images/ww_icon.png b/org.tizen.ui.practices/html/images/ww_icon.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ww_icon.png rename to org.tizen.ui.practices/html/images/ww_icon.png diff --git a/org.tizen.ui.guides/html/images/ww_icon_optional.png b/org.tizen.ui.practices/html/images/ww_icon_optional.png old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/images/ww_icon_optional.png rename to org.tizen.ui.practices/html/images/ww_icon_optional.png diff --git a/org.tizen.ui.practices/html/index.htm b/org.tizen.ui.practices/html/index.htm new file mode 100644 index 0000000..06a8ff0 --- /dev/null +++ b/org.tizen.ui.practices/html/index.htm @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + UI Practices + + + + +

          + +
          + +

          UI Practices

          + +

          Web Application

          + + +

          Native Application

          + + + + +
          + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/actors_n.htm b/org.tizen.ui.practices/html/native/dali/actors_n.htm new file mode 100644 index 0000000..16d8392 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/actors_n.htm @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + Actors: Working with Basic DALi Components + + + + + + +
          +

          Actors: Working with Basic DALi Components

          + +

          An actor is the basic component that composes the entire scene. It can have visible (for example UI components or image actor) or invisible (for example camera actor or layer) forms.

          +

          Actor is also the primary object with which DALi applications interact. Multiple types of event signals provided by actors can be handled in a application through user-defined callback functions.

          + +

          Actor Types

          + +

          Figure: Actor types

          +

          Actor types

          + +

          Actor has the following concrete types:

          + +
            +
          • UI Components are used to organize the application appearance. For more information, see UI Components.
          • + +
          • Camera actor determines which view of the whole virtual 3D world is rendered on the screen. By default, it is best suited for 2D applications, so you do not need to care about it in this case. For more information, see the Dali::CameraActor class (in mobile and wearable applications).
          • + +
          • Layer provides a mechanism for overlaying groups of actors on top of each other. For more information, see the Dali::Layer class (in mobile and wearable applications).
          • +
          + + +

          Actors and Stage

          + +

          Stage is a top-level object that represents the entire screen. It is used for displaying a hierarchy of actors managed by the scene graph structure, which means an actor inherits a position relative to its parent, and can be moved in relation to this point.

          + +

          The stage instance is a singleton object (the only instance of its class during the lifetime of the program). You can get it using a static function.

          + +

          To display the contents of an actor, it must be added to a stage. The following example shows how to connect a new actor to the stage:

          + +
          Actor actor = Actor::New();
          +Stage::GetCurrent().Add(actor);
          +
          + + +

          Positioning Actors

          +

          An actor inherits its parent's position. The relative position between the actor & parent is determined by the following properties:

          +
            +
          • Parent origin +

            This Vector3 property defines a point within the parent actor's area.

            + +

            Figure: Parent origin

            +

            Parent origin

            + +

            The default is top-left (Dali::ParentOrigin::TOP_LEFT), which can be visualized in 2D as (0, 0), but is actually Vector3 (0, 0, 0.5) in the 3D DALi world. The actor position is relative to this point.

            +

            For more information, see the Dali::Actor::SetParentOrigin() function.

            +
          • + +
          • Anchor point + +

            This Vector3 property defines a point within the child actor area.

            + +

            Figure: Anchor point

            +

            Anchor point

            + +

            The default is center (Dali::AnchorPoint::CENTER), which can be visualized in 2D as (0.5, 0.5), but is actually Vector3 (0.5, 0.5, 0.5) in the 3D DALi world. The actor position is also relative to this point.

            +

            For more information, see the Dali::Actor::SetAnchorPoint() function.

            +
          • + + +
          • Position +

            This is the position vector between the parent origin and anchor point.

            + +

            Figure: Position

            +

            Position

            + +

            Therefore by default, an actor's position indicates the vector to its center from the top-left corner of its parent.

            + +

            For example (with the default camera):

            +
              +
            • An actor added directly to the stage with position (X = stageWidth*0.5, Y = stageHeight*0.5) appears in the center of the screen.
            • +
            • An actor with the position (X = actorWidth*0.5, Y = actorWidth*0.5) appears at the top-left corner of the screen. +

              For more information, see the Dali::Actor::SetPosition() function.

              +
            • +
            +
          • +
          + +

          Event Handling for Actors

          +

          The Dali::Actor class provides following event signals:

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Event signals +
          Event signalDescription
          TouchedSignal()This signal is emitted when a touch input is received.
          HoveredSignal()This signal is emitted when a hover input is received.
          WheelEventSignal()This signal is emitted when a wheel event is received.
          OnStageSignal()This signal is emitted after the actor has been connected to the stage.
          OffStageSignal()This signal is emitted after the actor has been disconnected from the stage.
          OnRelayoutSignal()This signal is emitted after the size has been set on the actor during relayout.
          + +

          For example, a touch event can be handled as follows:

          +
          +bool OnTouch(Actor actor, const TouchEvent& touch)
          +{
          +   bool handled = false;
          +
          +   switch(touch.GetPointCount())
          +   {
          +      case 1: // Single touch
          +         if (touch.GetPoint(0).GetState == TouchPoint::Down)
          +         {
          +            // Do action when first touches the touch screen
          +            handled = true;
          +         }
          +
          +         break;
          +
          +      case 2: // Multi-touch event
          +
          +         break;
          +   }
          +
          +   return handled; // true if the operation was successful
          +}
          +
          +// Elsewhere
          +Actor actor = Actor::New();
          +actor.TouchedSignal().Connect(&OnTouch);
          + +

          For more information, see Event Handling.

          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/animation_n.htm b/org.tizen.ui.practices/html/native/dali/animation_n.htm new file mode 100644 index 0000000..cb4c4b7 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/animation_n.htm @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + Animation: Making Your Actors Alive + + + + + + +
          +

          Animation: Making Your Actors Alive

          + +

          You can use animation to allow your objects to move around and change their properties for a specified duration.

          + +

          DALi provides a rich and easy to use animation framework which allows you to create visually rich applications. The Dali::Animation class can be used to animate the animatable properties of any number of objects.

          + +

          DALi animations occur in a dedicated thread. This allows animations to run smoothly, regardless of the time taken to process the input, events, and other factors in the application code.

          + +

          The following figure illustrates the animation components.

          + +

          Figure: DALi animation components

          +

          DALi animation components

          + + +

          To implement a basic animation, create an animation object that takes place over 3 seconds:

          +
          +Dali::Animation animation = Animation::New(3.0f);
          +
          + +

          Animating Properties

          + +

          To animate the properties within DALi, you can use 2 distinct functions:

          +
            +
          • AnimateTo(): Property animates TO the value in the given time.
          • +
          • AnimateBy(): Property animates BY the value in the given time (which means that it animates to a value that is the sum of the starting position and the given value).
          • +
          + +

          In the following example, the actor1 and actor2 instances are at the position 10.0f, 10.0f, 0.0f at the start of the animation.

          +
          +// Animate the actor1 position TO 10.0f, 50.0f, 0.0f
          +animation.AnimateTo(Property(actor1, Dali::Actor::Property::POSITION), Vector3(10.0f, 50.0f, 0.0f)); 
          +// End Position: 10.0f, 50.0f, 0.0f
          +
          +// Animate the actor2 position BY 10.0f, 50.0f, 0.0f
          +animation.AnimateBy(Property(actor2, Dali::Actor::Property::POSITION), Vector3(10.0f, 50.0f, 0.0f)); 
          +// End Position: 20.0f, 60.0f, 0.0f
          +
          + +

          Controlling Playback

          + +

          After the animation is created, you can play it:

          + +
            +
          • To play the animation, use the Play() function: +
            +animation.Play();
            +
            +

            The Play() function is not a synchronous function. It returns after sending a message. After the message is processed in a separate thread, the animation starts. Blocking the application thread does not stop the animation from playing.

            +
          • +
          • To pause or stop the animation: +
            +animation.Pause();
            +animation.Stop();
            +
          • + +
          • To loop the animation to play multiple times: +
            +animation.SetLooping(true);
            +
          • +
          • By default, when the animation ends, the properties that it was animating are baked (saved). To discard the property changes when the animation ends or is stopped: +
            +animation.SetEndAction(Animation::Discard);
            +
          +

          Using Notifications

          + +

          Using DALi's signal framework, the application can be notified when the animation finishes. The Dali::Animation class supports "fire and forget" behavior, which means that the animation continues to play even if the handle is discarded. In the following example, the finished signal is emitted after 2 seconds:

          +
          +// Assuming this code is in the HelloWorldController class
          +void 
          +Create(Application& application)
          +{
          +   PushButton actor = PushButton::New();
          +   Stage::GetCurrent().Add(actor);
          +
          +   Animation animation = Animation::New(2.0f); // Duration 2 seconds
          +   animation.AnimateTo(Property(actor, Actor::Property::POSITION), Vector3(100.0f, 100.0f, 0.0f));
          +   animation.FinishedSignal().Connect(this, &HelloWorldController::OnFinished);
          +   animation.Play(); // Fire the animation and forget about it
          +} // At this point the animation handle has gone out of scope
          +
          +void 
          +OnFinished(Animation& animation)
          +{
          +   // Do something when the animation is finished
          +}
          +
          + +

          Using Alpha Functions

          + +

          Alpha functions are used in animations to specify the rate of change of the animation parameter over time. This allows the animation to be, for example, accelerated, decelerated, repeated, or bounced. The built-in supported functions can be viewed in the Dali::AlphaFunction::BuiltinFunction enumeration (in mobile and wearable applications).

          +
          +animation.SetDefaultAlphaFunction(Dali::AlphaFunction::EASE_IN);
          +
          +

          You can also create your own alpha function:

          +
          +float 
          +MyAlphaFunction(float progress)
          +{
          +   return progress;
          +}
          +
          +AlphaFunction alphaFunction(&MyAlphaFunction);
          +animation.SetDefaultAlphaFunction(alphaFunction);
          +
          +

          You can specify a different alpha function for each animate call within the Animation object:

          +
          +animation.AnimateTo(Property(actor1, Dali::Actor::Property::POSITION), 
          +                    Vector3(10.0f, 50.0f, 0.0f), Dali::AlphaFunction::EASE_IN);
          +
          + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/animation_types_n.htm b/org.tizen.ui.practices/html/native/dali/animation_types_n.htm new file mode 100644 index 0000000..eb1c426 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/animation_types_n.htm @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + Animation Types: Types of Animations Supported by DALi + + + + + + +
          +

          Animation Types: Types of Animations Supported by DALi

          + +

          DALi supports key frame animation, path animation, and shader effect animation.

          + +

          Key Frame Animation

          + + +

          DALi provides support for animating between several different values, or key frames. A key frame takes a progress value between 0.0f and 1.0f (0 and 100% respectively) and portrays the value of the property when the animation has progressed that much. You can create several key frames:

          +
          +Dali::KeyFrames keyFrames = Dali::KeyFrames::New();
          +keyFrames.Add(0.0f, Vector3(10.0f, 10.0f, 10.0f));
          +keyFrames.Add(0.7f, Vector3(200.0f, 200.0f, 200.0f));
          +keyFrames.Add(1.0f, Vector3(100.0f, 100.0f, 100.0f));
          +
          + +

          Next, you can add the key frames to your animation.

          +
          +animation.AnimateBetween(Property(actor1, Dali::Actor::Property::POSITION), keyFrames);
          +
          +

          When you play the animation, DALi animates the position of actor1 between the specified key frames. The actor1 animates from (10.0f, 10.0f, 10.0f) to (200.0f, 200.f, 200.0f) by 70% of the animation time, and then spends the remaining time animating back to (100.0f, 100.0f, 100.0f).

          +

          The advantage of specifying a key frame at 0% is that regardless of where the actor1 is, it starts from position (10.0f, 10.0f, 10.0f). If AnimateTo() is used, the start position is the actor1's current position.

          + +

          Path Animation

          +

          The Dali::Path class can be used to animate the position and orientation of actors.

          + +

          The black points in the following figure are points where the DALi logo travels to. The red points are the control points which express the curvature of the path on the black points.

          + +

          Figure: Path animation

          +

          Path animation

          + +

          The following code presents the black points:

          +
          +Path path = Path::New();
          +path.AddPoint(Vector3(50.0f, 10.0f, 0.0f));
          +path.AddPoint(Vector3(90.0f, 50.0f, 0.0f));
          +path.AddPoint(Vector3(10.0f, 90.0f, 0.0f));
          +
          +

          The control points can be added manually using Dali::Path::AddControlPoint. The Dali::Path class can also auto-generate the control points for you.

          +
          +path.GenerateControlPoints(0.25f);
          +
          +

          Here 0.25f represents the curvature of the path you require. For more information, see the GenerateControlPoints() function in Dali::Path class (in mobile and wearable applications).

          +

          To animate actor1 along this path, use the following function:

          +
          +animation.Animate(actor1, path, Vector3::ZERO);
          +
          +

          The third parameter is the forward vector (in a local space coordinate system) that is oriented with the path's tangent direction.

          + + +

          Shader Effect Animation

          +

          Shader effects provide a visual effect for actors. In a shader, uniforms are set according to the purpose of applications. The uniforms of a shader can be animated using the Animation::AnimateTo() functions.

          +

          For example, to animate the center point of the Bendy shader effect:

          +
          +Dali::Animation animation = Dali::Animation::New(1.0f);
          +
          +Vector2 newPosition(0.0f, 0.0f);
          +animation.AnimateTo(Property(shaderEffect, shaderEffect.GetPositionPropertyName()), newPosition);
          +
          +

          To animate a uniform of a custom shader effect, you must use the name of the uniform:

          +
          +Dali::Animation animation = Dali::Animation::New(1.0f);
          +
          +// Set the initial value for the uniform
          +shaderEffect.SetUniform("myUniform", -0.5f);
          +
          +// Animate the uniform to a value
          +animation.AnimateTo(Property(shaderEffect, "myUniform"), 0.5f);
          +
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/background_n.htm b/org.tizen.ui.practices/html/native/dali/background_n.htm new file mode 100644 index 0000000..5c9e909 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/background_n.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + Background Knowledge: Using DALi More Effectively + + + + + + +
          +

          Background Knowledge: Using DALi More Effectively

          + +

          The following useful background knowledge enables you to use DALi more effectively:

          + + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/buttons_n.htm b/org.tizen.ui.practices/html/native/dali/buttons_n.htm new file mode 100644 index 0000000..3ff9fde --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/buttons_n.htm @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + Buttons: Push, Check, Select! + + + + + + +
          +

          Buttons: Push, Check, Select!

          + +

          A button is a small object on the UI that you press in order to operate it. DALi provides button controls, such as PushButton, CheckBoxButton, and RadioButton. The base class for the button controls is Toolkit::Button. The Toolkit::Button class provides the disabled property and the clicked signal. The following table lists the basic signals provided by the Toolkit::Button class.

          + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Toolkit::Button input signals +
          Input signalDescription
          PressedSignal()Emitted when the button is pressed. +
          ReleasedSignal()Emitted when the button is released. +
          ClickedSignal()Emitted when the button is clicked. +
          StateChangedSignal()Emitted when the button state is changed. +
          + +

          Push Button

          + +

          The PushButton class provides a button that can be pressed to operate it. A push button changes its appearance when is pressed and returns to its original appearance when is released.

          + +

          Figure: Push button

          +

          Push button

          + +

          A push button emits a Button::PressedSignal() signal when the button is pressed, a Button::ClickedSignal() signal when clicked, and a Button::ReleasedSignal() signal when released or the touch point leaves the boundary of the button. The following code shows an example of a basic push button:

          + +
          +class 
          +ButtonsController: public ConnectionTracker
          +{
          +   public:
          +      ButtonController(Application& application): mApplication(application)
          +      {
          +         mApplication.InitSignal().Connect(this, &ButtonController::Create);
          +      }
          +      void Create(Application& application)
          +      {
          +         PushButton button = PushButton::New();
          +         button.SetLabel("Select");
          +         button.SetParentOrigin(ParentOrigin::CENTER);
          +         button.ClickedSignal().Connect(this, &ButtonController::OnButtonClicked);
          +         Stage::GetCurrent().Add(button);
          +      }
          +      bool OnButtonClicked(Toolkit::Button button)
          +      {
          +         cout << "OnButtonClicked" << endl;
          +
          +         return true;
          +      }
          +   private:
          +      Application&  mApplication;
          +};
          +
          +int 
          +main(int argc, char **argv)
          +{
          +   Application application = Application::New(&argc, &argv);
          +   ButtonController test(application);
          +   application.MainLoop();
          +
          +   return 0;
          +}
          +
          + + +

          CheckBox Button

          + +

          The CheckBoxButton class provides a check box button, which can be checked or unchecked.

          + +

          Figure: Checkbox button

          +

          Checkbox button

          + +

          A checkbox button emits all 4 button input signals, but usually you can just use the Button::StateChangedSignal() signal to be notified when the button changes its state to selected or unselected. The following code shows an example of a basic checkbox button:

          + +
          +// Same as the push button example
          +
          +void 
          +Create(Application& application)
          +{
          +   CheckBoxButton button = CheckBoxButton::New();
          +   button.SetLabel("Select");
          +   button.SetSize(100, 40);
          +   button.SetBackgroundColor(Vector4(1, 0, 0, 1));
          +   button.SetParentOrigin(ParentOrigin::CENTER);
          +   button.StateChangedSignal().Connect(this, &ButtonController::OnButtonStateChanged);
          +   Stage::GetCurrent().Add(button);
          +}
          +
          +bool 
          +OnButtonStateChanged(Toolkit::Button button)
          +{
          +   cout << "OnButtonStateChanged " << button.IsSelected() << endl;
          +
          +   return true;
          +}
          +
          +// Same as the push button example
          +
          + +

          Radio Button

          + +

          The RadioButton class provides a radio button with 2 states: selected and unselected.

          + +

          Figure: Radio button

          +

          Radio button

          + +

          Usually, radio buttons are grouped. Two or more radio buttons are in the same group when they have the same parent. In each group, only 1 radio button can be selected at a given time. You can use the Button::StateChangedSignal() signal to check which radio button is selected. The following code shows an example of a basic radio button:

          + +
          +// Same as the push button example
          +
          +void 
          +Create(Application& application)
          +{
          +   Actor radioGroup = Actor::New();
          +   radioGroup.SetParentOrigin(ParentOrigin::CENTER);
          +   Stage::GetCurrent().Add(radioGroup);
          +
          +   RadioButton button1 = RadioButton::New();
          +   button1.SetLabel("button1");
          +   button1.SetBackgroundColor(Vector4(1, 0, 0, 1));
          +   button1.SetPosition(0, -40);
          +   radioGroup.Add(button1);
          +
          +   RadioButton button2 = RadioButton::New();
          +   button2.SetLabel("button2");
          +   button2.SetBackgroundColor(Vector4(0, 0, 1, 1));
          +   button2.SetPosition(0, 40);
          +   radioGroup.Add(button2);
          +
          +   button1.StateChangedSignal().Connect(this, &ButtonController::OnButtonStateChanged);
          +   button2.StateChangedSignal().Connect(this, &ButtonController::OnButtonStateChanged);
          +}
          +
          +bool 
          +OnButtonStateChanged(Toolkit::Button button)
          +{
          +   cout << "OnButtonStateChanged " << button.GetLabel() << " " << button.IsSelected() << endl;
          +
          +   return true;
          +}
          +
          +// Same as the push button example
          +
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/constraints_n.htm b/org.tizen.ui.practices/html/native/dali/constraints_n.htm new file mode 100644 index 0000000..d571f7a --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/constraints_n.htm @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + Constraints: Imposing Your Own Constraints on Actors + + + + + + +
          +

          Constraints: Imposing Your Own Constraints on Actors

          + +

          Constraints are used to modify the property of an actor, based on other properties of the same actor; properties of the actor's parent; or properties of another actor altogether, when the modification needs to be at run-time. Custom functions or functors can be supplied, where the desired value of the property can be calculated. These functions (or functors) are called in every frame, therefore they must be fast and not too complex, otherwise they can affect performance.

          +

          Multiple constraints can be applied to the same actor at the same time. The order in which constraints are applied is important as this is the order in which they are processed in the update thread.

          +

          Constraints are applied after animations have been applied. This means that Constraints override the values set by Animations. Constraints are not applied to off-stage actors.

          +

          Not all properties can be used as a constraint input. For more details, see the IsPropertyAConstraintInput() function in the Dali::Handle class (in mobile and wearable applications).

          + +

          Using a Constraint

          + +

          Constraints are designed as a way of modifying properties that cannot be modified by any existing built-in functionality, such as animations, size negotiation, parent anchor, or origin settings. As they provide the ability for the application developer to execute their own code within the update thread, DALi can no longer guarantee the timeliness of this code, or how optimized it can be.

          +

          Generally, you must not use constraints with the size property as constraining the size and size negotiation are mutually exclusive. Consider the following use cases as an example of when and when not to use a constraint:

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Examples of constraint use +
          RequirementSolution
          Need a child to be 50% the size of it's parent.Use size negotiation.
          Need to zoom an actor in to the screen using its scale property.Use an animation.
          Need an actor to appear centered around the bottom-right corner of its parent.Use ParentOrigin and AnchorPoint.
          Need to lay out a series of controls with various alignment requirements.Use either Anchor and origin settings, or a TableView.
          Need to automatically modify the position property of one actor based on the position property of another actor, that is neither a parent OR a child.Use a constraint.
          Need to position an actor relative to its parent actor in a NON-UNIFORM way, or a non-linear calculation needs to be performed that requires a functor.Use a constraint.
          Need to modify an actor's property in real time based on some calculations that require additional data to be stored in-between frames.Use a constraint. The constraint functor can hold any variables within it that need to be preserved frame-to-frame.
          + +

          For most general cases, the position and size requirements of a child or parent actor (from its child or parent) can be calculated with size negotiation.

          + +

          Defining Constraint Sources

          +

          These properties are used as input sources to the constraint. The constraint takes these values, optionally performs a calculation on them (if using a custom functor), and writes the result to the specified property of the target actor. The source actor is specified as either the same actor, its parent, or another actor.

          +
            +
          • Local source +

            A local source is based on the local properties (such as size, position, scale, orientation, or color) of an actor. For example, the actor's orientation can be used as a constraint input source.

            +
            +Dali::ConstraintSource source(Dali::LocalSource(Dali::Actor::Property::ORIENTATION));
            +
            +
          • +
          • Parent Source +

            A parent source is based on properties of the actor's parent. For example, a parent's position can be used as a constraint input source.

            +
            +Dali::ConstraintSource source(Dali::ParentSource(Dali::Actor::Property::POSITION));
            +
            +
          • +
          • Other Handle Source +

            You can base your source on the properties of another handle altogether. For example, a sibling actor's color can be used as a constraint input source.

            +
            +Dali::ConstraintSource source(Dali::Source(anotherHandle, Dali::Actor::Property::COLOR));
            +
            +
          • +
          + +

          Defining the Constraint Function

          + +

          The signature of the constraint function is:

          + +
          +void Function(PropertyType &current, const Dali::PropertyInputContainer &inputs);
          +
          +

          In this function the current parameter is a reference to the target property type, such as float, Vector2, or Vector3. This is an in or out parameter. It represents the current value of the property and the expectation is that it is modified by the function to the desired value.

          +

          The inputs parameter holds all the constraint input sources. Each element is a pointer to the property input and can be accessed using the indexing operator [ ]. The order in which the sources are added is the order in which the property inputs are sorted in the container.

          +
          +constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION));
          +constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::SIZE));
          +constraint.AddSource(Dali::ParentSource(Dali::Actor::Property::POSITION));
          +constraint.AddSource(Dali::ParentSource(Dali::Actor::Property::SIZE));
          +
          +

          In the constraint function this equals to:

          +
          +const Dali::Vector3& position(inputs[0]->GetVector3());
          +const Dali::Vector3& size(inputs[1]->GetVector3());
          +const Dali::Vector3& parentPosition(inputs[2]->GetVector3());
          +const Dali::Vector3& parentSize(inputs[3]->GetVector3());
          +
          + + +

          Creating a Constraint

          +

          Using C Functions

          +

          If you do not have any data that is changed at runtime, C functions must be used. For example, the color of an actor can be changed based on its position along the x axis to a preset distance of 100, beyond which it is transparent.

          +
          +Dali::Actor actor = Actor::New();
          +
          +// Create a constraint that targets actor
          +Dali::Constraint constraint = Dali::Constraint::New< Vector4 >(actor, Dali::Actor::Property::COLOR, MyConstraintFunction); 
          +
          +// Add the POSITION property as a constraint input
          +constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION)); 
          +
          +// Apply the constraint
          +constraint.Apply(); 
          +
          + +

          The following example shows the actual C function:

          +
          +void MyConstraintFunction(Dali::Vector4& current, const Dali::PropertyInputContainer& inputs)
          +{
          +   const Dali::Vector3& position(inputs[0]->GetVector3());
          +
          +   float distance = fabs(position.x);
          +
          +   // More than 100.0f away, opacity is 0.0f
          +   if (distance > 100.0f)
          +   {
          +      current.a = 0.0f;
          +   }
          +   else
          +   {
          +      // Otherwise it blends between fully opaque and transparent
          +      current.a = (100.0f - distance) / 100.0f;
          +   }
          +}
          +
          + +

          For more information, see the New() function in the Dali::Constraint class (in mobile and wearable applications).

          + +

          Using Functors

          + +

          If you need to store some data in a struct or class, a functor can be used. Reusing the last example, the color of an actor is changed based on its position along the x axis, but the distance when it is transparent is different for each applied constraint.

          +
          +Dali::Actor actor = Actor::New();
          +
          +// Create a constraint that targets actor, and uses MyFunctor with a distance of 200
          +Dali::Constraint constraint = Dali::Constraint::New< Vector4 >(actor, Dali::Actor::Property::COLOR, MyFunctor(200)); 
          +
          +// Add the POSITION property as a constraint input
          +constraint.AddSource(Dali::LocalSource(Dali::Actor::Property::POSITION)); 
          +
          +// Apply the constraint
          +constraint.Apply(); 
          +
          +

          The following example shows the structure:

          +
          +struct MyFunctor
          +{
          +   // Constructor which takes the distance at which the actor is fully transparent
          +   MyFunctor(float distance)
          +   : mDistance(distance)
          +   {
          +   }
          +
          +   // Functor
          +   void operator()(Dali::Vector4 &current, const Dali::PropertyInputContainer &inputs)
          +   {
          +      const Dali::Vector3& position(inputs[0]->GetVector3());
          +
          +      float distance = fabs(position.x);
          +
          +      // More than mDistance away, opacity is 0.0f
          +      if (distance > mDistance)
          +      {
          +         current.a = 0.0f;
          +      }
          +      else
          +      {
          +         // Otherwise it blends between fully opaque and transparent
          +         current.a = (100.0f - mDistance) / 100.0f;
          +      }
          +   }
          +
          +   // Data
          +   const float mDistance;
          +};
          +
          +

          MyFunctor() can be used also with another constraint with a different distance.

          +

          Instead of using the default functor, another function can be declared in the class or struct and be used as the constraint function.

          +

          For more information, see the New() function in the Dali::Constraint class (in mobile and wearable applications).

          + + +

          Removing Constraints

          + +

          The actor's constraints can later be removed in several ways:

          +
          +mConstraint.Remove(); // mConstraint is a base-handle to a constraint
          +actor.RemoveConstraints(); // Removes ALL constraints applied to an actor
          +actor.RemoveConstraint(tag); // All constraints with the tag are removed from the actor (tag can be set using SetTag)
          +
          + + +

          Setting an Equal To Constraint

          + +

          The built-in Dali::EqualToConstraint function can be used if only setting a property equal to another property is required:

          +
          +Dali::Constraint constraint = Dali::Constraint::New< Vector3 >(actor, Dali::Actor::Property::POSITION, Dali::EqualToConstraint());
          +constraint.AddSource(Dali::Source(anotherActor, Dali::Actor::Property::POSITION));
          +constraint.Apply();
          +
          +

          Here actor's position is set to equal the position of anotherActor.

          + + +

          Setting a Relative To Constraint

          + +

          The built in Dali::RelativeToConstraint and Dali::RelativeToConstraintFloat functions can be used if only setting a property relative to another property is required:

          + +
          +Dali::Constraint constraint = Dali::Constraint::New< Vector3 >(actor, Dali::Actor::Property::POSITION, Dali::RelativeToConstraint(2.0f));
          +constraint.AddSource(Dali::Source(anotherActor, Dali::Actor::Property::POSITION));
          +constraint.Apply();
          +
          +

          Here the actor's position is relative to the position of anotherActor. If anotherActor is at (10.0f, 20.0f, 30.0f), actor is at (20.0f, 40.0f, 60.0f).

          + + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/control_base_n.htm b/org.tizen.ui.practices/html/native/dali/control_base_n.htm new file mode 100644 index 0000000..e686ca6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/control_base_n.htm @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + Control: Base Class of UI Components + + + + + + +
          +

          Control: Base Class of UI Components

          + +

          The Dali::Toolkit::Control class is the base class for all UI components in DALi. With this class, you can, for example, manage the background color and images for UI components.

          + + +

          Setting the Background Color

          + +

          You can set a background color for a UI component. To set a red background for a component:

          + +
          +Dali::Toolkit::Control control = Dali::Toolkit::Control::New();
          +control.SetSize(200.0f, 200.0f);
          +control.SetBackgroundColor(Dali::Color::RED);
          +
          + +

          Figure: Control object with a red background

          +

          Control object with a red background

          + +

          You can handle all existing controls similarly. For example, to set the background color for a TextLabel:

          + +
          +Dali::Toolkit::TextLabel label = Dali::Toolkit::TextLabel::New("Hello World");
          +label.SetBackgroundColor(Dali::Color::RED);
          +
          + +

          Figure: TextLabel object with a red background

          +

          TextLabel object with a red background

          + + +

          Setting the Background Image

          + +

          You can set a background image of a control:

          + +
          +Dali::Toolkit::Control control = Dali::Toolkit::Control::New();
          +Dali::Image image = Dali::Image::New("image.png");
          +control.SetBackgroundImage(image);
          +
          + +

          Figure: Control object with a background image

          +

          Control object with a background image

          + +

          The background image is blended with the background color. The following example shows what happens if a red background color is set on the control with a background image:

          + +
          +control.SetBackgroundColor(Dali::Color::RED);
          +
          + +

          Figure: Control object with a background image blended with a background color

          +

          Control object with a background image blended with a background color

          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/dali_applications_n.htm b/org.tizen.ui.practices/html/native/dali/dali_applications_n.htm new file mode 100644 index 0000000..e9ada1f --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/dali_applications_n.htm @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + Application: Framework for DALi Application + + + + + + +
          +

          Application: Framework for DALi Application

          + +

          The Adaptor framework provides the Dali::Application class, which initializes and sets up DALi appropriately. The class provides many platform-related services.

          + +

          Several signals can be connected to keep you informed when certain platform-related activities occur. It also ensures that, upon system events, DALi is called in a thread-safe manner.

          + +

          The following example shows how to create a Dali::Application instance and connect to its initialize signal, where the Dali::Actor hierarchy is created:

          + +
          void CreateProgram(Application& app)
          +{
          +   // Create DALi components...
          +   Dali::Actor actor = Actor::New();
          +   ...
          +}
          +int main (int argc, char **argv)
          +{
          +   Dali::Application app = Application::New(&argc, &argv);
          +   app.InitSignal().Connect(&CreateProgram);
          +   app.MainLoop();
          +}
          + +

          Window

          + +

          DALi provides the Window class to manage drawing to a default surface. The class is also responsible for drawing the Indicator bar if required. The Application class automatically creates a Window which the you can access after the SignalInit() function has fired.

          + +
          void CreateProgram(Application& app)
          +{
          +   app.GetWindow().ShowIndicator(Dali::Window::VISIBLE);
          +}
          +int main (int argc, char **argv)
          +{
          +   Dali::Application app = Application::New(argc, argv);
          +   app.SignalInit().Connect(&CreateProgram);
          +   app.MainLoop();
          +}
          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/dali_overview_n.htm b/org.tizen.ui.practices/html/native/dali/dali_overview_n.htm new file mode 100644 index 0000000..8d11197 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/dali_overview_n.htm @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + DALi Overview: Getting Started with DALi UI Programming + + + + + + +
          +

          DALi Overview: Getting Started with DALi UI Programming

          + +

          Dynamic Animation Library (DALi) internally defines a virtual 3D world (space) and maintains hierarchical objects in the 3D world. The hierarchical object tree is known as the scene graph. A node in the scene graph can have several children but often only a single parent, with the effect of a parent applied to all its child nodes; an operation performed on a group automatically propagates its effect to all of its members.

          +

          There are various types of nodes, such as image, text, and buttons.

          + +

          DALi Fundamentals

          + +

          Before starting UI programming with DALi, familiarize yourself with the basic concepts.

          + +

          Actor and Stage

          + +

          Actor is the primary object for interaction in DALi applications. Actors are effective nodes that receive input (touch events) and act as a container for drawable elements and other actors. A DALi application uses a hierarchy of actor objects to position visible content. An actor inherits a position relative to its parent, and can be moved relative to this point. UI components can be built by combining multiple actors.

          +

          Stage is a top-level node of the scene graph used for displaying a tree of actors. To display an actor, add it to the stage.

          + +

          Signal and Slot

          + +

          Signals and slots are used in the QT GUI library for communication between objects. Objects can send signals containing event information, which can be received by other objects using special functions known as slots. The DALi event system follows the signal and slot mechanism.

          + +

          Signal events are emitted when a certain action or event occurs. The application can connect using these signals. Standard C-style functions can be used to connect to these signals if no local data needs to be accessed, otherwise a class function can also be connected.

          +

          Applications can manually disconnect from signals when required. However, DALi also provides safe signal disconnection. This means that when the connecting object is deleted, the signal is automatically disconnected.

          + +

          Coordinate System

          + +

          DALi uses a left-handed coordinate system with the origin at the top-left corner, with positive X to right, positive Y going downwards, and positive Z going outside the screen with the default camera. This is convenient when creating 2D views.

          + +

          The stage has a 2D size that matches the size of the application window. The default unit 1 is 1 pixel with the default camera.

          + +

          Figure: DALi coordinate system

          +

          DALi coordinate system

          + +

          Camera

          + +

          DALi has a concept of a camera to display its virtual 3D world to a 2D screen. There are 2 ways of using the camera in DALi:

          +
            +
          • For 2D applications, you do not need to care about the camera at all. The default camera is already best suited for 2D applications (configured to have the origin of the coordinate system at the top-left corner of the screen, and unit 1 as 1 pixel of the screen). This is a typical way.
          • +
          • For 3D applications, you can change the view by manipulating the camera. You can translate or rotate the camera in this case. Note that the top-left corner of the screen and unit 1 no longer are (0,0,0) and 1 pixel after manipulating the camera.
          • +
          + + +

          DALi Internal Structure

          + +

          DALi consists of the following modules:

          + +
            +
          • dali-core +

            This module provides scene graph -based rendering, animation, and event handling. It is a base module and forms the biggest part of +DALi.

            +
          • +
          • dali-toolkit +

            This module provides UI components and various effects on top of the dali-core.

          • +
          • dali-adaptor +

            dali-adaptor is a platform adaptation layer. It initializes and sets up DALi appropriately. The module provides many platform-related services with its internal module, platform abstraction. Several signals can be connected to it to keep you informed when certain platform-related activities occur.

          • +
          +

          Figure: DALi internal structure

          +

          DALi internal structure

          + +

          Creating a DALi Application

          + +

          To create a 'Hello World' application with Dali:

          +
            +
          1. Create a DALi project: +
              +
            1. In the Tizen IDE menu, go to File > New > Tizen Native Project. +

              Press Finish, and your project is created at the default location. If you want to change the location, uncheck Use default location and set a new location. For more information, see Creating the Application Project.

              +

              Create a DALi project

              +
            2. +
            3. The new project is shown in the Project Explorer view of the IDE. If you open the src/basicdaliapplication.cpp file, you can see the source code of the basic DALi application: +
              +#include <dali-toolkit/dali-toolkit.h>
              +
              +using namespace Dali;
              +using Dali::Toolkit::TextLabel;
              +
              +// This example shows how to create and display Hello World using a simple TextLabel
              +
              +class HelloWorldController : public ConnectionTracker
              +{
              +   public:
              +
              +   HelloWorldController(Application& application)
              +   : mApplication(application)
              +   {
              +      // Connect to the application's Init signal
              +      mApplication.InitSignal().Connect(this, &HelloWorldController::Create);
              +   }
              +
              +      ~HelloWorldController()
              +   {
              +      // Nothing to do here
              +   }
              +
              +   // The Init signal is received once (only) during the application lifetime
              +   void Create(Application& application)
              +   {
              +      // Get a handle to the stage
              +      Stage stage = Stage::GetCurrent();
              +      stage.SetBackgroundColor(Color::WHITE);
              +
              +      TextLabel textLabel = TextLabel::New("Hello World");
              +      textLabel.SetAnchorPoint(AnchorPoint::TOP_LEFT);
              +      textLabel.SetName("hello-world-label");
              +      stage.Add(textLabel);
              +
              +      // Respond to a click anywhere on the stage
              +      stage.GetRootLayer().TouchedSignal().Connect(this, &HelloWorldController::OnTouch);
              +   }
              +
              +   bool OnTouch Actor actor, const TouchEvent& touch)
              +   {
              +      // Exit the application
              +      mApplication.Quit();
              +      return true;
              +   }
              +
              +   private:
              +   Application& mApplication;
              +};
              +
              +// Entry point for Tizen applications
              +int main(int argc, char **argv)
              +{
              +   Application application = Application::New(&argc, &argv);
              +   HelloWorldController test(application);
              +   application.MainLoop();
              +   return 0;
              +}
              +
              +
            4. +
            +
          2. +
          3. Initialize the DALi application: + +

            To use the DALi APIs, include the dali-toolkit.h header file. It includes the dali-core and dali-adaptor modules.

            + +
            #include <dali-toolkit/dali-toolkit.h>
            + +

            The Dali::Application class (in mobile and wearable applications) initializes and sets up DALi.

            + +

            Several signals can be connected to keep you informed when certain platform-related activities occur, and ensure that, upon system events, DALi is called in a thread-safe manner. To manage signal connection safely, DALi provides the Dali::ConnectionTracker class. A typical way for starting a DALi application is to create a class derived from the Dali::ConnectionTracker class and use its member functions as callback functions for DALi signals (for more information, see Automatic Connection Management). The HelloWorldController class is used in other code samples in the DALi guide.

            + +

            Create a Dali::Application instance:

            + +
            +Application application = Application::New(&argc, &argv);
            + +

            After getting the initialized signal from the Dali::Application instance, you can use the DALi APIs for building the scene graph. Connect the HelloWorldController::Create callback to the DALi::Application InitSignal() function:

            + +
            +mApplication.InitSignal().Connect(this, &HelloWorldController::Create);
            + +

            To run the application, start its main loop. This ensures that images are displayed, and events as well as signals are dispatched and captured.

            +
            +application.MainLoop();
            +
          4. + +
          5. Create an actor and add it to a stage: + +

            The TextLabel UI component renders a short text string. To display the TextLabel component, add it to a stage. The stage instance is a singleton object (the only instance of its class during the lifetime of the program), so you can get it using a static function:

            + +
            +Stage stage = Stage::GetCurrent();
            +stage.SetBackgroundColor(Color::WHITE);
            +
            +TextLabel textLabel = TextLabel::New("Hello World");
            +textLabel.SetAnchorPoint(AnchorPoint::TOP_LEFT);
            +textLabel.SetName("hello-world-label");
            +stage.Add(textLabel);
            +
            + +

            The above code additionally sets the background color of the stage and the anchor point, a point defining a position of a child actor from its parent, of the textLabel. The application stores the actor and resource handles. DALi objects are reference-counted, which makes sure they exist only as long as they are needed. Even if the TextLabel component is removed from the stage, it remains alive through the reference.

            + +
          6. +
          7. Build the DALi application: + +

            To build your application, select Project > Build Project or press F10 in the IDE.

            +

            The Tizen IDE automatically packages the project after building. Note that you need to register your certificate when building for the first time. For more information, see Certificate Registration and Building Applications.

            + +
          8. +
          9. Run the DALi application: + +

            To run your application, select Run > Run or press Ctrl+F11 in the IDE.

            +

            For more information, see Running Applications.

            +

            DALi application running on a Tizen emulator

            + +
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/event_handling_n.htm b/org.tizen.ui.practices/html/native/dali/event_handling_n.htm new file mode 100644 index 0000000..23350cc --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/event_handling_n.htm @@ -0,0 +1,575 @@ + + + + + + + + + + + + + + Event Handling: Managing the Event Flow + + + + + + +
          + +

          Event Handling: Managing the Event Flow

          + +

          DALi event handling system is composed of 2 major concepts:

          + +
            +
          • Signal +

            Notifications containing event information emitted by GUI components. Also known as events or notifications.

          • +
          • Slot +

            Special functions receiving signals. Also known as event handlers, observer, listener, or callbacks.

          • +
          +

          DALi emits various types of signals to an application to inform it of user actions and the application can handle them through slots.

          + +

          The concept of signal and slots were introduced by Qt for communication between objects. The event mechanism of DALi is inspired by Qt.

          + +

          Figure: A schematic example of signal-slot connections

          + + +

          Signal and slot event handling

          +

          In the figure, signal 1 is connected to slot 1, signal 2 is connected to slot 1 and slot 3, and signal 3 is connected to slot 2.

          + +

          The signal and slot system has following advantages:

          +
            +
          • Object-oriented: supports callbacks for C++ member functions
          • +
          • Type safe: the compiler is able to check for type safety
          • +
          • Non-coupling: no dependency between caller and callee
          • +
          • Non-type-intrusive: no modification to caller or callee types
          • +
          • Generic: works for all types of call-backs
          • +
          • Many-to-many relationship: 1 slot can connect to many signals and 1 signal can be connected to many slots, for example
          • +
          + +

          Touch Events

          +

          The Dali::Actor class provides the TouchedSignal() function to inform the application that a user touches the actor. It is defined as follows:

          + +
          typedef Signal<bool (Actor, const TouchEvent&)> TouchSignalType;
          +TouchSignalType&TouchedSignal();
          + +

          This means that a slot of the following type can be connected to the TouchedSignal() function:

          + +
          bool YourCallbackName(Actor actor, const TouchEvent&event);
          + +

          The return value true indicates that the touch event must be consumed. Otherwise, the signal is emitted on the next sensitive parent of the actor. The meaning is valid only for the TouchedSignal() function, and other types of signals may not have a return value.

          + +

          Each point on the screen being or having been touched is represented by the Dali::TouchPoint object. This object stores information about the state of the touch point (such as down, up, or motion.) and the coordinates of the touch.

          + +

          A collection of touch points at a specific moment in time is collated into the Dali::TouchEvent object. When a multi-touch event occurs, each touch point represents the points that are currently being touched or the points where touch has stopped.

          + +

          The following example shows how a connection to a touch event signal can be established:

          + +
          +// Assuming this code is in the HelloWorldController class
          +void 
          +Create(Application& application)
          +{
          +   Control actor = Control::New(); 
          +   // Control is one of the simplest types of Actor that has a visible form
          +   actor.SetParentOrigin(ParentOrigin::CENTER);
          +   actor.SetSize(100.0f, 100.0f);
          +   actor.SetBackgroundColor(Vector4(1.0f, 1.0f, 1.0f, 1.0f));
          +   actor.TouchedSignal().Connect(this, &HelloWorldController::OnTouch);
          +   Stage::GetCurrent().Add(actor);
          +}
          +
          +bool 
          +OnTouch(Actor actor, const TouchEvent&touch)
          +{
          +   bool handled = false;
          +   unsigned int pointCount = touch.GetPointCount();
          +   if (pointCount == 1)
          +   {
          +      // Do the action on the first touch on the screen
          +      handled = true;
          +   }
          +   else if (pointCount > 1)
          +   {
          +      // Do action on a multi-touch on the screen
          +      handled = true;
          +   }
          +
          +   return handled; 
          +   // true if you have handled the touch, false otherwise
          +}
          +
          + +

          The touch event is first emitted to the hit actor by the primary touch point, which is the first point that the user touches. If this hit actor does not handle the event, then the event is offered to the hit actor's parent. Again, if the parent does not handle this event, it is then offered to its parent and so on until the stage is reached or the event is consumed.

          + +

          If a parent and child actor both connect to the touch signal, the touch event is first offered to the child. If it is consumed by the child, the parent is not informed.

          + +

          Key Events

          + +

          The following example shows how to handle key events received by the stage:

          + +
          +// Assuming this code is in the HelloWorldController class
          +void 
          +Create(Application& application)
          +{
          +   Stage::GetCurrent().SetBackgroundColor(Vector4(1.0f, 1.0f, 1.0f, 1.0f));
          +   Stage::GetCurrent().KeyEventSignal().Connect(this, &HelloWorldController::OnKeyEvent);
          +
          +   PushButton button = PushButton::New();
          +   Stage::GetCurrent().Add(button);
          +}
          +
          +void 
          +OnKeyEvent(const KeyEvent& event)
          +{
          +   if (event.state == KeyEvent::Down)
          +   {
          +      if (IsKey(event, DALI_KEY_ESCAPE) || IsKey(event, DALI_KEY_BACK))
          +      {
          +         mApplication.Quit();
          +      }
          +   }
          +}
          +
          + +

          The stage is the top-most root object, so it can receive application-wide key events.

          + +

          DALi provides its own key codes for several special keys, such as DALI_KEY_ESCAPE or DALI_KEY_BACK. The following table lists the available DALi key codes.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: DALi key codes +
          Key codes
          DALI_KEY_INVALID
          DALI_KEY_ESCAPE
          DALI_KEY_BACKSPACE
          DALI_KEY_CURSOR_UP
          DALI_KEY_CURSOR_LEFT
          DALI_KEY_CURSOR_RIGHT
          DALI_KEY_CURSOR_DOWN
          DALI_KEY_BACK
          DALI_KEY_CAMERA
          DALI_KEY_CONFIG
          DALI_KEY_POWER
          DALI_KEY_PAUSE
          DALI_KEY_CANCEL
          DALI_KEY_PLAY_CD
          DALI_KEY_STOP_CD
          DALI_KEY_PAUSE_CD
          DALI_KEY_NEXT_SONG
          DALI_KEY_PREVIOUS_SONG
          DALI_KEY_REWIND
          DALI_KEY_FASTFORWARD
          DALI_KEY_MEDIA
          DALI_KEY_PLAY_PAUSE
          DALI_KEY_MUTE
          DALI_KEY_MENU
          DALI_KEY_HOME
          DALI_KEY_HOMEPAGE
          DALI_KEY_WEBPAGE
          DALI_KEY_MAIL
          DALI_KEY_SCREENSAVER
          DALI_KEY_BRIGHTNESS_UP
          DALI_KEY_BRIGHTNESS_DOWN
          DALI_KEY_SOFT_KBD
          DALI_KEY_QUICK_PANEL
          DALI_KEY_TASK_SWITCH
          DALI_KEY_APPS
          DALI_KEY_SEARCH
          DALI_KEY_VOICE
          DALI_KEY_LANGUAGE
          DALI_KEY_VOLUME_UP
          DALI_KEY_VOLUME_DOWN
          + + +

          Input Signals

          + +

          Many DALi classes provide various signals to notify events to the application. Among them, the most basic type of signals are input signals. This section briefly introduces these input signals in DALi.

          + +

          The basic DALi input signals are as follows:

          + +
            +
          • Touched signal notifies you of a screen touch or mouse click
          • +
          • Hovered signal notifies you of mouse hovering
          • +
          • Wheel event signal notifies you of mouse wheel rolling
          • +
          • Key event signal notifies you of a keyboard input
          • +
          • Key input focus signals notifies you that a control is ready to receive key event signals
          • +
          • Keyboard focus signals notifies you of a moved focus by navigation keys (such as left or right)
          • +
          +

          These signals are provided by the following classes:

          + +
            +
          • Dali::Actor + + + + + + + + + + + + + + + + + + + + + +
            + Table: Dali::Actor input signals +
            Input signalsDescription
            TouchedSignal()Emitted when touch input is received. +

            Callback: bool YourCallbackName(Actor actor, const TouchEvent& event);

            HoveredSignal()Emitted when hover input is received. +

            Callback: bool YourCallbackName(Actor actor, const HoverEvent& event);

            WheelEventSignal()Emitted when wheel event is received. +

            Callback: bool YourCallbackName(Actor actor, const WheelEvent& event);

            + +

            The actor receiving events is passed to the callbacks.

            +
          • + +
          • +Dali::Stage + + + + + + + + + + + + + + + + + + + + + +
            + Table: Dali::Stage input signals +
            Input signalsDescription
            TouchedSignal()Emitted when touch input is received. +

            Callback: void YourCallbackName(const TouchEvent& event)

            HoveredSignal()Emitted when hover input is received. +

            Callback: void YourCallbackName(const TouchEvent& event);

            KeyEventSignal()Emitted when a key event is received. +

            Callback: void YourCallbackName(const KeyEvent& event);

            + +

            Only events are passed to the callbacks since only a single stage instance can exist in DALi application. The callback return types are void because the stage has no parent to pass events to, even though it does not consume the events.

            +
          • + +
          • +Dali::Toolkit::Control + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            + Table: Dali::Toolkit::Control input signals +
            Input signalsDescription
            KeyEventSignal()Emitted when a key event is received. +

            Callback: bool YourCallbackName(Control control, const KeyEvent& event);

            KeyInputFocusGainedSignal()Emitted when the control gets key input focus. +

            Callback: bool YourCallbackName(Control control);

            KeyInputFocusLostSignal()Emitted when the control loses key input focus, which can be due to it being gained by another control or actor or just cleared from this control as no longer required. +

            Callback: bool YourCallbackName(Control control);

            TouchedSignal(), HoveredSignal(), KeyEventSignal()Same as the ones supported by Actor +
            + +

            The key event signal is provided by the Dali::Stage and Dali::Toolkit::Control classes, not by the Dali::Actor class. The Dali::Actor class is not designed to get key events. To receive key events, an actor must be an instance of the Dali::Toolkit::Control class or one of its subclasses.

            +

            The Dali::Toolkit::Control class can also receive touch, hover, and wheel events as it inherits from the Dali::Actor class.

            +
          • + +
          • +Dali::Toolkit::KeyboardFocusManager + + + + + + + + + + + + + + + + + + + + + + + + + +
            + Table: Dali::Toolkit::KeyboardFocusManager input signals +
            Input signalsDescription
            PreFocusChangeSignal()Emitted before the focus is going to be changed. +

            Callback: Actor YourCallbackName(Actor currentFocusedActor, Actor proposedActorToFocus, Control::KeyboardFocus::Direction direction);

            FocusChangedSignal()Emitted after the current focused actor has been changed. +

            Callback: void YourCallbackName(Actor originalFocusedActor, Actor currentFocusedActor);

            FocusGroupChangedSignal()Emitted when the focus group has been changed. +

            Callback: void YourCallbackName(Actor currentFocusedActor, bool forward);

            FocusedActorEnterKeySignal()Emitted when the current focused actor has the enter key pressed on it. +

            Callback: void YourCallbackName(Actor enterPressedActor);

            +
          • +
          + +

          Dali::Toolkit::KeyboardFocusManager provides the functionality of handling keyboard navigation and maintaining the 2-dimensional keyboard focus chain. Dissimilar to the key input focus, the keyboard focus is about the focus moving between actors, and that is why this signal is provided by the specific focus managing class.

          + +

          The following DALi classes provide signals:

          +
            +
          • Dali::Window
          • +
          • Dali::Application
          • +
          • Dali::Timer
          • +
          • Dali::Actor
          • +
          • Dali::Image
          • +
          • Dali::ResourceImage
          • +
          • Dali::LongPressGestureDetector
          • +
          • Dali::TapGestureDetector
          • +
          • Dali::PanGestureDetector
          • +
          • Dali::PinchGestureDetector
          • +
          • Dali::RenderTask
          • +
          • Dali::Stage
          • +
          • Dali::ObjectRegistry
          • +
          • Dali::PropertyNotification
          • +
          • Dali::Animation
          • +
          • Dali::Toolkit::Button
          • +
          • Dali::Toolkit::Control
          • +
          • Dali::Toolkit::TextField
          • +
          • Dali::Toolkit::View
          • +
          • Dali::Toolkit::GaussianBlurViewSignal
          • +
          • Dali::ScrollBar
          • +
          • Dali::Toolkit::Scrollable
          • +
          • Dali::Toolkit::ScrollView
          • +
          • Dali::Toolkit::AccessibilityFocusManager
          • +
          • Dali::Toolkit::KeyboardFocusManager
          • +
          +

          For the signals of each class and their usage, see the API Reference.

          + +

          Gestures

          +

          Gesture is a user-friendly high-level event produced from a stream of touch events. The Dali::GestureDetector class analyzes a stream of touch events and attempts to determine the intention of the user.

          +

          If an actor is attached to a gesture detector and the detector recognizes a user intention (detects a predefined pattern in a stream of touch events), the actor emits a detected gesture signal to the application.

          + +

          DALi currently supports following gesture detectors:

          + +
            +
          • Dali::LongPressGestureDetector detects when the user does a long-press action.
          • +
          • Dali::TapGestureDetector detects when the user does a tap action.
          • +
          • Dali::PinchGestureDetector detects when the user moves two fingers towards or away from each other.
          • +
          • Dali::PanGestureDetector detects when the user moves one or more fingers in the same direction.
          • +
          + +

          The example below shows how an application can be notified of a pinch gesture:

          + +
          +// Assuming this code is in the HelloWorldController class
          +void 
          +Create(Application& application)
          +{
          +   PushButton actor = PushButton::New(); // Another type of Actor
          +   actor.SetParentOrigin(ParentOrigin::CENTER);
          +   actor.SetSize(100.0f, 100.0f);
          +   Stage::GetCurrent().Add(actor);
          +
          +   PinchGestureDetector detector = PinchGestureDetector::New();
          +   detector.Attach(actor);
          +   detector.DetectedSignal().Connect(this, &HelloWorldController::OnPinch);
          +}
          +
          +void 
          +OnPinch(Actor actor, const PinchGesture& pinch)
          +{
          +   // Scale your actor according to the pinch scale
          +   Vector3 newSize = actor.GetCurrentSize() * pinch.scale;
          +   actor.SetSize(newSize);
          +}
          +
          + +

          Automatic Connection Management

          + +

          If you have a pair of a connected signal (for example, a button clicked signal) and a slot (for example, a toolbar object having the callback for the signal), and one of them (the button or the toolbar) is deleted without any notification, the application crashes when the signal is emitted or the slot tries to disconnect the signal.

          + +

          DALi provides the automatic connection management mechanism to prevent this kind of situation. The key is the Dali::ConnectionTracker class. It tracks connections between signals and slots, and performs an automatic disconnection when either the signal or slot is deleted.

          + +

          Due to this mechanism, all the DALi sample codes start with a controller class derived from the Dali::ConnectionTracker class. This is a safe and typical way of making a DALi application. You can, of course, create other structures using the Dali::ConnectionTracker class.

          + + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/guides_dali_n.htm b/org.tizen.ui.practices/html/native/dali/guides_dali_n.htm new file mode 100644 index 0000000..9d6b6ab --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/guides_dali_n.htm @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + DALi + + + + + + +
          +

          DALi

          + +

          DALi is a cross-platform 3D UI Toolkit for embedded systems. Its 3D user interface engine enables you to create rich and high-performance UI applications. DALi is based on OpenGL ES 2.0, but provides a clean cross-platform C++ framework. This means that you can use high-level DALi APIs instead of accessing low-level OpenGL APIs directly.

          + +

          When creating a DALi application, make sure you understand the following main features:

          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/handle_n.htm b/org.tizen.ui.practices/html/native/dali/handle_n.htm new file mode 100644 index 0000000..39180aa --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/handle_n.htm @@ -0,0 +1,197 @@ + + + + + + + + + + + + + + Handle/Body Pattern: Basic Way of Using DALi Objects + + + + + + +
          +

          Handle/Body Pattern: Basic Way of Using DALi Objects

          + +

          DALi widely adopts the handle/body pattern (also known as the pimpl pattern), which separates the implementation details (body class) from its interface (handle class).

          + +

          The Dali::BaseHandle (in mobile and wearable) is a base class for handle classes in DALi. It additionally provides smart-pointer semantics, which manage internal objects with reference counts. Most of the classes in the DALi public API are handle classes, which means they inherit from the Dali::BaseHandle class.

          + +

          The handle/body pattern structure is beneficial for both DALi users and developers:

          +
            +
          • Easier memory management +

            Each internal implementation class (body class) contains a single reference count object, which can be initialized with the static "New" functions in the DALi public API. This means that C++ new/delete operators do not have to be used in your code. (The internal body classes inherit from the Dali::BaseObject class, but you do not need to use this class directly.)

            +
          • +
          • Better encapsulation +

            The danger of API/ABI breaks is reduced, since the implementation of a class can be changed without modifying the public API, thus without recompiling code using the public API. This can also reduce the build time.

            +
          • +
          + +

          The following examples show how to use the handles:

          +
            + +
          • No need to call destructors: +
            +class 
            +HandleTest
            +{
            +   HandleTest()
            +   {
            +      mActor = Actor::New();
            +   }
            +
            +   ~HandleTest() {} // Actor object is destroyed automatically
            +
            +   Actor mActor;
            +};
            +
            +
          • + +
          • Can be stored in STL containers: +
            +class 
            +HandleTest
            +{
            +   HandleTest()
            +   {
            +      mActors.push_back(Actor::New());
            +      mActors.push_back(Actor::New());
            +   }
            +
            +   ~HandleTest() {} // Actors are destroyed automatically
            +
            +   std::vector<Actor> mActors;
            +};
            +
            +
          • + +
          • Passing by value is encouraged: +
            +void 
            +SomeFunction(Actor actor)
            +{
            +   if (actor)
            +   {
            +      actor.SomeMethod();
            +   }
            +}
            +
            +
          • + +
          • Validity check: +
            +{
            +   Actor actor;  // Create a NULL object
            +
            +   // At this stage, you cannot call any of the Actor functions
            +   if (!actor)  // This test passes, since the actor is NULL
            +   {
            +      actor = Actor::New();
            +   }
            +}
            +
            +
          • + +
          • Equality operators: +
            +{
            +   Actor handle1;
            +   Actor handle2;
            +   cout << handle1 == handle2 << endl; // "true", both handles are empty
            +
            +   handle2 = Actor::New();
            +   cout << handle1 == handle2 << endl; // "false", one handle is empty
            +
            +   handle1 = Actor::New();
            +   cout << handle1 == handle2 << endl; // "false", handles to different objects
            +
            +   handle1 = handle2;
            +   cout << handle1 == handle2 << endl; // "true", handles to same object
            +}
            +
            +
          • + +
          • Reference counting examples: +
            +class 
            +AnimationTest
            +{
            +   private:
            +      Animation mAnimation; // Animation handle
            +};
            +
            +void 
            +AnimationTest::Initialize ()
            +{
            +   mAnimation = Animation::New(10.0f); // Reference count is 1, the animation object stays alive when the function returns
            +}
            +
            +void 
            +AnimationTest::SetAnimation(Animation anim)
            +{
            +   mAnimation = anim; // Reference count of the original animation decreased, 'anim' is referenced instead
            +                     // If nobody else had a reference on the initial animation, the object is destroyed
            +}
            +
            + +
            +// At this point, you own a Dali::Actor named "container"
            +// Enter a code block
            +{
            +   // Create an text label
            +   TextLabel actor = TextLabel::New("test");
            +   // Add the text label to a container
            +   container.Add(actor);
            +}
            +// Exit the code block
            +// At this stage, the text label is still alive
            +// You do not keep the handle to the text label, but it can be retrieved from the container
            +
            +
          • +
          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/imageview_n.htm b/org.tizen.ui.practices/html/native/dali/imageview_n.htm new file mode 100644 index 0000000..371f4ca --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/imageview_n.htm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + ImageView: Displaying Images + + + + + + +
          +

          ImageView: Displaying Images

          + +

          The ImageView component displays an image.

          + + +

          The image view is constructed by passing a Dali::Image object. The Dali::Image is an abstract base class with multiple derived classes, and the Dali::ResourceImage class is used for loading an image from a file or URL. The following example shows how to create an ImageView object:

          + +
          +Image image = ResourceImage::New(myImageFilename);
          +ImageView imageView = ImageView::New(image);
          +
          + + +

          The image view needs a reference to a Dali::Image object on creation. However, the image object can be later changed by calling the ImageView::SetImage() function:

          + +
          +imageView.SetImage(newImage);
          +
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/itemview_n.htm b/org.tizen.ui.practices/html/native/dali/itemview_n.htm new file mode 100644 index 0000000..0173731 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/itemview_n.htm @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + ItemView: Item Container with Layouts + + + + + + +
          +

          ItemView: Item Container with Layouts

          + +

          The ItemView class is a scrollable container that can contain many items. It provides several scrollable layouts, as illustrated in the following figure.

          + + +

          Figure: ItemView layouts

          + + + + + + + + + + + + + + +
          GridSpiralDepth
          captured screen2captured screen2captured screen2
          +

          You can also create your own custom layout by inheriting from the Dali::Toolkit::ItemLayout class.

          + +

          Implementing ItemFactory

          + +

          To create an ItemView instance, you must create your own ItemFactory class by deriving from the Dali::Toolkit::ItemFactory class and providing its instance to the ItemView::New() function. ItemFactory is an abstract class having 2 pure virtual member functions to create items and get the number of created items. The following basic example shows how to implement an ItemFactory class:

          + +
          +class MyFactory : public Dali::Toolkit::ItemFactory
          +{
          +public:  
          +   virtual unsigned int GetNumberOfItems()
          +   {
          +      // Return the number of items
          +
          +      return MY_ITEM_COUNT;
          +   } 
          + 
          +   virtual Actor NewItem(unsigned int itemId) 
          +   { 
          +      // Create the actor representing the item based on the itemId
          +      std::ostringstream imageName; 
          +      imageName << "my-image-folder/" << itemId << ".png";
          +
          +      // If item is 10, this results in my-image-folder/10.png
          +      Dali::ResourceImage image = Dali::ResourceImage::New(imageName.str());
          +
          +      // Create an ImageActor from the image
          +      return Dali::ImageActor::New(image);
          +   }
          +};
          + +

          The overridden functions in the derived class are called by the ItemView object.

          + +

          Creating an ItemView

          + +

          The following basic example shows how to create an ItemView:

          + +
          // Store this as a member variable
          +MyFactory factory; 
          +
          +// Pass in the factory
          +Dali::Toolkit::ItemView itemView = Dali::Toolkit::ItemView::New(factory); 
          +
          +itemView.SetParentOrigin(ParentOrigin::CENTER);
          +itemView.SetAnchorPoint(AnchorPoint::CENTER);
          +
          +// Create a layout
          +Dali::Toolkit::ItemLayoutPtr spiralLayout = Dali::Toolkit::DefaultItemLayout::New(Dali::Toolkit::DefaultItemLayout::SPIRAL);
          +
          +// Add the layout to the ItemView
          +itemView.AddLayout(spiralLayout);
          +
          +// More layouts can be created and added to the ItemView
          +// Activate the layout
          +itemView.ActivateLayout(0, Dali::Stage::GetCurrent().GetSize(), 0);
          +
          +Dali::Stage::GetCurrent().Add(itemView);
          + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/layout_n.htm b/org.tizen.ui.practices/html/native/dali/layout_n.htm new file mode 100644 index 0000000..b2ee1d6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/layout_n.htm @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + Layout Management + + + + + + +
          +

          Layout Management

          + +

          DALi provides rule-based layout management (size negotiation), which is used to allocate the actor sizes on the stage based on the dependency rules between the actors.

          + +

          Dimensions

          +

          The notion of width and height is generalized into a concept of a dimension. Several functions take the Dimension parameter. The Dali::Dimension::Type enum (in mobile and wearable applications) specifies the available dimensions as bit fields:

          +
            +
          • Dimension::WIDTH
          • +
          • Dimension::HEIGHT
          • +
          +

          If a function can process width and height at the same time, the Dimension::ALL_DIMENSIONS mask can be specified.

          + +

          Resize Policies

          + +

          The Dali::ResizePolicy::Type enum (in mobile and wearable applications) specifies a range of options for controlling the way actors resize. These rules enable automatic resizing.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Resizing rules +
          Resize policyDescriptionIllustration
          ResizePolicy::FIXEDUse this option to maintain a specific size as set by the SetSize() function. This is the default for all actors.captured screen2
          ResizePolicy::USE_NATURAL_SIZEUse this option for objects, such as images or text, to get their natural size. This can mean the dimensions of an image or the size of text with no wrapping. You can also use this option with table views when the size of the table depends on its children.captured screen2
          ResizePolicy::FILL_TO_PARENTThe size of the actor is similar to its parent's size with proportionate filling considered.captured screen2
          ResizePolicy::SIZE_RELATIVE_TO_PARENTThe size of the actor is similar to its parent's size with a relative scale. Use the SetSizeModeFactor() function to specify the ratio.
          ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENTThe size of the actor is similar to its parent's size with a fixed offset using the SetSizeModeFactor() function.
          ResizePolicy::FIT_TO_CHILDRENThe size of the actor is scaled around the size of its children. For example, the height of a pop-up can be resized according to its content.captured screen2
          ResizePolicy::DIMENSION_DEPENDENCYThis option covers rules, such as width-for-height and height-for-width. You can specify that one dimension depends on another.captured screen2
          + + +

          Actor Layout Examples

          + +

          This section describes layout examples with a actor.

          + +

          Enabling Size Negotiation

          + +

          Text and image actors have relayout enabled by default, while plain actors are disabled unless the SetResizePolicy() function is called.

          + +

          Specifying Size Policies

          + +

          Actors have different size policies by default. For example, the image actor is set to USE_NATURAL_SIZE. This ensures that an image actor uses its natural size by default when it is placed on the stage. However, if the SetSize() function is used with sizes other than 0 on the image actor, the current resize policy is overridden by the FIXED policy and the actor takes the specified size.

          + +

          You can specify how an actor is size-negotiated using the SetResizePolicy() function. You can specify different policies for the different dimensions of width and height to archive different layouts.

          + +

          The following example shows the rootActor with its width set to ResizePolicy::FILL_TO_PARENT and its height set to ResizePolicy::FIT_TO_CHILDREN. It has an image actor added to it with an explicit call to USE_NATURAL_SIZE in both dimensions. This creates an actor that fills the space of its parent in the width dimension and fits its child in the height dimension. As the image actor child is using its natural size, the height of the root actor fits the height of the child image.

          + +
          Actor rootActor = Actor::New();
          +rootActor.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +rootActor.SetResizePolicy(ResizePolicy::FIT_TO_CHILDREN, Dimension::HEIGHT);
          +ImageActor image = ImageActor::New(Image::New(MY_IMAGE_PATH));
          +image.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS);
          +rootActor.Add(image);
          + +

          The following figure shows the before and after layouts for this code example.

          + +

          Figure: Before and after setting the resize policy

          +

          Before and after setting the resize policy Before and after setting the resize policy

          + +

          To specify that a dimension has a dependency on another dimension, use the ResizePolicy::DIMENSION_DEPENDENCY policy. For example, if the dimension is Dimension::HEIGHT and the dependency is Dimension::WIDTH, there is a height-for-width dependency in effect. You can use the policy in a text view that wraps its text. The following example shows a text view that expands its width according to the size of its parent, wraps its contents and then determines its height based on the width:

          + +
          TextLabel text = TextLabel::New("Example");
          +text.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +text.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          + +

          Specifying Sizes and Size Limits

          + +

          To specify a fixed size for an actor, use the FIXED resize policy and set the desired size using the SetSize() function. If only 1 dimension is FIXED, the other value in the size parameter is ignored, so it is safe to set it to 0.

          +

          To constrain the final negotiated size of an actor, set the minimum and maximum sizes:

          + +
          void SetMinimumSize(const Vector2& size)
          +void SetMaximumSize(const Vector2& size)
          + +

          Adjusting the Negotiated Size

          + +

          When an actor must maintain the aspect ratio of its natural size, use the SetSizeScalePolicy() function with the Dali::SizeScalePolicy::Type enum (in mobile and wearable applications). This is useful to ensure that images maintain their aspect ratio while still fitting the bounds they have been allocated.

          +

          You can use the following resize policies:

          +
            +
          • SizeScalePolicy::USE_SIZE_SET +

            This is the default policy.

          • +
          • SizeScalePolicy::FIT_WITH_ASPECT_RATIO +

            Fits the actor within the bounds it has been allocated while maintaining the aspect ratio.

          • +
          • SizeScalePolicy::FILL_WITH_ASPECT_RATIO +

            Fills all available space, potentially overflowing its bounds, while maintaining aspect ratio.

          • +
          + +

          Using Actors in Containers

          + +

          When using actors in containers, such as a table view, you can specify the padding surrounding the actor with the SetPadding() function. The padding specifies the left, right, bottom, and top padding value.

          + + + + + + + + + + +
          Note
          Beware of infinite dependency loops! +

          For example, when the resize policy of a parent actor is set to ResizePolicy::FIT_TO_CHILDREN with a child that has a resize policy of ResizePolicy::FILL_TO_PARENT, an infinite loop occurs.

          +

          Similarly, consider a situation where a parent actor has a width policy of ResizePolicy::DIMENSION_DEPENDENCY with a height policy of ResizePolicy::FIT_TO_CHILDREN. If the parent has a single child with a height policy ResizePolicy::DIMENSION_DEPENDENCY with width, and the child's width policy is ResizePolicy::FILL_TO_PARENT, a loop occurs.

          +

          Loops can occur over larger spreads of parent-child relationships. These loops are detected by the relayout algorithm, which allocates the actors 0 sizes.

          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/multi_threaded_n.htm b/org.tizen.ui.practices/html/native/dali/multi_threaded_n.htm new file mode 100644 index 0000000..fcbdd7f --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/multi_threaded_n.htm @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + Multi-threaded Architecture: Secret of DALi High-performance + + + + + + +
          +

          Multi-threaded Architecture: Secret of DALi High-performance

          + +

          DALi uses a multi-threaded architecture to provide the best performance and scalability:

          +
            +
          • Event thread: Main thread in which the application code and event handling run.
          • +
          • Update thread: Updates the nodes on the scene as well as the running animations and constraints.
          • +
          • Render thread: OpenGL drawing, texture, and geometry uploading.
          • +
          • Resource thread: Loads images and decodes them into bitmaps.
          • +
          + +

          Figure: DALi thread architecture

          +

          DALi thread architecture

          + + +

          Animations with Multi-threading

          + +

          DALi animations and rendering occur in a dedicated rendering thread. This allows animations to run smoothly, regardless of the time taken to process input events in the application code.

          + +

          Internally, DALi contains the scene graph that mirrors the actor hierarchy. The scene graph objects perform the actual animation and rendering, while the actors provide thread-safe access. Actors and scene graph objects communicate through messaging.

          + +

          The following figure shows an actor hierarchy, in which one of the actors is being animated. The green objects in are created by the application code, while the blue private objects are used in the dedicated rendering thread.

          + +

          Figure: Actor hierarchy with an animation

          +

          Actor hierarchy with an animation

          + +

          Reading an Animated Value

          + +

          When a property is animatable, it can only be modified in the rendering thread. The value returned from a getter function is the value used when the previous frame was rendered.

          + +

          For example, the GetCurrentPosition() function returns the position in which the actor was last rendered. Since the SetPosition() function is asynchronous, a call to GetCurrentPosition() function does not immediately return the same value.

          + +
          +Actor actor = Actor::New();
          +Stage::GetCurrent().Add(actor); // Initial position is 0, 0, 0
          +
          +actor.SetPosition(Vector3(10, 10, 10));
          +
          +Vector3 current;
          +current = actor.GetCurrentPosition();
          +std::cout << "Current position: " << current.x << ", " << current.y << ", " << current.z << std::endl;
          +
          +std::cout << "..." << std::endl;
          +
          +// Handling another event
          +
          +current = actor.GetCurrentPosition();
          +std::cout << "Current position: " << current.x << ", " << current.y << ", " << current.z << std::endl;
          +
          + +

          The above code is likely to output:

          +
          +Actor actor = Actor::New();
          +"Current position: 0,0,0"
          +// Other positions
          +"Current position: 10,10,10"
          +
          + +

          Setting a Property during an Animation

          + +

          When a property is being animated, the animation overrides all values set with other functions, such as the SetPosition() function.

          + +

          Figure: Actor hierarchy with an animated property

          +

          Actor hierarchy with an animated property

          + +

          The order of execution in the rendering thread is:

          +
            +
          1. Process the message and call the SetPosition() function.
          2. +
          3. Apply the animation and call the SetPosition() function.
          4. +
          5. Render the frame.
          6. +
          + +

          Resource Loading with Multi-threading

          + +

          DALi loads resources in separate threads. If these resource threads are not used, a large image file causes a block in the main thread, which cannot process the next operation while reading data from a file system or downloading from the network.

          + +

          Currently, DALi creates one thread for loading local resources and another for loading remote resources, as required.

          + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/properties_n.htm b/org.tizen.ui.practices/html/native/dali/properties_n.htm new file mode 100644 index 0000000..d380684 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/properties_n.htm @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + Properties: Accessing Properties of DALi Objects + + + + + + +
          +

          Properties: Accessing Properties of DALi Objects

          + +

          A property is a value used by an object. It can be modified or read using the Dali::Handle::GetProperty() or Dali::Handle::SetProperty() functions.

          + +

          The difference between properties and ordinary C++ member variables is that a property can be dynamically added to or removed from an existing object at runtime, enabling more flexible, script-like programming with DALi.

          + +

          The Dali::Handle class (in mobile and wearable applications) provides functions to manage properties. Because of this, the DALi classes that inherit from the Dali::Handle class (most of classes that you use) have a number of predefined properties and can have any number of user-defined custom properties. +

          + +

          Accessing Property Values

          + +

          Property values of an object can usually be accessed in 2 ways: by its class member functions or by property getters and setters (GetProperty() and SetProperty() function of the Dali::Handle class in mobile and wearable applications).

          +

          For example, the following table lists the predefined properties of the Dali::Actor class.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Dali::Actor properties +
          Property index (enumeration)Member functions
          Dali::Actor::POSITIONDali::Actor::GetCurrentPosition() / SetPosition()
          Dali::Actor::ORIENTATIONDali::Actor::GetCurrentOrientation() / SetOrientation()
          Dali::Actor::SIZEDali::Actor::GetCurrentSize() / SetSize()
          Dali::Actor::COLORDali::Actor::GetCurrentColor() / SetColor()
          Dali::Actor::NAMEDali::Actor::GetName() / SetName()
          + +

          You can access the properties in both ways:

          + +
          +Actor actor = Actor::New();
          +actor.SetName("test actor");
          +std::cout << actor.GetName() << std::endl;  // "test actor"
          +
          + +
          +Actor actor = Actor::New();
          +actor.SetProperty(Actor::Property::NAME, "test actor");
          +std::cout << actor.GetProperty(Actor::Property::NAME) << std::endl;  // "test actor"
          +std::cout << actor.GetProperty<std::string>(Actor::Property::NAME) << std::endl;  // "test actor"
          +std::cout << actor.GetProperty(Actor::Property::NAME).Get<std::string>() << std::endl;  // "test actor"
          +
          + + +

          Using Properties

          + +

          Registering User-defined Custom Properties to Objects

          + +

          Properties can be registered and unregistered at runtime using the functions of the Dali::Handle class (in mobile and wearable applications). This enables script-like programming in the DALi application, such as adding custom member data to an instance of a DALi class without subclassing the class or maintaining another pool of custom data.

          +

          For example, you can set your own custom data to PushButton objects and use them later when the buttons are clicked:

          +
          +void 
          +Create(Application& application)
          +{
          +   for (int i = 0; i < 5; ++i)
          +   {
          +      Toolkit::PushButton button = Toolkit::PushButton::New();
          +      button.SetSize(100, 100);
          +      button.SetPosition(100*i+50, 50);
          +      button.ClickedSignal().Connect(this, OnButtonClicked);
          +
          +      // Register a custom property having button index
          +      // Store the property index so you can look it up later
          +      // Note: This is much faster than looking the property up by property name and must be used if possible
          +      // As all control types are the same (PushButtons), the indices to the unique custom property are all same
          +      Property::Value data(i);
          +      mCustomDataIndex = button.RegisterProperty("custom-data", data);
          +
          +      Stage::GetCurrent().Add(button);
          +   }
          +}
          +
          +bool 
          +OnButtonClicked(Toolkit::Button button)
          +{
          +   // Look up the custom property by the stored property index
          +   // Note: If the property belongs to a control in another library, 
          +   // or you do not know the index, you can look the index up first with:
          +   // Property::Index index = button.GetPropertyIndex("custom-data");
          +   cout << button.GetProperty(mCustomDataIndex) << endl;
          +
          +   return true;
          +}
          +
          + + +

          Animating Objects

          + +

          The Dali::Animation class (in mobile and wearable applications) is used to animate the properties of any number of objects.

          + +

          For example, the following code animates the value of the POSITION property of a radio button to (100.0, 200.0, 0.0) for 2 seconds:

          + +
          +RadioButton actor = RadioButton::New();
          +Stage::GetCurrent().Add(actor);
          +Animation animation = Animation::New(2.0f); // Duration 2 seconds
          +animation.AnimateTo(Property(actor, Actor::Property::POSITION), Vector3(100.0f, 200.0f, 0.0f));
          +animation.Play();
          +
          + +

          Imposing Constraints on Objects

          + +

          The Dali::Constraint class (in mobile and wearable applications) is used to modify the property of an object based on other properties of other objects.

          + +

          For example, the following code makes the SIZE property value of an actor the same as the SIZE property value of its parent actor:

          + +
          +Constraint constraint = Constraint::New<Vector3>(actor, Actor::Property::SIZE, EqualToConstraint());
          +constraint.AddSource(ParentSource(Actor::Property::SIZE));
          +constraint.Apply();
          +
          + + +

          Managing Property Attributes

          + +

          A property has the following attributes:

          + +
            +
          • Index: Enumeration number indicating the property. The property index is usually used to access properties.
          • + +
          • Type: Type of the property. Retrieved with the Dali::Handle::GetPropertyType() function.
          • + +
          • Name: Name of the property. Retrieved with the Dali::Handle::GetPropertyName() function.
          • + +
          • Writable: If true, the property value can be written. Retrieved with the Dali::Handle::IsPropertyWritable() function.
          • + +
          • Animatable: If true, the property can be animated using the Dali::Animation class. Retrieved with the Dali::Handle::IsPropertyAnimatable() function.
          • + +
          • Constraint-Input: If true, the property can be used as constraint input. Retrieved with the Dali::Handle::IsPropertyAConstraintInput() function.
          • +
          + +

          The following table lists the type and name attributes of the Dali::Actor properties.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Dali::Actor property attributes +
          Property index (enumeration)Property typeProperty name
          Dali::Actor::POSITIONVector3"position"
          Dali::Actor::ORIENTATIONQuaternion"orientation"
          Dali::Actor::SIZEVector3"size"
          Dali::Actor::COLORVector4"color"
          Dali::Actor::NAMEstd::string"name"
          + +

          For more information about properties, see the API reference of each class. For example, for the Dali::Actor class, see the Dali::Actor::Property struct (in mobile and wearable applications). For information on the supported property types, see Dali::Property::Type (in mobile and wearable applications) and Dali::PropertyTypes (in mobile and wearable applications).

          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/rendering_effects_n.htm b/org.tizen.ui.practices/html/native/dali/rendering_effects_n.htm new file mode 100644 index 0000000..a669699 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/rendering_effects_n.htm @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Rendering and Effects: Managing Viewing Modes and Shader Effects + + + + + + +
          +

          Rendering and Effects: Managing Viewing Modes and Shader Effects

          + +

          DALi provides stereoscopic viewing modes. It also provides a way to use user-defined custom shader effects.

          + +

          Viewing Modes

          + +

          DALi supports the following viewing modes:

          +
            +
          • MONO
          • +
          • STEREO_HORIZONTAL
          • +
          • STEREO_VERTICAL
          • +
          + +

          MONO is the default viewing mode. When using the MONO mode, only 1 image per scene is produced in every update. In this setup, DALi creates a default render task, which renders everything added to the stage root layer, and 1 default camera for that render task.

          + +

          The STEREO_HORIZONTAL and STEREO_VERTICAL modes allow the application to produce stereo images. Stereoscopy is a technique for creating or enhancing the illusion of depth in an image. Stereo rendering technique produces 2 images of the scene with an slight offset between them, which is presented to the left and the right eye independently. In this setup, DALi creates 2 additional render tasks, 1 for the right eye and 1 for the left, each with its own camera. Those cameras are parented to the default camera. The method to generate the projection transformation for each camera is known as "parallel axis asymmetric frustum perspective projection" and is illustrated in the following figure.

          + +

          Figure: Stereoscopic projection

          +

          Stereoscopic projection

          + +

          The separation between the 2 cameras is configurable but, typically, it ranges between 50 and 70 millimeters. Too large a separation can be hard to resolve and is known as hyperstereo. The convergence plane for both frustums is the 2D plane, so the projection of anything lying in the 2D plane is coincident for both left and right eye, resulting in no parallax. Objects that lie in front of the projection plane appear to be in front of the screen and objects behind the projection plane appear to be "into" the screen. Objects behind the projection plane (positive parallax) are easier to look at without straining the eyes.

          + +

          To view stereoscopic images correctly, each image must be presented to each eye independently. There are devices on the market for this, such as a head-mounted display, which is a display device worn in the head that has 2 small displays, one for each eye. A cheaper alternative to this often expensive device is the Google cardboard viewer.

          + +

          Figure: Google cardboard viewer

          +

          Google cardboard viewer

          + +

          With the Google cardboard viewer or a similar device, you can transform your phone into a basic virtual reality headset.

          + +

          Stereoscopic Rendering in DALi

          + +

          The STEREO_HORIZONTAL mode presents the left image on the top half of the screen and the right image on the bottom half. It is intended to be used in landscape orientation, so the images are rotated 90 degrees counter-clockwise. The STEREO_VERTICAL mode, on the other hand, renders the left image on the left half of the screen and the right image on the right half.

          + +

          To define the viewing mode to be used, use the SetViewMode() function of the Application class, passing the mode as a parameter. You can query the view mode being used by calling the GetViewMode() function. To define the separation between the left and right cameras, use the SetStereoBase() function, passing the distance in millimeters as a parameter. This distance can be queried using the GetStereoBase() function. You can also set the viewing mode and offset at initialization time using 2 command line arguments for this purpose: -view-mode (or -v) and 0 for MONO, 1 for STEREO_HORIZONTAL, 2 for STEREO_VERTICAL, and -stereo-base (or -s) and the separation in millimeters.

          + +

          Restrictions

          + +

          There are certain restrictions when writing stereoscopic applications using DALi:

          + +
            +
          • When a stereo mode is selected, the default render task source actor is set to an uninitialized actor so it does not render anything. Changing the default render task source actor later on produces undesired results, as the user does not want to see anything rendered by the default camera when stereo mode is on.
          • +
          • Stereo cameras are parented to the default camera, so if the application needs to change the camera position or orientation, it must change the default camera transformation. The handle to the default camera can be obtained from the default render task as follows: + +
            Dali::RenderTask defaultRenderTask = Dali::Stage::GetCurrent().GetRenderTaskList().GetTask(0); Dali::CameraActor defaultCamera = defaultRenderTask.GetCameraActor();
            +
          • +
          • Stereo render tasks render everything added to the stage's root layer. If the application must render an object hierarchy to an off-screen buffer, it must set the exclusive flag on that render task so that the stereo tasks do not render that particular subtree. To set the exclusive flag in a render task, use the SetExclusive() function defined in the render task.
          • +
          + + + + + + + + + + +
          Note
          DALi stereoscopic viewing mode is still under development, and may not be mature enough for commercialized applications at the moment. For example, distortion correction is not supported yet. Tizen continues to improve the stereoscopic mode to give you a chance to provide more exciting and immersive user experience to your customers. +
          + +

          Shader Effects

          +

          The shader effects allow the developer to apply visual deformations on the actors. They can affect the geometry, the colors and textures of the actor.

          +
            +
          • Each actor has its own default shaders.
          • +
          • Those default shaders can be overridden by modified shader effects.
          • +
          • In an application, each actor might possess its own shader effect.
          • +
          • In an application, multiple actors might apply the same effect.
          • +
          + +

          Custom Shader Effects

          +

          The ShaderEffect enables you to create custom shader effects by specifying the vertex and pixel shaders. For a custom shader, you can provide the vertex and fragment shader code as strings. These shader snippets get concatenated with the default attributes and uniforms.

          + +

          Create a custom shader effect:

          + +
          +std::string myVertexShader; // This variable would contain the code for a vertex shader
          +Dali::ShaderEffect myEffect = Dali::ShaderEffect::New(myVertexShader, "" // Use the default pixel shader
          +);
          + +

          Set the value of a uniform:

          + +
          // If the uniform was declared like this in the shader: uniform float myUniform;
          +myEffect.SetUniform("myUniform", 0.5f);
          + +

          You can apply the custom shader effect to an actor like any other shader:

          + +
          actor.SetShaderEffect(myEffect);
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/resources_n.htm b/org.tizen.ui.practices/html/native/dali/resources_n.htm new file mode 100644 index 0000000..7256670 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/resources_n.htm @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + Resources: Handling Images + + + + + + +
          +

          Resources: Handling Images

          + + +

          DALi provides several ways to handle resource images.

          + +

          Loading Image Files

          + +

          You can load an image file with the ResourceImage class by specifying its location:

          + +
          +Dali::ResourceImage image = Dali::ResourceImage::New("/my-path/my-image.png");
          +
          + +

          The loaded image can be displayed using the ImageView component:

          + +
          +ImageView imageView = ImageView::New(image);
          +Stage::GetCurrent().Add(imageView);
          +
          + + +

          Supported Resource Types

          + +

          The resource location can be a file path or a URL.

          + +

          The currently supported image types are:

          +
            +
          • png
          • +
          • jpeg
          • +
          • gif
          • +
          • bmp
          • +
          • wbmp
          • +
          • ico
          • +
          • ktx
          • +
          + +

          The currently supported URL schemes are:

          +
            +
          • http
          • +
          • https
          • +
          + +

          Asynchronous Loading

          + +

          Resources are loaded in separate threads, which means that when you call the ResourceImage::New() function, it returns immediately.

          + +

          The application can connect to the Dali::ResourceImage::LoadingFinishedSignal() signal to get notified when the image has loaded:

          + +
          +class ResourceImageController : public ConnectionTracker
          +{
          +   public:
          +      ResourceImageController(Application& application) : mApplication(application)
          +      {
          +         mApplication.InitSignal().Connect(this, &ResourceImageController::Create);
          +      }
          +
          +      void Create(Application& application)
          +      {
          +         ResourceImage image = ResourceImage::New("https://www.tizen.org/sites/default/files/admins/tizen-branding-lockup-on-light.png");
          +         image.LoadingFinishedSignal().Connect(this, &ResourceImageController::OnLoadFinished);
          +
          +         ImageView imageView = ImageView::New(image);
          +         imageView.SetSize(400, 200);
          +         imageView.SetParentOrigin(ParentOrigin::CENTER);
          +         Stage::GetCurrent().Add(imageView);
          +      }
          +
          +      void OnLoadFinished(ResourceImage image)
          +      {
          +         LoadingState state = image.GetLoadingState();
          +         if (state == ResourceLoadingSucceeded)
          +            cout << "Loading " << image.GetUrl() << " is succeeded" << endl;
          +         else if (state == ResourceLoadingFailed)
          +         cout << "Loading " << image.GetUrl() << " is failed" << endl;
          +      }
          +};
          +
          + +

          For more information about the resource threads, see Resource Loading with Multi-threading.

          + + +

          Load and Release Policies

          + + +

          By default, resource images start loading immediately and the data is released only when the ResourceImage handle is destroyed. To optimize its memory footprint, the application can ask resources to be loaded only when actually required and their data to be released automatically when they are no longer being used by actors:

          + +
          Dali::ResourceImage image = Dali::ResourceImage::New("/my-path/my-image.png", 
          +                                                     Dali::ResourceImage::ON_DEMAND, 
          +                                                     Dali::Image::UNUSED);
          + +

          If the Dali::Image::UNUSED property is used, the resource data is reloaded automatically when the image is used again.

          + +

          Load Time Resizing

          + +

          An application loading images from an external source often wants to display those images at a lower resolution than their native ones. To support this, DALi can resize an image at load time so that its in-memory copy uses less space and its visual quality benefits from being prefiltered. The Dali::FittingMode namespace (in mobile and wearable applications) provides 4 algorithms, which can be used to fit an image to a desired rectangle, a desired width, or a desired height.

          + +

          The following code snippet is an example of rescaling:

          + +
          +Dali::Image image = Dali::ResourceImage::New(filename, ImageDimensions(240, 240), FittingMode::SCALE_TO_FILL);
          +
          + +

          This example sets the size and fitting mode appropriately for a large thumbnail during the Dali::ResourceImage object construction. In general, to enable scaling on load, pass a non-zero width or height and one of the 4 fitting modes to the Dali::ResourceImage creator function as shown above.

          + +

          The fitting modes and suggested use cases are as follows:

          + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Fitting mode use cases +
          Fitting modeSuggested use case
          Dali::FittingMode::SHRINK_TO_FITFull-screen image display: limit the loaded image resolution to the device resolution, but show all of the image.
          Dali::FittingMode::SCALE_TO_FILLThumbnail gallery grid: limit the loaded image resolution to the screen tile, filling the whole tile but losing a few pixels to match the tile shape.
          Dali::FittingMode::FIT_WIDTHImage columns: limit the loaded image resolution to the column width.
          Dali::FittingMode::FIT_HEIGHTImage rows: limit the loaded image resolution to the row height.
          + + +

          Image Size

          + +

          If the application requires the image dimensions immediately, they can be retrieved synchronously:

          + +
          Dali::ImageDimensions dimensions = Dali::ResourceImage::GetImageSize("/my-path/my-image.png");
          + +

          This is a disk-read operation, which can be slow and block the event thread. This operation is currently not supported for remote resources, such as HTTP or HTTPS URLs.

          + + +

          Using Nine-Patch Images

          + + +

          DALi supports nine-patch images, which can be stretched while maintaining their corners.

          + +

          Nine-Patch Image Format

          + +

          A nine-patch image has 9 sections. In the following figure (on the right), the sections 2, 4, 5, 6, 8 are stretched and the sections 1, 3, 7, 9 keep their size unchanged when the size of the image is changed:

          + +

          Figure: A nine-patch image explained

          +

          A nine-patch image A nine-patch image

          + +

          The black lines top and left side of the image determine the stretchable region.

          + +

          This format is compatible with the one used in Android. Therefore, you can easily make nine-patch images using existing tools, such as Simple Nine-patch Generator.

          + + + +

          Nine-Patch Image Loading

          + +

          A nine-patch image can be loaded by the ResourceImage class just like other images. If an image file has a .9.png or .9.jpg extension and proper nine-patch image contents as mentioned earlier, the image loaded by the ResourceImage class is rendered in the nine-patch way with the ImageView class.

          + +

          The following is an example of using a *.9.png image:

          + +
          +ResourceImage image = ResourceImage::New("nine_patch_dali.9.png");
          +ImageActor imageView = ImageActor::New(image);
          +imageView.SetSize(200, 200);
          +
          + +

          The following figure shows the result:

          +

          Figure: 200 x 200 image

          +

          200 x 200 image

          + + +

          Using a Buffer Image

          + +

          A DALi::BufferImage class (in mobile and wearable applications) represents an image resource in the form of pixel buffer data. The application can write to this buffer as required and the image is updated on the screen:

          + +
          // Create a 200 by 200 pixel buffer with a color-depth of 32-bits (with alpha)
          +Dali::BufferImage image = Dali::BufferImage::New(200, 200);
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/scrollview_n.htm b/org.tizen.ui.practices/html/native/dali/scrollview_n.htm new file mode 100644 index 0000000..df39006 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/scrollview_n.htm @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + ScrollView: Scrollable Container for Items + + + + + + +
          +

          ScrollView: Scrollable Container for Items

          + +

          The ScrollView class provides a scrollable view, which contains actors and can be scrolled automatically or manually by panning.

          + + +

          The following figure shows example layouts using the ScrollView.

          + +

          Figure: ScrollView

          +

          ScrollView

          + + +

          A scroll view emits a SnapStartedSignal() signal when the ScrollView has started to snap or flick. The signal informs the target of the scroll position, scale, and rotation.

          + +

          Creating a ScrollView

          + +

          The following example shows how to create a ScrollView:

          + +
          Dali::Toolkit::ScrollView scrollView;
          +
          +// Create a ScrollView instance
          +myScrollView = ScrollView::New();
          +
          +// Add it to the stage
          +Stage::GetCurrent().Add(scrollView);
          +
          +// Set the size of stage; it covers the entire stage 
          +Stage stage = Dali::Stage::GetCurrent();
          +Size size = stage.GetSize();
          +scrollView.SetSize(size);
          +
          +// Add actors to the ScrollView 
          +Image image = Image::New(DALI_IMAGE_DIR "button-background.png");
          +ImageActor imageActor = ImageActor::New(image);
          +scrollView.Add(imageActor);
          +// The ScrollView contents are now draggable
          +
          +// To enforce horizontal-only scrolling, the Y axis ruler can be disabled 
          +RulerPtr rulerY = new DefaultRuler();
          +rulerY->Disable();
          +scrollView.SetRulerY(rulerY);
          +
          +// To enable snapping, a FixedRuler can be applied to the X axis, with snap points spaced to the width of the stage. 
          +Size size = stage.GetSize();
          +RulerPtr rulerX = new FixedRuler(size.width);
          +scrollView.SetRulerX(rulerX);
          +
          +// A domain can be applied to rulers to prevent scrolling beyond this boundary
          +// In this case, to 4 times the width of the stage, allowing for 4 pages to be scrolled
          +Size size = stage.GetSize();
          +RulerPtr rulerX = new FixedRuler(size.width);
          +rulerX->SetDomain(RulerDomain(0.0f, size.width*4.0f));
          +scrollView.SetRulerX(rulerX);
          + +

          Using Ruler, RulerDomain, and Wrap

          + +

          The Ruler abstract class defines the scroll axes. The RulerDomain class specifies the minimum and maximum values of a ruler. The ScrollView class provides a wrap mode for ScrollView contents. When enabled, the ScrollView contents are wrapped over the x/y domain. The ScrollView behavior depends on a combination of the Ruler, RulerDomain, and Wrap modes. The following table shows ScrollView behavior according to the combination.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Scrollview behavior in the Ruler, RulerDomain, and Wrap mode
          RulerDomainWrapBehavior
          DisabledDisabledWrapNo movement in axis
          DisabledEnabledNo wrapNo movement in axis
          DisabledEnabledWrapNo movement in axis
          EnabledDisabledNo wrapFree movement in axis
          EnabledDisabledWrapFree movement in axis, wrapped according to domain minimum and maximum
          EnabledEnabledNo wrapMovement limited to domain minimum and maximum
          EnabledEnabledWrapMovement limited to domain minimum and maximum
          + + + + + + + + + + +
          Note
          Actors within a ScrollView are controlled by constraints. If you apply constraints to these actors externally, undefined behavior can occur. Since applying additional constraints can conflict with the ScrollView constraints, place the actors within container actors. The container actors are affected by the constraints.
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/tableview_n.htm b/org.tizen.ui.practices/html/native/dali/tableview_n.htm new file mode 100644 index 0000000..2897aa0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/tableview_n.htm @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + TableView: Container with Grid-like Layout + + + + + + +
          +

          TableView: Container with Grid-like Layout

          + +

          The TableView class is a layout container for aligning child actors in a grid like layout. TableView constraints the x and y position and width and height of the child actors.

          + +

          Figure: TableView

          +

          TableView

          + +

          Creating a TableView

          + +

          The following example shows how to create a TableView:

          + +
          class ButtonsController: public ConnectionTracker
          +{
          +   ButtonsController(Application& application)
          +      : mApplication(application)
          +   {
          +      mApplication.InitSignal().Connect(this, &ButtonsController::Create);
          +   }
          +
          +   void Create(Application& application)
          +   {
          +      Stage stage = Stage::GetCurrent();
          +
          +      TableView tableView = TableView::New(4,4);
          +      tableView.SetKeyboardFocusable(true);
          +      tableView.SetName("TableView");
          +
          +      for (int row = 0; row < 4; ++row)
          +      {
          +         for (int col = 0; col < 4; ++col)
          +         {
          +            Control control = Control::New();
          +            std::ostringstream str;
          +            str << row << "-" << col;
          +            control.SetName(str.str());
          +            control.SetKeyboardFocusable(true);
          +            tableView.AddChild(control, TableView::CellPosition(row, col));
          +         }
          +      }
          +      stage.Add(tableView);
          +   }
          +
          +   // Signal
          +
          +   Application& mApplication;
          +}
          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/textfield_n.htm b/org.tizen.ui.practices/html/native/dali/textfield_n.htm new file mode 100644 index 0000000..3352540 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/textfield_n.htm @@ -0,0 +1,291 @@ + + + + + + + + + + + + + + TextField: Type Your Text! + + + + + + +
          +

          TextField: Type Your Text!

          + +

          The TextField class is a control providing a single-line editable text field.

          + +

          Figure: TextField

          +

          TextField

          + +

          Creating a TextField

          + +

          Before text has been entered, the TextField can display a placeholder text. An alternative placeholder can be displayed when the TextField has keyboard focus. For example, a TextField used to enter a username can initially show the text Unknown Name, and the text Enter Name. when the cursor is visible.

          + +
          TextField field = TextField::New();
          +field.SetProperty(TextField::Property::PLACEHOLDER_TEXT, "Unnamed Name");
          +field.SetProperty(TextField::Property::PLACEHOLDER_TEXT_FOCUSED, "Enter Name.");
          +Stage::GetCurrent().Add(field);
          +
          + +

          When the TextField is tapped, it automatically gets the keyboard focus. Key events enter the text, and the placeholder text is removed. After text has been entered, it can be retrieved from the TEXT property.

          + +
          Property::Value fieldText = field.GetProperty(TextField::Property::TEXT);
          +std::cout << "Received text: " << fieldText.Get< std::string >() << std::endl;
          + + +

          Aligning Text

          + +

          The TextField displays a single-line of text, which scrolls if there is not enough space for the text displayed. If there is enough space, the text can be aligned horizontally to the beginning, end, or center of the available area:

          + +
          field.SetProperty(TextField::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); // "CENTER" or "END"
          + +

          Using Decorations

          + +

          For text decorations, the following TextLabel class properties are available.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: TextField properties +
          PropertyTypeWritableAnimatable
          RENDERING_BACKENDIntegerYesNo
          TEXTStringYesNo
          PLACEHOLDER_TEXTStringYesNo
          PLACEHOLDER_TEXT_FOCUSEDStringYesNo
          FONT_FAMILYStringYesNo
          FONT_STYLEStringYesNo
          POINT_SIZEFloatYesNo
          MAX_LENGTHIntegerYesNo
          EXCEED_POLICYIntegerYesNo
          HORIZONTAL_ALIGNMENTStringYesNo
          VERTICAL_ALIGNMENTStringYesNo
          COLORVector4YesNo
          SHADOW_OFFSETVector2YesNo
          SHADOW_COLORVector4YesNo
          PRIMARY_CURSOR_COLORVector4YesNo
          SECONDARY_CURSOR_COLORVector4YesNo
          ENABLE_CURSOR_BLINKBooleanYesNo
          CURSOR_BLINK_INTERVALFloatYesNo
          CURSOR_BLINK_DURATIONFloatYesNo
          GRAB_HANDLE_IMAGEStringYesNo
          GRAB_HANDLE_PRESSED_IMAGEStringYesNo
          SCROLL_THRESHOLDFloatYesNo
          SCROLL_SPEEDFloatYesNo
          SELECTION_HANDLE_IMAGE_RIGHTStringYesNo
          SELECTION_HANDLE_PRESSED_IMAGE_LEFTStringYesNo
          SELECTION_HANDLE_PRESSED_IMAGE_RIGHTStringYesNo
          SELECTION_HIGHLIGHT_COLORVector4YesNo
          DECORATION_BOUNDING_BOXRectangleYesNo
          INPUT_METHOD_SETTINGSMapYesNo
          + +

          To change the color of the text, use the TEXT_COLOR property. An alternative color can be used for placeholder text by setting the PLACEHOLDER_TEXT_COLOR property. Unlike the Actor::COLOR property, these properties do not affect child actors added to the TextField.

          + +
          field.SetProperty(TextField::Property::TEXT_COLOR, Color::CYAN);
          +field.SetProperty(TextField::Property::PLACEHOLDER_TEXT_COLOR, Color::BLACK);
          + + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/textlabel_n.htm b/org.tizen.ui.practices/html/native/dali/textlabel_n.htm new file mode 100644 index 0000000..d149f55 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/textlabel_n.htm @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + TextLabel: Displaying Text Labels + + + + + + +
          +

          TextLabel: Displaying Text Labels

          + +

          The TextLabel class provides a control that renders a short text string. The text labels are lightweight, non-editable, and do not respond to user input.

          + +

          Figure: TextLabel

          +

          TextLabel

          + +

          Creating a TextLabel

          + +

          The following example shows how to create a TextLabel instance:

          + +
          TextLabel label = TextLabel::New();
          +label.SetProperty(TextLabel::Property::TEXT, "Hello World");
          +Stage::GetCurrent().Add(label);
          + +

          Selecting Fonts

          + +

          By default, the TextLabel automatically selects a suitable font from the platform. Note that the selected font may not support all characters in your input text. For example, Latin fonts often do not provide Arabic glyphs.

          + +

          Alternatively, you can request a font using the FONT_FAMILY, FONT_STYLE, and POINT_SIZE properties:

          + +
          label.SetProperty(TextLabel::Property::FONT_FAMILY, "HelveticaNue");
          +label.SetProperty(TextLabel::Property::FONT_STYLE,  "Regular");
          +label.SetProperty(TextLabel::Property::POINT_SIZE,  12.0f);
          + +

          The TextLabel falls back to using the default font if the requested font does not support the required scripts.

          + + +

          Aligning Text

          + +

          Wrapping can be enabled using the MULTI_LINE property:

          + +
          label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          + +

          The text can be aligned horizontally to the beginning, end, or center of the available area:

          + +
          label.SetProperty(TextLabel::Property::HORIZONTAL_ALIGNMENT, "BEGIN"); // "CENTER" or "END"
          + +

          Managing the Layout

          + +

          There are several resize policies commonly used with TextLabels. +The following examples show the actual size by setting a colored background, whilst the black area represents the size of the parent control.

          + +

          Natural Size Policy

          + +

          In its natural size, the TextLabel is large enough to display the text without wrapping, and does not have extra space to align the text within. In the following example, the same result is displayed regardless of the alignment or multi-line properties:

          + +
          TextLabel label = TextLabel::New("Hello World");
          +label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          +label.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE,Dimension::ALL_DIMENSIONS);
          +label.SetBackgroundColor(Color::BLUE);Stage::GetCurrent().Add(label);
          + +

          Height-for-width Policy

          + +

          To lay out text labels vertically, a fixed (maximum) width must be provided by the parent control. Each TextLabel reports the desired height for the given width. The following example uses TableView as the parent:

          + +
          TableView parent = TableView::New(3, 1);
          +parent.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +parent.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT);
          +parent.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          +
          +Stage::GetCurrent().Add(parent);
          +
          +TextLabel label = TextLabel::New("Hello World");
          +label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          +label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          +label.SetBackgroundColor(Color::BLUE);
          +
          +parent.AddChild(label, TableView::CellPosition(0, 0));
          +parent.SetFitHeight(0);
          +
          +label = TextLabel::New("A Quick Brown Fox Jumps Over The Lazy Dog");
          +label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          +label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          +label.SetBackgroundColor(Color::GREEN);
          +label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          +
          +parent.AddChild(label, TableView::CellPosition(1, 0));
          +parent.SetFitHeight(1);
          +
          +label = TextLabel::New("لإعادة ترتيب الشاشات، يجب تغيير نوع العرض إلى شبكة قابلة للتخصيص");
          +label.SetAnchorPoint(AnchorPoint::TOP_LEFT);
          +label.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH);
          +label.SetResizePolicy(ResizePolicy::DIMENSION_DEPENDENCY, Dimension::HEIGHT);
          +label.SetBackgroundColor(Color::BLUE);
          +label.SetProperty(TextLabel::Property::MULTI_LINE, true);
          +
          +parent.AddChild(label, TableView::CellPosition(2, 0));
          +parent.SetFitHeight(2);
          + +

          In the example, the "Hello World" text label has been given the full width, not the natural width.

          + +

          Using Decorations

          + +

          For text decorations, TextLabel provides several properties.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: TextLabel properties +
          PropertyTypeWritableAnimatable
          RENDERING_BACKENDIntegerYesNo
          TEXTStringYesNo
          FONT_FAMILYStringYesNo
          FONT_STYLEStringYesNo
          POINT_SIZEFloatYesNo
          MULTI_LINEBooleanYesNo
          HORIZONTAL_ALIGNMENTStringYesNo
          VERTICAL_ALIGNMENTStringYesNo
          TEXT_COLORVector4YesNo
          SHADOW_OFFSETVector2YesNo
          SHADOW_COLORVector4YesNo
          UNDERLINE_ENABLEDBooleanYesNo
          UNDERLINE_COLORVector4YesNo
          UNDERLINE_HEIGHTFloatYesNo
          + +

          Color

          + +

          To change the color of the text, use the TEXT_COLOR property. Unlike the Actor::COLOR property, this does not affect child actors added to the TextLabel.

          + +
          label.SetProperty(TextLabel::Property::TEXT, "Red Text");
          +label.SetProperty(TextLabel::Property::TEXT_COLOR, Color::RED);
          + +

          Drop Shadow

          + +

          To add a drop shadow to the text, set the SHADOW_OFFSET property with a non-zero values. The color can also be selected using the SHADOW_COLOR property.

          + +
          stage.SetBackgroundColor(Color::BLUE);
          +label1.SetProperty(TextLabel::Property::TEXT, "Plain Text");
          +label2.SetProperty(TextLabel::Property::TEXT, "Text with Shadow");
          +label2.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(1.0f, 1.0f));
          +label2.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::BLACK);
          +label3.SetProperty(TextLabel::Property::TEXT, "Text with Bigger Shadow");
          +label3.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(2.0f, 2.0f));
          +label3.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::BLACK);
          +label4.SetProperty(TextLabel::Property::TEXT, "Text with Color Shadow");
          +label4.SetProperty(TextLabel::Property::SHADOW_OFFSET, Vector2(1.0f, 1.0f));
          +label4.SetProperty(TextLabel::Property::SHADOW_COLOR, Color::RED);
          + +

          Underlining

          + +

          The text can be underlined by setting the UNDERLINE_ENABLED property. The color can also be selected using the UNDERLINE_COLOR property.

          + +
          label1.SetProperty(TextLabel::Property::TEXT, "Text with Underline");
          +label1.SetProperty(TextLabel::Property::UNDERLINE_ENABLED, true);
          +label2.SetProperty(TextLabel::Property::TEXT, "Text with Color Underline");
          +label2.SetProperty(TextLabel::Property::UNDERLINE_ENABLED, true);
          +label2.SetProperty(TextLabel::Property::UNDERLINE_COLOR, Color::GREEN); 
          + +

          By default, the underline height is based on the font metrics. This can be overridden using the UNDERLINE_HEIGHT property:

          + +
          label1.SetProperty(TextLabel::Property::UNDERLINE_HEIGHT, 1.0f);
          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/dali/ui_components_n.htm b/org.tizen.ui.practices/html/native/dali/ui_components_n.htm new file mode 100644 index 0000000..9a0a8c0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/dali/ui_components_n.htm @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + UI Components: Creating the Application Layout + + + + + + +
          +

          UI Components: Creating the Application Layout

          + +

          UI components are interactive components for layouting and scrolling the user interface. DALi provides UI components, such as buttons, item view, scroll view, table view, and text controls.

          + +

          Figure: DALi UI components

          +

          DALi UI components

          + +

          The following table lists the available UI components.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: DALi UI components +
          ControlDescriptionRelated classes
          ButtonsA push button that can be pressed, a checkbox button that can be checked/unchecked,and a radio button that only one option can be selected.Button, PushButton, CheckBoxButton, RadioButton
          ItemViewAn item view that renders item sets in a scrollable layout.ItemView, ItemFactory, ItemLayout, Scrollable
          ScrollViewA scroll view to provide scrollable view.ScrollView, Scrollable, ScrollViewEffect, ScrollViewPagePathEffect
          TableViewA table view that can align child actors in a grid like layout.TableView
          TextFieldA text field that provides a single-line editable text field.TextField
          TextLabelA text label that renders a short text string.TextLabel
          ImageViewAn image view that renders an image.ImageView
          + +

          The base class for the components is Dali::Toolkit::Control (in mobile and wearable applications). This class can also be used to create your own custom UI components. For tips for the control class, see Control. In this UI Components guide, both the terms control and component are used to refer to a UI component.

          + +

          The following figure illustrates the hierarchy of the UI components.

          + +

          Figure: DALi UI component hierarchy

          +

          DALi UI component hierarchy

          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/animation_effects_n.htm b/org.tizen.ui.practices/html/native/efl/animation_effects_n.htm new file mode 100644 index 0000000..4916ba0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/animation_effects_n.htm @@ -0,0 +1,84 @@ + + + + + + + + + + + + + Animations and Effects: Creating Transformations + + + + + +
          + +

          Animations and Effects: Creating Transformations

          + +

          EFL provides the following animation functionalities: Ecore animators, Elementary transitions, Edje animations, and Evas Map animations.

          + +

          The first option for creating animations with EFL is to use Ecore animators. To create an Ecore animation, you must first determine the duration of the animation, and then define a callback function that performs the animation with that duration.

          + +

          You can also create animations using Elementary transitions. Elementary transitions allow you to apply various transition effects, such as translation and rotation, to Evas objects. Elementary transitions are mostly based on Ecore animators, but provide some transition methods at a higher level of abstraction. Elementary transitions provide a simpler way of animating objects than Ecore animators or Edje animations.

          + +

          A third option for animating objects is to use Edje animations, which are based on a simple principle: transitioning from one state to another. To animate an object with Edje, you have to first define the start and end states of the animation, and then transition the object from the start state to the end state.

          + +

          Finally, Evas Map animations allow you to apply transformations to all types of objects by way of UV mapping. In UV mapping, you map points in the source object to 3D space positions in the target object. This allows for rotation, perspective, scale, and other transformation effects, depending on the map. In addition, each map point can carry a multiplier color, which, if properly calculated, can be used to apply 3D shading effects on the target object.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/basic_tutorial_mn.htm b/org.tizen.ui.practices/html/native/efl/basic_tutorial_mn.htm new file mode 100644 index 0000000..a3d8647 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/basic_tutorial_mn.htm @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + Creating Basic Mobile Interactions + + + + + + +
          +

          Creating Basic Mobile Interactions

          + + +

          This tutorial teaches the basics of UI component interactions. It builds upon the Hello World example, using its basic application code.

          + +

          This feature is supported in mobile applications only.

          + +

          Using Buttons

          + +

          To use buttons:

          + +
            +
          • Create buttons with various styles: + +
              +
            • +

              To create a text-only button:

              +
              Evas_Object* button;
              +
              +button = elm_button_add(box);
              +elm_object_text_set(button, "Click me");
              +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button);
              +evas_object_show(button);
              +
              +
            • +
            • +

              To create a button with an icon:

              +
              Evas_Object* button2;
              +Evas_Object* icon2;
              +
              +button2 = elm_button_add(box);
              +icon2 = elm_icon_add(box);
              +elm_image_file_set(icon2, "icon.png", NULL);
              +elm_object_part_content_set(button2, "icon", icon2);
              +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button);
              +evas_object_show(button);
              +
              +
            • +
            • +

              To create a button with both an icon and a text label:

              +
              Evas_Object* button3;
              +Evas_Object* icon3;
              +button3 = elm_button_add(box);
              +icon3 = elm_icon_add(box);
              +elm_image_file_set(icon, "icon.png", NULL);
              +elm_object_part_content_set(button3, "icon", icon3);
              +elm_object_text_set(button3, "Press me");
              +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button);
              +evas_object_show(button);
              +
              +
            • +
          • + +
          • Disable a button using the elm_object_disabled_set() function. +

            A disabled button is visible, but cannot be clicked.

            +
            elm_object_disabled_set(button2, EINA_TRUE);
            +
          • + +
          • Manage button callbacks. +

            The Elementary buttons respond to user interactions with several events.

            +
              +
            • Define and register a callback for a button click. +

              The clicked event is the most basic button event. The following code snippet changes the button text when the button is clicked (first pressed and then unpressed):

              +
              +static void _button_click_cb(void *data, Evas_Object *button, void *ev) 
              +{
              +   elm_object_text_set(button, "Clicked!");
              +}
              +evas_object_smart_callback_add(button, "clicked", _button_click_cb, NULL);
              +
              +
            • +
            • Define and register a callback for a button press and unpress. +

              The button can respond to the separate pressed and unpressed events instead of the entire click event:

              +
              static void _button_press_cb(void *data, Evas_Object *button, void *ev) 
              +{
              +   elm_object_text_set(button, "Pressed!");
              +}
              +static void _button_unpress_cb(void *data, Evas_Object *button, void *ev) 
              +{
              +   elm_object_text_set(button, "Unpressed!");
              +}
              +
              +evas_object_smart_callback_add(button3, "pressed", _button_press_cb, NULL);
              +evas_object_smart_callback_add(button3, "unpressed", _button_unpress_cb, NULL);
              +
              +
            • +
            • Define and register a callback for repeated button events. +

              The button can receive multiple repeated events when the user presses it down and holds it. You can define timings, such as the initial timeout and the repeat interval, for repeated events. In this example, the initial timeout is set to 1 second, and the repeat interval to half a second.

              +
              static void _button_repeat_cb(void *data, Evas_Object *button, void *ev) 
              +{
              +   static int count = 0;
              +   char buf[16];
              +
              +   snprintf(buf, sizeof(buf), "Repeat %d", count++);
              +
              +   elm_object_text_set(button, buf);
              +}
              +
              +elm_button_autorepeat_set(button3, EINA_TRUE);
              +elm_button_autorepeat_initial_timeout_set(button3, 1.0);
              +elm_button_autorepeat_gap_timeout_set(button3, 0.5);
              +evas_object_smart_callback_add(button3, "repeated", _button_repeat_cb, NULL);
              +
              +
            • +
          + +

          Using Simple Text

          + +

          To use simple text:

          +
            +
          • Create a label object: +
            label = elm_label_add(ad->win);
            +elm_object_text_set(label, "My label");
            +evas_object_show(label);
            +
            +
          • +
          • Slide the text, if it is too long to be shown at once, using one of the slide options: + +
              +
            • slide_short: Text stops at an edge, reverts to its initial position and slides again.
            • +
            • slide_long: Text is originally empty. It slides in, all the way to the edge, continues sliding until the label is empty, and loops.
            • +
            • slide_bounce: Text moves (bounces) backwards after stopping at the edge.
            • +
            + +

            In the following example, the duration of the slide is set to 5 seconds and slide option bounces the text at the end:

            + +
            Evas_Object* label;
            +label = elm_label_add(->win);
            +elm_object_text_set(label, "This text is supposed to be really long.");
            +elm_label_slide_set(label, EINA_TRUE);
            +elm_label_slide_duration_set(label, 5.);
            +elm_object_style_set(label, "slide_bounce");
            +evas_object_show(label);
            +
            + +

            If needed, you can use the slide,end event to respond to the moment when the sliding text reaches its end.

            +
          • + +
          • Create a marker. +

            A marker is a text that is by default bold, white, and centered. In the following example, the marker text is set to be blue:

            +
            elm_object_style_set(label, "marker");
            +evas_object_color_set(label, 0, 0, 255, 255);
            +
            +
          • +
          • Apply basic styles to the text with HTML elements. +

            The following example creates bold text:

            +
            elm_object_text_set(label, "<b>This text is bold.</b>");
            +
            +
          • +
          + + +

          Using Simple Lists

          + +

          A list is a scrollable container, whose children can be selected. For the list items, any Evas Object can be added as an icon, either at the beginning (third parameter) or the end (fourth parameter) of the item.

          + +

          The following example shows a list with 3 list items, where the second list item has an icon before the item text, and the third item has a button after the item text:

          +
          Evas_Object* list;
          +Evas_Object* icon;
          +list = elm_list_add(ad->win);
          +elm_list_item_append(list, "Text item", NULL, NULL, NULL, NULL);
          +icon = elm_icon_add(ad->win);
          +elm_icon_standard_set(icon, "chat");
          +elm_list_item_append(list, "Second item", icon, NULL, NULL, NULL);
          +Evas_Object* button;
          +button = elm_button_add();
          +elm_object_text_set(button, "Button");
          +elm_list_item_append(list, "Third item", NULL, button, NULL, NULL);
          +elm_list_go(list);
          +
          + + + +

          To manage lists:

          + +
            +
          • Set the orientation. +

            By default, a list is set vertically. To display the list horizontally:

            +
            elm_list_horizontal_set(list, EINA_TRUE);
            +
            +
          • +
          • Set a mode for the list: +
              +
            • ELM_LIST_COMPRESS: List does not set any size measures to inform the container how to resize it. If the list is not created as a "resize object", its dimensions are zeroed. The list respects the container's geometry and if any of the list items do not fit into the container transverse axis, the list does not scroll in that direction.
            • +
            • ELM_LIST_SCROLL (default): Same as ELM_LIST_COMPRESS, with the exception that if any of the list items do not fit into the container transverse axis, the list still scrolls in that direction.
            • +
            • ELM_LIST_LIMIT: Sets a minimum size measure on the list object, so that containers can respect it (and resize themselves to fit the child properly). More specifically, a minimum size measure is set for its transverse axis, so that the largest item in that direction fits well. This feature is bound by the list object's maximum size measures that are set externally.
            • +
            • ELM_LIST_EXPAND: Besides setting a minimum size on the transverse axis, as in ELM_LIST_LIMIT, this mode sets a minimum size on the longitudinal axis to reserve space for all its children to be visible at the same time. This feature is bound by the list object's maximum size measures that are set externally.
            • +
            +
            elm_list_mode_set(list, ELM_LIST_COMPRESS);
            +
            +
          • +
          • Manage the scroller. +

            You can control whether scrollbars are displayed for the list using the elm_scroller_policy_set() function. The second parameter is for the horizontal axis, the third one for the vertical axis.

            + +

            The available scroller policies are:

            +
              +
            • ELM_SCROLLER_POLICY_OFF: Scrollbar is hidden
            • +
            • ELM_SCROLLER_POLICY_ON: Scrollbar is displayed
            • +
            • ELM_SCROLLER_POLICY_AUTO: Scrollbar is displayed only when needed and stays hidden at other times
            • +
            + +
            elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_ON);
            +
            + +

            Several effects can also be shown on a list. In the following example, the scroller is set to bounce at the end on either direction (the second parameter is for the horizontal axis, and the third one for the vertical axis):

            +
            elm_scroller_bounce_set(list, EINA_TRUE, EINA_TRUE);
            +
            +
          • +
          • Manage events. +

            You can register and define various events for a list:

            +
              +
            • activated: User clicks or presses an item.
            • +
            • selected: User selects an item.
            • +
            • unselected: User clears an item.
            • +
            • longpressed: User long-presses an item.
            • +
            • edge,top: User scrolls the list to the top edge.
            • +
            • edge,bottom: User scrolls the list to the bottom edge.
            • +
            • edge,left: User scrolls the list to the left edge.
            • +
            • edge,right: User scrolls the list to the right edge.
            • +
            • highlighted: Item is pressed and highlighted.
            • +
            • unhighlighted: Item stops being pressed and highlighted.
            • +
            +
          • +
          + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/button_tutorial_wn.htm b/org.tizen.ui.practices/html/native/efl/button_tutorial_wn.htm new file mode 100644 index 0000000..4ccf091 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/button_tutorial_wn.htm @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + Creating Wearable Buttons + + + + + + +
          +

          Creating Wearable Buttons

          + + +

          This tutorial teaches the basics of the button component interactions.

          + +

          This feature is supported in wearable applications only.

          + + +

          Initializing the Button Application

          + +

          This use case creates an application with a window entitled "Button Basic Tutorial". The window consists of a box component, and a button is placed inside the box.

          + +

          To create a typical elementary application:

          +
          +static void
          +create_base_gui(appdata_s *ad) 
          +{
          +   // Window
          +   Evas_Object *btn1, *btn2, *btn3;
          +
          +   ad->win = elm_win_util_standard_add("main", "Button Basic Tutorial");
          +   elm_win_autodel_set(ad->win, EINA_TRUE);
          +
          +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          +
          +   ad->box = elm_box_add(ad->win);
          +   evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   evas_object_show(ad->box);
          +   elm_win_resize_object_add(ad->win, ad->box);
          +
          +   create_button(ad->box);
          +
          +   // Show the window after the base GUI is set up
          +   evas_object_show(ad->win);
          +}
          +
          +static bool
          +app_create(void *data)
          +{
          +   appdata_s *ad = data;
          +   create_base_gui(ad);
          +
          +   return true;
          +}
          +
          +int
          +main(int argc, char **argv)
          +{
          +   struct app_data ad = {0,};
          +   ui_app_lifecycle_callback_s event_callback = {0,};
          +
          +   event_callback.create = app_create;
          +
          +   return ui_app_main(&argc, &argv, &event_callback, &ad);
          +}
          + + +

          Using Button Styles

          + +

          The basic application code is the same as in the Hello World example.

          + +

          To use various button styles:

          + +
          1. To create buttons using various styles:

            + +
            • Create a basic text-only button: + +
              Evas_Object* button;
              +
              +button = elm_button_add(box);
              +elm_object_text_set(button, "Click me");
              +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button);
              +evas_object_show(button);
              +
            • + +
            • Create a basic icon button (no text, just an icon): +
              Evas_Object* button2;
              +Evas_Object* icon2;
              +
              +button2 = elm_button_add(box);
              +icon2 = elm_icon_add(box);
              +elm_image_file_set(icon2, "icon.png", NULL);
              +elm_object_content_set(button2, icon2);
              +evas_object_size_hint_weight_set(button2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button2, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button2);
              +evas_object_show(button2);
              +
            • + +
            • Create a button with both an icon and a text label: +
              Evas_Object* button3;
              +Evas_Object* icon3;
              +button3 = elm_button_add(box);
              +icon3 = elm_icon_add(box);
              +elm_image_file_set(icon3, "icon.png", NULL);
              +elm_object_content_set(button3, icon3);
              +elm_object_text_set(button3, "Press me");
              +evas_object_size_hint_weight_set(button3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +evas_object_size_hint_align_set(button3, EVAS_HINT_FILL, 0.5);
              +elm_box_pack_end(box, button3);
              +evas_object_show(button3);
              +
            • +
          2. +
          3. To disable a button so that it is not in use, only shown:

            +
            elm_object_disabled_set(button2, EINA_TRUE);
            +
          + +

          Managing Button Events

          +

          The Elementary buttons respond to user interactions with several events.

          +

          To manage button events:

          + +
            +
          • Handle click events: +

            The "click" event is the most basic and well-known one. The following code snippet changes the text of a button upon a click event: a press followed by an unpress.

            +
            +static void _button_click_cb(void *data, Evas_Object *button, void *ev) 
            +{
            +   elm_object_text_set(button, "Clicked!");
            +}
            +evas_object_smart_callback_add(button, "clicked", _button_click_cb, NULL);
            +
          • + +
          • Handle press and unpress events: +

            The button can respond to the separate press and unpress events instead of the entire click event.

            +
            static void _button_press_cb(void *data, Evas_Object *button, void *ev) 
            +{
            +   elm_object_text_set(button, "Pressed!");
            +}
            +static void _button_unpress_cb(void *data, Evas_Object *button, void *ev) 
            +{
            +   elm_object_text_set(button, "Unpressed!");
            +}
            +
            +evas_object_smart_callback_add(button3, "pressed", _button_press_cb, NULL);
            +evas_object_smart_callback_add(button3, "unpressed", _button_unpress_cb, NULL);
            +
          • + +
          • Handle repeated events: +

            The button can receive several events in case it is being held by the user. Timings, such as the initial timeout and the repeat interval, can be set. In this example, the initial timeout is set to 1 second, and the repeat interval to half a second.

            +
            static void _button_repeat_cb(void *data, Evas_Object *button, void *ev) 
            +{
            +   static int count = 0;
            +   char buf[16];
            +
            +   snprintf(buf, sizeof(buf), "Repeat %d", count++);
            +
            +   elm_object_text_set(button, buf);
            +}
            +
            +elm_button_autorepeat_set(button3, EINA_TRUE);
            +elm_button_autorepeat_initial_timeout_set(button3, 1.0);
            +elm_button_autorepeat_gap_timeout_set(button3, 0.5);
            +evas_object_smart_callback_add(button3, "repeated", _button_repeat_cb, NULL);
            +
          + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.guides/html/native/efl/circle_components_wn.htm b/org.tizen.ui.practices/html/native/efl/circle_components_wn.htm old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/native/efl/circle_components_wn.htm rename to org.tizen.ui.practices/html/native/efl/circle_components_wn.htm diff --git a/org.tizen.ui.practices/html/native/efl/component_background_mn.htm b/org.tizen.ui.practices/html/native/efl/component_background_mn.htm new file mode 100644 index 0000000..43a1fb5 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_background_mn.htm @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + Background + + + + + + +
          +

          Background

          + +

          This feature is supported in mobile applications only.

          + +

          The background component can be used to set a solid background decoration to a window or to a container object. It works like an image, but has some background specific properties, for example it can be set to a tiled, centered, scaled, or stretched mode. There are no specific signals relative to background object.

          + +

          Figure: Red color background

          +

          Red color background

          + +

          Figure: Background hierarchy

          +

          Background hierarchy

          + +

          Adding a Background Component

          + +

          A background is created with the elm_bg_add() function.

          + +
          +Evas_Object *bg, *parent;
          +
          +// Create a background
          +bg = elm_bg_add(parent);
          +
          + +

          Changing the Color of the Background

          + +

          You can set the color of the background with the elm_bg_color_set() function. The following example sets the background color to red.

          + +
          +Evas_Object *bg;
          +
          +// Use red color for background
          +elm_bg_color_set(bg, 0xFF, 0x00, 0x00);
          +
          + +

          Changing the Image of the Background

          + +

          It is also possible to set an image or an Edje group as a background using the elm_bg_file_set() function. The display mode of the image in the background can be chosen with elm_bg_option_set(), where the following modes are available:

          + +
            +
          • ELM_BG_OPTION_CENTER: center the background image.
          • +
          • ELM_BG_OPTION_SCALE: scale the background image, retaining aspect ratio.
          • +
          • ELM_BG_OPTION_STRETCH: stretch the background image to fill the UI component's area.
          • +
          • ELM_BG_OPTION_TILE: tile the background image at its original size.
          • +
          + +
          +Evas_Object *bg;
          +
          +// Set a file on the disk as a background image
          +elm_bg_file_set(bg, "/path/to/the/image", NULL);
          +// Set an Edje group as a background image
          +elm_bg_file_set(bg, "/path/to/the/edje", "edje_group");
          +elm_bg_option_set(bg, ELM_BG_OPTION_STRETCH)
          +
          + +

          Using Overlay

          + +

          An overlay can be set using the overlay part name.

          + +
          +elm_object_part_content_set(bg, "overlay", over);
          +
          + +

          Here, the overlay is an Edje object that is displayed on top of the current background object.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_background_wn.htm b/org.tizen.ui.practices/html/native/efl/component_background_wn.htm new file mode 100644 index 0000000..6c0b0c3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_background_wn.htm @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + Background + + + + + + +
          +

          Background

          + +

          This feature is supported in wearable applications only.

          + +

          The background component can be used to set a solid background decoration to a window or to a container object. It works like an image, but has some background specific properties, for example it can be set to a tiled, centered, scaled, or stretched mode. There are no specific signals relative to background object.

          + + +

          Figure: Red color background

          +

          Red color background

          + +

          Figure: Background hierarchy

          +

          Background hierarchy

          + +

          Adding a Background Component

          + +

          A background is created with the elm_bg_add() function.

          + +
          +Evas_Object *bg, *parent;
          +
          +// Create a background
          +bg = elm_bg_add(parent);
          +
          + +

          Changing the Color of the Background

          + +

          You can set the color of the background with the elm_bg_color_set() function. The following example sets the background color to red.

          + +
          +Evas_Object *bg;
          +
          +// Use red color for background
          +elm_bg_color_set(bg, 0xFF, 0x00, 0x00);
          +
          + +

          Changing the Image of the Background

          + +

          It is also possible to set an image or an Edje group as a background using the elm_bg_file_set() function. The display mode of the image in the background can be chosen with elm_bg_option_set(), where the following modes are available:

          + +
            +
          • ELM_BG_OPTION_CENTER: center the background image.
          • +
          • ELM_BG_OPTION_SCALE: scale the background image, retaining aspect ratio.
          • +
          • ELM_BG_OPTION_STRETCH: stretch the background image to fill the UI component's area.
          • +
          • ELM_BG_OPTION_TILE: tile the background image at its original size.
          • +
          + +
          +Evas_Object *bg;
          +
          +// Set a file on the disk as a background image
          +elm_bg_file_set(bg, "/path/to/the/image", NULL);
          +// Set an Edje group as a background image
          +elm_bg_file_set(bg, "/path/to/the/edje", "edje_group");
          +elm_bg_option_set(bg, ELM_BG_OPTION_STRETCH)
          +
          + +

          Using Overlay

          + +

          An overlay can be set using the overlay part name.

          + +
          +elm_object_part_content_set(bg, "overlay", over);
          +
          + +

          Here, the overlay is an Edje object that is displayed on top of the current background object.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_button_mn.htm b/org.tizen.ui.practices/html/native/efl/component_button_mn.htm new file mode 100644 index 0000000..70c8110 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_button_mn.htm @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + Button + + + + + + +
          +

          Button

          + +

          This feature is supported in mobile applications only.

          + +

          The Elementary button component is a simple push button. It is composed of a label icon and an icon object and has an autorepeat feature.

          + +

          Figure: Button component

          +

          Button component

          + +

          Figure: Button hierarchy

          +

          Button hierarchy

          + +

          Adding a Button Component

          + +

          Create a button.

          +
          +Evas_Object *button, *parent;
          +
          +// Create a button
          +button = elm_button_add(parent);
          + +

          Adding an Icon Inside a Button

          + +

          The icon can be updated with elm_object_part_content_set() function with the icon part name.

          + +
          +Evas_Object *ic;
          +ic = elm_icon_add(button);
          +elm_image_file_set(ic, "icon.png", NULL);
          +elm_object_part_content_set(button, "icon", ic);
          +
          + +

          Adding Text Inside a Button

          + +

          The label can be modified using the elm_object_text_set() function.

          + +
          +elm_object_text_set(button, "Click me!");
          +
          + +

          Using Button Styles

          + +

          Various styles can be used on the button. Tizen supports the following styles:

          + +
            +
          • icon_reorder
          • +
          • icon_expand_add
          • +
          • icon_expand_delete
          • +
          • default
          • +
          • circle
          • +
          • bottom
          • +
          • contacts
          • +
          • option
          • +
          + +

          You can see these themes in action on the following screenshot (in the above order).

          + +

          Figure: Button component

          +

          Button component

          + +

          To change the style of the button, call the elm_object_style_set() function on the button object.

          + +
          +elm_object_style_set(button,"icon_expand_add");
          +
          + +

          Using the Button Callbacks

          + +

          The button emits the following signals:

          + +
            +
          • clicked: The user clicked the button (press/release).
          • +
          • repeated: The user pressed the button without releasing it.
          • +
          • pressed: The user pressed the button.
          • +
          • unpressed: The user released the button after pressing it.
          • +
          + +

          For all these signals the event_info parameter returned in the callback is NULL.

          + +

          This is an example to register and define a callback function called by the clicked signal.

          + +
          +{
          +   evas_object_smart_callback_add(button, "clicked", clicked_cb, data);
          +}
          +// Callback function for the "clicked" signal
          +// This callback is called when the button is clicked by the user
          +void clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Button clicked\n");
          +}
          +
          + +

          Using the Autorepeat Feature

          + +

          The autorepeat feature is enabled by default. It consists of calling the repeated signal when the user keeps the button pressed. This feature can be disabled with the elm_button_autorepeat_set() function. The autorepeat is configured with the following functions:

          +
            +
          • elm_button_autorepeat_initial_timeout_set(): to set the initial timeout before the autorepeat event is generated
          • +
          • elm_button_autorepeat_gap_timeout_set(): to set the interval between two autorepeat events
          • +
          + +

          Disable the autorepeat feature.

          +
          +elm_button_autorepeat_set(button, EINA_FALSE);
          +
          + +

          Enable the autorepeat feature.

          +
          +elm_button_autorepeat_set(button, EINA_TRUE);
          +
          + +

          Set the initial timeout to five seconds.

          +
          +elm_button_autorepeat_initial_timeout_set(button, 5.0);
          +
          + +

          Set the gap between two signals to 0.5 seconds.

          +
          +elm_button_autorepeat_gap_timeout_set(button, 0.5);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_button_wn.htm b/org.tizen.ui.practices/html/native/efl/component_button_wn.htm new file mode 100644 index 0000000..c203e9f --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_button_wn.htm @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + Button + + + + + + +
          +

          Button

          + +

          This feature is supported in wearable applications only.

          + +

          The Elementary button component is a simple push button. It is composed of a label icon and an icon object and has an autorepeat feature.

          + + +

          Figure: Button component

          +

          Button component

          + +

          Figure: Button hierarchy

          +

          Button hierarchy

          + +

          Adding a Button Component

          + +

          Create a button.

          +
          +Evas_Object *button, *parent;
          +
          +// Create a button
          +button = elm_button_add(parent);
          + +

          Adding an Icon Inside a Button

          + +

          The icon can be updated with elm_object_part_content_set() function with the icon part name.

          + +
          +Evas_Object *ic;
          +ic = elm_icon_add(button);
          +elm_image_file_set(ic, "icon.png", NULL);
          +elm_object_part_content_set(button, "icon", ic);
          + +

          Adding Text Inside a Button

          + +

          The label can be modified using the elm_object_text_set() function.

          + +
          +elm_object_text_set(button, "Click me!");
          +
          + +

          Using Button Styles

          + +

          Various styles can be used on the button. Tizen supports the following styles for the rectangular UI component:

          +
            +
          • default
          • +
          • green
          • +
          • orange
          • +
          • red
          • +
          • nextdepth
          • +
          +

          Tizen supports the following styles for the circular UI component:

          +
            +
          • default
          • +
          • bottom
          • +
          + +

          To change the style of the button, call the elm_object_style_set() function on the button object.

          + +
          +// Example for the rectangular UI component
          +elm_object_style_set(button, "nextdepth");
          +
          +// Example for the circular UI component
          +elm_object_style_set(button, "bottom");
          +
          + +

          Using the Button Callbacks

          + +

          The button emits the following signals:

          + +
            +
          • clicked: The user clicked the button (press/release).
          • +
          • repeated: The user pressed the button without releasing it.
          • +
          • pressed: The user pressed the button.
          • +
          • unpressed: The user released the button after pressing it.
          • +
          + +

          For all these signals the event_info parameter returned in the callback is NULL.

          + +

          This is an example to register and define a callback function called by the clicked signal.

          +
          +{
          +   evas_object_smart_callback_add(button, "clicked", clicked_cb, data);
          +}
          +// Callback function for the "clicked" signal
          +// This callback is called when the button is clicked by the user
          +void clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Button clicked\n");
          +}
          +
          + +

          Using the Autorepeat Feature

          + +

          The autorepeat feature is enabled by default. It consists of calling the repeated signal when the user keeps the button pressed. This feature can be disabled with the elm_button_autorepeat_set() function. The autorepeat is configured with the following functions:

          +
            +
          • elm_button_autorepeat_initial_timeout_set(): to set the initial timeout before the autorepeat event is generated
          • +
          • elm_button_autorepeat_gap_timeout_set(): to set the interval between two autorepeat events
          • +
          + +

          Disable the autorepeat feature.

          +
          +elm_button_autorepeat_set(button, EINA_FALSE);
          +
          + +

          Enable the autorepeat feature.

          +
          +elm_button_autorepeat_set(button, EINA_TRUE);
          +
          + +

          Set the initial timeout to five seconds.

          +
          +elm_button_autorepeat_initial_timeout_set(button, 5.0);
          +
          + +

          Set the gap between two signals to 0.5 seconds.

          +
          +elm_button_autorepeat_gap_timeout_set(button, 0.5);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_check_mn.htm b/org.tizen.ui.practices/html/native/efl/component_check_mn.htm new file mode 100644 index 0000000..f4eddcb --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_check_mn.htm @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + Check + + + + + + +
          +

          Check

          + +

          This feature is supported in mobile applications only.

          + + +

          The check component is similar to the radio component, except that it does not work as a group. It toggles the value of a boolean between true and false.

          + +

          This UI component inherits from the layout component. All layout functions can be used on the check component.

          + + +

          Figure: Check component

          +

          Check component

          + +

          Figure: Check hierarchy

          +

          Check hierarchy

          + +

          Adding a Check Component

          + +

          The following example shows how to create a check component.

          + +
          +Evas_Object *check, *parent;
          +check = elm_check_add(parent);
          +
          + +

          Modifying the Check Styles

          + +

          The check component style can be set with the elm_object_style_set() function. The following styles are available:

          +
            +
          • default
          • +
          • favorite
          • +
          • on and off
          • +
          + +

          The following example sets the favorite style on our check object.

          +
          +elm_object_style_set(check, "favorite");
          +
          + +

          To get the current style, use the elm_object_style_get() function.

          +
          +char *style = elm_object_style_get(check);
          +
          + +

          Using the Check Component

          + +

          After having created a check object, it is possible to set its boolean value to EINA_TRUE.

          +
          +elm_check_state_set(check, EINA_TRUE);
          +
          + +

          You can also retrieve the current value of the check object.

          +
          +Eina_Bool value = elm_check_state_get(check);
          +
          + +

          As with a radio object, an icon and a label can be set.

          +
          +// Create a Home icon 
          +Evas_Object *icon;
          +
          +icon = elm_icon_add(parent);
          +elm_icon_standard_set(icon, "home");
          +
          +// Set it to the check object 
          +elm_object_part_content_set(check, "icon", icon);
          +
          +// Set the check label 
          +elm_object_text_set(check, "Check label");
          +
          + +

          You can also modify the on and off labels.

          + +
          +elm_object_part_text_set(check, "on", "True");
          +elm_object_part_text_set(check, "off", "False");
          +
          + +

          The get functions of the elementary object API can be used to retrieve the content set to the check object.

          + +
          +// Get the current set text of the check label 
          +char *text = elm_object_text_get(check);
          +
          +// Get the content set in the icon part 
          +Evas_Object *icon = elm_object_part_content_get(check, "icon");
          +
          + +

          Using the Check Callbacks

          + +

          When the value is changed by the user, the changed signal is emitted. The event_info parameter is NULL.

          + +

          The following example shows how to register a callback on this signal.

          +
          +{
          +   evas_object_smart_callback_add(check, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the check value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_check_wn.htm b/org.tizen.ui.practices/html/native/efl/component_check_wn.htm new file mode 100644 index 0000000..9a5f515 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_check_wn.htm @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + Check + + + + + + +
          +

          Check

          + +

          This feature is supported in wearable applications only.

          + +

          The check component is similar to the radio component, except that it does not work as a group. It toggles the value of a boolean between true and false.

          + +

          This UI component inherits from the layout component. All layout functions can be used on the check component.

          + + +

          Figure: Check component

          +

          Check component

          + +

          Figure: Check hierarchy

          +

          Check hierarchy

          + +

          Adding a Check Component

          + +

          The following example shows how to create a check component.

          +
          +Evas_Object *check, *parent;
          +check = elm_check_add(parent);
          +
          + +

          Modifying the Check Styles

          + +

          The check component style can be set with the elm_object_style_set() function.

          +

          The following styles are available for the rectangular UI component:

          +
            +
          • default
          • +
          • on and off
          • +
          +

          The following styles are available for the circular UI component:

          +
            +
          • default
          • +
          • small
          • +
          • on and off
          • +
          + +

          The following example sets the on and off style on our check object.

          +
          +elm_object_style_set(check, "on and off");
          +
          + +

          To get the current style, use the elm_object_style_get() function.

          +
          +char *style = elm_object_style_get(check);
          +
          + +

          Using the Check Component

          + +

          After having created a check object, it is possible to set its boolean value to EINA_TRUE.

          +
          +elm_check_state_set(check, EINA_TRUE);
          +
          + +

          You can also retrieve the current value of the check object.

          +
          +Eina_Bool value = elm_check_state_get(check);
          +
          + +

          As with a radio object, an icon can be set for the rectangular UI component.

          +
          +// Create a Home icon 
          +Evas_Object *icon;
          +
          +icon = elm_icon_add(parent);
          +elm_icon_standard_set(icon, "home");
          +
          +// Set it to the check object 
          +elm_object_part_content_set(check, "icon", icon);
          +
          + +

          The get functions of the elementary object API can be used to retrieve the content set to the check object.

          +
          +// Get the content set in the icon part 
          +Evas_Object *icon = elm_object_part_content_get(check, "icon");
          +
          + +

          Using the Check Callbacks

          + +

          When the value is changed by the user, the changed signal is emitted. The event_info parameter is NULL.

          + +

          The following example shows how to register a callback on this signal.

          + +
          +{
          +   evas_object_smart_callback_add(check, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the check value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_datetime_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_datetime_wn.htm new file mode 100644 index 0000000..90e1621 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_datetime_wn.htm @@ -0,0 +1,116 @@ + + + + + + + + + + + + + Circle Datetime + + + + + +
          +

          Circle Datetime

          + +

          This feature is supported in wearable applications only.

          + +

          The circle datetime extends elm_datetime by visualizing the selected field. If a rotary event is activated by eext_rotary_object_event_activated_set(), a circle datetime increases or decreases value of selected field in elm_datetime by the clockwise or counter clockwise rotary event.

          + +

          Figure: Circle Datetime

          +

          Circle Datetime

          + +

          Creating a Circle Datetime

          + +

          You can use the eext_circle_object_datetime_add() function to create a circle object. When creating a circle datetime, the elm_datetime handle must be passed as an argument. If a circle surface is passed as an argument, a circle object connected with a circle surface is created, and it is rendered by the circle surface. When NULL is passed as a surface argument, the new circle object is managed and rendered by itself.

          +
          +Evas_Object *datetime;
          +Evas_Object *circle_datetime;
          +
          +datetime = elm_datetime_add(parent);
          +circle_datetime = eext_circle_object_datetime_add(datetime, surface);
          +
          + +

          Activating a Rotary Event

          + +

          You can activate and deactivate the circle datetime by using the eext_rotary_object_event_activated_set() function. If the second parameter is EINA_TRUE, the circle datetime can receive the rotary event. Otherwise, the circle datetime cannot receive the rotary event.

          +
          +eext_rotary_object_event_activated_set(circle_datetime, EINA_TRUE);
          +
          + +

          Using the Circle Object Property

          + +

          A circle datetime has the following styles:

          +
            +
          • default
          • +
          +

          When created, the circle datetime has default style automatically.

          + +

          The circle datetime objects support the following circle object API calls:

          +
            +
          • eext_circle_object_line_width_set()
          • +
          • eext_circle_object_line_width_get()
          • +
          • eext_circle_object_radius_set()
          • +
          • eext_circle_object_radius_get()
          • +
          • eext_circle_object_color_set()
          • +
          • eext_circle_object_color_get()
          • +
          • eext_circle_object_disabled_set()
          • +
          • eext_circle_object_disabled_get()
          • +
          +

          A circle datetime has the following item:

          +
            +
          • default: Default circle item that draws a marker.
          • +
          + +

          You can change the properties of the items by using the eext_circle_object_item* APIs.

          +

          For more information, see the Efl Extension Circle Datetime API.

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_genlist_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_genlist_wn.htm new file mode 100644 index 0000000..12a5ddf --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_genlist_wn.htm @@ -0,0 +1,126 @@ + + + + + + + + + + + + + Circle Genlist + + + + + +
          +

          Circle Genlist

          + +

          This feature is supported in wearable applications only.

          + +

          Use the circle genlist to visualize and utilize the scroll effect for elm_genlist. While elm_genlist provides a scrollbar with straight horizontal and vertical movement, the circle genlist provides scrollbar with circular movement. It is also operated with rotary events to move to the next or previous item.

          + +

          Figure: Circle Genlist

          +

          Circle Genlist

          + +

          Creating a Circle Genlist

          + +

          A genlist and a surface are necessary when creating the circle genlist. The circle genlist is added with the eext_circle_object_genlist_add() function.

          +
          +Evas_Object *genlist, *circle_genlist, *parent;
          +
          +genlist = elm_genlist_add(parent);
          +circle_genlist = eext_circle_object_genlist_add(genlist, surface);
          +
          + +

          Configuring the Circle Genlist

          + +

          You can set the circle genlist scroller policy by using the eext_circle_object_genlist_scroller_policy_set() function.

          +
          +eext_circle_object_genlist_scroller_policy_set(circle_genlist, 
          +                                               ELM_SCROLLER_POLICY_OFF, 
          +                                               ELM_SCROLLER_POLICY_ON);
          +
          +

          This sets the scrollbar visibility policy of a given scroller. ELM_SCROLLER_POLICY_AUTO indicates the scrollbar is made visible if it is needed, and otherwise is kept hidden. ELM_SCROLLER_POLICY_ON turns the scrollbar on all the time, and ELM_SCROLLER_POLICY_OFF turns it off. This applies to the horizontal and vertical scrollbars respectively.

          +

          The following enum values are available for circle genlist.

          +
            +
          • ELM_SCROLLER_POLICY_AUTO
          • +
          • ELM_SCROLLER_POLICY_ON
          • +
          • ELM_SCROLLER_POLICY_OFF
          • +
          + +

          Activating a Rotary Event

          + +

          You can activate and deactivate the circle genlist by using the eext_rotary_object_event_activated_set() function. If the second parameter is EINA_TRUE, the circle genlist can receive the rotary event. Otherwise, the circle genlist cannot receive the rotary event.

          +
          +eext_rotary_object_event_activated_set(circle_genlist, EINA_TRUE);
          +
          + +

          Using the Circle Object Property

          + +

          Circle genlist objects support the following circle object API calls:

          +
            +
          • eext_circle_object_line_width_set()
          • +
          • eext_circle_object_line_width_get()
          • +
          • eext_circle_object_radius_set()
          • +
          • eext_circle_object_radius_get()
          • +
          • eext_circle_object_color_set()
          • +
          • eext_circle_object_color_get()
          • +
          • eext_circle_object_disabled_set()
          • +
          • eext_circle_object_disabled_get()
          • +
          +

          A circle genlist has the following item:

          +
            +
          • default: Default circle item. It draws vertical scroll bar.
          • +
          • vertical,scroll,bg: Vertical scroll background circle item.
          • +
          +

          You can change the properties of the items by using the eext_circle_object_item* APIs.

          +

          For more information, see the Efl Extension Circle Genlist API.

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_object_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_object_wn.htm new file mode 100644 index 0000000..6132405 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_object_wn.htm @@ -0,0 +1,265 @@ + + + + + + + + + + + + + Circle Object + + + + + +
          +

          Circle Object

          + +

          This feature is supported in wearable applications only.

          + +

          A circle object extends elementary components in a form of circular design. Sometimes, a circle object merely provides additional UI features to elementary component, and sometimes it works as an independent component with UI and functionalities.

          + +

          Creating a Circle Object

          + +

          You can use the eext_circle_object_add() function to create a circle object. When creating a circle object, you can choose whether the circle object is rendered by itself or by the circle surface. If the circle surface is passed as an argument, a circle object connected with circle surface is created, and it is rendered by the circle surface.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +
          + +

          When NULL is passed as a surface argument, the new circle object is managed and rendered by itself. Here, a circle object without a circle surface is created and showed in a size of 360 x 360.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, NULL);
          +evas_object_size_hint_min_set(circle_obj, 360, 360);
          +evas_object_show(circle_obj);
          +
          + +

          Setting the Line Width

          + +

          You can set the line width of the circle object by using the eext_circle_object_line_width_set() function. Here, circle object with a surface is created and its line width set to 20. You can get the current line width of a circle object by using the eext_circle_object_line_width_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_line_width_set(circle_obj, 20);
          +
          + +

          You can set the line width of a certain item in a circle object by using the eext_circle_object_item_line_width_set() function. If the name of the item is passed as default, it works the same way as the eext_circle_object_line_width_set() function. Similar to the above example, a circle object with a surface is created and its line width is set to 20. You can get the current line width of the item by using the eext_circle_object_item_line_width_get() function.

          +
          Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_line_width_set(circle_obj, "default", 20);
          +
          + +

          Setting the Angle

          + +

          You can set the angle of the circle object by using the eext_circle_object_angle_set() function. Here, circle object with surface is created and its angle set to a 45.0 degree angle. You can get the current angle of a circle object by using the eext_circle_object_angle_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_angle_set(circle_obj, 45.0);
          +
          + +

          You can set the angle of a certain item in a circle object by using the eext_circle_object_item_angle_set() function. If name of the item is passed as default, it works the same way as eext_circle_object_angle_set() function. Similar to the above example, a circle object with surface is created and its angle is set to a 45.0 degree angle. You can get the current angle of the item by using the eext_circle_object_item_angle_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_angle_set(circle_obj, "default", 45.0);
          +
          + +

          Setting the Angle Offset

          + +

          You can set the angle offset of the circle object by using the eext_circle_object_angle_offset_set() function. Here, a circle object with a 45.0 degree angle is created and its angle offset set to 30.0 degrees. As a result, the circle object has an arch of 45.0 degree angle line starting from 30.0 degrees to 75.0 degrees. You can get the current angle offset of a circle object by using the eext_circle_object_angle_offset_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_angle_set(circle_obj, 45.0);
          +eext_circle_object_angle_offset_set(circle_obj, 30.0);
          +
          + +

          You can set the angle offset of a certain item in a circle object by using the eext_circle_object_item_angle_offset_set() function. If name of the item is passed as default, it works the same way as eext_circle_object_angle_offset_set() function. The following code works the same way as in the above example. You can get the current angle of the item by using the eext_circle_object_item_angle_offset_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_angle_set(circle_obj, "default", 45.0); 
          +eext_circle_object_item_angle_offset_set(circle_obj, "default", 30.0);
          +
          + +

          Setting the Minimum and Maximum Angle

          + +

          You can set the minimum and maximum angle of the circle object by using the eext_circle_object_angle_min_max_set() function. Here, a circle object with a surface is created and its minimum angle set to 0.0 degrees and maximum angle to 90.0 degrees. You can get the current minimum and maximum angle of the circle object by using the eext_circle_object_angle_min_max_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_angle_min_max_set(circle_obj, 0.0, 90.0);
          +
          + +

          You can set the minimum and maximum angles of a certain item in a circle object by using the eext_circle_object_item_angle_min_max_set() function. If name of the item is passed as default, it works the same way as the eext_circle_object_angle_min_max_set() function. Similar to the above example, a circle object with a minimum and maximum angles of 0.0 and 90.0 is created. You can get the current minimum and maximum angle of the item by using the eext_circle_object_item_angle_min_max_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_angle_min_max_set(circle_obj, "default", 0.0, 90.0);
          +
          + +

          Setting the Minimum and Maximum Value

          + +

          You can set the minimum and maximum values of the circle object by using the eext_circle_object_value_min_max_set() function. Here, a circle object with a surface is created and its minimum value is set to 0.0 degrees and maximum value to 10.0 degrees. You can get the current minimum and maximum value of the circle object by using the eext_circle_object_value_min_max_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_value_min_max_set(circle_obj, 0.0, 10.0);
          +
          + +

          You can set the value of a certain item in a circle object by using the eext_circle_object_item_angle_min_max_set() function. If name of the item is passed as default, it works the same way as the eext_circle_object_value_min_max_set() function. Similar to the above example, a circle object with a minimum and maximum value of 0.0 to 10.0 degrees is created. You can get the current minimum and maximum values of the item by using the eext_circle_object_item_value_min_max_get() function.

          +
           
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_value_min_max_set(circle_obj, "default", 0.0, 10.0);
          +
          + +

          Setting the Value

          + +

          You can set the value of the circle object by using the eext_circle_object_value_set() function. Here, a circle object with a surface is created and its value set to 5.0. You can get the current value of the circle object by using the eext_circle_object_value_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_value_set(circle_obj, 5.0);
          +
          + +

          You can set the value of a certain item in a circle object by using the eext_circle_object_item_value_set() function. If name of the item is passed as default, it works the same as the eext_circle_object_value_set() function. Similar to the above example, a circle object with a surface is created and its value is set to 5.0 degree angle. You can get the current value of the item by using the eext_circle_object_item_value_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_value_set(circle_obj, "default", 5.0);
          +
          + + + + + + + + + + +
          Note
          The value cannot be lower than the minimum value or higher than the maximum value.
          + +

          Setting the Color

          + +

          You can set the color of the circle object by using the eext_circle_object_color_set() function. To set the color, red, green, blue, and alpha values in range from 0 to 255 must be passed. Here, a circle object with a surface is created and its color set to blue. You can get the current color of circle object by using the eext_circle_object_color_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_color_set(circle_obj, 255, 0, 0, 255);
          +
          + +

          You can set the color of a certain item in a circle object by using the eext_circle_object_item_color_set() function. If name of the item is passed as default, it works the same way as the eext_circle_object_color_set() function. Similar to the above example, a circle object with a surface is created and its color is set to red. You can get the current color of the item by using the eext_circle_object_item_color_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_value_set(circle_obj, "default", 255, 0, 0, 255);
          +
          + +

          Setting the Radius

          + +

          You can set the radius of the circle object by using the eext_circle_object_radius_set() function. Here, a circle object with radius of 50.0 is created. You can get the current radius of the circle object by using the eext_circle_object_radius_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_radius_set(circle_obj, 50.0);
          +
          + +

          You can set the radius of a certain item in a circle object by using the eext_circle_object_item_radius_set() function. If name of the item is passed as default, it works the same way as the eext_circle_object_radius_set() function. Similar to the above example, a circle object with a radius of 50.0 is created. You can get the current radius of the item by using the eext_circle_object_item_radius_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_item_radius_set(circle_obj, "default", 50.0);
          +
          + +

          Disabling a Circle Object

          + +

          You can disable the circle object by using the eext_circle_object_disabled_set() function. Here, a circle object is disabled. You can get the current disabled status of circle object by using the eext_circle_object_disabled_get() function.

          +
          +Evas_Object *circle_obj;
          +
          +circle_obj = eext_circle_object_add(parent, surface);
          +eext_circle_object_disabled_set(circle_obj, EINA_TRUE);
          +
          + +

          You can enable a disabled circle object by using the eext_circle_object_disabled_set() function with EINA_FALSE argument.

          +
          +eext_circle_object_disabled_set(circle_obj, EINA_FALSE);
          +
          + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_option_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_option_wn.htm new file mode 100644 index 0000000..a2730be --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_option_wn.htm @@ -0,0 +1,174 @@ + + + + + + + + + + + + + More Option + + + + + +
          +

          More Option

          + +

          This feature is supported in wearable applications only.

          + +

          The more option is one of the wearable circular UI components. The more option handle can use the elm_layout APIs, because the more option handle is an elm_layout object.

          + +

          The basic view of the more option is shown on the left in the following figure. It simply contains a cue button. When the cue button is clicked, the view including the selector appears from the cue location (shown on the right in the figure).

          + +

          The selector can receive a rotary event, and can emit events when each item and selector are clicked. When the back motion is done in the selector view, the selector view disappears.

          + +

          Figure: More Option

          +

          More Option

          + +

          Adding an Eext More Option Object

          +

          To create a more option object, use the eext_more_option_add() function:

          +
          +Evas_Object *more_option = NULL;
          +more_option = eext_more_option_add(parent);
          +
          + +

          Activating a Rotary Event

          + +

          You do not need to call the eext_rotary_object_event_activated_set() function for the more option object, since it is called automatically according to the elm_panel state.

          + +

          Configuring the More Option

          + +

          To configure the direction of the cue button, use the direction state, which has the following values:

          + +
          • EEXT_MORE_OPTION_DIRECTION_TOP: Cue button is at the top.
          • +
          • EEXT_MORE_OPTION_DIRECTION_BOTTOM: Cue button is at the bottom.
          • +
          • EEXT_MORE_OPTION_DIRECTION_LEFT: Cue button is on the left.
          • +
          • EEXT_MORE_OPTION_DIRECTION_RIGHT: Cue button is on the right (default value).
          + +

          To set the cue button direction for the more option:

          +
          +eext_more_option_direction_set(more_option, EEXT_MORE_OPTION_DIRECTION_RIGHT);
          +
          + +

          The following table shows the customizable more option parts.

          + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Customizable more option parts
          PartSetting functionView
          selector,main_texteext_more_option_item_part_text_set() +

          eext_more_option_item_domain_translatable_part_text_set()

          main_text

          selector,sub_texteext_more_option_item_part_text_set() +

          eext_more_option_item_domain_translatable_part_text_set()

          sub_text

          item,iconeext_more_option_item_part_content_set()

          Item content

          + +

          Adding a More Option Item

          + +

          To add an item, append it with the eext_more_option_item_append() function and set its attributes:

          + +
          +{
          +   Evas_Object *img = NULL;
          +   // Append item
          +   Eext_Object_Item *item  = eext_more_option_item_append(parent);
          +   // Set the text in the rotary_selector
          +   eext_more_option_item_part_text_set(item, "selector,main_text", "test1");
          +   eext_more_option_item_part_text_set(item, "selector,sub_text", "test1");
          +   // Set the content icon
          +   img = elm_image_add(parent);
          +   eext_more_option_item_part_content_set(item, "item,icon", img);
          +   elm_image_file_set(img, "/music_controller_btn_play.png", NULL);
          +}
          +
          + +

          Using the More Option Callbacks

          +

          The more option emits the following signals:

          + +
          • item,selected: User selected the item.
          • +
          • item,clicked: User selected the already selected item again or selected a selector.
          • +
          • more,option,opened: Layout with the rotary selector is shown..
          • +
          • more,option,closed: Layout with the rotary selector is hidden.
          + +

          For all these signals, the event_info parameter returned in the callback is NULL.

          + +

          To register and define a callback function called by the clicked signal:

          + +
          +{
          +   evas_object_smart_callback_add(more_option, “more,option,opened”, _opened_cb, data);
          +}
          +
          +// Callback function for the "more,option,opened" signal
          +// This callback is called when the more_option is seen
          +void 
          +_opened_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Open the More Option\n");
          +}
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_progressbar_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_progressbar_wn.htm new file mode 100644 index 0000000..41a7b9f --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_progressbar_wn.htm @@ -0,0 +1,117 @@ + + + + + + + + + + + + + Circle Progressbar + + + + + +
          +

          Circle Progressbar

          + +

          This feature is supported in wearable applications only.

          + +

          The circle progressbar aims to show the progress status of a given task with circular design. It visualizes the progress status within a range.

          + +

          Figure: Circle Progressbar

          +

          Circle Progressbar

          + +

          Creating a Circle Progressbar

          + +

          You can create the circle progressbar by using the eext_circle_object_progressbar_add() function. When creating the circle progressbar, a surface is necessary to render on the surface.

          +
          +Evas_Object *circle_progressbar, *parent;
          +circle_progressbar = eext_circle_object_progressbar_add(parent, surface);
          +
          + +

          Using the Circle Object Property

          +

          Circle progressbar supports the following circle object API calls:

          +
            +
          • eext_circle_object_value_min_max_set()
          • +
          • eext_circle_object_value_min_max_get()
          • +
          • eext_circle_object_value_set()
          • +
          • eext_circle_object_value_get()
          • +
          • eext_circle_object_angle_min_max_set()
          • +
          • eext_circle_object_angle_min_max_get()
          • +
          • eext_circle_object_angle_offset_set()
          • +
          • eext_circle_object_angle_offset_get()
          • +
          • eext_circle_object_angle_set()
          • +
          • eext_circle_object_angle_get()
          • +
          • eext_circle_object_line_width_set()
          • +
          • eext_circle_object_line_width_get()
          • +
          • eext_circle_object_radius_set()
          • +
          • eext_circle_object_radius_get()
          • +
          • eext_circle_object_color_set()
          • +
          • eext_circle_object_color_get()
          • +
          • eext_circle_object_disabled_set()
          • +
          • eext_circle_object_disabled_get()
          • +
          +

          A circle progressbar has the following items:

          +
            +
          • default: Default circle item that draws the progressbar.
          • +
          • bg: Progress bar background circle item.
          • +
          +

          You can change the properties of the items by using the eext_circle_object_item* APIs.

          +

          For more information, see the Efl Extension Circle Progressbar API.

          + +

          Configuring the Circle Progressbar

          + +

          Before using the circle progressbar, its minimum and maximum values are set with the eext_circle_object_value_min_max_set() function. The current value is set with eext_circle_object_value_set().

          +

          Here, the minimum value is set to 0.0, the maximum value to 100.0, and the current value to 3.0.

          +
          +eext_circle_object_value_min_max_set(circle_progressbar, 0.0, 100.0);
          +eext_circle_object_value_set(circle_progressbar, 3.0);
          +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_rotary_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_rotary_wn.htm new file mode 100644 index 0000000..3f2d039 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_rotary_wn.htm @@ -0,0 +1,239 @@ + + + + + + + + + + + + + Rotary Selector + + + + + +
          +

          Rotary Selector

          + +

          This feature is supported in wearable applications only.

          + +

          The rotary selector is optimized for wearable circular devices. It is composed of a selector and multiple items surrounding the selector. The rotary selector can be used to select an item or to move to the next or prev page through a rotary event.

          + +

          The rotary selector handle can use the elm_layout APIs, because the rotary selector handle is an elm_layout object.

          + +

          Figure: Rotary Selector

          +

          Rotary Selector

          + +

          Creating a Rotary Selector

          + +

          To create a rotary selector, use the eext_rotary_selector_add() function:

          +
          +Evas_Object *rotary_selector, *parent;
          +
          +Rotary_selector = eext_rotary_selector_add(parent);
          +
          + +

          Activating a Rotary Event

          +

          The rotary selector can be activated and deactivated by using the eext_rotary_object_event_activated_set() function. If the second parameter is set to EINA_TRUE, the created rotary selector can also receive a rotary event.

          +
          +eext_rotary_object_event_activated_set(rotary_selector, EINA_TRUE);
          +
          + +

          Configuring the Selector and Item State

          +

          You can configure the selector and item states:

          + +
          • The available selector states are: + +
            • EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL: Selector is in a normal state.
            • +
            • EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED: Selector is in a pressed state.
            + +

            For example, to set the selector color for a normal state selector:

            +
            +eext_rotary_selector_part_color_set(selector, "selector,bg_image", 
            +                                    EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL, 
            +                                    100, 100, 100, 255);
            +
          • +
          • The available selector item states are: +
            • EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL: Item is in a normal state.
            • +
            • EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED: Item is in a pressed state.
            + +

            For example, to set the item color for a normal state item:

            +
            +eext_rotary_selector_item_part_color_set(item, "item,icon", 
            +                                         EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, 
            +                                         100, 100, 100, 255);
            +
          + +

          The following table shows the customizable rotary selector parts.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Customizable rotary selector parts
          PartSetting functionView
          selector,main_texteext_rotary_selector_item_part_color_set()

          main_text

          selector,sub_texteext_rotary_selector_item_part_color_set()

          sub_text

          item,icon +

          item,bg_image

          eext_rotary_selector_item_part_content_set() +

          eext_rotary_selector_item_part_color_set()

          Item content

          selector,icon +

          selector,content

          +

          selector,bg_image

          eext_rotary_selector_part_content_set() +

          eext_rotary_selector_part_color_set()

          +

          eext_rotary_selector_part_content_get()

          Selector content

          + +

          Setting the Rotary Selector Item Text

          + +

          The following table shows the functions you can use to set the main and sub text of an item. The text is displayed in the selector when the item is selected.

          + + + + + + + + + + + + + + + + + + + +
          Table: Item texts
          TextSetting functionView
          selector,main_texteext_rotary_selector_item_part_text_set() +

          eext_rotary_selector_item_domain_translatable_part_text_set()

          main_text

          selector,sub_texteext_rotary_selector_item_part_text_set() +

          eext_rotary_selector_item_domain_translatable_part_text_set()

          sub_text

          + +

          Adding a Rotary Selector Item

          + + + + + + + + + + +
          Note
          A maximum of 11 items can be displayed in one page of the rotary selector. Any exceeding items are arranged in the next page.
          + +

          To add an item, append it with the eext_rotary_selector_item_append() function and set its attributes:

          + +
          +Eext_Object_Item * item;
          +Evas_Object *image;
          +
          +// Append item
          +item = eext_rotary_selector_item_append(rotary_selector);
          +// Set item icon
          +image = elm_image_add(rotary_selector);
          +elm_image_file_set(image, "music_controller_btn_play.png", NULL);
          +
          +eext_rotary_selector_item_part_content_set(item, "item,icon", 
          +                                           EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, image);
          +// Set selector main text
          +eext_rotary_selector_item_part_text_set(item, "selector,main_text", "Options");
          +
          +// Set selector content icon
          +image = elm_image_add(rotary_selector);
          +elm_image_file_set(image, "music_controller_btn.png", NULL);
          +eext_rotary_selector_item_part_content_set(item, "selector,icon", 
          +                                           EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, image);
          +
          + +

          Using the Rotary Selector Callbacks

          +

          The rotary selector emits the following signals:

          + +
          • item,selected: User selected the item.
          • +
          • item,clicked: User clicked the item.
          + +

          For both signals, the event_info parameter returned in the callback is NULL.

          + +

          To register and define a callback function called by the clicked signal

          +
          +{
          +   evas_object_smart_callback_add(rotary_selector, "item,clicked", item_clicked_cb, data);
          +}
          +
          +// Callback function for the "item,clicked" signal
          +// This callback is called when the item is clicked by the user
          +void 
          +item_clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Item clicked\n");
          +}
          +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_scroller_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_scroller_wn.htm new file mode 100644 index 0000000..68e3470 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_scroller_wn.htm @@ -0,0 +1,133 @@ + + + + + + + + + + + + + Circle Scroller + + + + + +
          +

          Circle Scroller

          + +

          This feature is supported in wearable applications only.

          + +

          The circle scroller changes corresponding to the rotary events. It shows the whole scrollable area with a circular scroll bar. It wraps the elm_scroller internally only to draw a circular scroll bar to the edge of the circular screen. This means you can use elm_scroller callbacks and APIs excluding elm_scroller_policy_set() and elm_scroller_policy_get() APIs.

          + +

          Figure: Circle Scroller

          +

          Circle Scroller

          + +

          Creating a Circle Scroller

          + +

          To create a circle scroller, use the eext_circle_object_scroller_add() function. elm_scroller has to be passed by the first parameter of this function.

          +
          +Evas_Object *scroller;
          +Evas_Object *circle_scroller;
          +
          +scroller = elm_scroller_add(parent);
          +circle_scroller = eext_circle_object_scroller_add(scroller, surface);
          +
          + +

          Activating a Rotary Event

          + +

          You can activate and deactivate the circle scroller by using the eext_rotary_object_event_activated_set() function. If the second parameter is EINA_TRUE, the circle scroller can receive the rotary event. Otherwise, the circle scroller cannot receive the rotary event.

          +
          +eext_rotary_object_event_activated_set(circle_scroller, EINA_TRUE);
          +
          + +

          Using the Circle Object Property

          + +

          A circle scroller has the following styles:

          +
            +
          • default
          • +
          +

          When created, the circle scroller has default style automatically.

          + +

          Circle scroller objects support the following circle object API calls:

          +
            +
          • eext_circle_object_line_width_set()
          • +
          • eext_circle_object_line_width_get()
          • +
          • eext_circle_object_radius_set()
          • +
          • eext_circle_object_radius_get()
          • +
          • eext_circle_object_color_set()
          • +
          • eext_circle_object_color_get()
          • +
          • eext_circle_object_disabled_set()
          • +
          • eext_circle_object_disabled_get()
          • +
          +

          A circle slider has the following items:

          +
            +
          • default: Default circle item that draws the vertical scroll bar.
          • +
          • vertical,scroll,bg: Vertical scroll background circle item.
          • +
          • horizontal,scroll,bar: Horizontal scroll bar circle item.
          • +
          • horizontal,scroll,bg : Horizontal scroll background circle item.
          • +
          +

          You can change the properties of the items by using the eext_circle_object_item* APIs.

          +

          For more information, see the Efl Extension Circle Scroller API.

          + +

          Configuring the Circle Scroller

          + +

          You can use elm_scroller APIs to configure a circle scroller, except elm_scroller_policy_set() and elm_scroller_policy_get() APIs.

          +

          Instead of excluded APIs, eext_circle_object_scroller_policy_set() and eext_circle_object_scroller_policy_get() functions are provided for the circle scroller.

          +

          A policy parameter has the following value.

          +
            +
          • ELM_SCROLLER_POLICY_AUTO: indicates the scrollbar is made visible if it is needed, and otherwise is kept hidden.
          • +
          • ELM_SCROLLER_POLICY_ON: Turns the scrollbar on all the time.
          • +
          • ELM_SCROLLER_POLICY_OFF: Turns the scrollbar off. This applies to the horizontal and vertical scrollbars respectively.
          • +
          +

          The following example shows how to set the scroll bar visibility policy to ELM_SCROLLER_POLICY_AUTO for horizontal scroll bar and ELM_SCROLLER_POLICY_OFF for vertical scroll bar.

          +
          +eext_circle_object_scroller_policy_set(circle_scroller, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
          +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_slider_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_slider_wn.htm new file mode 100644 index 0000000..eaa78d2 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_slider_wn.htm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + Circle Slider + + + + + +
          +

          Circle Slider

          + +

          This feature is supported in wearable applications only.

          + +

          The circle slider changes corresponding to rotary events. The circle slider not only extends the UI feature of the elm_slider, but also replaces the functionalities of the elm_slider in a circular design.

          + +

          Figure: Circle Slider

          +

          Circle Slider

          + +

          Adding an Eext Slider Object

          + +

          To create a circle slider, use the eext_circle_object_slider_add() function.

          +
          +Evas_Object *circle_slider = NULL;
          +circle_slider = eext_circle_object_slider_add(parent, surface);
          +
          + +

          Activating a Rotary Event

          + +

          You can activate or deactivate the circle slider by using the eext_rotary_object_event_activated_set() function. If the second parameter is EINA_TRUE, the circle slider can receive the rotary event. Otherwise, the circle slider cannot receive the rotary event.

          +
          +eext_rotary_object_event_activated_set(circle_slider, EINA_TRUE);
          +
          + +

          Using the Circle Slider Property

          + +

          A circle slider has the following styles:

          +
            +
          • default
          • +
          + +

          When created, the circle slider has default style automatically.

          +

          Circle slider objects support the following circle object API calls:

          +
            +
          • eext_circle_object_value_min_max_set()
          • +
          • eext_circle_object_value_min_max_get()
          • +
          • eext_circle_object_value_set()
          • +
          • eext_circle_object_value_get()
          • +
          • eext_circle_object_angle_min_max_set()
          • +
          • eext_circle_object_angle_min_max_get()
          • +
          • eext_circle_object_angle_offset_set()
          • +
          • eext_circle_object_angle_offset_get()
          • +
          • eext_circle_object_angle_set()
          • +
          • eext_circle_object_angle_get()
          • +
          • eext_circle_object_line_width_set()
          • +
          • eext_circle_object_line_width_get()
          • +
          • eext_circle_object_radius_set()
          • +
          • eext_circle_object_radius_get()
          • +
          • eext_circle_object_color_set()
          • +
          • eext_circle_object_color_get()
          • +
          • eext_circle_object_disabled_set()
          • +
          • eext_circle_object_disabled_get()
          • +
          +

          A circle slider has the following items:

          +
            +
          • default: Default circle item, It draws slider bar.
          • +
          • bg: Background circle item.
          • +
          +

          You can change the properties of the items by using eext_circle_object_item* APIs.

          +

          For more information, see the Efl Extension Circle Slider API.

          + +

          Configuring the Circle Slider

          + +

          The circle slider step value is used when the rotary event increases or decreases the circle slider value. It can be set with the eext_circle_object_slider_step_set() function.

          +

          Here, the step value is set to 0.5.

          +
          +eext_circle_object_slider_step_set(circle_slider, 0.5);
          +
          +

          Before using the circle slider, its minimum and maximum values are set with eext_circle_object_value_min_max_set(). The current value is set with eext_circle_object_value_set().

          +

          Here, the minimum value is set to 0.0, the maximum value to 15.0, and the current value to 3.0.

          +
          +eext_circle_object_value_min_max_set(circle_slider, 0.0, 15.0);
          +eext_circle_object_value_set(circle_slider, 3.0);
          +
          +

          You can retrieve the current value of the circle slider with the eext_circle_object_value_get() function.

          +
          +double value = eext_circle_object_value_get(circle_slider);
          +
          + +

          Using Circle Slider Callbacks

          + +

          The circle slider emits the following signal:

          +
            +
          • value,changed: The rotary event changes the circle slider value.
          • +
          +

          For this signal, event_info is NULL.

          +

          This is how to register a callback on the value,changed signal.

          +
          +{
          +   evas_object_smart_callback_add(slider, "value,changed", _value_changed_cb, data);
          +}
          +
          +// Callback function for the "value,changed" signal
          +// This callback is called when a value of the circle slider is changed
          +static void
          +_value_changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Circle slider value changed. \n");
          +}
          +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_spinner_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_spinner_wn.htm new file mode 100644 index 0000000..f7d2cf4 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_spinner_wn.htm @@ -0,0 +1,117 @@ + + + + + + + + + + + + + Circle Spinner + + + + + +
          +

          Circle Spinner

          + +

          This feature is supported in wearable applications only.

          + +

          The circle spinner extends elm_spinner by visualizing the value of elm_spinner. If a rotary event is activated by the eext_rotary_object_event_activated_set() function, the circle spinner increases or decreases the value of elm_spinner through a clockwise or counter-clockwise rotary event.

          + +

          Figure: Circle Spinner

          +

          Circle Spinner

          + +

          Adding an Eext Spinner Object

          + +

          To create a circle spinner:

          +
          1. Create an elm_spinner object.
          2. +
          3. Set the object style as "circle".
          4. +
          5. Create an eext_spinner object using the eext_circle_object_spinner_add() function.
          + +
          +Evas_Object *spinner, *circle_spinner;
          +spinner = elm_spinner_add(parent);
          +elm_object_style_set(spinner, "circle");
          +circle_spinner = eext_circle_object_spinner_add(spinner, surface);
          +
          + +

          Activating a Rotary Event

          + +

          You can activate and deactivate the circle spinner by using the eext_rotary_object_event_activated_set() function. If its second parameter is set to EINA_TRUE, the circle spinner can receive rotary events.

          +
          +eext_rotary_object_event_activated_set(circle_spinner, EINA_TRUE);
          +
          + +

          Configuring the Circle Spinner

          + +

          The circle spinner shows the elm_spinner value through a marker, which indicates the value in the round. It has internal minimum and maximum spinner values, and calculates the min and max angles in order to draw the marker. The current value of the circle spinner is calculated internally as well.

          + +

          To handle the circle spinner value, use the elm_spinner functions. They are synchronized automatically with the user values. You can also use the elm_spinner callback functions.

          + +

          If you want to customize the angle offset of the marker (not to follow the internally-calculated system value), use the eext_circle_object_spinner_angle_set() function. For example, to set the circle spinner angle value with 2.0:

          +
          +eext_circle_object_spinner_angle_set(circle_spinner, 2.0);
          +
          + +

          The formula for calculating the default angle offset of the circle spinner is:

          +
          (360/ max - min) * step
          +

          After calling the eext_circle_object_spinner_angle_set() function, the calculation formula for the angle offset is changed:

          +
          (360/ max - min) * step * 2.0
          + +

          You can also use the same above function to give the angle offset per each rotary callback.

          + +

          Using the Circle Spinner Properties

          + +

          A circle spinner has the default style, which is applied automatically. It also has a default item, which draws a marker.

          + +

          You can set and get various circle spinner properties with circle object functions, such as eext_circle_object_value_min_max_set(), eext_circle_object_value_min_max_get(), eext_circle_object_value_set(), and eext_circle_object_value_get().

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_circ_surface_wn.htm b/org.tizen.ui.practices/html/native/efl/component_circ_surface_wn.htm new file mode 100644 index 0000000..ea82de6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_circ_surface_wn.htm @@ -0,0 +1,136 @@ + + + + + + + + + + + + + Circle Surface + + + + + +
          +

          Circle Surface

          + +

          This feature is supported in wearable applications only.

          + +

          The circle surface manages and renders circle objects. Multiple circle objects can be connected to one circle surface as candidates of an object to be rendered. When one of circle objects is set as visible, the surface renders the circle object and hides the others.

          + +

          Creating a Circle Surface

          + +

          To create a new circle surface:

          +
          +Eext_Circle_Surface *surface;
          +Evas_Object *conformant;
          +
          +conformant = elm_conformant_add(parent);
          +surface = eext_circle_surface_conformant_add(conformant);
          +
          + +

          The eext_circle_surface_conformant_add() function creates a circle surface in the conformant layer. If you want to create a circle surface in the layout layer, use the eext_circle_surface_layout_add() function:

          +
          +Eext_Circle_Surface *surface;
          +Evas_Object *layout;
          +
          +layout = elm_layout_add(parent);
          +surface = eext_circle_surface_layout_add(layout); 
          +
          + +

          If you want to create a circle surface in the naviframe layer, use the eext_circle_surface_naviframe_add() function:

          +
          +Eext_Circle_Surface *surface;
          +Evas_Object *naviframe;
          +
          +naviframe = elm_naviframe_add(parent);
          +surface = eext_circle_surface_naviframe_add(naviframe); 
          +
          + + + + + + + + + + +
          Note
          A circle surface is a non-graphical object. It adds no graphics to or around the objects it holds.
          + +

          Adding Circle Objects to the Circle Surface

          + +

          You can add any circle object to a circle surface. The following example shows how to create an eext_slider component and add it to a circle surface in conformant layer:

          +
          +Eext_Circle_Surface *surface;
          +Evas_Object *slider;
          +
          +surface = eext_circle_surface_conformant_add(conformant);
          +slider = eext_circle_object_slider_add(parent, surface);
          +
          + +

          Deleting the Circle Surface

          + +

          Deleting an Evas object automatically deletes the circle surface in the same layer. However, you can explicitly use the eext_circle_surface_del() function to delete a circle surface.

          +
          +eext_circle_surface_del(surface);
          +
          + + + + + + + + + + +
          Note
          The eext_circle_surface_del() function does not delete the connected circle objects.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_colorselector_mn.htm b/org.tizen.ui.practices/html/native/efl/component_colorselector_mn.htm new file mode 100644 index 0000000..3ddb0af --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_colorselector_mn.htm @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + Colorselector + + + + + + +
          +

          Colorselector

          + +

          This feature is supported in mobile applications only.

          + +

          The colorselector component provides a color selection solution to the user. There are different modes available, each of them showing a different configuration of the colorselector component.

          + +

          Currently only the Palette mode is available in Tizen.

          +
            +
          • ELM_COLORSELECTOR_PALETTE
          • +
          + +

          The Palette mode displays several color items that enable the user to choose a color in the items displayed. It is possible to add new items, or to update the color of the current item. The list of color items is called a palette, and it is associated with a unique identifier. This enables the developers to create new series of colors (a new palette) and save it under another identifier. By default, the color palette is using the default identifier.

          + +

          This UI component inherits from the layout component, so all functions concerning the layout component can also be used on the colorselector component.

          + + +

          Figure: Colorselector component

          +

          Colorselector component

          + +

          Figure: Colorselector hierarchy

          +

          Colorselector hierarchy

          + +

          Adding a Colorselector Component

          + +

          The following example shows how to create a colorselector object.

          + +
          +Evas_Object *colorsel, *parent;
          +
          +colorsel = elm_colorselector_add(parent);
          +
          + +

          Setting the Colorselector Modes

          + +

          The following example shows how to set the mode of the colorselector to the palette mode.

          + +
          +elm_colorselector_mode_set(colorsel, ELM_COLORSELECTOR_PALETTE);
          +
          + +

          The following example shows how to create a new palette called mypalette. This new palette is saved by elementary config and you can to load it again later. You then add three colors in mypalette: red, green, and blue.

          + +
          +elm_colorselector_palette_name_set(colorsel, "mypalette");
          +elm_colorselector_palette_color_add(colorsel, 255, 0, 0, 255);
          +elm_colorselector_palette_color_add(colorsel, 0, 255, 0, 255);
          +elm_colorselector_palette_color_add(colorsel, 0, 0, 255, 255);
          +
          + +

          The default palette already contains 14 colors.

          + +
          +elm_colorselector_palette_name_set(colorsel, "default");
          +
          + +

          When the user clicks on the color elements, the element changes the color that is set to the colorselector component. You can use the following function to retrieve the current selected color.

          +
          +int r, g, b, a;
          +
          +elm_colorselector_color_get(colorsel, &r, &g, &b, &a);
          +
          + +

          Using the Colorselector Callbacks

          + +

          You can register callbacks on the following signals:

          + +
            +
          • changed - The color value changes on the selector. event_info is NULL.
          • +
          • color,item,selected - The user clicks on a color item. The event_info parameter of the callback is the selected color item.
          • +
          • color,item,longpressed - The user long presses on a color item. The event_info parameter of the callback contains the selected color item.
          • +
          + +

          The following example shows how to register a callback on the changed signal.

          +
          +{
          +   evas_object_smart_callback_add(colorselector, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the colorselector value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The color has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_ctxpopup_mn.htm b/org.tizen.ui.practices/html/native/efl/component_ctxpopup_mn.htm new file mode 100644 index 0000000..c9fbc12 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_ctxpopup_mn.htm @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + Ctxpopup + + + + + + +
          +

          Ctxpopup

          + +

          This feature is supported in mobile applications only.

          + +

          Ctxpopup is a contextual popup that can show a list of items.

          + +

          Figure: Context popup component

          +

          Context popup component

          + +

          Figure: Context popup hierarchy

          +

          Context popup hierarchy

          + +

          Adding a Ctxpopup Component

          + +

          A ctxpopup can be created with the elm_ctxpopup_add() function, and when shown, it automatically chooses an area inside its parent object's view (set using elm_ctxpopup_hover_parent_set()) to optimally fit into it.

          + +
          +Evas_Object *ctxpopup, *parent;
          +
          +// Create a ctxpopup 
          +ctxpopup = elm_ctxpopup_add(parent);
          +
          + +

          Modifying the Ctxpopup Style

          + +

          The following styles are available:

          + +
            +
          • dropdown/list
          • +
          • dropdown/label
          • +
          • more/default
          • +
          + +

          Figure: Context popup more/default style

          +

          Context popup more/default style

          + +

          Figure: Context popup dropdown/list

          +

          Context popup dropdown/list

          + +

          Figure: Context popup dropdown/label

          +

          Context popup dropdown/label

          + +

          The following example shows how to set the more/default style.

          + +
          +elm_object_style_set(ctxpopup, "more/default");
          +
          + +

          Configuring the Ctxpopup

          + +

          The context popup orientation can be set with elm_ctxpopup_horizontal_set(). Here it is set to horizontal.

          +
          +elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
          +
          + +

          Auto hide is enabled by default. You can also disable auto hiding if you want the ctxpopup never to be hidden.

          +
          +elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
          +
          + +

          Managing the Ctxpopup Items

          + +

          The ctxpopup can contain a small number of items. Each of them can have a label and an icon. The following example shows how to append an item with the Test label and no icon.

          +
          +Elm_Object_Item *it;
          +
          +it = elm_ctxpopup_item_append(ctxpopup, "test", NULL, _ctxpopup_item_cb,
          +                  NULL);
          +
          + +

          The _ctxpopup_item_cb() callback is called when the item is clicked. The following example shows how to write the definition of this callback.

          +
          +static void
          +_ctxpopup_item_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "ctxpopup item selected\n");
          +}
          +
          + +

          After that the item label is set to New label.

          + +
          elm_object_item_part_text_set(it, "default", "New label");
          +
          + +

          And its icon is modified to the standard home icon.

          + +
          +Evas_Object *home_icon = elm_icon_add(ctxpopup);
          +elm_icon_standard_set(home_icon, "home");
          +
          +elm_object_item_part_content_set(it, "icon", home_icon);
          +
          + +

          Using the Ctxpopup Callbacks

          + +

          The context popup emits the dismissed signal when it is dismissed. You can register a callback to this signal. The event_info parameter is NULL.

          + +
          +{
          +   evas_object_smart_callback_add(ctxpopup, "dismissed", dismissed_cb, data);
          +}
          +
          +// Callback function for the "dismissed" signal
          +// This callback is called when the ctxpopup is dismissed
          +void dismissed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Ctxpopup dismissed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_ctxpopup_wn.htm b/org.tizen.ui.practices/html/native/efl/component_ctxpopup_wn.htm new file mode 100644 index 0000000..d371cd0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_ctxpopup_wn.htm @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + Ctxpopup + + + + + + +
          +

          Ctxpopup

          + +

          This feature is supported in wearable applications only.

          + +

          Ctxpopup is a contextual popup that can show a list of items.

          + +

          Figure: Context popup component

          +

          Context popup component

          + +

          Figure: Context popup hierarchy

          +

          Context popup hierarchy

          + +

          Adding a Ctxpopup Component

          + +

          A ctxpopup can be created with the elm_ctxpopup_add() function, and when shown, it automatically chooses an area inside its parent object's view (set using elm_ctxpopup_hover_parent_set()) to optimally fit into it.

          + +
          +Evas_Object *ctxpopup, *parent;
          +
          +// Create a ctxpopup 
          +ctxpopup = elm_ctxpopup_add(parent);
          +
          + +

          Modifying the Ctxpopup Style

          + +

          The following styles are available for the rectangular UI component:

          +
            +
          • default
          • +
          +

          The following styles are available for the circular UI component:

          +
            +
          • select_mode
          • +
          • select_mode/top, select_mode/bottom (These two styles can be used as a pair.)
          • +
          + + +

          The following example shows how to set the default style.

          +
          +elm_object_style_set(ctxpopup, "default");
          +
          + +

          Configuring the Ctxpopup

          + +

          The context popup orientation can be set with elm_ctxpopup_horizontal_set(). Here it is set to horizontal.

          +
          +elm_ctxpopup_horizontal_set(ctxpopup, EINA_TRUE);
          +
          + +

          Auto hide is enabled by default. You can also disable auto hiding if you want the ctxpopup never to be hidden.

          +
          +elm_ctxpopup_auto_hide_disabled_set(ctxpopup, EINA_TRUE);
          +
          + +

          Managing the Ctxpopup Items

          + +

          The ctxpopup can contain a small number of items. Each of them can have a label and an icon. The following example shows how to append an item with the Test label and no icon.

          +
          +Elm_Object_Item *it;
          +
          +it = elm_ctxpopup_item_append(ctxpopup, "test", NULL, _ctxpopup_item_cb, 
          +                  NULL);
          +
          + +

          The _ctxpopup_item_cb() callback is called when the item is clicked. The following example shows how to write the definition of this callback.

          +
          +static void
          +_ctxpopup_item_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "ctxpopup item selected\n");
          +}
          +
          + +

          After that the item label is set to New label.

          +
          elm_object_item_part_text_set(it, "default", "New label");
          +
          + +

          And its icon is modified to the standard home icon.

          +
          +Evas_Object *home_icon = elm_icon_add(ctxpopup);
          +elm_icon_standard_set(home_icon, "home");
          +
          +elm_object_item_part_content_set(it, "icon", home_icon);
          +
          + +

          Using the Ctxpopup Callbacks

          + +

          The context popup emits the dismissed signal when it is dismissed. You can register a callback to this signal. The event_info parameter is NULL.

          + +
          +{
          +   evas_object_smart_callback_add(ctxpopup, "dismissed", dismissed_cb, data);
          +}
          +
          +// Callback function for the "dismissed" signal
          +// This callback is called when the ctxpopup is dismissed
          +void dismissed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Ctxpopup dismissed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_custom_n.htm b/org.tizen.ui.practices/html/native/efl/component_custom_n.htm new file mode 100644 index 0000000..477f0ab --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_custom_n.htm @@ -0,0 +1,560 @@ + + + + + + + + + + + + + Customizing Components + + + + + +
          + +

          Customizing Components

          + + +

          Elementary UI components use the Edje library EDC themes to manage their look.

          + +

          Elementary Theme

          + +

          An Elementary theme is an Edje EDC file that contains groups composed of parts and programs. For more information about Edje, see Theme.

          + +

          Using Theme Styles

          + +

          Elementary UI components provide a way to modify only some parts of the styles using the default theme. A style is a part of the EDC theme (a group) that concerns only one UI component. For example, you can create a new style for a button component to change its appearance without modifying the default theme.

          + + + + + + + + + + +
          Note
          When creating a new style, knowledge of how each UI component is themed is required, because setting another style always replaces the entire group used by the UI component. Important signals and parts must be there for the object to behave properly.
          + +

          When several styles are loaded in the current theme, you can set a different style to a specific UI component using the elm_object_style_set() function. It is also possible to see the current style with the elm_object_style_get() function.

          + +

          The default theme specifies several styles for the button component. The code below shows how to set the "anchor" style of a newly created button component.

          + +
          +Evas_Object *parent, *button;
          +
          +// Create a button object 
          +button = elm_button_add(parent);
          +
          +// Set its style to "anchor""
          +elm_object_style_set(button, "anchor");
          +
          + +

          Loading Theme Styles

          + +

          Once written and compiled with Edje tools, the Elementary provides two methods to load the style in the application theme:

          +
            +
          • overlays
          • +
          • extensions
          • +
          + +

          When looking for a theme, the Elementary checks the list of overlays, if any are defined. Then it takes the default theme, and if it cannot find a theme for the UI component, it looks at the extensions list.

          + +

          Overlay

          + +

          An overlay can replace the look of all UI components by overriding the default style. If we create a new style called "default" for the button component and add it as an overlay, the Elementary uses the overlay for all button components overriding the default theme.

          + +

          Here is how to add an overlay to your application's theme.

          + +
          +elm_theme_overlay_add(NULL, "./theme_button.edj");
          +
          + + + + + + + + + + +
          Note
          Here we assume that the "theme_button.edj" file only contains a new theme for the button component.
          + + + + + + + + + + +
          Note
          Doing this is not recommended. Adding a file as an overlay makes the Elementary use the new theme for all the button components defined in the application. You must make sure that the "theme_button.edj" file reimplements everything that was previously defined in the default theme concerning the button component.
          + +

          This is how to remove the previously added overlay to return to the default theme.

          + +
          +elm_theme_overlay_del(NULL, "./theme_button.edj");
          +
          + +

          Extension

          + +

          With extensions, we can write styles that we can apply to some UI components (not all of them) by using the elm_object_style_set() function.

          + +

          The application adds a theme to the list of extensions with the following call.

          + +
          +elm_theme_extension_add(NULL, "./theme_button_style_custom.edj");
          +
          + + + + + + + + + + +
          Note
          Here we assume that the "theme_button_style_custom.edj" file contains a new button style called "custom".
          + +

          This is how to use the new "custom" style on a button component.

          + +
          +Evas_Object *parent, *button;
          +
          +// Create a button object 
          +button = elm_button_add(parent);
          +
          +// Set its style to "custom" 
          +elm_object_style_set(button, "custom");
          +
          + + + + + + + + + + +
          Note
          When using elm_theme_extension_add or elm_theme_overlay_add to add a new theme extension or overlay to a Theme object (here called the default theme), the Elementary calls the elm_theme_flush function to flush Elementary theme caches. Thus, the theme of all UI components that use the default theme is reloaded.
          + +

          Creating a New Theme

          + +

          This is how to create a new theme object.

          + +
          +Elm_Theme *new_theme = elm_theme_new();
          +
          + +

          This function creates an empty specific theme that only uses the default theme. It has its own private set of extensions and overlays (which are empty by default). Specific themes do not fall back to the themes of parent objects. They are not intended for this use.

          + +

          This is how to apply this theme to a UI component and its children (a button, for example).

          + +
          +// Create a button component 
          +Evas_Object *button = elm_button_add();
          +
          +// Set the new theme to the button component 
          +elm_object_theme_set(button, new_theme);
          +
          + +

          Customizing a UI Component Style

          + +

          UI component themes are written in Edje EDC source files (.edc). These files are compiled with Edje tools to make an .edj file that is used by the application. For more information on using the EDC language, see Theme.

          + +

          A new Edje style can be added for a UI component. The best way is to copy the existing "default" style, rename it, and update it to your needs.

          + +

          Creating a Customized Style for the Check Component

          + +

          As an example, we show how to create a new style for the check component. The aim is to update the background and the main pictures of this UI component with custom pictures.

          + +

          The EDC source file concerning the check component (check.edc file) is composed of several groups.

          + +
          +group 
          +{
          +   name: "elm/check/base/default";
          +}
          +
          +group 
          +{
          +   name: "elm/check/base/toggle";
          +}
          +
          + +

          Those two groups define two different styles for the check component (the "default" style and the "toggle" style).

          + +

          We copy the group corresponding to the "default" style in a new file to create a new style called "custom". This new style is saved in the "check_custom.edc" file.

          + +
          +group 
          +{
          +   name: "elm/check/base/custom";
          +   // Here is the copy of the content of "default" style 
          +}
          +
          + +

          In the new group ("elm/check/base/custom"), we have to find the parts we want to modify. Here, the appropriate parts are "bg" and "check" parts.

          + +
          +part 
          +{
          +   name: "bg";
          +   mouse_events: 0;
          +   scale: 1;
          +   description 
          +   {
          +      state: "default" 0.0;
          +      rel1.offset: 1 1;
          +      rel2.relative: 0.0 1.0;
          +      rel2.offset: 1 -2;
          +      align: 0.0 0.5;
          +      min: 16 16;
          +      max: 16 16;
          +      aspect: 1.0 1.0;
          +      aspect_preference: VERTICAL;
          +      image 
          +      {
          +         normal: "check_base.png";
          +         border: 5 5 5 5;
          +         middle: 0;
          +      }
          +      fill.smooth: 0;
          +   }
          +}
          +part 
          +{
          +   name: "check";
          +   mouse_events: 0;
          +   scale: 1;
          +   description 
          +   { 
          +      state: "default" 0.0;
          +      rel1 
          +      {
          +         to: "bg";
          +         offset: 1 1;
          +      }
          +      rel2 
          +      {
          +         to: "bg";
          +         offset: -2 -2;
          +      }
          +      visible: 0;
          +      color: 255 255 255 255;
          +      image.normal: "check.png";
          +   }
          +   description 
          +   {
          +      state: "visible" 0.0;
          +      inherit: "default" 0.0;
          +      visible: 1;
          +   }
          +   description 
          +   {
          +      state: "disabled" 0.0;
          +      inherit: "default" 0.0;
          +      visible: 0;
          +      color: 128 128 128 128;
          +   }
          +   description 
          +   {
          +      state: "disabled_visible" 0.0;
          +      inherit: "default" 0.0;
          +      color: 128 128 128 128;
          +      visible: 1;
          +   }
          +}
          +
          + +

          We do not detail all the options that can be modified here, but assume that the user is familiar with Edje and knows Edje basics.

          + +

          Our custom pictures filenames are:

          +
            +
          • check_base_custom.png for the bg part
          • +
          • check_custom.png for the check part
          + +

          We must update the image.normal attribute in both parts with our custom pictures filenames to modify the pictures of this style.

          + +
          +part 
          +{
          +   name: "bg";   
          +   description 
          +   {
          +      state: "default" 0.0;
          +
          +      image 
          +      {
          +         normal: "check_base_custom.png";
          +         border: 5 5 5 5;
          +         middle: 0;
          +      }
          +                
          +   }
          +}
          +part 
          +{
          +   name: "check";
          +        
          +   description 
          +   {
          +      state: "default" 0.0;
          +            
          +      image.normal: "check_custom.png";
          +   }
          +        
          +}
          +
          + + + + + + + + + + +
          Note
          Here, we assume that the custom images are the same size as the "default" images.
          + +

          Adding the Theme File to Your Project

          + +

          Once written, the check_custom.edc file is put in the /res/edje/. directory of the application project in the SDK.

          + +

          When building the application, the SDK calls the Edje tools automatically to build the final check_custom.edj file. This file can be loaded from our application.

          + +

          Using the New Style

          + +

          This is how to add the new theme file as an extension in the application.

          + +
          +char edj_path[PATH_MAX] = {0, };
          +
          +// Get the full path of the edj file 
          +app_get_resource("/edje/check_custom.edj", edj_path, (int)PATH_MAX);
          +
          +// Load check custom style as an extension 
          +elm_theme_extension_add(NULL, edj_path);
          +
          + +

          Use the "custom" style on a new check component.

          + +
          +Evas_Object *parent, *check;
          +
          +// Create a check object 
          +check = elm_check_add(parent);
          +
          +// Set its style to "custom" 
          +elm_object_style_set(check, "custom");
          +
          + +

          Special Theme Parts

          + +

          Some parts of the EDC file can be interacted with the Elementary. The content of parts of the type TEXT are modified using the elm_object_part_set_text() function. The content of SWALLOW parts is updated using the elm_object_part_content_set() function.

          + +

          Swallow Parts

          + +

          In the previous example (the check component "default" style), there is a part called "elm.swallow.content" that is of the type SWALLOW.

          + +
          +part 
          +{
          +   name: "elm.swallow.content";
          +   type: SWALLOW;
          +   scale: 1;
          +   description 
          +   {
          +      state: "default" 0.0;
          +      fixed: 1 0;
          +      visible: 0;
          +      align: 0.0 0.5;
          +      rel1.to_x: "bg";
          +      rel1.relative: 1.0 0.0;
          +      rel1.offset: 1 1;
          +      rel2.to_x: "bg";
          +      rel2.offset: 1 -2;
          +      rel2.relative: 1.0 1.0;
          +   }
          +   description
          +   {
          +      state: "visible" 0.0;
          +      inherit: "default" 0.0;
          +      fixed: 1 0;
          +      visible: 1;
          +      aspect: 1.0 1.0;
          +      min: 16 16;
          +   }
          +   description 
          +   {
          +      state: "disabled" 0.0;
          +      inherit: "default" 0.0;
          +      color: 255 255 255 128;
          +   }
          +   description 
          +   {
          +      state: "disabled_visible" 0.0;
          +      inherit: "default" 0.0;
          +      color: 255 255 255 128;
          +      fixed: 1 0;
          +      visible: 1;
          +      aspect: 1.0 1.0;
          +   }
          +}
          +
          + +

          We can push content (Evas_Object) to this part from the application anytime. The size and position of the content pushed is controlled by the EDC theme.

          + +
          +Evas_Object *parent, *check1, *content;
          +
          +// Create a check object 
          +check1 = elm_check_add(parent);
          +
          +// Set the content of the check object 
          +elm_object_part_content_set(check1, "elm.swallow.content", content);
          +
          + + + + + + + + + + +
          Note
          We can add new SWALLOW parts when customizing a UI component's style, if we want to be able to control more content from the application. Note that removing existing SWALLOW parts changes the UI component's behavior.
          + +

          Text Parts

          + +

          The same is done with parts of the type TEXT. The check "default" style contains a part named "elm.text".

          + +
          +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: 1 1;
          +      rel2.relative: 1.0 1.0;
          +      rel2.offset: -2 -2;
          +      color: 0 0 0 255;
          +      text 
          +      {
          +         font: "Sans,Edje-Vera";
          +         size: 10;
          +         min: 0 1;
          +         align: -1.0 0.5;
          +      }
          +   }
          +   description
          +   {
          +      state: "visible" 0.0;
          +      inherit: "default" 0.0;
          +      visible: 1;
          +      text.min: 1 1;
          +   }
          +   description 
          +   {
          +      state: "disabled" 0.0;
          +      inherit: "default" 0.0;
          +      color: 0 0 0 128;
          +      color3: 0 0 0 0;
          +   }
          +   description
          +   {
          +      state: "disabled_visible" 0.0;
          +      inherit: "default" 0.0;
          +      color: 0 0 0 128;
          +      color3: 0 0 0 0;
          +      visible: 1;
          +      text.min: 1 1;
          +   }
          +}
          +
          + +

          This is how to modify the content of the "elm.text" part from the application. The position of the text, its size, color, look and feel are managed by the EDC theme.

          + +
          +Evas_Object *parent, *check2;
          +
          +// Create a check object 
          +check2 = elm_check_add(parent);
          +
          +// Set the text of the check object 
          +elm_object_part_text_set(check2, "elm.text", "Test text");
          +
          + + +

          For more details about customizing the look and feel of the UI components with custom styles, which are not provided as defaults, see the ThemeExtension sample.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_datetime_mn.htm b/org.tizen.ui.practices/html/native/efl/component_datetime_mn.htm new file mode 100644 index 0000000..79d12e0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_datetime_mn.htm @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + Datetime + + + + + + +
          +

          Datetime

          + +

          This feature is supported in mobile applications only.

          + +

          The datetime component displays and adds date and time values.

          + +

          Figure: Datetime selection

          +

          Datetime selection

          + +

          Figure: Datetime hierarchy

          +

          Datetime hierarchy

          + +

          Adding a Datetime Component

          + +

          The UI component is created with elm_datetime_add(). It is possible to select the visible fields with elm_datetime_field_visible_set(). The following fields can be controlled:

          +
            +
          • ELM_DATETIME_YEAR: the year field
          • +
          • ELM_DATETIME_MONTH: the month field
          • +
          • ELM_DATETIME_DATE: the date field
          • +
          • ELM_DATETIME_HOUR: the hour field
          • +
          • ELM_DATETIME_MINUTE: the minute field
          • +
          • ELM_DATETIME_AMPM: the AM/PM field
          • +
          + +

          The following example shows how to create a datetime component and set the HOUR and MINUTE fields visible.

          + +
          +Evas_Object *datetime, *parent;
          +
          +datetime = elm_datetime_add(parent);
          +
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_HOUR, EINA_TRUE);
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_MINUTE, EINA_TRUE);
          +
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_YEAR, EINA_FALSE);
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_MONTH, EINA_FALSE);
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_DATE, EINA_FALSE);
          +elm_datetime_field_visible_set(datetime, ELM_DATETIME_AMPM, EINA_FALSE);
          +
          + +

          Using the Datetime Styles

          + +

          The following styles are available:

          +
            +
          • date_layout
          • +
          • time_layout
          • +
          • time_layout_24h
          • +
          + +

          The following example creates the date_layout style:

          + +
          +elm_object_style_set(datetime, "date_layout");
          +
          + +

          Setting the Datetime Format

          + +

          The format of the date and time can be configured with elm_datetime_format_set() using a combination of allowed Libc date format specifiers. In the following example the format is set to HH : MM.

          + +
          +elm_datetime_format_set(datetime, "%H : %M");
          +
          + +

          Please refer to the API documentation for a complete list of all the options available.

          + +

          Using the Datetime Callbacks

          + +

          A callback can be registered on the changed signal to detect when the Datetime field values are changed. The event_info parameter is NULL.

          + +
          +{
          +   evas_object_smart_callback_add(datetime, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the datetime fields change
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Datetime field changed. \n");
          +}
          + +

          The language,changed signal is emitted when the system locale changes.

          + + +

          UX Issue in Tizen 2.3

          + +
            +
          • date_layout (default): Year, Month, Day
          • +
          • time_layout: Hour, Minute, AM/PM button
          • +
          • time_layout_24hr: Hour, Minute
          • +
          + +

          Basically, the elm_datetime component needs a full-length format that includes the Year, Month, Day, Hour, Minute, and AM/PM. Each style then shows specific fields according their style, limited by the UX concept. If you call the elm_datetime_field_visible_set() function for a field that is not supported in the style, it does not work.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_datetime_wn.htm b/org.tizen.ui.practices/html/native/efl/component_datetime_wn.htm new file mode 100644 index 0000000..ab58ada --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_datetime_wn.htm @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + Datetime + + + + + + +
          +

          Datetime

          + +

          This feature is supported in wearable applications only.

          + +

          The datetime component displays and adds date and time values.

          + + +

          Figure: Datetime selection

          +

          Datetime selection

          + +

          Figure: Datetime hierarchy

          +

          Datetime hierarchy

          + +

          Adding a Datetime Component

          + +

          The UI component is created with elm_datetime_add().

          +

          The following fields can be controlled:

          +
            +
          • ELM_DATETIME_YEAR: the year field
          • +
          • ELM_DATETIME_MONTH: the month field
          • +
          • ELM_DATETIME_DATE: the date field
          • +
          • ELM_DATETIME_HOUR: the hour field
          • +
          • ELM_DATETIME_MINUTE: the minute field
          • +
          • ELM_DATETIME_AMPM: the AM/PM field
          • +
          + +

          Using the Datetime Styles

          + +

          The following styles are available:

          +
            +
          • datepicker_layout
          • +
          • timepicker_layout
          • +
          + +

          The following example creates the datepicker_layout style:

          +
          +elm_object_style_set(datetime, "datepicker_layout");
          +
          + +

          Setting the Datetime Format

          + +

          The format of the date and time can be configured with elm_datetime_format_set() using a combination of allowed Libc date format specifiers. In the following example the format is set to HH : MM.

          +
          +elm_object_style_set(datetime, "timepicker_layout");
          +elm_datetime_format_set(datetime, "%d/%b/%Y%I:%M");
          +
          +

          Please refer to the API documentation for a complete list of all the options available.

          + +

          Using the Datetime Callbacks

          + +

          A callback can be registered on the changed signal to detect when the Datetime field values are changed. The event_info parameter is NULL.

          +
          +{
          +   evas_object_smart_callback_add(datetime, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the datetime fields change
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Datetime field changed. \n");
          +}
          + +

          The language,changed signal is emitted when the system locale changes.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_entry_mn.htm b/org.tizen.ui.practices/html/native/efl/component_entry_mn.htm new file mode 100644 index 0000000..201db3b --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_entry_mn.htm @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + Entry + + + + + + +
          +

          Entry

          + +

          This feature is supported in mobile applications only.

          + +

          The entry component is a box where the user can enter text. It supports the following features:

          +
            +
          • text wrapping
          • +
          • multiline
          • +
          • scrolling
          • +
          • formatted markup text
          • +
          • password mode
          • +
          • filtering text
          • +
          • read/write from a file
          • +
          • theme style overrides
          • +
          + +

          Figure: Entry component

          +

          Entry component

          + +

          Figure: Entry component

          +

          Entry component

          + +

          Figure: Entry hierarchy

          +

          Entry hierarchy

          + +

          Adding an Entry Component

          + +

          The entry component is created with the elm_entry_add() function, and the text inside the entry can be set with elm_entry_entry_set().

          + +
          +Evas_Object *entry, *parent;
          +
          +entry = elm_entry_add(parent);
          +elm_entry_entry_set(entry, "A short text.");
          +
          + +

          Using the Text Editor

          + +

          You can append text to the end of existing content.

          + +
          +elm_entry_entry_append(entry, "END");
          +
          + +

          You can also insert text at the current cursor position.

          + +
          +elm_entry_entry_insert(entry, "CURSOR");
          +Eina_Bool Empty = elm_entry_is_empty(entry);
          +
          + +

          Call elm_entry_is_empty() to see whether the entry is empty. Here, the boolean variable Empty returns EINA_FALSE.

          + +

          By default, the user can enter text in the entry component when it is in focus. It is possible to prevent the user from editing text if needed.

          + +
          +elm_entry_editable_set(entry, EINA_FALSE);
          +
          + + + + + + + + + + +
          Note
          It is still possible to use the previous functions to modify the text of a non-editable entry.
          + +

          Setting the Password Mode

          + +

          When dealing with password content, the password mode activates to hide what the user is typing. In this mode, the display of any text is replaced by asterisks (*), and the entry is single line (there is no line wrap).

          + +
          +elm_entry_password_set(entry, EINA_TRUE);
          +
          + +

          Entry Line Modes And Wrapping

          + +

          The entry component has two line modes:

          +
            +
          • single line mode
          • +
          • multiline mode
          • +
          + +

          First, set the entry in single line mode.

          + +
          +elm_entry_single_line_set(entry, EINA_TRUE);
          +
          + +

          In this mode, the text does not wrap when reaching the edge, but the entry grows horizontally instead. Pressing the Enter key in this mode generates an activate event instead of adding a new line.

          + +

          When the entry is set to multiline mode (single line off), the text wraps at the end of the entry and pressing Enter creates a new line.

          + +
          +elm_entry_single_line_set(entry, EINA_FALSE);
          +elm_entry_line_wrap_set(entry, ELM_WRAP_WORD);
          +
          + +

          In multiline entries, elm_entry_line_wrap_set() provides a way to cut the text implicitly into a new line when it reaches the far edge of the UI component. The following wrap modes are available:

          +
            +
          • ELM_WRAP_NONE: No wrap
          • +
          • ELM_WRAP_CHAR: Wrap between characters
          • +
          • ELM_WRAP_WORD: Wrap in allowed wrapping points (as defined in the unicode standard)
          • +
          • ELM_WRAP_MIXED: Word wrap, and if that fails, char wrap
          • +
          + +

          Selecting Text

          + +

          Text selections can be made with different functions:

          +
            +
          • To select all the content of the entry component: +
            +elm_entry_select_all(entry);
            +
            +
          • + +
          • To deselect the current selection: +
            +elm_entry_select_none(entry);
            +
            +
          • + +
          • To select part of the text, use elm_entry_select_region_set(). The following code selects the first twenty characters of the entry content. +
            +elm_entry_select_region_set(entry, 0, 20);
            +
            +
          • + +
          • To retrieve the currently selected text in an entry: +
            +const char *selection;
            +
            +selection = elm_entry_selection_get(entry);
            +
            +
          • +
          + +

          If the entry text is empty, elm_entry_selection_get() returns NULL.

          + +

          You can copy or cut the selection to the clipboard.

          +
          +elm_entry_selection_cut(entry);
          +
          + +

          The selection can be pasted in the same or a different entry.

          +
          +elm_entry_selection_paste(entry);
          +
          + +

          Controlling the Cursor

          + +

          The cursor represents the current position in the entry, where the next action, for example, text insertion or deletion, is done. Usually, the cursor is represented as a blinking character, but its appearance depends on the theme configuration. The cursor position can be modified by using several functions.

          +
            +
          • To move the cursor to the beginning of the entry: +
            +elm_entry_cursor_begin_set(entry);
            +
            +
          • + +
          • To move the cursor to the end of the entry: +
            +elm_entry_cursor_end_set(entry);
            +
            +
          • + +
          • To move the cursor one line down or up: +
            +elm_entry_cursor_down(entry);
            +elm_entry_cursor_up(entry);
            +
            +
          • +
          • To move the cursor one character to the left or right: +
            +elm_entry_cursor_prev(entry);
            +elm_entry_cursor_next(entry);
            +
            +
          • + +
          • To set the cursor at a specific position (15th character, for example): +
            +elm_entry_cursor_pos_set(entry, 15);
            +
            +
          • +
          + +

          It is possible to start a selection at the current cursor position, move five characters to the right and end the selection.

          + +
          +elm_entry_cursor_selection_begin(entry);
          +
          +for (i = 0; i < 5; i++)
          +{
          +   elm_entry_cursor_next(entry);
          +}
          +
          +elm_entry_cursor_selection_end(entry);
          +
          + +

          Formatting Text

          + +

          Text within an entry can be formatted by using markups tags that are defined in the theme. The following markups are available:

          +
            +
          • <br>: Inserts a line break.
          • +
          • <ps>: Inserts a paragraph separator. This is preferred over line breaks.
          • +
          • <tab>: Inserts a tab.
          • +
          • <em>...</em>: Emphasis. Sets the oblique style for the enclosed text.
          • +
          • <b>...</b>: Sets the bold style for the enclosed text.
          • +
          • <link>...</link>: Underlines the enclosed text.
          • +
          • <hilight>...</hilight>: Highlights the enclosed text.
          • +
          + +

          Using Special Markups

          + +

          Special markups can be added within the text of the entry:

          +
            +
          • <a href = ..>...</a>: Anchors
          • +
          • <item size = .. vsize = .. href = ..>...</item>: Items
          • +
          + +

          The anchors generate an anchor,clicked signal when the user clicks on them. The href attribute is used to identify the anchor. It also reacts to the anchor,in (mouse in), anchor,out (mouse out), anchor,down (mouse down), and anchor,up (mouse up) events.

          + +

          The item markup provides a way to insert any Evas_Object in the text. The Evas_Object name has to be specified in the href attribute.

          + +

          Overriding Style

          + +

          To tweak the style of the text within the entry component, it is possible to override parts of the theme style to the textblock object by using elm_entry_text_style_user_push(). This function pushes a new style on top of the user style stack that overrides the current style. Remove the style in the top of user style stack with elm_entry_text_style_user_pop().

          + +

          Filtering Text

          + +

          Text within an entry can be filtered in size. The following example sets the maximum number of characters allowed in the entry to 8.

          + +
          +static Elm_Entry_Filter_Limit_Size limit_size = 
          +{
          +   .max_char_count = 8,
          +   .max_byte_count = 0
          +};
          +
          +// Append a new callback to the list, this function is called each time
          +// a text is inserted in the entry. Pass the limit_size struct previously
          +// created to set the maximum number of characters allowed to 8
          + 
          +elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, limit_size);
          +
          + +

          The content can be filtered by passing an Elm_Entry_Filter_Accept_Set structure. This structure contains the accepted characters and rejected characters. The following example shows how to reject the '+', '-', '*', and '/' characters.

          +
          +static Elm_Entry_Filter_Accept_Set accept_set = 
          +{
          +   .accepted = NULL,
          +   .rejected = "+*-/"
          +};
          +
          +elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, accept_set);
          +
          + +

          Loading and Saving Files

          + +

          The entry content can be saved to a file (/tmp/test.txt, for example).

          + +
          +// Set the file in which the entry text is saved. This function
          +// implicitly loads the existing file content 
          +elm_entry_file_set(entry, "/tmp/test.txt", ELM_TEXT_FORMAT_MARKUP_UTF8);
          +
          + +

          Autosave is activated by default and changes are written back to the file after a short delay. This feature can be deactivated and you can manually save the content when needed.

          + +
          +// Disable autosaving 
          +elm_entry_autosave_set(entry, EINA_FALSE);
          +
          +// Trigger saving when needed 
          +elm_entry_file_save(entry);
          +
          + +

          Using Entry Theme Content

          + +

          Two content parts of the default theme are available: icon and end. The following example shows how to set an icon in the end content part.

          +
          +Evas_Object *icon;
          +
          +ic = elm_icon_add(entry);
          +elm_image_file_set(ic, "icon.png", NULL);
          +elm_object_part_content_set(entry, "end", icon);
          +
          + +

          Using Entry Theme Texts

          + +

          The default theme allows the use of the following text parts:

          +
            +
          • default - text of the entry
          • +
          • guide - placeholder of the entry
          • +
          + +

          The following example shows how to set the placeholder text of the entry to Hello World.

          + +
          +elm_object_part_text_set(entry, "Hello World");
          +
          + +

          Using Entry Callbacks

          + +

          The entry component emits the following signals:

          +
            +
          • aborted: The escape key is pressed on a single line entry.
          • +
          • activated: The enter key is pressed on a single line entry.
          • +
          • anchor,clicked: An anchor is clicked. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,down: Mouse button is pressed on an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,hover,opened: The anchor is clicked. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,in: Mouse cursor is moved into an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,out: Mouse cursor is moved out of an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,up: Mouse button is unpressed on an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • changed: The text within the entry is changed.
          • +
          • changed,user: The text within the entry is changed because of user interaction. event_info points to an object of the type Edje_Entry_Change_Info.
          • +
          • clicked: The entry is clicked (mouse press and release).
          • +
          • clicked,double: The entry is double clicked.
          • +
          • clicked,triple: The entry is triple clicked.
          • +
          • cursor,changed: The cursor position is changed.
          • +
          • cursor,changed,manual: The cursor position is changed manually.
          • +
          • focused: The entry receives focus. event_info points to an object of the type Elm_Focus_Info.
          • +
          • unfocused: The entry loses focus.
          • +
          • language,changed: Program language is changed.
          • +
          • longpressed: A mouse button is pressed and held for a couple of seconds.
          • +
          • maxlength,reached: A maximum length is reached.
          • +
          • preedit,changed: The preedit string is changed.
          • +
          • press: A mouse button is pressed on the entry.
          • +
          • redo,request: The request is redone.
          • +
          • selection,changed: The current selection is changed.
          • +
          • selection,cleared: The current selection is cleared.
          • +
          • selection,copy: A copy of the selected text into the clipboard is requested.
          • +
          • selection,cut: A cut of the selected text into the clipboard is requested.
          • +
          • selection,paste: A paste of the clipboard contents is requested.
          • +
          • selection,start: A selection is begun and no previous selection exists.
          • +
          • text,set,done: The whole text is set to the entry.
          • +
          • theme,changed: The theme is changed.
          • +
          • undo,request: The request is undone.
          • +
          + +

          For signals, where event_info has not been explicitly described, it is set to NULL.

          + +

          The following example shows how to register a callback to the focused signal.

          + +
          +{
          +   evas_object_smart_callback_add(entry, "focused", focused_cb, data);
          +}
          +
          +// Callback function for the "focused" signal
          +// This callback is called when the entry receive the focus
          +void focused_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Entry focused\n");
          +} 
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_entry_wn.htm b/org.tizen.ui.practices/html/native/efl/component_entry_wn.htm new file mode 100644 index 0000000..d22e00d --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_entry_wn.htm @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + Entry + + + + + + +
          +

          Entry

          + +

          This feature is supported in wearable applications only.

          + +

          The entry component is a box where the user can enter text. It supports the following features:

          +
            +
          • text wrapping
          • +
          • multiline
          • +
          • scrolling
          • +
          • formatted markup text
          • +
          • password mode
          • +
          • filtering text
          • +
          • read/write from a file
          • +
          • theme style overrides
          • +
          + + +

          Figure: Entry component

          +

          Entry component

          + +

          Figure: Entry component

          +

          Entry component

          + +

          Figure: Entry hierarchy

          +

          Entry hierarchy

          + +

          Adding an Entry Component

          + +

          The entry component is created with the elm_entry_add() function, and the text inside the entry can be set with elm_entry_entry_set().

          +
          +Evas_Object *entry, *parent;
          +
          +entry = elm_entry_add(parent);
          +elm_entry_entry_set(entry, "A short text.");
          +
          + +

          Using the Text Editor

          + +

          You can append text to the end of existing content.

          +
          +elm_entry_entry_append(entry, "END");
          +
          + +

          You can also insert text at the current cursor position.

          +
          +elm_entry_entry_insert(entry, "CURSOR");
          +Eina_Bool Empty = elm_entry_is_empty(entry);
          +
          + +

          Call elm_entry_is_empty() to see whether the entry is empty. Here, the boolean variable Empty returns EINA_FALSE.

          +

          The user can enter text in the entry component when it is in focus. It is possible to prevent the user from editing text if needed.

          +
          +elm_entry_editable_set(entry, EINA_FALSE);
          +
          + + + + + + + + + + +
          Note
          It is still possible to use the previous functions to modify the text of a non-editable entry.
          + +

          Setting the Password Mode

          + +

          When dealing with password content, the password mode activates to hide what the user is typing. In this mode, the display of any text is replaced by asterisks (*), and the entry is single line (there is no line wrap).

          + +
          +elm_entry_password_set(entry, EINA_TRUE);
          +
          + +

          Entry Line Modes And Wrapping

          + +

          The entry component has two line modes:

          +
            +
          • single line mode
          • +
          • multiline mode
          • +
          + +

          First, set the entry in single line mode.

          + +
          +elm_entry_single_line_set(entry, EINA_TRUE);
          +
          + +

          In this mode, the text does not wrap when reaching the edge, but the entry grows horizontally instead. Pressing the Enter key in this mode generates an activate event instead of adding a new line.

          + +

          When the entry is set to multiline mode (single line off), the text wraps at the end of the entry and pressing Enter creates a new line.

          + +
          +elm_entry_single_line_set(entry, EINA_FALSE);
          +elm_entry_line_wrap_set(entry, ELM_WRAP_WORD);
          +
          + +

          In multiline entries, elm_entry_line_wrap_set() provides a way to cut the text implicitly into a new line when it reaches the far edge of the UI component. The following wrap modes are available:

          +
            +
          • ELM_WRAP_NONE: No wrap
          • +
          • ELM_WRAP_CHAR: Wrap between characters
          • +
          • ELM_WRAP_WORD: Wrap in allowed wrapping points (as defined in the unicode standard)
          • +
          • ELM_WRAP_MIXED: Word wrap, and if that fails, char wrap
          • +
          + +

          Selecting Text

          + +

          Text selections can be made with different functions:

          +
            +
          • To select all the content of the entry component: +
            +elm_entry_select_all(entry);
            +
            +
          • + +
          • To deselect the current selection: +
            +elm_entry_select_none(entry);
            +
            +
          • + +
          • To select part of the text, use elm_entry_select_region_set(). The following code selects the first twenty characters of the entry content. +
            +elm_entry_select_region_set(entry, 0, 20);
            +
            +
          • + +
          • To retrieve the currently selected text in an entry: +
            +const char *selection;
            +
            +selection = elm_entry_selection_get(entry);
            +
            +
          • +
          + +

          If the entry text is empty, elm_entry_selection_get() returns NULL.

          + +

          You can copy or cut the selection to the clipboard.

          +
          +elm_entry_selection_cut(entry);
          +
          + +

          The selection can be pasted in the same or a different entry.

          +
          +elm_entry_selection_paste(entry);
          +
          + +

          Controlling the Cursor

          + +

          The cursor represents the current position in the entry, where the next action, for example, text insertion or deletion, is done. Usually, the cursor is represented as a blinking character, but its appearance depends on the theme configuration. The cursor position can be modified by using several functions.

          +
            +
          • To move the cursor to the beginning of the entry: +
            +elm_entry_cursor_begin_set(entry);
            +
            +
          • + +
          • To move the cursor to the end of the entry: +
            +elm_entry_cursor_end_set(entry);
            +
            +
          • + +
          • To move the cursor one line down or up: +
            +elm_entry_cursor_down(entry);
            +elm_entry_cursor_up(entry);
            +
            +
          • +
          • To move the cursor one character to the left or right: +
            +elm_entry_cursor_prev(entry);
            +elm_entry_cursor_next(entry);
            +
            +
          • + +
          • To set the cursor at a specific position (15th character, for example): +
            +elm_entry_cursor_pos_set(entry, 15);
            +
            +
          • +
          + +

          It is possible to start a selection at the current cursor position, move five characters to the right and end the selection.

          +
          +elm_entry_cursor_selection_begin(entry);
          +
          +for (i = 0; i < 5; i++)
          +{
          +   elm_entry_cursor_next(entry);
          +}
          +
          +elm_entry_cursor_selection_end(entry);
          +
          + +

          Formatting Text

          + +

          Text within an entry can be formatted by using markups tags that are defined in the theme. The following markups are available in the default theme:

          +
            +
          • <br>: Inserts a line break.
          • +
          • <ps>: Inserts a paragraph separator. This is preferred over line breaks.
          • +
          • <tab>: Inserts a tab.
          • +
          • <em>...</em>: Emphasis. Sets the oblique style for the enclosed text.
          • +
          • <b>...</b>: Sets the bold style for the enclosed text.
          • +
          • <link>...</link>: Underlines the enclosed text.
          • +
          • <hilight>...</hilight>: Highlights the enclosed text.
          • +
          + +

          Using Special Markups

          + +

          Special markups can be added within the text of the entry:

          +
            +
          • <a href = ..>...</a>: Anchors
          • +
          • <item size = .. vsize = .. href = ..>...</item>: Items
          • +
          + +

          The anchors generate an anchor,clicked signal when the user clicks on them. The href attribute is used to identify the anchor. It also reacts to the anchor,in (mouse in), anchor,out (mouse out), anchor,down (mouse down), and anchor,up (mouse up) events.

          + +

          The item markup provides a way to insert any Evas_Object in the text. The Evas_Object name has to be specified in the href attribute.

          + +

          Overriding Style

          + +

          To tweak the style of the text within the entry component, it is possible to override parts of the theme style to the textblock object by using elm_entry_text_style_user_push(). This function pushes a new style on top of the user style stack that overrides the current style. Remove the style in the top of user style stack with elm_entry_text_style_user_pop().

          + +

          Filtering Text

          + +

          Text within an entry can be filtered in size. The following example sets the maximum number of characters allowed in the entry to 8.

          +
          +static Elm_Entry_Filter_Limit_Size limit_size = 
          +{
          +   .max_char_count = 8,
          +   .max_byte_count = 0
          +};
          +
          +// Append a new callback to the list, this function is called each time
          +// a text is inserted in the entry. Pass the limit_size struct previously
          +// created to set the maximum number of characters allowed to 8
          + 
          +elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, limit_size);
          +
          + +

          The content can be filtered by passing an Elm_Entry_Filter_Accept_Set structure. This structure contains the accepted characters and rejected characters. The following example shows how to reject the '+', '-', '*', and '/' characters.

          + +
          +static Elm_Entry_Filter_Accept_Set accept_set = 
          +{
          +   .accepted = NULL,
          +   .rejected = "+*-/"
          +};
          +
          +elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, accept_set);
          +
          + +

          Loading and Saving Files

          + +

          The entry content can be saved to a file (/tmp/test.txt, for example).

          + +
          +// Set the file in which the entry text is saved. This function
          +// implicitly loads the existing file content 
          +elm_entry_file_set(entry, "/tmp/test.txt", ELM_TEXT_FORMAT_MARKUP_UTF8);
          +
          + +

          Autosave is activated by default and changes are written back to the file after a short delay. This feature can be deactivated and you can manually save the content when needed.

          +
          +// Disable autosaving 
          +elm_entry_autosave_set(entry, EINA_FALSE);
          +
          +// Trigger saving when needed 
          +elm_entry_file_save(entry);
          +
          + +

          Using Entry Theme Content

          + +

          Two content parts of the default theme are available: icon and end. The following example shows how to set an icon in the end content part.

          + +
          +Evas_Object *icon;
          +
          +ic = elm_icon_add(entry);
          +elm_image_file_set(ic, "icon.png", NULL);
          +elm_object_part_content_set(entry, "end", icon);
          +
          + +

          Using Entry Theme Texts

          + +

          The default theme allows the use of the following text parts:

          +
            +
          • elm.text - text of the entry
          • +
          • elm.guide - placeholder of the entry
          • +
          + +

          The following example shows how to set the placeholder text of the entry to Hello World.

          +
          +elm_object_part_text_set(entry, "elm.guide", "Hello World");
          +
          + +

          Using Entry Callbacks

          + +

          The entry component emits the following signals:

          +
            +
          • aborted: The escape key is pressed on a single line entry.
          • +
          • activated: The enter key is pressed on a single line entry.
          • +
          • anchor,clicked: An anchor is clicked. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,down: Mouse button is pressed on an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,hover,opened: The anchor is clicked. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,in: Mouse cursor is moved into an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,out: Mouse cursor is moved out of an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • anchor,up: Mouse button is unpressed on an anchor. event_info points to an object of the type Elm_Entry_Anchor_Info.
          • +
          • changed: The text within the entry is changed.
          • +
          • changed,user: The text within the entry is changed because of user interaction. event_info points to an object of the type Edje_Entry_Change_Info.
          • +
          • clicked: The entry is clicked (mouse press and release).
          • +
          • clicked,double: The entry is double clicked.
          • +
          • clicked,triple: The entry is triple clicked.
          • +
          • cursor,changed: The cursor position is changed.
          • +
          • cursor,changed,manual: The cursor position is changed manually.
          • +
          • focused: The entry receives focus. event_info points to an object of the type Elm_Focus_Info.
          • +
          • unfocused: The entry loses focus.
          • +
          • language,changed: Program language is changed.
          • +
          • longpressed: A mouse button is pressed and held for a couple of seconds.
          • +
          • maxlength,reached: A maximum length is reached.
          • +
          • preedit,changed: The preedit string is changed.
          • +
          • press: A mouse button is pressed on the entry.
          • +
          • redo,request: The request is redone.
          • +
          • selection,changed: The current selection is changed.
          • +
          • selection,cleared: The current selection is cleared.
          • +
          • selection,copy: A copy of the selected text into the clipboard is requested.
          • +
          • selection,cut: A cut of the selected text into the clipboard is requested.
          • +
          • selection,paste: A paste of the clipboard contents is requested.
          • +
          • selection,start: A selection is begun and no previous selection exists.
          • +
          • text,set,done: The whole text is set to the entry.
          • +
          • theme,changed: The theme is changed.
          • +
          • undo,request: The request is undone.
          • +
          + +

          For signals, where event_info has not been explicitly described, it is set to NULL.

          + +

          The following example shows how to register a callback to the focused signal.

          +
          +{
          +   evas_object_smart_callback_add(entry, "focused", focused_cb, data);
          +}
          +
          +// Callback function for the "focused" signal
          +// This callback is called when the entry receive the focus
          +void focused_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Entry focused\n");
          +} 
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_flip_mn.htm b/org.tizen.ui.practices/html/native/efl/component_flip_mn.htm new file mode 100644 index 0000000..ff32149 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_flip_mn.htm @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + Flip + + + + + + +
          +

          Flip

          + +

          This feature is supported in mobile applications only.

          + +

          The flip component can hold two Evas_Objects and allows the user flip between them using several pre-defined animations.

          + +

          Figure: Flip hierarchy

          +

          Flip hierarchy

          + +

          Adding a Flip Component

          + +

          The following example shows how to create a flip component.

          + +
          +Evas_Object *flip, *parent, *content1, *content2;
          +flip = elm_flip_add(parent);
          +
          + +

          You can add content to the flip component. content1 is set to the front content and content2 is set to the back mode.

          + +
          +elm_object_part_content_set(flip, "front", content1);
          +elm_object_part_content_set(flip, "back", content2);
          +
          + +

          Configuring Flip Animation

          + +

          Now you can run an flip animation.

          +
          +elm_flip_go(flip, ELM_FLIP_CUBE_UP);
          +
          + +

          This animation flips up the front content object as if it was on a side of a cube, letting the down facing side of the cube appear with the back content object. Several animations are available:

          +
            +
          • ELM_FLIP_ROTATE_X_CENTER_AXIS: Rotate the content around a horizontal axis.
          • +
          • ELM_FLIP_ROTATE_Y_CENTER_AXIS: Rotate the content around a vertical axis.
          • +
          • ELM_FLIP_ROTATE_XZ_CENTER_AXIS: Rotate the content around a diagonal axis.
          • +
          • ELM_FLIP_ROTATE_YZ_CENTER_AXIS: Rotate the content around a diagonal axis.
          • +
          • ELM_FLIP_CUBE_LEFT: Rotate the content left as if it was on a side of a cube.
          • +
          • ELM_FLIP_CUBE_RIGHT: Rotate the content right as if it was on a side of a cube.
          • +
          • ELM_FLIP_CUBE_UP: Rotate the content up as if it was on a side of a cube.
          • +
          • ELM_FLIP_CUBE_DOWN: Rotate the content down as if it was on a side of a cube.
          • +
          • ELM_FLIP_PAGE_LEFT: Move the content to the left as if the flip was a book.
          • +
          • ELM_FLIP_PAGE_RIGHT: Move the content to the right as if the flip was a book.
          • +
          • ELM_FLIP_PAGE_UP: Move the content up as if the flip was a book.
          • +
          • ELM_FLIP_PAGE_DOWN: Move the content down as if the flip was a book.
          • +
          + +

          Interacting With the User

          + +

          By default, the user cannot interact with the flip. You can set the interaction to be possible, but you have to choose which animation appears on the interaction (rotation has been selected in the following example).

          + +
          +elm_flip_interaction_set(flip, ELM_FLIP_INTERACTION_ROTATE);
          +
          + +

          The available modes of interaction are

          +
            +
          • ELM_FLIP_INTERACTION_NONE: No interaction is allowed
          • +
          • ELM_FLIP_INTERACTION_ROTATE: Interaction causes a rotating animation
          • +
          • ELM_FLIP_INTERACTION_CUBE: Interaction causes a cube animation
          • +
          • ELM_FLIP_INTERACTION_PAGE: Interaction causes a page animation
          • +
          + +

          You must also choose which interaction directions are enabled. Only right and left are enabled in the following example.

          + +
          +elm_flip_interaction_direction_enabled_set(flip, ELM_FLIP_DIRECTION_LEFT, EINA_TRUE);
          +elm_flip_interaction_direction_enabled_set(flip, ELM_FLIP_DIRECTION_RIGHT, EINA_TRUE);
          +
          + +

          You can also set the amount of the flip that is sensitive to user interaction. In the following example, it is set to the entire flip (1) to make the flip easy to interact with.

          + +
          +elm_flip_interaction_direction_hitsize_set(flip, ELM_FLIP_DIRECTION_LEFT, 1);
          +elm_flip_interaction_direction_hitsize_set(flip, ELM_FLIP_DIRECTION_RIGHT, 1);
          +
          + +

          Using the Flip Callbacks

          + +

          Two signals are emitted by the flip: one when an animation starts and one when it ends. For these signals, event_info parameter is NULL.

          + +
          +"animate,begin" - A flip animation is started
          +"animate,done" - A flip animation is finished
          +
          + +

          You can register a callback on the "animation,begin" signal.

          + +
          +{
          +   evas_object_smart_callback_add(entry, "animate,begin", anim_start_cb, data);
          +}
          +
          +// Callback function for the "animate,begin" signal
          +// This callback is called when the flip animation starts
          +void anim_start_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Animation starts\n");
          +}
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_focus_n.htm b/org.tizen.ui.practices/html/native/efl/component_focus_n.htm new file mode 100644 index 0000000..6efd6cb --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_focus_n.htm @@ -0,0 +1,174 @@ + + + + + + + + + + + + + Managing Component Focus + + + + + +
          + +

          Managing Component Focus

          + + +

          Focus is a graphical user interface concept. A component, for example, a UI component, has a focus when it is selected to receive input from the user. The input can be an event, such as mouse button click or key press. A UI component application has, at all times, one (and only one) focused object. This is what determines where the input event goes to within the application window. Also, focused objects can be decorated differently, in order to signal to the user where the input is at any given moment.

          + +

          Focusing can be immediate (selected by the touchscreen or mouse) or relative (selected by a key press). There are mainly 2 ways to set focus on a graphical elements:

          + +
            +
          • Direct selection: this is done by clicking on the element. +

            Direct selection does not really need any kind of special treatment as the user explicitly selects the UI component to interact with.

          • +
          • Relative selection: this is done by moving the selection from a UI component to another, such as going to the previous or next one; this is done with a keyboard. +

            Relative selection' default order is the one in which the UI components have been added to the canvas. That may not be appropriate, if they are added programmatically in a different order than they appear on-screen.

          • +
          + + +

          Moving Focus

          + +

          Concept of Focus Chain

          +

          The order the focus goes from a UI component to another is called the focus chain. As said before, the default focus chain is set to the order the UI components have been added to the canvas.

          + +

          Focusable Objects

          +

          An object can be focused if the following conditions apply:

          + +
            +
          • object is visible
          • +
          • object is enabled
          • +
          • object accepts focus
          • +
          • object's subtree (if any) is focusable
          • +
          • all of object's parents have their subtrees focusable
          • +
          + +

          If any of these conditions do not apply, the object is unfocusable.

          + +

          Handling Key Input

          + +

          Handling of the keys is done automatically by Elementary. According to which key the user pressed, Elementary switches the focus in the selected direction. For example, using the Tab key the focus goes to the next object in the natural order, whereas using the direction keys the focus goes to the next object in the requested direction.

          + +

          Hiding, Deleting or Disabling a Focused Object

          + +

          When a UI component is hidden, deleted, or disabled, it becomes unfocusable.

          + +

          When a focused object is unfocusable, the focus is moved to another object.

          + +

          Selecting Next Object

          + +

          When the user wants to switch the focus to the next object (i.e. cycle focus), Elementary searches the first object which is focusable.

          + +

          If there is a disabled or read-only object in the focus chain, the focus goes to the following object in the requested direction.

          + +

          Customizing Focus

          + +

          There are several reasons why to customize the focus chain of an application, for example:

          + +
            +
          • If you have created a form with labels and text entries next to them, the focus moves to the entry field when the user clicks on the associated label.
          • +
          • If you have created an interface with several columns (table), set the focus chain as you wish, for example, going horizontally instead of going vertically, regardless whatever the order the UI components are added.
          • +
          + +

          Customizing Object's Focus Exit Chain

          + +

          Set the object to focus after other object in a specific direction using elm_object_focus_next_object_set(object, next, direction). Use the following directions:

          + +
            +
          • ELM_FOCUS_NEXT: next UI component in natural order
          • +
          • ELM_FOCUS_PREVIOUS: previous UI component in natural order
          • +
          • ELM_FOCUS_UP: UI component to focus when going up
          • +
          • ELM_FOCUS_DOWN: UI component to focus when going down
          • +
          • ELM_FOCUS_RIGHT: UI component to focus when going right
          • +
          • ELM_FOCUS_LEFT: UI component to focus when going left
          • +
          + +

          Set the object next to another in a specific direction using elm_object_focus_next_object_get(object, direction).

          + +

          Customizing Whole Application's Focus Chain

          + +

          To customize the application's custom chain:

          + +
          +Evas_Object *main, obj1, obj2, obj3, obj4, obj5;
          +
          +Eina_List *focus_chain = NULL;
          +focus_chain = eina_list_append(focus_chain, obj3);
          +focus_chain = eina_list_append(focus_chain, obj2);
          +// The chain is obj3, then obj2. Set the chain.
          +elm_object_focus_custom_chain_set(main, focus_chain);
          +// Prepend obj5 at the beginning of the chain
          +elm_object_focus_chain_prepend(main, NULL, obj5);
          +// Append obj1 after obj3
          +elm_object_focus_chain_append(main, obj3, obj1);
          +// Prepend obj4 before obj1
          +elm_object_focus_chain_prepend(main, obj1, obj4);
          +
          + +

          The focus chain is obj5, obj3, obj4, obj1, obj2.

          + +

          This actually applies to any container: it is possible to set the focus chain of, for example, a box.

          + +

          Customizing Collision of Both

          + +

          If an object is part of a focus chain and has the next focused object defined, the next object takes precedence over the focus chain.

          + +

          Following on the previous example, if obj4 has obj5 defined as its next object, the actual focus chain is obj5, obj3, obj4, and loop back to obj5.

          + +

          Focus on UI Component

          + +

          If your Evas object has several sub-objects, set its focus chain using the same functions as for the application. Elementary first follows the main focus chain, and then the focus chain of each UI component if applicable.

          + +

          Use elm_object_focus_get(object) to set whether a specific object has the focus. Set the focus to an object using elm_object_focus_set(object, set), where set is a Boolean value. If it is set to EINA_TRUE, the focus is set to that given object. If it is set to EINA_False, the focus is unset and passed back to the previous element in the focus chain. Set the focus only after the object is shown, that is, after evas_object_show(object) has been called. Call the function back when the object receives or loses focus by registering on smart event "focused" or "unfocused"

          + +

          Use elm_object_tree_focus_allow_set(object, focusable) to tell Elementary whether an object and its children are focusable, where focusable is a Boolean value. Get the current value using elm_object_tree_focus_allow_get(object).

          + +

          The similar functions for a specific object are elm_object_focus_allow_set(object, focusable) and elm_object_focus_allow_get(object).

          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_gengrid_mn.htm b/org.tizen.ui.practices/html/native/efl/component_gengrid_mn.htm new file mode 100644 index 0000000..76ed154 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_gengrid_mn.htm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + Gengrid + + + + + + +
          +

          Gengrid

          + +

          This feature is supported in mobile applications only.

          + +

          Gengrid component is based on the same idea as the genlist. It aims at displaying objects on a grid layout and rendering only the visible ones. As for the genlist, callbacks are called at item creation or deletion.

          + +

          This UI component inherits from the layout component and implements the scroller interface. Because of this, the scroller and layout functions can be used with this UI component.

          + +

          A gengrid can display its items using a horizontal or vertical layout. In the first layout, the items are displayed in columns from top to bottom, starting a new column when the space for the current column is filled. In the second one, items are set in rows from left to right.

          + + +

          Figure: Gengrid component

          +

          Gengrid component

          + +

          Figure: Gengrid hierarchy

          +

          Gengrid hierarchy

          + +

          Adding a Gengrid Component

          + +

          You can add a gengrid component with the following code.

          +
          +Evas_Object *gengrid, *parent;
          +gengrid = elm_gengrid_add(parent);
          +
          + +

          Gengrid Items

          + +

          A gengrid item is composed of 0 or more texts, 0 or more contents and 0 or more boolean states. The number of the text and content depends on the theme used for gengrid items. In the default Tizen gengrid item theme, items can have two content parts that can be set with the elm.swallow.icon and elm.swallow.end part names.

          + +

          Creating and Deleting Items

          + +

          As with genlists, the items are allocated and deleted on the go, while the user is scrolling the gengrid. The following example shows how to declare a Elm_Gengrid_Item_Class structure to inform the gengrid how to manage items.

          +
          +static Elm_Gengrid_Item_Class *gic = elm_gengrid_item_class_new();
          +gic->item_style = "default";
          +gic->func.text_get = _grid_label_get;
          +gic->func.content_get = _grid_content_get;
          +gic->func.state_get = _grid_state_get;
          +gic->func.del = _grid_del;
          +
          + +

          The parameters of this structure are not be detailed here, because they are very similar to that of the genlist. Please refer to the genlist component page for more detailed information.

          + +

          Managing Items

          + +

          As with genlists, items can be added with the elm_gengrid_item_append(), elm_gengrid_item_prepend(), elm_gengrid_item_insert_before(), and elm_gengrid_item_insert_after() functions. With the gengrid, there is no need to pass the type parameters. They can be cleared with the elm_gengrid_clear() function.

          + +

          You can set the multiselection mode on.

          +
          +elm_gengrid_multi_select_set(gengrid, EINA_TRUE);
          +
          + +

          When the multiselection mode is on, the selected items are retrieved with the elm_gengrid_selected_items_get() function. The function returns a list of all the selected items.

          + +

          When the content of an item changes, you can call elm_gengrid_item_update() to ask the gengrid to update this item's content.

          + +

          It is also possible to select or disable some items manually with the elm_gengrid_item_selected_set() and elm_object_item_disabled_set() functions.

          + +

          Using Gengrid Callbacks

          + +

          The gengrid component emits the following signals:

          +
            +
          • activated: The user has double-clicked or pressed (enter | return | spacebar) on an item. The event_info parameter is the gengrid item that is activated.
          • +
          • clicked,double: The user has double-clicked an item. The event_info parameter is the gengrid item that is double-clicked.
          • +
          • longpressed: The item is pressed for a certain amount of time. By default it is one second.
          • +
          • selected: The user has selected an item. The event_info parameter is the gengrid item that is selected.
          • +
          • unselected: The user has unselected an item. The event_info parameter is the gengrid item that is unselected.
          • +
          • realized: The item in the gengrid has its implementing Evas object instantiated, de facto. event_info is the gengrid item that is created. The object can be deleted at any time, so it is strongly advisable not to use the object pointer returned from elm_gengrid_item_object_get(), because it can point to freed objects.
          • +
          • unrealized: The implementing Evas object for this item is deleted. event_info is the gengrid item that is deleted.
          • +
          • changed: An item is added, removed, resized or moved and the gengrid is resized or has horizontal property changes.
          • +
          • scroll,anim,start: Scrolling animation starts.
          • +
          • scroll,anim,stop: Scrolling animation stops.
          • +
          • drag,start,up: The item in the gengrid is dragged (not scrolled) up.
          • +
          • drag,start,down: The item in the gengrid has dragged (not scrolled) down.
          • +
          • drag,start,left: The item in the gengrid is dragged (not scrolled) left.
          • +
          • drag,start,right: The item in the gengrid is dragged (not scrolled) right.
          • +
          • drag,stop: The item in the gengrid stops being dragged.
          • +
          • drag: The item in the gengrid is dragged.
          • +
          • scroll: The content is scrolled (moved).
          • +
          • scroll,drag,start: Dragging the content starts.
          • +
          • scroll,drag,stop: Dragging the content stops.
          • +
          • edge,top: The gengrid is scrolled to the top edge.
          • +
          • edge,bottom: The gengrid is scrolled to the bottom edge.
          • +
          • edge,left: The gengrid is scrolled to the left edge.
          • +
          • edge,right: The gengrid is scrolled to the right edge.
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_genlist_mn.htm b/org.tizen.ui.practices/html/native/efl/component_genlist_mn.htm new file mode 100644 index 0000000..1a0fad3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_genlist_mn.htm @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + Genlist + + + + + + +
          +

          Genlist

          + +

          This feature is supported in mobile applications only.

          + +

          Genlist is a UI component that displays a scrollable list of items. It allows a lot of entries while being fast and has a low memory footprint, as only the visible items are allocated in the memory.

          + +

          For more information, see Creating Mobile Genlists.

          + +

          Figure: Genlist component

          +

          Genlist component

          + +

          Figure: Genlist hierarchy

          +

          Genlist hierarchy

          + +

          Genlist Item Style

          + +

          An item can have 0 or more texts, 0 or more contents, and 0 or more boolean states. This is defined in the Edje item theme style. Genlist looks for data items named respectively labels, contents, and states in the Edje file. The default item style provides one text part (elm.text), two content parts (elm.swallow.icon and elm.swallow.end) and no state parts.

          + +

          The following item styles are available:

          +
            +
          • default
          • +
          • full
          • +
          • one_icon
          • +
          • end_icon
          • +
          • group_index
          • +
          • double_label
          • +
          + +

          Here are some examples of the item styles.

          + +

          Figure: Default item style

          +

          Default item style

          + +

          Figure: end_icon item style

          +

          end_icon item style

          + +

          Figure: double_label item style

          +

          double_label item style

          + +

          For more information on creating a new genlist item style, see Customizing Components.

          + +

          Adding a Genlist Component

          + +

          A genlist component is added with the elm_genlist_add() function.

          +
          +Evas_Object *genlist, *parent;
          +genlist = elm_genlist_add(parent);
          +
          + +

          Creating and Deleting Items

          + +

          To save up memory, genlist allocates and deletes items on the go, while the user is scrolling the list. To enable that, the user creates and fills a Elm_Genlist_Item_Class structure that informs the genlist component which callbacks to call when an item is created or deleted.

          + +
          +Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
          +
          +itc->item_style = "default";
          +itc->decorate_item_style = NULL;
          +itc->decorate_all_item_style = NULL;
          +itc->func.text_get = _item_label_get;
          +itc->func.content_get = _item_content_get;
          +itc->func.state_get = _item_state_get;
          +itc->func.del = _item_del;
          +
          + +

          The item_style, decorate_item_style, and decorate_all_item_style attributes define the names of the item style, the decorate mode item style and the decorate all item style.

          + +

          The func structure contains pointers to functions that are called when an item is going to be created or deleted. All of them receive a data parameter that points to the same data passed to the elm_genlist_item_append() and related item creation functions, and an obj parameter that points to the genlist object itself.

          +
            +
          • text_get +

            This function receives a PART parameter that is the name string of one of the existing text parts in the Edje group implementing the item's theme. It has to return a string (duplicated with the strdup() function) corresponding to the PART parameter. The caller is in charge of freeing the string when done.

          • + +
          • content_get +

            The PART parameter is the name string of one of the existing swallow parts in the Edje group. When no content is desired, it must return NULL, or otherwise, a valid object handle. The object is deleted by the genlist on its deletion or when the item is unrealized.

          • + +
          • state_get +

            The PART parameter is the name string of one of the state parts in the Edje group implementing the item's theme. It returns EINA_FALSE for false/off or EINA_TRUE for true/on. The default is false. Genlists emit a signal to the PART parameter's theming Edje object with elm,state,xxx,active as emission and elm as source argument, when the state is true. xxx is the name of the (state) part.

          • + +
          • del +

            This function is called when the genlist item is deleted. It deletes any data that is allocated at the item creation.

          • +
          + +

          Managing Items

          + +

          To add an item, several functions can be used. elm_genlist_item_append() adds an item to the end of the list, or if there is a parent list, to the end of all the child items of the parent list. elm_genlist_item_prepend() is otherwise the same but adds to the beginning of the list or children lists. elm_genlist_item_insert_before() inserts an item before the indicated item and elm_genlist_item_insert_after() inserts an item after the indicated item.

          + +

          The previous functions take a type parameter that can be one of the following.

          +
            +
          • ELM_GENLIST_ITEM_NONE
          • +
          • ELM_GENLIST_ITEM_TREE
          • +
          • ELM_GENLIST_ITEM_GROUP
          • +
          + +

          If ELM_GENLIST_ITEM_TREE is set, this item is displayed as being able to expand and have child items. If ELM_GENLIST_ITEM_GROUP is set, this item is a group index item that is displayed at the top until the next group appears.

          + +

          Figure: Genlist tree

          +

          Genlist tree

          + +

          The application clears the list with elm_genlist_clear(), which deletes all the items in the list. elm_object_item_del() deletes a specific item. elm_genlist_item_subitems_clear() clears all items that are children of the indicated parent item.

          + +

          To help inspect the list items, move to the item at the top of the list with elm_genlist_first_item_get(), which returns the item pointer. elm_genlist_last_item_get() moves to the item at the end of the list. elm_genlist_item_next_get() and elm_genlist_item_prev_get() move to the next and previous items relative to the indicated item. Using these calls you can go through the entire item list or tree.

          + + + + + + + + + + +
          Note
          As a tree, the items are flattened on the list, so elm_genlist_item_parent_get() gives you the name of the parent item (even to skip them if needed).
          + +

          elm_genlist_item_show() scrolls the scroller to show the desired item as visible.

          +

          elm_object_item_data_get() returns the data pointer set by the item creation functions.

          + +

          If an item changes (state, boolean, text or content change), use elm_genlist_item_update() for the genlist to update the item. Genlist re-realizes the item and calls the functions in the _Elm_Genlist_Item_Class for it.

          + +

          Selection

          + +

          Items are manually selected or deselected with elm_genlist_item_selected_set() or disabled with elm_object_item_disabled_set(). In case there is a tree or a group item, the elm_genlist_item_expanded_set() function is used to expand or contract the item.

          + + + + + + + + + + +
          Note
          Calling this function does not show or hide any child of an item (if it is a parent). You must manually delete and create them on the callbacks of the expanded or contracted signals.
          + +

          By default, the genlist is in single-selection mode: only one item can be selected at a time. You can use elm_genlist_multi_select_set() to select multiple items. In the single-selection mode, the elm_genlist_selected_item_get() function can be called to retrieve the selected item. If several items are selected, the elm_genlist_selected_items_get() returns a list of the current selected items.

          + +

          In the following figure, there is a genlist in multi-selection mode with two items selected (#4 and #5) and one item disabled (#2).

          + +

          Figure: Genlist component

          +

          Genlist component

          + +

          Using Genlist Callbacks

          + +

          The genlist component emits the following signals:

          +
            +
          • activated: The user has double-clicked or pressed (enter | return | spacebar) on an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • clicked,double: The user has double-clicked an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • selected: The user selects an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • unselected: The user unselects an item. event_info in the callback function points at an object of type Elm_Object_Item that contains the activated item.
          • +
          • expanded: The item is to be expanded with elm_genlist_item_expanded_set(). This callback fills in the child items. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • contracted: The item is to be contracted with elm_genlist_item_expanded_set(). This callback deletes the child items. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • expand,request: The user wants to expand a tree branch item. The callback decides if the item can expand (if it has any children) and calls elm_genlist_item_expanded_set() to set the state. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • contract,request: The user wants to contract a tree branch item. The callback decides if the item can contract (if it has any children) and calls elm_genlist_item_expanded_set() to set the state. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • realized: The item is created as a real evas object. event_info in the callback function points at an object of the type Elm_Object_Item, that contains the activated item.
          • +
          • unrealized: An item is going to be unrealized. Content objects provided are deleted and the item object is deleted or put into a floating cache. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,up: The item in the list is dragged (not scrolled) up. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,down: The item in the list is dragged (not scrolled) down. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,left: The item in the list is dragged (not scrolled) left. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,right: The item in the list is dragged (not scrolled) right. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,stop: The item in the list has stopped being dragged. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag: The item in the list is being dragged. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • longpressed: The item is pressed for a certain amount of time. The default specified time is one second. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • scroll,anim,start: The scrolling animation is started. event_info is NULL.
          • +
          • scroll,anim,stop: The scrolling animation is stopped. event_info is NULL.
          • +
          • scroll,drag,start: Dragging the content is started. event_info is NULL.
          • +
          • scroll,drag,stop: Dragging the content is stopped. event_info is NULL.
          • +
          • edge,top: The genlist is scrolled to the top edge. event_info is NULL.
          • +
          • edge,bottom: The genlist is scrolled to the bottom edge. event_info is NULL.
          • +
          • edge,left: The genlist is scrolled to the left edge. event_info is NULL.
          • +
          • edge,right: The genlist is scrolled to the right edge. event_info is NULL.
          • +
          • multi,swipe,left: The genlist is multi-touch swiped left. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,right: The genlist is multi-touch swiped right. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,up: The genlist is multi-touch swiped up. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,down: The genlist is multi-touch swiped down. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,pinch,out: The genlist is multi-touch pinched out. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,pinch,in: The genlist is multi-touch pinched in. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • swipe: The genlist is swiped. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved: A genlist item is moved in the reorder mode. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved,after: A genlist item is moved after another item in the reorder mode. To access the relative previous item, use elm_genlist_item_prev_get(). This signal is called along with the moved signal. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved,before: A genlist item is moved before another item in the reorder mode. To access the relative previous item, use elm_genlist_item_next_get(). This signal is called along with the moved signal. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • language,changed The program's language is changed. event_info is NULL.
          • +
          • tree,effect,finished: A genlist tree effect is finished. event_info is NULL.
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_genlist_wn.htm b/org.tizen.ui.practices/html/native/efl/component_genlist_wn.htm new file mode 100644 index 0000000..29ed748 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_genlist_wn.htm @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + Genlist + + + + + + +
          +

          Genlist

          + +

          This feature is supported in wearable applications only.

          + +

          Genlist is a UI component that displays a scrollable list of items. It allows a lot of entries while being fast and has a low memory footprint, as only the visible items are allocated in the memory.

          + +

          For more information, see Creating Wearable Genlists.

          + +

          Figure: Genlist component

          +

          Genlist component

          + +

          Figure: Genlist hierarchy

          +

          Genlist hierarchy

          + +

          Genlist Item Style

          + +

          An item can have 0 or more texts, 0 or more contents, and 0 or more boolean states. This is defined in the Edje item theme style. Genlist looks for data items named respectively labels, contents, and states in the Edje file. The default item style provides one text part (elm.text), two content parts (elm.swallow.icon and elm.swallow.end) and no state parts.

          + +

          The following item styles are available:

          +
            +
          • default
          • +
          • groupindex
          • +
          • 1text
          • +
          • 1text.1icon
          • +
          • 2text
          • +
          • 2text.1
          • +
          • 1text.1icon.divider
          • +
          • 1text.1icon.1
          • +
          • 2text.1icon.1
          • +
          • multiline/1text
          • +
          • multiline/2text
          • +
          + +

          Here are some examples of the item styles.

          + +

          Figure: 1text item style

          +

          1 text item style

          + +

          Figure: 1text.1icon.1 item style

          +

          1text.1icon.1 item style

          + +

          Figure: 2text.1icon.1 item style

          +

          2text.1icon.1 item style

          + +

          For more information on creating a new genlist item style, see Customizing Components.

          + +

          Adding a Genlist Component

          + +

          A genlist component is added with the elm_genlist_add() function.

          +
          +Evas_Object *genlist, *parent;
          +genlist = elm_genlist_add(parent);
          +
          + +

          Creating and Deleting Items

          + +

          To save up memory, genlist allocates and deletes items on the go, while the user is scrolling the list. To enable that, the user creates and fills a Elm_Genlist_Item_Class structure that informs the genlist component which callbacks to call when an item is created or deleted.

          +
          +Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
          +
          +itc->item_style = "default";
          +itc->decorate_item_style = NULL;
          +itc->decorate_all_item_style = NULL;
          +itc->func.text_get = _item_label_get;
          +itc->func.content_get = _item_content_get;
          +itc->func.state_get = _item_state_get;
          +itc->func.del = _item_del;
          +
          + +

          The item_style, decorate_item_style, and decorate_all_item_style attributes define the names of the item style, the decorate mode item style and the decorate all item style.

          + +

          The func structure contains pointers to functions that are called when an item is going to be created or deleted. All of them receive a data parameter that points to the same data passed to the elm_genlist_item_append() and related item creation functions, and an obj parameter that points to the genlist object itself.

          +
            +
          • text_get +

            This function receives a PART parameter that is the name string of one of the existing text parts in the Edje group implementing the item's theme. It has to return a string (duplicated with the strdup() function) corresponding to the PART parameter. The caller is in charge of freeing the string when done.

          • + +
          • content_get +

            The PART parameter is the name string of one of the existing swallow parts in the Edje group. When no content is desired, it must return NULL, or otherwise, a valid object handle. The object is deleted by the genlist on its deletion or when the item is unrealized.

          • + +
          • state_get +

            The PART parameter is the name string of one of the state parts in the Edje group implementing the item's theme. It returns EINA_FALSE for false/off or EINA_TRUE for true/on. The default is false. Genlists emit a signal to the PART parameter's theming Edje object with elm,state,xxx,active as emission and elm as source argument, when the state is true. xxx is the name of the (state) part.

          • + +
          • del +

            This function is called when the genlist item is deleted. It deletes any data that is allocated at the item creation.

          • +
          + +

          Managing Items

          + +

          To add an item, several functions can be used. elm_genlist_item_append() adds an item to the end of the list, or if there is a parent list, to the end of all the child items of the parent list. elm_genlist_item_prepend() is otherwise the same but adds to the beginning of the list or children lists. elm_genlist_item_insert_before() inserts an item before the indicated item and elm_genlist_item_insert_after() inserts an item after the indicated item.

          + +

          The previous functions take a type parameter that can be one of the following.

          +
            +
          • ELM_GENLIST_ITEM_NONE
          • +
          • ELM_GENLIST_ITEM_TREE
          • +
          • ELM_GENLIST_ITEM_GROUP
          • +
          + +

          If ELM_GENLIST_ITEM_TREE is set, this item is displayed as being able to expand and have child items. If ELM_GENLIST_ITEM_GROUP is set, this item is a group index item that is displayed at the top until the next group appears.

          + +

          Figure: Genlist tree

          +

          Genlist tree

          + +

          The application clears the list with elm_genlist_clear(), which deletes all the items in the list. elm_object_item_del() deletes a specific item. elm_genlist_item_subitems_clear() clears all items that are children of the indicated parent item.

          + +

          To help inspect the list items, move to the item at the top of the list with elm_genlist_first_item_get(), which returns the item pointer. elm_genlist_last_item_get() moves to the item at the end of the list. elm_genlist_item_next_get() and elm_genlist_item_prev_get() move to the next and previous items relative to the indicated item. Using these calls you can go through the entire item list or tree.

          + + + + + + + + + + +
          Note
          As a tree, the items are flattened on the list, so elm_genlist_item_parent_get() gives you the name of the parent item (even to skip them if needed).
          + +

          elm_genlist_item_show() scrolls the scroller to show the desired item as visible.

          +

          elm_object_item_data_get() returns the data pointer set by the item creation functions.

          + +

          If an item changes (state, boolean, text or content change), use elm_genlist_item_update() for the genlist to update the item. Genlist re-realizes the item and calls the functions in the _Elm_Genlist_Item_Class for it.

          + +

          Selection

          + +

          Items are manually selected or deselected with elm_genlist_item_selected_set() or disabled with elm_object_item_disabled_set(). In case there is a tree or a group item, the elm_genlist_item_expanded_set() function is used to expand or contract the item.

          + + + + + + + + + + +
          Note
          Calling this function does not show or hide any child of an item (if it is a parent). You must manually delete and create them on the callbacks of the expanded or contracted signals.
          + +

          By default, the genlist is in single-selection mode: only one item can be selected at a time. You can use elm_genlist_multi_select_set() to select multiple items. In the single-selection mode, the elm_genlist_selected_item_get() function can be called to retrieve the selected item. If several items are selected, the elm_genlist_selected_items_get() returns a list of the current selected items.

          + +

          In the following figure, there is a genlist in multi-selection mode with two items selected (#4 and #5) and one item disabled (#2).

          + +

          Figure: Genlist component

          +

          Genlist component

          + +

          Using Genlist Callbacks

          + +

          The genlist component emits the following signals:

          +
            +
          • activated: The user has double-clicked or pressed (enter | return | spacebar) on an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • clicked,double: The user has double-clicked an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • selected: The user selects an item. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • unselected: The user unselects an item. event_info in the callback function points at an object of type Elm_Object_Item that contains the activated item.
          • +
          • expanded: The item is to be expanded with elm_genlist_item_expanded_set(). This callback fills in the child items. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • contracted: The item is to be contracted with elm_genlist_item_expanded_set(). This callback deletes the child items. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • expand,request: The user wants to expand a tree branch item. The callback decides if the item can expand (if it has any children) and calls elm_genlist_item_expanded_set() to set the state. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • contract,request: The user wants to contract a tree branch item. The callback decides if the item can contract (if it has any children) and calls elm_genlist_item_expanded_set() to set the state. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • realized: The item is created as a real evas object. event_info in the callback function points at an object of the type Elm_Object_Item, that contains the activated item.
          • +
          • unrealized: An item is going to be unrealized. Content objects provided are deleted and the item object is deleted or put into a floating cache. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,up: The item in the list is dragged (not scrolled) up. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,down: The item in the list is dragged (not scrolled) down. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,left: The item in the list is dragged (not scrolled) left. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,start,right: The item in the list is dragged (not scrolled) right. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag,stop: The item in the list has stopped being dragged. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • drag: The item in the list is being dragged. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • longpressed: The item is pressed for a certain amount of time. The default specified time is one second. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • scroll,anim,start: The scrolling animation is started. event_info is NULL.
          • +
          • scroll,anim,stop: The scrolling animation is stopped. event_info is NULL.
          • +
          • scroll,drag,start: Dragging the content is started. event_info is NULL.
          • +
          • scroll,drag,stop: Dragging the content is stopped. event_info is NULL.
          • +
          • edge,top: The genlist is scrolled to the top edge. event_info is NULL.
          • +
          • edge,bottom: The genlist is scrolled to the bottom edge. event_info is NULL.
          • +
          • edge,left: The genlist is scrolled to the left edge. event_info is NULL.
          • +
          • edge,right: The genlist is scrolled to the right edge. event_info is NULL.
          • +
          • multi,swipe,left: The genlist is multi-touch swiped left. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,right: The genlist is multi-touch swiped right. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,up: The genlist is multi-touch swiped up. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,swipe,down: The genlist is multi-touch swiped down. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,pinch,out: The genlist is multi-touch pinched out. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • multi,pinch,in: The genlist is multi-touch pinched in. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • swipe: The genlist is swiped. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved: A genlist item is moved in the reorder mode. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved,after: A genlist item is moved after another item in the reorder mode. To access the relative previous item, use elm_genlist_item_prev_get(). This signal is called along with the moved signal. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • moved,before: A genlist item is moved before another item in the reorder mode. To access the relative previous item, use elm_genlist_item_next_get(). This signal is called along with the moved signal. event_info in the callback function points at an object of the type Elm_Object_Item that contains the activated item.
          • +
          • language,changed The program's language is changed. event_info is NULL.
          • +
          • tree,effect,finished: A genlist tree effect is finished. event_info is NULL.
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_glview_mn.htm b/org.tizen.ui.practices/html/native/efl/component_glview_mn.htm new file mode 100644 index 0000000..06fd018 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_glview_mn.htm @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + GLView + + + + + + +
          +

          GLView

          + +

          This feature is supported in mobile applications only.

          + + +

          The GLView component renders OpenGL in an elementary object, which hides Evas GL complexity. For more information, see OpenGL ES.

          + +

          Figure: GLView gears example

          +

          GLView gears example

          + +

          Figure: GLView hierarchy

          +

          GLView hierarchy

          + +

          Adding a GLView Component

          + +

          Create a GLView component with the elm_glview_add() function.

          +
          +Evas_Object *glview, *parent;
          +
          +glview = elm_glview_add(parent);
          +
          + +

          In this example, the size of the GLView is set to 200x200 pixels.

          +
          +elm_glview_size_set(glview, 200, 200);
          +
          + +

          Using the GLView API

          + +

          You can configure the GLView rendering mode by activating the following rendering modes:

          + +
            +
          • ELM_GLVIEW_ALPHA: Alpha channel rendering mode
          • +
          • ELM_GLVIEW_DEPTH: Depth buffer rendering mode
          • +
          • ELM_GLVIEW_STENCIL: Stencil buffer rendering mode
          • +
          • ELM_GLVIEW_DIRECT: Direct rendering mode
          • +
          • ELM_GLVIEW_CLIENT_SIDE_ROTATION: The client handles the GL view rotation if direct rendering is enabled
          • +
          + +

          In the following example, the alpha channel and depth buffer rendering mode are enabled.

          +
          +elm_glview_mode_set(glview, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH);
          +
          + +

          The following example shows how to decide what to do with the GL surface when the GLView component is resized.

          +
          +elm_glview_resize_policy_set(glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
          +
          + +

          The GL surface is destroyed and recreated to the new size (default function). The resize policy can also be set to ELM_GLVIEW_RESIZE_POLICY_SCALE. In that case, only the image object is scaled, not the underlying GL surface.

          + +

          The following example shows how to set the GLView rendering policy.

          +
          +elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ALWAYS);
          +
          + +

          The GLView object is always redrawn during the rendering loop. It can also be set to ELM_GLVIEW_RENDER_POLICY_ON_DEMAND (default function), where the GLView component is redrawn only when it is visible.

          + +

          Register the callbacks:

          + +
          elm_glview_init_func_set(glview, _init_gl_cb);
          +elm_glview_del_func_set(glview, _del_gl_cb);
          +elm_glview_resize_func_set(glview, _resize_gl_cb);
          +elm_glview_render_func_set(glview, _draw_gl_cb);
          +
          + +
            +
          • elm_glview_init_func_set() registers an init callback that is called at the GLView object creation.
          • +
          • elm_glview_del_func_set() registers a del function that is called when the GLView object is deleted.
          • +
          • elm_glview_resize_func_set() registers the resize function that is called during the rendering loop when the GLView object is resized.
          • +
          • elm_glview_render_func_set() registers the render function that is called when the GLView object must be redrawn.
          • +
          + +

          Using GLView Callbacks

          + +

          The GLView component emits the following signals:

          + +
            +
          • focused: The Glview component is focused. The event_info parameter points at an object of the type Elm_Focus_Info.
          • +
          • unfocused: The GLView object is unfocused.
          • +
          + +

          To register a callback:

          +
          +{
          +   evas_object_smart_callback_add(glview, "focused", focused_cb, data);
          +}
          +
          +// Callback function for the "focused" signal
          +// This callback is called when the GLView is focused
          +void focused_cb(void *data, Evas_Object *obj, void  *event_info)
          +{
          +   Elm_Focus_Info *fi = event_info;
          +
          +   dlog_print(DLOG_INFO, LOG_TAG, "GLView is focused\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_glview_wn.htm b/org.tizen.ui.practices/html/native/efl/component_glview_wn.htm new file mode 100644 index 0000000..e32c5bb --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_glview_wn.htm @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + GLView + + + + + + +
          +

          GLView

          + +

          This feature is supported in wearable applications only.

          + + +

          The GLView component renders OpenGL in an elementary object, which hides Evas GL complexity. For more information, see OpenGL ES.

          + + +

          Figure: GLView example

          +

          GLView example

          + +

          Figure: GLView hierarchy

          +

          GLView hierarchy

          + +

          Adding a GLView Component

          + +

          Create a GLView component with the elm_glview_add() function.

          +
          +Evas_Object *glview, *parent;
          +
          +glview = elm_glview_add(parent);
          +
          + +

          In this example, the size of the GLView is set to 200x200 pixels.

          +
          +elm_glview_size_set(glview, 200, 200);
          +
          + +

          Using the GLView API

          + +

          You can configure the GLView rendering mode by activating the following rendering modes:

          +
            +
          • ELM_GLVIEW_ALPHA: Alpha channel rendering mode
          • +
          • ELM_GLVIEW_DEPTH: Depth buffer rendering mode
          • +
          • ELM_GLVIEW_STENCIL: Stencil buffer rendering mode
          • +
          • ELM_GLVIEW_DIRECT: Direct rendering mode
          • +
          • ELM_GLVIEW_CLIENT_SIDE_ROTATION: The client handles the GL view rotation if direct rendering is enabled
          • +
          + +

          In the following example, the alpha channel and depth buffer rendering mode are enabled.

          +
          +elm_glview_mode_set(glview, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH);
          +
          + +

          The following example shows how to decide what to do with the GL surface when the GLView component is resized.

          +
          +elm_glview_resize_policy_set(glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE);
          +
          + +

          The GL surface is destroyed and recreated to the new size (default function). The resize policy can also be set to ELM_GLVIEW_RESIZE_POLICY_SCALE. In that case, only the image object is scaled, not the underlying GL surface.

          + +

          The following example shows how to set the GLView rendering policy.

          +
          +elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ALWAYS);
          +
          + +

          The GLView object is always redrawn during the rendering loop. It can also be set to ELM_GLVIEW_RENDER_POLICY_ON_DEMAND (default function), where the GLView component is redrawn only when it is visible.

          + +

          Register the callbacks:

          +
          elm_glview_init_func_set(glview, _init_gl_cb);
          +elm_glview_del_func_set(glview, _del_gl_cb);
          +elm_glview_resize_func_set(glview, _resize_gl_cb);
          +elm_glview_render_func_set(glview, _draw_gl_cb);
          +
          + +
            +
          • elm_glview_init_func_set() registers an init callback that is called at the GLView object creation.
          • +
          • elm_glview_del_func_set() registers a del function that is called when the GLView object is deleted.
          • +
          • elm_glview_resize_func_set() registers the resize function that is called during the rendering loop when the GLView object is resized.
          • +
          • elm_glview_render_func_set() registers the render function that is called when the GLView object must be redrawn.
          • +
          + +

          Using GLView Callbacks

          + +

          The GLView component emits the following signals:

          +
            +
          • focused: The GlView component is focused. The event_info parameter points at an object of the type Elm_Focus_Info.
          • +
          • unfocused: The GLView object is unfocused.
          • +
          + +

          To register a callback:

          +
          +{
          +   evas_object_smart_callback_add(glview, "focused", focused_cb, data);
          +}
          +
          +// Callback function for the "focused" signal
          +// This callback is called when the GLView is focused
          +void focused_cb(void *data, Evas_Object *obj, void  *event_info)
          +{
          +   Elm_Focus_Info *fi = event_info;
          +
          +   dlog_print(DLOG_INFO, LOG_TAG, "GLView is focused\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_icon_mn.htm b/org.tizen.ui.practices/html/native/efl/component_icon_mn.htm new file mode 100644 index 0000000..025d772 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_icon_mn.htm @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + Icon + + + + + + +
          +

          Icon

          + +

          This feature is supported in mobile applications only.

          + +

          The icon component inherits from the image component. It is used to display images in an icon context.

          + +

          Figure: Icon component

          +

          Icon component

          + +

          Figure: Icon hierarchy

          +

          Icon hierarchy

          + +

          Adding an Icon Component

          + +

          You can create an icon and set it as a freedesktop.org Home standard icon.

          + +
          +Evas_Object *icon, *parent;
          +icon = elm_icon_add(parent);
          +elm_icon_standard_set(icon, "Home");
          +
          + +

          Changing Image File

          + +

          You can change the image by using an image in the filesystem (for example, /tmp/Home.png).

          +
          +elm_image_file_set(icon, "/tmp/Home.png", NULL);
          +
          + +

          You can also use a group in an Edje file (for example, /tmp/Home.edj).

          +
          +elm_image_file_set(icon, "/tmp/Home.edj", "elm/icon/Home/default");
          +
          + +

          A thumbnail can be generated and cached for future use. For this, you need the Ethumb library support.

          + +
          +elm_icon_thumb_set(icon, "/tmp/Home.png", NULL);
          +
          + +

          This function sets the file in the icon and enables the use of a cached thumbnail if it already exists. Otherwise, it creates a new thumbnail and caches it for future use.

          + +

          Using Icon Callbacks

          + +

          The icon component emits the following signals:

          +
            +
          • thumb,done: elm_icon_thumb_set() is completed with success.
          • +
          • thumb,error: elm_icon_thumb_set() fails.
          • +
          + +

          In both cases, event_info is NULL.

          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_icon_wn.htm b/org.tizen.ui.practices/html/native/efl/component_icon_wn.htm new file mode 100644 index 0000000..c670b68 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_icon_wn.htm @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + Icon + + + + + + +
          +

          Icon

          + +

          This feature is supported in wearable applications only.

          + +

          The icon component inherits from the image component. It is used to display images in an icon context.

          + + +

          Figure: Icon hierarchy

          +

          Icon hierarchy

          + +

          Adding an Icon Component

          + +

          You can create an icon and set it as a freedesktop.org Home standard icon.

          + +
          +Evas_Object *icon, *parent;
          +icon = elm_icon_add(parent);
          +elm_icon_standard_set(icon, "Home");
          +
          + +

          Changing Image File

          + +

          You can change the image by using an image in the filesystem (for example, /tmp/Home.png).

          +
          +elm_image_file_set(icon, "/tmp/Home.png", NULL);
          +
          + +

          You can also use a group in an Edje file (for example, /tmp/Home.edj).

          +
          +elm_image_file_set(icon, "/tmp/Home.edj", "elm/icon/Home/default");
          +
          + +

          A thumbnail can be generated and cached for future use. For this, you need the Ethumb library support.

          + +
          +elm_icon_thumb_set(icon, "/tmp/Home.png", NULL);
          +
          + +

          This function sets the file in the icon and enables the use of a cached thumbnail if it already exists. Otherwise, it creates a new thumbnail and caches it for future use.

          + +

          Using Icon Callbacks

          + +

          The icon component emits the following signals:

          +
            +
          • thumb,done: elm_icon_thumb_set() is completed with success.
          • +
          • thumb,error: elm_icon_thumb_set() fails.
          • +
          + +

          In both cases, event_info is NULL.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_image_mn.htm b/org.tizen.ui.practices/html/native/efl/component_image_mn.htm new file mode 100644 index 0000000..34f438d --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_image_mn.htm @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + Image + + + + + + +
          +

          Image

          + +

          This feature is supported in mobile applications only.

          + +

          The image component can load and display an image from a disk file or a memory region.

          + +

          Figure: Image component

          +

          Image component

          + +

          Figure: Image hierarchy

          +

          Image hierarchy

          + +

          Adding an Image Component

          + +

          This object is created with elm_image_add().

          + +
          +Evas_Object *image, *parent;
          +image = elm_image_add(parent);
          +
          + +

          Configuring the Image Component

          + +

          Various properties of the image can be tuned. First, you can disable the elementary scaling so that the image does not scale but resizes on both directions.

          +
          +elm_image_no_scale_set(image, EINA_TRUE);
          +elm_image_resizable_set(image, EINA_TRUE, EINA_TRUE);
          +
          + +

          When scaling images, the smooth scaling algorithm can be used. It provides a better quality image but is slower than the default algorithm.

          +
          +elm_image_smooth_set(image, EINA_TRUE);
          +
          + +

          Preloading is used to load images without blocking the user interface. This preserves the reactivity of the user experience. The image is loaded in a thread. It can be disabled if desired.

          +
          +elm_image_preload_disabled_set(image, EINA_TRUE);
          +
          + +

          The image can be rotated or flipped. Here the image is rotated 180 degrees.

          +
          +elm_image_orient_set(image, ELM_IMAGE_ROTATE_180);
          +
          + +

          The following orientations are available:

          +
            +
          • ELM_IMAGE_ORIENT_0: No orientation change
          • +
          • ELM_IMAGE_ROTATE_90: Rotate the image 90 degrees clockwise
          • +
          • ELM_IMAGE_ROTATE_180: Rotate the image 180 degrees clockwise
          • +
          • ELM_IMAGE_ROTATE_270: Rotate the image 90 degrees counter-clockwise
          • +
          • ELM_IMAGE_FLIP_HORIZONTAL: Flip the image horizontally
          • +
          • ELM_IMAGE_FLIP_VERTICAL: Flip the image vertically
          • +
          • ELM_IMAGE_FLIP_TRANSPOSE: Flip the image along the bottom-left to top-right line
          • +
          • ELM_IMAGE_FLIP_TRANSVERSE: Flip the image along the top-left to bottom-right line
          • +
          + +

          If you want to keep the original aspect ration when resizing the image, you must define how the image fits into the object's area.

          +
          +// Tell the image to keep original aspect ratio 
          +elm_image_aspect_fixed_set(image, EINA_TRUE);
          +// Then let the image fill the entire object 
          +elm_image_fill_outside_set(image, EINA_TRUE);
          +
          + +

          In this configuration, part of the image can go outside the object. If elm_image_fill_outside_set is set to EINA_FALSE, the image stays inside the limits of the parent object.

          + +

          Using Image Callbacks

          + +

          The image component emits the following signals:

          +
            +
          • drop: The user drops an image typed object onto the object in question - the event info argument is the path to that image file
          • +
          • clicked: The user clicks the image. event_info is NULL.
          • +
          + +

          To register a callback when a user clicks on the image:

          +
          +{
          +   evas_object_smart_callback_add(image, "clicked", clicked_cb, data);
          +}
          +
          +// Callback function for the "clicked" signal
          +// This callback is called when the image is clicked
          +void clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Image clicked\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_image_wn.htm b/org.tizen.ui.practices/html/native/efl/component_image_wn.htm new file mode 100644 index 0000000..1e74051 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_image_wn.htm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + Image + + + + + + +
          +

          Image

          + +

          This feature is supported in wearable applications only.

          + +

          The image component can load and display an image from a disk file or a memory region.

          + +

          Figure: Image component

          +

          Image component

          + +

          Figure: Image hierarchy

          +

          Image hierarchy

          + +

          Adding an Image Component

          + +

          This object is created with elm_image_add().

          + +
          +Evas_Object *image, *parent;
          +image = elm_image_add(parent);
          +
          + +

          Configuring the Image Component

          + +

          Various properties of the image can be tuned. First, you can disable the elementary scaling so that the image does not scale but resizes on both directions.

          +
          +elm_image_no_scale_set(image, EINA_TRUE);
          +elm_image_resizable_set(image, EINA_TRUE, EINA_TRUE);
          +
          + +

          When scaling images, the smooth scaling algorithm can be used. It provides a better quality image but is slower than the default algorithm.

          +
          +elm_image_smooth_set(image, EINA_TRUE);
          +
          + +

          Preloading is used to load images without blocking the user interface. This preserves the reactivity of the user experience. The image is loaded in a thread. It can be disabled if desired.

          +
          +elm_image_preload_disabled_set(image, EINA_TRUE);
          +
          + +

          The image can be rotated or flipped. Here the image is rotated 180 degrees.

          +
          +elm_image_orient_set(image, ELM_IMAGE_ROTATE_180);
          +
          + +

          The following orientations are available:

          +
            +
          • ELM_IMAGE_ORIENT_0: No orientation change
          • +
          • ELM_IMAGE_ROTATE_90: Rotate the image 90 degrees clockwise
          • +
          • ELM_IMAGE_ROTATE_180: Rotate the image 180 degrees clockwise
          • +
          • ELM_IMAGE_ROTATE_270: Rotate the image 90 degrees counter-clockwise
          • +
          • ELM_IMAGE_FLIP_HORIZONTAL: Flip the image horizontally
          • +
          • ELM_IMAGE_FLIP_VERTICAL: Flip the image vertically
          • +
          • ELM_IMAGE_FLIP_TRANSPOSE: Flip the image along the bottom-left to top-right line
          • +
          • ELM_IMAGE_FLIP_TRANSVERSE: Flip the image along the top-left to bottom-right line
          • +
          + +

          If you want to keep the original aspect ration when resizing the image, you must define how the image fits into the object's area.

          +
          +// Tell the image to keep original aspect ratio 
          +elm_image_aspect_fixed_set(image, EINA_TRUE);
          +// Then let the image fill the entire object 
          +elm_image_fill_outside_set(image, EINA_TRUE);
          +
          + +

          In this configuration, part of the image can go outside the object. If elm_image_fill_outside_set is set to EINA_FALSE, the image stays inside the limits of the parent object.

          + +

          Using Image Callbacks

          + +

          The image component emits the following signals:

          +
            +
          • drop: The user drops an image typed object onto the object in question - the event info argument is the path to that image file
          • +
          • clicked: The user clicks the image. event_info is NULL.
          • +
          + +

          To register a callback when a user clicks on the image:

          +
          +{
          +   evas_object_smart_callback_add(image, "clicked", clicked_cb, data);
          +}
          +
          +// Callback function for the "clicked" signal
          +// This callback is called when the image is clicked
          +void clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Image clicked\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_index_mn.htm b/org.tizen.ui.practices/html/native/efl/component_index_mn.htm new file mode 100644 index 0000000..e1325b1 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_index_mn.htm @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + Index + + + + + + +
          +

          Index

          + +

          This feature is supported in mobile applications only.

          + +

          An index component gives you an index for fast access to whichever group of other UI items you have. The index component is by default hidden, but it appears when the user clicks over its reserved area in the canvas. In the default theme, it is a one finger wide area on the right side of the index component's container. Generally, an index is used together with lists, generic lists, or generic grids.

          + +

          Figure: Index component

          +

          Index component

          + +

          Figure: Index hierarchy

          +

          Index hierarchy

          + +

          Adding an Index Component

          + +

          Call the elm_index_add() function to create a new index component.

          +
          +Evas_Object *index, *parent;
          +index = elm_index_add(parent);
          +
          + +

          Adding Items

          + +

          The following example shows how to add the listitem object at the letter A, calling the smart callback it_select_cb() when this item is selected.

          +
          +Elm_Object_Item *list_item1, *list_item2;
          +elm_index_item_append(index, "A", it_select_cb, list_item1);
          +
          + +

          The following example shows how to define the smart callback.

          +
          +// Callback function called when the list_item1 object
          +// is selected
          +void it_select_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Item1 selected\n");
          +}
          +
          + +

          In the previous case, the indexes are appended to the existing ones. It is also possible to prepend index items with elm_index_item_prepend().

          + +

          Sorting Index Items

          + +

          You can insert index items using a sorting function. Indexes can be sorted, for example, by alphabetic order.

          + +

          You must write a compare function that returns a positive int, 0 or a negative int when the data2 item parameter is respectively greater than, equal to or lower than the data1 parameter.

          + +
          +static int
          +_index_icmp(const void *data1,
          +      const void *data2)
          +{
          +   int result;
          +
          +   // Code that does the item comparison is written here
          +
          +   return result;
          +}
          +
          + +

          This example shows how to add a new item at the B index using the compare function to sort the indexes.

          + +
          +elm_index_item_sorted_insert(index, "B", NULL, list_item2, _index_icmp, NULL);
          +
          + +

          Using Index Callbacks

          + +

          The index component emits the following signals:

          +
            +
          • changed: The selected index item changes. event_info is the selected item's data pointer.
          • +
          • delay,changed: The selected index item changes, but after a small idling period. event_info is the selected item's data pointer.
          • +
          • selected: The user releases a mouse button and selects an item. event_info is the selected item's data pointer.
          • +
          • level,up: The user moves a finger from the first level to the second level.
          • +
          • level,down: The user moves a finger from the second level to the first level.
          • +
          + +

          When the user selects an item in the index, the selected signal is emitted. The developer can then implement the associated callback to do the appropriate action (to show a given area or child object depending on the index item selected, for example). Here is an example of such a callback.

          +
          +static void
          +_index_selected_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Object_Item *lit = event_info;
          +
          +   // Code that does the desired action
          +}
          +
          + +

          After that, the callback to the selected signal is registered.

          +
          +evas_object_smart_callback_add(index, "selected", _index_selected_cb, NULL);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_index_wn.htm b/org.tizen.ui.practices/html/native/efl/component_index_wn.htm new file mode 100644 index 0000000..0ac1f02 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_index_wn.htm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + Index + + + + + + +
          +

          Index

          + +

          This feature is supported in wearable applications only.

          + +

          An index component gives you an index for fast access to whichever group of other UI items you have. The index component is by default hidden, but it appears when the user clicks over its reserved area in the canvas. In the default theme, it is a one finger wide area on the right side of the index component's container. Generally, an index is used together with lists, generic lists, or generic grids.

          + + +

          Figure: Index component

          +

          Index component

          + +

          Figure: Index hierarchy

          +

          Index hierarchy

          + +

          Adding an Index Component

          + +

          Call the elm_index_add() function to create a new index component.

          +
          +Evas_Object *index, *parent;
          +index = elm_index_add(parent);
          +
          + +

          Adding Items

          + +

          The following example shows how to add the listitem object at the letter A, calling the smart callback it_select_cb() when this item is selected.

          +
          +Elm_Object_Item *list_item1, *list_item2;
          +elm_index_item_append(index, "A", it_select_cb, list_item1);
          +
          + +

          The following example shows how to add item objects, calling the smart callback it_select_cb() when the item is selected.

          +
          +Elm_Object_Item *it[5];
          +for (i = 0; i < 5; ++i)
          +{
          +   it[i] = elm_index_item_append(index, NULL, it_select_cb, (void *) i);
          +}
          + +

          The following example shows how to define the smart callback.

          +
          +// Callback function called when the list_item1 object
          +// is selected
          +void it_select_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Item1 selected\n");
          +}
          +
          + +

          In the previous case, the indexes are appended to the existing ones. It is also possible to prepend index items with elm_index_item_prepend().

          + + +

          Using Index Callbacks

          + +

          The index component emits the following signals:

          +
            +
          • changed: The selected index item changes. event_info is the selected item's data pointer.
          • +
          • delay,changed: The selected index item changes, but after a small idling period. event_info is the selected item's data pointer.
          • +
          • selected: The user releases a mouse button and selects an item. event_info is the selected item's data pointer.
          • +
          • level,up: The user moves a finger from the first level to the second level.
          • +
          • level,down: The user moves a finger from the second level to the first level.
          • +
          + +

          When the user selects an item in the index, the selected signal is emitted. The developer can then implement the associated callback to do the appropriate action (to show a given area or child object depending on the index item selected, for example). Here is an example of such a callback.

          +
          +static void
          +_index_selected_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Object_Item *lit = event_info;
          +
          +   // Code that does the desired action
          +}
          +
          + +

          After that, the callback to the selected signal is registered.

          +
          +evas_object_smart_callback_add(index, "selected", _index_selected_cb, NULL);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_infra_n.htm b/org.tizen.ui.practices/html/native/efl/component_infra_n.htm new file mode 100644 index 0000000..274b9a2 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_infra_n.htm @@ -0,0 +1,69 @@ + + + + + + + + + + + + + UI Component Infrastructure Modules: Managing Component Properties + + + + + +
          + +

          UI Component Infrastructure Modules: Managing Component Properties

          + +

          The Elementary library is composed of many UI components to support Tizen native applications. While using UI components, you must manage their common properties. To meet this requirement, Elementary creates some infrastructure modules in order to support many UI components. Currently, Elementary provides following infrastructure modules:

          +
          • Component focus +

            A UI component application always has 1 focused object, which is selected to receive input from the user. The focus can change between objects, and the focused object can be decorated on the screen to make it easily visible.

          • +
          • Handling touch gestures for components +

            UI components generally handle basic touch inputs, such as press, release and moving. However, in some use cases (for example, when the accessibility Assistive Technology (AT) client is working), handling for a variety of touch gesture events (such as tap, double-tap, triple-tap, double-tap and hold, and left/right/up/down swipe) is needed. Elementary can also create new touch gesture patterns according to application use cases.

            +
          • +
          • Customizing components +

            Elementary provides basic UI components based on the Tizen UX styles which you can use. Usually, you can use the supported UI components themselves to make your application. However, if you need to use other styles than the basic ones, you must customize the UI component style.

          • +
          • UI mirroring +

            Elementary provides UI mirroring, which allows you to set UI mirroring on specific UI components or the whole interface. This facility is very useful to support applications which need both right-to-left and left-to-right languages.

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/component_label_mn.htm b/org.tizen.ui.practices/html/native/efl/component_label_mn.htm new file mode 100644 index 0000000..295beea --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_label_mn.htm @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + Label + + + + + + +
          +

          Label

          + +

          This feature is supported in mobile applications only.

          + +

          The label component displays text with simple html-like markup.

          + + +

          Figure: Label component

          +

          Label component

          + +

          Figure: Label hierarchy

          +

          Label hierarchy

          + +

          Adding a Label Component

          + +

          To add a label and set the text in it, use the following functions.

          + +
          +Evas_Object *label = elm_label_add(win);
          +
          +elm_object_text_set(label, "Some long text for our label, that is not so long");
          +
          + +

          Using the Label Styles

          + +

          Label displays the text with several predefined styles.

          +
            +
          • default: No animation
          • +
          • marker: The text is centered and bolded.
          • +
          • slide_long: The text appears from the right of the screen and slides until it disappears in the left of the screen(reappearing on the right again).
          • +
          • slide_short: The text appears in the left of the label and slides to the right to show the overflow. When all of the text has been shown the position is reset.
          • +
          • slide_bounce: The text appears in the left of the label and slides to the right to show the overflow. When all of the text has been shown, the animation reverses, moving the text to the left.
          • +
          + +

          Here the style is set to slide_long.

          + +
          +elm_object_style_set(label, "slide_long");
          +
          + +

          Configuring the Label

          + +

          The duration of the animation and the slide mode can be set with the following functions.

          +
          +elm_label_slide_duration_set(label, 3);
          +elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_ALWAYS);
          +
          + +

          Use the following function to modify the style.

          +
          +elm_object_style_set(label, "slide_bounce");
          +
          + +

          Using the Label Callbacks

          + +

          This UI component emits the following signals:

          +
            +
          • language,changed: The program's language changes.
          • +
          • slide,end: The slide reaches the end.
          • +
          • anchor,clicked: The anchor is clicked. event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          • anchor,mouse,down event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          • anchor,mouse,up event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          + +

          The following example registers a callback on the slide,end signal.

          + +
          +{
          +   evas_object_smart_callback_add(label, "slide,end", slide_end_cb, data);
          +}
          +
          +// Callback function for the "slide,end" signal
          +// This callback is called when the label slide reaches the end
          +void slide_end_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Slide has reach the end.\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_label_wn.htm b/org.tizen.ui.practices/html/native/efl/component_label_wn.htm new file mode 100644 index 0000000..e41947a --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_label_wn.htm @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + Label + + + + + + +
          +

          Label

          + +

          This feature is supported in wearable applications only.

          + +

          The label component displays text with simple html-like markup.

          + +

          Figure: Label component

          +

          Label component

          + +

          Figure: Label hierarchy

          +

          Label hierarchy

          + +

          Adding a Label Component

          + +

          To add a label and set the text in it, use the following functions.

          + +
          +Evas_Object *label = elm_label_add(win);
          +
          +elm_object_text_set(label, "Some long text for our label, that is not so long");
          +
          + +

          Using the Label Styles

          + +

          Label displays the text with several predefined styles.

          +
            +
          • default: No animation
          • +
          • marker: The text is centered and bolded.
          • +
          • slide_long: The text appears from the right of the screen and slides until it disappears in the left of the screen(reappearing on the right again).
          • +
          • slide_roll: The text appears from the left of the label and slides to the right to show the overflow, and then appears from the right of the label again.
          • +
          • slide_short: The text appears in the left of the label and slides to the right to show the overflow. When all of the text has been shown the position is reset.
          • +
          • slide_bounce: The text appears in the left of the label and slides to the right to show the overflow. When all of the text has been shown, the animation reverses, moving the text to the left.
          • +
          + +

          Here the style is set to slide_roll.

          + +
          +elm_object_style_set(label, "slide_roll");
          +
          + +

          Configuring the Label

          + +

          The duration of the animation and the slide mode can be set with the following functions.

          +
          +elm_label_slide_duration_set(label, 3);
          +elm_label_slide_mode_set(label, ELM_LABEL_SLIDE_MODE_ALWAYS);
          +
          + +

          Use the following function to modify the style.

          +
          +elm_object_style_set(label, "slide_bounce");
          +
          + +

          Using the Label Callbacks

          + +

          This UI component emits the following signals:

          +
            +
          • language,changed: The program's language changes.
          • +
          • slide,end: The slide reaches the end.
          • +
          • anchor,clicked: The anchor is clicked. event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          • anchor,mouse,down event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          • anchor,mouse,up event_info points to an object of the type Elm_Label_Anchor_Info.
          • +
          + +

          The following example registers a callback on the slide,end signal.

          + +
          +{
          +   evas_object_smart_callback_add(label, "slide,end", slide_end_cb, data);
          +}
          +
          +// Callback function for the "slide,end" signal
          +// This callback is called when the label slide reaches the end
          +void slide_end_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Slide has reach the end.\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_list_mn.htm b/org.tizen.ui.practices/html/native/efl/component_list_mn.htm new file mode 100644 index 0000000..fae75d3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_list_mn.htm @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + List + + + + + + +
          +

          List

          + +

          This feature is supported in mobile applications only.

          + + +

          This UI component is a very simple type of a list component. It is not to be used to manage a lot of items. For that, genlists are a better option.

          + +

          The list items can contain a text and two contents (start and end). These are set with the elm_object_item_*() functions.

          + + +

          Figure: List component

          +

          List component

          + +

          Figure: List hierarchy

          +

          List hierarchy

          + +

          Adding a List Component

          + +
          +Evas_Object *list, *parent;
          +
          +// Create a list 
          +list = elm_list_add(parent);
          +
          + +

          Using the List

          + +

          This UI component implements the scrollable interface, so the scroller component functions can be used on it. For example, if you want to change the bounce property of the scroller or the scrolling policy:

          + +
          +Evas_Object *list;
          +
          +// Change the scroller policy to fix the scroll only vertically
          +elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_OFF);
          +// Enable bounce effect when the list reaches the upper and lower limits 
          +elm_scroller_bounce_set(list, EINA_TRUE, EINA_TRUE);
          +
          + +

          The elm_list_multi_select_set() function can be called to enable multi-selection of items. Each time an item is clicked, the state changes to selected.

          + +
          +Evas_Object *list;
          +
          +// Activate multi selection 
          +elm_list_multi_select_set(list, EINA_TRUE);
          +
          + +

          Adding Items to the List

          + +

          Items are added with elm_list_item_append() or elm_list_item_prepend(). Here an example of adding ten items with text and one icon on the front: The last two arguments are the callback function when the created item is clicked and the data passed to the callback function.

          + +
          +Evas_Object *list;
          +int i;
          +
          +// This function is called when the list item is selected 
          +static void _selected_item_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
          +   Eina_Bool selected = elm_list_item_selected_get(list_it);
          +   dlog_print(DLOG_INFO, LOG_TAG, "item is %s\n", selected? "selected": "unselected");
          +}
          +
          +for (i = 0; i < 10; i++)
          +{
          +   Evas_Object *ic;
          +   char tmp[8];
          +   snprintf(tmp, sizeof(tmp), "Item %02d", i);
          +   // Create an icon 
          +   ic = elm_icon_add(win);
          +   // Set the file to the icon file 
          +   elm_image_file_set(ic, "path/to/file", NULL);
          +   // Add item to the list 
          +   elm_list_item_append(list, tmp, ic, NULL, _selected_item_cb, NULL);
          +}
          +
          +
          + +

          Changing the Text or Icon of an Item

          + +

          If you want to change the state of an item, you can do it by using all the functions relative to Elm_Object_Item. Each item of the list contains two instances of an evas_object. Give those as the third and the fourth arguments when you append or prepend the item in the list. The evas_object instances are changed with elm_object_item_part_content_set. The first object is referenced as the start object in the theme, whereas the second one is referenced as the end object. Give these names when you use the elm_object_item_part_content_set. The label of the item is changed by using elm_object_item_text_set.

          + +
          +Evas_Object *list;
          +Eina_List *l;
          +Elm_Object_Item *it;
          +
          +// Retrieve the current selected item 
          +it = elm_list_selected_item_get(list);
          +if (!it)
          +   return;
          +
          +ic = elm_icon_add(win);
          +// Set the file to the icon file 
          +elm_image_file_set(ic, "path/to/file", NULL);
          +// Change the first icon 
          +elm_object_item_part_content_set(it, "start", ic);
          +// Change the second icon 
          +elm_object_item_part_content_set(it, "end", ic);
          +// Change the label 
          +elm_object_item_text_set(it, "I've been selected !");
          +
          + +

          Retrieving Selected Items

          + +

          The list of the currently selected items is retrieved with elm_list_selected_items_get(). If the multiselect mode is false, you can retrieve the only selected item with elm_list_selected_item_get(). For example, this is how to unselect all previously selected items.

          + +
          +Evas_Object *list; Eina_List *l;
          +Eina_List *selected_items;
          +// List of Elm_Object_Item 
          +Elm_Object_Item *it;
          +
          +selected_items = elm_list_selected_items_get(list);
          +EINA_LIST_FOREACH(selected_items, l, it)
          +   elm_list_item_selected_set(it, EINA_FALSE);
          +
          + +

          List Item Operations

          + +

          To find out if an item is selected, call elm_list_item_selected_get. This function returns EINA_TRUE if the item is selected, otherwise EINA_FALSE.

          + +

          Elementary list provides two functions for sliding a list to a specific item. elm_list_item_show shows the item passed as an argument, whereas elm_list_item_bring_in shows the item, but only after animating the slide.

          + +

          You can go to the item immediately preceding a specific item with the function elm_list_item_prev, or to the one immediately following a specific item with the function elm_list_item_next.

          + +

          The following example shows selecting the item immediately following the currently selected one, unselecting it, selecting the next one and bringing it to the screen.

          + +
          +Evas_Object *list;
          +Elm_Object_Item *current, *next;
          +current = elm_list_selected_item_get(list);
          +elm_list_item_selected_set(current, EINA_FALSE);
          +next = elm_list_item_next(current);
          +elm_list_item_selected_set(next, EINA_TRUE);
          +elm_list_item_bring_in(next);
          +
          + +

          Using List Callbacks

          + +

          The list emits the following signals:

          +
            +
          • activated: The user double-clicks or presses (enter | return | spacebar) on an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • clicked,double: The user double-clicks an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • selected: The user selects an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • unselected: The user unselects an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • longpressed: The user long-presses an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • edge,top: The list is scrolled to the top edge.
          • +
          • edge,bottom: The list is scrolled to the bottom edge.
          • +
          • edge,left: The list is scrolled to the left edge.
          • +
          • edge,right: The list is scrolled to the right edge.
          • +
          • highlighted: The user highlights an item on the list. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • unhighlighted: The user unhighlights an item in the list. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          + +

          You can register to the clicked,double signal with the following code. Note that the currently double-clicked item can be retrieved using the event_info pointer. This code registers to the double,clicked signal and unselects the item that has been double-clicked.

          + +
          +{
          +   Evas_Object *list;
          +
          +   evas_object_smart_callback_add(list, "clicked,double", double_clicked_cb, data);
          +}
          +
          +// Callback function for the "clicked" signal
          +// This callback is called when the button is clicked by the user
          +void double_clicked_cb(void *data, Evas_Object *obj, void  *event_info)
          +{
          +   elm_Object_Item *it = event_info;
          +   elm_list_selected_item_set(it,  EINA_FALSE);
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_list_wn.htm b/org.tizen.ui.practices/html/native/efl/component_list_wn.htm new file mode 100644 index 0000000..345f52d --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_list_wn.htm @@ -0,0 +1,252 @@ + + + + + + + + + + + + + + List + + + + + + +
          +

          List

          + +

          This feature is supported in wearable applications only.

          + +

          This UI component is a very simple type of a list component. It is not to be used to manage a lot of items. For that, genlists are a better option.

          + +

          The list items can contain a text and two contents (start and end). These are set with the elm_object_item_*() functions.

          + + +

          Figure: List component

          +

          List component

          + +

          Figure: List hierarchy

          +

          List hierarchy

          + +

          Adding a List Component

          + +
          +Evas_Object *list, *parent;
          +
          +// Create a list 
          +list = elm_list_add(parent);
          +
          + +

          Using the List

          + +

          This UI component implements the scrollable interface, so the scroller component functions can be used on it. For example, if you want to change the bounce property of the scroller or the scrolling policy:

          + +
          +Evas_Object *list;
          +
          +// Change the scroller policy to fix the scroll only vertically
          +elm_scroller_policy_set(list, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
          +// Enable bounce effect when the list reaches the upper and lower limits 
          +elm_scroller_bounce_set(list, EINA_FALSE, EINA_TRUE);
          +
          + +

          The elm_list_multi_select_set() function can be called to enable multi-selection of items. Each time an item is clicked, the state changes to selected.

          + +
          +Evas_Object *list;
          +
          +// Activate multi selection 
          +elm_list_multi_select_set(list, EINA_FALSE);
          +
          + +

          Adding Items to the List

          + +

          Items are added with elm_list_item_append() or elm_list_item_prepend(). Here an example of adding ten items with text and one icon on the front: The last two arguments are the callback function when the created item is clicked and the data passed to the callback function.

          + +
          +Evas_Object *list;
          +int i;
          +
          +// This function is called when the list item is selected 
          +static void _selected_item_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
          +   Eina_Bool selected = elm_list_item_selected_get(list_it);
          +   dlog_print(DLOG_INFO, LOG_TAG, "item is %s\n", selected? "selected": "unselected");
          +}
          +
          +for (i = 0; i < 10; i++)
          +{
          +   Evas_Object *ic;
          +   char tmp[8];
          +   snprintf(tmp, sizeof(tmp), "Item %02d", i);
          +   // Create an icon 
          +   ic = elm_icon_add(win);
          +   // Set the file to the icon file 
          +   elm_image_file_set(ic, "path/to/file", NULL);
          +   // Add item to the list 
          +   elm_list_item_append(list, tmp, ic, NULL, _selected_item_cb, NULL);
          +}
          +
          +
          + +

          Changing the Text or Icon of an Item

          + +

          If you want to change the state of an item, you can do it by using all the functions relative to Elm_Object_Item. Each item of the list contains two instances of an evas_object. Give those as the third and the fourth arguments when you append or prepend the item in the list. The evas_object instances are changed with elm_object_item_part_content_set. The first object is referenced as the start object in the theme, whereas the second one is referenced as the end object. Give these names when you use the elm_object_item_part_content_set. The label of the item is changed by using elm_object_item_text_set.

          + +
          +Evas_Object *list;
          +Eina_List *l;
          +Elm_Object_Item *it;
          +
          +// Retrieve the current selected item 
          +it = elm_list_selected_item_get(list);
          +if (!it)
          +   return;
          +
          +ic = elm_icon_add(win);
          +// Set the file to the icon file 
          +elm_image_file_set(ic, "path/to/file", NULL);
          +// Change the first icon 
          +elm_object_item_part_content_set(it, "start", ic);
          +// Change the second icon 
          +elm_object_item_part_content_set(it, "end", ic);
          +// Change the label 
          +elm_object_item_text_set(it, "I've been selected !");
          +
          + +

          Retrieving Selected Items

          + +

          The list of the currently selected items is retrieved with elm_list_selected_items_get(). If the multiselect mode is false, you can retrieve the only selected item with elm_list_selected_item_get(). For example, this is how to unselect all previously selected items.

          + +
          +Evas_Object *list; Eina_List *l;
          +Eina_List *selected_items;
          +// List of Elm_Object_Item 
          +Elm_Object_Item *it;
          +
          +selected_items = elm_list_selected_items_get(list);
          +EINA_LIST_FOREACH(selected_items, l, it)
          +   elm_list_item_selected_set(it, EINA_FALSE);
          +
          + +

          List Item Operations

          + +

          To find out if an item is selected, call elm_list_item_selected_get. This function returns EINA_TRUE if the item is selected, otherwise EINA_FALSE.

          + +

          Elementary list provides two functions for sliding a list to a specific item. elm_list_item_show shows the item passed as an argument, whereas elm_list_item_bring_in shows the item, but only after animating the slide.

          + +

          You can go to the item immediately preceding a specific item with the function elm_list_item_prev, or to the one immediately following a specific item with the function elm_list_item_next.

          + +

          The following example shows selecting the item immediately following the currently selected one, unselecting it, selecting the next one and bringing it to the screen.

          + +
          +Evas_Object *list;
          +Elm_Object_Item *current, *next;
          +current = elm_list_selected_item_get(list);
          +elm_list_item_selected_set(current, EINA_FALSE);
          +next = elm_list_item_next(current);
          +elm_list_item_selected_set(next, EINA_TRUE);
          +elm_list_item_bring_in(next);
          +
          + +

          Using List Callbacks

          + +

          The list emits the following signals:

          +
            +
          • activated: The user double-clicks or presses (enter | return | spacebar) on an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • clicked,double: The user double-clicks an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • selected: The user selects an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • unselected: The user unselects an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • longpressed: The user long-presses an item. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • edge,top: The list is scrolled to the top edge.
          • +
          • edge,bottom: The list is scrolled to the bottom edge.
          • +
          • edge,left: The list is scrolled to the left edge.
          • +
          • edge,right: The list is scrolled to the right edge.
          • +
          • highlighted: The user highlights an item on the list. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          • unhighlighted: The user unhighlights an item in the list. The event_info parameter of the callback function contains a pointer to the item activated.
          • +
          + +

          You can register to the clicked,double signal with the following code. Note that the currently double-clicked item can be retrieved using the event_info pointer. This code registers to the double,clicked signal and unselects the item that has been double-clicked.

          + +
          +{
          +   Evas_Object *list;
          +
          +   evas_object_smart_callback_add(list, "clicked,double", double_clicked_cb, data);
          +}
          +
          +// Callback function for the "clicked" signal
          +// This callback is called when the button is clicked by the user
          +void double_clicked_cb(void *data, Evas_Object *obj, void  *event_info)
          +{
          +   elm_Object_Item *it = event_info;
          +   elm_list_selected_item_set(it,  EINA_FALSE);
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_map_mn.htm b/org.tizen.ui.practices/html/native/efl/component_map_mn.htm new file mode 100644 index 0000000..668b5d8 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_map_mn.htm @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + Map + + + + + + +
          +

          Map

          + +

          This feature is supported in mobile applications only.

          + +

          The map component displays a geographic map. The default map data are provided by the OpenStreetMap project (http://www.openstreetmap.org/). Custom providers can also be added.

          + +

          This UI component supports:

          +
            +
          • Zooming
          • +
          • Scrolling
          • +
          • Markers with content to be displayed when the user clicks over them
          • +
          • Group of markers
          • +
          • Routes
          • +
          + +

          The map component implements the scroller interface so that all the functions that work with the scroller component also work with maps.

          + +

          Figure: Map hierarchy

          +

          Map hierarchy

          + +

          Adding a Map Component

          + +

          Once created with the elm_map_add() function, zoom level x12 can be set.

          + +
          +Evas_Object *map, *parent;
          +
          +map = elm_map_add(parent);
          +elm_map_zoom_mode_set(map, ELM_MAP_ZOOM_MODE_MANUAL);
          +elm_map_zoom_set(map, 12);
          +
          + +

          Here the zoom mode is set to manual, but it can also be set to the ELM_MAP_ZOOM_MODE_AUTO_FIT mode and the ELM_MAP_ZOOM_MODE_AUTO_FILL mode. In that case however, the elm_map_zoom_set() function cannot be used.

          + +

          Playing with the Map

          + +

          If you have coordinates of a specific area (2 2 N, 48 8 E), it can be shown on the map.

          +
          +elm_map_region_show(map, 2.2, 48.8);
          +
          + +

          This shows the desired coordinates. The location can also be shown with a bring-in animation.

          +
          +elm_map_region_bring_in(map, 2.2, 48.8);
          +
          + +

          The map is rotated 90 degrees around the current position.

          +
          +elm_map_rotate_set(map, 90, 2.2, 48.8);
          +
          + +

          Drawing Overlays

          + +

          Overlays are markers that can be placed anywhere on the map. They can represent any object you want to put on the map.

          + +

          Creating an Overlay Class

          + +

          Overlay classes can be created if several objects are of the same type. For example, you can create a forest overlay class to represent the forests visible on the map. To do this, set the minimum zoom level at which this class is visible. The forest class overlay is visible when the zoom level is superior to eight.

          + +

          Set an icon ("Home" icon) to the forest class. This icon is displayed in place of the forest class on the map.

          +
          +Evas_Object *icon;
          +Elm_Map_Overlay *forest_class = elm_map_overlay_class_add(map);
          +
          +// Set min zoom level at which class is displayed
          +elm_map_overlay_displayed_zoom_min_set(forest_class, 8);
          +
          +// Create a Home icon object and set it to the forest class 
          +icon = elm_icon_add(map);
          +elm_icon_standard_set(icon, "home");
          +elm_map_overlay_icon_set(forest_class, icon);
          +
          + +

          Adding Overlays to a Class

          + +

          After creating a forest class, it is possible to add overlay objects to it. Here an overlay for the Meudon forest is created. The data is linked to the overlay with the elm_map_overlay_data_set() function. Set the name of the forest in the data. The icon can be set to the overlay with the elm_map_overlay_icon_set() function.

          + + + + + + + + + + +
          Note
          Do not use the same icon object for two different overlays. Create a new icon object each time you need one.
          + +
          +Elm_Map_Overlay *ovl;
          +const char* data_meudon = "Meudon forest";
          +const char* data_fausses = "Fausse forest";
          +
          +// Add an overlay
          +ovl = elm_map_overlay_add(map, 2.20718, 48.79759);
          +icon = elm_icon_add(map);
          +elm_icon_standard_set(icon, "stop");
          +elm_map_overlay_icon_set(ovl, icon);
          +elm_map_overlay_data_set(ovl, &data_meudon);
          +
          +// Add the new ovl object to the forest class 
          +elm_map_overlay_class_append(forest_class, ovl);
          +
          +// Add another overlay next to the first one 
          +ovl = elm_map_overlay_add(map, 2.1699, 48.8189);
          +icon = elm_icon_add(map);
          +elm_icon_standard_set(icon, "stop");
          +elm_map_overlay_icon_set(ovl, icon);
          +elm_map_overlay_data_set(ovl, &data_fausses);
          +elm_map_overlay_class_append(forest_class, ovl);
          +
          + +

          If you add another overlay to the forest class, the two overlays can be grouped under the forest class icon on certain zoom level conditions. You can define on which zoom level items are grouped.

          +
          +elm_map_overlay_class_zoom_max_set(forest_class, 8);
          +
          + +

          In this case, overlay members of the forest class are grouped when the map is displayed at less than zoom level eight.

          + +

          Creating Bubbles Following Overlays

          + +

          The following example shows how to set a content in a bubble following an overlay.

          + +
          +// Add an overlay bubble object 
          +Elm_Map_Overlay *bubble = elm_map_overlay_bubble_add(map);
          +
          +// Set it to follow a specific overlay (the last created one here) 
          +elm_map_overlay_bubble_follow(bubble, ovl);
          +
          + +

          Once following an overlay, the bubble appears, moves or hides following the parent overlay's behavior.

          + +

          Content is added to the bubble with the elm_map_overlay_bubble_content_append() function.

          + +

          Adding Other Overlays

          + +

          You can draw a circle on the map with coordinates and a radius size.

          +
          +Elm_Map_Overlay *circle = elm_map_overlay_circle_add(map, 2.2, 48.8, 0.02);
          +
          + +

          You can also add a scale at the 200x0 coordinate (in pixels).

          +
          +Elm_Map_Overlay *scale = elm_map_overlay_scale_add(map, 200, 0);
          +
          + +

          You can also draw a line, a polygon, or a route. For a full description of these functions, see the Map API.

          + +

          Calculating Routes

          + +

          A route between a starting point and an ending point is calculated with the elm_map_route_add() call. The type of transport and the routing calculation method can be provided so as to have the desired result.

          + +

          The following example shows how to get a route calculation between the first and the second overlay. It is configured to use the bicycle, and to find the fastest route possible.

          + +
          +Elm_Map_Route *route = elm_map_route_add(map,
          +         ELM_MAP_ROUTE_TYPE_BICYCLE,
          +         ELM_MAP_ROUTE_METHOD_FASTEST,
          +         2.20718, 48.79759,
          +         2.1699, 48.8189,
          +         NULL, NULL);
          +
          +// Add a callback to when the route has been calculated and loaded 
          +evas_object_smart_callback_add(map, "route,loaded", _route_loaded_cb, route);
          +
          + +

          Once the route is calculated, create a route overlay object and change its color. In this example, the route,loaded callback is used.

          +
          +static void
          +_route_loaded_cb(void *data, Evas_Object *obj, void *ev)
          +{
          +   Elm_Map_Route *route = data;
          +
          +   Elm_Map_Overlay *route_ovl = elm_map_overlay_route_add(obj, route);
          +   elm_map_overlay_color_set(route_ovl, 0, 255, 0, 255);
          +}
          +
          + +

          Using Map Callbacks

          + +

          The map component emits the following callbacks:

          +
            +
          • clicked: The user has clicked the map without dragging around.
          • +
          • clicked,double: The user has double-clicked the map.
          • +
          • press: The user has pressed down on the map.
          • +
          • longpressed: The user has pressed down on the map for a long time without dragging around.
          • +
          • scroll: The content is scrolled (moved).
          • +
          • scroll,drag,start: Dragging the contents around starts.
          • +
          • scroll,drag,stop: Dragging the contents around stops.
          • +
          • scroll,anim,start: Scrolling animation starts.
          • +
          • scroll,anim,stop: Scrolling animation stops.
          • +
          • zoom,start: Zoom animation starts.
          • +
          • zoom,stop: Zoom animation stops.
          • +
          • zoom,change: The zoom is changed when using an auto zoom mode.
          • +
          • tile,load: A map tile image load begins.
          • +
          • tile,loaded: A map tile image load ends.
          • +
          • tile,loaded,fail: A map tile image load fails.
          • +
          • route,load: Route request begins.
          • +
          • route,loaded: Route request ends.
          • +
          • route,loaded,fail: Route request fails.
          • +
          • name,load: Name request begins.
          • +
          • name,loaded: Name request ends.
          • +
          • name,loaded,fail: Name request fails.
          • +
          • overlay,clicked: An overlay is clicked.
          • +
          • loaded: The map is loaded.
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_notify_mn.htm b/org.tizen.ui.practices/html/native/efl/component_notify_mn.htm new file mode 100644 index 0000000..4c98e96 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_notify_mn.htm @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + Notify + + + + + + +
          +

          Notify

          + +

          This feature is supported in mobile applications only.

          + +

          The notify component displays a container in a particular region of the parent object. It can receive some content, and can be automatically hidden after a certain amount of time.

          + + +

          Figure: Notify hierarchy

          +

          Notify hierarchy

          + +

          Adding a Notify Component

          + +

          The following example shows how to create a notify object.

          + +
          +Evas_Object *notify, *parent;
          +notify = elm_notify_add(parent);
          +
          + +

          Configuring the Notify Component

          + +

          Create a label and add it to the notify object.

          + +
          +Evas_Object *content;
          +
          +// Create the label and set some text to it 
          +content = elm_label_add(parent);
          +
          +elm_object_text_set(content, "A label text");
          +evas_object_show(content);
          +
          +// Add the label object to the notify component
          +elm_object_content_set(notify, content);
          +
          + +

          In the following example the notify object is shown on the bottom left corner of the parent object.

          + +
          +elm_notify_align_set(notify, 1.0, 1.0);
          +evas_object_show(notify);
          +
          + +

          Set a timeout interval, after which the notify component is hidden. In the following example the timeout interval is five seconds.

          + +
          +elm_notify_timeout_set(notify, 5.0);
          +
          + +

          Using Notify Callbacks

          + +

          The notify component emits the following signals:

          +
            +
          • timeout: The timeout count ends and the notify component is hidden
          • +
          • block,clicked: The user clicks outside of the notify component
          • +
          + +

          For both these signals event_info is NULL.

          + +

          The following example shows how to register a callback on the timeout signal.

          + +
          +{
          +   evas_object_smart_callback_add(notify, "timeout", timeout_cb, data);
          +}
          +
          +// Callback function for the "timeout" signal
          +// The timeout expires and the notify object is hidden
          + 
          +void timeout_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Notify is hidden\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_notify_wn.htm b/org.tizen.ui.practices/html/native/efl/component_notify_wn.htm new file mode 100644 index 0000000..19dab41 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_notify_wn.htm @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + Notify + + + + + + +
          +

          Notify

          + +

          This feature is supported in wearable applications only.

          + +

          The notify component displays a container in a particular region of the parent object. It can receive some content, and can be automatically hidden after a certain amount of time.

          + +

          Figure: Notify hierarchy

          +

          Notify hierarchy

          + +

          Adding a Notify Component

          + +

          The following example shows how to create a notify object.

          +
          +Evas_Object *notify, *parent;
          +notify = elm_notify_add(parent);
          +
          + +

          Configuring the Notify Component

          + +

          Create a label and add it to the notify object.

          +
          +Evas_Object *content;
          +
          +// Create the label and set some text to it 
          +content = elm_label_add(parent);
          +
          +elm_object_text_set(content, "A label text");
          +evas_object_show(content);
          +
          +// Add the label object to the notify component
          +elm_object_content_set(notify, content);
          +
          + +

          In the following example the notify object is shown on the bottom left corner of the parent object.

          +
          +elm_notify_align_set(notify, 1.0, 1.0);
          +evas_object_show(notify);
          +
          + +

          Set a timeout interval, after which the notify component is hidden. In the following example the timeout interval is five seconds.

          +
          +elm_notify_timeout_set(notify, 5.0);
          +
          + +

          Using Notify Callbacks

          + +

          The notify component emits the following signals:

          +
            +
          • timeout: The timeout count ends and the notify component is hidden
          • +
          • block,clicked: The user clicks outside of the notify component
          • +
          + +

          For both these signals event_info is NULL.

          + +

          The following example shows how to register a callback on the timeout signal.

          + +
          +{
          +   evas_object_smart_callback_add(notify, "timeout", timeout_cb, data);
          +}
          +
          +// Callback function for the "timeout" signal
          +// The timeout expires and the notify object is hidden
          + 
          +void timeout_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Notify is hidden\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_panel_mn.htm b/org.tizen.ui.practices/html/native/efl/component_panel_mn.htm new file mode 100644 index 0000000..1071152 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_panel_mn.htm @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + Panel + + + + + + +
          +

          Panel

          + +

          This feature is supported in mobile applications only.

          + + +

          The panel component is an animated object that can contain subobjects. It can be expanded or contracted by clicking on the button on its edge.

          + +

          Panel inherits from layout component, so the layout API can be used on this UI component.

          + +

          Figure: Panel hierarchy

          +

          Panel hierarchy

          + +

          Adding a Panel Component

          + +

          The following example shows how to add a panel and set its orientation to the left.

          + +
          +Evas_Object *panel, *parent;
          +
          +panel = elm_panel_add(parent);
          +elm_panel_orient_set(panel, ELM_PANEL_ORIENT_LEFT);
          +
          + +

          Using the Panel

          + +

          The panel can be manually hidden.

          +
          +elm_panel_hidden_set(pan, EINA_TRUE);
          +
          + +

          The panel can be toggled if you do not know the hidden state of the UI component.

          +
          +elm_panel_toggle(pan);
          +
          + +

          The panel can be set scrollable.

          +
          +elm_panel_scrollable_set(pan, EINA_TRUE);
          +
          + +

          Creating a Drawer

          + +

          Tizen SDK has implemented a layout theme to add a drawer in the application. This example shows how to add a new Elementary layout object and set the theme of this layout to the drawer.

          + +
          +Evas_Object *layout;
          +
          +// Create a new layout object 
          +layout = elm_layout_add(parent);
          +
          +// Set the "drawer" group theme and "panel" style to it 
          +elm_layout_theme_set(layout,"layout", "drawer", "panel");
          +
          +// Show the new layout
          +evas_object_show(layout);
          +
          + +

          Once the panel object is created, it can be swallowed in the new layout.

          + +
          +elm_object_part_content_set(layout, "elm.swallow.left", pan);
          +
          + +

          You can set content to the elm.swallow.bg and elm.swallow.content parts of the layout.

          +
          +// Panel Background (Dimmed Area) 
          +Evas_Object *bg = create_bg(layout);
          +elm_object_part_content_set(layout, "elm.swallow.bg", bg);
          +
          +// Add content to the drawer 
          +Evas_Object *content;
          +elm_object_part_content_set(layout, "elm.swallow.content", content);
          +
          + +

          Using Panel Callbacks

          + +

          You can register a callback on the scroll signal, when the user scrolls the panel. The event_info parameter is of the type Elm_Panel_Scroll_Info.

          + +
          +{
          +   evas_object_smart_callback_add(pan, "scroll", scroll_cb, data);
          +}
          +// Callback function for the "scroll" signal
          +// This callback is called when the user scrolls the panel
          +void scroll_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Panel_Scroll_Info *scrollinfo = event_info;
          +   dlog_print(DLOG_INFO, LOG_TAG, "The panel was scrolled.\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_photocam_mn.htm b/org.tizen.ui.practices/html/native/efl/component_photocam_mn.htm new file mode 100644 index 0000000..161d139 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_photocam_mn.htm @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + Photocam + + + + + + +
          +

          Photocam

          + +

          This feature is supported in mobile applications only.

          + +

          The photocam component displays high resolution photos taken from digital cameras. It provides a way to zoom in the photo, load it fast, and fit it nicely on the screen. It is optimized for .jpeg images format and has a low memory footprint.

          + +

          This UI component implements the scroller interface, so all the functions concerning the scroller can be used with the photocam component.

          + + +

          Figure: Photocam hierarchy

          +

          Photocam hierarchy

          + +

          Adding a Photocam Component

          + +

          The following example shows how to create a photocam component and set an image file on it.

          + +
          +Evas_Object *photocam;
          +photocam = elm_photocam_add(win);
          +elm_photocam_file_set(photocam, "/tmp/photo.jpeg");
          +
          + +

          Using Photocam Zoom

          + +

          You can choose between two automatic zoom modes and a manual zoom mode. In the following example the zoom mode is set to manual and a double zoom is requested.

          +
          +elm_photocam_zoom_mode_set(photocam, ELM_PHOTOCAM_ZOOM_MODE_MANUAL);
          +elm_photocam_zoom_set(photocam, 2.0);
          +
          + +

          The zoom mode can be set to ELM_PHOTOCAM_ZOOM_MODE_AUTO_FIT. In this case, the photo fits exactly inside the scroll frame with no pixels outside this region. The zoom mode can also be set to ELM_PHOTOCAM_ZOOM_MODE_AUTO_FILL to fill all the pixels of the photocam component.

          + +

          Multi-touch zooming is activated by enabling gestures.

          +
          +elm_photocam_gesture_enabled_set(photocam, EINA_TRUE);
          +
          + +

          You can zoom in a specific region. The following example shows how to zoom in the region starting at the coordinates (200x200), with a width of 400px and a height of 300px.

          + +
          +elm_photocam_image_region_bring_in(photocam, 200, 200, 400, 300);
          +
          + +

          Using Photocam Callbacks

          + +

          The photocam component emits the following signals:

          +
            +
          • clicked: The user has clicked the photo without dragging around.
          • +
          • press: The user has pressed down on the photo.
          • +
          • longpressed: The user has pressed down on the photo for a long time without dragging around.
          • +
          • clicked,double: The user has double-clicked the photo.
          • +
          • load: The photo load begins.
          • +
          • loaded: The image file load is complete for the first view (a low resolution blurry version).
          • +
          • load,detail: A photo detailed data load begins.
          • +
          • loaded,detail: The image file load is complete for the detailed image data (full resolution is needed).
          • +
          • zoom,start: Zoom animation starts.
          • +
          • zoom,stop: Zoom animation stops.
          • +
          • zoom,change: The zoom is changed when using an auto zoom mode.
          • +
          • scroll: The content is scrolled.
          • +
          • scroll,anim,start: Scrolling animation starts.
          • +
          • scroll,anim,stop: Scrolling animation stops.
          • +
          • scroll,drag,start: Dragging the content around starts.
          • +
          • scroll,drag,stop: Dragging the content around stops.
          • +
          + +

          For all these signals, event_info is NULL.

          + +

          The following example shows how to register a callback on the loaded signal.

          + +
          +void message_port_cb(int local_port_id, const char *remote_app_id, bundle *message)
          +{
          +   evas_object_smart_callback_add(photocam, "loaded", loaded_cb, data);
          +}
          +
          +// Callback function for the "loaded" signal
          +// The photocam has loaded the photo file in a low resolution
          + 
          +void loaded_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The photo has been loaded\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_plug_mn.htm b/org.tizen.ui.practices/html/native/efl/component_plug_mn.htm new file mode 100644 index 0000000..75445e5 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_plug_mn.htm @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + Plug + + + + + + +
          +

          Plug

          + +

          This feature is supported in mobile applications only.

          + +

          The plug component shows an Evas_Object created by an other process. It can be used anywhere the same way as any other elementary UI component.

          + + +

          Figure: Plug hierarchy

          +

          Plug hierarchy

          + +

          Adding a Plug Component

          + +

          The following example shows how to create a plug.

          + +
          +Evas_Object *plug, *parent;
          +plug = elm_plug_add(parent);
          +
          + +

          Using the Plug

          + +

          The socket image provides the service where to connect the plug object with the elm_plug_connect() function. In this process, use the service name and number set by the socket you want to connect to.

          + +

          As an example, connect to a service named plug_test on the number 0.

          + +
          +elm_plug_connect(plug, "plug_test", 0, EINA_FALSE);
          +
          + +

          The Evas_Object corresponding to the distant image is retrieved with the elm_plug_image_object_get() function.

          + +
          +Evas_Object *plug_img = elm_plug_image_object_get(plug);
          +
          + + + + + + + + + + +
          Note
          The socket to connect to must be started with the elm_win_socket_listen() function in the other process on the remote window object (it is called remote_win here).
          + +
          +// Create a remote window in the other process 
          +Elm_Win *remote_win = elm_win_add(NULL, "Window Socket",
          +                                  ELM_WIN_SOCKET_IMAGE);
          +// Create a socket named "plug_test" and listen to it
          +elm_win_socket_listen(remote_win, "plug_test", 0, EINA_FALSE);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_plug_wn.htm b/org.tizen.ui.practices/html/native/efl/component_plug_wn.htm new file mode 100644 index 0000000..aaa1140 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_plug_wn.htm @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + Plug + + + + + + +
          +

          Plug

          + +

          This feature is supported in wearable applications only.

          + +

          The plug component shows an Evas_Object created by an other process. It can be used anywhere the same way as any other elementary UI component.

          + +

          Figure: Plug hierarchy

          +

          Plug hierarchy

          + +

          Adding a Plug Component

          + +

          The following example shows how to create a plug.

          +
          +Evas_Object *plug, *parent;
          +plug = elm_plug_add(parent);
          +
          + +

          Using the Plug

          + +

          The socket image provides the service where to connect the plug object with the elm_plug_connect() function. In this process, use the service name and number set by the socket you want to connect to.

          + +

          As an example, connect to a service named plug_test on the number 0.

          + +
          +elm_plug_connect(plug, "plug_test", 0, EINA_FALSE);
          +
          + +

          The Evas_Object corresponding to the distant image is retrieved with the elm_plug_image_object_get() function.

          + +
          +Evas_Object *plug_img = elm_plug_image_object_get(plug);
          +
          + + + + + + + + + + +
          Note
          The socket to connect to must be started with the elm_win_socket_listen() function in the other process on the remote window object (it is called remote_win here).
          + +
          +// Create a remote window in the other process 
          +Elm_Win *remote_win = elm_win_add(NULL, "Window Socket",
          +                                  ELM_WIN_SOCKET_IMAGE);
          +// Create a socket named "plug_test" and listen to it
          +elm_win_socket_listen(remote_win, "plug_test", 0, EINA_FALSE);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_popup_mn.htm b/org.tizen.ui.practices/html/native/efl/component_popup_mn.htm new file mode 100644 index 0000000..d0a0837 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_popup_mn.htm @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + Popup + + + + + + +
          +

          Popup

          + +

          This feature is supported in mobile applications only.

          + +

          The popup component shows a popup area that can contain:

          +
            +
          • a title area (optional)
          • +
          • a content area
          • +
          • an action area (optional)
          • +
          + +

          The optional title area can contain an icon and text, the action area can contain up to three buttons.

          + + +

          Figure: Popup component

          +

          Popup component

          + +

          Figure: Popup hierarchy

          +

          Popup hierarchy

          + +

          Adding a Popup Component

          + +

          The following example shows how to create a popup component.

          +
          +Evas_Object *popup, *parent;
          +
          +// Create a popup 
          +popup = elm_popup_add(parent);
          +
          + +

          Using Popup Styles

          + +

          The following item styles are available for the popup:

          + +
            +
          • popup
          • +
          • toast
          • +
          + +

          The following example sets the style of the popup to toast.

          + +
          elm_object_style_set(popup, "toast");
          + +

          Setting the Popup Areas

          + +

          Configure the title area. Set the icon object using the part name title,icon. Set the title text to Test popup using the partname title,text.

          + +
          +Evas_Object *icon;
          +
          +// Add an icon to the title area 
          +elm_object_part_content_set(popup, "title,icon", icon);
          +
          +// Set the title text 
          +elm_object_part_text_set(popup, "title,text", "Test popup");
          +
          + +

          Set the content of the popup. The content can be simple text.

          + +
          +elm_object_part_text_set(popup, "default", "Test popup");
          +
          + +

          The content can also be an Evas object.

          + +
          +Evas_Object *content;
          +
          +elm_object_content_set(popup, content);
          +
          + +

          Set the buttons of the action area by creating an OK button, a Cancel button, and a Help button.

          + +
          +Evas_Object *button1, *button2, *button3;
          +
          +// Create the 3 buttons 
          +
          +button1 = elm_button_add(popup);
          +elm_object_text_set(button1, "OK");
          +
          +button2 = elm_button_add(popup);
          +elm_object_text_set(button2, "Cancel");
          +
          +button3 = elm_button_add(popup);
          +elm_object_text_set(button3, "Help");
          +
          +// Set the buttons to the action area 
          +elm_object_part_content_set(popup, "button1", button1);
          +elm_object_part_content_set(popup, "button2", button2);
          +elm_object_part_content_set(popup, "button3", button3);
          +
          + +

          Using Popup Callbacks

          +

          The popup emits the following signals:

          +
            +
          • timeout: The popup is closed as a result of timeout.
          • +
          • block,clicked: The user clicks on the Blocked Event area.
          • +
          + +

          elm_popup_timeout_set() is used to hide the popup after a certain time. In this example, the timeout is set to five seconds.

          + +
          +elm_popup_timeout_set(popup, 5.0);
          +
          + +

          When the timeout expires, the timeout signal is sent to the user.

          + +
          +{
          +   evas_object_smart_callback_add(popup, "timeout", _timeout_cb, data);
          +}
          +
          +static void
          +_timeout_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Timeout \n");
          +}
          +
          + +

          The visible region of the popup is surrounded by a translucent region called Blocked Event area. By clicking on this area, the signal block,clicked is sent to the application.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_popup_wn.htm b/org.tizen.ui.practices/html/native/efl/component_popup_wn.htm new file mode 100644 index 0000000..fb8f950 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_popup_wn.htm @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + Popup + + + + + + +
          +

          Popup

          + +

          This feature is supported in wearable applications only.

          + +

          The popup component shows a popup area that can contain:

          +
            +
          • a title area (optional)
          • +
          • a content area
          • +
          • an action area (optional)
          • +
          + +

          The optional title area can contain an icon and text, the action area can contain up to three buttons.

          + +

          Figure: Popup component

          +

          Popup component

          + +

          Figure: Popup hierarchy

          +

          Popup hierarchy

          + +

          Adding a Popup Component

          + +

          The following example shows how to create a popup component.

          +
          +Evas_Object *popup, *parent;
          +
          +// Create a popup 
          +popup = elm_popup_add(parent);
          +
          + +

          Using Popup Styles

          + +

          The following item styles are available for the rectangular UI component:

          +
            +
          • popup
          • +
          • toast
          • +
          +

          The following item styles are available for the circular UI component:

          +
            +
          • circle
          • +
          • toast/circle
          • +
          +

          The following layout styles are available for the circular UI component:

          +
            +
          • content/circle
          • +
          • content/circle/buttons1
          • +
          • content/circle/buttons2
          • +
          + +

          The following example sets the style of the popup to toast.

          +
          +elm_object_style_set(popup, "toast");
          +
          + + +

          Setting the Popup Areas for Rectangular UI Components

          +

          Configure the title area. Set the title text to Test popup using the partname title,text.

          + +
          +elm_object_part_text_set(popup, "title,text", "Test popup");
          +
          +

          Set the content of the popup. The content can be simple text.

          +
          +elm_object_text_set(popup, "simple text");
          +
          +

          The content can also be an Evas object.

          +
          +Evas_Object *content;
          +
          +elm_object_content_set(popup, content);
          +
          +

          Set the buttons of the action area by creating an OK button and a Cancel button.

          +
          +Evas_Object *button1, *button2;
          +
          +// Create the two buttons 
          +button1 = elm_button_add(popup);
          +elm_object_style_set(button1, "popup");
          +evas_object_size_hint_weight_set(button1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_object_text_set(button1, "Cancel");
          +
          +button2 = elm_button_add(popup)
          +elm_object_style_set(button2, "popup");
          +evas_object_size_hint_weight_set(button2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_object_text_set(button2, "OK");
          +
          +evas_object_show(popup);
          +
          +// Set the buttons to the action area 
          +elm_object_part_content_set(popup, "button1", button1);
          +elm_object_part_content_set(popup, "button2", button2);
          +
          + +

          Setting the Popup Areas for Circular UI Components

          +

          Set the circle style and the layout of the popup.

          +
          +// Setting the style
          +elm_object_style_set(popup, "circle");
          +
          +// Setting the layout
          +layout = elm_layout_add(popup);
          +elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2");
          +
          + +

          To configure the title area, set the title text to Test popup using the partname elm.text.title.

          +
          +// Setting the title text 
          +elm_object_part_text_set(layout, "elm.text.title", "Text popup");
          +
          + +

          Set the content of the popup. The content can be simple text.

          +
          elm_object_part_text_set(layout, "elm.text.content", "Test popup");
          +
          + +

          The content of the popup can also be an Evas object.

          +
          +Evas_Object *content;
          +
          +elm_object_content_set(layout, content);
          +
          +

          Set the popup content.

          +
          +elm_object_content_set(popup, layout);
          +
          + +

          Set the buttons of the action area by creating an OK button, a Cancel button, and a Help button.

          + +
          +Evas_Object *button1, *button2, *icon;
          +
          +// Create the 2 buttons 
          +
          +button1 = elm_button_add(popup);
          +elm_object_style_set(button1, "popup/circle/left");
          +icon = elm_image_add(button1);
          +elm_image_file_set(icon, ICON_DIR"/b_option_list_icon_share.png", NULL);
          +evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_object_part_content_set(button1, "elm.swallow.content", icon);
          +evas_object_show(icon);
          +
          +button2 = elm_button_add(popup);
          +elm_object_style_set(button2, "popup/circle/right");
          +icon = elm_image_add(button2);
          +elm_image_file_set(icon, ICON_DIR"/b_option_list_icon_delete.png", NULL);
          +evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_object_part_content_set(button2, "elm.swallow.content", icon);
          +evas_object_show(icon);
          +
          +// Set the buttons to the action area 
          +elm_object_part_content_set(popup, "button1", button1);
          +elm_object_part_content_set(popup, "button2", button2);
          +
          +
          + +

          Using Popup Callbacks

          +

          The popup emits the following signals:

          +
            +
          • timeout: The popup is closed as a result of timeout.
          • +
          • block,clicked: The user clicks on the Blocked Event area.
          • +
          + +

          elm_popup_timeout_set() is used to hide the popup after a certain time. In the following example the timeout is set to five seconds.

          +
          elm_popup_timeout_set(popup, 5.0);
          + +

          When the timeout expires, the timeout signal is sent to the user.

          +
          +{
          +   evas_object_smart_callback_add(popup, "timeout", _timeout_cb, data);
          +}
          +
          +static void
          +_timeout_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Timeout \n");
          +}
          +
          + +

          The visible region of the popup is surrounded by a translucent region called Blocked Event area. By clicking on this area, the signal block,clicked is sent to the application.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_progressbar_mn.htm b/org.tizen.ui.practices/html/native/efl/component_progressbar_mn.htm new file mode 100644 index 0000000..0fd1cdb --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_progressbar_mn.htm @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + Progressbar + + + + + + +
          +

          Progressbar

          + +

          This feature is supported in mobile applications only.

          + +

          The progressbar component is used to display the progress status of a given job. It inherits from the layout component, so all function concerning the layout component is used on the progressbar component.

          + +

          Figure: Progressbar component

          +

          Progressbar component

          + +

          Figure: Progressbar hierarchy

          +

          Progressbar hierarchy

          + + +

          Adding a Progressbar Component

          + +

          The following example shows how to create a progressbar component.

          + +
          +Evas_Object *pb = elm_progressbar_add(win);
          +
          + +

          Using the Progressbar Styles

          + +

          The progressbar has several styles:

          +
            +
          • default
          • +
          • pending_list
          • +
          • process_large
          • +
          • process_medium
          • +
          • process_small
          • +
          + +

          Set the style of the progressbar to pending_list.

          + +
          elm_object_style_set(pb, "pending_list");
          + +

          Using the Progressbar

          + +

          By default, the progressbar does not show a label or an icon, and the unit label is set to %.0f %%.

          + +

          The following example shows how to set a label. In this example it is named Test label.

          + +
          +elm_object_text_set(pb, "Test label");
          +
          + +

          An icon is set with elm_object_part_content_set() using the partname icon.

          +
          +elm_object_part_content_set(pb, "icon", icon_object);
          +
          + +

          The unit label format string can be modified using a printf style format. Set it to be a float number with two decimals.

          +
          +elm_progressbar_unit_format_set(pb, "%1.2f%%");
          +
          + +

          Configuring the Progressbar

          + +

          The progressbar pulse mode is activated to make the progressbar loop infinitely between the start and end position.

          +
          +elm_progressbar_pulse_set(pb, EINA_TRUE);
          +elm_progressbar_pulse(pb, EINA_TRUE);
          +
          + +

          The progressbar can be inverted. In that mode, the values are inverted so that the high values are on the left and the low values on the right.

          +
          +elm_progressbar_inverted_set(pb, EINA_TRUE);
          +
          + +

          The progressbar emits the changed signal when the progress value changes. The value is changed with the elm_progressbar_value_set() function. Here the pb progress value is set to 20%.

          +
          +elm_progressbar_value_set(pb, 0.2);
          +
          + +

          The current value can be read.

          +
          +double value = elm_progressbar_value_get(pb);
          +
          + +

          You can set the orientation of the progressbar to vertical instead of the default horizontal orientation.

          +
          +elm_progressbar_horizontal_set(pb, EINA_FALSE);
          +
          + +

          Using the Progressbar Callbacks

          + +

          The changed signal is the only signal specifically emitted by the progressbar component.

          + +

          The following example shows how to register a callback on this signal.

          + +
          +{
          +   evas_object_smart_callback_add(pb, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the progressbar value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_progressbar_wn.htm b/org.tizen.ui.practices/html/native/efl/component_progressbar_wn.htm new file mode 100644 index 0000000..f8c18e3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_progressbar_wn.htm @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + Progressbar + + + + + + +
          +

          Progressbar

          + +

          This feature is supported in wearable applications only.

          + +

          The progressbar component is used to display the progress status of a given job. It inherits from the layout component, so all function concerning the layout component is used on the progressbar component.

          + +

          Figure: Progressbar component

          +

          Progressbar component

          + +

          Figure: Progressbar hierarchy

          +

          Progressbar hierarchy

          + +

          Adding a Progressbar Component

          + +

          The following example shows how to create a progressbar component.

          +
          +Evas_Object *pb = elm_progressbar_add(win);
          +
          + +

          Using the Progressbar Styles

          + +

          The progressbar has several styles for the rectangular UI components:

          +
            +
          • default
          • +
          • pending_list
          • +
          • process
          • +
          • process/groupindex
          • +
          • process/popup/small
          • +
          +

          The progressbar has several styles for the circular UI components:

          +
            +
          • process
          • +
          • process/small
          • +
          + +

          Set the style of the progressbar to pending_list.

          + +
          +elm_object_style_set(pb, "pending_list");
          +
          + +

          Configuring the Progressbar for Rectangular UI Components

          + +

          The progressbar pulse mode is activated to make the progressbar loop infinitely between the start and end position.

          +
          elm_progressbar_pulse_set(pb, EINA_TRUE);
          +elm_progressbar_pulse(pb, EINA_TRUE);
          +
          + +

          The progressbar can be inverted. In that mode, the values are inverted so that the high values are on the left and the low values on the right.

          +
          elm_progressbar_inverted_set(pb, EINA_TRUE);
          + +

          The progressbar emits the changed signal when the progress value changes. The value is changed with the elm_progressbar_value_set() function. Here the pb progress value is set to 20%.

          +
          elm_progressbar_value_set(pb, 0.2);
          + +

          It is possible to read the current value.

          +
          double value = elm_progressbar_value_get(pb);
          + +

          Configuring the Progressbar for Circular UI Components

          +

          The progressbar emits the changed signal when the progress value changes. The value is changed with the elm_progressbar_value_set() function. Here the pb progress value is set to 20%.

          + +
          +elm_progressbar_value_set(pb, 0.2);
          +
          +

          The current value can be read.

          +
          +double value = elm_progressbar_value_get(pb);
          +
          + + +

          Using the Progressbar Callbacks

          + +

          The changed signal is the only signal specifically emitted by the progressbar component.

          +

          The following example shows how to register a callback on this signal.

          + +
          +{
          +   evas_object_smart_callback_add(pb, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the progressbar value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_radio_mn.htm b/org.tizen.ui.practices/html/native/efl/component_radio_mn.htm new file mode 100644 index 0000000..ddef1f7 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_radio_mn.htm @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + Radio + + + + + + +
          +

          Radio

          + +

          This feature is supported in mobile applications only.

          + +

          This UI component displays one or more options, but the user can only select one of them. It is composed of an indicator (selected or unselected), an optional icon and an optional label. Even though it is usually grouped with two or more other radio objects, it can also be used alone.

          +

          The radio component inherits from the layout component. All the layout functions can be used with radio objects.

          + +

          Figure: Radio component

          +

          Radio component

          + +

          Figure: Radio hierarchy

          +

          Radio hierarchy

          + +

          Adding a Radio Component

          + +

          Create a radio component and set a label to it.

          +
          +Evas_Object *radio, *parent;
          +
          +// Create a radio
          +radio = elm_radio_add(parent);
          +
          +// Set a label to it
          +elm_object_text_set(radio, "Radio component");
          +
          + +

          Set an icon to the radio object.

          +
          +// Create a Home icon 
          +Evas_Object *icon;
          +
          +icon = elm_icon_add(parent);
          +elm_icon_standard_set(icon, "home");
          +
          +// Set it to the radio component 
          +elm_object_part_content_set(radio, "icon", icon);
          +
          + +

          Changing the Radio Value

          + +

          The user can select one of a set of values with the radio component. Each radio object from a group of radio objects represents an integer value. Here the value 1 is set to the new radio object.

          +
          +elm_radio_state_value_set(radio, 1);
          +
          + +

          Managing the Radio Groups

          + +

          The following example shows how to create a group of radio objects with at least two radio components.

          + +
          +// Create another radio object 
          +Evas_Object *radio2 = elm_radio_add(parent);
          +elm_radio_state_value_set(radio2, 2);
          +
          +// Create a group composed of radio and radio2
          +Evas_Object *group = radio;
          +elm_radio_group_add(radio2, group);
          +
          + +

          Now that a group composed of two radio objects has been created, you can choose which one is selected. In this example radio2 is selected.

          + +
          +elm_radio_value_set(group, 2);
          +
          + +

          You can use elm_radio_value_get() to see the currently selected radio of the group.

          + +

          Using the Radio Callbacks

          + +

          When the state of a radio is modified in a group of radio objects, the changed signal is emitted.

          +

          The following example shows how to register a callback on this signal.

          + +
          +{
          +   evas_object_smart_callback_add(radio, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the radio value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_radio_wn.htm b/org.tizen.ui.practices/html/native/efl/component_radio_wn.htm new file mode 100644 index 0000000..084f687 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_radio_wn.htm @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + Radio + + + + + + +
          +

          Radio

          + +

          This feature is supported in wearable applications only.

          + +

          This UI component displays one or more options, but the user can only select one of them. It is composed of an indicator (selected or unselected). Even though it is usually grouped with two or more other radio objects, it can also be used alone. +

          +

          The radio component inherits from the layout component. All the layout functions can be used with radio objects.

          + +

          Figure: Radio component

          +

          Radio component

          + +

          Figure: Radio hierarchy

          +

          Radio hierarchy

          + +

          Adding a Radio Component

          + +

          Create a radio component.

          +
          +Evas_Object *radio, *parent;
          +
          +// Create a radio
          +radio = elm_radio_add(parent);
          +
          + +

          Changing the Radio Value

          + +

          The user can select one of a set of values with the radio component. Each radio object from a group of radio objects represents an integer value. Here the value 1 is set to the new radio object.

          +
          +elm_radio_state_value_set(radio, 1);
          +
          + +

          Managing the Radio Groups

          + +

          The following example shows how to create a group of radio objects with at least two radio components.

          + +
          +// Create another radio object 
          +Evas_Object *radio2 = elm_radio_add(parent);
          +elm_radio_state_value_set(radio2, 2);
          +
          +// Create a group composed of radio and radio2
          +Evas_Object *group = radio;
          +elm_radio_group_add(radio2, group);
          +
          + +

          Now that a group composed of two radio objects has been created, you can choose which one is selected. In this example radio2 is selected.

          + +
          elm_radio_value_set(group, 2);
          + +

          You can use elm_radio_value_get() to see the currently selected radio of the group.

          + +

          Using the Radio Callbacks

          + +

          This UI component emits the following signals:

          +
          • changed: The state of a radio is modified in a group of radio objects.
          + +

          The following example shows how to register a callback on this signal.

          +
          +{
          +   evas_object_smart_callback_add(radio, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the radio value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The value has changed\n");
          +}
          +
          + +

          Using the Radio Callbacks with Circular UI Components

          + +

          This UI component emits the following signals:

          +
            +
          • changed: The user changes the slider value.
          • +
          • clicked: Radio was clicked.
          • +
          + +

          The following example shows how to register a callback on this signal.

          +
          +{
          +   evas_object_smart_callback_add(radio, "clicked", clicked_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the radio value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "This radio was clicked\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_segmentcontrol_mn.htm b/org.tizen.ui.practices/html/native/efl/component_segmentcontrol_mn.htm new file mode 100644 index 0000000..25e7cf8 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_segmentcontrol_mn.htm @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + Segmentcontrol + + + + + + +
          +

          Segmentcontrol

          + +

          This feature is supported in mobile applications only.

          + + +

          This UI component consists of several segment items. A segment item is similar to a discrete two state button. Any time, only one segment item can be selected. A segment item is composed of a label (text) and an icon.

          +

          This UI component inherits from the layout component, so all the layout components API can be used on segmentcontrol objects.

          + +

          Figure: Segmentcontrol with text

          +

          Segmentcontrol with text

          + +

          Figure: Segmentcontrol with icons

          +

          Segmentcontrol with icons

          + +

          Figure: Segmentcontrol hierarchy

          +

          Segmentcontrol hierarchy

          + +

          Adding a Segmentcontrol Component

          + +

          The following example shows how to add a segmentcontrol component.

          + +
          +Evas_Object *segcontrol, *parent;
          +
          +segcontrol = elm_segment_control_add(parent);
          +
          + +

          Adding Items

          + +

          You can add items to the UI component. In the following example four items containing only text labels (no icons) are added.

          +
          +Elm_Object_Item *it;
          +
          +elm_segment_control_item_add(segcontrol, NULL, "item1");
          +elm_segment_control_item_add(segcontrol, NULL, "item2");
          +elm_segment_control_item_add(segcontrol, NULL, "item3");
          +it = elm_segment_control_item_add(segcontrol, NULL, "item4");
          +
          + +

          You can also:

          +
            +
          • Insert an item at a specific position starting at 0. +
            +elm_segment_control_item_insert_at(segcontrol, NULL, "item7", 2);
            +
          • + +
          • Delete an item. +
            +elm_segment_control_item_del_at(segcontrol, 2);
            +
          • + +
          • Set the selected state of an item manually. +
            +elm_segment_control_item_selected_set(it, EINA_TRUE);
            +
          • +
          • Disable the whole segment control. +
            elm_object_disabled_set(segcontrol, EINA_TRUE);
          • +
          + +

          Using the Segmentcontrol Callbacks

          + +

          This is how to register a callback on the changedsignal. It is called when the user clicks on a segment item which is not previously selected. The event_info parameter is the segment item pointer.

          +
          +{
          +   evas_object_smart_callback_add(segcontrol, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the segcontrol selected item changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Segment_Item *it = event_info;
          +
          +   dlog_print(DLOG_INFO, LOG_TAG, "The selected segment item has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_slider_mn.htm b/org.tizen.ui.practices/html/native/efl/component_slider_mn.htm new file mode 100644 index 0000000..0cc0cca --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_slider_mn.htm @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + Slider + + + + + + +
          +

          Slider

          + +

          This feature is supported in mobile applications only.

          + +

          The slider component is a draggable bar that is used to select a value within a certain range.

          + + +

          Figure: Slider component

          +

          Slider component

          + +

          Figure: Slider hierarchy

          +

          Slider hierarchy

          + +

          Adding a Slider Component

          + +

          The following example shows how to create a slider object.

          +
          +Evas_Object *slider, *parent;
          +
          +slider = elm_slider_add(parent);
          +
          + +

          Using the Slider Styles

          + +

          A slider has the following styles:

          +
            +
          • default
          • +
          • center_point
          • +
          + +

          The following example sets the style to center_point.

          +
          +elm_object_style_set(slider, "center_point");
          +
          + +

          With this style, the slider 0 point is in the middle of the UI component.

          + +

          Configuring the Slider

          + +

          The orientation is set with the elm_slider_horizontal_set() function, and it is inverted the same way as the progressbar component. In the following example it is set to vertical and inverted.

          +
          +elm_slider_horizontal_set(slider, EINA_FALSE);
          +elm_slider_inverted_set(slider, EINA_TRUE);
          +
          + +

          The slider can contain icons (icon and end partnames), a label, a unit label, and an indicator label.

          +
          +Evas_Object *icon1, *icon2;
          +
          +// Set the icons 
          +elm_object_part_content_set(slider, "icon", icon1);
          +elm_object_part_content_set(slider, "end", icon2);
          +
          +// Set the label 
          +elm_object_part_text_set(slider, "default", "slider label");
          +
          +// Set the unit format 
          +elm_slider_unit_format_set(slider, "%1.2f meters");
          +
          + +

          Before using the slider, its minimum and maximum values are set with elm_slider_min_max_set(). The current value is set with (elm_slider_value_set()). The following example sets the minimum value to 0, the maximum value to 100, and the current value to 50.

          +
          +elm_slider_min_max_set(slider, 0.0, 100.0);
          +elm_slider_value_set(slider, 50.0);
          +
          + +

          The span of the slider represents its length horizontally or vertically. It is set with elm_slider_span_size_set() and is scaled by the object or applications scaling factor.

          +

          You can retrieve the current value of the slider anytime.

          +
          +double value = elm_slider_value_get(slider);
          +
          + +

          By default, the slider indicator becomes bigger when the user drags it. This can be disabled if you want the slider indicator to keep its default size. The following example sets the state of the indicator enlargement and then inverts the behavior.

          +
          +// Get the current state of the indicator 
          +Eina_Bool enlarge = elm_slider_indicator_show_get(slider);
          +
          +// Invert the behavior 
          +elm_slider_indicator_show_set(slider, !enlarge);
          +
          + +

          Using the Slider Callbacks

          + +

          This UI component emits the following signals:

          +
            +
          • changed: The user changes the slider value.
          • +
          • slider,drag,start: Dragging the slider indicator around starts.
          • +
          • slider,drag,stop: Dragging the slider indicator around stops.
          • +
          • delay,changed: A short time after the user changes the value. This is called only when the user stops dragging for a very short period or when releases the finger or mouse, so that it avoids possibly expensive reactions to the value change.
          • +
          + +

          For all these signals, event_info is NULL.

          +

          The following example shows how to register a callback on the changed signal.

          +
          +{
          +   evas_object_smart_callback_add(slider, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the slider value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The slider has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_slider_wn.htm b/org.tizen.ui.practices/html/native/efl/component_slider_wn.htm new file mode 100644 index 0000000..7817148 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_slider_wn.htm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + Slider + + + + + + +
          +

          Slider

          + +

          This feature is supported in wearable applications only.

          + +

          The slider component contains a draggable bar that is used to select a value within a certain range. It is used with rectangular UI components.

          + +

          Figure: Slider component

          +

          Slider component

          + +

          Figure: Slider hierarchy

          +

          Slider hierarchy

          + +

          Adding a Slider Component

          + +

          The following example shows how to create a slider object.

          +
          +Evas_Object *slider, *parent;
          +
          +slider = elm_slider_add(parent);
          +
          + +

          Using the Slider Styles

          + +

          A slider has the following styles:

          +
            +
          • default
          • +
          + +

          Configuring the Slider

          + +

          It can contain icons (elm.swallow.icon partname), a label, a unit label and an indicator label.

          +
          +Evas_Object *icon1, *icon2;
          +
          +// Set the icons 
          +elm_object_part_content_set(slider, "elm.swallow.icon", icon1);
          +
          +// Set the unit format 
          +elm_slider_unit_format_set(slider, "%1.2f meters");
          +
          + +

          Before using the slider, its minimum and maximum values are set with elm_slider_min_max_set(). The current value is set with (elm_slider_value_set()). The following example sets the minimum value to 0, the maximum value to 100, and the current value to 50.

          +
          +elm_slider_min_max_set(slider, 0.0, 100.0);
          +elm_slider_value_set(slider, 50.0);
          +
          + +

          The span of the slider represents its length horizontally. It is set with elm_slider_span_size_set() and is scaled by the object or applications scaling factor.

          +

          You can retrieve the current value of the slider anytime.

          +
          +double value = elm_slider_value_get(slider);
          +
          + +

          By default, the slider indicator becomes bigger when the user drags it. This can be disabled if you want the slider indicator to keep its default size. The following example sets the state of the indicator enlargement and then inverts the behavior.

          +
          +// Get the current state of the indicator 
          +Eina_Bool enlarge = elm_slider_indicator_show_get(slider);
          +
          +// Invert the behavior 
          +elm_slider_indicator_show_set(slider, !enlarge);
          +
          + +

          Using the Slider Callbacks

          + +

          This UI component emits the following signals:

          +
            +
          • changed: The user changes the slider value.
          • +
          • slider,drag,start: Dragging the slider indicator around starts.
          • +
          • slider,drag,stop: Dragging the slider indicator around stops.
          • +
          • delay,changed: A short time after the user changes the value. This is called only when the user stops dragging for a very short period or when releases the finger or mouse, so that it avoids possibly expensive reactions to the value change.
          • +
          + +

          For all these signals, event_info is NULL.

          +

          The following example shows how to register a callback on the changed signal.

          +
          +{
          +   evas_object_smart_callback_add(slider, "changed", changed_cb, data);
          +}
          +
          +// Callback function for the "changed" signal
          +// This callback is called when the slider value changes
          +void changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The slider has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_spinner_mn.htm b/org.tizen.ui.practices/html/native/efl/component_spinner_mn.htm new file mode 100644 index 0000000..d162a77 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_spinner_mn.htm @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + Spinner + + + + + + +
          +

          Spinner

          + +

          This feature is supported in mobile applications only.

          + +

          The spinner component increases or decreases a numeric value with the arrow buttons.

          + +

          This UI component inherits from the layout component, so all functions concerning the layout component are used on the spinner component.

          + + +

          Figure: Spinner component

          +

          Spinner component

          + +

          Figure: Spinner hierarchy

          +

          Spinner hierarchy

          + +

          Adding a Spinner Component

          +

          The following example shows how to create a spinner object.

          + +
          +Evas_Object *spin, *parent;
          +
          +spin = elm_spinner_add(parent);
          +
          + +

          Configuring the Spinner

          + +

          The label format is set to a different value:

          +
          +elm_spinner_label_format_set(spin, "%1.2f meters");
          +
          + +

          You can determine the result of clicking the arrow buttons. In this example, a click on an arrow increases or decreases with 2.0 units:

          +
          +elm_spinner_step_set(spin, 2.0);
          +
          +

          The wrapping mode is activated. In this mode, the spinner wraps when it reaches its minimum or maximum value.

          +
          +elm_spinner_wrap_set(spin, EINA_TRUE);
          +
          + +

          You can set the minimum and maximum values of the spinner.

          +
          +elm_spinner_min_max_set(spin, -25.0, 100.0);
          +
          + +

          The spinner object can be set vertical, and the change interval when the user presses the arrows long can be modified so that it changes faster.

          +
          +elm_object_style_set(spin, "vertical");
          +elm_spinner_interval_set(spin, 0.1);
          +
          + +

          If the user has to select between text values instead of numerical values, it is possible to add our own text labels. Here spin2 object shows three numbers written in text characters.

          +
          Evas_Object *spin2 = elm_spinner_add(parent);
          +elm_spinner_min_max_set(spin2, 1, 3);
          +elm_spinner_special_value_add(spin2, 1, "One");
          +elm_spinner_special_value_add(spin2, 2, "Two");
          +elm_spinner_special_value_add(spin2, 3, "Three");
          +
          + +

          Using the Spinner Callbacks

          + +

          This UI component emits the following signals:

          +
            +
          • changed: The spinner value changes.
          • +
          • delay,changed: A short time after the user changes the value. This is called only when the user stops dragging for a very short period or releases the finger or mouse, so that it avoids possibly expensive reactions to the value change.
          • +
          + +

          The following example shows how to register a callback on the delay,changed signal.

          + +
          +{
          +   evas_object_smart_callback_add(spin, "delay,changed", delay_changed_cb, data);
          +}
          +
          +// Callback function for the "delay,changed" signal
          +// This callback is called a short time after the spinner value changes
          +void delay_changed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "The spinner value has changed\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_toolbar_mn.htm b/org.tizen.ui.practices/html/native/efl/component_toolbar_mn.htm new file mode 100644 index 0000000..5a2903c --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_toolbar_mn.htm @@ -0,0 +1,206 @@ + + + + + + + + + + + + + + Toolbar + + + + + + +
          +

          Toolbar

          + +

          This feature is supported in mobile applications only.

          + + +

          This UI component is a scrollable list of items and shows a menu when an item is selected. Only one item can be selected at a time.

          + + +

          Figure: Toolbar component

          +

          toolbar component

          + +

          Figure: Toolbar hierarchy

          +

          Toolbar hierarchy

          + +

          Adding a Toolbar Component

          + +

          Use the following function to create a toolbar.

          +
          +Evas_Object *toolbar, *parent;
          +
          +toolbar = elm_toolbar_add(parent);
          +
          + +

          Using the Toolbar Styles

          +

          The toolbar has the following styles:

          +
            +
          • default
          • +
          • tabbar
          • +
          • tabbar_with_title
          • +
          • navigationbar
          • +
          +

          The following example sets the style to navigationbar.

          +
          +elm_object_style_set(toolbar, "navigationbar");
          +
          + +

          Configuring the Toolbar

          +

          The toolbar displays its items in one of the following options.

          +
            +
          • ELM_TOOLBAR_SHRINK_NONE: The toolbar sets a minimum size to its items so that all of them fit without scrolling.
          • +
          • ELM_TOOLBAR_SHRINK_HIDE: The toolbar does not scroll or show the items that do not fit in.
          • +
          • ELM_TOOLBAR_SHRINK_SCROLL: The toolbar scrolls to show the items that do not fit in.
          • +
          • ELM_TOOLBAR_SHRINK_MENU: The toolbar creates a button to popup hidden items.
          • +
          + +

          Here the toolbar is set to ELM_TOOLBAR_SHRINK_NONE.

          +
          +elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_NONE);
          +
          +

          By default, the toolbar displays items homogeneously. Items with long labels occupy a lot of space. To avoid that, you can disable the homogeneous mode.

          +
          +elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
          +
          + +

          Adding Items to the Toolbar

          +

          The following example shows how to add two items and choose the associated icon, label, and function to call when the item is clicked.

          +
          +{
          +   Elm_Object_Item *home_it, *help_it;
          +
          +   home_it = elm_toolbar_item_append(toolbar, "home", "Home",
          +                                    _home_item_pressed_cb, NULL);
          +   help_it = elm_toolbar_item_append(toolbar, "help", "Help",
          +                                    _help_item_pressed_cb, NULL);
          +}
          +
          +static void
          +_home_item_pressed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Home item clicked \n");
          +}
          +
          +static void
          +_help_item_pressed_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Help item clicked \n");
          +}
          +
          + +

          An item can be disabled. This is how to disable the help item. The disabled item does not receive input and, if the theme supports it, is themed differently (usually greyed out) from its normal state.

          +
          +elm_object_item_disabled_set(help_it, EINA_TRUE);
          +
          + +

          Adding Items with States

          +

          Items have two or more states. Each state has its own icon, label, and function to call when an item is clicked. The following example shows how to create two states to the help item with the same icon but two different labels.

          +
          +elm_toolbar_item_state_add(help_it, "help", "Help state 1",
          +                           _help_item_pressed_cb, NULL);
          +elm_toolbar_item_state_add(help_it, "help", "Help state 2",
          +                           _help_item_pressed_cb, NULL);
          +
          +

          It is possible to cycle through the states of the help item by using the following code.

          +
          +elm_toolbar_item_state_set(help_it, elm_toolbar_item_state_next(help_it));
          +
          + +

          Using the Toolbar Callbacks

          +

          This UI component emits the following signals:

          +
            +
          • clicked: The user clicks on a toolbar item, which is selected. event_info is an object of the type Elm_Toolbar_Item.
          • +
          • clicked,double: The user double-clicks on a toolbar item. event_info is an object of the type Elm_Toolbar_Item.
          • +
          • longpressed: The toolbar is pressed for a certain amount of time. event_info is an object of the type Elm_Toolbar_Item.
          • +
          • language,changed: The program language changes.
          • +
          • item,focused: The item is highlighted. event_info is an object of the type Elm_Toolbar_Item.
          • +
          • item,unfocused: The highlight is removed from the item. event_info is an object of the type Elm_Toolbar_Item.
          • +
          • scroll: The toolbar scrolls. event_info is NULL.
          • +
          • scroll,anim,start: The toolbar scrolling animation starts. event_info is NULL.
          • +
          • scroll,anim,stop: The toolbar scrolling animation stops. event_info is NULL.
          • +
          • scroll,drag,start: The user starts dragging the toolbar. event_info is NULL.
          • +
          • scroll,drag,stop: The user stops dragging the toolbar. event_info is NULL.
          • +
          +

          The following example shows how to register a callback on the clicked signal.

          +
          +{
          +   evas_object_smart_callback_add(toolbar, "clicked", clicked_cb, data);
          +}
          +
          +// Callback function for the "clicked" signal
          +// This callback is called when a toolbar item is clicked
          +void clicked_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   Elm_Toolbar_Item * item = event_info;
          +
          +   dlog_print(DLOG_INFO, LOG_TAG, "Item clicked\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_tooltip_mn.htm b/org.tizen.ui.practices/html/native/efl/component_tooltip_mn.htm new file mode 100644 index 0000000..96e85c9 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_tooltip_mn.htm @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + Tooltip + + + + + + +
          +

          Tooltip

          + +

          This feature is supported in mobile applications only.

          + + +

          The tooltip component is a smart object that shows a content in a frame when mouse hovers a parent object. The UI component provides tips or information about the parent object.

          + +

          Adding a Tooltip

          +

          The tooltip component cannot be created with the elm_tooltip_add() function. This component is already contained in a parent component when it is created. You can only activate or disable it.

          + +

          Activating the Tooltip

          +

          To activate the tooltip on a parent object, you can set a tooltip text to the parent object.

          +
          +Evas_Object *parent;
          +
          +elm_object_tooltip_text_set(parent, "The tooltip text";
          +
          +

          You can also set a content to the parent object.

          +
          +{
          +   elm_object_tooltip_content_cb_set(parent, tooltip_content_cb, NULL, tooltip_content_del_cb);
          +}
          +
          +Evas_Object*
          +tooltip_content_cb(void*data, Evas_Object *obj, Evas_Object *tooltip)
          +{
          +   // Create the tooltip content 
          +}
          +
          +void tooltip_content_del_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   // Destroy the tooltip content 
          +}
          +
          + +

          When passing content to the tooltip, the tooltip_content_cb function is called each time the tooltip is showed. The role of this function is to create the content to set in the tooltip. It returns a pointer to an Evas_Object.

          +

          When the tooltip disappears, the tooltip_content_del_cb function is called. This function is in charge of deleting the previously allocated Evas_Object.

          +

          Once set, the tooltip can be manually hidden or shown.

          + +
          +elm_object_tooltip_hide(parent);
          +elm_object_tooltip_show(parent);
          +
          + +

          The tooltip can be removed from the parent object when it is not needed.

          +
          +elm_object_tooltip_unset(parent);
          +
          + + + + + + + + + + +
          Note
          When content is set into the tooltip object, unsetting it calls the callback provided as del_cb to notify that the tooltip cannot be used any longer.
          + +

          A tooltip object is not a UI component, so it does not emit signals. There are no registered callbacks for it.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_win_mn.htm b/org.tizen.ui.practices/html/native/efl/component_win_mn.htm new file mode 100644 index 0000000..4ab5ae2 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_win_mn.htm @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + Win + + + + + + +
          +

          Win

          + +

          This feature is supported in mobile applications only.

          + +

          The window component is the root UI component that is often used in an application. It allows the developer create content in it, and it is handled by the window manager.

          +

          The window component is created with the elm_win_add() or elm_win_util_standard_add() function. The content can be added in the window with elm_win_resize_object_add() so that a window resize also resizes the content inside.

          + + +

          Figure: Win hierarchy

          +

          Win hierarchy

          + +

          Adding a Window Component

          + +

          Create a new window and change the title.

          +
          +Evas_Object *window;
          +
          +// Create a window 
          +window = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +
          +// Change the window title 
          +elm_win_title_set(window, "Example Window");
          +
          + +

          The first element of elm_win_add() is the parent window. For example, for a dialog you want to have the main window as the parent. Here, it is NULL, meaning there is no parent. main is the name of the window used by the window manager for identifying the window uniquely amongst all the windows within this application (and all instances of the application). The type is a basic window (the final parameter).

          + +

          Create a new window with a title and a background. This API is a shortcut of the previous one. It also creates a standard background to the window with elm_bg_add(). The window created is of the type ELM_WIN_BASIC.

          + +
          +Evas_Object *window;
          +
          +// Create a standard window 
          +window = elm_win_util_standard_add("main", "Example Window");
          +
          + +

          Closing a Window

          +

          When the user closes the window outside of the program control, a delete,request signal is emitted to indicate that this event occurred. The developer can take any action, for example, destroy the window object.

          +

          When the autodel parameter is set, the window is automatically destroyed after the signal is emitted. If autodel is EINA_FALSE, the window is not destroyed and the program does so when required. The default is EINA_FALSE, where the window is not destroyed automatically.

          +

          The autodel is set using the following call:

          +
          +elm_win_autodel_set(window, EINA_TRUE);
          +
          + +

          To close the window, use the evas_object_del() function. The window is destroyed and the signal delete,request is sent.

          + +

          Using the Window Callbacks

          +

          The window component emits the following signals:

          +
            +
          • focus,in: The window received focus.
          • +
          • focus,out: The window lost focus.
          • +
          • moved: The window that holds the canvas is moved.
          • +
          • withdrawn: The window is managed normally but is removed from the view.
          • +
          • iconified: The window is minimized (for example, into an icon or a taskbar).
          • +
          • normal: The window is in the normal state (not withdrawn or iconified).
          • +
          • stick: The window shows on all desktops.
          • +
          • unstick: The window shows only on one desktop.
          • +
          • fullscreen: The window is fullscreen.
          • +
          • unfullscreen: The window stops being fullscreen.
          • +
          • maximized: The window is maximized.
          • +
          • unmaximized: The window is diminished.
          • +
          • wm,rotation,changed: The rotation of the window is changed by the Windows Manager.
          • +
          • ioerr: A low-level I/O error occurred in the display system.
          • +
          +

          With all these signals, event_info is NULL.

          +

          The following example registers a callback function called on the fullscreen signal.

          +
          +{
          +   evas_object_smart_callback_add(window, "fullscreen", fullscreen_cb, data);
          +}
          +
          +// Callback function for the "fullscreen" signal
          +// This callback is called when the window becomes fullscreen
          +void fullscreen_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Window fullscreen\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/component_win_wn.htm b/org.tizen.ui.practices/html/native/efl/component_win_wn.htm new file mode 100644 index 0000000..b7fcad3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/component_win_wn.htm @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + Win + + + + + + +
          +

          Win

          + +

          This feature is supported in wearable applications only.

          + +

          The window component is the root UI component that is often used in an application. It allows the developer create content in it, and it is handled by the window manager.

          +

          The window component is created with the elm_win_add() or elm_win_util_standard_add() function. The content can be added in the window with elm_win_resize_object_add() so that a window resize also resizes the content inside.

          + + +

          Figure: Win hierarchy

          +

          Win hierarchy

          + +

          Adding a Window Component

          + +

          Create a new window and change the title.

          +
          +Evas_Object *window;
          +
          +// Create a window 
          +window = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +
          +// Change the window title 
          +elm_win_title_set(window, "Example Window");
          +
          + +

          The first element of elm_win_add() is the parent window. For example, for a dialog you want to have the main window as the parent. Here, it is NULL, meaning there is no parent. main is the name of the window used by the window manager for identifying the window uniquely amongst all the windows within this application (and all instances of the application). The type is a basic window (the final parameter).

          + +

          Create a new window with a title and a background. This API is a shortcut of the previous one. It also creates a standard background to the window with elm_bg_add(). The window created is of the type ELM_WIN_BASIC.

          + +
          +Evas_Object *window;
          +
          +// Create a standard window 
          +window = elm_win_util_standard_add("main", "Example Window");
          +
          + +

          Closing a Window

          +

          When the user closes the window outside of the program control, a delete,request signal is emitted to indicate that this event occurred. The developer can take any action, for example, destroy the window object.

          +

          When the autodel parameter is set, the window is automatically destroyed after the signal is emitted. If autodel is EINA_FALSE, the window is not destroyed and the program does so when required. The default is EINA_FALSE, where the window is not destroyed automatically.

          +

          The autodel is set using the following call:

          +
          +elm_win_autodel_set(window, EINA_TRUE);
          +
          + +

          To close the window, use the evas_object_del() function. The window is destroyed and the signal delete,request is sent.

          + +

          Using the Window Callbacks

          +

          The window component emits the following signals:

          +
            +
          • delete,request: The window is requested delete.
          • +
          • focus,in: The window received focus.
          • +
          • focus,out: The window lost focus.
          • +
          • moved: The window that holds the canvas is moved.
          • +
          • withdrawn: The window is managed normally but is removed from the view.
          • +
          • iconified: The window is minimized (for example, into an icon or a taskbar).
          • +
          • normal: The window is in the normal state (not withdrawn or iconified).
          • +
          • stick: The window shows on all desktops.
          • +
          • unstick: The window shows only on one desktop.
          • +
          • fullscreen: The window is fullscreen.
          • +
          • unfullscreen: The window stops being fullscreen.
          • +
          • maximized: The window is maximized.
          • +
          • unmaximized: The window is diminished.
          • +
          • wm,rotation,changed: The rotation of the window is changed by the Windows Manager.
          • +
          • ioerr: A low-level I/O error occurred in the display system.
          • +
          • indicator,prop,changed: The property or indicator mode and indicator opacity are changed.
          • +
          • rotation,changed: The rotation of the window is changed.
          • +
          • profile,changed: The profile of the window is changed.
          • +
          • aux,hint,allowed: aux_hint of the window free.
          • +
          • access,changed: The access function of the window is changed.
          • +
          +

          With all these signals, event_info is NULL.

          +

          The following example registers a callback function called on the fullscreen signal.

          +
          +{
          +   evas_object_smart_callback_add(window, "fullscreen", fullscreen_cb, data);
          +}
          +
          +// Callback function for the "fullscreen" signal
          +// This callback is called when the window becomes fullscreen
          +void fullscreen_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Window fullscreen\n");
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + + diff --git a/org.tizen.ui.guides/html/native/efl/components_mn.htm b/org.tizen.ui.practices/html/native/efl/components_mn.htm old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/native/efl/components_mn.htm rename to org.tizen.ui.practices/html/native/efl/components_mn.htm diff --git a/org.tizen.ui.guides/html/native/efl/components_wn.htm b/org.tizen.ui.practices/html/native/efl/components_wn.htm old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/native/efl/components_wn.htm rename to org.tizen.ui.practices/html/native/efl/components_wn.htm diff --git a/org.tizen.ui.practices/html/native/efl/containers_n.htm b/org.tizen.ui.practices/html/native/efl/containers_n.htm new file mode 100644 index 0000000..a0e1fe0 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/containers_n.htm @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + Using Container UI Components + + + + + + +
          +

          Using Container UI Components

          + +

          Box

          + + +

          Figure: Box container

          +

          Box container

          + + +

          Most of the time, you want to display UI components on the screen in a specific order. In a form container, for example, the user information is arranged vertically. This basic container is called a box. There is no theme for a box layout. It is just a linear method of arranging UI components horizontally or vertically.

          +

          Creating a Box

          +

          To create a new horizontal box:

          +
          Evas_Object *vbox;
          +
          +vbox = elm_box_add(parent);
          +
          +

          By default, the elm_box_add() function creates a vertical box. If you want to create a horizontal box, use the elm_box_horizontal_set() function:

          +
          Evas_Object *hbox;
          +
          +hbox = elm_box_add(parent);
          +elm_box_horizontal_set(hbox, EINA_TRUE);
          +
          + + + + + + + + + + +
          Note
          A box is a non-graphical object. It adds no graphics to or around the objects it holds.
          + +

          Adding Objects to the Box

          +

          You can add any Evas object to the box. Here, we create 5 button components and add them to a box:

          +
          int i;
          +Evas_Object *bt;
          +Evas_Object *vbox;
          +
          +vbox = elm_box_add(parent);
          +
          +for (i = 0; i < 5; i++)
          +{
          +   char tmp[16];
          +   snprintf(tmp, sizeof(tmp), "Button %d", i);
          +   bt = elm_button_add(vbox);
          +   elm_object_text_set(bt, tmp);
          +   elm_box_pack_end(vbox, bt);
          +   evas_object_show(bt);
          +}
          +evas_object_show(vbox);
          +
          +

          The most important function in the above code is elm_box_pack_end(), which is used to add the button component to the end of the box.

          + +

          Setting the Padding

          +

          You can set the padding between the objects in a box by using the elm_box_padding_set() function. The padding values are the number of pixels horizontally and vertically.

          +
          elm_box_padding_set(vbox, 16, 64);
          +
          + +

          Handling Element Size

          +

          You can add different-size elements to a container. For example, to add an image with a size of 128x128 pixels as the first element in a box, use the elm_box_pack_start() function:

          +
          ic = elm_icon_add(vbox);
          +elm_image_file_set(ic, "./c1.png", NULL);
          +evas_object_size_hint_min_set(ic, 128, 128);
          +evas_object_show(ic);
          +elm_box_pack_start(vbox, ic);
          +
          +

          We ask Evas to set the size hint for the icon object by using the elm_object_size_hint_min_set() function. Evas will try to set the minimum size of this object accordingly.

          +

          If you want to create a homogeneous box, where all objects have the same height or width, depending on the orientation of the box, use the elm_box_homogeneous_set() function:

          +
          elm_box_homogeneous_set(vbox, EINA_TRUE);
          +
          +

          Elementary will set the height of the tallest object as the height of all objects, or the width of the widest element as the width of all objects.

          +

          Setting the Alignment

          +

          You can set the alignment of UI components inside a box using the elm_box_align_set() function. The function takes two doubles values, a horizontal value and a vertical value, representing the percentage between 0 and 1.0 of the alignment in the horizontal and vertical axes. When you add a UI component with the elm_box_pack_end() or elm_box_pack_start() function, Elementary computes the global size of the box. If the global size is bigger than the size of the box's parent, the box will take up all the space occupied by the parent, and the size of the parent may be extended to hold the box. If the global size is smaller than the parent's size, the alignment values will set the position of the box inside the parent.

          + +

          Figure: Alignment

          +

          Alignment

          + +

          Here, we set an alignment of 0.8 vertically:

          +
          elm_box_align_set(vbox, 0.0, 0.8);
          +
          + + + + + + + + + + +
          Note
          The alignment only takes effect in the opposite direction than the one defined with the elm_box_horizontal_set() function.
          + + +

          The elm_box_layout_transition() function provides the ability to animate the motion of the objects in a box when switching from one layout to another.

          +

          Using Size Hints

          +

          Size hints are a set of functions that can be used on any Evas object. You request Evas to take care of various properties, and Evas will honor these requests if it can. This is why they are called "hints". The size hint functions are:

          +
            +
          • evas_object_size_hint_min_set()
          • +
          • evas_object_size_hint_max_set()
          • +
          • evas_object_size_hint_aspect_set()
          • +
          • evas_object_size_hint_align_set()
          • +
          • evas_object_size_hint_weight_set()
          • +
          +

          You can also use the respective get functions to get the current hint values.

          +

          In case of the evas_object_size_hint_min_set() function, you ask Evas to respect the minimum size you define for the object. For example, to set the minimum size of an icon to 64x46 pixels:

          +
          evas_object_size_hint_min_set(ic, 64, 64);
          +
          +

          You can also set a maximum size for the same icon:

          +
          evas_object_size_hint_max_set(ic, 128, 128);
          +
          +

          When you resize the parent of the icon, if there are no constraints to the parent, the minimum size of the parent will be the minimum hint size of the icon. If you increase the parent size, the icon will grow larger until its maximum hint size is reached. After this point, the icon will not grow any larger and there will be empty space around the icon within the parent.

          +

          When the aspect size hint is set, Evas tries to fix the dimensional proportions of the object. Here, the proportion of the icon is respected, and the width will be the same as the height:

          +
          evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
          +
          +

          Here, the width will be twice the height:

          +
          evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 2, 1);
          +
          +

          If we want to change the alignment of the icon relative to the parent, we can use the evas_object_size_hint_align() function. By default, the icon is centered, so it is aligned with a value of 0.5. You can change the alignment as follows:

          +
          evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +
          +

          In the above case, the icon is aligned to the bottom left corner of the parent.

          +

          We can also play with the size of the icon inside its container by using the weight size hint. By default, the weight is not set, so the size of the icon will be the minimum size. But if you set this value to 1, the icon will be expand as much as it can inside the container:

          +
          evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +
          +

          You can also use the alignment and weight hints together. Here, we want the icon to take up all the space in its parent:

          +
          evas_object_size_hint_align_set(ic, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +
          + + +

          Conformant

          + +

          Figure: Conformant container

          +

          Conformant container

          + +

          A conformant is a container UI component that accounts for the space taken by the indicator, virtual keyboard, and softkey windows. The content area of the conformant is resized and positioned based on the space available. When the virtual keyboard is displayed, the content area is not resized.

          + +

          Creating a Conformant

          +

          To create a conformant, use the elm_conformant_add() function:

          +
          +Evas_Object *conformant;
          +
          +conformant = elm_conformant_add(parent);
          +
          + +

          Adding Content to the Conformant

          +

          To add content to the conformant, use the elm_object_content_set() function:

          +
          elm_object_content_set(conformant, main_view);
          +
          + +

          Signals

          +

          To receive notifications about the state of the virtual keyboard and clipboard, listen to the following Evas signals:

          +
            +
          • "virtualkeypad,state,on": The virtual keyboard has been switched on.
          • +
          • "virtualkeypad,state,off": The virtual keyboard has been switched off.
          • +
          • "virtualkeypad,size,changed": The virtual keyboard size has changed.
          • +
          • "clipboard,state,on": The clipboard has been switched on.
          • +
          • "clipboard,state,off": The clipboard has been switched off.
          • +
          + + +

          Grid

          + +

          In a grid, objects are placed at specific positions along a fixed grid, where the position of each object is given as a percentage of the full width and height of the grid. By default, the size of the grid is 100 x 100 pixels.

          + +

          Creating a Grid

          +

          To create a grid, use the elm_grid_add() function:

          +
          Evas_Object *grid;
          +
          +grid = elm_grid_add(parent);
          +

          Adding Items to the Grid

          +

          To add an item to the grid, use the elm_grid_pack_set() function. Provide the X and Y coordinates, and the width and height in the grid as parameters. The following code adds 12 icons in a circle formation:

          +
          for (i = 0; i < 12; i++)
          +{
          +   ic = elm_icon_add(grid);
          +   elm_image_file_set(ic, "c1.png", NULL);
          +   evas_object_size_hint_min_set(ic, 128, 128);
          +   evas_object_show(ic);
          +   x = 40 * cos(2.0 * M_PI / 12 * i);
          +   y = 40 * sin(2.0 * M_PI / 12 * i);
          +   elm_grid_pack(grid, ic,  40 + x,  40 + y,  20 , 20);
          +}
          +evas_object_show(grid);
          +
          + +

          Changing Position and Size

          +

          To change the position of an item in the grid, use the elm_grid_pack_set() function. The first parameter is the item you want to move, and the following parameters are the same as for the elm_grid_pack() function.

          +

          To change the size of the grid, use the elm_grid_size_set() function. You can set the new width and height for the grid. The position and size of the items in the grid are changed accordingly.

          +

          Clearing the Grid

          +

          To clear the grid, use the elm_grid_clear() function. All items are removed from the grid. If you set the clear parameter, all the items are also deleted, with the evas_object_del() function called on each item.

          + + +

          Layout

          + +

          A layout is a container that takes a standard Edje design file and wraps it very thinly in a UI component. Layouts are the basis of a lot of graphics components used in Elementary.

          + +

          An Edje design file describes how the elements of the UI are positioned and how they behave when interacted with. For more information about Edje, see Themes.

          + +

          Creating a Layout

          + +

          To create a new layout, use the elm_layout_add() function:

          +
          Evas_Object *layout;
          +
          +layout = elm_layout_add(parent);
          +
          +

          In Tizen, the layout component is extended to support different kinds of layouts. Rather than define layouts yourself, you can use the following predefined default layouts:

          +
            +
          • application/default: This layout can be used to display content inside a window.
          • +
          • drawer/panel: This layout can be used to create a 2-panel view.
          • +
          • nocontents/default: This layout can be used when there is no content to display, such as in a contact or email.
          • +
          +

          To use the application/default layout:

          +
          Evas_Object *ly;
          +
          +ly = elm_layout_add(parent);
          +elm_layout_theme_set(ly, "layout", "application", "default");
          +
          + +

          Adding Objects to the Layout

          +

          To add an Evas object to the layout:

          +
          elm_object_part_content_set(ly, "elm.swallow.content" view);
          +
          +

          elm.swallow.content is the swallow part of the application layout, and with this call you integrate the view inside the swallow object of the layout.

          +

          The drawer/panel layout can display 2 different views, the background and the main content:

          +
          Evas_Object *ly;
          +
          +ly = elm_layout_add(parent);
          +elm_layout_theme_set(ly, "layout", "drawer", "panel");
          +
          +

          To swallow an object inside the main content and background views:

          +
          elm_object_part_content_set(ly, "elm.swallow.content", main_view);
          +elm_object_part_content_set(ly, "elm.swallow.background", background);
          +
          +

          The nocontents/default layout is a special layout in that it does not contain any swallows. You can only set the text part. There are two different texts zones: elm.text and elm.help.text. To change the text:

          +
          elm_object_part_text_set(ly, "elm.text", "Hi All :)");
          +elm_object_part_text_set(ly, "elm.help.text", "Hi All :)");
          +
          +

          Using Layout Themes

          +

          The layout component supports the following predefined default themes:

          +
            +
          • toolbar-content: For applications with a toolbar and main content area.
          • +
          • toolbar-content-back: For applications with a toolbar, main content area (with a back button), and title area.
          • +
          • toolbar-content-back-next: For applications with a toolbar, main content area (with back and next buttons), and title area.
          • +
          • content-back: For applications with main content (with a back button) and title areas.
          • +
          • content-back-next: For applications with main content (with back and next buttons) and title areas.
          • +
          • toolbar-vbox: For applications with a toolbar and main content area as a vertical box.
          • +
          • toolbar-table: For applications with a toolbar and main content area as a table.
          • +
          +

          To set a theme to the layout, use the elm_layout_theme_set() function.

          + + +

          Mapbuf

          + +

          Figure: Mapbuf hierarchy

          +

          Mapbuf hierarchy

          + +

          A mapbuf component is a container UI component that uses an Evas map to hold a content object. This component is used to improve the moving and resizing performance of complex UI components.

          + +

          The content object is treated as a single image by the Evas map. If you have a content object containing several child objects, frequently moving the mapbuf component will be faster than frequently moving the content object.

          + +

          The mapbuf component inherits all the functions of the container class.

          + +

          Creating a Mapbuf

          +

          To create a mapbuf component, use the elm_mapbuf_add() function:

          +
          Evas_Object *mapbuf, *parent, *content;
          +
          +// Creating a mapbuf
          +mapbuf = elm_mapbuf_add(parent);
          +
          +

          Adding Content to the Mapbuf

          +

          To add content to the mapbuf component, use the elm_object_content_set() function with the "default" part:

          +
          elm_object_content_set(mapbuf, content);
          + + + + + + + + + + +
          Note
          Calling elm_object_content_set(mapbuf, content) is equivalent to calling elm_object_part_content_set(mapbuf, "default", content).
          + + +

          To activate smooth map rendering and alpha rendering for the mapbuf component:

          +
          elm_mapbuf_smooth_set(mapbuf, EINA_TRUE);
          +elm_mapbuf_alpha_set(mapbuf, EINA_TRUE);
          +
          + +

          Activating the Mapbuf

          +

          Finally, to use the mapbuf component, you must activate it:

          +
          elm_mapbuf_enabled_set (mapbuf, EINA_TRUE);
          + +

          Signals

          +

          The mapbuf component does not emit any signals and therefore does not provide any callbacks that you can register.

          + + + + +

          A naviframe component consists of a stack of views. New views are pushed on top of previous ones, and only the top-most view on the stack is displayed. The previous views are not deleted. A previous view is displayed when the view on top of it is popped. Transitions can be animated on a push or a pop, depending on the theme applied to the UI component.

          + +

          Creating a Naviframe

          +

          To create a naviframe, use the elm_naviframe_add() function:

          +
          Evas_Object *nav;
          +
          +nav = elm_naviframe_add(parent);
          +
          +

          Adding and Deleting Views

          +

          The naviframe is a stack of views. A new view is always pushed to the top of the stack. The top-most view is deleted by popping it.

          +

          To add a new view to the naviframe:

          +
          Elm_Object_Item *nav_it;
          +
          +nav_it = elm_naviframe_item_push(nav, NULL, NULL, NULL, view, NULL);
          +// In Tizen 2.3, the back button is not supported in the naviframe 
          +
          +

          When you push a new view to the stack, you receive an Elm_Object_Item for the view. You can use this item to modify the view.

          +

          To pop and delete the top-most view:

          +
          elm_naviframe_item_pop(nav);
          +
          + +

          Adding Fixed Content

          +

          The naviframe can also display fixed content on top of the current (top-most) view. Use the elm_object_item_part_content_set() function to set this content. Use the following part names to specify the location of the content:

          +
            +
          • "default": The main content area of the current view.
          • +
          • "title_left_btn": A button on the left side of the naviframe.
          • +
          • "title_right_btn": A button on the right side of the naviframe.
          • +
          +

          For example, to add a button to the naviframe:

          +
          btn = elm_button_add(nav);
          +elm_object_style_set(btn, "naviframe/title_cancel");
          +elm_object_item_part_content_set(nav_it, "title_left_btn", btn);
          +
          +

          To set the title labels of the naviframe, use the elm_object_item_part_text_set() function and specify one of the following label locations:

          +
            +
          • "default": Sets the title label in the title area of the current view.
          • +
          • "subtitle": Sets the subtitle label in the title area of the current view.
          • +
          +

          Signals

          +

          The naviframe emits the following signals:

          +
            +
          • "transition,finished": The transition has finished changing the view.
          • +
          • "title,transition,finished": The title area transition has finished changing the state of the title.
          • +
          • "title,clicked": The user has clicked the title area.
          • +
          + + + +

          Panes in Mobile Applications

          + +

          Figure: Panes component

          +

          Panes component

          + +

          A panes component adds a draggable bar between two sections of content. The sections are resized when the bar is dragged.

          + +

          Creating Panes

          +

          To create a panes component, use the elm_panes_add() function:

          +
          Evas_Object *panes;
          +
          +panes = elm_panes_add(parent);
          +
          + +

          Adding Content to the Panes

          +

          To add content to the panes, use the elm_object_part_content_set() function. The following code adds an object to the left pane:

          +
          elm_object_part_content_set(panes, "left", obj);
          +
          + +

          Setting Panes Options

          +

          To set the orientation of the panes, use the elm_panes_horizontal_set() function.

          + +

          To set the size of the panes, use the elm_panes_content_left_size_set() and elm_panes_content_right_size_set() functions.

          + +

          Signals

          +

          The panes component emits the following signals:

          +
            +
          • "press": The panes component has been pressed (but the press has not been released yet).
          • +
          • "unpress": The press has been released.
          • +
          • "clicked": The panes component has been clicked.
          • +
          • "clicked,double": The panes component has been double-clicked.
          • +
          + + +

          Scroller

          + +

          A scroller holds (and clips) a single object and allows you to scroll across it. This means that the user can use a scroll bar or their finger to drag the viewable region across the object, moving through a much larger area than is contained in the viewport. The scroller will always have a default minimum size that is not limited by its contents.

          +

          The scroller component inherits all the functions of the Layout.

          +

          Creating a Scroller

          +

          To create a scroller, use the elm_scroller_add() function:

          +
          +Evas_Object *scroller;
          +
          +scroller = elm_scroller_add(parent);
          +
          +

          Adding Objects to the Scroller

          +

          To add an object to the scroller, use the elm_object_content_set() function:

          +
          Evas_Object *image;
          +
          +image = elm_image_add(parent);
          +elm_image_file_set(image, "image.png", NULL);
          +evas_object_show(image);
          +evas_object_size_hint_min_set(image, 2560, 1600);
          +elm_object_content_set(scroller, image);
          +
          +

          In the above code, we set a minimum size of 2560 x 1600 pixels for the image. The scroller is smaller than the image, so you can scroll across the image.

          +

          If you want to be informed when the user begins scrolling the image, use the following code:

          +
          +evas_object_smart_callback_add(scroller, "scroll,drag,start", _scroll_start_cb, NULL);
          +
          +// Callback function for the "animate,begin" signal
          +// This callback is called when the user begins scrolling the image
          +void _scroll_start_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   printf("Scroll starts\n");
          +}
          + +

          Managing the Properties of the Scroller

          +

          When scrolling content, the scroller may "bounce" when reaching the edge of the content. This is a visual way of indicating that there is no more content to scroll in that direction. Bounce is enabled by default for both axes. To enable or disable the bounce for either or both axes, use the elm_scroller_bounce_set() function. The following code disables the bounce for the horizontal axis and enables it for the vertical axis:

          + +
          elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
          +
          +

          The scroller can limit the scrolling to "pages". In this case, the scrolling occurs in page-sized chunks of content rather than in a purely continuous fashion, with the scroller displaying a single "page" at a time. This feature sets the size of the page relative to the viewport of the scroller. A size of 1.0 equals 1 viewport (horizontally or vertically). A size of 0.0 disables paging for that axis. These settings are mutually exclusive with page size (see the elm_scroller_page_size_set() function). A size of 0.5 equals half a viewport. Usable size values are normally between 0.0 and 1.0, including 1.0. If you only want a single axis to scroll in pages, use 0.0 for the other axis.

          + +

          Signals

          + +

          The scroller emits the following signals, which you can catch in your application:

          + +
            +
          • "edge,left": The left edge of the content has been reached.
          • +
          • "edge,right": The right edge of the content has been reached.
          • +
          • "edge,top": The top edge of the content has been reached.
          • +
          • "edge,bottom": The bottom edge of the content has been reached.
          • +
          • "scroll": The content has been scrolled (moved).
          • +
          • "scroll,anim,start": The scrolling animation has started.
          • +
          • "scroll,anim,stop": The scrolling animation has stopped.
          • +
          • "scroll,drag,start": Dragging the contents has started.
          • +
          • "scroll,drag,stop": Dragging the contents has stopped.
          • +
          • "vbar,drag": The vertical scroll bar has been dragged.
          • +
          • "vbar,press": The vertical scroll bar has been pressed.
          • +
          • "vbar,unpress": The vertical scroll bar has been unpressed.
          • +
          • "hbar,drag": The horizontal scroll bar has been dragged.
          • +
          • "hbar,press": The horizontal scroll bar has been pressed.
          • +
          • "hbar,unpress": The horizontal scroll bar has been unpressed.
          • +
          • "scroll,page,changed": The visible page has changed.
          • +
          + +

          Example

          +

          A good example of the scroller is a picture slideshow: we add images to the scroller and limit the scrolling to pages (one picture at a time). In the following code, we disable the scroll bars for both axes, limit the scrolling to pages by using the elm_scroller_page_scroll_limit_set() function, and lock the scrolling on the Y axis by using the elm_object_scroll_lock_y_set() function:

          +
          elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
          +elm_scroller_page_scroll_limit_set(scroller, 1, 0);
          +elm_object_scroll_lock_y_set(scroller, EINA_TRUE);
          +
          +

          We create a horizontal box, which will contain all the images, and which itself will be contained by the scroller:

          +
          box = elm_box_add(scroller);
          +elm_box_horizontal_set(box, EINA_TRUE);
          +elm_object_content_set(scroller, box);
          +evas_object_show(box);
          +
          +

          We then create all the images and add them to the horizontal box:

          +
          img = elm_image_add(scroller);
          +snprintf(buf, sizeof(buf), IMAGE_DIR"/%d.jpg", i);
          +elm_image_file_set(img, buf, NULL);
          +evas_object_show(img);
          +pages = eina_list_append(pages, img);
          +elm_box_pack_end(box, img);
          +
          +

          We store references to the images in an eina_list for easy retrieval later.

          +

          Finally, we display the first page of the scroller:

          +
          elm_scroller_page_show(scroller, 0, 0);
          +
          +

          The size of the scroller depends on the size of the parent. When the parent changes, for example when the window is resized or rotated, the scroller is also resized. Since we need to be informed when the scroller is resized, we add a callback on the EVAS_CALLBACK_RESIZE event for the scroller:

          +
          evas_object_event_callback_add(scroller, EVAS_CALLBACK_RESIZE, _scroller_resize_cb, NULL);
          +

          The callback retrieves the new size of the scroller by using the evas_object_geometry_get() function on the object pointer. The pointer is relative to the object that has been resized, which in our case is the scroller itself. We can then iterate through the images of the scroller and set the minimum size to fit the scroller size:

          +
          EINA_LIST_FOREACH(images, l, page)
          +{
          +   evas_object_size_hint_min_set(page, w, h);
          +}
          +
          +

          Finally, we set the page size of the scroller to match the scroller size and display the first page:

          +
          elm_scroller_page_size_set(obj, w, h);
          +elm_scroller_page_show(obj, 0, 0);
          + +

          Table

          + +

          A table is like a box but with 2 dimensions. You have the same kind of APIs as with boxes. An item inside the table can span multiple columns and rows, and even overlap with other items (and it can then be raised or lowered accordingly to adjust stacking if there is overlap).

          + +

          Creating a Table

          + +

          To create a table, use the elm_table_add() function:

          +
          Evas_Object *table;
          +table = elm_table_add(parent);
          + +

          Adding Items to the Table

          + +

          Items are added to the table with the elm_table_pack() function. This function takes as parameters the table, the item to add to the table, and the position where to add the item: column, row, and the size of the item in number of rows and columns (colspan and rowspan). If we want to create an icon that takes 3 columns and rows and a button that only takes 1 row and column, the code will look like this:

          +
          ic = elm_icon_add(table);
          +elm_image_file_set(ic, "icon.png", NULL);
          +evas_object_show(ic);
          +elm_table_pack(table, ic, 0, 0, 3, 3);
          +
          +btn = elm_button_add(table);
          +elm_object_text_set(btn, "Click me i'm famous");
          +evas_object_show(btn);
          +elm_table_pack(table, btn, 3, 1, 1, 1);
          +evas_object_show(table);
          +
          + +

          Managing the Items

          + +

          If you want to change the position of the item after adding it, use the elm_table_pack_set() function. This function takes as parameters the item whose position to change, the new column, the new row, and the size of the item in number of rows and columns (colspan and rowspan).

          + +

          To add padding around the item, use the elm_table_padding_set() function. The second parameter is the padding between columns, and the third parameter is the padding between rows:

          +
          elm_table_padding_set(table, 10, 10);
          + +

          To change the alignment and size of an item, use the evas_object_size_hint parameters. They are used in the same way as with boxes. You can set the same size and weight to each item by using the homogeneous parameter:

          +
          elm_table_homogeneous_set(table, EINA_TRUE);
          +
          + +

          Clearing the Table

          + +

          To clear the table, use the elm_table_clear() function. If the clear parameter is EINA_TRUE, the table items are deleted. The evas_object_del() function will be called on each item.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/core_loop_n.htm b/org.tizen.ui.practices/html/native/efl/core_loop_n.htm new file mode 100644 index 0000000..98c7a23 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/core_loop_n.htm @@ -0,0 +1,87 @@ + + + + + + + + + + + + + Core Loop and OS Interfacing: Handling the Main Loop and Threads + + + + + +
          + +

          Core Loop and OS Interfacing: Handling the Main Loop and Threads

          +

          The Ecore library provides convenience functions, which allow you to manage the application main loop and threading.

          + +

          Tizen applications developed with EFL use the EDA (Event-driven Architecture) pattern. In EDA, applications reiterate the routine that checks input events, processes the events, and then displays the outputs. The main loop is the entity handling this sequence. It is the heart of any GUI based on EDA.

          + +

          Most applications start and end the main loop, which is used in special situations, such as propagation of events to UI components for handling and updating application appearance and state. That guarantees the delivery of all events received from low-level input devices and provides the accurate and speedy render event loop for synchronizing the application UI with events.

          + +

          The Ecore library provides main loop abstraction with a clean and tiny event loop library. Applications mainly deal with file descriptors handling, event handling, and timer handling from the beginning of the main loop.

          + +

          In addition, Ecore provides several modules related to, for example, Audio, Cocoa, Connection, Drm, FrameBuffer, Input, IPC, Wayland, Win32, and X11 with convenient methods to communicate with underlying operating systems, such as Ubuntu, Windows®, or Mac OS® X.

          + +

          There are 2 types of threads in Tizen applications:

          +
            +
          • Main thread that contains the main loop
          • +
          • Worker threads that support concurrent processing. In parallel processing, applications must keep the GUI updating while processing the data related to the UI.
          • +
          + +

          The Ecore library provides these concurrent processing mechanisms through Ecore threads. An Ecore thread is not a simple wrapper for standard POSIX threads. It is not meant to be used to run parallel tasks throughout the entire duration of the application, especially when these tasks are performance-critical. Ecore manages these tasks using a pool of threads based on system configuration, such as the number of processors the system has, and the maximum amount of concurrent threads set for the application.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/data_types_n.htm b/org.tizen.ui.practices/html/native/efl/data_types_n.htm new file mode 100644 index 0000000..636dcb6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/data_types_n.htm @@ -0,0 +1,1695 @@ + + + + + + + + + + + + + Data Types + + + + + +
          + +

          Data Types

          + +

          The Eina library is a central part of the EFL. It implements an API for data types, and allows you to create and manipulate several data types:

          + +
            +
          • Inline Array: standard array of inlined members
          • +
          • Array: standard array of void* data
          • +
          • Hash Table: standard hash of void* data
          • +
          • Inline List: list with nodes inlined into the user type
          • +
          • Compact List
          • +
          • List: standard list of void* data
          • +
          • Iterator Functions
          • +
          • Sparse Matrix: sparse matrix of void* data
          • +
          • Red-Black tree: red-black tree with nodes inlined into the user type
          • +
          • String Buffer: mutable string to prepend, insert, or append strings to a buffer
          • +
          • Stringshare: shares read-only string references
          • +
          • Tiler split: merges and navigates into 2D tiled regions
          • +
          • Trash: container of unused but allocated data
          • +
          • Generic Value Storage: container for generic value storage and access
          • +
          • Data Model API: container for data with a user-defined hierarchy or structure
          • +
          + + +

          Iterator Functions

          +

          Eina provides a set of iterator functions to manipulate data types, such as arrays.

          +

          These functions allow access to container elements in a generic way, without knowing which container is used (similar to iterators in the C++ STL). Iterators only allow sequential access (that is, from one element to the next one). For random access, Eina provides accessor functions.

          +

          Getting an iterator to access elements of a given container is done through the functions of that particular container. There is no function to create a generic iterator as iterators absolutely depend on the container. Note that all iterators, regardless of the container type, are always deleted with the same eina_iterator_free() function.

          +

          To get the data and iterate, use the eina_iterator_next() function. To call a function on every single element of a container, use the eina_iterator_foreach() function.

          +

          In addition to iterator functions, each data type also owns a set of macros that provide the iterators, such as FOREACH or REVERSE_FOREACH.

          + +

          Strings

          + +

          Stringshare

          + +

          The Eina_Stringshare data type functions allow you to store a single copy of a string and use it in multiple places throughout your program. This way you can save a lot of strings with less memory. It improves string creation and destruction speed, reduces memory use, and decreases memory fragmentation.

          +

          With this data type you can reduce the number of duplicated strings kept in memory. It is common for the same strings to be dynamically allocated repeatedly between applications and libraries, especially in circumstances where you can have multiple copies of a structure that allocates the string. Rather than duplicating and freeing these strings, request a read-only pointer to an existing string and only incur the overhead of a hash lookup. This can sound like micro-optimizing, but profiling has shown that this can have a significant impact as the number of copies grows.

          + +

          To manage stringshares:

          +
            +
          1. To create a stringshare, declare a string variable and call the eina_stringshare_add() function: +
            +const char *mystr;
            +const char *prologue = "Enlightenment is not just a window manager for Linux/X11 and others"
            +
            +mystr = eina_stringshare_add(prologue);
            +
          2. + +
          3. To retrieve or modify the string data: +
              +
            • Retrieve a string for use in a program from a format string using the eina_stringshare_printf() function. If you have a "format" string to pass to a function like printf, you can store it as a stringshare as well. +

              The following example produces "1 desktop manager to rule them all".

              +
              +const char *myfmtstr = "%d desktop manager to rule them all";
              +const char *str;
              +
              +str = eina_stringshare_printf(myfmtstr, 1);
              +
              +print(str)
              +
              +
            • + +
            • Replace the value of a stringshare with the eina_stringshare_replace() function. Pass the pointer address and the new value to the function. +
              +eina_stringshare_replace(&str,"One desktop manager to rule them all");
              +
              +
            • + +
            • Retrieve the length of the stringshare value with the eina_stringshare_strlen() function. +
              +printf("length: %d\n", eina_stringshare_strlen(str));
              +
              +
            • +
            +
          4. +
          5. When the string is no longer needed, delete it using the eina_stringshare_del() function: +
            +eina_stringshare_del(mystr);
            +
            +
          6. +
          + + + +

          String Buffer

          +

          The string buffer data type is designed to be a mutable string, allowing you to append, prepend or insert a string to a buffer. It allows easy handling of buffers in your applications.

          +

          To manage string buffers:

          +
            +
          1. Initialize the Eina_Strbuf instance and create the buffer: +
            +Eina_Strbuf *buf;
            +mybuffer = eina_strbuf_new();
            +
            +
          2. +
          3. Manage the buffer content: +
              +
            • To append characters to the buffer: +
                +
              • +

                For basic strings, use the eina_strbuf_append() function:

                +
                +eina_strbuf_append(mybuffer, "This is my string.");
                +
                +
              • +
              • To append 1 character to your buffer, use the eina_strbuf_append_char() function. You can also append a sized string to the buffer using the eina_strbuf_append_length() function. +
                +eina_strbuf_append_length(mybuffer, "Buffe", 5);
                +eina_strbuf_append_char(mybuffer, 'r');
                +
                +
              • +
              • To handle "printf" format strings, use the eina_strbuf_append_printf() function to add formatted strings to the buffer: +
                +eina_strbuf_append_printf(buf, "%s%c", "buffe", 'r');
                +
                +
              • +
              +
            • + +
            • To remove characters from one position to another, use the eina_strbuf_remove() function. The first parameter is the buffer, the second is the start position of the characters you want to delete, and the last the end position. +

              This example removes the first 19 characters of the buffer:

              +
              +eina_strbuf_remove(buf, 0, 18);
              +
              +
            • + +
            • To replace characters: + +
              • +eina_strbuf_replace() replaces a specific occurrence of a given string in the buffer with another string.
              • +
              • +eina_strbuf_replace_all() replaces all occurrences of a given string in the buffer with another string. +
              • +
              +
              +eina_strbuf_append(mybuffer, "buffer buffer buffer");
              +
              +// Replacing one occurrence of "buffer" by "B-U-F-F-E-R"
              +eina_strbuf_replace(mybuffer, "buffer", "B-U-F-F-E-R", 1);
              +
              +// Replacing all the occurrences of "buffer" by "B-U-F-F-E-R"
              +eina_strbuf_replace_all(mybuffer, "buffer", "B-U-F-F-E-R");
              +
              +// Replacing all the occurrences of "B-U-F-F-E-R" by "Buffer"
              +eina_strbuf_replace_all(mybuffer, "B-U-F-F-E-R", "Buffer");
              +
              +
            • +
            • To insert a string at the specified position, use the eina_strbuf_insert() function. Use the eina_strbuf_insert_printf() function with formatted strings. +
              +eina_strbuf_insert(mybuffer, "More buffer", 10);
              +
              +// Using eina_strbuf_length_get to get the buffer length
              +eina_strbuf_insert_printf(buf, " %s: %d", 6, "length", eina_strbuf_length_get(buf));
              +
              +
            • + +
            • To get the complete length of the string and the buffer, use the eina_strbuf_string_get() and eina_strbuf_length_get() functions: +
              +printf("%s : %d\n", eina_strbuf_string_get(mybuffer), eina_strbuf_length_get(buf));
              +
              +
            • +
            +
          4. + +
          5. When no longer needed, free the buffer with the eina_strbuf_free() function. You can also free the content of Eina_Strbuf without freeing the buffer itself using the eina_strbuf_string_free() function. +
            +eina_strbuf_free(mybuffer);
            +
            +
          6. +
          + +

          Arrays

          +

          An array is a data type which describes an ordered collection of values. The values are accessed by their index.

          +
          +INDEX | VALUE
          +--------------
          +0     | value0
          +1     | value1
          +2     | value2
          +3     | value3
          +4     | value4
          +5     | value5
          +6     | value6
          +7     | value7
          +
          +

          Eina provides 2 array types: the classic array and an inline array.

          + +

          Creating and Destroying a Classic Array

          + +

          The eina_array_new() function creates a new array. You can store strings or objects in the created array. The function returns a new array, or if memory allocation fails, NULL.

          +

          The first parameter of the eina_array_new() function defines the size of the array allocation step. For example, if you set it to 4, the function returns an array of 4 elements and the next time you grow the array it grows by 4 elements. Unless you have pushed 4 elements inside, it does not grow. But once you add the 5th element, it grows again and becomes an array of 8 elements. The allocation step feature is very useful for optimizing performance, and it also reduces memory fragmentation by having a size that fits the array usage. If you set the step to 0, the function sets a default safe value.

          + +

          To create an array to store strings:

          +
            +
          1. Create the array: +
            +// Strings to store in the array 
            +const char* strings[] = 
            +{
            +   "helo", "hera", "starbuck", "kat", "boomer",
            +   "hotdog", "longshot", "jammer", "crashdown", "hardball",
            +   "duck", "racetrack", "apolo", "husker", "freaker",
            +   "skulls", "bulldog", "flat top", "hammerhead", "gonzo"
            +};
            +// Declaring the array (type Eina_Array)
            +Eina_Array *array;
            +unsigned int i;
            +
            +// Creating the array
            +array = eina_array_new(20);
            +
            +// Inserting elements in the array
            +for (i = 0; i < 20; i++)
            +   eina_array_push(array, strdup(strings[i]));
            +
            +
          2. +
          3. To change the allocation step, use the eina_array_step_set() function: +
            • The first parameter is the array you want to change.
            • +
            • The second parameter is the size of that specific array (retrieved with the sizeof() function).
            • +
            • The last parameter is the new step size.
            +

            In this example, the array step changes from 20 to 30.

            +
            +eina_array_step_set(array, sizeof(*array), 30);
            +
            +
          4. +
          5. When no longer used, use the eina_array_free() function to free the array. It first calls the eina_array_flush() function and frees the memory of the pointer. It does not free the memory allocated for the elements of the array. To free them, use a while statement with the eina_array_pop function. +
            +// Freeing the array elements
            +while (eina_array_count(array))
            +   free(eina_array_pop(array));
            +
            +// Freeing the array itself
            +eina_array_free(array);
            +
            +
          6. +
          + +

          Modifying Classic Array Content

          + +

          To modify classic array content:

          +
            +
          • To set the data of an element, use the eina_array_data_set() function. The first parameter is the array, the second is the index of the element you want to set, and the last one is the data. You must first get the related pointer if you need to free it, as this function replaces the previously held data. Be careful, as there is no array or index check. If the value is NULL or invalid, the application can crash. +
            +free(eina_array_data_get(array, 0));
            +eina_array_data_set(array, 0, strdup(strings[3]);
            +
            +
          • +
          • To add elements to the end of the array, use the eina_array_push() function. The function returns EINA_TRUE on success, and EINA_FALSE on failure. The first parameter is the array to store the element, the second one is the data you want to store. If you store strings, remember to allocate the memory first. The example uses the strdup function to duplicate the string contained in strings[]. This function allocates the memory of the returned string, so you do not have to do it yourself. +
            +for (i = 0; i < 20; i++)
            +   eina_array_push(array, strdup(strings[i]));
            +
            +
          • + +
          • To remove the last element of an array, use the eina_array_pop() function. It takes the array as a parameter, and if the operation is successful, returns a pointer to the data of the removed element. +
            +while (eina_array_count(array))
            +   free(eina_array_pop(array));
            +
            +
          • + +
          • To rebuild the array by specifying the data to be kept, use the eina_array_remove() function: +
            • The first parameter is the array to be changed.
            • +
            • The second parameter is the function which selects the data to keep in the rebuilt array.
            • +
            • The last parameter is the data to pass to the selector function defined as the second parameter.
            +

            The selector function has to return an Eina_Bool, EINA_TRUE if the element stays, and EINA_FALSE if it has to be removed.

            +

            The following example shows how to remove all the elements of the array that are longer than 5.

            +
            +// Selector function 
            +Eina_Bool keep(void *data, void *gdata)
            +{
            +   if (strlen((const char*)data) <= 5)
            +      return EINA_TRUE;
            +
            +   return EINA_FALSE;
            +}
            +
            +int remove_array()
            +{
            +   Eina_Array *array;
            +   Eina_Array_Iterator iterator;
            +   const char *item;
            +   unsigned int i;
            +
            +   // Creating and populating an array
            +
            +   // Removing the undesired elements 
            +   eina_array_remove(array, keep, NULL);
            +
            +   // Flushing and freeing the array
            +
            +   return 0;
            +}
            +
            +
          • +
          • To completely wipe an array out, use the eina_array_flush() function. This function sets the count and total members of an array to 0, and frees and sets its data members to NULL. For performance reasons, there is no array check. If the value is NULL or invalid, the program can crash. The only parameter of this function is a pointer to the Eina_Array array you want to flush. +
            +eina_array_flush(array);
            +
            +
          • +
          • To empty an array quickly, use the eina_array_clean() function. This function sets the counting of members in the array to 0. It does not free any space so you have to use it carefully. For performance reasons, there is no array check. If the value is NULL or invalid, the program can crash. +
            +eina_array_clean(array);
            +
            +
          • +
          + +

          Accessing Classic Array Data

          + +

          To access classic array data:

          +
            +
          • To access the data in the array, use the eina_array_data_get() function with the array and the index of the element you want to get. The function returns a pointer to the data. +
            +// Getting the data of the first element 
            +char *mydata;
            +mydata = eina_array_data_get(array, 0);
            +
            +
          • + + +
          • To get the number of elements in an array, use the eina_array_count() function. The first parameter is a pointer to the array variable returned by the eina_array_new() function. +

            The function returns the number of elements.

            +
            +unsigned int nb_elm;
            +nb_elm = eina_array_count(array);
            +
            +
          • + +
          • To iterate through an array, you can use various methods: +
              +
            • Use the Eina_Array iterator called ITER_NEXT. +

              You can use the iterator by calling the macro EINA_ARRAY_ITER_NEXT(). It takes the array to iterate as the first parameter, a counter for the current index during the iteration, and a variable of the same type as the item data and an Eina_Iterator. To use it, declare an Eina_Iterator, an int counter, and, for example, a char * item if your array contains any strings.

              +
              +Eina_Array_Iterator iterator;
              +const char *item;
              +unsigned int i;
              +
              +EINA_ARRAY_ITER_NEXT(array, i, item, iterator)
              +   printf("item #%d: %s\n", i, item);
              +
              +
            • +
            • Use the eina_array_foreach() function to iterate over the array. +

              The first parameter is the array to iterate, the second is a callback function which determines whether the iteration can continue,and the last is the data passed to the callback function.

              +

              To iterate over the array and to print the data of each array element:

              +
              +// Callback function 
              +static Eina_Bool
              +elm_print(const void *container, void *data, void *fdata)
              +{
              +   printf("%s\n", (char *)data);
              +
              +   return EINA_TRUE;
              +}
              +
              +int iterating_array()
              +{
              +   Eina_Array *array;
              +   unsigned int i;
              +
              +   // Creating and populating an array
              +
              +   // Iterating over the array and calling elm_print on each element
              +   eina_array_foreach(array, elm_print, NULL);
              +
              +   // Freeing the element data and array
              +
              +   return 0;
              +}
              +
              +
            • + +
            • Use the eina_array_iterator_new() function to create an iterator for the array.

              The function returns a newly allocated iterator associated with the array. If the array is NULL or the count of the array members is less than or equal to 0, the function returns NULL. If the memory cannot be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is thrown. Otherwise, a valid iterator is returned.

              +

              Pass to this function the array for which you want to create a new iterator. The iterator is used to run a sequential walk through the array, just like the eina_array_foreach() function.

              +

              To create an iterator and use it to print the data of each array element:

              +
              +static Eina_Bool
              +print_one(const void *container, void *data, void *fdata)
              +{
              +   printf("%s\n", (char*)data);
              +
              +   return EINA_TRUE;
              +}
              +
              +int new_iterator()
              +{
              +   Eina_Array *array;
              +   Eina_Iterator *it;
              +   unsigned short int i;
              +   void *uninteresting;
              +   Eina_Bool rt;
              +
              +   // Creating and populating an array
              +
              +   it = eina_array_iterator_new(array);
              +
              +   it = eina_iterator_next(it, &uninteresting);
              +   eina_iterator_foreach(it, print_one, NULL);
              +   eina_iterator_free(it);
              +
              +   return 0;
              +}
              +
              +
            • +
            • Use the eina_array_accessor_new() function to get random access to the array elements. +

              The function returns a newly allocated accessor associated with the array. If the array is NULL or the counting of array members is less than or equal to 0, this function returns NULL. If the memory cannot be allocated, NULL is returned and EINA_ERROR_OUT_OF_MEMORY is thrown. Otherwise, a valid accessor is returned.

              +

              To use the accessor to retrieve and print the data of every other array element:

              +
              +int random_access()
              +{
              +   // Declaration of the array 
              +   Eina_Array *array;
              +   // Declaration of the accessor
              +   Eina_Accessor *acc;
              +
              +   // Generic counter
              +   unsigned short int i;
              +
              +   // Variable to put the data retrieved from an array element
              +   void *data;
              +
              +   // Creating and populating an array
              +
              +   // Creating the array accessor
              +   acc = eina_array_accessor_new(array);
              +
              +   // Random access to the data of the array elements
              +   for(i = 1; i < 10; i += 2)
              +   {
              +      // Putting the data in the variable 'data'
              +      eina_accessor_data_get(acc, i, &data);
              +      printf("%s\n", (const char *)data);
              +   }
              +
              +   // Freeing the accessor
              +   eina_accessor_free(acc);
              +
              +   // Freeing the array
              +
              +   return 0;
              +}
              +
              +
            • +
            +
          • +
          + + +

          Creating and Destroying an Inline Array

          + +

          An inline array is a container that stores the data itself, not the pointers to the data. This means there is no memory fragmentation, and for small data types, such as char, short, and int, it is more memory-efficient. This is because the data is stored in the cache and is faster to access. The bigger the data gets, however, the less likely it is and the less interesting it becomes.

          +

          To create an inline array, use the eina_inarray_new() function:

          +
          • The first parameter is the size of the value. In this example, only the characters are stored, and because of that, only sizeof(char) is passed to the function.
          • +
          • The second parameter defines the size of the array allocation step. For example, if you set it to 4, the function returns an inline array of 4 elements, and the next time you grow the inline array, it grows by 4 elements and becomes an array of 8 elements. If you set the step to 0, the function sets a default safe value. +

            The step can be changed later on using the eina_inarray_step_set() function.

          + +

          The eina_inarray_new() function returns a pointer to the new Eina_Inarray variable.

          +
          +int inline_array() 
          +{
          +   // Declare an inline array variable of the type Eina_Inarray
          +   Eina_Inarray *iarr;
          +
          +   // Create an inline array of "char"
          +   iarr = eina_inarray_new(sizeof(char), 0);
          +
          +   // When no longer needed, free the array memory
          +   eina_inarray_free(iarr);
          +
          +   return 0;
          +}
          +
          + +

          Modifying Inline Array Content

          + +

          To modify inline array content:

          +
            +
          • +

            To add data as the last element of the inline array, use the eina_inarray_push() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the data you want to push to the inline array.

            +

            If everything runs fine, the function returns the index of the new element. If something goes wrong, it returns -1.

            +
            +ch = 'a';
            +eina_inarray_push(iarr, &ch);
            +
            +
          • +
          • +

            To insert data to a given position of the inline array, use the eina_inarray_insert_at() function:

            +
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • +
            • The second parameter is the index of the element you want to add to the inline array.
            • +
            • The last parameter is a pointer to the content to be added.
            +

            The content of the pointer is copied to the given position in the inline array. All the members from the position to the end of the array are shifted towards the end. If the position is equal to the end of the array, the member is appended. If the position is bigger than the array length, the function fails.

            +
            +ch = 'a';
            +eina_inarray_push(iarr, &ch);
            +ch = 'b';
            +eina_inarray_push(iarr, &ch);
            +ch = 'd';
            +eina_inarray_push(iarr, &ch);
            +
            +// Adding data on position 3
            +ch = 'c';
            +eina_inarray_insert_at(iarr, 2, &ch)
            +
            +
          • +
          • +

            To insert data with your own position criteria, use the eina_inarray_insert() or eina_inarray_insert_sorted() function. The only difference between these functions is that the eina_inarray_insert_sorted() function assumes that the array is already sorted and consequently optimizes the insertion position by doing a binary search.

            +

            In both functions:

            +
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • +
            • The second parameter is the data you want to push to the inline array.
            • +
            • The last parameter is the callback comparison function. +

              The Eina_Compare_Cb callback function compares data1 and data2. data1 is the value contained in the inline array and data2 is the data you pass to the eina_inarray_insert() or eina_inarray_insert_sorted() function as the second parameter. If data1 is less than data2, -1 must be returned, if it is greater, 1 must be returned, and if they are equal, 0 must be returned.

            +

            The following example shows how to insert a value before a greater value:

            +
            +// Defining the comparison function with the position criteria
            +Eina_Compare_Cb cmp(const void *a, const void *b)
            +{
            +   return *(int*)a > *(int*)b;
            +}
            +
            +int inline_insert()
            +{
            +   Eina_Inarray *iarr;
            +   char ch, *ch3;
            +   int a, *b;
            +
            +   // Creating an inline array
            +
            +   // Adding data to the inline array
            +   a = 97;
            +   eina_inarray_push(iarr, &a);
            +   a = 98;
            +   eina_inarray_push(iarr, &a);
            +   a = 100;
            +   eina_inarray_push(iarr, &a);
            +
            +   // Inserting data with the criteria
            +   a = 99;
            +   eina_inarray_insert_sorted(iarr, &a, cmp);
            +
            +   eina_inarray_free(iarr);
            +}
            +
            +
          • +
          • +

            To remove the last element of the inline array, use the eina_inarray_pop() function. The only parameter is a pointer to the array variable returned by the eina_inarray_new() function. This function returns the data removed from the inline array.

            +
            +eina_inarray_pop(iarr);
            +
            +
          • +
          • +

            To remove specific data from an inline array, use the eina_inarray_remove() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the data you want to remove from the inline array.

            + +

            The eina_inarray_remove() function finds the data and removes the matching members from the array. The data can be an existing member of an inline array for optimized usage. In other cases, the content is matched using the memcmp() function.

            + + +

            The eina_inarray_remove() function returns the index of the removed member, or -1 if failed.

            +
            +iarr = eina_inarray_new(sizeof(char), 0);
            +
            +ch = 'a';
            +eina_inarray_push(iarr, &ch);
            +
            +// Removing data from the array
            +eina_inarray_remove(iarr, &ch);
            +
            +
          • + +
          • +

            To remove data from a defined position in an inline array, use the eina_inarray_remove_at() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The second parameter is the index of the element you want to remove from the inline array.

            +

            The function returns EINA_TRUE on success and EINA_FALSE if something goes wrong. The member is removed from the inline array and any members after it are moved towards the array's head.

            +
            +// Removing data from position 2
            +eina_inarray_remove_at(iarr, 2);
            +
            +
          • +
          • To remove all the elements of the array, use the eina_inarray_flush() function. The first parameter is a pointer to the array variable returned by the eina_inarray_new() function. The function removes every member from the array.

            +
            +eina_inarray_flush(iarr);
            +
            +
          • + +
          • +

            To replace values in the inline array, use the eina_inarray_replace_at() function, which copies the data over the given position:

            +
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • +
            • The second parameter is the index of the element you want to remove from the inline array.
            • +
            • The last parameter is the data you want to copy in place of the current data.
            +

            The function returns EINA_TRUE on success, and EINA_FALSE on failure. The given pointer content is copied to the given position in the array. The pointer is not referenced, instead its contents are copied to the member's array using the previously defined member_size. If the position does not exist, the function fails.

            +
            +// Replacing the member at position 3 
            +ch = 'd';
            +eina_inarray_replace_at(iarr, 3, &ch);
            +
            +
          • + +
          • +

            To sort an inline array, use the eina_inarray_sort() function, which applies a quick sorting algorithm to the inline array:

            +
            • The first parameter is a pointer to the array returned by the eina_inarray_new() function.
            • +
            • The last parameter is the Eina_Compare_Cb callback comparison function, which compares data1 and data2. +

              data1 and data2 are values contained in the inline array. If the data matches, the function must return 0, if data1 is less than data2, -1 must be returned and if it is greater, 1 must be returned.

            +
            +static int
            +short_cmp(const void *pa, const void *pb)
            +{
            +   const short *a = pa, *b = pb;
            +
            +   return *a - *b;
            +}
            +
            +int sorting_inline_array()
            +{
            +   Eina_Inarray *array;
            +   int i;
            +
            +   // Creating and populating the inline array
            +
            +   eina_inarray_sort(array, short_cmp);
            +   eina_inarray_free(array);
            +}
            +
            + +

            Be careful, the data given to the compare function is the pointer to the member memory itself. Do not change it.

            +
          • +
          + +

          Accessing Inline Array Data

          + +

          To access inline array data:

          +
            +
          • +

            To search a member in an inline array, use the eina_inarray_search() function that runs a linear walk looking for the given data:

            + +
            • The first parameter is a pointer to the array variable returned by the eina_inarray_new() function.
            • +
            • The second parameter is the data used by the callback function to run the comparison.
            • +
            • The last parameter is the Eina_Compare_Cb callback comparison function, which compares data1 and data2. +

              data1 is the value contained in the inline array and data2 is the data you pass to the eina_inarray_search() function as the second parameter. If the data matches, the function must return 0, if data1 is less than data2, -1 must be returned and if it is greater, 1 must be returned.

            +

            The function returns the member index, or -1 if not found.

            +
            +Eina_Compare_Cb
            +compare(const void *pa, const void *pb)
            +{
            +   const short *a = pa, *b = pb;
            +   if (*a == *b)
            +   {
            +      return EINA_TRUE;
            +   }
            +
            +   return EINA_FALSE;
            +}
            +
            +int search_inline_array()
            +{
            +   Eina_Inarray *array;
            +   int i;
            +   int elm_index;
            +   int to_search = 3;
            +
            +   // Creating and populating the inline array
            +
            +   elm_index = eina_inarray_search(array, &to_search, compare);
            +   eina_inarray_free(array);
            +}
            +
            + +

            Be careful, the data given to the compare function is the pointer to the member memory itself. Do not change it.

            +

            The eina_inarray_search_sorted() function does exactly the same as eina_inarray_search(), but uses a binary search for the given data.

            +
          • + +
          • +

            To get the number of elements in an inline array, use the eina_inarray_count(). The first parameter is a pointer to the array returned by the eina_inarray_new() function. The function returns an unsigned int, the number of elements.

            +
            +printf("Inline array of integers with %d elements:\n", eina_inarray_count(iarr));
            +
            +
          • + +
          • To iterate through an inline array, you can use various methods: +
              +
            • You can use the iterator macros for the inline arrays: FOREACH and REVERSE_FOREACH.

            • +
            • +

              To run a linear walk over an array of elements, use the EINA_INARRAY_FOREACH() macro. The first parameter is a pointer to the array variable returned by eina_inarray_new(), and the second parameter is the variable into which the current value is put during the walk. The EINA_INARRAY_REVERSE_FOREACH() macro does the same thing but starts from the last element.

              + +

              The following example illustrates the printing of each element and its pointer:

              +
              +iarr = eina_inarray_new(sizeof(char), 0);
              +int a, *b;
              +
              +a = 97;
              +eina_inarray_push(iarr, &a);
              +a = 98;
              +eina_inarray_push(iarr, &a);
              +a = 99;
              +eina_inarray_push(iarr, &a);
              +
              +EINA_INARRAY_FOREACH(iarr, b)
              +  printf("int: %d(pointer: %p)\n", *b, b);
              +
              +
            • +
            • To process the array data, use the eina_inarray_foreach() function, which invokes the given function on each element of the array with the given data: +
              • The first parameter is a pointer to the array variable returned by eina_inarray_new().
              • +
              • The second parameter is the function to run on each element. +

                The function must return EINA_TRUE as long as you want to continue iterating. By returning EINA_FALSE, you stop the iteration and make the eina_inarray_foreach() function return EINA_FALSE.

                +

                The data given to the function is the pointer to the member itself.

              • +
              • The last parameter is the data passed to the function called on each element.
              +

              The eina_inarray_foreach() function returns EINA_TRUE if it successfully iterates through all items of the array. Call the function for every given data in the array. This is a safe way to iterate over an array.

              +
              +static Eina_Bool
              +array_foreach(const void *array __UNUSED__, void *p, void *user_data __UNUSED__)
              +{
              +   short *member = p;
              +   int *i = user_data;
              +   (*p)++;
              +   (*i)++;
              +
              +   return EINA_TRUE;
              +}
              +
              +int inline_array_foreach()
              +{
              +   Eina_Inarray *iarr;
              +   iarr = eina_inarray_new(sizeof(char), 1);
              +   int i;
              +
              +   for (i = 0; i < numbers_count; i++)
              +   {
              +      short val = i;
              +      eina_inarray_push(iarr, &val);
              +   }
              +
              +   i = 0;
              +   eina_inarray_foreach(iarr, array_foreach, &i);
              +
              +   eina_inarray_free(iarr);
              +
              +   return 0;
              +}
              +
              +
            • + +
            • To remove some elements based on your own criteria, use the eina_inarray_foreach_remove() function, which walks through the array and, if the value matches in the callback function, removes the element: +
              • The first parameter is a pointer to the array returned by eina_inarray_new() function.
              • +
              • The second parameter is the callback function to run on each element. +

                The callback function returns EINA_TRUE if the value matches, or EINA_FALSE if it does not match.

              • +
              • The last parameter is the data passed to the callback function.
              +

              The function returns the number of removed entries or -1 if something goes wrong.

              +
              +static Eina_Bool
              +array_foreach(const void *array __UNUSED__, void *p, void *user_data __UNUSED__)
              +{
              +   short *member = p;
              +   int *i = user_data;
              +   if (*i == *p) 
              +   { 
              +      return EINA_TRUE;
              +   }
              +
              +   return EINA_FALSE;
              +}
              +
              +int inline_array_foreach_remove()
              +{
              +   Eina_Inarray *iarr;
              +   iarr = eina_inarray_new(sizeof(char), 1);
              +   int i;
              +
              +   for (i = 0; i < numbers_count; i++)
              +   {
              +      short val = i;
              +      eina_inarray_push(iarr, &val);
              +   }
              +
              +   i = 6;
              +   eina_inarray_foreach_remove(iarr, array_foreach, &i);
              +
              +   eina_inarray_free(iarr);
              +
              +   return 0;
              +}
              +
              + +
            • +
            +
          • +
          + + +

          Hash Tables

          +

          The Eina_Hash provides a way to store values in association with a key. For example, if you want to store some tuples into a table, you can do it using the Eina_Hash.

          +

          The Eina_Hash is implemented using an array of "buckets" where each bucket is a pointer to a structure that is the head of a red-black tree. This implementation makes it very robust against week keys as in the worst case scenario, you can still depend on an efficient binary tree implementation.

          + +

          Creating a Hash Table

          + +

          To create the hash table, use the eina_hash_new() function:

          +
            +
          • The first parameter is the function called when getting the size of the key.
          • +
          • The second parameter is the function called when comparing the keys.
          • +
          • The third parameter is the function called when getting the values.
          • +
          • The fourth parameter is the function called on each value when the hash table is freed, or when an item is deleted from it. NULL can be passed as the callback.
          • +
          • The last parameter is the size of the buckets.
          • +
          +

          When you create an Eina_Hash instance, you have to create 4 potentially long callback functions. To make the functions shorter, Eina_Hash offers some predefined functions to create the following kinds of hash tables:

          +
            +
          • eina_hash_string_djb2_new() creates a new hash table using the djb2 algorithm for strings.
          • +
          • eina_hash_string_superfast_new() creates a new hash table for use with strings (better with long strings).
          • +
          • eina_hash_string_small_new() creates a new hash table for use with strings with a small bucket size.
          • +
          • eina_hash_int32_new() and eina_hash_int64_new() create a new hash table for use with 32-bit and 64-bit integers.
          • +
          • eina_hash_pointer_new() creates a new hash table for use with pointers.
          • +
          • eina_hash_stringshared_new() creates a new hash table for use with shared strings.
          • +
          +

          All these predefined functions require only one parameter, which is the function to free the data you store in the hash table.

          +

          The following example shows how to manage a small phone book using the eina_hash_string_superfast_new() function to create the hash table.

          +
            +
          1. Create the phone book structure and some static data:

            +
            +struct _Phone_Entry 
            +{
            +   const char *name; // Full name
            +   const char *number; // Phone number
            +};
            +
            +typedef struct _Phone_Entry Phone_Entry;
            +
            +static Phone_Entry _start_entries[] = 
            +{
            +   { "Wolfgang Amadeus Mozart", "+01 23 456-78910" },
            +   { "Ludwig van Beethoven", "+12 34 567-89101" },
            +   { "Richard Georg Strauss", "+23 45 678-91012" },
            +   { "Heitor Villa-Lobos", "+34 56 789-10123" },
            +   { NULL, NULL }
            +};
            +
            +
          2. + +
          3. Create the callback to free the data:

            +
            +static void
            +_phone_entry_free_cb(void *data)
            +{
            +   free(data);
            +}
            +
            +

            The free callback can be changed later using the eina_hash_free_cb_set() function. You need to pass the hash and the new callback function.

            +
          4. + +
          5. Create and destroy the hash table.

            +

            The eina_hash_free_buckets() function frees all hash table buckets. It empties the hash but does not destroy it, and you can still use it for another purpose. When eina_hash_free() is called, the space allocated for the hash is freed.

            +
            +int free_data()
            +{
            +   Eina_Hash *phone_book = NULL;
            +   phone_book = eina_hash_string_superfast_new(_phone_entry_free_cb);
            +
            +   // Empty the phone book without destroying it
            +   eina_hash_free_buckets(phone_book);
            +   eina_hash_free(phone_book);
            +}
            +
            +
          6. +
          + + + + +

          Modifying Hash Table Content

          + +

          To modify hash table content:

          +
            +
          • +

            To add some data to a hash, use the eina_hash_add() function. This function takes the hash, the key to access the data, and the data as its parameters.

            +

            The following example shows how to add the initial data declared earlier to the hash:

            +
            +for (i = 0; _start_entries[i].name != NULL; i++)
            +{
            +   eina_hash_add(phone_book, _start_entries[i].name, strdup(_start_entries[i].number));
            +}
            +
            + +

            The Eina_Hash offers various ways to add elements to a hash, such as the eina_hash_direct_add() function, which adds the entry without duplicating the string key. The key is stored in the struct, so this function can be used with eina_stringshare to avoid key data duplication.

            +
            +for (i = 0; _start_entries[i].name != NULL; i++)
            +{
            +   // Allocating memory for the phone entry
            +   Phone_Entry *e = malloc(sizeof(Phone_Entry));
            +
            +   // Creating an eina_stringshare for the name and the phone number
            +   e->name = eina_stringshare_add(_start_entries[i].name);
            +   e->number = eina_stringshare_add(_start_entries[i].number);
            +
            +   // Adding the entry to the hash 
            +   eina_hash_direct_add(phone_book, e->name, e);
            +}
            +
            +
          • +
          • +

            To modify an entry, use eina_hash_modify() function passing the hash, the key of the data to change, and the new data. The function returns the old data on success.

            +

            The eina_hash_set() function does the same work as eina_hash_modify(), but if the entry does not exist, the function creates a new one.

            +
            +char *old_phone = NULL;
            +char *phone = NULL;
            +// Replace the phone number of Richard Strauss
            +old_phone = eina_hash_modify(phone_book, "Richard Georg Strauss", strdup("+23 45 111-11111"));
            +phone = eina_hash_set(phone_book, "Philippe de Magalhães", strdup("+33 6 111-11111"));
            +eina_hash_set(phone_book, "Richard Georg Strauss", strdup("+23 45 111-117711"));
            +
            +
          • +
          • +

            To change the key associated with the data without freeing and creating a new entry, use the eina_hash_move() function. You only have to pass the hash, the old key, and the new key. If the operation succeeds, the function returns EINA_TRUE, if not, it returns EINA_FALSE.

            +
            +Eina_Bool res;
            +res = eina_hash_move(phone_book, "Philippe de Magalhães", "Filipe de Magalhães");
            +
            +
          • +
          • +

            To delete entries from a hash table:

            +
            • Use the eina_hash_del() function to remove the entry identified by a key or data from the given hash table: +
              +Eina_Bool r;
              +const char *entry_name = "Heitor Villa-Lobos";
              +r = eina_hash_del(phone_book, entry_name, NULL);
              +
            • +
            • Use the eina_hash_del_by_key() function to remove an entry based on the key: +
              +r = eina_hash_del_by_key(phone_book, "Richard Georg Strauss");
              +
              +
            • +
            • +

              Use the eina_hash_del_by_data() function to remove an entry based on the data:

              +
              +r = eina_hash_del_by_data(phone_book, "+12 34 567-89101");
              +
              +
            • +
          + +

          Accessing Hash Table Data

          +

          To find hash table elements and get data based on the key name:

          +
            +
          • +

            To retrieve an entry based on its key, use the eina_hash_find() function by passing the hash and the key you are looking for:

            +
            +char *phone = NULL;
            +const char *entry_name = "Heitor Villa-Lobos";
            +
            +// Look for a specific entry and get its phone number
            +phone = eina_hash_find(phone_book, entry_name);
            +
            +
          • +
          • +

            To get the number of entries in a hash, use the eina_hash_population() function. Pass the hash as the only argument.

            +
            +unsigned int nb_elm;
            +nb_elm = eina_hash_population(phone_book);
            +
            +
          • + +
          • To iterate through a hash table, you can use various methods: +
              + +
            • to iterate over the hash table, use the eina_hash_foreach() function: + +
              • The first parameter is the hash.
              • +
              • The second parameter is the callback function called on each iteration. +

                The callback function has to return an Eina_Bool, EINA_TRUE if the iteration has to continue and EINA_FALSE if the iteration has to stop.

              • +
              • The last parameter one is the data passed to the callback function.
              + +

              The following example prints the key and the data of the hash entry (the name and the phone number):

              + +
              +static Eina_Bool
              +pb_foreach_cb(const Eina_Hash *phone_book, const void *key, void *data, void *fdata)
              +{
              +   const char *name = key;
              +   const char *number = data;
              +   printf("%s: %s\n", name, number);
              +
              +   // Return EINA_FALSE to stop this callback from being called
              +   return EINA_TRUE;
              +}
              +
              +printf("List of phones:\n");
              +
              +// Running the callback on the hash called phone_book 
              +eina_hash_foreach(phone_book, pb_foreach_cb, NULL);
              +printf("\n");
              +
              +
            • +
            • To iterate over the keys, use the eina_hash_iterator_key_new() function: +
              +// Declaration of the Eina_Iterator
              +Eina_Iterator *it;
              +
              +// Variable to handle the current iteration "data"
              +void *data;
              +
              +// Iterate over the keys (names)
              +printf("List of names in the phone book:\n");
              +
              +it = eina_hash_iterator_key_new(phone_book);
              +
              +// Use the generic eina_iterator_next()
              +while (eina_iterator_next(it, &data))
              +{
              +   const char *name = data;
              +   printf("%s\n", name);
              +}
              +
              +// Free the iterator
              +eina_iterator_free(it);
              +
              +
            • + +
            • To iterate over the hash data, use the eina_hash_iterator_data_new() function the same way as eina_hash_iterator_key_new(): +
              +// Declaration of the Eina_Iterator
              +Eina_Iterator *it;
              +
              +// Variable to handle the current iteration "data"
              +void *data;
              +
              +// Iterate over hash data 
              +printf("List of numbers in the phone book:\n");
              +
              +it = eina_hash_iterator_data_new(phone_book);
              +while (eina_iterator_next(it, &data))
              +{
              +   const char *number = data;
              +   printf("%s\n", number);
              +}
              +
              +// Free the iterator
              +eina_iterator_free(it);
              +
              +
            • +
            • To iterate over a tuple composed of keys and data, use the eina_hash_iterator_tuple_new() function: +
              +// Declaration of the Eina_Iterator
              +Eina_Iterator *tit;
              +
              +// Variable to handle the current iteration "data"
              +void *tuple;
              +
              +printf("List of phones:\n");
              +tit = eina_hash_iterator_tuple_new(phone_book);
              +while (eina_iterator_next(tit, &tuple))
              +{
              +   Eina_Hash_Tuple *t = tuple;
              +   const char *name = t->key;
              +   const char *number = t->data;
              +   printf("%s: %s\n", name, number);
              +}
              +
              +// Always free the iterator after its use
              +eina_iterator_free(tit); 
              +
              +
            • +
            +
          • +
          + + +

          Lists

          + +

          The Eina_List is a double-linked list that can store data of any type as void pointers. It provides a set of functions to create and manipulate the list to avoid the access to the struct's fields, similar to a self-made double-link list.

          +

          In addition to the previous and next node and its data, the Eina_List nodes keep a reference to an accounting structure. The accounting structure is used to improve the performance of some functions. The structure is private and must not be modified.

          + +

          In an Eina_List, everything is a "list": the list itself is a list where each node is a list as well.

          + +

          Eina provides 2 list types: the classic list (Eina_List) and an inline list (Eina_Inlist).

          + +

          Creating and Destroying a List

          +

          To use an Eina_List:

          + +
          1. Declare the list with NULL as the default value: +
            +int list()
            +{
            +   // Declaration of the Eina_List with NULL as default value;
            +   Eina_List *list = NULL;
            +
          2. + +
          3. Call the eina_list_append() function with the list and the data you want to append as parameters. +

            The list must be a pointer to the first element of the list (or NULL). The function returns a pointer to the list.

            +
            +   // Creating the first element of the list 
            +   list = eina_list_append(list, "watch");
            +
            +   // Adding more elements
            +   list = eina_list_append(list, "phone");
            +   list = eina_list_append(list, "ivi");
            +   list = eina_list_append(list, "notebook");
            +
          4. + +
          5. When you no longer need the list, free it: +
            +   // Free the Eina_List
            +   eina_list_free(list);
            +
            +   return 0;
            +}
            +
          6. +
          + + +

          Modifying List Content

          + +

          To modify list content:

          +
            +
          • +

            To add data to a list:

            + +
              +
            • To add data at the end of the list, use the eina_list_append() function. To add data at the top of the list, use eina_list_prepend(). The functions work in the same way, only adding the data to different places. +
              +list = eina_list_prepend(list, "set-top box");
              +
              +
            • + +
            • To insert data into the list after a specified data, use the eina_list_append_relative() function. As the last parameter, define the element after which the data is added. +

              For example to append data after the "phone" element:

              +
              +list = eina_list_append_relative(list, "single-board computer", "phone");
              +
              +
            • + +
            • To add a new entry before a specified data, use the eina_list_prepend_relative() function. It is similar to the eina_list_append_relative() function. +
              +list = eina_list_prepend_relative(list, "ultrabook", "ivi");
              +
              +
            • + +
            • To append a list node to a linked list after a specified member, use the eina_list_append_relative_list() function. To prepend a list node to a linked list before a specified member, use the Eina_List * eina_list_prepend_relative_list() function. +
            • +
            +
          • + +
          • To set data in a list member, use the eina_list_data_set() function. Pass the "list" (node) as the first argument and the data to set as the second. + +

            The following example also shows the usage of the eina_list_last() function, which returns the last element of an Eina_List.

            + +
            +// Setting new data for the last element
            +eina_list_data_set(eina_list_last(list), eina_stringshare_add("Boris"));
            +
            +
          • + +
          • To remove a node from the list, use the eina_list_remove() function. This function removes the first instance of the specified data from the given list. +
            +list = eina_list_remove(list, "ultrabook");
            +
            +

            You can also remove a "list" (node) from a list using the eina_list_remove_list() function. Pass the list you want to delete an element from and a 'list' (node) you want to delete.

            +
            +Eina_List *app_list = NULL;
            +Eina_List *to_remove = NULL;
            +
            +// Adding some elements to the list (using stringshares)
            +app_list = eina_list_append(app_list, eina_stringshare_add("enna"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("ebird"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("calaos"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("rage"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("terminology"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("enlightenment"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("eyelight"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("ephoto"));
            +
            +// Finding the "list" to remove 
            +to_remove = eina_list_data_find_list(list, eina_string_share_add("enlightenment"));
            +
            +list = eina_list_remove_list(list, to_remove);
            +
            +
          • + +
          • To move elements in a list, you can use various function, such as eina_list_promote_list() that promotes an element to the top of the list or eina_list_demote_list() that puts the specified element at the end of the list. Remember that everything is a list so the second parameter represents the "list" (node) you want to move. Use the functions just like the eina_list_remove_list() function. +
            +list = eina_list_promote_list(list, eina_list_data_find_list(list, "ivi"));
            +
            +
          • +
          • To reverse all the elements of a list, use the eina_list_reverse() function. To obtain a reversed copy of the list while keeping the initial list unchanged, use the eina_list_reverse_clone() function. +
            +Eina_List *rev_copy;
            +
            +app_list = eina_list_reverse(app_list);
            +rev_copy = eina_list_reverse_clone(app_list);
            +
            +
          • +
          • To sort a list, use the eina_list_sort() function. This function takes a list which needs to be sorted, the maximum number of elements to be sorted, and a callback function that compares data. To sort all list elements, set the maximum number of elements to 0. +
            +int sort_cb(const void *d1, const void *d2)
            +{
            +   const char *txt = d1;
            +   const char *txt2 = d2;
            +   if(!txt) return(1);
            +   if(!txt2) return(-1);
            +
            +   return(strcmp(txt, txt2));
            +}
            +
            +extern Eina_List *list;
            +list = eina_list_sort(list, 0, sort_cb);
            +
            +
          • +
          • To merge 2 list into 1, use the eina_list_merge() function. The eina_list_sorted_merge() function merges 2 sorted lists according to the ordering function that you pass as the last argument. +
            +int sort_cb(void *d1, void *d2)
            +{
            +   const char *txt = NULL;
            +   const char *txt2 = NULL;
            +   if(!d1) return(1);
            +   if(!d2) return(-1);
            +
            +   return(strcmp((const char*)d1, (const char*)d2));
            +}
            +
            +Eina_List *sorted1;
            +Eina_List *sorted2;
            +Eina_List *newlist;
            +
            +// Insert some values and sort your lists
            +
            +// Simply merge 2 lists without any process
            +newlist = eina_list_merge(sorted1, sorted2);
            +
            +newlist = eina_list_sorted_merge(sorted1, sorted2, sort_cb);
            +
            +
          • +
          • To split a list, use the eina_list_split_list() function: +
            • The first parameter is the list to split.
            • +
            • The second parameter is the "list" (element) after which the list is split.
            • +
            • The last parameter is the head of the second list.
            +
            +// Original list (left list)
            +Eina_List *list = NULL;
            +
            +// New list (right list)
            +Eina_List *other_list = NULL;
            +
            +// Eina_List (element)
            +Eina_List *l;
            +
            +list = eina_list_append(list, "super tux");
            +list = eina_list_append(list, "frozen bubble");
            +list = eina_list_append(list, "lincity-ng");
            +
            +// Sorting the list (just for fun)
            +list = eina_list_sort(list, 0, cmp_func);
            +
            +// Looking for the 'split' element
            +l = eina_list_search_sorted_list(list, cmp_func, "frozen bubble");
            +
            +// Splitting the list
            +list = eina_list_split_list(list, l, &other_list);
            +
            +
          • +
          • To copy a list, use the eina_list_clone() function. The function copies all the elements in the list in the exact same order. +
            +Eina_List *app_list_copy;
            +
            +app_list_copy = eina_list_clone(app_list);
            +
            +
          • + +
          + + +

          Accessing List Data

          +

          To access list data:

          +
            +
          • To find some data on your list, use the eina_list_data_find() function. Pass the list containing your data as the first parameter and the data you are looking for as the last one. The function returns the found member data pointer if found, NULL otherwise. +

            The eina_list_data_find() function searches the list from the beginning to the end for the first member for which the data pointer is data. If it is found, the data is returned, otherwise NULL is returned. The function only compares pointers, which is why using Eina_Stringshare is very useful with lists, because it always returns the same pointer for the same string.

            +
            +Eina_List *app_list = NULL;
            +const char *res_str;
            +
            +// Adding some elements to the list (using stringshares)
            +app_list = eina_list_append(app_list, eina_stringshare_add("enna"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("ebird"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("calaos"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("rage"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("terminology"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("enlightenment"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("eyelight"));
            +app_list = eina_list_append(app_list, eina_stringshare_add("ephoto"));
            +
            +// Finding the data
            +res_str = eina_list_data_find(list, eina_string_share_add("enlightenment"));
            +if (res_str == eina_stringshare_add("enlightenment"))
            +   printf("Data is present");
            +else
            +   printf("Data not present");
            +
            + +

            The above example returns "Data is present".

            +

            The eina_list_data_find_list() function does the same thing as eina_list_data_find(), but returns an Eina_List. For an example, see the eina_list_remove_list() function.

            +

            You can access the data or a "list" (node) of an Eina_List using the eina_list_nth() and eina_list_nth_list() functions. The first one returns a pointer to the data of the "n" element and the second a pointer to the "list". To access the data of the 3rd element of an Eina_List:

            +
            +const char *res;
            +Eina_List *res_lst;
            +
            +res = eina_list_nth(app_list, 2);
            +res_lst = eina_list_nth_list(app_list, 2);
            +
            + +

            The res variable contains the pointer to the string "calaos". The res_lst variable is the list containing "calaos".

            +
          • + +
          • To search for data in a list, select your function based on whether the list is sorted or unsorted. +
              +
            • To search in an unsorted list, use the eina_list_search_unsorted() function: +
              • The first parameter is the list.
              • +
              • The second parameter is a callback function for comparison.
              • +
              • The last parameter is the data you are looking for.
              + +

              The eina_list_search_unsorted_list() function does the same but returns an "Eina_List".

              + + +

              The following example shows 2 searches using both the eina_list_search_unsorted() and eina_list_search_unsorted_list() functions:

              +
              +int search_list()
              +{
              +   // Declaring the list
              +   Eina_List *list = NULL; 
              +   Eina_List *l;
              +   // Little trick to use strcmp as Eina_Compare_Cb 
              +   Eina_Compare_Cb cmp_func = (Eina_Compare_Cb)strcmp;
              +
              +   void *data;
              +   int cmp_result;
              +
              +   list = eina_list_append(list, "debian");
              +   list = eina_list_append(list, "archlinux");
              +   list = eina_list_append(list, "centos");
              +
              +   data = eina_list_search_unsorted(list, cmp_func, "archlinux");
              +   l = eina_list_search_unsorted_list(list, cmp_func, "archlinux");
              +   if (l->data != data)
              +   {
              +      eina_list_free(list);
              +
              +      return 1;
              +   }
              +
              +   eina_list_free(list);
              +
              +   return 0;
              +}
              +
              + +
            • +
            • To search in sorted lists, use the eina_list_search_sorted_list() and eina_list_search_sorted() functions. They work similarly as the eina_list_search_unsorted() function. +
            • +
            +
          • + + +
          • To get data from a list element, use the eina_list_data_get() function. The function returns the data contained in the given list. + +

            The following example uses the eina_list_next() function to move through the list in a statement.

            +
            +int list_data_set()
            +{
            +   // Declaring the list
            +   Eina_List *list = NULL;
            +   // Eina_List in which to place the elements or lists
            +   Eina_List *l;
            +
            +   void *list_data;
            +
            +   list = eina_list_append(list, eina_stringshare_add("Bertrand"));
            +   list = eina_list_append(list, eina_stringshare_add("Cedric"));
            +   list = eina_list_append(list, eina_stringshare_add("Nicolas"));
            +   list = eina_list_append(list, eina_stringshare_add("Vincent"));
            +   list = eina_list_append(list, eina_stringshare_add("Raoul"));
            +   list = eina_list_append(list, eina_stringshare_add("Fabien"));
            +   list = eina_list_append(list, eina_stringshare_add("Philippe"));
            +   list = eina_list_append(list, eina_stringshare_add("billiob"));
            +
            +   for(l = list; l; l = eina_list_next(l))
            +      // Printing the data returned by eina_list_data_get
            +      printf("%s\n", (char*)eina_list_data_get(l));
            +
            +   EINA_LIST_FREE(list, list_data)
            +      eina_stringshare_del(list_data);
            +
            +   return 0;
            +}
            +
            +
          • + +
          • To move in a list, use the eina_list_last(), eina_list_next(), or eina_list_prev() functions to move to the last, next, or previous element in the list. +

            The following example scrolls backwards starting from the end of the list:

            +
            +for(l = eina_list_last(list); l; l = eina_list_prev(l))
            +   printf("%s\n", (char*)eina_list_data_get(l));
            +
            + +
          • + +
          • To count the list elements, use the eina_list_count() function. The function returns the number of items in a list. +
            +printf("List size: %d\n", eina_list_count(list));
            +
            +
          • +
          • To iterate through an array, you can use various iterators: +
              +
            • To iterate over a list from the beginning to the end, use the EINA_LIST_FOREACH macro: +
              • The first parameter is the list to iterate.
              • +
              • The second parameter is an Eina_List * to hold the current "List" (node).
              • +
              • The last parameter receives the current data during the run.
              + +

              The following example prints the data of each "List" (node) of the list:

              +
              +Eina_List *list = NULL;
              +Eina_List *l;
              +void *list_data;
              +
              +list = eina_list_append(list, "ls");
              +list = eina_list_append(list, "top");
              +list = eina_list_append(list, "rmdir");
              +list = eina_list_append(list, "uname");
              +
              +EINA_LIST_FOREACH(list, l, list_data)
              +   printf("%s\n", (char*)list_data);
              +
              +eina_list_free(list);
              +
              +
            • +
            • To iterate from the last element to the first, use the EINA_LIST_REVERSE_FOREACH macro. It works similarly as EINA_LIST_FOREACH(). +
            • +
            • To iterate over a list from the beginning to the end, you can also use the EINA_LIST_FOREACH_SAFE macro. It is called safe, because it stores the next "List" (node), so you can safely remove the current "List" (node) and continue the iteration. +
              +Eina_List *list;
              +Eina_List *l;
              +Eina_List *l_next;
              +char *data;
              +
              +list = eina_list_append(list, "tizen");
              +list = eina_list_append(list, "tizen");
              +list = eina_list_append(list, "tizen");
              +list = eina_list_append(list, "tizen");
              +
              +// Using EINA_LIST_FOREACH_SAFE to free the elements that match "tizen"
              +
              +EINA_LIST_FOREACH_SAFE(list, l, l_next, data)
              +   if (strcmp(data, "tizen") == 0) 
              +   {
              +      free(data);
              +      list = eina_list_remove_list(list, l);
              +   }
              +
              +
            • + + +
            • To remove each list element while having access to the node's data, use the EINA_LIST_FREE macro. Pass the list and a pointer to hold the current data. +
              +Eina_List *list;
              +char *data;
              +
              +// List is filled
              +
              +EINA_LIST_FREE(list, data)
              +   free(data);
              +
              +
            • +
            +
          • +
          + +

          Using an Inline List

          +

          The Eina_Inlist is a special data type drawn to store nodes pointers in the same memory as data. This way the memory is less fragmented, but operations, such as sort and count, are slower. The Eina_Inlist has its own purpose, but if you do not understand what the purpose is, use the regular Eina_List instead.

          + +

          The Eina_Inlist nodes can be part of a regular Eina_List, simply added with the eina_list_append() or eina_list_prepend() functions.

          + +

          To use the inline list:

          +
            +
          1. Define the structure of the data before creating the inline list: +
            +struct my_struct 
            +{
            +   EINA_INLIST;
            +   int a, b;
            +};
            +
            + +

            The structure is composed of 2 integers, the real data, and the EINA_INLIST type which is composed of 3 pointers defining the inline list structure:

            + +
              +
            • Eina_Inlist * next: next node
            • +
            • Eina_Inlist * prev: previous node
            • +
            • Eina_Inlist * last: last node
            • +
          2. + +
          3. +

            To create the inlist nodes, allocate the memory and use the eina_inlist_append() function:

            +
            • The first parameter is the existing list head or NULL to create a new list. +

              The following example passes NULL to create a new list.

            • +
            • The second parameter is the new list node, and it must not be NULL. +

              You must use the EINA_INLIST_GET() macro to get the inlist object of the datastruct.

            +
            +struct my_struct *d, *cur;
            +Eina_Inlist *list, *itr, *tmp;
            +
            +d = malloc(sizeof(*d));
            +d->a = 1;
            +d->b = 10;
            +
            +list = eina_inlist_append(NULL, EINA_INLIST_GET(d));
            +
            + +

            Repeat this operation for every new node:

            +
            +d = malloc(sizeof(*d));
            +d->a = 2;
            +d->b = 20;
            +list = eina_inlist_append(list, EINA_INLIST_GET(d));
            +
            +
          4. + +
          5. To add data to the inline list: +
            • Put data at the end of the inline list with the eina_inlist_prepend() function: +
              +d = malloc(sizeof(*d));
              +d->a = 3;
              +d->b = 30;
              +list = eina_inlist_prepend(list, EINA_INLIST_GET(d));
              +
              +
            • + +
            • Add a node before or after a given node with the eina_inlist_prepend_relative() and eina_inlist_append_relative() functions. +

              In both functions, the first parameter is the target list, the second is the element you want to add, and the last is the reference element to place data after (in this case). Similarly as in a regular Eina_List, everything is a list, so the last parameter is an Eina_Inlist typed variable.

              +
              d = malloc(sizeof(*d));
              +d->a = 4;
              +d->b = 40;
              +list = eina_inlist_append_relative(list, EINA_INLIST_GET(d), list);
              +
              +
          6. + +
          7. To sort and iterate an inline list, to find and move list elements, and to perform other inline list operations, see the Inline List API.
          8. + +
          9. When the inline list is no longer needed, destroy it by looping over the list to free each EINA_INLIST structure and the data using allocated memory. Use the eina_inlist_remove() function on each node. + +

            In the following example, the EINA_INLIST_CONTAINER_GET() macro returns the container object of an inlist (the EINA_INLIST of my_struct), and the list element is removed and the allocated memory of the container "object" is freed.

            + +
            while (list)
            +{
            +   struct my_struct *aux = EINA_INLIST_CONTAINER_GET(list, struct my_struct);
            +
            +   // Remove the current list element 
            +   list = eina_inlist_remove(list, list);
            +   free(aux);
            +}
            +
            +
          10. + + +
          + +

          Generic Value

          + +

          The Eina_Value object provides generic data storage and access, allowing you to store what you want in one single type of Eina_Value. It is meant for simple data types, providing uniform access and release functions, useful to exchange data preserving their types. The Eina_Value comes with predefined types for numbers, array, list, hash, blob, and structs, and it can convert between data types, including string.

          + +

          The Eina_Value can handle the following types:

          +
            +
          • EINA_VALUE_TYPE_UCHAR: unsigned char
          • +
          • EINA_VALUE_TYPE_USHORT: unsigned short
          • +
          • EINA_VALUE_TYPE_UINT: unsigned int
          • +
          • EINA_VALUE_TYPE_ULONG: unsigned long
          • +
          • EINA_VALUE_TYPE_TIMESTAMP: unsigned long used for timestamps
          • +
          • EINA_VALUE_TYPE_UINT64: unsigned integer of 64 bits
          • +
          • EINA_VALUE_TYPE_CHAR: char
          • +
          • EINA_VALUE_TYPE_SHORT: short
          • +
          • EINA_VALUE_TYPE_INT: int
          • +
          • EINA_VALUE_TYPE_LONG: long
          • +
          • EINA_VALUE_TYPE_INT64: integer of 64 bits
          • +
          • EINA_VALUE_TYPE_FLOAT: float
          • +
          • EINA_VALUE_TYPE_DOUBLE: double
          • +
          • EINA_VALUE_TYPE_STRINGSHARE: stringshared string
          • +
          • EINA_VALUE_TYPE_STRING: string
          • +
          • EINA_VALUE_TYPE_ARRAY: array
          • +
          • EINA_VALUE_TYPE_LIST: list
          • +
          • EINA_VALUE_TYPE_HASH: hash
          • +
          • EINA_VALUE_TYPE_TIMEVAL: 'struct timeval'
          • +
          • EINA_VALUE_TYPE_BLOB: blob of bytes
          • +
          • EINA_VALUE_TYPE_STRUCT: struct
          • +
          + + +

          To set up a generic value:

          +
            +
          1. Declare the necessary variables: +
            +// The Eina_Value itself
            +Eina_Value v;
            +// An integer 
            +int i;
            +// And a char *
            +char *newstr;
            +
            +
          2. + +
          3. To set up an Eina_Value for an integer, use the eina_value_setup() function. The first argument is the Eina_Value and the second is the type. +
            +eina_value_setup(&v, EINA_VALUE_TYPE_INT);
            +
            +
          4. +
          +

          To manage the generic value:

          +
            +
          • To set an integer, use the eina_value_set() function: +
            +eina_value_set(&v, 123);
            +
            +
          • + +
          • To get the value, use the eina_value_get() function. Pass the Eina_Value as the first argument, and a pointer to a variable to store the value (the target variable must have the same type as the Eina_Value). +
            +eina_value_get(&v, &i);
            +printf("v=%d\n", i);
            +
            +

            The above example prints "v=123".

            +
          • + +
          • To store an Eina_List, use the Eina_Value that corresponds to the EINA_VALUE_TYPE_LIST type. +
          • +
          • To create an Eina_Value_List, use the eina_value_list_setup() function. The function initializes a generic value storage of the list type. The first parameter is the "object" value, and the second one is the type (how to manage the stored list members). +
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/data_types_tools_n.htm b/org.tizen.ui.practices/html/native/efl/data_types_tools_n.htm new file mode 100644 index 0000000..9dc4da1 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/data_types_tools_n.htm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + Data Types and Tools: Using Eina Resources + + + +
          +
          +

          Mobile native Wearable native

          +
          + + +
          + +
          + +

          Data Types and Tools: Using Eina Resources

          + +

          UI toolkits, such as Qt and Gtk, generally support their own data types, structures, functions, and macros in order for you to easily and efficiently make their applications. EFL, as one of Tizen native UI toolkits, provides data types and useful tools as well.

          + +

          The Eina library in EFL implements APIs for data types and structures easy to use and optimized in an efficient way. It also provides some useful tools, such as opening shared libraries, error management, type conversion, time accounting, and memory pool to help convenient application development.

          + +

          The main features of Eina are:

          +
            +
          • Data Types

            The Eina library is a central part of the EFL. It implements an API for data types, and allows you to create and manipulate several data types.

          • +
          • Tools

            Eina provides a number of tools, such as string manipulation, that make your life easier when coding applications.

          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/datetime_tutorial_wn.htm b/org.tizen.ui.practices/html/native/efl/datetime_tutorial_wn.htm new file mode 100644 index 0000000..07e14c5 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/datetime_tutorial_wn.htm @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + Creating Wearable Datetimes + + + + + + +
          +

          Creating Wearable Datetimes

          + + +

          This tutorial explains how you can create UI components that allow the user to select a date or time.

          + +

          This feature is supported in wearable applications only.

          + + +

          Creating a Date Picker

          + +

          Use the elm_datetime component to add a date picker style (Year : Month : Day).

          +

          The following example creates the datepicker-styled Datetime and adds it in the conform.

          + +
          +// Add a datepicker style Datetime component
          +datetime = elm_datetime_add(ad->win);
          +evas_object_size_hint_align_set(datetime, EVAS_HINT_FILL, 0.5);
          +evas_object_size_hint_weight_set(datetime, EVAS_HINT_EXPAND, 1.0);
          +elm_object_style_set(datetime, "datepicker_layout");
          +evas_object_show(datetime);
          +
          +elm_object_content_set(ad->conform, datetime);
          +
          + +

          Creating a Time Picker

          +

          Use the elm_datetime component to add a time picker style (Hour(12) : Min : AM/PM, or Hour(24) : Min).

          +

          The following example creates the timepicker-styled Datetime and adds it in the conform.

          + +
          +// Add a timepicker style Datetime component
          +datetime = elm_datetime_add(ad->win);
          +evas_object_size_hint_align_set(datetime, EVAS_HINT_FILL, 0.5);
          +evas_object_size_hint_weight_set(datetime, EVAS_HINT_EXPAND, 1.0);
          +elm_object_style_set(datetime, "timepicker_layout");
          +evas_object_show(datetime);
          +
          +elm_object_content_set(ad->conform, datetime);
          +
          + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/ecore_animation_n.htm b/org.tizen.ui.practices/html/native/efl/ecore_animation_n.htm new file mode 100644 index 0000000..6e8e665 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ecore_animation_n.htm @@ -0,0 +1,451 @@ + + + + + + + + + + + + + Ecore Animations + + + + + +
          + +

          Ecore Animations

          + +

          Ecore provides a facility for animations called Ecore_Animator. Ecore animators use the Ecore main loop for creating animations, running a specific action on each tick of a timer in the main loop.

          + +

          To create an Ecore animation:

          +
            +
          1. Determine the duration of the animation.
          2. +
          3. Define a callback function that performs the animation with that duration.
          4. +
          + +

          To use Ecore animators in your application, you must include the <Ecore.h> file. This file is included by default if you are already using the <Elementary.h> file in your application. You then declare an Ecore_Animator* variable and use the variable in the ecore_animator_* functions.

          + +

          The following example shows how to create a simple animation with a finite duration:

          + +
          +static Eina_Bool
          +_do_animation(void *data, double pos)
          +{
          +   evas_object_move(data, 100 * pos, 100 * pos);
          +   // Do some more animating...
          +}
          +ecore_animator_timeline_add(2, _do_animation, my_evas_object);
          +
          + +

          In the above example, we create a linear transition to move my_evas_object from position (0,0) to position (100,100) in 2 seconds.

          + +

          Creating an Animation with a Finite Duration

          + +

          Most of the time, you will want to create animations that last for a predefined time.

          + +

          The ecore_animator_timeline_add() function allows you to define an animator that is automatically deleted after the animation is finished:

          + +
          ecore_animator_timeline_add(double runtime, Ecore_Timeline_Cb func, const void *data)
          + +
            +
          • The first argument is the duration of the animation in seconds. The duration is not affected by frame rate.
          • +
          • The second argument is the callback function that performs the animation.
          • +
          • The third argument is the parameter passed to the callback function. This is usually the Evas object to animate.
          • +
          + + + + + + + + + + +
          Note
          The callback function can return ECORE_CALLBACK_RENEW to keep the animator running or ECORE_CALLBACK_CANCEL to stop the animator and have it be deleted automatically at any time. The callback function is also passed a timeline position parameter with a value between 0.0 (start) to 1.0 (end) to indicate where along the timeline the animator is running.
          + +

          The following example performs a linear horizontal translation of 500 pixels in 8 seconds:

          +
          +static Eina_Bool
          +_my_animation(void *data, double pos)
          +{
          +   Evas_Object *obj = data; // Get the target object
          +   int x, y, w, h; // Target object geometry
          +   evas_object_geometry_get(obj, &x, &y, &w, &h); // Get current object position and size attributes
          +   evas_object_move(obj, 500 * pos, y); // Linear translation of the Evas object
          +}
          +ecore_animator_timeline_add(8, _my_animation, my_evas_object);
          +
          + +

          Position Mappings

          + +

          The Ecore_Pos_Map position mappings are used to define the evolution of a given position in accordance with the desired effects. The value ranges from 0.0 to 1.0 on a given timeline. This position variation allows you to apply dynamic changes to any attribute of your Evas object, such as position, width, height, scale, angle, and color.

          + +

          Ecore supports the following position mappings (with the listed v1 and v2 parameters):

          + +
            +
          • ECORE_POS_MAP_LINEAR: linear 0.0 - 1.0 +
              +
            • v1: not used
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_ACCELERATE: start slow, then speed up +
              +
            • v1: not used
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_DECELERATE: start fast, then slow down +
              +
            • v1: not used
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_SINUSOIDAL: start slow, speed up, then slow down at the end +
              +
            • v1: not used
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_ACCELERATE_FACTOR: start slow, then speed up +
              +
            • v1: power factor: 0.0 is linear, 1.0 is standard acceleration, 2.0 is a much more pronounced acceleration (squared), 4.0 is cubed, and so on
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_DECELERATE_FACTOR: start fast, then slow down +
              +
            • v1: power factor: 0.0 is linear, 1.0 is standard deceleration, 2.0 is a much more pronounced deceleration (squared), 3.0 is cubed, and so on
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_SINUSOIDAL_FACTOR: start slow, speed up, then slow down at the end +
              +
            • v1: power factor: 0.0 is linear, 1.0 is a standard sinusoidal, 2.1 is a much more pronounced sinusoidal (squared), 3.0 is cubed, and so on
            • +
            • v2: not used
            • +
            +
          • +
          • ECORE_POS_MAP_DIVISOR_INTERP: start at gradient * v1, interpolated via power of v2 curve +
              +
            • v1: multiplication factor for gradient
            • +
            • v2: curve value
            • +
            +
          • +
          • ECORE_POS_MAP_BOUNCE: start at 0.0, then "drop" like a ball bouncing to the ground at 1.0, and bounce v2 times, with a decay factor of v1 +
              +
            • v1: bounce decay factor
            • +
            • v2: number of bounces
            • +
            +
          • +
          • ECORE_POS_MAP_SPRING: start at 0.0, then "wobble" like a spring until rest position at 1.0, and wobble v2 times, with a decay factor of v1 +
              +
            • v1: wobble decay factor
            • +
            • v2: number of wobbles
            • +
            +
          • +
          + +

          Figure: Position mappings

          +

          Position mappings

          + +

          Using Position Mappings

          +

          When using the animation callback function, the animator passes a timeline position parameter with a value between 0.0 (start) and 1.0 (end) to indicate where along the timeline the animator is running.

          + +

          If you want to create a non-linear animation, map the position value to one of several curves and mappings:

          +
          ecore_animator_pos_map(double pos, Ecore_Pos_Map map, double v1, double v2)
          +
            +
          • The first argument is the current position value, which ranges from 0.0 to 1.0.
          • +
          • The second argument is the position mapping you want to apply.
          • +
          • The third argument is the first parameter (v1) to pass to the position mapping.
          • +
          • The fourth argument is the second parameter (v2) to pass to the position mapping.
          • +
          + + + + + + + + + + +
          Note
          The v1 and v2 arguments are specific to the chosen position mapping. For example, if you are using ECORE_POS_MAP_BOUNCE, v1 represents the bouncing level and v2 the number of bounces.
          + +

          The following example performs a transition that bounces 7 times, diminishing by a factor of 1.8 over 5 seconds:

          + +
          static Eina_Bool
          +_my_animation_callback(void *data, double pos)
          +{
          +   Evas_Object *obj = data; // Get the target object
          +   int x, y, w, h; // Target object geometry
          +   double frame = pos; // Actual position variation
          +   // Get frame relative position depending on desired effect
          +   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 1.8, 7);
          +   evas_object_geometry_get(obj, &x, &y, &w, &h); // Get current object position and size attributes
          +   evas_object_move(obj, x, 600 * frame); // Move the Evas object according to desired effect
          +
          +   return EINA_TRUE;
          +}
          +ecore_animator_timeline_add(5, _my_animation_callback, my_evas_object);
          + +

          Creating an Infinite Animation

          + +

          If you want the animation to run for an unspecified amount of time, use the ecore_animator_add() function. This function works the same way as the ecore_animation_timeline_add() function, except its interval is based on frame rate. Using frame rate as the basis benefits performance, especially if you define multiple animations, since you may want to have a different timer for each callback function.

          + +
          +ecore_animator_add(Ecore_Task_Cb func, const void *data)
          +
          + +
            +
          • The first argument is the callback function that performs the animation.
          • +
          • The second argument is the parameter passed to the callback function. This is usually the Evas object to animate.
          • +
          + + + + + + + + + + +
          Note
          The function returns a pointer to an Ecore_Animator object, which you can use to adjust the animation.
          + +

          The following example creates a rectangle sliding from left to right and back again. When the rectangle hits one edge of the screen, it changes direction.

          + +
          static Eina_Bool
          +_slide_back_and_forth(void *data)
          +{
          +   typedef enum {LEFT, RIGHT} direction_t; // Direction datatype
          +   static int x = 0; // Initial position
          +   static direction_t direction = RIGHT; // Initial direction
          +   if (x >= 250)
          +      direction = LEFT; // Change direction
          +   else if (x <= 0)
          +      direction = RIGHT; // Change direction
          +   if (direction == RIGHT)
          +      evas_object_move(data, ++x, 350); // Slide to right
          +   else if (direction == LEFT)
          +      evas_object_move(data, --x, 350); // Slide to left
          +
          +   return EINA_TRUE;
          +}
          +int
          +main(int argc, char *argv[])
          +{
          +   // Declarations
          +
          +   // Ecore Evas init
          +
          +   // Draw Evas objects
          +
          +   // Animations go here
          +   anim = ecore_animator_add(_slide_back_and_forth, rectangle);
          +   // Ecore main loop
          +
          +   // Free memory
          +}
          + + + + + + + + + + +
          Note
          To use this code, you have to merge it with the Ecore transition example above.
          + +

          Chaining Animations

          + +

          You may sometimes want to delay animating an object. This can be useful if, for example, you want to start an animation only after another one has finished.

          + +

          You can simply set a delay to the second animation equal to the duration of the first animation:

          + +
          +static int runtime = 5;
          +static int delay = runtime;
          +static Eina_Bool
          +_start_fold_animation(void *data)
          +{
          +   ecore_animator_timeline_add(runtime, _fold_animation, data);
          +
          +   return EINA_FALSE;
          +}
          +static Eina_Bool
          +_start_unfold_animation(void *data)
          +{
          +   ecore_animator_timeline_add(runtime, _unfold_animation, data);
          +
          +   return EINA_FALSE;
          +}
          +_start_fold_animation(my_evas_object);
          +ecore_timer_add(delay, _start_unfold_animation, my_evas_object);
          +
          + +

          Pausing and Resuming Animations

          + +

          You can pause and resume Ecore animations. To pause a running animation, use the ecore_animator_freeze() function:

          + +
          ecore_animator_freeze(Ecore_Animator *animator)
          + +

          The parameter is the Ecore_Animator to pause.

          + +

          To resume the paused animation, use the ecore_animator_thaw() function:

          + +
          ecore_animation_thaw(Ecore_Animator *animator)
          + +

          The parameter is the Ecore_Animator to resume.

          + +

          The following example pauses a transition after 5 seconds and resumes it after 5 more seconds:

          + +
          +static Eina_Bool
          +_freeze_animation(void *data)
          +{
          +   ecore_animator_freeze(data);
          +
          +   return EINA_FALSE;
          +}
          +static Eina_Bool
          +_thaw_animation(void *data)
          +{
          +   ecore_animator_thaw(data);
          +
          +   return EINA_FALSE;
          +}
          +ecore_timer_add(5, _freeze_animation, animator);
          +ecore_timer_add(10, _thaw_animation, animator);
          +
          + +

          Freeing Up Memory

          + +

          When you create an animation that does not have a timeout, you will have to manually free up the memory allocated to the Ecore_Animator object. By comparison, if the animation has a timeout, Ecore implements the mechanisms to automatically delete the animator from the list of pointers: When your animation callback returns 0 or ECORE_CALLBACK_CANCEL, the animator manager takes care of freeing up the allocated memory.

          + +

          To manually free up the memory, delete the pointer by using the ecore_animator_del() function:

          + +
          ecore_animator_del(Ecore_Animator *animator)
          + +

          The argument is the Ecore_Animator whose memory allocation to free up.

          + +

          Regardless of the type of animation, it is good practice to always ensure that the allocated memory is freed up before the program exits:

          + +
          if (animator != NULL)
          +   ecore_animator_del(animator);
          + +

          Frametime

          +

          In most cases, you will want to use the default timer ECORE_ANIMATOR_SOURCE_TIMER. This timer ticks every "frametime" seconds and allows you to perform transitions within a predefined timeline. The timer uses the system clock to tick over every Nth second, with the default being 1/30th of a second.

          + +

          To tweak performance, you can change the frametime value:

          + +
          ecore_animator_frametime_set(double frametime)
          + +

          The argument is the new frametime value.

          + + + + + + + + + + +
          Note
          Too small a value can cause performance issues, whereas too high a value can cause your animation to seem jerky.
          + +

          If you want to get the current frametime value, use the ecore_animator_frametime_get() function.

          + +

          Custom Timer

          + +

          You may want to specify a custom timer to match your animation to third-party events. For example, the filling speed of a progress bar will mainly depend on the time it takes for a task to complete and the velocity at which the remaining time estimation evolves. This kind of animation requires you to use a custom timer.

          + +

          To use a custom timer, first set ECORE_ANIMATOR_SOURCE_CUSTOM as the timer source, and then drive the timer based on an input tick source (such as another application via IPC or a vertical blanking interrupt):

          + +
          ecore_animator_custom_source_tick_begin_callback_set(Ecore_Cb func, const void *data)
          + +

          The first argument is the callback function to call on the tick start. The second argument is the data to pass to the callback function.

          + +
          ecore_animator_custom_source_tick_end_callback_set(Ecore_Cb func, const void *data)
          + +

          The first argument is the callback function to call on the tick end. The second argument is the data to pass to the callback function to set the functions that will be called to start and stop the ticking source.

          + +

          Next, trigger a tick over one frame:

          + +
          ecore_animator_custom_tick(void)
          + +

          The following example supposes a progress bar that will be refreshed every time some progress occurs:

          + +
          ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_CUSTOM);
          +void _on_progress_update()
          +{
          +   // Called when some progress occurs
          +   ecore_animator_custom_tick(); // Tick (next frame in progress bar animation)
          +}
          + +

          Finally, to get the current animator source, use the ecore_animator_source_get() function.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/ecore_animation_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/ecore_animation_tutorial_n.htm new file mode 100644 index 0000000..115874a --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ecore_animation_tutorial_n.htm @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + Creating Ecore Animations + + + + + + +
          +

          Creating Ecore Animations

          + + +

          This tutorial demonstrates how you can use Ecore animators to simplify the creation of animations. Using Ecore animators, you can manually create your own animations by changing and manipulating Evas object attributes. Ecore animators work like timers, running callback functions over a given duration (an animation timeline).

          + +

          Setting Up the Animation Target

          + +

          To set up the animation target:

          +
            +
          1. +

            Set up the UI components to use in the application. A Basic UI Application template is used as the basis for the application.

            + +
            +typedef struct 
            +appdata 
            +{
            +   // Main window
            +   Evas_Object *win;
            +   // Application title
            +   Evas_Object *label;
            +
            +   // Buttons
            +   Evas_Object *bt1;
            +   Evas_Object *bt2;
            +   Evas_Object *bt3;
            +
            +   // Animation target
            +   Evas_Object *target;
            +} appdata_s;
            +
            +
          2. +
          3. Create the actual UI components in the create_base_gui() function, starting with the main window and application title:

            + +
            +// Main window
            +ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +if (elm_win_wm_rotation_supported_get(ad->win)) 
            +{
            +   int rots[4] = {0, 90, 180, 270};
            +   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +}
            +
            +evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +
            +// Application title
            +ad->label = elm_label_add(ad->win);
            +elm_object_text_set(ad->label, "Ecore Animator Tutorial");
            +evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_win_resize_object_add(ad->win, ad->label);
            +evas_object_show(ad->label);
            +
            +
          4. +
          5. +

            Create the animation target: an Elm_Image Evas object.

            +
              +
            1. +

              Set the image path by calling the elm_image_file_set() function. This function takes as parameters the ad->target Evas object and the path of the image file, built with the snprintf() function and stored in a buffer.

              + +
              +// Set the image path
              +char buf[PATH_MAX];
              +snprintf(buf, sizeof(buf), "/opt/usr/apps/%s/res/images/tizen-logo.png", PACKAGE);
              +// Add the image
              +ad->target = elm_image_add(ad->win);
              +// Set the image path
              +if (!elm_image_file_set(ad->target, buf, NULL))
              +   printf("error: could not load image \"%s\"\n", buf);
              +evas_object_size_hint_weight_set(ad->target, EVAS_HINT_FILL, EVAS_HINT_FILL);
              +
              + +

              The image that is used in the source code is stored in the res/images folder of the application. The image that is used in the EDC file is stored in the edje/images folder.

              +
            2. + +
            3. +

              All images are available in the /opt/usr/apps/<PACKAGE_NAME>/res/images folder of the application. The package name is defined at the begin of the application code.

              + +
              +#if !defined(PACKAGE)
              +#define PACKAGE "org.tizen.ecoreanimator"
              +#endif
              +
            4. + +
            5. +

              You can move and resize the image before showing it:

              + +
              +// Move the image
              +evas_object_move(ad->target, 130, 100);
              +// Resize the image
              +evas_object_resize(ad->target, 200, 100);
              +// Show the image
              +evas_object_show(ad->target);
              +
              +
            +
          6. +
          + +

          Creating a Rotation Effect

          + +

          To create a rotation effect:

          + +
            +
          1. +

            Create a button for triggering the rotation effect. The button is placed and resized, and associated with the _btn_rotate_cb() callback function. This callback function calls the animation on the animation target.

            +
            +// Button 1
            +ad->bt1 = elm_button_add(ad->win);
            +elm_object_text_set(ad->bt1, "Rotate");
            +evas_object_size_hint_weight_set(ad->bt1, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_move(ad->bt1, 25, 0);
            +evas_object_resize(ad->bt1, 90, 70);
            +evas_object_smart_callback_add(ad->bt1, "clicked", _btn_rotate_cb, ad);
            +evas_object_show(ad->bt1);
            +
            +
          2. + +
          3. Create an Ecore animator timeline using the ecore_animator_timeline_add() function. This function adds an animator that runs for a limited time: run the _do_rotate() animation callback function for 1 second on the ad->target Evas object.

            +
            +static void 
            +_btn_rotate_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   ecore_animator_timeline_add(1, _do_rotate, ad->target);
            +}
            +
            + +
          4. +
          5. +

            Define the animation callback function that actually runs the animation. This callback is an Ecore_Timeline_Cb function, meaning it returns an Eina_Bool value and takes as parameters some data and the current position along the animation timeline (pos).

            + +

            To create the rotation animation, use an Evas map. The map handles the necessary map points and allows you to manipulate the target Evas object on the X, Y, and Z axes.

            + +

            In the animation callback function, first declare the Evas map. To implement the rotation, you must set an X and Y center, and because of this, 4 integer variables are created to store the size and position of the target. This information is provided by the evas_object_geometry_get() function, which returns the X and Y coordinates and the width and height of the target Evas object.

            +
            static Eina_Bool
            +_do_rotate(void *data, double pos)
            +{
            +   // Get the animation target
            +   Evas_Object *obj = data;
            +   // Declare Evas_Map
            +   Evas_Map *m;
            +   // Variables to store the target size and position
            +   int x, y, w, h;
            +
            +   // Get the size and position of the target
            +   evas_object_geometry_get(obj, &x, &y, &w, &h);
            +
            + +
          6. +
          7. +

            Create an Evas map consisting of 4 points, and populate these points with the animation target:

            + +
            +   // Create an Evas_Map of 4 points
            +   m = evas_map_new(4);
            +   // Populate the source and destination map points to match object exactly
            +   evas_map_util_points_populate_from_object(m, obj);
            +
            +
          8. +
          9. +

            Define the rotation using the evas_map_util_rotate() function:

            +
            +   // Create a rotation of 360° with x+(w/2) "x" center and y +(h/2) "y" center
            +   evas_map_util_rotate(m, 360.0 * pos, x + (w / 2), y + (h / 2));
            +
            +
          10. +
          11. Call the animation callback function. The function is called at several points along the timeline, which is why the rotation angle (360°) is multiplied by the timeline position (pos) to get the actual animation angle. If this is not done, you never see the animation take place. Join the target object to the map and run the animation:

            + +
            +   // Set the object to "animate" in the Evas_Map
            +   evas_object_map_set(obj, m);
            +   // Start the animation
            +   evas_object_map_enable_set(obj, EINA_TRUE);
            +
            + +

            Each call to the animation callback function rotates the object (360 * timeline position) degrees.

            +
          12. +
          13. +

            When you are finished, free up the memory allocated to the Evas map:

            + +
            +   // Free the used memory
            +   evas_map_free(m);
            +
            +   return EINA_TRUE;
            +}
            +
            +
          14. +
          + +

          Creating a Zoom Effect

          + +

          To create a zoom effect:

          + +
            +
          1. +

            Create a button in the create_base_gui() function:

            + +
            +// Button 2
            +ad->bt2 = elm_button_add(ad->win);
            +elm_object_text_set(ad->bt2, "Zoom");
            +evas_object_size_hint_weight_set(ad->bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_move(ad->bt2, 315, 0);
            +evas_object_resize(ad->bt2, 90, 70);
            +evas_object_smart_callback_add(ad->bt2, "clicked", _btn_zoom_cb, ad);
            +evas_object_show(ad->bt2);
            +
            +
          2. +
          3. +

            Create a button callback function and add a new timeline:

            + +
            +static void 
            +_btn_zoom_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   ecore_animator_timeline_add(1, _do_zoom, ad->target);
            +}
            +
            +
          4. +
          5. +

            Create the _do_zoom() animation callback function. It is almost identical to the _do_rotate() callback function (described in the previous use case), except that the evas_map_util_zoom() function is used to create the animation.

            + +

            In the following example, the horizontal and vertical zoom factor of 2 (second and third parameter), and the X and Y coordinates of the target as the horizontal and vertical center coordinates (fourth and fifth parameter) are used.

            + +
            +static Eina_Bool
            +_do_zoom(void *data, double pos)
            +{
            +   Evas_Object *obj = data;
            +   Evas_Map *m;
            +   int x, y, w, h;
            +
            +   evas_object_geometry_get(obj, &x, &y, &w, &h);
            +   m = evas_map_new(4);
            +   evas_map_util_points_populate_from_object(m, obj);
            +   evas_map_util_zoom(m, 2 * pos, 2 * pos, x , y);
            +   evas_object_map_set(obj, m);
            +   evas_object_map_enable_set(obj, EINA_TRUE);
            +   evas_map_free(m);
            +
            +   return EINA_TRUE;
            +}
            +
            + +

            The _do_zoom() callback function is called at several points along the animation timeline, which is why the horizontal and vertical zoom factor values are multiplied by the timeline position. Each call zooms more than the previous one, thereby creating the animation effect.

            +
          6. +
          + +

          Creating a 3D Rotation Effect

          + +

          To create a 3D rotation:

          +
            +
          1. +

            Create a button and its callback function. In this animation, the Evas object is rotated on all 3 axes (X, Y, Z).

            +
            +// Button 3
            +ad->bt3 = elm_button_add(ad->win);
            +elm_object_text_set(ad->bt3, "3D");
            +evas_object_size_hint_weight_set(ad->bt3, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_move(ad->bt3, 170, 0);
            +evas_object_resize(ad->bt3, 90, 70);
            +evas_object_smart_callback_add(ad->bt3, "clicked", _btn_3d_cb, ad);
            +evas_object_show(ad->bt3);
            +
            + +
            +static void 
            +_btn_3d_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   ecore_animator_timeline_add(1, _do_3d, ad->target);
            +}
            +
            +
          2. + +
          3. +

            Create the _do_3d() animation callback function, which is very similar to the rotate and zoom callback functions described in previous use cases. To create the animation, the evas_map_util_3d_rotate() function is used. This function allows you to rotate any Evas object on all 3 axes.

            + +

            In this example, the map is rotated 360 degrees around each axis (defined in the second, third, and fourth parameter). The horizontal (X) rotation center is the X position of the target plus its width divided by 3 (fifth parameter). The vertical (Y) rotation center is the Y position of the target plus 60 (sixth parameter). The Z rotation center is 0 (seventh parameter).

            +
            +static Eina_Bool
            +_do_3d(void *data, double pos)
            +{
            +   Evas_Object *obj = data;
            +   Evas_Map *m;
            +   int x, y, w, h;
            +
            +   evas_object_geometry_get(obj, &x, &y, &w, &h);
            +   m = evas_map_new(4);
            +   evas_map_util_points_populate_from_object(m, obj);
            +   evas_map_util_3d_rotate(m, pos * 360, pos * 360, pos * 360, x + (w / 3), y + 60, 0);
            +   evas_object_map_set(obj, m);
            +   evas_object_map_enable_set(obj, EINA_TRUE);
            +   evas_map_free(m);
            +
            +   return EINA_TRUE;
            +}
            +
            + +

            As with the rotation and zoom animations, multiply the angles by the timeline position to gently rotate the target on each call to the _do_3d() callback function along the timeline.

            +
          4. +
          +

          Creating Drop and Bounce Effects

          + +

          To create drop and bounce effects:

          + +
            +
          1. +

            Add drop and bounce effects to the buttons at the application start. To do this, create one timeline per button after creating the buttons in the create_base_gui() function:

            + +
            +ecore_animator_timeline_add(2, _do_drop, ad->bt1);
            +ecore_animator_timeline_add(2.3, _do_drop, ad->bt2);
            +ecore_animator_timeline_add(2.5, _do_drop, ad->bt3);
            +
            +
          2. + +
          3. +

            Call the same _do_drop() animation callback function for each timeline. In this callback, instead of using an Evas map, simply change the position of the target using the evas_object_move() function.

            +

            To get the bounce effect, use the ecore_animator_pos_map() function, which maps an input position from 0.0 to 1.0 along the timeline to a position on a different curve. The curve can be of different types, such as LINEAR, SINUSOIDAL, and BOUNCE (defined as the second parameter).

            + + +

            The ECORE_POS_MAP_BOUNCE map used starts at 0.0, then drops like a ball bouncing to the ground at 1.0, bouncing 4 times with a decay factor of 1. The bouncing times and the decay factor as defined as the third and fourth parameter.

            +
            static Eina_Bool
            +_do_drop(void *data, double pos)
            +{
            +   Evas_Object *obj = data;
            +   int x, y, w, h;
            +   double frame = pos;
            +   frame = ecore_animator_pos_map(pos, ECORE_POS_MAP_BOUNCE, 2, 4);
            +
            +   evas_object_geometry_get(obj, &x, &y, &w, &h);
            +   evas_object_move(obj, x, 600 * frame);
            +
            +   return EINA_TRUE;
            +}
            +
            + +

            The frame is used in the evas_object_move() function to create the animation. The value increases on each _do_drop() call along the timeline, which produces a nice drop of the buttons from their initial position to 600 pixels on the vertical axis.

            +
          4. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/edc_optimization_n.htm b/org.tizen.ui.practices/html/native/efl/edc_optimization_n.htm new file mode 100644 index 0000000..d7e0ac9 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edc_optimization_n.htm @@ -0,0 +1,556 @@ + + + + + + + + + + + + + + Optimizing EDC + + + + + + +
          +

          Optimizing EDC

          + + +

          To optimize EDC:

          + + + +

          Removing Unnecessary Parts

          +

          When you create EDC, there can be obsolete and unnecessary parts. Since they have an effect on performance, remove them.

          + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "bg";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.relative: 0.0 0.0;
          +               rel2.relative: 1.0 1.0;
          +               color: 255 255 255 255;
          +            }
          +         }
          +         part 
          +         { 
          +            name: "new";
          +            type: RECT;
          +            scale: 1;
          +            mouse_events: 1;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 0 255;
          +               rel1.relative: 0.2 0.2;
          +               rel2.relative: 0.8 0.8;
          +            }
          +         }
          +         part 
          +         { 
          +            name: "old";
          +            type: RECT;
          +            scale: 1;
          +            mouse_events: 1;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 0 0 0 0;
          +               rel1.relative: 0.5 0.5;
          +               rel2.relative: 1.0 1.0;
          +            }
          +         }
          +      }
          +   }
          +}
          +
          +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "bg";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.relative: 0.0 0.0;
          +               rel2.relative: 1.0 1.0;
          +               color: 255 255 255 255;
          +            }
          +         }
          +         part 
          +         { 
          +            name: "new";
          +            type: RECT;
          +            scale: 1;
          +            mouse_events: 1;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 0 255;
          +               rel1.relative: 0.2 0.2;
          +               rel2.relative: 0.8 0.8;
          +            }
          +         }  
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          +       
          +      }
          +   }
          +}
          +
          + +

          Using Text instead of Textblock

          + +

          The following EDCs lead to the same result. However, use TEXT for the simple texts for high performance, except when elements or multiple lines are needed.

          + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +collections 
          +{
          +   styles 
          +   {
          +      style 
          +      { 
          +         name: "text_style";
          +         base: "font="Sans" font_size=30 text_class=entry 
          +         color=#0088AA style=shadow,bottom 
          +         shadow_color=#00000080 valign=0.5 ellipsis=1.0 
          +         wrap=none align=center";
          +      }
          +   }
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "text";
          +            type: TEXTBLOCK;
          +            scale: 1;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               text 
          +               {
          +                  style: "text_style";
          +                  text: "TEXT";
          +               }
          +            }
          +         }
          +      }
          +   }
          +}
          +
          +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      part 
          +      { 
          +         name: "simple";
          +         type: TEXT;
          +         scale: 1;
          +         effect: SHADOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            align: 0.5 0.5;
          +            color: 0 136 170 255;
          +            visible: 1;
          +            text 
          +            {
          +               size: 30;
          +               font: "Sans";
          +               text: "TEXT";
          +            }
          +         }
          +      }
          +   }
          +}
          +
          + +

          Compressing Images and Embedding into EDC

          + +

          When you use a fixed image, it is more efficient to call an image within EDC. This saves time in accessing the image data and is more suitable for the data size.

          + +
          +collections 
          +{
          +   images 
          +   {
          +      image: "logo.png" COMP;
          +   }
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "logo";
          +            type: IMAGE;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.relative: 0.0 0.0;
          +               rel2.relative: 1.0 1.0;
          +               image.normal: "logo.png";
          +               aspect: 1 1;
          +               aspect_preference: BOTH;
          +            }
          +         }
          +      }
          +   }
          +}
          +
          + +

          Using a Spacer

          +

          When you use a part that is invisible but has a size (such as padding), using a spacer is more efficient. Since the spacer is invisible, it does not have the visibility and color options.

          + + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "bg";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 255 255;
          +            }         
          +         }
          +         part 
          +         { 
          +            name: "padding_left_top";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 0 0 0 0;
          +               rel1.to: "bg";
          +               rel2.to:"bg";
          +               rel2.relative: 0.0 0.0;
          +               align: 0.0 0.0;               
          +               min: 100 100;        
          +            }
          +         }
          +         part 
          +         { 
          +            name: "padding_right_bottom";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 0 0 0 0;
          +               rel1.to: "bg";
          +               rel1.relative: 1.0 1.0;
          +               rel2.to:"bg";
          +               align: 1.0 1.0;               
          +               min: 100 100;
          +            }         
          +         }
          +         part 
          +         { 
          +            name: "content";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 0 255;
          +               rel1.to: "padding_left_top";
          +               rel1.relative: 1.0 1.0;
          +               rel2.to:"padding_right_bottom";
          +               rel2.relative: 0.0 0.0;
          +            }         
          +         }
          +      }
          +   }
          +}
          +
          +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "bg";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 255 255;
          +            }         
          +         }
          +         part 
          +         { 
          +            name: "padding_left_top";
          +            type: SPACER;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.to: "bg";
          +               rel2.to:"bg";
          +               rel2.relative: 0.0 0.0;
          +               align: 0.0 0.0;               
          +               min: 100 100;
          +            }         
          +         }
          +         part 
          +         { 
          +            name: "padding_right_bottom";
          +            type: SPACER;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.to: "bg";
          +               rel1.relative: 1.0 1.0;
          +               rel2.to:"bg";
          +               align: 1.0 1.0;               
          +               min: 100 100;
          +            }         
          +         }
          +         part 
          +         { 
          +            name: "content";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               color: 255 255 0 255;
          +               rel1.to: "padding_left_top";
          +               rel1.relative: 1.0 1.0;
          +               rel2.to:"padding_right_bottom";
          +               rel2.relative: 0.0 0.0;
          +            }         
          +         }
          +      }
          +   }
          +}
          +
          + +

          Using the Image Border Feature

          + +

          When you use an image, you can effectively scale it to an optimal size with the image border option.

          + + + + + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +collections 
          +{
          +   images 
          +   {
          +      image: "test.png" COMP;
          +   }
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "test";
          +            type: IMAGE;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.relative: 0.2 0.2;
          +               rel2.relative: 0.8 0.8;
          +               image.normal: "test.png";
          +
          +            }
          +         }
          +      }
          +   }
          +}
          +
          +
          +collections 
          +{
          +   images 
          +   {
          +      image: "test.png" COMP;
          +   }
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "test";
          +            type: IMAGE;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               rel1.relative: 0.2 0.2;
          +               rel2.relative: 0.8 0.8;
          +               image.normal: "test.png";
          +               image.border: 5 5 5 5;
          +            }
          +         }
          +      }
          +   }
          +}
          +

          Image before

          Image after

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edc_part_block_n.htm b/org.tizen.ui.practices/html/native/efl/edc_part_block_n.htm new file mode 100644 index 0000000..c613e64 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edc_part_block_n.htm @@ -0,0 +1,2054 @@ + + + + + + + + + + + + + EDJE Data Collection Reference + + + + + +
          + +

          EDJE Data Collection Reference

          + +

          A typical Edje file starts with the following definitions:

          + +
          +images {}
          +fonts {}
          +color_classes {}
          +styles {}
          +collections 
          +{
          +   sounds 
          +   {
          +      tone: "tone-1" 2300;
          +      tone: "tone-2" 2300;
          +      sample 
          +      {
          +         name: "sound1" RAW;
          +         source: "sound_file1.wav";
          +      }
          +   }
          +   group {}
          +   group {}
          +}
          +
          + + + + + + + + + + + + +
          Note
          This reference is based on original work from Andres Blanc (dresb) andresblanc@gmail.com, and it has been heavily expanded and edited since then.
          +

          The following list shows the details of the top-level blocks.

          +
            +
          • images block: + +
            +images 
            +{
            +   image: "filename1.ext" COMP;
            +   image: "filename2.ext" LOSSY 99;
            +   set {}
            +   set {}
            +}
            +
            + +

            The images block is used to list the image files used in the theme. The used compression methods are also defined here. In addition to the top-level, the images blocks can be included inside other blocks, usually collections, group, and part. Using the images block on the top-level makes file list maintenance easier, when the theme is split among multiple files.

            + +
              +
            • image [image file] [compression method] (compression level) +

              This property is included for each image file. The full path to the directory holding the image can be defined later with the edje_cc tool's -id option. The available compression methods are:

              +
                +
              • RAW: Uncompressed
              • +
              • COMP: Lossless compression
              • +
              • LOSSY [0-100]: JPEG lossy compression with quality from 0 to 100
              • +
              • USER: Not embedded in the file, refer to an external file instead
              • +
              + +
            • +
            • images.set block + +
              +set 
              +{
              +   name: "image_name_used";
              +   image {}
              +   image {}
              +}
              +
              + +

              The set block is used to define an image with different content depending on its size. In addition to the top-level, the set blocks can be included inside other blocks, normally collections, group, and part. Using the set block on the top-level makes file list maintenance easier, when the theme is split among multiple files.

              + +
                +
              • name [image name] +

                Sets the name of this image description.

                +
              • + +
              • images.set.image block + +
                +image 
                +{
                +   image: "filename4.ext" COMP;
                +   size: 51 51 200 200;
                +   border: 0 0 0 0;
                +   border_scale_by: 0.0;
                +}
                +
                + +

                The image block defines the characteristics of an image. Every block describes one image and the size rule to use it. For full details, see Image.

                + +
                  +
                • image [image file] [compression method] (compression level) +

                  This property is included for each image file. The full path to the directory holding the image can be defined later with the edje_cc tool's -id option.

                  +
                • +
                • size [minw] [minh] [maxw] [maxh] +

                  Sets the minimum and maximum size that selects a specific image.

                  +
                • +
                • border [left] [right] [top] [bottom] +

                  If set, the width (in pixels) of each side of the image is displayed as a fixed size border, from the side inwards, preventing the corners from being changed on a resize.

                  +
                • +
                • border_scale_by [value] +

                  If border scaling is enabled, normally the output border sizes scale accordingly. For example, if 3 pixels on the left edge are set as a border, then normally at scale 1.0, those 3 columns are always the exact 3 columns of output, or at scale 2.0 they are 6 columns, or 0.33 they merge into a single column. This property multiplies the input scale factor by this multiplier, allowing the creation of supersampled borders to enable higher resolution outputs by always using the highest resolution artwork and then at runtime scaling it down. Valid values are: 0.0 or bigger (0.0 or 1.0 to switch it off).

                  +
                • +
                +
              • +
              +
            • +
          • + +
          • fonts block + +
            +fonts
            +{
            +   font: "filename1.ext" "fontname";
            +   font: "filename2.ext" "otherfontname";
            +}
            +
            + +

            The fonts block is used to list each font file with an alias used later in the theme. As with the images block, additional fonts blocks can be included inside other blocks.

            + +
              +
            • font [font filename] [font alias] +

              This property is included for each font, and it defines the font file and alias. The full path to the directory containing the font files can be defined later with the edje_cc tool's -fd option. +

            • +
            +
          • +
          • data block + +
            +data 
            +{
            +   item: "key" "value";
            +   file: "otherkey" "filename.ext";
            +}
            +
            + +

            The data block behaves in the same way as the data block inside the parts block, but the usage is different: this block is useful for data that covers the whole theme, such as license information, version, and authors.

            +
          • +
          • color_classes block + +
            +color_classes 
            +{
            +   color_class 
            +   {
            +      name: "colorclassname";
            +      color: [0-255] [0-255] [0-255] [0-255];
            +      color2: [0-255] [0-255] [0-255] [0-255];
            +      color3: [0-255] [0-255] [0-255] [0-255];
            +   }
            +}
            +
            + +

            The color_classes block contains one or more color_class blocks. Each color_class block allows you 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.

            + +
              +
            • name [color class name] +

              Sets the name for the color class, and is used as a reference by both the theme and the application.

              +
            • + +
            • color [red] [green] [blue] [alpha] +

              Sets the main color.

              +
            • + +
            • color2 [red] [green] [blue] [alpha] +

              Used as an outline in text and textblock parts.

              +
            • + +
            • color3 [red] [green] [blue] [alpha] +

              Used as a shadow in text and textblock parts.

              +
            • +
            +
          • + +
          • styles block + +
            +styles 
            +{
            +   style 
            +   {
            +      name: "stylename";
            +      base: "..default style properties..";
            +      tag: "tagname" "..style properties..";
            +   }
            +}
            +
            + +

            The styles block contains one or more style blocks. A style block is used to create style <tags> for advanced textblock formatting.

            + +
              +
            • name [style name] +

              Sets the name of the style to be used as a reference later in the theme.

              +
            • + +
            • base [style properties string] +

              Sets the default style properties applied to the complete text. The following tags can be used in the style property:

              +
                +
              • font
              • +
              • font_size + + + + + + + + + +
                Note
                The font size is a point size, and the size of the rendered text is affected by the ppi information. The system basic ppi is 96, and you can change it in the Emulator menu.
                + +
              • +
              • color
              • +
              • color_class
              • +
              • text_class
              • +
              • ellipsis
              • +
              • wrap
              • +
              • style
              • +
              • valign
              • +
              • align
              • + +
              + +
            • + +
            • tag [tag name] [style properties string] +

              Sets the style to be applied only to text between style <tags>..</tags>. When creating paired tags, like <bold></bold>, a '+' sign must be added at the start of the style properties of the first part (<bold>). If the second part (</bold>) is also defined, a '-' sign must be added to its style properties. This applies only to paired tags; single tags, like <tab>, must not have a starting '+'.

              +
                +
              • br
              • +
              • tab
              • +
              • b
              • +
              • match
              • +
              + + + + +

              The following code is the style sample for the text style:

              + +
              +style 
              +{ 
              +   name: "list_text_main";
              +   base: "font=Tizen:style=Regular font_size=30 color=#ffffff ellipsis=1.0";
              +   tag: "br" "\n";\
              +   tag: "ps" "ps";\
              +   tag: "tab" "\t";\
              +   tag: "b" "+ font_weight=Bold";
              +}
              +
              +
            • +
            +
          • + +
          • collections block + +
            +collections 
            +{
            +   base_scale: 1.8;
            +   sounds 
            +   {
            +      tone: "tone-1" 2300;
            +      tone: "tone-2" 440;
            +      sample 
            +      {
            +         name: "sound_file1" RAW;
            +         source: "sound_file1.wav";
            +      }
            +   }
            +   group 
            +   {
            +      name: "groupname";
            +      alias: "anothername;"
            +      min: width height;
            +      max: width height;
            +      parts {}
            +      scripts {}
            +      limits {}
            +      data {}
            +      programs {}
            +   }
            +}
            +
            + +

            The collections block is used to list the groups that compose the theme. Additional collections blocks do not prevent overriding group names.

            + +
              +
            • base_scale: [scale factor] +

              Sets information about the scale factor in the EDC file.

              + +

              Object scaling must be defined in the config.xml file of the application to show the application in a proper size in other devices. However, the scaling must be based on the scale 1.0. If the application is based on another scale, this scale must be defined in the config.xml file. This predefined scale is called the base scale.

              + +

              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.

              + +

              For more information about supporting multiple screens in one EDC, see the Multiple Screen Support guide.

              +
            • +
            • sounds block +

              The sounds block contains one or more sound sample and tone items.

              +
                +
              • tone [tone name] [frequency] +

                Sets the sound of the given frequency.

                +
              • +
              • sounds.sample block + +

                The sample block defines the sound sample.

                + +
                  +
                • name [sample name] [compression type] (quality) +

                  Used to include each sound file. The full path to the directory holding the sounds can be defined later with the edje_cc tool's -sd option. The valid compression types are:

                  +
                    +
                  • RAW: Uncompressed
                  • +
                  • COMP: Lossless compression
                  • +
                  • LOSSY [-0.1 - 1.0]: Lossy compression with quality from 0.0 to 1.0
                  • +
                  • AS_IS: No compression or encoding, write the file information as it is
                  • +
                  +
                • +
                + +
                  +
                • source [file name] +

                  Sets the sound source file name (mono or stereo WAV file; only files with the 44.1 KHz sample rate are supported for now).

                  +
                • +
                +
              • +
              + +
            • +
            • group block +

              The group block defines Edje Objects.

              +
            • +
            +
          • + + +
          + +

          Group Block

          + +
          +group
          +{
          +   name: "nameusedbytheapplication";
          +   alias: "anothername";
          +   min: width height;
          +   max: width height;
          +   parts 
          +   {
          +      <definitions of parts>
          +   }
          +   script 
          +   {
          +      <embryo script>
          +   }
          +   limits 
          +   {
          +      vertical: "limit_name" height_barrier;
          +      horizontal: "limit_name" width_barrier;
          +   }
          +   data 
          +   {
          +      items: "key" "value";
          +      file: "key" "file";
          +   }
          +   programs {}
          +}
          +
          + +

          The group block contains a list of parts and programs that compose a given Edje Object.

          + +
            +
          • name [group name] +

            Sets the name used by the application to load the resulting Edje object and to identify the group to swallow in a group part. If a group with the same name exists already, it is completely overridden by the new group.

            +
          • + +
          • inherit_only [1 or 0] +

            Flags the group as being used only for inheriting, which inhibits the edje_cc tool from resolving programs and parts that do not exist in this group, but are located in the group which is inheriting this group.

            +
          • + +
          • inherit [parent group name] +

            Sets the parent group name for inheritance. The inherit property is used to inherit any predefined group and change some properties which belong to a part, description, items, or program. The child group has the same properties as its parent group. If you specify the type again in an inherited part, it causes an error.

            + + + + + + + + + +
            Note
            When inheriting any parts, descriptions without state names are not allowed.
            +
          • + +
          • script_recursion [1/0] +

            Determines whether to error on unsafe calls when recursively running Embryo programs. For example, running an Embryo script which calls EDC that has a script{} block is unsafe, and the outer-most (first) Embryo stack is corrupted. It is strongly unadvisable to use this flag.

          • + +
          • alias [additional group name] +

            Sets the additional name to be used as an identifier. Defining multiple aliases is supported.

            +
          • + +
          • min [width] [height] +

            Sets the minimum size for the container defined by the composition of the parts. It is not enforced.

            +
          • + +
          • max [width] [height] +

            Sets the maximum size for the container defined by the totality of the parts. It is not enforced.

            +
          • + +
          • broadcast_signal [on/off] +

            Determines whether a signal gets automatically broadcasted to all sub group parts. The default value is on.

            +
          • + +
          • orientation [AUTO/LTR/RTL] +

            Sets the group orientation. It is useful if you want to match the interface orientation with language.

            +
              +
            • AUTO: Follow system defaults
            • +
            • LTR: Used in the Left To Right Languages (Latin)
            • +
            • RTL: Used in the Right To Left Languages (Hebrew, Arabic)
            • +
            +
          • + +
          • mouse_events [1 or 0] +

            Changes the default value of mouse_events for every part in this group. The default value is 1, to maintain compatibility.

            +
          • + +
          • program_source [source name] +

            Changes the default value of the source in the current group for every program which is declared after this value is set. The value defaults to an unset value to maintain compatibility. The name of the source can be set on every program, but if the name can be defined in the group level, it reduces the effort to indicate it in every program.

            +
          • +
          • group.parts block + +
            +parts 
            +{
            +   part {}
            +   part {}
            +   part {}
            +}
            +
            + +

            The parts block contains one or more part. Each part describes a visual element and has a type, such as text, image, or table.

            +
          • +
          • group.script block + +
            +group 
            +{
            +   script 
            +   {
            +      <embryo script>
            +   }
            +   program 
            +   {
            +      script 
            +      {
            +         <embryo script>
            +      }
            +   }
            +}
            +
            + +

            The script block is used to inject embryo scripts to a given Edje theme. It functions in two modalities: when it is included inside a program block, the script is executed every time the program is run, and when included directly into a group, part, or description block, it is executed once at the load time, in the load order.

            +
          • + +
          • group.limits block + +
            +limits 
            +{
            +   vertical: "limit_name" height_barrier;
            +   horizontal: "limit_name" width_barrier;
            +}
            +
            + +

            The limits block is used to trigger signals when the Edje object is resized.

            +
              +
            • vertical [name] [height barrier] +

              Sends a limit,name,over signal when the object is resized and passes the limit by growing over it. When the object's size is reduced below the limit, the limit,name,below signal is sent. This limit is applied on the Y axis and is given in pixels.

              +
            • +
            • horizontal [name] [width barrier] +

              Sends a limit,name,over signal when the object is resized and passes the limit by growing over it. When the object's size is reduced below the limit, the limit,name,below signal is sent. This limit is applied on the X axis and is given in pixels.

              +
            • +
            +
          • + +
          • group.data block + +
            +data 
            +{
            +   item: "key" "value";
            +   file: "key2" "somefile";
            +}
            +
            + +

            The data block is used to pass arbitrary parameters from the theme to the application. Unlike the images and fonts blocks, additional data blocks can only be included inside the group block.

            + +
              +
            • items: "key" "value"; +

              Sets a new parameter, the value is the string specified next to it.

              +
            • +
            • file: "key" "file"; +

              Sets a new parameter, the value is the content of the specified file formatted as a single string of text. This property only works with plain text files.

              +
            • +
            + + + + + + + + + + +
            Note
            For genlist item styles, keys must be texts and icons, respectively for text parts and swallow parts; values must the names of the parts, separated with spaces.
            +
          • + +
          • group.programs block + +
            +programs 
            +{
            +   program {}
            +   program {}
            +   program {}
            +}
            +
            + +

            The programs group contain one or more program. Each program contains code related to the interaction and animation of the visual elements.

            +
          • +
          + + +

          Part Block

          + +
          +part
          +{
          +   // Inherit all the fields of another part
          +   inherit: "partname";
          +   // Name the part
          +   name: "partname";
          +   // Set the part type
          +   type: IMAGE;
          +   // Enable mouse events on the part
          +   mouse_events: 0/1;
          +   // Repeat the mouse events to the parts below the current one
          +   repeat_events: 0/1;
          +   ignore_flags: NONE;
          +   // Set whether the part sizes scale with the edje scaling factor
          +   scale: 0/1;
          +   // Set whether fully-transparent pixels are taken into account for collision detection
          +   precise_is_inside: 0/1;
          +   // Only render the area of the part that coincides with the given part
          +   clip_to: "anotherpart";
          +   // For group/textblock parts: swallow the given group (for textblock: goes below text)
          +   source: "groupname";
          +   // Same as the source but goes on top of text
          +   source2: "groupname";
          +   // For textblock parts: swallow the given group below the mouse cursor when it hovers over the part
          +   source3: "groupname";
          +   // Same as source3 but goes on top of the cursor
          +   source4: "groupname";
          +   // For textblock parts: swallow the given group below text anchors (<a>...</a>)
          +   source5: "groupname";
          +   // Same as source5 but goes on to top of the anchor
          +   source6: "groupname";
          +   // Add a shadow effect to the part
          +   effect: SOFT_SHADOW (BOTTOM_RIGHT);
          +   // For textblock parts: makes the text editable, possibly with a specific behavior
          +   entry_mode: PASSWORD;
          +   // For textblock parts: change how the text selection is triggered
          +   select_mode: EXPLICIT;
          +   // For editable textblock parts: where to draw the (blinking) cursor
          +   cursor_mode: UNDER;
          +   // For editable textblock parts: allow multiple lines
          +   multiline: 0/1;
          +   // For textblock parts: accessibility features are used
          +   access: 0/1;
          +   // No-one uses that
          +   pointer_mode: AUTOGRAB;
          +   use_alternate_font_metrics: 0/1;
          +   // Remove the given program; useful when it was inherited
          +   program_remove: "programname";
          +   // Remove the given part; useful when it was inherited
          +   part_remove: "partname";
          +   // Insert the current part below the given part, as if it were declared before
          +   insert_before: "partname";
          +   // Insert the current part above the given part, as if it were declared after
          +   insert_after: "partname";
          +   // Define a new part inside this one
          +   part 
          +   {
          +      <part definition>
          +   }
          +   draggable
          +   {
          +      // Confine the current part to the given part
          +      confine: "another part";
          +      // Only start drag when it has moved enough to be outside the given part
          +      threshold: "another part";
          +      // Forward the drag events to the given part instead of handling them
          +      events: "another draggable part";
          +      // Enable the horizontal drag of the part with step_size steps or with steps_count steps
          +      x: 0/1 <step_size> <steps_count>;
          +      // Same as x but vertical
          +      y: 1 0 100;
          +   }
          +   // For box or table parts
          +   box/table 
          +   {
          +      // List of items
          +      items 
          +      {
          +         item 
          +         {
          +            // Define the item type, can only be GROUP
          +            type: GROUP;
          +            // Name the item
          +            name: "name";
          +            // Set the source for this item, or its content
          +            source: "groupname";
          +            // Set the minimum horizontal and vertical item sizes (-1 for expand)
          +            min: -1 -1;
          +            // Set the maximum horizontal and vertical item sizes (-1 for ignore)
          +            max: 100 100;
          +            // Set the item padding in pixels
          +            padding: 2 2 2 2;
          +            spread: 1 1;
          +            // Set the item alignment
          +            align: 0.5 0.5;
          +            // Set a weight hint in the box for the given object
          +            weight: 1 1;
          +            // Set the aspect ratio hint
          +            aspect: 1 1;
          +            aspect_mode: BOTH;
          +            // Set the number of columns and rows the item takes
          +            span: 1 1;
          +         }
          +      }
          +   }
          +   description 
          +   {
          +      // Inherit another description
          +      inherit: "default" 1.0;
          +      // Name the current description
          +      state: "default" 1.0;
          +      // Use another part as content of the current proxy part 
          +      // This description only works in the proxy part and the current part mirrors the rendering content of the source part
          +      source: "partname";
          +      // Make the part (in)visible (invisible parts emit no signals)
          +      visible: 0/1;
          +      // Emit a signal when the given dimension becomes zero or stops being zero
          +      limit: WIDTH;
          +      // Set the horizontal and vertical alignment of the part inside its parent
          +      align: 0.5 0.5;
          +      // Set that the part does not change size
          +      fixed: 0/1 0/1;
          +      // Set the minimum size for the part
          +      min: 200 200;
          +      // Forcibly multiply the minimum sizes by the given factors
          +      minmul: 1.2 1.2;
          +      // Set the maximum size for the part
          +      max: 400 400;
          +      // Make vertical and horizontal resizes happen in steps
          +      step: 0 0;
          +      // Force the aspect ratio to be kept between min and max between resizes
          +      aspect: 0.8 1.2;
          +      // Set the dimension to which the aspect ratio applies
          +      aspect_preference: BOTH;
          +      // Use the given color class which can be used to factor font colors
          +      color_class: "colorclassname";
          +      // Set the text color
          +      color: 255 0 0 255;
          +      // Set the color of the text shadow
          +      color2: 0 255 0 255;
          +      // Set the color of the text outline
          +      color3: 0 0 255 255;
          +      // Define the positions of the top-left (rel1) and bottom-right (rel2) corners
          +      rel1/rel2 
          +      {
          +         // Make relative and offset use the given part for their positioning
          +         to: "partname";
          +         // Position the corner relative to the part given through to (0.0 being axis beginning, 1.0 being its end)
          +         relative: 0.1 0.1;
          +         // Add an absolute offset (in pixels) along each axis
          +         offset: 10 10;
          +         // Same as to but only for the X axis
          +         to_x: "partname";
          +         // Same as to but only for the Y axis
          +         to_y: "partname";
          +      }
          +      // Settings specific to parts of the image type
          +      image 
          +      {
          +         // Set the name (not path) of the regular image
          +         normal: "imagename";
          +         // Set the image to use while transitioning to the normal image; use several times to create animations
          +         tween: "imagename2";
          +         // Set the number of pixels that make up each border of the image, and are not resized with the image
          +         border: 4 4 4 4;
          +         // Hide, strip from its alpha, or show (default) the non-border part of the image
          +         middle: DEFAULT;
          +         border_scale_by: 1.0;
          +         // Set whether to scale the border
          +         border_scale: 0/1;
          +         scale_hint: STATIC;
          +         // Set how the image is going to fill its part
          +         fill: 
          +         {
          +            // Set whether to smooth the image when scaling it
          +            smooth: 0/1;
          +            spread: ??;
          +            // Set whether to scale or tile to fit when resizing the image is needed
          +            type: SCALE/TILE;
          +            // Only display the part of the image that is below and to the right of the given point
          +            origin 
          +            {
          +               // Specify top-left point as relative coordinates
          +               relative: 0.1 0.1;
          +               // Specify top-left point as a pixel offset
          +               offset: 10 10;
          +            }
          +            // Specify bottom-right point as relative coordinates
          +            size 
          +            {
          +               // Specify bottom-right point as relative coordinates
          +               relative: 0.1 0.1;
          +               // Specify bottom-right point as a pixel offset
          +               offset: 10 10;
          +            }
          +         }
          +      }
          +      // Settings specific to parts of the text and textblock type 
          +      text 
          +      {
          +         // Set the part text
          +         text: "some text";
          +         // Set the text font
          +         font: "Tizen Sans";
          +         // Set the text size
          +         size: 14;
          +         // Set the text's class which can be used to factor font and font-size settings
          +         text_class: "classname";
          +         // Set the styles defined in stylename
          +         style: "stylename";
          +         // For textblocks in the password mode, replace characters to hide with this string
          +         repch: "*";
          +         // Set the min and max font sizes allowed when resizing (default is 0 0, or unrestricted)
          +         size_range: 6 18;
          +         // Increase the font size as much as possible while still remaining in the container for both axes
          +         fit: 0/1 0/1;
          +         // Make the min size of the container equal to the min size of the current text (0 0 by default)
          +         min: 0/1 0/1;
          +         // Make the max size of the container equal to the max size of the current text (0 0 by default)
          +         max: 0/1 0/1;
          +         // Set the vertical and horizontal alignments of the text
          +         align: 0.5 0.5;
          +         // Reuse the text of another part
          +         text_source: "partname";
          +         // When the text is too long to fit, set the relative position at which to cut the text and put an ellipsis ("...")
          +         ellipsis: 0.9;
          +      }
          +      // Settings specific to parts of the box type
          +      box 
          +      {
          +         // Set how children are arranged in the box
          +         layout: horizontal_homogeneous;
          +         // Set the vertical and horizontal alignments of the box
          +         align: 0.5 0.5;
          +         // Set the padding between items of the box
          +         padding: 1 1;
          +         // Make the box's min size the min size of its elements (make it shrinkable as much as its items)
          +         min: 0 1;
          +      }
          +      table 
          +      {
          +         // Make items homogeneous
          +         homogeneous: NONE;
          +         // Set the vertical and horizontal alignments of the table
          +         align: 0.5 0.5;
          +         // Set the padding between items of the table
          +         padding: 1 1;
          +         // Make the table's min size the min size of its elements (make it shrinkable as much as its items)
          +         min: 0 1;
          +      }
          +      map 
          +      {
          +         perspective: "partname";
          +         light: "partname";
          +         on: 0/1;
          +         smooth: 0/1;
          +         alpha: 0/1;
          +         backface_cull: 0/1;
          +         perspective_on: 0/1;
          +         color: 0/1;
          +         rotation 
          +         {
          +            center: "partname";
          +            x: 45;
          +            y: 120;
          +            z: 90;
          +         }
          +         perspective 
          +         {
          +            zplane: 0/1;
          +            focal: 20;
          +         }
          +         // Simpler syntax to create transitions to the current part
          +         link 
          +         {
          +            base: "edje,signal" "edje";
          +         }
          +      }
          +   }
          +}
          +
          + +

          The part block is used to represent the most basic design elements of the theme, for example, a part can represent a line in a border or a label on a button.

          + +
            +
          • inherit [part name] +

            Copies all properties except part name from the referenced part into the current part. All existing properties, except part name, are overwritten.

            + + + + + + + + + +
            Note
            When inheriting any parts, descriptions without state names are not allowed.
            +
          • + +
          • program_remove [program name] (program name) (program name) ... +

            Removes the listed programs from an inherited group. Removing non-existing programs is not allowed.

            + + + + + + + + + +
            Note
            This breaks program sequences if a program in the middle of the sequence is removed.
            +
          • + +
          • part_remove [part name] (part name) (part name) ... +

            Removes the listed parts from an inherited group. Removing non-existing parts is not allowed.

            +
          • + +
          • name [part name] +

            Sets the part name is used as a reference in the theme's relative positioning system, by programs and in some cases by the application. The part name must be unique within the group.

            +
          • + +
          • type [TYPE] +

            Sets the type (IMAGE by default). The valid types are:

            +
              +
            • RECT: Rectangle object in the screen
            • +
            • TEXT: Simple text
            • +
            • IMAGE: Image area
            • +
            • SWALLOW: Area where you can add an object
            • +
            • TEXTBLOCK: Complex text with, for example, multiple lines or mark-up elements
            • +
            • GROUP: Part which can include other groups in the same group
            • +
            • BOX: Container object as a container. It has a row or a column.
            • +
            • TABLE: Container object as a container. It has a row and column.
            • +
            • PROXY: Clone of another part in the same group. It shares the memory of the source part.
            • + +
            • SPACER: Rectangle object, but invisible. Recommended for padding, because it does not allocate any memory.
            • + +
            +
          • + +
          • part [part declaration] +

            Sets a nested part that adds hierarchy to Edje. A nested part inherits its location relative to the parent part. To declare a nested part, create a new part within the current part declaration. Define the parent part name before adding nested parts.

            +
            +part 
            +{
            +   name: "parent_rect";
            +   type: RECT;
            +   description {}
            +   part 
            +   {
            +      name: "nested_rect";
            +      type: RECT;
            +      description {}
            +   }
            +}
            +
            +
          • + +
          • insert_before [another part's name] +

            Sets the part's name which this part is inserted before. One part cannot have both insert_before and insert_after. One part cannot refer to more than one part name by insert_before.

            +
          • + +
          • insert_after [another part's name] +

            Sets the part's name which this part is inserted after. One part cannot have both insert_before and insert_after. One part cannot refer to more than one part name by insert_after.

            +
          • + +
          • mouse_events [1 or 0] +

            Determines whether the part emits signals, although it is named mouse_events. Disabling (0) prevents the part from emitting a signal. The default value is 1, or the value set to mouse_events at the group level.

            +
          • + +
          • repeat_events [1 or 0] +

            Determines whether a part echoes a mouse event to other parts below the pointer (1). The default value is 0.

            +
          • + +
          • ignore_flags [FLAG] ... +

            Determines whether events with the given flags are ignored, or do not emit signals to the parts. Multiple flags must be separated by spaces, the effect is ignoring all events with one of the flags specified. Possible flags are:

            +
              +
            • NONE: Event is handled properly (default value)
            • +
            • ON_HOLD: Event is not handled or passed in this part
            • + +
            +
          • + +
          • scale [1 or 0] +

            Determines whether the part scales its size with an Edje scaling factor. This is used to scale properties, such as font size or min/max size of the part, and it can also be used to scale based on DPI of the target device. The reason to be selective is that some parts are scaled well, others are not, so choose what works best. By default the scaling is off (0) and the default scale factor is 1.0, which means no scaling.

            +
          • + +
          • pointer_mode [MODE] +

            Sets the mouse pointer behavior for a given part. The default value is AUTOGRAB. The available modes are:

            +
              +
            • AUTOGRAB: When the part is clicked and the button remains pressed, the part is the source of all future mouse signals emitted, even outside the object, until the button is released
            • +
            • NOGRAB: Effect is limited to the part's container
            • +
            +
          • + +
          • precise_is_inside [1 or 0] +

            Enables precise point collision detection for the part, which is more resource-intensive. This setting is disabled by default.

            +
          • + +
          • use_alternate_font_metrics [1 or 0] +

            Determines whether Edje uses different size measurement functions. This setting only affects text and textblock parts, and is disabled by default.

            +
          • + +
          • clip_to [another part's name] +

            Renders only the area of the part that coincides with another part's container. Overflowing content is not displayed. Note that the part being clipped to can only be a rectangle part.

            +
          • + +
          • source [another group's name] +

            Swallows the specified group into the part's container if the source is a group. If the source is a textblock, it is used for the group to be loaded and used for selection display under the selected text. source2 is used on top of the selected text, if source2 is specified.

            +

            Only available to group or textblock parts.

            +
          • + +
          • source2 [another group's name] +

            Used for the group to be loaded and used for selection display over the selected text. source is used under the selected text, if source is specified.

            +

            Only available to textblock parts.

            +
          • + +
          • source3 [another group's name] +

            Used for the group to be loaded and used for cursor display under the cursor position. source4 is used over the cursor text, if source4 is specified.

            +

            Only available to textblock parts.

            +
          • + +
          • source4 [another group's name] +

            Used for the group to be loaded and used for cursor display over the cursor position. source3 is used under the cursor text, if source3 is specified.

            +

            Only available to textblock parts.

            +
          • + +
          • source5 [another group's name] +

            Used for the group to be loaded and used for anchors display under the anchor position. source6 is used over the anchor text, if source6 is specified.

            +

            Only available to textblock parts.

            +
          • + +
          • source6 [another group's name] +

            Used for the group to be loaded and used for anchor display over the anchor position. source5 is used under the anchor text, if source5 is specified.

            +

            Only available to textblock parts.

            +
          • + +
          • effect [effect] (shadow direction) +

            Applies the selected outline, shadow, or glow effect to a textblock. Note that this effect only works for the textblock. The available effects are:

            +
              +
            • PLAIN
            • +
            • OUTLINE
            • +
            • SOFT_OUTLINE
            • +
            • SHADOW
            • +
            • SOFT_SHADOW
            • +
            • OUTLINE_SHADOW
            • +
            • OUTLINE_SOFT_SHADOW
            • +
            • FAR_SHADOW
            • +
            • FAR_SOFT_SHADOW
            • +
            • GLOW
            • +
            + +

            The available shadow direction definitions are:

            +
              +
            • BOTTOM_RIGHT (default)
            • +
            • BOTTOM
            • +
            • BOTTOM_LEFT
            • +
            • LEFT
            • +
            • TOP_LEFT
            • +
            • TOP
            • +
            • TOP_RIGHT
            • +
            • RIGHT
            • +
            +
          • + +
          • entry_mode [mode] +

            Sets the edit mode for a textblock part. The available modes are:

            +
              +
            • NONE: Textblock is non-editable
            • +
            • PLAIN: Textblock is non-editable, but selectable
            • +
            • EDITABLE: Textblock is editable
            • +
            • PASSWORD: Textblock is editable if the Edje object has the keyboard focus and the part has the Edje focus (or selectable always regardless of focus). In case of the password mode, the textblock is not selectable and all text characters are replaced with * characters, but they remain editable and pastable.
            • +
            +
          • + +
          • select_mode [mode] +

            Sets the selection mode for a textblock part. The available modes are:

            +
              +
            • DEFAULT: Selection mode is what you would expect on any desktop. Press mouse, drag, and release to end.
            • +
            • EXPLICIT: Mode requires the application controlling the Edje object to explicitly begin and end selection modes, and the selection itself is draggable at both ends
            • +
            +
          • + +
          • cursor_mode [mode] +

            Sets the cursor mode for a textblock part. The available modes are:

            +
              +
            • UNDER: Cursor draws below the character pointed at. This is the default setting.
            • +
            • BEFORE: Cursor is drawn as a vertical line before the current character, just like many other GUI toolkits handle it
            • +
            +
          • + +
          • multiline [1 or 0] +

            Enables multiple lines for editing in an editable a textblock.

            +
          • + +
          • access [1 or 0] +

            Determines whether the part uses the accessibility feature (1). The default value is 0.

            +
          • +
          • draggable block + +
            +draggable 
            +{
            +   confine: "another part";
            +   threshold: "another part";
            +   events:  "another draggable part";
            +   x: 0 0 0;
            +   y: 0 0 0;
            +}
            +
            + +

            The draggable block enables the part to be dragged around the interface. Do not confuse this feature with external drag and drop. By default, Edje (and most applications) attempts to use the smallest possible size for a draggable part. If the min property is not set in the description, the part is (most likely) set to 0px width and 0px height, thus invisible.

            + +
              + +
            • x [enable/disable] [step] [count] +

              Sets up dragging events for the X axis. The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis. When enabled, 1 sets the starting point at 0.0 and -1 at 1.0. The second parameter takes any integer and limits the movement to values divisible by it, causing the part to jump from position to position. If the step is set to 0, it is calculated as the width of the confine part divided by count.

              +
            • + +
            • y [enable/disable] [step] [count] +

              Sets up dragging events for the Y axis. The first parameter is used to enable (1 or -1) and disable (0) dragging along the axis. When enabled, 1 sets the starting point at 0.0 and -1 at 1.0. The second parameter takes any integer and limits the movement to values divisible by it, causing the part to jump from position to position. If the step is set to 0, it is calculated as the height of the confine part divided by count.

              +
            • + +
            • confine [another part's name] +

              Limits the movement of the dragged part to another part's container. Set a min size for the part, or the dragged object does not show up.

              +
            • + +
            • threshold [another part's name] +

              Allows (when set) the movement of the dragged part start only when it gets moved outside the threshold part.

              +
            • + +
            • events [another draggable part's name] +

              Causes the part to forward the drag events to another part, thus ignoring the drag events for itself.

              +
            • + +
            +
          • +
          • box or table block +
              +
            • box.items or table.items block + +
              +box/table 
              +{
              +   items 
              +   {
              +      item 
              +      {
              +         type: GROUP;
              +         source: "some source";
              +         min: -1 -1;
              +         max: 100 100;
              +         padding: 1 1 2 2;
              +      }
              +      item 
              +      {
              +         type: GROUP;
              +         source: "some other source";
              +         name: "some name";
              +         align: 1.0 0.5;
              +      }
              +   }
              +}
              +
              + +

              On a box part, the items block is used to set other groups as elements of the box. These elements can be mixed with external objects set by the application through the edje_object_part_box*() functions.

              +
                +
              • box.items.item or table.items.item block +

                The item block defines an element within the box or table.

                +
                  + +
                • type [item type] +

                  Sets the type of the object this item holds. The supported type is:

                  +
                    +
                  • GROUP (default)
                  • +
                  +
                • + +
                • name [name for the object] +

                  Sets the name of the object using the evas_object_name_set() function.

                  +
                • + +
                • source [another group's name] +

                  Sets the group this object is made of.

                  +
                • + +
                • min [width] [height] +

                  Sets the minimum size hints for this object.

                  + + + + + + + + + +
                  Note
                  The minimum size hint must be -1 to get the expand behavior.
                  +
                • + +
                • spread [width] [height] +

                  Replicates the item in a rectangle of size (width x height) box starting from the defined position of this item. The default value is 1 1;.

                  +
                • + +
                • prefer [width] [height] +

                  Sets the preferred size hints for this object.

                  +
                • + +
                • max [width] [height] +

                  Sets the maximum size hints for this object.

                  +
                • + +
                • padding [left] [right] [top] [bottom] +

                  Sets the padding hints for this object.

                  +
                • + +
                • align [x] [y] +

                  Sets the alignment hints for this object.

                  +
                • + +
                • weight [x] [y] +

                  Sets the weight hints for this object.

                  +
                • + +
                • aspect [w] [h] +

                  Sets the aspect width and height hints for this object.

                  +
                • + +
                • aspect_mode [mode] +

                  Sets the aspect control hints for this object. The available hints are:

                  +
                    +
                  • NONE
                  • +
                  • NEITHER
                  • +
                  • HORIZONTAL
                  • +
                  • VERTICAL
                  • +
                  • BOTH
                  • +
                  +
                • + +
                • options [extra options] +

                  Sets extra options for the object.

                  +
                • + +
                • position [col] [row] +

                  Sets the position this item has in the table. This is required for the table type parts only.

                  +
                • + +
                • span [col] [row] +

                  Sets how many columns and rows this item uses. The default value is 1 1.

                  +
                • +
                +
              • +
              +
            • +
            +
          • +
          • description block + +
            +description 
            +{
            +   inherit: "another_description" INDEX;
            +   state: "description_name" INDEX;
            +   visible: 1;
            +   min: 0 0;
            +   max: -1 -1;
            +   align: 0.5 0.5;
            +   fixed: 0 0;
            +   step: 0 0;
            +   aspect: 1 1;
            +
            +   rel1 
            +   {
            +      ...
            +   }
            +
            +   rel2 
            +   {
            +      ...
            +   }
            +}
            +
            + +

            The description block is used to define the style and layout properties of a part in a given state. Every part can have one or more description blocks.

            + +
              + +
            • inherit [another description's name] [another description's index] +

              Sets the description from which all the properties are inherited. The properties defined in this part override the inherited properties, reducing the amount of necessary code for simple state changes. Note that inheritance in Edje is single level only.

              +
            • + +
            • source [another part's name] +

              Causes the part to use another part's content as the content of this part. This works only with a proxy part.

              +
            • + +
            • state [name for the description] [index] +

              Sets the name used to identify a description inside a given part. Multiple descriptions are used to declare different states of the same part, like clicked or invisible. All state declarations are also coupled with an index number between 0.0 and 1.0. All parts must have at least one description named default 0.0.

              +
            • + +
            • visible [0 or 1] +

              Determines whether a part is visible (1). Non-visible parts do not emit signals. The default value is 1.

              +
            • + +
            • limit [mode] +

              Emits a signal when the part size changes from zero or to zero (limit,width,over, limit,width,zero). By default, no signal is emitted. The valid values are:

              +
                +
              • NONE
              • +
              • WIDTH
              • +
              • HEIGHT
              • +
              • BOTH
              • +
              +
            • + +
            • align [X axis] [Y axis] +

              When the displayed object's size is smaller or bigger than its container, this property moves it relatively along both axes inside its container. 0.0 means left/top edges of the object touching container's respective ones, and 1.0 stands for right/bottom edges of the object (on horizontal/vertical axis, respectively). The default value is 0.5 0.5. For a more detailed explanation, see Align size hint.

              +
            • + +
            • fixed [width, 0 or 1] [height, 0 or 1] +

              Sets the minimum size calculation. See the edje_object_size_min_calc() and edje_object_size_min_restricted_calc() functions of the Edje Object Geometry API (in mobile and wearable applications). The value tells the min size calculation routine where this part does not change size in width or height (1 for it does not, 0 for it does), so the routine does not try to expand or contract the part.

              +
            • + +
            • min [width] [height] or SOURCE +

              Sets the minimum size of the state. When the property is set to SOURCE, it looks at the original image size and enforces its minimal size to match at least the original one. The part must be an image or a group part.

              +
            • + +
            • minmul [width multiplier] [height multiplier] +

              Sets the multiplier forcibly applied to whatever minimum size is only during minimum size calculation.

              +
            • + +
            • max [width] [height] or SOURCE +

              Sets the maximum size of the state. A size of -1.0 means that it is ignored in one direction. When the property is set to SOURCE, Edje enforces the part to be not more than the original image size. The part must be an image part.

              +
            • + +
            • step [width] [height] +

              Restricts resizing of each dimension to values divisible by its value. This causes the part to jump from value to value while resizing. The default value is 0 0, which disables stepping.

              +
            • + +
            • aspect [min] [max] +

              Forces the width to height ratio to be kept between the minimum and maximum set. For example, 1.0 1.0 increases the width a pixel for every pixel added to height. The default value is 0.0 0.0, which disables aspect. For a more detailed explanation, see Minimum size hint. Normally the width and height can be resized to any values independently.

              +
            • + +
            • aspect_preference [DIMENSION] +

              Sets the dimensions to which the aspect property applies. The available options are:

              +
                +
              • BOTH
              • +
              • VERTICAL
              • +
              • HORIZONTAL
              • +
              • SOURCE
              • +
              • NONE
              • +
              +

              For a more detailed explanation, see Minimum size hint.

              +
            • + +
            • color_class [color class name] +

              Sets the part to use the color values of the named color_class. These values can be overridden by the color, color2, and color3 properties.

              +
            • + +
            • color [red] [green] [blue] [alpha] +

              Sets the main color to the specified values (between 0 and 255).

              + + + + + + + + + +
              Note
              The textblock part is not affected by the color description. Set the color in the text style.
              + +
            • + +
            • color2 [red] [green] [blue] [alpha] +

              Sets the text shadow color to the specified values (0 to 255).

              +
            • + +
            • color3 [red] [green] [blue] [alpha] +

              Sets the text outline color to the specified values (0 to 255).

              +
            • + +
            • description.rel1 or description.rel2 block +
              +description 
              +{
              +   rel1 
              +   {
              +      relative: 0.0 0.0;
              +      offset:     0   0;
              +   }
              +   rel2 
              +   {
              +      relative: 1.0 1.0;
              +      offset:    -1  -1;
              +   }
              +}
              +
              + +

              The rel1 and rel2 blocks are used to define the position of each corner of the part's container. rel1 refers to the left-top corner and rel2 to the right-down corner.

              + +
                + +
              • relative [X axis] [Y axis] +

                Moves the corner to a relative position inside the container of the relative to part. Values from 0.0 (0%, beginning) to 1.0 (100%, end) on each axis.

                +
              • + +
              • offset [X axis] [Y axis] +

                Affects the corner position a fixed number of pixels along each axis.

                +
              • + +
              • to [another part's name] +

                Positions the corner relative to another part's container. Setting to "" resets this value for inherited parts.

                +
              • + +
              • to_x [another part's name] +

                Positions the corner relative to the X axis of another part's container. This affects the first parameter of the relative property. Setting to "" resets this value for inherited parts.

                +
              • + +
              • to_y [another part's name] +

                Positions the corner relative to the Y axis of another part's container. This affects the second parameter of the relative property. Setting to "" resets this value for inherited parts.

                +
              • + +
              +
            • +
            • description.image block + +
              +description 
              +{
              +   image 
              +   {
              +      normal: "filename.ext";
              +      tween:  "filename2.ext";
              +      tween:  "filenameN.ext";
              +      border:  left right top bottom;
              +      middle:  0/1/NONE/DEFAULT/SOLID;
              +      fill {}
              +   }
              +}
              +
              +

              The image block defines the settings for an image used in a visual element.

              +
                + +
              • normal [image's filename] +

                Sets the name of the image to be used as previously declared in the images block. In an animation, this is the first and last image displayed. The file name is required in all image parts.

                +
              • + +
              • tween [image's filename] +

                Sets the name of an image to be used in an animation loop. An image block can have none, one, or multiple tween declarations. Images are displayed in the order they are listed, during the transition to the state they are declared in; the normal image is the final state.

                +
              • + +
              • border [left] [right] [top] [bottom] +

                Sets the width (in pixels) of each side of the image displayed as a fixed size border, from the side inwards, preventing the corners from being changed on a resize.

                +
              • + +
              • middle [mode] +

                If a border is set, this value tells Edje whether the rest of the image (not covered by the defined border) is displayed or assumed to be solid (without alpha). The default value is 1/DEFAULT. The available values are:

                +
                  +
                • 0 or NONE
                • +
                • 1 or DEFAULT
                • +
                • SOLID (strip alpha from the image over the middle zone)
                • +
                +
              • + +
              • border_scale_by [value] +

                If border scaling is enabled, normally the output border sizes scale accordingly. For example, 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. 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 at runtime scaling it down. The value can be: 0.0 or bigger (0.0 or 1.0 to switch it off)

                +
              • + +
              • border_scale [0/1] +

                Tells Edje whether the border is scaled by the object or global Edje scale factors.

                +
              • + +
              • scale_hint [mode] +

                Sets the Evas image scale hint letting the engine more effectively save cached copies of the scaled image, if it makes sense. The valid values are:

                +
                  +
                • 0 or NONE
                • +
                • DYNAMIC
                • +
                • STATIC
                • +
                +
              • + +
              • description.image.fill block + +
                +image 
                +{
                +   fill 
                +   {
                +      type: SCALE;
                +      smooth: 0-1;
                +      origin {}
                +      size {}
                +   }
                +}
                +
                + +

                The fill block is an optional block that defines the way an image part is going to be displayed inside its container. It can be used for tiling (repeating the image) or displaying only part of an image. For more information, see the evas_object_image_fill_set() function of the Image Object Functions API (in mobile and wearable applications).

                + +
                  + +
                • smooth [0 or 1] +

                  Determines whether the image is smoothed on scaling (1). The default value is 1.

                  +
                • + +
                • spread +
                • + +
                • type [fill type] +

                  Sets the image fill type. The min part property must be set, it is the size of the tiled image. If the max property is set, the tiled area has the size according to the max value. The valid values are:

                  +
                    +
                  • SCALE: Image is scaled according to the value of the relative and offset properties from the origin and size blocks. This is the default value.
                  • +
                  • TILE: Image is tiled according to the value of the relative and offset properties from the origin and size blocks
                  • +
                  +
                • + +
                • image.fill.origin block + +
                  +image 
                  +{
                  +   fill 
                  +   {
                  +      origin 
                  +      {
                  +         relative: 0.0 0.0;
                  +         offset: 0 0;
                  +      }
                  +   }
                  +}
                  +
                  + +

                  The origin block is used to place the starting point inside the displayed element that is used to render the tile. By default, the origin is set at the element's left-top corner.

                  + +
                    + +
                  • relative [X axis] [Y axis] +

                    Sets the starting point relative to the displayed element's content.

                    +
                  • +
                  • offset [X axis] [Y axis] +

                    Affects the starting point a fixed number of pixels along each axis.

                    +
                  • + +
                  +
                • + +
                • image.fill.size block + +
                  +image 
                  +{
                  +   fill 
                  +   {
                  +      size 
                  +      {
                  +         relative: 1.0 1.0;
                  +         offset: -1 -1;
                  +      }
                  +   }
                  +}
                  +
                  + +

                  The size block defines the tile size of the content that is displayed.

                  + +
                    + +
                  • relative [width] [height] +

                    Takes a pair of decimal values that represent the percentage of the original size of the element. For example, 0.5 0.5 represents half the size, while 2.0 2.0 represents double. The default value is 1.0 1.0.

                    +
                  • +
                  • offset [X axis] [Y axis] +

                    Affects the size of the tile a fixed number of pixels along each axis.

                    +
                  • + +
                  +
                • +
                +
              • +
            • + +
            • description.text block + +
              +text 
              +{
              +   text: "some string of text to display";
              +   font: "font_name";
              +   size: SIZE;
              +   text_class: "class_name";
              +   fit: horizontal vertical;
              +   min: horizontal vertical;
              +   max: horizontal vertical;
              +   align: X-axis Y-axis;
              +   source: "part_name";
              +   text_source: "text_part_name";
              +   style: "stylename";
              +}
              +
              + +

              The text block defines a text part element.

              + +
                + +
              • text [a string of text, or nothing] +

                Sets the default content of a text part, normally the application is the one changing its value.

                +
              • + +
              • text_class [text class name] +

                Sets the name used by the application to alter the font family and size at runtime (similar to color_class).

                +
              • + +
              • font [font alias] +

                Sets the font family to one of the aliases set up in the fonts block. This can be overridden by the application settings.

                +
              • + +
              • style [the style name] +

                Causes the part to use the default style and tags defined in the style block with the specified name.

                +
              • + +
              • repch [the replacement character string] +

                In the password mode, this string is used to replace every character to hide the details of the entry. Normally * is used, but you can use any character you like.

                +
              • + +
              • size [font size in points (pt)] +

                Sets the default font size for the text part. This can be overridden by the application settings.

                +
              • + +
              • size_range [font min size in points (pt)] [font max size in points (pt)] +

                Sets the allowed font size for the text part. Setting min and max to 0 means that sizing is not restricted. This is also the default value.

                +
              • + +
              • fit [horizontal] [vertical] +

                When any of the parameters is set to 1, Edje resizes the text for it to fit in its container. Both are disabled by default.

                +
              • + +
              • min [horizontal] [vertical] +

                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. The default value is 0 0.

                +
              • + +
              • max [horizontal] [vertical] +

                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. The default value is 0 0.

                +
              • + +
              • align [horizontal] [vertical] +

                Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

                +
              • + +
              • source [another TEXT part's name] +

                Causes the part to use the text properties (like font and size) of another part and update them as they change.

                +
              • + +
              • text_source [another TEXT part's name] +

                Causes the part to display the text content of another part and update them as they change.

                +
              • + +
              • ellipsis [point of balance] +

                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 to a smaller size than the text itself. The default value is 0.0.

                +
              • + +
              +
            • + +
            • description.box block + +
              +box 
              +{
              +   layout: "vertical";
              +   padding: 0 2;
              +   align: 0.5 0.5;
              +   min: 0 0;
              +}
              +
              + +

              The box block can contain other objects and display them in different layouts, any of the predefined set, or a custom one, set by the application.

              + +
                + +
              • layout [primary layout] (fallback layout) +

                Sets the layout for the box:

                +
                  +
                • horizontal (default)
                • +
                • vertical
                • +
                • horizontal_homogeneous
                • +
                • vertical_homogeneous
                • +
                • horizontal_max (homogeneous to the max sized child)
                • +
                • vertical_max
                • +
                • horizontal_flow
                • +
                • vertical_flow
                • +
                • stack
                • +
                • some_other_custom_layout_set_by_the_application +

                  Set a custom layout as a fallback. For more information, see the edje_box_layout_register() function in the Edje Box Part API (in mobile and wearable applications). If an unregistered layout is used, it defaults to horizontal.

                • + +
                +
              • + +
              • align [horizontal] [vertical] +

                Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

                +
              • + +
              • padding [horizontal] [vertical] +

                Sets the space between cells in pixels. The default value is 0 0.

                +
              • + +
              • min [horizontal] [vertical] +

                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. The default value is 0 0.

                +
              • + +
              +
            • + +
            • description.table block + +
              +table 
              +{
              +   homogeneous: TABLE;
              +   padding: 0 2;
              +   align: 0.5 0.5;
              +   min: 0 0;
              +}
              +
              + +

              The table block can contain other objects packed in multiple columns and rows, and each item can span across more than one column or row.

              + +
                + +
              • homogeneous [homogeneous mode] +

                Sets the homogeneous mode for the table:

                +
                  +
                • NONE: Default
                • +
                • TABLE: Available space is evenly divided between children (the space overflows onto other children if too little space is available)
                • +
                • ITEM: Size of each item is the largest minimum size of all the items
                • +
                +
              • + +
              • align [horizontal] [vertical] +

                Changes the position of the point of balance inside the container. The default value is 0.5 0.5.

                +
              • + +
              • padding [horizontal] [vertical] +

                Sets the space between cells in pixels. The default value is 0 0.

                +
              • + +
              • min [horizontal] [vertical] +

                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. The default value is 0 0.

                +
              • + +
              +
            • +
            • description.map block + +
              +map 
              +{
              +   perspective: "name";
              +   light: "name";
              +   on: 1;
              +   smooth: 1;
              +   perspective_on: 1;
              +   backface_cull: 1;
              +   alpha: 1;
              +
              +   rotation 
              +   {
              +      ...
              +   }
              +}
              +
              + +
                + +
              • perspective [another part's name] +

                Sets the part that is used as the perspective point for giving a part a 3D look. 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 the center point, zplane, and focal are used. This also implicitly enables perspective transforms.

                +
              • + +
              • light [another part's name] +

                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). 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. The light part color property is used as the light color (alpha not used for light color). The color2 property is used for the ambient lighting when calculating brightness (alpha also not used).

                +
              • + +
              • on [1 or 0] +

                Enables mapping for the part. The default value is 0.

                +
              • + +
              • smooth [1 or 0] +

                Enables smooth map rendering. This can be linear interpolation, anisotropic filtering, or anything the engine decides is smooth. This is a best-effort hint and it may not produce precisely the same results in all engines and situations. The default value is 1.

                +
              • + +
              • alpha [1 or 0] +

                Enables the alpha channel when map rendering. The default value is 1.

                +
              • + +
              • backface_cull [1 or 0] +

                Enables backface culling (when the rotated part that normally faces the camera is facing away after being rotated). This means that the object is hidden when the backface is culled.

                +
              • + +
              • perspective_on [1 or 0] +

                Enables perspective when rotating even without a perspective point object. This uses a perspective set for the object itself or for the canvas as a whole as the global perspective with the edje_perspective_set() and edje_perspective_global_set() functions of the Edje Perspective API (in mobile and wearable applications).

                +
              • + +
              • color [point] [red] [green] [blue] [alpha] +

                Sets the color of a vertex in the map. The colors are linearly interpolated between vertex points through the map. 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. Currently only 4 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
                • +
                +
              • +
              • map.rotation block + +
                +rotation 
                +{
                +   center: "name";
                +   x: 45.0;
                +   y: 45.0;
                +   z: 45.0;
                +}
                +
                + +

                The rotation block rotates the part, optionally with the center on another part.

                + +
                  + +
                • center [another part's name] +

                  Sets the part that is used as the center of rotation when rotating the part with this description. The part's center point is used as the rotation center when applying rotation around the X, Y and Z axes. If no center is given, the part's original center itself is used for the rotation center.

                  +
                • + +
                • x [X degrees] +

                  Sets the rotation around the X axis of the part considering the center set. The value is given in degrees.

                  +
                • + +
                • y [Y degrees] +

                  Sets the rotation around the Y axis of the part considering the center set. The value is given in degrees.

                  +
                • + +
                • z [Z degrees] +

                  Sets the rotation around the Z axis of the part considering the center set. The value is given in degrees.

                  +
                • + +
                +
              • +
              • map.perspective block + +
                +perspective 
                +{
                +   zplane: 0;
                +   focal: 1000;
                +}
                +
                + +

                The perspective block adds focal and plane perspective to the part. Active if the perspective_on property is true. This must be provided, if the part is being used by another part as its perspective target.

                + +
                  + +
                • zplane [unscaled Z value] +

                  Sets the Z value that is not scaled. Normally this is 0 as that is the Z distance.

                  +
                • + +
                • focal [distance] +

                  Sets the distance from the focal Z plane (zplane) and the camera, for example, equating to focal length of the camera.

                  +
                • + +
                +
              • + +
              +
            • +
            +
          • +
          + +

          Program Block

          + +
          +program
          +{
          +   // Set the name of the program
          +   name: "programname";
          +   // Set the signals which trigger the program
          +   signal: "signalname";
          +   // Filter incoming signals depending on the sender name
          +   source: "partname";
          +   // Filter incoming signals depending on the part's state
          +   filter: "partname" "statename";
          +   // Delay the program by X seconds plus a random time between 0 and Y
          +   in: 0.3 0.0;
          +   // Set the action to perform
          +   action: STATE_SET "statename" state_value;
          +   // If the action is STATE_SET, define a transition from the current to the target state
          +   transition: LINEAR 0.5;
          +   // If the action is SIGNAL_EMIT, set the name of the part which receives the signal
          +   target: "partname";
          +   // Run another program after the current one is done
          +   after: "programname";
          +   after: "anotherprogram";
          +}
          +
          + +

          The program block defines how your interface reacts to events. Programs can change the part state or trigger other events.

          + +
            + +
          • name [program name] +

            Sets the symbolic name of the program as a unique identifier.

            +
          • + +
          • signal [signal name] +

            Sets the signals that cause the program to run. The signal received must match the specified source to run. There can be several signals, but only one signal keyword per program can be used. Also, there are some predefined signals for touch event handling. The predefined signals are:

            +
              +
            • hold,on: Holding on the mouse event matching the source that starts the program
            • +
            • hold,off: Holding off the mouse event matching the source that starts the program
            • +
            • focus,part,in: Focusing in the matching source that starts the program
            • +
            • focus,part,out: Focusing out of the matching source that starts the program
            • +
            • mouse,in: Moving the mouse into the matching source that starts the program
            • +
            • mouse,out: Moving the mouse out of the matching source that starts the program
            • +
            • mouse,move: Moving the mouse in the matching source that starts the program
            • +
            • mouse,down,*: Pressing the mouse button in the matching source that starts the program
            • +
            • mouse,up,*: Releasing the mouse button in the matching source that starts the program
            • +
            • mouse,clicked,*: Clicking any mouse button in the matching source that starts the program
            • +
            • mouse,wheel,0,*: Moving the mouse wheel in the matching source that starts the program. A positive number moves up and a negative number moves down.
            • +
            • drag,start: Starting a drag of the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • +
            • drag,stop: Stopping a drag of the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • +
            • drag: Dragging the mouse in the matching source that starts the program. This signal works only in the draggable part.
            • +
            +
          • + +
          • source [source name] +

            Sets the source of an accepted signal. There can be several signals, but only one source keyword per program can be used. For example, source: button-* means that signals from any part or program named button-* are accepted.

            +
          • + +
          • filter [part] [state] +

            Filters the signals to be only accepted if the part is in the [state] state. Only 1 filter per program can be used. If the [state] parameter is not given, the source of the event is used instead.

            +
          • + +
          • in [from] [range] +

            Waits [from] seconds before executing the program and add a random number of seconds (from 0 to [range]) to the total waiting time.

            +
          • + +
          • action [type] (param1) (param2) (param3) (param4) +

            Sets the action to be performed by the program. The valid actions (only 1 can be specified) are:

            +
              +
            • STATE_SET: Set the target part state as target state
            • +
            • ACTION_STOP: Stop the ongoing transition
            • +
            • SIGNAL_EMIT: Emit a signal to the application level. The application can register a callback for handling actions based on the EDC state.
            • +
            • DRAG_VAL_SET: Set a value for the draggable part (x, y values)
            • +
            • DRAG_VAL_STEP: Set a step for the draggable part (x, y values)
            • +
            • DRAG_VAL_PAGE: Set a page for the draggable part (x, y values)
            • +
            • FOCUS_SET: Set the focus to the target group
            • +
            • PLAY_SAMPLE "sample name" speed (channel): Play a music sample clip + +

              PLAY_SAMPLE's (optional) channel can be one of:

              +
                +
              • EFFECT/FX
              • +
              • BACKGROUND/BG
              • +
              • MUSIC/MUS
              • +
              • FOREGROUND/FG
              • +
              • INTERFACE/UI
              • +
              • INPUT
              • +
              • ALERT
              • +
              +
            • + +
            • PLAY_TONE "tone name" duration_in_seconds (Range 0.1 to 10.0): Play a predefined tone of a specific duration
            • +
            • PLAY_VIBRATION "sample name" repeat (repeat count)
            • +
          • + + +
          • transition [type] [length] (interp val 1) (interp val 2) (option) +

            Determines how transitions occur using the STATE_SET action. The [type] parameter is the style of the transition and the [length] parameter is a double specifying the number of seconds in which to perform the transition. The valid types are:

            +
              +
            • LIN or LINEAR
            • +
            • SIN or SINUSOIDAL
            • +
            • ACCEL or ACCELERATE
            • +
            • DECEL or DECELERATE
            • +
            • ACCEL_FAC or ACCELERATE_FACTOR
            • +
            • DECEL_FAC or DECELERATE_FACTOR
            • +
            • SIN_FAC or SINUSOIDAL_FACTOR
            • +
            • DIVIS or DIVISOR_INTERP
            • +
            • BOUNCE
            • +
            • SPRING
            • +
            +

            The types have the following requirements:

            +
              + +
            • ACCEL_FAC, DECEL_FAC, and SIN_FAC need the extra optional interp val 1 to determine the factor of curviness. 1.0 is the same as their non-factor counterparts and 0.0 is equal to linear. Numbers higher than 1.0 make the curve angles steeper with a more pronounced curve point.
            • + +
            • DIVIS, BOUNCE, and SPRING also require interp val 2 in addition to interp val 1.
            • + +
            • DIVIS uses [val 1] as the initial gradient start (for example, 0.0 is horizontal, 1.0 is diagonal (linear), and 2.0 is twice the gradient of linear). [val 2] is interpreted as an integer factor defining how much the value swings outside the gradient before going back to the final resting spot at the end. 0.0 for [val 2] is equivalent to a linear interpolation. Note that DIVIS can exceed 1.0.
            • + +
            • BOUNCE uses [val 2] as the number of bounces (so it is rounded down to the nearest integer value), with [val 1] determining how much the bounce decays; 0.0 gives a linear decay per bounce and higher values give much more decay.
            • + +
            • SPRING is similar to bounce; [val 2] specifies the number of spring swings and [val 1] specifies the decay, but it can exceed 1.0 on the outer swings.
            • + +
            • The valid options are: +
                +
              • CURRENT: Causes the object to move from its current position. Can be used as the last parameter of any transition type.
              • +
              +
            • +
            +
          • +
          • target [target] +

            Sets the program or part on which the specified action acts.

            +
          • + +
          • after [after] +

            Determines the program that is run after the current program completes. The source and signal parameters of a program run as an after are ignored. Multiple after statements can be specified per program.

            +
          • + +
          + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edc_positioning_n.htm b/org.tizen.ui.practices/html/native/efl/edc_positioning_n.htm new file mode 100644 index 0000000..6ef79ed --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edc_positioning_n.htm @@ -0,0 +1,487 @@ + + + + + + + + + + + + + Positioning Parts with the EDC File + + + + + +
          + +

          Positioning Parts with the EDC File

          + +

          The size of a part in pixels is set using the min and max properties. The following code example sets the minimum and maximum size of the rectangle part to 200 x 200 px:

          + +
          +part 
          +{ 
          +   name: "rectangle";
          +   type: RECT;
          +   description 
          +   { 
          +      state: "blue" 0.0;
          +      align: 0.0 0.0;
          +      // Set the size to 200x200
          +      min: 200 200;
          +      max: 200 200;
          +      // Blue color
          +      color: 0 0 255 255;
          +   }
          +}
          +
          + +

          The position of the parts is defined in the rel1 and rel2 blocks, which define the upper-left corner and the lower-right corner of the part. The position can be defined in relation to other parts (with the relative property) as an offset (offset property). When using relative positioning, the to, to_x and to_y properties are used to define in relation to which part the positioning is done. If nothing else is specified, the positioning is in relation to the parent's part.

          + +

          To demonstrate relative positioning, the following example creates another rectangle part and positions it under the first part. The upper-left corner of the new part starts at the lower-left corner of the previous one.

          + +
          +part 
          +{ 
          +   name: "rectangle2";
          +   type: RECT;
          +   description 
          +   { 
          +      state: "green" 0.0;
          +      align: 0.0 0.0;
          +      // Set the size to 200 x 200
          +      min: 200 200;
          +      max: 200 200;
          +      // Green color
          +      color: 0 255 0 255;
          +      // Set the position
          +      // rel1 is relative to "rectangle"
          +      rel1 
          +      {
          +         relative: 0.0 1.0;
          +         to: "rectangle";
          +      }
          +      // rel2 is relative to the parent
          +      rel2 
          +      {
          +         relative: 1.0 1.0;
          +      }
          +   }
          +}
          +
          + + + + + + + + + + +
          Note
          The align property defines how the parts align themselves in the main window if their size is smaller than the main window. If nothing is specified, the parts are aligned in the center of the window.
          + +

          Adding an Offset to Relative Positioning

          + +

          The rel1 and rel2 blocks also support offset. The offset is a complement to the relative positioning: the corners are first placed according to their relative parameters, and then adjusted using the offsets.

          + +

          The following figure shows the pixel positions for a 4 x 4 rectangle. The indexes start in the top-left corner at (0, 0), and increase to the right and to the bottom. Since the indexes have started at 0, the 4th pixel has an index of 3. To create a 2 x 2 blue rectangle centered inside the green rectangle, the top-left corner must be (1, 1) and the bottom-right one (2, 2).

          + +

          Figure: Offset indexes

          +

          Offset indexes

          + +

          To determine the relative position of the blue rectangle, Edje needs the following definitions:

          +
            +
          • Part coordinates, depending on the size and position of the green rectangle
          • +
          • Relative component of the positions must be the same: the top-left corner of the green rectangle
          • +
          • Top-left pixel (1, 1) and bottom-right pixel (2, 2)
          • +
          + +

          The following code example shows the definitions:

          + +
          +name: "blue rectangle";
          +
          +rel1.to: "green rectangle";
          +rel1.relative: 0 0;
          +rel1.offset: 1 1;
          +
          +rel2.to: "green rectangle";
          +rel2.relative: 0 0;
          +rel2.offset: 2 2;
          +
          + +

          For most tasks, relative positioning is simpler than using offsets. Offsets are usually left for fine-tuning and creating borders.

          + +

          The following example is similar to the previous one but it uses relative positioning instead of offsets to achieve the same result for the 4 x 4 rectangle (though it can scale to larger sizes as well). The blue rectangle starts at 25% of the green rectangle (both vertically and horizontally) and ends at 75% of it (both vertically and horizontally). Like in the previous example, the blue rectangle is named and Edje is told what the object of reference is:

          + +
          +name: "blue rectangle";
          +rel1.to: "green rectangle";
          +rel2.to: "green rectangle";
          +
          + +

          The following figure shows how to refer to pixels using relative positioning when the offsets are (0, 0).

          + +

          Figure: Relative positioning

          +

          Relative positioning

          + +

          Note that in addressing the pixels, (0, 0) is addressed through relative: 0 0; offset 0 0; and each additional 0.25 in the relative field gives a 1-pixel move. With this, the pixel addressed through relative: 0.75 0.75; offset: 0 0; is at (3, 3) and not (2, 2).

          + +

          This addressing method comes from a design choice in Evas and Edje, favoring simplicity. In the examples shown in this guide, there are 4 pixels, and therefore when the [0; 1) range is divided in 4, the result is [0; 0.25), [0.25; 0.50), [0.50; 0.75), [0.75; 0.100). With Edje, the value used to refer to each segment is the left bound and therefore, 0.75 refers to [0.75; 0.100) (the bottom-right pixel of the green rectangle and not the 3/4th one).

          + +

          To refer to the previous pixel is to set the rel2 bound to relative: 0.75 0.75;, as expressed naturally, and offset: -1 -1;. This can also be understood as extending the rectangle up to 75% of its parent with the upper bound excluded (as shown in the [0.50; 0.75)).

          + +

          Since -1 -1 is the most common offset wanted for rel2, it is the default value as the default behavior is the most practical.

          + +

          Calculating the Edje Object Total Size

          + +

          When the EDC file is composed of several parts, Edje calculates the size of the global Edje object, by taking all the parts and their properties into account. The following properties have a role in this calculation and affect the global size:

          + +
            +
          • min and max: define the minimum and the maximum size of a part.
          • +
          • rel1 and rel2: specify the relative position of a part.
          • +
          • align: relates to the alignment of the part in the parent object.
          • +
          • fixed: defines if the part has a fixed size.
          • +
          + + + + + + + + + + +
          Note
          The fixed property can only be used on the TEXTBLOCK type parts. Setting this property to fixed: 1 1 does not take into account the part for the calculation of the global size.
          + +

          Using Edje Size Hints

          + +

          Any Evas_Object can have hints for the object to know how to properly position and resize. Edje uses these hints when swallowing an Evas_Object to a position and resizing it in the SWALLOW part of the EDC file.

          + +

          The size hints are not a size enforcement, they only tell the parent object the desired size for the child object. The parent tries to get as close as possible to the hint.

          + +

          Hints are set in an Evas_Object using the following evas_object_size_hint_*() functions:

          + +
            +
          • Minimum size hint + +

            Set the hint for the object's minimum size, given in pixels. In the following example, the horizontal and vertical minimum size hint of an Evas_Object is set to 0 pixels:

            + +
            +Evas_Object *object;
            +evas_object_size_hint_min_set(object, 0, 0);
            +
            +
          • + +
          • Maximum size hint + +

            Set the hint for the object's maximum size, given in pixels. In the following example, the horizontal and vertical maximum size hint of an Evas_Object is set to 200 pixels:

            +
            evas_object_size_hint_max_set(object, 200, 200);
            +
          • + +
          • Aspect size hint + +

            Set the hint for the object's aspect ratio. The available aspect size hints are:

            + +
              +
            • EVAS_ASPECT_CONTROL_NONE
            • +
            • EVAS_ASPECT_CONTROL_HORIZONTAL
            • +
            • EVAS_ASPECT_CONTROL_VERTICAL
            • +
            • EVAS_ASPECT_CONTROL_BOTH
            • +
            + +

            The other parameters are the aspect width and height ratio. These integers are used to calculate the proportions of the object. If the aspect ratio terms are null, the object's container ignores the aspect and scale of the object and occupies the whole available area.

            + +

            Figure: Aspect control

            +

            Aspect control

            + +

            Aspect control

            + +

            Aspect control

            + +

            The following example sets the aspect size hint to EVAS_ASPECT_CONTROL_BOTH with a width of 100 and a height of 200. So the aspect ratio must be 1/2.

            + +
            +evas_object_size_hint_aspect_set(object, EVAS_ASPECT_CONTROL_BOTH, 100, 200);
            +
            +
          • + +
          • Align size hint +

            Set the hint for the object's alignment. This hint is used when the object is smaller than its parent. The special EVAS_HINT_FILL parameter uses the maximum size hints with a higher priority, if they are set. Also, any padding hints set on objects are added up to the alignment space on the final scene composition.

            + +

            Figure: Alignment

            +

            Alignment

            + +

            In the following example, the special EVAS_HINT_FILL parameter is used:

            + +
            +evas_object_size_hint_align_set(object, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +
            +
          • + +
          • Weight size hint +

            Set the hint for the object's weight. The weight tells to a container object how the given child is resized. If the EVAS_HINT_EXPAND parameter is used, the child object's dimensions are expanded to fit the container's own.

            + +

            When several child objects have different weights in a container object, the container distributes the space it has to layout them by those factors. Most weighted children get larger in this process than the lighter ones.

            + +

            In the following example, the container is asked to expand the object in both directions:

            + +
            +evas_object_size_hint_weight_set(object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +
            +
          • + +
          • Padding size hint + +

            Set the hint for the object's padding space. Padding is extra space an object takes on each of its delimiting rectangle sides. The padding space is rendered transparent. Four hints can be defined for the left, right, top, and bottom padding.

            + +

            Figure: Padding

            +

            Padding

            + +

            In the following example, the padding hints are set to 5 pixels on each side of the object:

            + +
            +evas_object_size_hint_padding_set(object, 5, 5, 5, 5);
            +
            +
          • +
          + + +

          Creating an Edje Swallow

          + +

          The parent of all layout components is Edje. Edje, as detailed in the EDJE Data Collection Reference, is a library which converts EDC files into Evas objects. One of its main features is the possibility to create SWALLOW objects. When a SWALLOW object is added in Evas, it can contain any other Evas_Object.

          + +

          To create a swallow part:

          +
            +
          1. Create the EDC file. +

            The file describes a group named container, which contains a SWALLOW type part named part.swallow. The part is centered inside the parent (it is the default behavior) but there are 32 pixels free all around this part.

            +
            +collections
            +{
            +   group 
            +   { 
            +      name: "container";
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "part.swallow"
            +            type: SWALLOW;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1.offset: 31 31;
            +               rel2.offset: -32 -32;
            +            }
            +         }
            +      }
            +   }
            +}
            +
            + +

            Use the edje_cc tool to compile the EDC file into a binary .edj file:

            + +
            +edje_cc -o container.edj container.edc
            +
            +
          2. +
          3. Create an Edje object and load the file: + +
            +edje = edje_object_add(evas_object_evas_get(parent));
            +edje_object_file_set(edje, "container.edj", "container");
            +
            + + + + + + + + + + +
            Note
            The edje_object_add() function, as opposed to an elementary object, does not take an Evas_Object as a parent. You must give the function the Evas on which the object is added. As the parent is already added on the Evas by elementary, retrieve a reference to it by using the evas_object_evas_get() function.
            + + +

            Use the edje_object_file_set() function to set the Edje file from which the object is loaded. The object itself is the name of the group as defined in the EDC file. In this case it is container. +

            +
          4. +
          5. Use the edje_object_part_swallow() function to swallow any kind of Evas_Object inside it: + +
            +ic = elm_icon_add(parent);
            +elm_image_file_set(ic, "c1.png", NULL);
            +edje_object_part_swallow(edje, "part.swallow", ic);
            +
            + + + + + + + + + + +
            Note
            The elm_image_file_set() function parameters are linked to Edje. The second parameter in this example is a PNG file, but it can also be an Edje file. In that case, the third parameter must be the Edje group to load, exactly as previously shown with the edje_object_file_set() function.
            +
          6. +
          + +

          Using ELM Layouts

          + +

          A layout is a container component. For the basic use of the elm_layout component with a default style, see the Layout guide. The ELM layout takes a standard Edje design file and wraps it in a UI component. Layouts are the basis of graphical UI components used in Elementary.

          + +

          To create a layout:

          +
            +
          1. Create a new elementary layout using the elm_layout_add() function: + +
            +Evas_Object *layout;
            +layout = elm_layout_add(parent);
            +
            +
          2. + +
          3. For Edje swallows, load an Edje file: +
            1. Create an Edje file that contains a black rectangle and an icon in the center: + +
              +images
              +{
              +   image: "c1.png" COMP;
              +}
              +
              +collections
              +{
              +   group 
              +   { 
              +      name: "my_layout";
              +      parts 
              +      {
              +         part 
              +         {
              +            name: "background";
              +            type: RECT; description 
              +            { 
              +               state: "default" 0.0; color: 0 0 0 255; 
              +            } 
              +         } 
              +         part 
              +         { 
              +            name: "background"; 
              +            type: IMAGE; 
              +            description 
              +            { 
              +               state: "default" 0.0; 
              +               rel1.offset: 31 31; 
              +               rel2.offset: -32 -32; 
              +               default.image: "c1.png"; 
              +            } 
              +         }
              +      } 
              +   } 
              +}
              +
              +
            2. +
            3. Compile the file with the edje_cc -o edje_example.edj edje_example.edc command. +
            4. + +
            5. Load the file with the elm_layout_file_set() function: + +
              +elm_layout_file_set(layout, "edje_example.edj", "my_layout");
              +
              + +

              The layout component can contain as many parts and children as described in its theme file (EDC). Some of these children can have special types:

              + +
                +
              • SWALLOW (content holder): +

                Only one object can be added to a SWALLOW. The elm_layout_content_*() functions are used to manage the objects in a SWALLOW part. After being set to this part, the object's size, position, visibility, clipping, and other description properties are controlled by the description of the given part inside the Edje theme file.

              • +
              • BOX: +

                The BOX layout can be used through the elm_layout_box_*() functions. It is very similar to the elm_box component, but the BOX layout's behavior is completely controlled by the Edje theme.

              • +
              • TABLE: +

                The TABLE layout is like the BOX layout, but it is used through the elm_layout_table_*() functions.

              • +
              +
            6. +
          + +

          ELM can send Edje signals to the EDC part using the elm_layout_signal_emit() function. You can also use the elm_layout_signal_callback_add() function to receive signals.

          + +

          Use the following code to listen to any signals sent by the layout:

          + +
          +elm_layout_signal_callback_add(layout, "*", "*", _signal_cb, NULL);
          +
          +static void 
          +_signal_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
          +{
          +   printf("Info received from layout : %s %s\n", emission, source);
          +}
          +
          + +

          For more information on signals, see Managing Multiple Signal Emitters in Layouts.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_animation_n.htm b/org.tizen.ui.practices/html/native/efl/edje_animation_n.htm new file mode 100644 index 0000000..28c4beb --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_animation_n.htm @@ -0,0 +1,535 @@ + + + + + + + + + + + + + Edje Animations + + + + + +
          + +

          Edje Animations

          + +

          One of the greatest strengths of EFL and Edje is the ability to create animations. This tutorial demonstrates how Elm_Transit can create predefined animations, but you can also use the Edje library to create your own animations.

          + +

          The Edje animations are based on a very simple principle: going from one state to another. If you want to animate something with Edje, you must define two states and move from the first state to the second.

          + +

          Animating a Rectangle

          + +

          This example shows how to animate a rectangle. It is positioned in the top left corner of the window and is moved to the bottom right corner in five seconds. To do that with Edje, define a part called "rectangle" with the type RECT: this part has two descriptions (or states). In the first state, the rectangle is in is the top left corner. In the second state, it is in is the bottom right corner. To create the transition, set this EDC code for Edje to switch the object from its current state to another.

          + +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "rectangle";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               align: 0.0 0.0;
          +               rel1 {relative: 0.0 0.0;}
          +               rel2 {relative: 0.3 0.1;}
          +               color: 0 0 255 255;
          +            }
          +            description 
          +            { 
          +               state: "default" 0.5;
          +               align: 0.0 0.0;
          +               rel1 {relative: 0.7 0.9;}
          +               rel2 {relative: 1.0 1.0;}
          +               color: 0 0 255 255;
          +            }
          +         }
          +      }
          +      programs 
          +      {
          +         program 
          +         { 
          +            name: "animation,state1";
          +            source: "";
          +            signal: "load";
          +            action: STATE_SET "default" 0.5;
          +            target: "rectangle";
          +            transition: LINEAR 5;
          +         }
          +      }
          +   }
          +}
          +
          + +

          The "rectangle" part has two descriptions that share the same name, but have a different "version".

          + +
          +part 
          +{ 
          +   name: "rectangle";
          +   type: RECT;
          +   description 
          +   { 
          +      state: "default" 0.0;
          +   }
          +   description 
          +   { 
          +      state: "default" 0.5;
          +   }
          +}
          +
          + +

          The program defines when and how to move from one state to another. A program is called upon reception of a signal from a source. Here the program is called when the signal load is received from any source.

          + +
          +program 
          +{ 
          +   name: "animation,state1";
          +   source: "";
          +   signal: "load";
          +}
          +
          + +

          An action is performed upon the signal reception. In this example, the state is changed.

          + +
          +action: STATE_SET "default" 0.5;
          +
          + +

          The program has a target, here the "rectangle".

          + +
          +target: "rectangle";
          +
          + +

          The program uses a transition to perform the action.

          + +
          +transition: LINEAR 5;
          +
          + +

          This example produces a blue rectangle that moves from the upper left to the lower right corner with a linear transition in five seconds.

          + +

          Actions

          + +

          The Edje programs are not only for animations. There are different actions, for example STATE_SET and ACTION_STOP. You may also send signals with SIGNAL_EMIT.

          + +

          The STATE_SET action changes the state of the "target".

          + +

          In the following example, the state of the part named "image" changes to "default" "0.0".

          + +
          +program 
          +{
          +   name: "animate";
          +   signal: "animate";
          +   action: STATE_SET "default" 0.0;
          +   transition: LINEAR 3.0;
          +   target: "image";
          +}
          +
          + +

          The ACTION_STOP stops the program specified by "target".

          + +
          +program 
          +{
          +   name: "animate_stop";
          +   signal: "animate_stop";
          +   action: ACTION_STOP;
          +   target: "animate_loop";
          +}
          +
          + +

          The previous example stops the program defined as "target" named animate_loop. This program runs on the animate_stop signal.

          + +

          The SIGNAL_EMIT emits a signal that is used to communicate with the application directly from the theme.

          + +

          The following example emits a signal frame_move "start" when it receives the signal mouse,down,* from the video_over part. In other words, it sends the signal frame_move "start" when the mouse is pressed in the video_over part.

          + +
          +program 
          +{ 
          +   name: "video_move_start";
          +   signal: "mouse,down,*";
          +   source: "video_mover";
          +   action: SIGNAL_EMIT "frame_move" "start";
          +}
          +
          + +

          Transitions

          + +

          The transitions available are:

          +
            +
          • LIN or LINEAR: makes a linear transition and takes the duration in seconds as the parameter
          • +
          • SIN or SINUSOIDAL: makes a sinusoidal transition and takes the duration in seconds as the parameter
          • +
          • ACCEL or ACCELERATE: makes an accelerated transition and takes the duration in seconds as the parameter
          • +
          • DECEL or DECELERATE: makes a decelerated transition and takes the duration in seconds as the parameter
          • +
          • ACCEL_FAC or ACCELERATE_FACTOR: makes an accelerated transition and takes the duration and the factor as the parameters
          • +
          • DECEL_FAC or DECELERATE_FACTOR: makes a decelerated transition and takes the duration and the factor as the parameters
          • +
          • SIN_FAC or SINUSOIDAL_FACTOR: makes a sinusoidal transition and takes the duration and the factor as the parameters
          • +
          • DIVIS or DIVISOR_INTERP: takes 3 parameters: +
              +
            • the duration
            • +
            • the initial gradient start (0.0 is horizontal, 1.0 is diagonal (linear), 2.0 is twice the gradient of linear, and so on)
            • +
            • an integer factor that defines how much the value swings outside the gradient to come back to the final resting spot at the end. 0.0 for the third parameter is equivalent to linear interpolation. Note that DIVIS may exceed 1.0.
            • +
            +
          • +
          • BOUNCE: makes a bounce transition and takes 3 parameters: +
              +
            • the duration
            • +
            • how much the bounce decays, with 0.0 giving linear decay per bounce, and higher values giving more decay
            • +
            • the number of bounces (rounded down to the nearest integer value)
            • +
            +
          • +
          • SPRING: makes a spring transition and takes 3 parameters: +
              +
            • the duration
            • +
            • the decay, with the level exceeding 1.0 on the outer swings
            • +
            • the number of spring swings
            • +
            +
          • +
          + +

          There are graphical representations of these effects in the Ecore_Evas section above.

          + +

          Chaining Edje Programs

          + +

          To define a couple of Edje programs and chain them, we can, for example, create a program to make the rectangle return to its initial state with another transition (such as BOUNCE).

          + +

          Use the statement after in the first program. after takes the name of the transition to run when the program is done.

          + +
          +after: "animation,state0";
          +
          + +

          This is how to add the bounce animation. To return the blue rectangle to its initial position with a BOUNCE transition: it bounces with a factor of 1.8, six times. This program is only to be used at the end of the first one, so it does not have any signal statement.

          + +
          +program 
          +{ 
          +   name: "animation,state0";
          +   source: "";
          +   signal: "";
          +   action: STATE_SET "default" 0.0;
          +   target: "rectangle";
          +   transition: BOUNCE 5 1.8 6;
          +}
          +
          + +

          Playing on Signals

          + +

          The programs start when they receive a signal from a source. Edje handles many kind of signals, including mouse events.

          + + + + + + + + + + +
          Note
          To show the signals, use edje_player -p myfile.edj.
          + +

          For example, in another transition the rectangle is left clicked. The corresponding signal name is mouse,clicked,1.

          + +

          For this transition, define a new state. This state changes the color and the position of the rectangle.

          + +
          +// To be placed in the "part" definition
          +description 
          +{ 
          +   state: "color" 0.0;
          +   rel1 {relative: 0.3 0.3;}
          +   rel2 {relative: 0.7 0.4;}
          +   color: 255 0 0 255;
          +}
          +
          + +

          The program is as follows:

          + +
          +program 
          +{ 
          +   name: "animation,color";
          +   source: "rectangle";
          +   signal: "mouse,clicked,1";
          +   action: STATE_SET "color" 0.0;
          +   target: "rectangle";
          +   transition: SIN 2;
          +}
          +
          + +

          This starts when the rectangle is left clicked.

          + +

          If you want to send a signal from your application when you use signals to start transitions, create a program waiting for your own special signal. For example:

          + +
          +program 
          +{ 
          +   name: "animation,menu_side,hide";
          +   source: "MenuButton";
          +   signal: "hide,sidemenu";
          +   action: STATE_SET "default" 1.0;
          +   target: "menu/side";
          +   transition: LINEAR 0.2;
          +}
          +
          + +

          This program changes the state of the target named animation,menu_side,hide to "default" 1.0. It waits for the hide,sidemenu signal emitted by a source called MenuButton.

          + +
          +edje_object_signal_emit(layout, "hide,sidemenu", "MenuButton");
          +
          + +

          This statement sends a signal named hide,sidemenu with a source named MenuButton to the object called layout.

          + +

          The edje_object_signal_emit function emits a signal on an Evas_Object part of the application.

          + +
          +edje_object_signal_emit(Evas_Object *obj,
          +                        const char *emission,
          +                        const char *source)
          +
          + +
            +
          • The first parameter is the Evas_Object, which emits the signal (layout in the example).
          • +
          • The second parameter is the emission string (the name of the signal hide,sidemenu in the example).
          • +
          • The third parameter is the source of the signal (the name of the source, MenuButton in the example).
          • +
          + +

          If you use the Elementary in the application, you can use elm_object_signal_emit. It functions exactly the same way as edje_object_signal_emit and takes the same parameters.

          + + + + + + + + + + +
          Note
          To find a complete example, use elm_object_signal_emit in Creating Mobile Menus.
          + +

          Rotating with Edje

          + +

          The Edje library allows you to rotate objects, using the map statement. For example, if you want to rotate the blue rectangle on a right click, you must define a new rotate state. To enable the map on you object you must add a map part to your default state.

          + +
          +map 
          +{
          +   on: 1;
          +   smooth: 1;
          +   perspective_on: 1;
          +   rotation.x: 0;
          +   rotation.y: 0;
          +   rotation.z: 0;
          +}
          +
          + +
            +
          • on: 1; enables the map on the object
          • +
          • perspective_on: 1, enables the perspective when rotating, even without a perspective point object
          • +
          • smooth: 1; enables a smooth map rendering
          • +
          • The rotation statements define the default rotation of the object on x, y, and z axes.
          • +
          + +

          To add a new rotate state with a rotation around any axis, do the following.

          + +
          +description 
          +{ 
          +   state: "rotate" 0.0;
          +   inherit: "default" 0.0;
          +   map.rotation.z: 120;
          +}
          +
          + +

          This rotate state inherits all the default state properties, but changes the value of map.rotation.z from 0° to 120°.

          + +

          To set a program to run the rotate state, do the following.

          + +
          +program 
          +{ 
          +   name: "animation,rotate";
          +   source: "rectangle";
          +   signal: "mouse,clicked,3";
          +   action: STATE_SET "rotate" 0.0;
          +   target: "rectangle";
          +   transition: LIN 5;
          +}
          +
          + +

          This program runs on a right click on the rectangle object.

          + +

          The complete code of this example is as follows.

          + +
          +collections 
          +{
          +   group 
          +   { 
          +      name: "main";
          +      parts 
          +      {
          +         part 
          +         { 
          +            name: "rectangle";
          +            type: RECT;
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               align: 0.0 0.0;
          +               rel1 {relative: 0.0 0.0;}
          +               rel2 {relative: 0.3 0.1;}
          +               map 
          +               {
          +                  on: 1;
          +                  smooth: 1;
          +                  perspective_on: 1;
          +                  rotation 
          +                  {
          +                     z: 0;
          +                     x: 0;
          +                     y: 0;
          +                  }
          +               }
          +               color: 0 0 255 255;
          +            }
          +            description 
          +            { 
          +               state: "default" 0.5;
          +               align: 0.0 0.0;
          +               rel1 {relative: 0.7 0.9;}
          +               rel2 {relative: 1.0 1.0;}
          +               color: 0 0 255 255;
          +            }
          +            description 
          +            { 
          +               state: "color" 0.0;
          +               rel1 {relative: 0.3 0.3;}
          +               rel2 {relative: 0.7 0.4;}
          +               color: 255 0 0 255;
          +            }
          +            description 
          +            { 
          +               state: "rotate" 0.0;
          +               inherit: "default" 0.0;
          +               map.rotation.z: 120;
          +            }
          +         }
          +      }
          +      programs 
          +      {
          +         program 
          +         { 
          +            name: "animation,state1";
          +            source: "";
          +            signal: "load";
          +            action: STATE_SET "default" 0.5;
          +            target: "rectangle";
          +            transition: LINEAR 1;
          +            after: "animation,state0";
          +         }
          +         program 
          +         { 
          +            name: "animation,state0";
          +            source: "";
          +            signal: "";
          +            action: STATE_SET "default" 0.0;
          +            target: "rectangle";
          +            transition: BOUNCE 2 1.8 26;
          +         }
          +         program 
          +         { 
          +            name: "animation,color";
          +            source: "rectangle";
          +            signal: "mouse,clicked,1";
          +            action: STATE_SET "color" 0.0;
          +            target: "rectangle";
          +            transition: SIN 2;
          +         }
          +         program 
          +         { 
          +            name: "animation,rotate";
          +            source: "rectangle";
          +            signal: "mouse,clicked,3";
          +            action: STATE_SET "rotate" 0.0;
          +            target: "rectangle";
          +            transition: LIN 5;
          +         }
          +      }
          +   }
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_animation_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/edje_animation_tutorial_n.htm new file mode 100644 index 0000000..76b99cc --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_animation_tutorial_n.htm @@ -0,0 +1,459 @@ + + + + + + + + + + + + + + Creating Edje Animations + + + + + + +
          +

          Creating Edje Animations

          + + +

          One of the greatest strengths of EFL and Edje is the ability to create animations. This tutorial demonstrates how Elm_Transit can create predefined animations, but you can also use the Edje library to create your own animations.

          + +

          Animating on Application Start-up

          + + +

          The goal of this tutorial is to create, in an EDC (Edje Data Collection) file, an animation target and buttons to start animations.

          +

          To create an animation on the application start-up:

          +
            +
          1. +

            Create an application using the Basic EDC UI Application template.

            +

            By default, the Basic EDC UI Application model produces an empty window with a title. In this example, a Tizen logo is added to the window and the behavior of the window title is changed.

            +

            The images used by the Edje file are stored in the edje/images directory of the application. Copy the Tizen logo available in shared/res/<yourapplicationname>.png into the edje/images Edje image directory, and add the image to the Edje images block:

            +
            +images 
            +{
            +   image: "edceffects.png" COMP;
            +   image: "tizen-logo.png" COMP;
            +}
            +
            +
          2. +
          3. +

            Add an Edje part block using the small logo.

            + +

            The logo part has the IMAGE type and 2 states. The state describes the appearance of a part, such as its size, position, and color.

            +

            The default state definition is in the first description block of the part:

            +
              +
            • Maximum and minimum sizes in the min and max properties
            • +
            • Image to use in this part
            • +
            • Default position
            • +
            +

            The second state, down-state, inherits all of the default state properties, and only changes the position to put the image at the bottom of the application window.

            +

            These 2 states are the start and end states of the animation.

            +
            +// Image using the Tizen logo
            +part 
            +{ 
            +   name: "logo";
            +   type: IMAGE;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      max: 63 63;
            +      min: 63 63;
            +      image { normal: "small-logo.png"; }
            +      rel1.relative: 0.1 0.0;
            +      rel2.relative: 0.0 0.0;
            +   }
            +
            +   description 
            +   { 
            +      state: "down-state" 1.0;
            +      inherit: "default" 0.0;
            +      rel1.relative: 0.1 0.92;
            +      rel2.relative: 0.05 1.0;
            +   }
            +}
            +
            +
          4. +
          5. +

            Add a program block to the Edje programs block to create the animation.

            +

            This program is named animation,state1 and is started when the application receives the load signal immediately on startup. It runs the STATE_SET action and changes the object state from default to down-state. The target of the program is the logo part.

            +

            To switch from one state to another, the program uses a transition property of the BOUNCE type with 3 parameters, the bounce_decay, the number_of_bounces, and the duration which is set to 5 seconds. This produces a falling and bouncing effect.

            +
            +// Icon drop animation
            +program 
            +{ 
            +   name: "animation,state1";
            +   source: "";
            +   signal: "load";
            +   action: STATE_SET "down-state" 1.0;
            +   target: "logo";
            +   transition: BOUNCE 2.5 0.0 5.0;
            +}
            +
            +
          6. +
          7. +

            Add an animation for the window title to make it move from left to right with a bounce effect while growing the font size.

            +

            Create a new part block called "txt_title", with 2 states that change the font size and position of the window title.

            +
            +part 
            +{ 
            +   name: "txt_title";
            +   type: TEXT;
            +   mouse_events: 0;
            +
            +   // default state
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      align: 0.0 0.0;
            +      rel1 { relative: 0.0 0.0; }
            +      rel2 { relative: 0.0 0.0; }
            +      text 
            +      { 
            +         font: "Tizen:style=regular";
            +         size: 24;
            +         min: 1 1;
            +      }
            +      color: 0 0 0 255;
            +   }
            +
            +   // Bigger state
            +   description 
            +   { 
            +      state: "Bigger" 0.0;
            +      align: 0.0 0.0;
            +      rel1 { relative: 0.75 0.0; }
            +      rel2 { relative: 0.0 0.0; }
            +      text 
            +      { 
            +         font: "Tizen:style=regular";
            +         size: 28;
            +         min: 1 1;
            +      }
            +      color: 0 0 0 255;
            +   }
            +}
            +
            +
          8. +
          9. +

            Create a program block to animate the "txt_title" part on start-up, just like the small Tizen logo.

            +
            +// Make the title bigger
            +program 
            +{ 
            +   name: "animation,bigtitle";
            +   source: "";
            +   signal: "load";
            +   action: STATE_SET "Bigger" 1.0;
            +   target: "txt_title";
            +   transition: LINEAR 5.0;
            +}
            +
            +

            This program goes from the start to the end state in 5 seconds with a LINEAR effect. It automatically runs on the application start-up.

            +
          10. +
          + + +

          Animating Objects on Click

          + +

          The animations in the previous use case are automatic and require no user interaction. This use case takes advantage of user actions, by animating a part when another part is clicked, and by making the title restore its default aspect when the small logo is clicked.

          + +

          To animate an object based on a click:

          +
            +
          1. To animate the title: +

            Use the parts and states already defined in step 2 of the previous use case. After the start-up animation, the application goes back to the default state, and there is no need to add any parts or states. You only need to add a program block that makes the transition when the user clicks the logo part.

            + +

            The program starts when the application receives the mouse,clicked,* signal (any mouse button is clicked) from the logo part (source). It performs the STATE_SET action and sets the default state on the target (txt_file part) with a LINEAR transition.

            +
            +// Make the title go back to normal
            +program 
            +{
            +   name: "animation,normaltitle";
            +   source: "logo";
            +   signal: "mouse,clicked,*";
            +   action: STATE_SET "default" 1.0;
            +   target: "txt_title";
            +   transition: LINEAR 0.5;
            +}
            +
            +

            When clicking any mouse button on the small logo, the title goes back to its original state.

            +
          2. +
          3. +

            Create the rotate part.

            +

            It is possible to create a button with Edje from scratch, but to save time, the SWALLOW part is used in this example to store the Elementary UI components.

            +

            This part is called btn/rotate, and it only has a SWALLOW type and a default state with its position being on the bottom left of the screen.

            +
            +// Container for the rotate button
            +part 
            +{
            +   type: SWALLOW;
            +   name: "btn/rotate";
            +   description 
            +   {
            +      state: "default" 0.0;
            +      rel1.relative: 0.10 0.80;
            +      rel2.relative: 0.30 0.90;
            +   }
            +}
            +
            +
          4. +
          5. +

            Create the grow part.

            +

            This second SWALLOW part is very similar to the first one. It is placed relatively to btn/rotate part and it is to remain next to it.

            +
            +// Container for the grow button
            +part 
            +{
            +   type: SWALLOW;
            +   name: "btn/grow";
            +   description 
            +   {
            +      state: "default" 0.0;
            +      rel1.relative: 1.02 0;
            +      rel1.to: "btn/rotate";
            +      rel2.relative: 2.02 1;
            +      rel2.to: "btn/rotate";
            +   }
            +}
            +
            +
          6. +
          7. +

            Create the actual UI components in the .c file. The code is added to the create_base_ui() function.

            +

            In the default Basic EDC UI Application, the Edje layout is loaded by default. Create 2 Elementary buttons and add them to the SWALLOW containers, without having to set up sizes or positions as this is done in the SWALLOW container.

            +

            Note that the part name is very important, because it is used to merge the Elementary UI component and the SWALLOW part.

            +
            +// Create a button in the app window
            +ad->button = elm_button_add(ad->win);
            +elm_object_text_set(ad->button, "Rotate");
            +// Add the button to the edje layout container called "btn/rotate"
            +elm_object_part_content_set(ad->layout, "btn/rotate", ad->button);
            +evas_object_show(ad->button);
            +
            +// Create up button in the app window
            +ad->btn_up = elm_button_add(ad->win);
            +// Add the button to the edje layout container called "btn/grow"
            +elm_object_text_set(ad->btn_up, "Grow");
            +elm_object_part_content_set(ad->layout, "btn/grow", ad->btn_up);
            +evas_object_show(ad->btn_up);
            +
            +
          8. +
          9. +

            Create the animation target in the EDC file.

            +

            The following example shows the part initialization and the default state.

            +
            +// Animation target
            +part 
            +{
            +   name: "atarget";
            +   type: IMAGE;
            +
            +   // Default state
            +   description 
            +   {
            +      state: "default" 0.0;
            +      image { normal: "tizen-logo.png"; }
            +      color: 255 0 0 255; // Red
            +      rel1 { relative: 0.3 0.3; }
            +      rel2 { relative: 0.7 0.4; }
            +   }
            +}
            +
            +

            This part is an image displaying a big Tizen logo, placed on the top of the screen more or less centered.

            +
          10. +
          11. +

            Create a state to change the color and add the map block.

            +

            This part changes the color to green and defines the map. This statement makes rotations possible on an Edje part. Rotations are done around the X, Y, or Z axes. In this example, the map is enabled and a 0° rotation is applied around each axis.

            +
            +// rotate state
            +description 
            +{
            +   state: "rotate" 0.0;
            +   inherit: "default" 0.0;
            +
            +   map 
            +   {
            +      // Enable map on the part
            +      on: 1;
            +      // Enable smooth rendering
            +      smooth: 1;
            +      // Enable perspective
            +      perspective_on: 1;
            +
            +      // Apply rotations on the part
            +      rotation.x: 0;
            +      rotation.y: 0;
            +      rotation.z: 0;
            +   }
            +   color: 0 255 0 255; // Green
            +}
            +
            +
          12. +
          13. +

            Add a state with a rotation around the Z axis of 360°.

            +

            This state inherits from the default state properties and adds a rotation around the Z axis.

            +
            +description 
            +{
            +   state: "rotate" 1.0;
            +   inherit: "rotate" 0.0;
            +   map.rotation.z: 360;
            +}
            +
            +
          14. +
          15. +

            Add a state to the other button for the grow animation. Change the size of the animation target and add an offset.

            +
            +// grow state
            +description 
            +{
            +   state: "grow" 0.0;
            +   color: 0 0 255 255; // Blue
            +   rel1 
            +   {
            +      relative: 0.2 0.2;
            +      offset: 0.3 0.3;
            +   }
            +   rel2 
            +   {
            +      relative: 0.7 0.4;
            +      offset: 0.3 0.3;
            +   }
            +}
            +
            +
          16. +
          17. +

            Create the programs to make all these states animate.

            +

            To make the rotation animation smoother, create and chain several program blocks with different durations.

            +
              + +
            1. Create the main program.

              +

              The main program goes from the default state to the rotate 0.0 state in 0.2 seconds.

              +

              Note that the states are all named the same way (rotate) but not with the same version. The version allows you to have more than one state with the same name, in fact, the actual name of the state is the name plus the version.

              +

              The program starts when the btn/rotate part is clicked with any mouse button.

              +
              +// Change the color of the target to green
              +program 
              +{
              +   name: "rotate,target";
              +   source: "btn/rotate";
              +   signal: "mouse,clicked,*";
              +   action: STATE_SET "rotate" 0.0;
              +   target: "atarget";
              +   transition: SIN 0.2;
              +   after: "rotate,target,2";
              +}
              +
              + +
            2. +
            3. +

              Create the 2nd program.

              +

              When the main program animation ends, it calls the next program called rotate,target,2. This program sets the part state to rotate 1.0 in 0.7 seconds.

              +
              +// Rotate 360°
              +program 
              +{
              +   name: "rotate,target,2";
              +   action: STATE_SET "rotate" 1.0;
              +   target: "atarget";
              +   transition: SIN 0.7;
              +   after: "rotate,end";
              +}
              +
              +
            4. +
            5. +

              Create the 3rd program.

              +

              When the 2nd program animation ends, it calls the next program called rotate,end. It is the last program of the rotation effect, and it sets the state to rotate 0.0 very fast.

              +
              +// Go back to the normal
              +program 
              +{
              +   name: "rotate,end";
              +   action: STATE_SET "rotate" 0.0;
              +   target: "atarget";
              +   transition: LINEAR 0.2;
              +}
              +
              +
            6. +
            7. +

              Create the last program, which is the grow effect that switches from one state to another.

              +

              The program starts when the btn/grow part is clicked, and it goes from the current state to grow 1.0 in one second. In this program, both size and color change during the transition. At the end, it calls the go,default program.

              +
              +// Grow the target and go back to normal state
              +program 
              +{
              +   name: "grow,target";
              +   source: "btn/grow";
              +   signal: "mouse,clicked,*";
              +   action: STATE_SET "grow" 1.0;
              +   after: "go,default";
              +   target: "atarget";
              +   transition: SINUSOIDAL 1.0;
              +}
              +
              +
            8. +
            9. +

              Return to the default state.

              +

              The go,default program sets the state back to default for the animation target.

              +
              +// Go back to normal (default) state
              +program 
              +{
              +   name: "go,default";
              +   action: STATE_SET "default" 1.0;
              +   target: "atarget";
              +   transition: SIN 1.0;
              +}
              +
              +
            10. +
            +
          18. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/edje_color_n.htm b/org.tizen.ui.practices/html/native/efl/edje_color_n.htm new file mode 100644 index 0000000..2010a5e --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_color_n.htm @@ -0,0 +1,354 @@ + + + + + + + + + + + + + + Using Edje Color Classes + + + + + + +
          +

          Using Edje Color Classes

          + +

          This tutorial demonstrates how you can change the color of 2 or more parts using Edje color classes.

          +

          If a part is assigned with a color class, setting color values to this class causes all those parts to have their colors multiplied by the values. Setting the values to a color class affects all parts within that color class at process level, while at object level, it only affects the parts inside a specified object.

          + +

          Create a simple application with a menu and separate screens for each Edje Animation function:

          + +
            +
          1. In the Tizen IDE, go to Tizen Native project > UI application > EDC and create a new project named colorclass.
          2. + +
          3. Open the colorclass.edc file and replace it with the following code: +
            color_classes 
            +{
            +   color_class 
            +   {
            +      name: "A";
            +      color: 255 255 0 255;
            +      color2: 255 0 0 255;
            +      color3: 0 0 255 255;
            +   }
            +   color_class 
            +   {
            +      name: "B";
            +      color: 0 255 0 255;
            +      color2: 0 0 255 255;
            +      color3: 255 0 0 255;
            +   }
            +   color_class 
            +   {
            +      name: "C";
            +      color: 125 0 0 255;
            +      color2: 255 0 0 255;
            +      color3: 0 0 255 255;
            +   }
            +}
            +
            +collections 
            +{
            +   group 
            +   { 
            +      name: "main";
            +      parts 
            +      {
            +         part 
            +         { 
            +            name: "bg";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "textA";
            +            type: TEXT;
            +            effect: OUTLINE_SHADOW;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "A";
            +               rel1.relative: 0.0 0.0;
            +               rel2.relative: 0.2 0.2;
            +               color2: 255 255 255 255;
            +               color3: 255 255 255 255;
            +               text 
            +               {
            +                  text: "A:";
            +                  size: 44;
            +               }
            +            }
            +         }
            +         part 
            +         { 
            +            name: "textB";
            +            type: TEXT;
            +            effect: OUTLINE_SHADOW;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "B";
            +               rel1.relative: 0.0 0.2;
            +               rel2.relative: 0.2 0.4;
            +               color2: 255 255 255 255;
            +               color3: 255 255 255 255;
            +               text 
            +               {
            +                  text: "B:";
            +                  size: 44;
            +               }
            +            }
            +         }
            +         part 
            +         { 
            +            name: "textC";
            +            type: TEXT;
            +            effect: OUTLINE_SHADOW;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "C";
            +               rel1.relative: 0.0 0.4;
            +               rel2.relative: 0.2 0.6;
            +               color2: 255 255 255 255;
            +               color3: 255 255 255 255;
            +               text 
            +               {
            +                  text: "C:";
            +                  size: 44;
            +               }
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect1";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "A";
            +               rel1.relative: 0.2 0.0;
            +               rel2.relative: 0.4 0.2;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect2";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "B";
            +               rel1.relative: 0.4 0.2;
            +               rel2.relative: 0.6 0.4;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect3";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "A";
            +               rel1.relative: 0.6 0.0;
            +               rel2.relative: 0.8 0.2;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect4";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color_class: "B";
            +               rel1.relative: 0.8 0.2;
            +               rel2.relative: 1.0 0.4;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect5";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color: 125 0 0 255;
            +               color_class: "C";
            +               rel1.relative: 0.6 0.4;
            +               rel2.relative: 0.8 0.6;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "rect6";
            +            type: RECT;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               color: 255 255 255 255;
            +               color_class: "C";
            +               rel1.relative: 0.8 0.4;
            +               rel2.relative: 1.0 0.6;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "swallow.btn1";
            +            type: SWALLOW;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               rel1.relative: 0.0 0.8;
            +               rel2.relative: 0.45 1.0;
            +            }
            +         }
            +         part 
            +         { 
            +            name: "swallow.btn2";
            +            type: SWALLOW;
            +            description 
            +            { 
            +               state: "default" 0.0;
            +               rel1.relative: 0.55 0.8;
            +               rel2.relative: 1.0 1.0;
            +            }
            +         }
            +      }
            +   }
            +}
            + +

            Setting the color class of a part causes its colors to be multiplied by color_class color values. To see how the color class affects the shadow and outline colors, set those colors as white in the part:

            + +
            color2: 255 255 255 255;
            +color3: 255 255 255 255;
            + +

            Parts with color_class "C" have different colors because their base colors are different.

            +
          4. + +
          5. Replace the create_base_gui() function with the following code: + +
            static void
            +btn1_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   edje_color_class_set("A", rand()%255, rand()%255, rand()%255, 255,
            +                        rand()%255, rand()%255, rand()%255, 255,
            +                        rand()%255, rand()%255, rand()%255, 255);
            +}
            +static void
            +btn2_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   edje_color_class_set("B", rand()%255, rand()%255, rand()%255, 255,
            +                        rand()%255, rand()%255, rand()%255, 255,
            +                        rand()%255, rand()%255, rand()%255, 255);
            +}
            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   char edj_path[PATH_MAX] = {0, };
            +
            +   // Window
            +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +   elm_win_conformant_set(ad->win, EINA_TRUE);
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   if (elm_win_wm_rotation_supported_get(ad->win)) 
            +   {
            +      int rots[4] = { 0, 90, 180, 270 };
            +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +   }
            +
            +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +
            +   // Conformant
            +   ad->conform = elm_conformant_add(ad->win);
            +   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            +   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(ad->win, ad->conform);
            +   evas_object_show(ad->conform);
            +
            +   // Base layout
            +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +   ad->layout = elm_layout_add(ad->win);
            +   elm_layout_file_set(ad->layout, edj_path, GRP_MAIN);
            +   evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad);
            +   elm_object_content_set(ad->conform, ad->layout);
            +
            +   // Buttons
            +   ad->btn1 = elm_button_add(ad->win);
            +   elm_object_part_content_set(ad->layout, "swallow.btn1", ad->btn1);
            +   evas_object_smart_callback_add(ad->btn1, "clicked", btn1_cb, ad);
            +   elm_object_part_text_set(ad->btn1, NULL, "Change A");
            +   ad->btn2 = elm_button_add(ad->win);
            +   elm_object_part_content_set(ad->layout, "swallow.btn2", ad->btn2);
            +   evas_object_smart_callback_add(ad->btn2, "clicked", btn2_cb, ad);
            +   elm_object_part_text_set(ad->btn2, NULL, "Change B");
            +
            +   // Show the window
            +   evas_object_show(ad->win);
            +}
            + +

            Pressing the Change A button changes all colors of all parts with color_class set as "A" but does not affect other parts. The actual color, color2, and color3 values remain unchanged but they are multiplied by values from the color class.

            +

            You can omit the color class declaration in the .edc file and still use it in parts. There are no visual effects unless you change the color class in the code. For example, you can comment out the color class "B" and see what happens when you press the Change B button.

            +
          6. + +

            Figure: Edje colorclass application

            +

            Edje colorclass application

            + +
          + + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/edje_files_n.htm b/org.tizen.ui.practices/html/native/efl/edje_files_n.htm new file mode 100644 index 0000000..6754ab6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_files_n.htm @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + Handling Edje Files + + + + + + +
          +

          Handling Edje Files

          + +

          This tutorial demonstrates how you can manage EDJ files. An EDJ file is a specific eet file that collects layouts. The Edje layout is called Style and created using the EDC language. The file that contains the layout collection called Theme.

          + +

          Initializing the Application

          + +

          The following example shows a typical Elementary application that creates a window entitled Genlist Basic Tutorial. It is consisted of a conformant widget that contains a naviframe widget. The genlist goes inside the naviframe.

          + +
          static void
          +create_base_gui(appdata_s *ad)
          +{
          +   char edj_path[PATH_MAX] = {0, };
          +
          +   // Window
          +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          +   elm_win_conformant_set(ad->win, EINA_TRUE);
          +   elm_win_autodel_set(ad->win, EINA_TRUE);
          +
          +   if (elm_win_wm_rotation_supported_get(ad->win)) 
          +   {
          +      int rots[4] = {0, 90, 180, 270};
          +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          +   }
          +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, ad);
          +
          +   // Conformant
          +   ad->conform = elm_conformant_add(ad->win);
          +   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          +   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_win_resize_object_add(ad->win, ad->conform);
          +   evas_object_show(ad->conform);
          +
          +   // Naviframe
          +   ad->navifr = elm_naviframe_add(ad->win);
          +   elm_object_content_set(ad->conform, ad->navifr);
          +   eext_object_event_callback_add(ad->navifr, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, ad);
          +
          +   // Genlist
          +   ad->itc = elm_genlist_item_class_new();
          +   ad->itc->func.text_get =_genlist_item_text_get;
          +
          +   ad->genlist = elm_genlist_add(ad->win);
          +   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
          +
          +   // Show window after base GUI is set up
          +   evas_object_show(ad->win);
          +}
          +
          +static bool
          +app_create(void *data)
          +{
          +   // Initialize UI resources and application data
          +   // If this function returns true, the main loop of application starts
          +   // If this function returns false, the application is terminated
          +   appdata_s *ad = data;
          +
          +   create_base_gui(ad);
          +
          +   return true;
          +}
          + +

          Declare the struct appdata:

          + +
          typedef struct appdata
          +{
          +   Evas_Object *win;
          +   Evas_Object *conform;
          +   Evas_Object *navifr;
          +   Evas_Object *genlist;
          +   Eina_List *list;
          +   Elm_Genlist_Item_Class *itc;
          +} 
          +appdata_s;
          + +

          Loading the Collection List from an EDJ File

          + +

          Edje provides the functionality to manipulate the EDJ files. First, get the list of styles from EDJ file:

          + +
          // Get the collection list from the EDJ file
          +app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          +ad->list = edje_file_collection_list(edj_path);
          + +

          When you do not use the collection list, delete it:

          + +
          static void
          +win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   // Free the collection list
          +   edje_file_collection_list_free(ad->list);
          +   ui_app_exit();
          +}
          + + + + + + + + + + +
          Note
          The list returned after using the edje_file_collection_list() function must only be deleted using the edje_file_collection_list_free() function.
          + +

          Add the item in the genlist to display the list:

          + +
          EINA_LIST_FOREACH(ad->list, l, str)
          +{
          +   elm_genlist_item_append(ad->genlist, ad->itc, str, NULL, ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
          +}
          + + +

          Creating an Edje Object

          + +

          Implement callbacks for the clicked (tapped) event. Check that the required style exists using the edje_file_group_exists() function. The first argument is the path to EDJ file and style name. Create the Edje object and load the given style.

          + +
          static void
          +_genlist_clicked(void *data, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   Elm_Object_Item *eoi = NULL;
          +   const char *str;
          +   char edj_path[PATH_MAX] = {0, };
          +   Evas_Object *edje_object;
          +
          +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          +   eoi = elm_genlist_selected_item_get(obj);
          +
          +   str = elm_object_item_part_text_get(eoi, "elm.text");
          +   // Check whether a group matching glob exists in an edje file
          +   // If there is no matching group
          +   if (!edje_file_group_exists(edj_path, str)) return;
          +
          +   // Load the given style to the object
          +   edje_object = edje_object_add(evas_object_evas_get(ad->win));
          +   edje_object_file_set(edje_object, edj_path, str);
          +   // Check object loading errors
          +   if (edje_object_load_error_get(edje_object) != EDJE_LOAD_ERROR_NONE)
          +   {
          +      evas_object_del(edje_object);
          +
          +      return;
          +   }
          +   evas_object_size_hint_weight_set(edje_object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_naviframe_item_simple_push(ad->navifr, edje_object);
          +}
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/edje_intro_n.htm b/org.tizen.ui.practices/html/native/efl/edje_intro_n.htm new file mode 100644 index 0000000..1582d13 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_intro_n.htm @@ -0,0 +1,305 @@ + + + + + + + + + + + + + Introduction to EDC Programming + + + + + +
          + +

          Introduction to EDC Programming

          + + +

          An EDC (Edje data collection) file is a text file that contains the code describing the position, size, and other parameters of graphical elements that compose the visual aspect of your application. In addition to graphical elements, it can also handle sounds. EDC is a description language where the objects of an interface are described by using a text description.

          + +

          The EDC file has the .edc file extension. The syntax for the EDC files follows a simple structure of blocks that can contain properties and more blocks. For more information on the blocks and their content, see the extensive language references included in the EDC Reference documentation.

          + + +

          Writing a Simple EDC File

          + +

          The following example shows the basic structure of an EDC file:

          + +
          +collections 
          +{
          +   group 
          +   {
          +      name: "my_group";
          +      parts {}
          +      programs {}
          +   }
          +}
          +
          + +

          An EDC file is a collection of groups that contain parts and programs:

          + +
          • A group can define the content of the entire screen of your application, or some smaller section of it. The group is identified with a name.
          • + +
          • The parts within the group correspond to the graphical elements on the screen. Each part can have several states that describe a specific position, size, and visual aspect of the element.
          • +
          • The programs within the group contain the program code related to the graphical elements, such as interaction with the main application through signals. Animations are also defined within a program (for example, changing a part state using an animated transition).
          • +
          + +

          The state of the part is defined in the description field:

          + +
          +part
          +{
          +   description 
          +   { 
          +      state: "default" 0.0;
          +   }
          +   description 
          +   { 
          +      state: "state1" 0.0;
          +   }
          +   description 
          +   { 
          +      state: "state2" 0.0;
          +   }
          +}
          +
          + +

          The following example shows an EDC file that contains only 1 part and 1 program. The part is a rectangle with a blue state and a red state, and the program changes the state from blue to red when the user clicks the rectangle:

          + +
          +collections 
          +{
          +   group 
          +   {
          +      name: "example";
          +      parts 
          +      {
          +         // Create the part
          +         part 
          +         { 
          +            name: "rectangle";
          +            // Set the type to RECT (rectangle)
          +            type: RECT;
          +            // Default state (blue color)
          +            description 
          +            { 
          +               state: "default" 0.0;
          +               align: 0.0 0.0;
          +               // Blue color
          +               color: 0 0 255 255;
          +            }
          +            // Second state (red color)
          +            description 
          +            { 
          +               state: "red" 0.0;
          +               align: 0.0 0.0;
          +               // Red color
          +               color: 255 0 0 255;
          +            }
          +         }
          +      }
          +      programs 
          +      {
          +         // Create a program
          +         program 
          +         { 
          +            name: "change_color";
          +            // The program is triggered on a mouse click
          +            signal: "mouse,clicked,*";
          +            source: "*";
          +            // Set the red state of the "rectangle" part
          +            action: STATE_SET "red" 0.0;
          +            target: "rectangle";
          +         }
          +      }
          +   }
          +}
          +
          + +

          The program is triggered when a signal arrives from a specific source (in the above example, all the sources are taken into account). When launched, the program does the action (changing the part state) on the target (the rectangle).

          + +

          Compiling the EDC File

          + +

          An EDC file needs to be compiled into a .edj file using the Edje library tools. After compiling, the .edj file can be used by a native Tizen application.

          + +

          The following example shows how to compile the helloworld.edc file to create a helloworld.edj file using the edje_cc tool:

          + +
          +$ edje_cc helloworld.edc
          +
          + +

          The EDC file can use external files, such as sounds, images, or fonts. The path to these resources is passed to the edje_cc tool so that they are included in the final .edj file:

          + +
          +$ edje_cc -sd $SOUNDS_DIR -fd $FONTS_DIR -id $IMAGES_DIR
          +
          + +

          The SOUNDS_DIR, FONTS_DIR, and IMAGES_DIR are the paths for the sound, font, and image resources.

          + +

          The Tizen SDK automatically calls the edje_cc tool during the project building, if it finds an EDC source file in the ./res/edje/ directory.

          + + +

          The following Tizen SDK compilation log extract shows that if your EDC file uses images, they must be copied to the ./edje/images directory. Fonts and sounds go to the ./edje/fonts and ./edje/sounds directories. The SDK builds the helloworld.edj file in the ./res/edje/ folder.

          + +
          +Building file: ../res/edje/helloworld.edc
          +Invoking: EDC Resource Compiler
          +edje_cc -sd ../edje/sounds -fd ../edje/fonts -id ../edje/images ../res/edje/helloworld.edc ../res/edje/helloworld.edj
          +
          + +

          Tips for Using EDC Blocks

          + +

          See the following tips for using EDC blocks:

          + +
            +
          • To add an element on the screen: +

            Add a new part inside the parts block.

            +
          • + +
          • To use an image: +

            List the image in the images block, make sure the part has the IMAGE type, and set the normal property inside the description.image of the part.

            +
          • + +
          • To use the same color definitions across multiple elements: +

            Define a color class and set the description.color_class property.

            +
          • + +
          • To position and resize a part with relative and absolute positioning: +

            Fill in the rel1 and rel2 structures inside the description block of the part.

            +
          • + +
          • To hide a part: +

            Set the visible property inside the description block of the part to 0.

            +
          • + +
          • To animate a part: +
              +
            1. Create several description blocks inside the part, and give each of them a different state value. Set 1 description for the initial state and 1 for the end state.
            2. + +
            3. Create a program with an action that is STATE_SET end_state 0.0; and with a target that is the name of the part. You can also set a non-default transition.
            4. + +
            5. When defining the second description, inherit from the first part in order to re-use the values which are already defined.
            6. + +
            7. The after property of the program block is used to trigger another program after the animation is done. It can be used to trigger another animation or to emit a signal to the C part of the program.
            8. + +
            +
          • + +
          • To make a genlist item theme: +

            Create a group with one part for each list item part that can be filed from the C code and set the items properties inside the group:

            + +
            +items: "texts" "text_part_1 text_part_2";
            +items: "icons" "image_part_1 image_part_2";
            +
            +

            On the C side, the text_get() and content_get() callbacks are called respectively with text_part_1 and text_part_2, and image_part_1 and image_part_2.

            +
          • +
          • To use the image masking effect: +

            EDC files support an image masking effect that applies the transparency of a mask image to a content object.

            + +

            Figure: Masking effect

            +

            Masking effect

            + +

            To use the image masking effect, add 2 new part blocks inside the parts block to be used as content and mask. Set the mask using the clip_to property in the content part.

            +
            +part 
            +{
            +   name: "bg";
            +   type: RECT;
            +   description 
            +   {
            +      state: "default" 0.0;
            +   }
            +}
            +part 
            +{
            +   name: "text";
            +   type: TEXTBLOCK;
            +   clip_to: "mask";
            +   description 
            +   {
            +      state: "default" 0.0;
            +      align: 0.5 0.5;
            +      text 
            +      {
            +         style: "text_style";
            +         text: "TEXT<br>WITH<br>MASK";
            +      }
            +   }
            +}
            +part 
            +{
            +   name: "mask";
            +   type: IMAGE;
            +   description 
            +   {
            +      state: "default" 0.0;
            +      image.normal: "mask.png";
            +   }
            +}
            +
            +

            The content part is cropped off in the mask shape, which depends on the alpha value per pixel. The content part type can be almost anything in the EDC files, but the mask part type can only be IMAGE.

            +
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_manage_animation_n.htm b/org.tizen.ui.practices/html/native/efl/edje_manage_animation_n.htm new file mode 100644 index 0000000..9b2a5be --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_manage_animation_n.htm @@ -0,0 +1,728 @@ + + + + + + + + + + + + + Edje Animations + + + + + +
          + +

          Edje Animations

          + +

          This tutorial demonstrates how you can turn Edje animations on and off, pause, stop and resume them, and check the status of Edje parts.

          + + +

          Creating the Application Layout

          + +

          Create a simple application with a menu and separate screens for each Edje Animation function:

          + +
            +
          1. +

            Create a simple main layout with a swallow for demo animation and another for controls:

            + +
            collections 
            +{
            +   group 
            +   {
            +      name: "demo";
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "swallow.demo";
            +            type: SWALLOW;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel2 
            +               {
            +                  relative: 1.0 0.0;
            +                  to_y: "swallow.control";
            +               }
            +            }
            +         }
            +         part 
            +         {
            +            name: "swallow.control";
            +            type: SWALLOW;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 
            +               {
            +                  relative: 0.0 0.8;
            +               }
            +            }
            +         }
            +      }
            +   }
            +}
            +
            +
          2. + +
          3. +

            Create a group for the cycled animation:

            +
            group 
            +{
            +   name: "cycled_animation";
            +   parts 
            +   {
            +      part 
            +      {
            +         name: "bg";
            +         type: RECT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 100 100 100 255;
            +         }
            +         description 
            +         {
            +            state: "clicked" 0.0;
            +            color: 200 100 100 255;
            +         }
            +      }
            +      part 
            +      {
            +         name: "a";
            +         type: RECT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 0 255 0 255;
            +            rel2 
            +            {
            +               relative: 0.3 0.3;
            +            }
            +         }
            +         description 
            +         {
            +            state: "red" 0.0;
            +            color: 255 0 0 255;
            +            rel1 
            +            {
            +               relative: 0.35 0.7;
            +            }
            +            rel2 
            +            {
            +               relative: 0.65 1.0;
            +            }
            +         }
            +         description 
            +         {
            +            state: "blue" 0.0;
            +            color: 0 0 255 255;
            +            rel1 
            +            {
            +               relative: 0.7 0.0;
            +            }
            +            rel2 
            +            {
            +               relative: 1.0 0.3;
            +            }
            +         }
            +      }
            +   }
            +   programs 
            +   {
            +      program 
            +      {
            +         name: "bg_click";
            +         signal: "mouse,clicked,*";
            +         source: "bg";
            +         action: STATE_SET "clicked" 0.0;
            +         target: "bg";
            +      }
            +      program 
            +      {
            +         name: "step1";
            +         signal: "load";
            +         source: "";
            +         action: STATE_SET "red" 0.0;
            +         transition: LINEAR 1.0;
            +         target: "a";
            +         after: "step2";
            +      }
            +      program 
            +      {
            +         name: "step2";
            +         action: STATE_SET "blue" 0.0;
            +         transition: LINEAR 1.0;
            +         target: "a";
            +         after: "step3";
            +      }
            +      program 
            +      {
            +         name: "step3";
            +         action: STATE_SET "default" 0.0;
            +         transition: LINEAR 1.0;
            +         target: "a";
            +         after: "step1";
            +      }
            +   }
            +}
            +
          4. + +
          5. +

            Create another group for animation that can be activated by clicking:

            +
            group 
            +{
            +   name: "clickme";
            +   parts 
            +   {
            +      part 
            +      {
            +         name: "bg";
            +         type: RECT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 100 100 100 255;
            +         }
            +      }
            +      part 
            +      {
            +         name: "text_bg";
            +         type: RECT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            rel1 
            +            {
            +               to: "text";
            +            }
            +            rel2 
            +            {
            +               to: "text";
            +            }
            +         }
            +      }
            +      part 
            +      {
            +         name: "text";
            +         type: TEXT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            color: 0 0 0 255;
            +            text 
            +            {
            +               text: ":-)";
            +               font: "Sans";
            +               size: 42;
            +               min: 1 1;
            +               max: 1 1;
            +            }
            +         }
            +         description 
            +         {
            +            state: "state2" 0.0;
            +            inherit: "default" 0.0;
            +            align: 1.0 1.0;
            +            text.text: ":-D";
            +         }
            +      }
            +      part 
            +      {
            +         name: "text_bg2";
            +         type: RECT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 0 200 0 255;
            +            rel1 
            +            {
            +               to: "text2";
            +            }
            +            rel2 
            +            {
            +               to: "text2";
            +            }
            +         }
            +         description 
            +         {
            +            state: "state2" 0.0;
            +            inherit: "default" 0.0;
            +            color: 200 0 0 255;
            +         }
            +      }
            +      part 
            +      {
            +         name: "text2";
            +         type: TEXT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            align: 0.0 1.0;
            +            visible: 0;
            +            text 
            +            {
            +               text: "Click me";
            +               font: "Sans";
            +               size: 42;
            +               min: 1 1;
            +               max: 1 1;
            +            }
            +         }
            +         description 
            +         {
            +            state: "state2" 0.0;
            +            inherit: "default" 0.0;
            +            visible: 1;
            +         }
            +      }
            +      part 
            +      {
            +         name: "text3";
            +         type: TEXT;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            align: 0.0 1.0;
            +            visible: 1;
            +            text 
            +            {
            +               text: "Click me";
            +               font: "Sans";
            +               size: 42;
            +               min: 1 1;
            +               max: 1 1;
            +            }
            +         }
            +         description 
            +         {
            +            state: "state2" 0.0;
            +            inherit: "default" 0.0;
            +            visible: 0;
            +         }
            +      }
            +   }
            +   programs 
            +   {
            +      program 
            +      {
            +         name: "clicked";
            +         signal: "mouse,clicked,1";
            +         source: "text3";
            +         action: STATE_SET "state2" 0.00;
            +         transition: LINEAR 3.00000;
            +         target: "text";
            +         target: "text2";
            +         target: "text3";
            +         target: "text_bg2";
            +      }
            +      program 
            +      {
            +         name: "return";
            +         signal: "mouse,clicked,1";
            +         source: "text2";
            +         action: STATE_SET "default" 0.00;
            +         transition: LINEAR 1.00000;
            +         target: "text";
            +         target: "text2";
            +         target: "text3";
            +         target: "text_bg2";
            +      }
            +   }
            +}
            +
          6. +
          + +

          Creating the Application Logic

          + +
            +
          1. Create new project named test.
          2. + +
          3. Add 2 new files to the application project:edje_animation.h and edje_animation.c.
          4. +
          5. To access the application data from the newly created files, move the appdata_s structure from the test.c file to the test.h file and remove the static specifier.
          6. + +
          7. Add the following code to the edje_animation.h file: +
            #ifndef __edje_animation_H__
            +#define __edje_animation_H__
            +#include "test.h"
            +
            +typedef struct _edje_animation_item_s 
            +{
            +   const char *name;
            +   Evas_Object* (*func)(appdata_s *ap);
            +} 
            +Edje_Animation_Menu_Item;
            +
            +#endif // __edje_animation_H__
            + +

            This structure will define menu items and their callbacks.

            +
          8. + +
          9. +

            Create a global menu array in the edje_animation.c file and fill it with necessary items:

            +
            Edje_Animation_Menu_Item edje_animation_items[] =
            +{
            +   {"test1", _test1_func },
            +   {"test2", _test2_func },
            +
            +   {NULL, NULL } // Do not delete
            +};
            +
          10. + +
          11. +

            Use the array to fill the main menu:

            +
            extern Edje_Animation_Menu_Item edje_animation_items[];
            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Genlist
            +   ad->itc = elm_genlist_item_class_new();
            +   ad->itc->func.text_get =_genlist_item_text_get;
            +   ad->genlist = elm_genlist_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +
            +   int i;
            +   Elm_Object_Item *eoi = NULL;
            +
            +   for (i = 0; edje_animation_items[i].name; ++i)
            +   {
            +      eoi = elm_genlist_item_append(ad->genlist, ad->itc, edje_animation_items[i].name, NULL,
            +                                    ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
            +      elm_object_item_data_set(eoi, (void *)&edje_animation_items[i]);
            +   }
            +}
            +
          12. + +
          13. All examples use the same basic layout: +
            static void
            +app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max)
            +{
            +   char *res_path = app_get_resource_path();
            +   if (res_path) 
            +   {
            +        snprintf(edj_path_out, edj_path_max, "%s%s", res_path, edj_file_in);
            +        free(res_path);
            +   }
            +}
            +
            +static void
            +_example_layout_create(appdata_s *ad,
            +                       const char *layout_group,
            +                       const char *demo_group,
            +                       Evas_Object **layout_out,
            +                       Evas_Object **animation_out)
            +{
            +   char edj_path[PATH_MAX] = {0, };
            +
            +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +
            +   *layout_out = elm_layout_add(ad->win);
            +   elm_layout_file_set(*layout_out, edj_path, layout_group);
            +   evas_object_size_hint_weight_set(*layout_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +
            +   *animation_out = edje_object_add(evas_object_evas_get(ad->win));
            +   edje_object_file_set(*animation_out, edj_path, demo_group);
            +   evas_object_size_hint_weight_set(*animation_out, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_layout_content_set(*layout_out, SWALLOW_DEMO, *animation_out);
            +   evas_object_show(*animation_out);
            +}
            +
          14. + +
          15. You can try out the following operations to see how the application works: + +
              +
            • Check the time for each frame. + +

              The edje_frametime_get() function allows you to check how much time is elapsed for single frame. This is a value of an internal parameter and not actual frame time. You can change it using the edje_frametime_set() function.

              + + + + + + + + + + +
              Note
              Changing the frame time affects all objects on the same canvas, not only on the given one.
              + +

              Use the edje_frametime_get() function and edje_frametime_set() function in the edje_animation.c file:

              +
              // edje_frametime_set/get
              +static void
              +_frametime_test_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
              +{
              +   edje_frametime_set(elm_spinner_value_get(obj));
              +}
              +
              +Evas_Object *
              +frametime_test(appdata_s *ad)
              +{
              +   Evas_Object *layout, *animation, *spinner;
              +   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              +
              +   spinner = elm_spinner_add(ad->win);
              +   elm_spinner_label_format_set(spinner, "Frame_t: %1.3f");
              +   double framerate = edje_frametime_get();
              +   elm_spinner_min_max_set(spinner, 0.001, 2.0);
              +   elm_spinner_step_set(spinner, 0.005);
              +   elm_spinner_value_set(spinner, framerate);
              +   evas_object_smart_callback_add(spinner, "changed", _frametime_test_spinner_changed_cb, NULL);
              +   elm_layout_content_set(layout, SWALLOW_CONTROL, spinner);
              +   evas_object_show(spinner);
              +
              +   return layout;
              +}
              +
              +Edje_Animation_Menu_Item edje_animation_items[] =
              +{
              +   {"frametime test", frametime_test},
              +
              +   {NULL, NULL}
              +};
              + +

              The spinner displays the current frame time value and enables changing it. Extreme values (> 0.9) are affecting animation.

              + +

              Figure: Displaying the frame time

              +

              Displaying the frame time

              + +
            • + +
            • Pause and resume animation and check its status. + +

              The edje_object_play_set() function allows you to pause or resume animation for a given object. A resumed animation starts from the same point.

              +

              To check whether the animation is paused, use the edje_object_play_get() function.

              + +
              // edje_object_play_set/get
              +static void
              +_play_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              +{
              +   Evas_Object *anim = data;
              +   if (edje_object_play_get(anim))
              +   {
              +      edje_object_play_set(anim, EINA_FALSE);
              +      elm_object_text_set(obj, "Play");
              +   }
              +   else
              +   {
              +      edje_object_play_set(anim, EINA_TRUE);
              +      elm_object_text_set(obj, "Pause");
              +   }
              +}
              +
              +Evas_Object *
              +play_test(appdata_s *ad)
              +{
              +   Evas_Object *layout, *animation, *button;
              +   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              +   button = elm_button_add(ad->win);
              +   elm_object_text_set(button, "Pause");
              +   evas_object_smart_callback_add(button, "clicked", _play_test_button_cb, animation);
              +   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              +   evas_object_show(button);
              +
              +   return layout;
              +}
              +
              +Edje_Animation_Menu_Item edje_animation_items[] =
              +{
              +   {"frametime test", frametime_test},
              +   {"play test", play_test},
              +   
              +   {NULL, NULL}
              +};
              +
            • + +
            • Stop the animation. + +

              The edje_object_freeze() function allows you to stop animation rendering. This function puts all changes on hold. Successive freezes are nested, requiring an equal number of thaws. Using the edje_object_thaw() function, you can apply all changes immediately.

              + +
              // edje_object_freeze/thaw
              +static void
              +_freeze_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              +{
              +   Evas_Object *anim = data;
              +   static int i = 0;
              +   if(!i)
              +   {
              +      i = edje_object_freeze(anim);
              +      elm_object_text_set(obj, "Thaw");
              +   }
              +   else
              +   {
              +      i = edje_object_thaw(anim);
              +      elm_object_text_set(obj, "Freeze");
              +   }
              +}
              +
              +Evas_Object *
              +freeze_test(appdata_s *ad)
              +{
              +   Evas_Object *layout, *animation, *button;
              +   _example_layout_create(ad, GRP_DEMO, GRP_CYCLED_ANIM, &layout, &animation);
              +
              +   button = elm_button_add(ad->win);
              +   elm_object_text_set(button, "Freeze");
              +   evas_object_smart_callback_add(button, "clicked", _freeze_test_button_cb, animation);
              +   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              +   evas_object_show(button);
              +
              +   return layout;
              +}
              +
              +Edje_Animation_Menu_Item edje_animation_items[] =
              +{
              +   {"frametime test", frametime_test},
              +   {"play test", play_test},
              +   {"freeze/thaw test", freeze_test},
              +
              +   {NULL, NULL}
              +};
              + +

              The edje_freeze() function and edje_thaw() function freeze or thaw all objects in the entire application.

              +
            • + +
            • Enable and disable the animation. + +

              All transitions in edje programs are ignored and parts go directly to their final states.

              + +
              // edje_object_animation_set/get
              +static void
              +_animation_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              +{
              +   Evas_Object *anim = data;
              +   if (edje_object_animation_get(anim))
              +   {
              +      edje_object_animation_set(anim, EINA_FALSE);
              +      elm_object_text_set(obj, "Turn animation on");
              +   }
              +   else
              +   {
              +      edje_object_animation_set(anim, EINA_TRUE);
              +      elm_object_text_set(obj, "Turn animation off");
              +   }
              +}
              +
              +Evas_Object *
              +animation_test(appdata_s *ad)
              +{
              +   Evas_Object *layout, *animation, *button;
              +   _example_layout_create(ad, GRP_DEMO, GRP_CLICKME, &layout, &animation);
              +
              +   button = elm_button_add(ad->win);
              +   elm_object_text_set(button, "Turn animation off");
              +   evas_object_smart_callback_add(button, "clicked", _animation_test_button_cb, animation);
              +   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              +   evas_object_show(button);
              +
              +   return layout;
              +}
              +
              +Edje_Animation_Menu_Item edje_animation_items[] =
              +{
              +   {"frametime test", frametime_test},
              +   {"play test", play_test},
              +   {"freeze/thaw test", freeze_test},
              +   {"animation test", animation_test},
              +
              +   {NULL, NULL}
              +};
              +
            • + +
            • Get the current state of given part. + +

              Parts that are in transition return the transition's starting state.

              + +
              // edje_object_part_state_get
              +static void
              +_state_get_test_button_cb(void *data, Evas_Object *obj, void *event_info)
              +{
              +   Evas_Object *anim = data;
              +   const char *state;
              +   double state_val = 0;
              +   state = edje_object_part_state_get(anim, "text", &state_val);
              +   edje_object_part_text_set(anim, "text", state);
              +}
              +
              +Evas_Object *
              +state_get_test(appdata_s *ad)
              +{
              +   Evas_Object *layout, *animation, *button;
              +   _example_layout_create(ad, GRP_DEMO, GRP_CLICKME, &layout, &animation);
              +
              +   button = elm_button_add(ad->win);
              +   elm_object_text_set(button, "Get state");
              +   evas_object_smart_callback_add(button, "clicked", _state_get_test_button_cb, animation);
              +   elm_layout_content_set(layout, SWALLOW_CONTROL, button);
              +   evas_object_show(button);
              +
              +   return layout;
              +}
              +
              +Edje_Animation_Menu_Item edje_animation_items[] =
              +{
              +   {"frametime test", frametime_test},
              +   {"play test", play_test},
              +   {"freeze/thaw test", freeze_test},
              +   {"animation test", animation_test},
              +   {"part state get test", state_get_test},
              +
              +   {NULL, NULL}
              +};
              +
            • +
            +
          16. +
          + + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_message_signal_n.htm b/org.tizen.ui.practices/html/native/efl/edje_message_signal_n.htm new file mode 100644 index 0000000..1e9b448 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_message_signal_n.htm @@ -0,0 +1,457 @@ + + + + + + + + + + + + + Managing Signals and Messages + + + + + +
          + +

          Managing Signals and Messages

          + + +

          Edje objects have 2 communication interfaces between the application logic (code) and GUI (theme). You can either emit a signal from the code to the theme, or create handles for the signals emitted from the theme. Signals are identified by strings. With Edje messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          + + +

          Signals

          +

          You can emit signals from code to a theme, or create handles for the signals emitted from themes. Signals are identified by strings.

          + +

          Using signals in the EDC file is simple. Create a program and set the signal name to the signal attribute.

          + +
          +group 
          +{ 
          +   name: "main";
          +   parts 
          +   {
          +      part 
          +      { 
          +         name: "rect1";
          +         type: RECT;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            min: 100 100;
          +            max: 100 100;
          +            color: 255 0 0 255;
          +         }
          +         description 
          +         { 
          +            state: "default" 1.0;
          +            min: 100 100;
          +            max: 100 100;
          +            color: 0 0 255 255;
          +         }
          +      }
          +      part 
          +      { 
          +         name: "swallow.check";
          +         type: SWALLOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            align: 0.5 0.0;
          +            rel2 
          +            {
          +               relative: 0.0 0.0;
          +               to_x: "swallow.slider_ver";
          +            }
          +         }
          +      }
          +   }
          +   programs 
          +   {
          +      program 
          +      { 
          +         name: "to_default_0";
          +         signal: "to,state,default,0";
          +         action: STATE_SET "default" 0.00;
          +         transition: ACCELERATE 0.5 CURRENT;
          +         target: "rect1";
          +      }
          +      program 
          +      { 
          +         name: "to_default_1";
          +         signal: "to,state,default,1";
          +         action: STATE_SET "default" 1.00;
          +         transition: ACCELERATE 0.5 CURRENT;
          +         target: "rect1";
          +      }
          +   }
          +}
          +
          + +

          Emitting Signals from the C Code

          + +

          Create the Edje Object and widget check. When a changed event is triggered, a signal is emitted from the C code to the EDC file.

          + +
          +static void
          +create_base_gui(appdata_s *ad)
          +{
          +   char edj_path[PATH_MAX] = {0, };
          +   
          +   // Window
          +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          +   elm_win_conformant_set(ad->win, EINA_TRUE);
          +   elm_win_autodel_set(ad->win, EINA_TRUE);
          +
          +   if (elm_win_wm_rotation_supported_get(ad->win)) 
          +   {
          +      int rots[4] = { 0, 90, 180, 270 };
          +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
          +   }
          +
          +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          +
          +   // Conformant
          +   ad->conform = elm_conformant_add(ad->win);
          +   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          +   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_win_resize_object_add(ad->win, ad->conform);
          +   evas_object_show(ad->conform);
          +
          +   // Base layout
          +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
          +   ad->edje_object = edje_object_add(evas_object_evas_get(ad->win));
          +   edje_object_file_set(ad->edje_object, edj_path, GRP_MAIN);
          +   evas_object_size_hint_weight_set(ad->edje_object, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   
          +   ad->check = elm_check_add(ad->win);
          +   edje_object_part_swallow(ad->edje_object, "swallow.check", ad->check);
          +   evas_object_smart_callback_add(ad->check, "changed", _check_toggled, ad);
          +
          +   elm_object_content_set(ad->conform, ad->edje_object);
          +   // Show the window
          +   evas_object_show(ad->win);
          +}
          +
          + +

          The following figure displays the result.

          + +

          Figure: Signal implemented on the screen

          +

          Signal implemented on the screen

          + +

          The following example implements the callback for the changed event from the widget check.

          +
          +static void
          +_check_toggled(void *data, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +
          +   if (elm_check_state_get(obj))
          +      edje_object_signal_emit(ad->edje_object, "to,state,default,1", "");
          +   else
          +      edje_object_signal_emit(ad->edje_object, "to,state,default,0", "");
          +}
          +
          + +

          The following figure displays the result.

          + +

          Figure: Widget check status changed

          +

          Widget check status changed

          + + +

          Messages

          + +

          Edje messages are used for communication between code and a given Edje object's theme. With messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          + +

          In the following example, the rect1 part is made draggable and 2 sliders added to change the part position.

          + +
          +group 
          +{ 
          +   name: "main";
          +   parts 
          +   {
          +      part 
          +      { 
          +         name: "drag_area";
          +         type: RECT;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            rel1 
          +            {
          +               relative: 0.0 1.0;
          +               to_y: "swallow.check";
          +            }
          +            rel2 
          +            {
          +               relative: 0.0 0.0;
          +               to_x: "swallow.slider_ver";
          +               to_y: "swallow.slider_hor";
          +            }
          +         }
          +      }
          +      part 
          +      { 
          +         name: "rect1";
          +         type: RECT;
          +         dragable 
          +         {
          +            x: 1 1 1;
          +            y: 1 1 1;
          +            confine: "drag_area";
          +         }
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            min: 100 100;
          +            max: 100 100;
          +            color: 255 0 0 255;
          +         }
          +         description { state: "default" 1.0;
          +            min: 100 100;
          +            max: 100 100;
          +            color: 0 0 255 255;
          +         }
          +      }
          +      part 
          +      { 
          +         name: "swallow.check";
          +         type: SWALLOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            align: 0.5 0.0;
          +            rel2 
          +            {
          +               relative: 0.0 0.0;
          +               to_x: "swallow.slider_ver";
          +            }
          +         }
          +      }
          +      part 
          +      { 
          +         name: "swallow.slider_ver";
          +         type: SWALLOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            align: 1.0 0.5;
          +            rel1 
          +            {
          +               relative: 1.0 1.0;
          +               to_y: "swallow.check";
          +            }
          +            rel2 
          +            {
          +               relative: 1.0 0.0;
          +               to_y: "swallow.slider_hor";
          +            }
          +         }
          +      }
          +      part 
          +      { 
          +         name: "swallow.slider_hor";
          +         type: SWALLOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            align: 0.5 1.0;
          +            rel1 
          +            {
          +               relative: 0.0 1.0;
          +            }
          +            rel2 
          +            {
          +               relative: 0.0 1.0;
          +               to_x: "swallow.slider_ver";
          +            }
          +         }
          +      }
          +   }
          +   programs 
          +   {
          +      program 
          +      { 
          +         name: "to_default_0";
          +         signal: "to,state,default,0";
          +         action: STATE_SET "default" 0.00;
          +         transition: ACCELERATE 0.5 CURRENT;
          +         target: "rect1";
          +      }
          +      program 
          +      { 
          +         name: "to_default_1";
          +         signal: "to,state,default,1";
          +         action: STATE_SET "default" 1.00;
          +         transition: ACCELERATE 0.5 CURRENT;
          +         target: "rect1";
          +      }
          +      program 
          +      {
          +         signal: "drag";
          +         source: "rect1";
          +         script 
          +         {
          +               new Float:x, Float:y;
          +               get_drag(PART:"rect1", x, y);
          +               send_message(MSG_FLOAT, 2, x);
          +               send_message(MSG_FLOAT, 3, y);
          +         }
          +      }
          +   }
          +}
          +
          + +

          Add the sliders:

          + +
          +ad->slider_ver = elm_slider_add(ad->win);
          +edje_object_part_swallow(ad->edje_object, "swallow.slider_ver", ad->slider_ver);
          +elm_slider_horizontal_set(ad->slider_ver, EINA_FALSE);
          +evas_object_smart_callback_add(ad->slider_ver, "changed", _slider_changed, ad);
          +
          +ad->slider_hor = elm_slider_add(ad->win);
          +evas_object_smart_callback_add(ad->slider_hor, "changed", _slider_changed, ad);
          +
          + +

          The following figure displays the result.

          +

          Figure: Sliders added

          +

          Sliders added

          + +

          To handle the message in the Style, add the following script to the EDC file:

          + +
          +group 
          +{ 
          +   name: "main";
          +   script 
          +   {      	
          +      public message(Msg_Type:type, id, ...) 
          +      {
          +         if ((type == MSG_FLOAT_SET) && (id == 1)) 
          +         {
          +            new Float:x, Float:y;
          +            
          +            x = getfarg(2);
          +            y = getfarg(3);
          +            set_drag(PART:"rect1", x, y);
          +         }
          +      }
          +   }
          +}
          +
          + +

          This script is called when an incoming message is detected.

          + +

          Sending Messages

          + +

          Add a callback for the changed event to send a message to the Style:

          + +
          +static void
          +_slider_changed(void *data, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   Edje_Message_Float_Set *msg;
          +   
          +   msg = malloc(sizeof(*msg) + 1 * sizeof(float));
          +   msg->count = 2;
          +   msg->val[0] = elm_slider_value_get(ad->slider_hor);
          +   msg->val[1] = elm_slider_value_get(ad->slider_ver);
          +   
          +   edje_object_message_send(ad->edje_object, EDJE_MESSAGE_FLOAT_SET, 1, msg);
          +   free(msg);
          +}
          +
          + +

          The same message can be sent in the opposite direction. To send messages in EDC script (Embryo – link to Embryo), use the sent_message() function.

          + +
          +program 
          +{
          +   signal: "drag";
          +   source: "rect1";
          +   script 
          +   {
          +      new Float:x, Float:y;
          +      get_drag(PART:"rect1", x, y);
          +      send_message(MSG_FLOAT, 2, x);
          +      send_message(MSG_FLOAT, 3, y);
          +   }
          +}
          +
          + +

          2 messages are sent using the drag signal from the rect1 part.

          + +

          Add a message handler in the C code:

          + +
          +edje_object_message_handler_set(ad->edje_object, _message_handle, ad);
          +
          + +

          Add a callback:

          + +
          +static void
          +_message_handle(void *data, Evas_Object *obj, Edje_Message_Type type,
          +                int id, void *msg)
          +{
          +   Edje_Message_Float *m;
          +   appdata_s *ad = data;
          +   
          +   if (type != EDJE_MESSAGE_FLOAT) return;
          +   m = msg;
          +   if (id == 2) elm_slider_value_set(ad->slider_hor, m->val);
          +   if (id == 3) elm_slider_value_set(ad->slider_ver, m->val);
          +}
          +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_objects_n.htm b/org.tizen.ui.practices/html/native/efl/edje_objects_n.htm new file mode 100644 index 0000000..9ea2292 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_objects_n.htm @@ -0,0 +1,87 @@ + + + + + + + + + + + + + Edje Objects: Managing Layouts and Layout Components + + + + + +
          + +

          Edje Objects: Managing Layouts and Layout Components

          + + +

          You can build and handle layouts using Edje objects. An Edje object is a type of Evas object for displaying units, such as rectangles, lines, polygons, text, and images. Edje objects are only used in Edje and provide functions that deal with Edje layouts and layout components. Namely, there is no Edje object type in the source code for implementing an application. The objects are mainly layouts or themes defined by groups and parts, and declared in EDC files.

          +

          Edje provides functions for the following features:

          + +
            +
          • Handling Edje Files +

            Edje layouts are called themes and created using the EDC language. The EDC language is declarative and must be compiled before being used. The output of this compilation is an EDJ file, which can be loaded by Edje, and the result is an Edje object.

          • + +
          • Scaling Edje Objects +

            Edje enables you to build scalable interfaces. There are 2 types of scaling factors, which are set to neutral (1.0) values by default (no scaling, actual sizes): global and individual. Scaling affects the minimum and maximum values of the part sizes, which are multiplied. Font sizes are scaled, too.

          • + +
          • Using Edje Color Classes +

            To change the color and text of 2 or more parts simultaneously, you can use color classes. If parts are assigned with a color class, setting the color values to this class causes all the parts to have their colors multiplied by the values. Setting the values to a color class at a process level affects all parts with that color class, while at the object level, only the parts inside a specified object are affected.

          • + +
          • Using Edje Text Classes +

            To change the text of 2 or more parts simultaneously, you can use text classes. If parts are assigned with a text class, setting the font attributes to this class updates all these parts with the new font attributes. Setting the values to a text class at a process level affects all parts with that text class, while at the object level, only the parts inside a specified object are affected.

          • + +
          • Using Edje Perspective +

            Perspective is a graphical tool that makes 2D objects appear as 3D. The perspective can be used with all Edje objects.

          • + +
          • Managing Signals and Messages +

            Edje objects have 2 communication interfaces between the logic and GUI. You can either emit a signal from the logic to the GUI, or create handles for the signals emitted from the GUI. Signals are identified by strings. With Edje messages, you can communicate values, such as strings, float numbers, and integer numbers. Messages can also be identified by integer numbers.

          • + +
          • Managing Edje Animations +

            Edje has the ability to animate their objects. You can start, stop, play, pause, freeze, and thaw Edje animations, and check their status.

          • +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_perspective_n.htm b/org.tizen.ui.practices/html/native/efl/edje_perspective_n.htm new file mode 100644 index 0000000..31bb4d3 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_perspective_n.htm @@ -0,0 +1,486 @@ + + + + + + + + + + + + + Using Edje Perspective + + + + + +
          + +

          Using Edje Perspective

          + + +

          This tutorial demonstrates how you can create a 3D projection of a 2D object.

          +

          Edje Perspective is a graphical tool that makes 2D objects appear like they have a 3D appearance.

          +

          Edje Perspective can be used in all Edje objects to create and configure a perspective objects and to set the to an Edje object or a canvas, affecting all the objects within that have no specific perspective already defined.

          + +

          Creating the Basic Application

          +

          The perspective application has buttons to move the Edje object and change its perspective. The Edje object is a 2D object that changes its position so that the perspective point can be applied.

          + + + + + + + + + + +
          Note
          The loaded Edje object must have the perspective option enabled in its EDC source code.
          + +

          Create a simple Edje object that has 4 states: left-top, right-top, left-bottom, and right-bottom. Clicking a button emits signals into the object and makes the object move.

          + +
            +
          1. + +

            The following example implements the Edje object:

            + +
            +group 
            +{
            +   name: "example/group";
            +   min: 480 320;
            +   parts 
            +   {
            +      part 
            +      {
            +         name: "bg";
            +         type: RECT;
            +         mouse_events: 1;           
            +         description 
            +         {
            +            state: "default" 0.0;
            +         }
            +      }       
            +      part 
            +      {
            +         name: "rectangle";
            +         type: RECT;
            +         mouse_events: 0;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 255 0 0 128;
            +            rel1 
            +            {
            +               offset: -5 -5;
            +               to: "title";
            +            }
            +            rel2 
            +            {
            +               offset: 4 4;
            +               to: "title";
            +            }
            +            map 
            +            {
            +               on: 1;
            +               perspective_on: 1;
            +               rotation 
            +               {
            +                  x: 45;
            +                  y: 15;
            +               }
            +            }
            +         }
            +      }
            +      part 
            +      {
            +         name: "title";
            +         type: TEXT;
            +         mouse_events: 0;
            +         description 
            +         {
            +            state: "default" 0.0;
            +            color: 200 200 200 255;
            +            align: 0.0 0.5;
            +            rel1.relative: 0.2 0.2;
            +            rel2.relative: 0.2 0.2;
            +            text 
            +            {
            +               text: "Perspective example";
            +               font: "Sans";
            +               size: 16;
            +               min: 1 1;
            +            }
            +            map 
            +            {
            +               on: 1;
            +               perspective_on: 1;
            +               rotation 
            +               {
            +                  x: 45;
            +                  y: 15;
            +               }
            +            }
            +         }
            +         description 
            +         {
            +            state: "right" 0.0;
            +            inherit: "default" 0.0;
            +            rel1.relative: 0.5 0.2;
            +            rel2.relative: 0.5 0.2;
            +         }
            +         description 
            +         {
            +            state: "bottom" 0.0;
            +            inherit: "default" 0.0;
            +            rel1.relative: 0.2 0.8;
            +            rel2.relative: 0.2 0.8;
            +         }
            +         description 
            +         {
            +            state: "bottomright" 0.0;
            +            inherit: "default" 0.0;
            +            rel1.relative: 0.5 0.8;
            +            rel2.relative: 0.5 0.8;
            +         }
            +      }
            +   }
            +   programs 
            +   {
            +      program 
            +      {
            +         name: "move,right";
            +         signal: "move,1,0";
            +         action: STATE_SET "right" 0.0;
            +         transition: SINUSOIDAL 1.0;
            +         target: "title";
            +         after: "animation,end";
            +      }
            +      program 
            +      {
            +         name: "move,bottom";
            +         signal: "move,0,1";
            +         action: STATE_SET "bottom" 0.0;
            +         transition: SINUSOIDAL 1.0;
            +         target: "title";
            +         after: "animation,end";
            +      }
            +      program 
            +      {
            +         name: "move,bottomright";
            +         signal: "move,1,1";
            +         action: STATE_SET "bottomright" 0.0;
            +         transition: SINUSOIDAL 1.0;
            +         target: "title";
            +         after: "animation,end";
            +      }
            +      program 
            +      {
            +         name: "move,default";
            +         signal: "move,0,0";
            +         action: STATE_SET "default" 0.0;
            +         transition: SINUSOIDAL 1.0;
            +         target: "title";
            +         after: "animation,end";
            +      }
            +      program 
            +      {
            +         name: "animation,end";
            +         action: SIGNAL_EMIT "animation,end" "";
            +      }
            +   }
            +}
            +
            +
          2. + +
          3. +

            Create the application. Create a basic window widget that is going to be loaded and created in the main starting function:

            + +
            +// Window
            +ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +elm_win_conformant_set(ad->win, EINA_TRUE);
            +elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +if (elm_win_wm_rotation_supported_get(ad->win)) 
            +{
            +   int rots[4] = 
            +   {
            +      0, 90, 180, 270 
            +   };
            +   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +}
            +
            +
          4. + +
          5. +

            Add a conformant and set the main layout of the application.

            +

            The main layout is described in the EDC part and consists of 2 swallows. The first swallow has the Edje object loaded into it. The second contains a box of buttons to manipulate the perspective of the Edje object.

            + +
            +// Conformant
            +ad->conform = elm_conformant_add(ad->win);
            +elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            +elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            +evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_win_resize_object_add(ad->win, ad->conform);
            +evas_object_show(ad->conform);
            +
            +// Base layout
            +app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +ad->layout = elm_layout_add(ad->win);
            +elm_layout_file_set(ad->layout, edj_path, GRP_MAIN);
            +evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad);
            +elm_object_content_set(ad->conform, ad->layout);
            +
            +
          6. + +
          7. +

            Create the Edje object on Evas using the evas_object_evas_get() function. This function is very useful because you must operate on the canvas, but have only an object pointer to a window object.

            + +
            +Evas *evas;
            +evas = evas_object_evas_get(ad->win);
            +ad->edje_obj = edje_object_add(evas);
            +
            +
          8. + +
          9. +

            Instantiate a new Edje object by creating a new Edje smart object and returning its Evas_Object handle:

            + +
            +ad->edje_obj = edje_object_add(evas);
            +
            +
          10. + +
          11. +

            An Edje object is useless without a source file set to it, so use the edje_object_file_set() function to set the object into the main layout:

            + +
            +ad->edje_obj = edje_object_add(evas);
            +edje_object_file_set(ad->edje_obj, edj_path, "example/group");
            +evas_object_move(ad->edje_obj, 0, 0);
            +evas_object_show(ad->edje_obj);
            +elm_object_part_content_set(ad->layout, "swallow", ad->edje_obj);
            +
            + +

            Figure: Main layout with the swallow part highlighted

            +

            Main layout with the swallow part highlighted

            +
          12. + +
          13. +

            Create the actual perspective object, define its position, focal distance and Z plane position, and set it as global:

            + +
            +ad->ps = edje_perspective_new(evas);	
            +edje_perspective_set(ad->ps, 160, 320, 0, ad->focal);
            +edje_perspective_global_set(ad->ps, EINA_TRUE);
            +
            + +

            To set the perspective of the Edje object, instead of setting it as global to the entire canvas, you can use the edje_object_perspective_set() function. +

            +
          14. + +
          15. +

            Create a new perspective in the canvas by setting up the transformation for the perspective object:

            + +
            +void 
            +edje_perspective_set(Edje_Perspective * ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
            +
            + +

            This sets the parameters of the perspective transformation. X, Y, and Z values are used. The px and py points specify the infinite distance point in the 3D conversion, where all lines converge. The z0 point specifies the Z value at which there is a 1:1 mapping between spatial coordinates and screen coordinates. Any points on the Z value do not have their X and Y values modified in the transformation. The points further away (with a higher Z value) shrink into the distance, and those that are closer expand and become bigger.

            +

            The foc value determines the focal length of the camera. This is the distance between the camera lens plane and the z0 Z value. This allows for some depth control. The foc value must be greater than 0.

            +
          16. + +
          17. +

            The Swallow buttons layout part contains a box of buttons to manipulate the perspective of the loaded Edje object.

            + +

            Figure: Main layout with swallow buttons highlighted

            +

            Main layout with swallow buttons highlighted

            + +

            Add the box and pack the buttons into it. Name the first button Global and register a callback for clicking:

            + +
            +Evas_Object *box, *button;
            +// Adding box
            +box = elm_box_add(ad->layout);
            +evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            +evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            +elm_box_horizontal_set(box, EINA_TRUE);
            +evas_object_show(box);
            +elm_object_part_content_set(ad->layout, "swallow.buttons", box);
            +
            +button = elm_button_add(ad->layout);
            +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_object_text_set(button, "move");
            +evas_object_show(button);
            +elm_box_pack_end(box, button);
            +evas_object_smart_callback_add(button, "clicked", _on_btn_clicked, ad);
            +
            +button = elm_button_add(ad->layout);
            +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_object_text_set(button, "more");
            +evas_object_show(button);
            +elm_box_pack_end(box, button);
            +evas_object_smart_callback_add(button, "clicked", _on_btn_more_clicked, ad);
            +
            +button = elm_button_add(ad->layout);
            +evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_object_text_set(button, "less");
            +evas_object_show(button);
            +elm_box_pack_end(box, button);
            +evas_object_smart_callback_add(button, "clicked", _on_btn_less_clicked, ad);
            +
            +ad->edje_obj = edje_object_add(evas);
            +edje_object_file_set(ad->edje_obj, edj_path, "example/group");
            +evas_object_move(ad->edje_obj, 0, 0);
            +evas_object_show(ad->edje_obj);
            +elm_object_part_content_set(ad->layout, "swallow", ad->edje_obj);
            +
            +
          18. + +
          19. +

            Show the main window:

            + +
            +evas_object_show(ad->win);
            +
            + +

            Figure: Main screen

            +

            Figure: Main screen

            + +
          20. +
          + +

          Playing with the Perspective

          + +
            +
          1. +

            The callback for a clicked button is converted to a signal determining where the text and rectangle must be moved:

            + +
            +static void
            +_part_move(appdata_s *ad, int dx, int dy)
            +{
            +   char emission[64];
            +
            +   dlog_print(DLOG_ERROR, "AAAA", "x,y = %d, %d", dx, dy);
            +   snprintf(emission, sizeof(emission), "move,%d,%d", dx, dy);
            +   edje_object_signal_emit(ad->edje_obj, emission, "");
            +}
            +
            +
          2. + +
          3. +

            The callback representing the Edje object move calls the part_move() function that directly sends a signal to the Edje part. The moving action is treated in the program according to the passed signal.

            + +
            +static void
            +_on_btn_clicked(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   static int i = 0;
            +   switch (i) 
            +   {
            +      case 0:
            +         _part_move(ad, 1, 0);
            +         break;
            +      case 1:
            +         _part_move(ad, 1, 1);
            +         break;
            +      case 2:
            +         _part_move(ad, 0, 1);
            +         break;
            +      case 3:
            +         _part_move(ad, 0, 0);
            +         break;
            +   }
            +   i++;
            +   i = i%4;
            +}
            +
            + +

            Figure: Moving process

            +

            ->Figure: Moving process Figure: Moving process

            +
          4. + +
          5. +

            By clicking the More and Less buttons, you can increase or decrease the focal length of the camera:

            + +
            +static void
            +_on_btn_more_clicked(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   ad->focal += 5;
            +   edje_perspective_set(ad->ps, 160, 320, 0, ad->focal);
            +   edje_perspective_global_set(ad->ps, EINA_TRUE);
            +}
            +
            +static void
            +_on_btn_less_clicked(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   ad->focal -= 5;
            +   edje_perspective_set(ad->ps,160, 320, 0, ad->focal);
            +   edje_perspective_global_set(ad->ps, EINA_TRUE);
            +}
            +
            + +

            Figure: Decreasing and increasing the focal length

            + +

            Decreasing and increasing the focal length

            +
          6. +
          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/edje_scaling_n.htm b/org.tizen.ui.practices/html/native/efl/edje_scaling_n.htm new file mode 100644 index 0000000..694956d --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_scaling_n.htm @@ -0,0 +1,794 @@ + + + + + + + + + + + + + + Scaling Edje Objects + + + + + + +
          +

          Scaling Edje Objects

          + +

          This demonstrates how you can scale Edje objects. Scalability is important when building user interfaces for different environments, such as mobile phones and laptops.

          +

          The natural value of scale factors is 1.0. Scaling affects minimum and maximum part size and font size, and multiplies them.

          + +

          You can disable scaling of certain parts.

          + +

          Initializing the EDC File

          + +

          Set up and prepare the EDC source code for loading the Edje objects in your application:

          + +
            +
          1. +

            To demonstrate Edje scale usability, set up 2 groups. The first group contains only one scalable part.

            + +
            group 
            +{ 
            +   name: "scale_group_1";
            +   parts 
            +   {
            +      part
            +      { 
            +         name: "scalable_rect";
            +         type: RECT;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            min: 16 16;
            +            max: 16 16;
            +            color: 0 0 255 255;
            +         }
            +      }
            +   }
            +}
            + +

            Figure: First scalable group

            +

            First scalable group

            + +

            For this example, the group is used for showing Edje's global scale.

            + +

            The other group is used for showing usability of the edje_object_scale function. The group has 2 non-scalable parts (not_scalable_rect1 and not scalable_rect2 ), which are related to the scalable parts. It can be seen that scalability actually changes the scalable parts and all UI can be changed according to new relatives.

            + +

            Scalability of certain parts is usually preset in the EDC source code with the scale property:

            + +
            +group 
            +{ 
            +   name: "scale_group_2";
            +   parts 
            +   {
            +      part 
            +      { 
            +         name: "not_scalable_rect1";
            +         type: RECT;
            +         scale: 0;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.5;
            +            min: 40 40;
            +            max: 40 40;
            +            color: 255 0 255 255;
            +         }
            +      }
            +      part 
            +      { 
            +         name: "scalable_rect";
            +         type: RECT;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.5;
            +            min: 25 19;
            +            max: 25 19;
            +            color: 0 255 255 255;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to_x: "not_scalable_rect1";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "not_scalable_rect2";
            +         type: RECT;
            +         scale: 0;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.5;
            +            min: 40 40;
            +            max: 40 40;
            +            color: 255 0 255 255;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to_x: "scalable_rect";
            +            }
            +         }
            +      }
            +   }
            +}
            +
            + +

            Figure: Second scalable group

            +

            Second scalable group

            +
          2. + +
          3. + +

            The base_scale factor can be used when the whole collection in the EDC file contains it:

            + +
            collections 
            +{
            +   base_scale: 1.2;
            +   group 
            +   { 
            +      name: "scale_group_1";
            +   }
            +   group 
            +   { 
            +      name: "scale_group_2";
            +   }
            +   group 
            +   {
            +      name: "main_layout";
            +   }
            +}
            +
          4. + +
          5. +

            An application must contain controls, such as a spinner, to change the scale and see the result.

            + +

            Add a box with 2 groups loaded as edje objects, and spinners for changing the scale values:

            + +
            +group 
            +{ 
            +   name: "main_application";
            +   parts 
            +   {
            +      part 
            +      { 
            +         name: "edje.swallow.content";
            +         type: SWALLOW;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 1.0;
            +            rel1 
            +            {
            +               relative: 0.0 1.0;
            +               offset: 0 20;
            +               to_y: "title2";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "title1";
            +         type: TEXT;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 100 32;
            +            color: 0 0 0 255;
            +            text 
            +            {
            +               text: "edje scale:";
            +               font: "Sans";
            +               size: 16;
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "title2";
            +         type: TEXT;
            +         scale: 1;
            +         description
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 150 32;
            +            color: 0 0 0 255;
            +            rel1 
            +            {
            +               relative: 0.0 1.0;
            +               to_y: "scale.swallow";
            +            }
            +            text 
            +            {
            +               text: "edje object scale:";
            +               font: "Sans";
            +               size: 16;
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "scale.swallow";
            +         type: SWALLOW;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 200 48;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to_x: "title2";
            +               to_y: "title1";
            +            }
            +            rel2 
            +            {
            +               to_y: "title1";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "scale.swallow2";
            +         type: SWALLOW;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 200 48;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to: "title2";
            +            }
            +            rel2 
            +            {
            +               to_y: "title2";
            +            }
            +         }
            +      }
            +   }
            +}
            +
            + +

            Figure: Main application layout

            +

            Main application layout

            + +

            In the example, there are the following swallows:

            +
              +
            • edje.swallow.content is used for the box containing the Edje objects.
            • +
            • scale.swallow is used for the spinner that changes the scale value a loaded Edje object.
            • +
            • scale.swallow2 is used for the spinner that changes the global scale, so changing this value changes the scale of all Edje objects if they do not have their own scales set using the edje_object_scale_set() function.
            • +
            +
          6. +
          + +

          Initializing the Application

          + +

          All application code lays in the create_base_gui() function that creates and loads all objects and forms, and creates application's main look.

          + +
            +
          1. +

            Create a window and get the path to the EDJ file:

            + +
            +ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);   elm_win_conformant_set(ad->win, EINA_TRUE);
            +elm_win_autodel_set(ad->win, EINA_TRUE);
            +if (elm_win_wm_rotation_supported_get(ad->win))
            +{
            +   int rots[4] = 
            +   {
            +      0, 90, 180, 270
            +   };
            +   elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +}
            +// Path to edj group with three groups
            +app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +
            +
          2. + +
          3. +

            Set the conformant containing the main layout into the window:

            + +
            +ad->conform = elm_conformant_add(ad->win);
            +elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            +elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            +evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_win_resize_object_add(ad->win, ad->conform);
            +evas_object_show(ad->conform);
            +// Main layout
            +ad->main_layout = elm_layout_add(ad->win);
            +evas_object_size_hint_weight_set(ad->main_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_layout_file_set(ad->main_layout, edj_path, "main_application");
            +elm_object_content_set(ad->conform, ad->main_layout);
            +evas_object_show(ad->main_layout);
            +app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +
            + + + + + + + + + + +
            Note
            If you have layout for your window written in the EDC file, use and load it as Layout with Elementary layout API (using, for example, the elm_layout_add() , elm_object_style_set() , and elm_layout_file_set() functions).
            +
          4. + +
          5. +

            Add the box and set it into the edje.swallow.content main layout swallow:

            + +
            +// Add the box
            +ad->box = elm_box_add(ad->main_layout);
            +evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, 0.0);
            +evas_object_size_hint_align_set(ad->box, EVAS_HINT_FILL, 0.0);
            +elm_box_horizontal_set(ad->box, EINA_TRUE);
            +evas_object_show(ad->box);
            +// Set the box into the main layout
            +elm_object_part_content_set(ad->main_layout, "edje.swallow.content", ad->box);
            +
          6. + +
          7. +

            Load the Edje objects:

            + +
            +// Add group1
            +ad->edje_object_1 = edje_object_add(evas_object_evas_get(ad->win));
            +evas_object_size_hint_weight_set(ad->edje_object_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +edje_object_file_set(ad->edje_object_1, edj_path, "scale_group_1");
            +// Check object loading errors
            +if (edje_object_load_error_get(ad->edje_object_1) != EDJE_LOAD_ERROR_NONE)
            +{
            +   evas_object_del(ad->edje_object_1);
            +
            +   return;
            +}
            +evas_object_show(ad->edje_object_1);
            +
          8. + +
          9. +

            Pack the Edje objects into the box:

            + +
            +elm_box_pack_end(ad->box, ad->edje_object_1);
            +elm_box_pack_end(ad->box, ad->edje_object_2);
            +
          10. + +
          11. +

            Add 2 spinners that change the scale values:

            + +
            +ad->edje_scale = elm_spinner_add(ad->win);
            +evas_object_size_hint_weight_set(ad->edje_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(ad->edje_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +elm_spinner_min_max_set(ad->edje_scale, 1, 300);
            +elm_spinner_step_set(ad->edje_scale, 10);
            +evas_object_show(ad->edje_scale);
            +elm_spinner_value_set(ad->edje_scale, 100);
            +elm_object_part_content_set(ad->main_layout, "scale.swallow", ad->edje_scale);
            +
            +ad->edje_object_scale = elm_spinner_add(ad->win);
            +evas_object_size_hint_weight_set(ad->edje_object_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(ad->edje_object_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +elm_spinner_min_max_set(ad->edje_object_scale, 1, 300);
            +elm_spinner_step_set(ad->edje_object_scale, 10);
            +evas_object_show(ad->edje_object_scale);
            +elm_spinner_value_set(ad->edje_object_scale, 100);
            +elm_object_part_content_set(ad->main_layout, "scale.swallow2", ad->edje_scale);
            +
          12. + +
          13. Display the window:

            + +
            +evas_object_show(ad->win);
            + +

            Figure: Scale testing application

            +

            Scale testing application

            +
          14. +
          + + +

          Setting Global Scales

          + +
            +
          1. +

            Add a callback for the second spinner that changes Edje global scale value and, as a result, affects all loaded Edje objects:

            + +
            static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Add scale spinners
            +   ad->edje_object_scale = elm_spinner_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->edje_object_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(ad->edje_object_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   elm_spinner_min_max_set(ad->edje_object_scale, 1, 300);
            +   elm_spinner_step_set(ad->edje_object_scale, 10);
            +   evas_object_show(ad->edje_object_scale);
            +   elm_spinner_value_set(ad->edje_object_scale, 100);
            +   elm_object_part_content_set(ad->main_layout, "scale.swallow2", ad->edje_object_scale);
            +
            +   evas_object_smart_callback_add(ad->edje_object_scale, "changed", _on_global_scale_change, ad);
            +}
            +
          2. + +
          3. + +

            Set the scale using the edje_scale_set() function:

            + +
            static void
            +_on_global_scale_change(void *data, Evas_Object *obj, void *event_info)
            +{
            +   edje_scale_set(elm_spinner_value_get(obj) / 100);
            +}
            + +

            By clicking the spinner buttons, you can change the scale of all loaded Edje objects. The Edje object on the right has its own scale values, so global scale values do not apply to it.

            + +

            Figure: Different global scales

            +

            Different global scales

            +
          4. + +
          + + + + + + + + + +
          Note
          Using the edje_scale_set() function that changes the global scale values can affect your whole application and destroy the UI layout. Be careful with this function.
          + +

          Setting Scales for Edje Objects

          + +

          Add a callback to get the value of the first spinner and apply it to the Edje object on the right:

          + +
          static void
          +_on_scale_change(void *data, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   edje_object_scale_set(ad->edje_object_2, elm_spinner_value_get(obj) / 100);
          +}
          +
          +static void
          +create_base_gui(appdata_s *ad)
          +{
          +   // Add scale spinners
          +   ad->edje_scale = elm_spinner_add(ad->win);
          +   evas_object_size_hint_weight_set(ad->edje_scale, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   evas_object_size_hint_align_set(ad->edje_scale, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +   elm_spinner_min_max_set(ad->edje_scale, 1, 300);
          +   elm_spinner_step_set(ad->edje_scale, 10);
          +   evas_object_show(ad->edje_scale);
          +   elm_spinner_value_set(ad->edje_scale, 100);
          +   elm_object_part_content_set(ad->main_layout, "scale.swallow", ad->edje_scale);
          +   evas_object_smart_callback_add(ad->edje_scale, "changed", _on_scale_change, ad);
          +}
          + + +

          By clicking on spinner buttons, you can change the scale of the second Edje object in the box.

          + +

          Figure: Edje object scales

          +

          Edje object scales

          + + +

          Personal, Global, and Base Scales

          + +

          Modify the main layout and add a swallow for the buttons. The buttons are used for showing the current scale:

          + +
            +
          1. +

            Modify the main layout EDC code by creating another swallow part, swallow.buttons , and modifying the edje.swallow.content part:

            + +
            +group 
            +{ 
            +   name: "main_application";
            +   parts 
            +   {
            +      part 
            +      { 
            +         name: "edje.swallow.content";
            +         type: SWALLOW;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 1.0;
            +            rel1 
            +            {
            +               relative: 0.0 1.0;
            +               offset: 0 20;
            +               to_y: "title2";
            +            }
            +            rel2 
            +            {
            +               relative: 1.0 0.0;
            +               to_y: "swallow.buttons";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "title1";
            +         type: TEXT;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 100 32;
            +            color: 0 0 0 255;
            +            text 
            +            {
            +               text: "edje scale:";
            +               font: "Sans";
            +               size: 16;
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "title2";
            +         type: TEXT;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 150 32;
            +            color: 0 0 0 255;
            +            rel1 
            +            {
            +               relative: 0.0 1.0;
            +               to_y: "scale.swallow";
            +            }
            +            text 
            +            {
            +               text: "edje object scale:";
            +               font: "Sans";
            +               size: 16;
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "scale.swallow";
            +         type: SWALLOW;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 200 48;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to_x: "title2";
            +               to_y: "title1";
            +            }
            +            rel2 
            +            {
            +               to_y: "title1";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "scale.swallow2";
            +         type: SWALLOW;
            +         scale: 1;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 0.0;
            +            max: 200 48;
            +            rel1 
            +            {
            +               relative: 1.0 0.0;
            +               to: "title2";
            +            }
            +            rel2 
            +            {
            +               to_y: "title2";
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "swallow.buttons";
            +         type: SWALLOW;
            +         scale: 0;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.0 1.0;
            +            min: 0 60;
            +            max: -1 60;
            +         }
            +      }
            +   }
            +}
            +
            +
          2. + +
          3. +

            Add a box with buttons and set it into the main layout:

            + +
            static void
            +_edje_object_scale_get(void *data, Evas_Object *obj, void *event_info)
            +{
            +   char title[PATH_MAX] = {0, };
            +   appdata_s *ad = data;
            +   snprintf(title, (int)PATH_MAX, "object %.2f", edje_object_scale_get(ad->edje_object_2));
            +   elm_object_text_set(obj, title);
            +}
            +static void
            +_edje_scale_get(void *data, Evas_Object *obj, void *event_info)
            +{
            +   char title[PATH_MAX] = {0, };
            +   snprintf(title, (int)PATH_MAX, "global %.2f", edje_scale_get());
            +   elm_object_text_set(obj, title);
            +}
            +static void
            +_edje_object_base_scale_get(void *data, Evas_Object *obj, void *event_info)
            +{
            +   char title[PATH_MAX] = {0, };
            +   appdata_s *ad = data;
            +   snprintf(title, (int)PATH_MAX, "base %.2f", edje_object_base_scale_get(ad->edje_object_2));
            +   elm_object_text_set(obj, title);
            +}
            +
            +static void
            +create_base_gui(appdata_s *ad) 
            +{
            +   Evas_Object *box, *button;
            +   // Add the box
            +   box = elm_box_add(ad->main_layout);
            +   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            +   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            +   elm_box_horizontal_set(box, EINA_TRUE);
            +   evas_object_show(box);
            +   elm_object_part_content_set(ad->main_layout, "swallow.buttons", box);
            +
            +   button = elm_button_add(ad->main_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, "object ");
            +   evas_object_show(button);
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_scale_get, ad);
            +   elm_box_pack_end(box, button);
            +
            +   button = elm_button_add(ad->main_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, "global ");
            +   evas_object_show(button);
            +   evas_object_smart_callback_add(button, "clicked", _edje_scale_get, ad);
            +   elm_box_pack_end(box, button);
            +
            +   button = elm_button_add(ad->main_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, "base ");
            +   evas_object_show(button);
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_base_scale_get, ad);
            +   elm_box_pack_end(box, button);
            +}
            + + +

            Clicking a button gets a specific scale and prints its value on the button. For example, clicking the Global button shows the global scale value.

            + +

            Figure: Scale values

            +

            Scale values

            +
          4. + +
          5. +

            The loaded Edje object does not have its own scale value (0.00), so it uses the global scale value defined in the EFL configuration based on the device. A mobile device that is being used here, has the global scale ~1.8). The base scale is set to 1.2.

            + +
            collections 
            +{
            +   base_scale: 1.2;
            +   group 
            +   { 
            +      name: "scale_group_1";
            +   }
            +   group 
            +   { 
            +      name: "scale_group_2";
            +   }
            +   group 
            +   { 
            +      name: "main_layout";
            +   }
            +}
            + +

            Figure: Scale values after changing the Edje object scale

            +

            Figure: Scale values after changing the Edje object scale

            + +

            After applying the scale of the new object, the global scale does not apply to this Edje object anymore. While all other objects have the scale value 1.8, the new object has the scale value 1.37.

            + + + + + + + + + + +
            Note
            The default base scale value is 1.0. All scale values in Edje objects, either set with the global scale value using the edje_scale_set() function or with a personal scale factor using the edje_object_scale_set() function are divided by base scale.
            + +

            Figure: Base scale

            +

            Base scale

            + +

            Setting a scale value that is same as the base scale makes the layout appear as if it had the scale value 1.0.

            +
          6. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/edje_text_n.htm b/org.tizen.ui.practices/html/native/efl/edje_text_n.htm new file mode 100644 index 0000000..f37599a --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/edje_text_n.htm @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + Using Edje Text Classes + + + + + + +
          +

          Using Edje Text Classes

          + +

          This tutorial demonstrates how you can change the text of 2 or more parts using Edje text classes.

          +

          If a part is assigned with a text class, setting font attributes to this class updates all those parts with the new font attributes. Setting the values to a text class affects all parts in that text class at process level, while at the object level, it only affects the parts inside a specified object.

          + +

          Creating the Basic Application

          + +

          The example application has 2 screen with different UIs. The screens demonstrate different text class APIs. The screen contains a genlist with 2 items set into a naviframe. Clicking an item opens displays a screen. Pressing the hardware Back button displays the main screen with the genlist.

          + +
            +
          1. Create the basic application: + +
            static void
            +win_back_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   elm_naviframe_item_pop(ad->navifr);
            +}
            +
          2. + +
          3. +

            Get the path to the EDC file that contains the main layout and the Edje object to load:

            + +
            static void
            +app_get_resource(const char *edj_file_in, char *edj_path_out, int edj_path_max)
            +{
            +   char *res_path = app_get_resource_path();
            +   if (res_path) 
            +   {
            +      snprintf(edj_path_out, edj_path_max, "%s%s", res_path, edj_file_in);
            +      free(res_path);
            +   }
            +}
            + +

            Create a window and register an event callback that calls the win_back_cb() function after pressing the Back button on the device:

            + +
            static void
            +create_base_gui(appdata_s *ad)
            +{
            +   Elm_Object_Item *eoi = NULL;
            +
            +   // Window
            +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +   elm_win_conformant_set(ad->win, EINA_TRUE);
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   if (elm_win_wm_rotation_supported_get(ad->win)) 
            +   {
            +      int rots[4] = {0, 90, 180, 270};
            +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +   }
            +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
            +}
            +
            +
          4. + +
          5. +

            Add a conformant that contains the naviframe and genlist. Add item selection callbacks for the genlist items to show different screens:

            + +
            static char *
            +_genlist_item_text_get(void *data, Evas_Object *obj, const char *part)
            +{
            +   Eina_Stringshare *text_class = (Eina_Stringshare *)data;
            +   if (strcmp(part, "elm.text") == 0)
            +      return strdup(text_class);
            +   else
            +      return NULL;
            +}
            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Conformant
            +   ad->conform = elm_conformant_add(ad->win);
            +   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
            +   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
            +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(ad->win, ad->conform);
            +   evas_object_show(ad->conform);
            +
            +   // Naviframe
            +   ad->navifr = elm_naviframe_add(ad->win);
            +   elm_object_content_set(ad->conform, ad->navifr);
            +   eext_object_event_callback_add(ad->navifr, EEXT_CALLBACK_BACK, eext_naviframe_back_cb, ad);
            +
            +   // Genlist
            +   ad->itc = elm_genlist_item_class_new();
            +   ad->itc->func.text_get =_genlist_item_text_get;
            +
            +   ad->genlist = elm_genlist_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +
            +   eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Text Class List"), NULL,
            +                                 ELM_GENLIST_ITEM_NONE, NULL, ad);
            +   eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Object Text Class API"), NULL,
            +                                 ELM_GENLIST_ITEM_NONE, NULL, ad);
            +   elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
            +
            +   // Show the window
            +   evas_object_show(ad->win);
            +}
            + + +

            The following figure shows the result.

            + +

            Figure: Main screen

            +

            Main screen

          6. +
          + +

          Getting, Deleting, and Displaying Text Classes

          + +

          The first screen of the application shows an example of the edje_text_class_del(), edje_text_class_list(), and edje_text_class_get() functions.

          + +

          The following code implements the layout:

          + +
          +group 
          +{ 
          +   name: "class_list_application";
          +   parts 
          +   {
          +      part 
          +      { 
          +         name: "text_view";
          +         type: TEXT;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            visible: 1;
          +            color: 0 0 0 255;
          +            align: 0.5 0.0;
          +            text 
          +            {
          +               text: "text part number 3";
          +               font: "Sans";
          +               min: 1 1;
          +               max: 1 1;
          +               size: 20;
          +            }
          +         }
          +      }
          +      part 
          +      { 
          +         name: "edje.swallow.list";
          +         type: SWALLOW;
          +         description
          +         { 
          +            state: "default" 0.0;
          +            align: 0.5 0.0;
          +            color: 0 0 0 255;
          +            rel1 
          +            {
          +               relative: 0.0 1.0;
          +               to_y: "text_view";
          +            }
          +         }
          +      }
          +   }
          +}
          +
          + +

          Figure: First screen EDC layout

          +

          First screen EDC layout

          + +

          The first part (text_view) shows the properties of the selected text class. Clicking a text class in the genlist shows its properties, such as font, size, and name in the text part.

          + +
            +
          1. +

            Add the base genlist:

            + +
            +ad->genlist = elm_genlist_add(ad->win);
            +evas_object_size_hint_weight_set(ad->genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Text Class List"), NULL, 
            +                              ELM_GENLIST_ITEM_NONE, _create_class_list_gui, ad);
            +eoi = elm_genlist_item_append(ad->genlist, ad->itc, eina_stringshare_add("Object Text Class API"), 
            +                              NULL, ELM_GENLIST_ITEM_NONE, NULL, ad);
            +elm_naviframe_item_simple_push(ad->navifr, ad->genlist);
            +
            +
          2. + +
          3. +

            Load the layout:

            + +
            static void
            +_create_class_list_gui(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data; // Get application's data
            +   char edj_path[PATH_MAX] = {0, }; // path to edc file
            +   Eina_List *l;  //  Used later
            +   const char *str; // Used later
            +   Elm_Object_Item *eoi = NULL; // Used later
            +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +
            +   // Main layout
            +   ad->gui1_layout = elm_layout_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->gui1_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_layout_file_set(ad->gui1_layout, edj_path, "class_list_application");
            +}
            +
            +
          4. + +
          5. +

            Get a list of all text classes loaded into the system.In the following example, the Eina_List list is a field in application data.

            + +
            ad->list = edje_text_class_list();
            +
          6. + +
          7. +

            Create the genlist:

            + +
            // Genlist
            +ad->itc_text_classes = elm_genlist_item_class_new();
            +ad->itc_text_classes->func.text_get =_genlist_item_text_get;
            +
            +ad->genlist_text_classes = elm_genlist_add(ad->win);
            +evas_object_size_hint_weight_set(ad->genlist_text_classes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +
            +
          8. + +
          9. +

            Go through the text class list and insert each text class to the genlist. Set the genlist into the main layout of the current screen and show it in the naviframe:

            + +
            +EINA_LIST_FOREACH(ad->list, l, str)
            +{
            +   eoi = elm_genlist_item_append(ad->genlist_text_classes, ad->itc_text_classes, str, NULL, ELM_GENLIST_ITEM_NONE, NULL, ad);
            +   elm_object_item_data_set(eoi, (void *)str);
            +}
            +elm_object_part_content_set(ad->gui1_layout, "edje.swallow.list", ad->genlist_text_classes);
            +evas_object_show(ad->genlist_text_classes);
            +elm_naviframe_item_simple_push(ad->navifr, ad->gui1_layout);
            +
            + + +

            Clicking Text Class List displays the screen with a genlist of text classes.

            + +

            Figure: Text class list

            +

            Text class list

            +
          10. + +
          11. +

            The edje_text_class_del() function deletes a text class (in the following example, T094):

            + +
            +// Main layout
            +ad->gui1_layout = elm_layout_add(ad->win);
            +evas_object_size_hint_weight_set(ad->gui1_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_layout_file_set(ad->gui1_layout, edj_path, "class_list_application");
            +evas_object_show(ad->gui1_layout);
            +
            +// Get the collection list
            +app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +edje_text_class_del("T094");
            +ad->list = edje_text_class_list();
            +
            +// Genlist
            +ad->itc_text_classes = elm_genlist_item_class_new();
            +ad->itc_text_classes->func.text_get =_genlist_item_text_get;
            +
            + +

            Figure: Text class list after deleting a class

            +

            Text class list after deleting a class

            +
          12. + +
          13. +

            Every text class contains specific information, such as the font name, font size, and text class name. To show the properties when the text class name is clicked, create a callback that uses the edje_text_class_get() function:

            + +
            static void
            +_genlist_clicked(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   char text_class[PATH_MAX] = {0, };
            +   Elm_Object_Item *eoi = NULL;
            +   const char *str;
            +   char *font;
            +   Evas_Font_Size size;
            +
            +   eoi = elm_genlist_selected_item_get(obj);
            +   str = elm_object_item_data_get(eoi);
            +   edje_text_class_get(str, &font, &size);
            +   snprintf(text_class, PATH_MAX, "%s font{%s} size{%d}", str, font, size);
            +   elm_object_part_text_set(ad->gui1_layout, "text_view", text_class);
            +}
            +
          14. + +
          15. +

            Register the added callback function in the genlist:

            + +
            +EINA_LIST_FOREACH(ad->list, l, str)
            +{
            +   eoi = elm_genlist_item_append(ad->genlist_text_classes, ad->itc_text_classes, str, NULL, ELM_GENLIST_ITEM_NONE, _genlist_clicked, ad);
            +   elm_object_item_data_set(eoi, (void *)str);
            +}
            +elm_object_part_content_set(ad->gui1_layout, "edje.swallow.list", ad->genlist_text_classes);
            +
            +evas_object_show(ad->genlist_text_classes);
            +elm_naviframe_item_simple_push(ad->navifr, ad->gui1_layout);
            +
            + +

            Figure: Displaying text class properties

            +

            Displaying text class properties

            +
          16. +
          + + +

          Application Layout

          + +

          The second screen contains 2 Edje object with text parts containing the custom_text_class text class. When a text class is modified, all text parts assigned to it are changed as well.

          + +

          The following example shows a simple Edje object layout:

          + +
          +group 
          +{ 
          +   name: "edje_example";
          +   parts 
          +   {
          +      part 
          +      { 
          +         name: "text_example";
          +         type: TEXT;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            visible: 1;
          +            color: 0 0 0 255;
          +            text 
          +            {
          +               text: "text part number 3";
          +               font: "Sans";
          +               size: 10;
          +               text_class: "custom_text_class";
          +            }
          +         }
          +      }
          +   }
          +}
          + +
            +
          1. +

            After loading the Edje objects, add a spinner for changing the font size.

            + +

            Add 2 buttons for changing the text class of a specific object or setting the font size of the custom_text_class text class. The Set1 button sets a new size for the text class of the first Edje object and the Set2 button for the second object, respectively.

            + +

            The Get1 and Get2 buttons get the text class properties and display them on the screen.

            +

            The Global button changes the text class globally, causing all Edje object parts to be changed in case they contain the custom_text_class text class.

            + +
            +group 
            +{ 
            +   name: "class_list_application";
            +   parts 
            +   {
            +      part 
            +      { 
            +         name: "text_view";
            +         type: TEXT;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            visible: 1;
            +            color: 0 0 0 255;
            +            align: 0.5 0.0;
            +            text 
            +            {
            +               text: "text part number 3";
            +               font: "Sans";
            +               min: 1 1;
            +               max: 1 1;
            +               size: 20;
            +            }
            +         }
            +      }
            +      part 
            +      { 
            +         name: "edje.swallow.list";
            +         type: SWALLOW;
            +         description 
            +         { 
            +            state: "default" 0.0;
            +            align: 0.5 0.0;
            +            color: 0 0 0 255;
            +            rel1 
            +            {
            +               relative: 0.0 1.0;
            +               to_y: "text_view";
            +            }
            +      }
            +   }
            +}
            +
            +
          2. + +
          3. +

            Create a view for the new screen:

            + +
            static void
            +_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   char edj_path[PATH_MAX] = {0, };
            +
            +   app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
            +
            +   // Main Layout
            +   ad->gui2_layout = elm_layout_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->gui2_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_layout_file_set(ad->gui2_layout, edj_path, "object_text_class_application");
            +   evas_object_show(ad->gui2_layout);
            +
            +   // Add group1
            +   ad->edje_object_1 = edje_object_add(evas_object_evas_get(ad->win));
            +   evas_object_size_hint_weight_set(ad->edje_object_1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   edje_object_file_set(ad->edje_object_1, edj_path, "edje_example");
            +   // Check the object loading error
            +   if (edje_object_load_error_get(ad->edje_object_1) != EDJE_LOAD_ERROR_NONE)
            +   {
            +      evas_object_del(ad->edje_object_1);
            +
            +      return;
            +   }
            +   evas_object_show(ad->edje_object_1);
            +   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.group1", ad->edje_object_1);
            +
            +   // Addgroup2
            +   ad->edje_object_2 = edje_object_add(evas_object_evas_get(ad->win));
            +   evas_object_size_hint_weight_set(ad->edje_object_2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   edje_object_file_set(ad->edje_object_2, edj_path, "edje_example");
            +   // Check object loading errors
            +   if (edje_object_load_error_get(ad->edje_object_2) != EDJE_LOAD_ERROR_NONE)
            +   {
            +      evas_object_del(ad->edje_object_2);
            +
            +      return;
            +   }
            +   evas_object_show(ad->edje_object_2);
            +   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.group2", ad->edje_object_2);
            +
            +   // Add spinner
            +   ad->spinner = elm_spinner_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->spinner, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(ad->spinner, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   elm_spinner_min_max_set(ad->spinner, 1, 64);
            +   elm_spinner_step_set(ad->spinner, 1);
            +   evas_object_show(ad->spinner);
            +   elm_spinner_value_set(ad->spinner, 10);
            +   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.spinner", ad->spinner);
            +   elm_naviframe_item_simple_push(ad->navifr, ad->gui2_layout);
            +}
            + + +

            Figure: Second application screen

            +

            Second application screen

          4. +
          + +

          Setting the Text Class for All Edje Objects

          + +

          To set the text class globally, use the edje_test_class_set() function:

          + +
            +
          1. +

            Add a box and pack the buttons into it. Add the Global button and register a callback for clicking:

            + +
            static void
            +_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *box, *button;
            +   // Add the box
            +   box = elm_box_add(ad->gui2_layout);
            +   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
            +   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
            +   elm_box_horizontal_set(box, EINA_TRUE);
            +   evas_object_show(box);
            +
            +   button = elm_button_add(ad->gui2_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, "Global");
            +   evas_object_show(button);
            +   evas_object_smart_callback_add(button, "clicked", _edje_text_class_set, ad);
            +   elm_box_pack_end(box, button);
            +
            +   elm_object_part_content_set(ad->gui2_layout, "edje.swallow.buttons", box);
            +
            +   elm_naviframe_item_simple_push(ad->navifr, ad->gui2_layout);
            +}
            +
          2. + +
          3. +

            The callback contains functions for setting the text class globally:

            + +
            static void
            +_edje_text_class_set(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   edje_text_class_set("custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            +}
            + +

            Clicking the Global button recalculates all text parts in every Edje object that contains the custom_text_class text class and changes their size.

            + + +

            Figure: Changing the text class globally

            +

            Changing the text class globally

          4. + +
          + +

          Setting the Text Class of a Specific Object

          + +

          To set the text class of a specific Edje object, use the edje_object_test_class_set() function.

          + +
            +
          1. +

            Add 2 more buttons, Set1 and Set2.

            +

            The first button sets the text class of the first Edje object on the left, and the second sets the text class of the other object, respectively.

            + +
            static void
            +_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            +{
            +   button = elm_button_add(ad->gui2_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, Set1);
            +   evas_object_show(button);
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_set_1, ad);
            +   elm_box_pack_end(box, button);
            +
            +   button = elm_button_add(ad->gui2_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, Set2);
            +   evas_object_show(button); 
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_set_2, ad);
            +   elm_box_pack_end(box, button);
            +}
            +
          2. + +
          3. +

            Add callbacks:

            + +
            static void
            +_edje_object_text_class_set_1(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   edje_object_text_class_set(ad->edje_object_1, "custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            +}
            +
            +static void
            +_edje_object_text_class_set_2(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   edje_object_text_class_set(ad->edje_object_2, "custom_text_class", "Sans", elm_spinner_value_get(ad->spinner));
            +}
            +
          4. + +
          5. +

            Test the functionality:

            + +
              +
            1. Set the size of the left object to 16. + +

              Font size 16

            2. + +
            3. Set the size of the right object to 44. + +

              Font size 44

            4. + +
            5. Set the size of the right object to 22. + +

              Font size 22

            6. +
            +
          6. +
          + + +

          Getting the Text Class of an Object

          + +

          To get the text class of a specific Edje object, use the edje_object_test_class_get() function.

          + +
            +
          1. +

            Add 2 more buttons, Get1 and Get2. The first gets the text class of the first Edje object on the left and sets into that object result, and the second gets the text class of the other object, respectively.

            + +
            static void
            +_create_text_class_gui(void *data, Evas_Object *obj, void *event_info)
            +{
            +   button = elm_button_add(ad->gui2_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, Get1);
            +   evas_object_show(button); 
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_get_1, ad);
            +   elm_box_pack_end(box, button);
            +
            +   button = elm_button_add(ad->gui2_layout);
            +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_object_text_set(button, Get2);
            +   evas_object_show(button); 
            +   evas_object_smart_callback_add(button, "clicked", _edje_object_text_class_get_2, ad);
            +   elm_box_pack_end(box, button);
            +}
            +
          2. + +
          3. +

            Add callbacks:

            +
            static void
            +_edje_object_text_class_get_1(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   char *font;
            +   Evas_Font_Size size;
            +   char text_class[PATH_MAX] = {0, };
            +
            +   edje_object_text_class_get(ad->edje_object_1, "custom_text_class", &font, &size);
            +   snprintf(text_class, PATH_MAX, "font{%s} size{%d}", font, size);
            +   edje_object_part_text_set(ad->edje_object_1, "text_example", text_class);
            +}
            +
            +static void
            +_edje_object_text_class_get_2(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   char *font;
            +   Evas_Font_Size size;
            +   char text_class[PATH_MAX] = {0, };
            +
            +   edje_object_text_class_get(ad->edje_object_2, "custom_text_class", &font, &size);
            +   snprintf(text_class, PATH_MAX, "font{%s} size{%d}", font, size);
            +   edje_object_part_text_set(ad->edje_object_2, "text_example", text_class);
            +}
            + + +

            The following figure shows the result.

            + +

            Figure: Displaying text class changes

            +

            Displaying text class changes

            + + +

            Changing the custom_text_class for the first object changed its font size to 16 size, while changing the custom_text_class for the second object changes its font size to 22.

          4. +
          + + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/efl_overview_n.htm b/org.tizen.ui.practices/html/native/efl/efl_overview_n.htm new file mode 100644 index 0000000..3e89915 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/efl_overview_n.htm @@ -0,0 +1,135 @@ + + + + + + + + + + + + + EFL Overview: Getting Started with EFL UI Programming + + + + + +
          + +

          EFL Overview: Getting Started with EFL UI Programming

          + +

          EFL stands for Enlightenment Foundation Libraries. Enlightenment is a project consisting of the Enlightenment window manager, EFL libraries, and various utilities and applications. The Enlightenment team needed powerful libraries to handle, among others, rendering, main loops, and events, so EFL was introduced during the development of the Enlightenment window manager to fill these gaps. EFL is now widely used outside of the Enlightenment window manager.

          + +

          EFL Features

          + +

          The general UI design features include:

          +
            +
          • UI component support +

            You can use basic core UI components, such as buttons, genlists, and sliders, and also create a layout for the Tizen native application by using container UI components.

          • +
          • Theme support +

            You can create and change a theme that is a preset package containing graphical details. Tizen supports specifying the UI look and feel through a default theme.

          • +
          • Font settings +

            Tizen supports various methods to change the font of your application to another system default font or your own font.

          • +
          • Scalability +

            Elementary provides a way to scale UI components in order to be comfortably used with a finger and to make the text more readable.

          • +
          • Event handling and main loop +

            The user interface relies on callbacks designed to react to EFL events generated by the system or the user. You can handle various events, from low-level Ecore system events to Evas smart object events that happen on object collections.

            +

            The Ecore library provides a main loop abstraction that gets you data when it is available and sends you events. You can handle the main loop and use threads with the Ecore main loop.

          • +
          • UI animating with animators and effects +

            Tizen supports various methods to create animations and effects in your application.

          • +
          • Data types and tools support +

            Tizen supports a core library for data types and some useful tools.

          • +
          • Hardware input event support +

            Tizen supports the handling of hardware input events.

          • +
          + +

          EFL Characteristics

          + +

          EFL is aimed at not only desktop computers but also touch-screen and embedded devices, making EFL applications portable to many different types of devices. Applications do not need to care about the types of devices and profiles they run on. Instead of changing the code, it is typically enough to simply configure the applications for different devices.

          + +

          The key characteristics of EFL include:

          + +
            +
          • Performance +

            The main reason Tizen adopted EFL as its native toolkit is its speed. EFL is highly optimized by using a scene graph and retained-mode rendering. EFL is fast even in software rendering.

          • +
          • Small memory footprint +

            Despite its fast performance, EFL's memory footprint is smaller than that of other toolkits with similar features. A small memory footprint is useful in the embedded world, since embedded devices do not normally have much memory.

          • +
          • Back-end engine support +

            EFL supports several back-end engines, such as X11 (OpenGL, Xlib, Xcb), Wayland (OpenGL, SHM), Direct Framebuffer, DRM, memory buffers, PS3 native, Windows, and Mac OS. Applications do not need to deal with each back-end engine separately.

          • +
          • GUI and logic separation +

            EFL supports GUI layout and logic separation by having the layout description in a plain text file and the logic code in the C or C++ source files.

          • +
          • Themeable +

            An EFL theme can be changed at runtime without restarting the application. UI components are customizable so that each application can create its own customized theme to overlay above the default theme, adding customized versions of UI components to achieve a specific look and feel.

          • +
          • Scalable +

            EFL supports a scale factor that affects the size of objects in the application at runtime. By configuring the scale factor, applications can scale up and down as needed. The scale factor also supports a default setting that allows applications to scale nicely out-of-the-box.

          • +
          • Animations +

            EFL supports different types of animations. Evas supports Evas maps with low-level APIs for performing 2D, 2.5D, and 3D object transformations. Edje supports pre-defined transitions and wrapping of Evas maps. Elementary supports transit APIs for various types of animations, which can be combined.

          • +
          • Hardware acceleration +

            EFL supports OpenGL® and OpenGL-ES acceleration.

          • +
          + + +

          EFL Libraries

          + +

          The EFL are a set of layered libraries, as shown in the following diagram:

          + +

          Figure: EFL layers

          +

          EFL layers

          + +

          When you create a basic EFL application, you use the following main libraries as a basis:

          + +
            +
          • Elementary is the top-most library with which you create your EFL application. It provides all the functions you need to create a window, create simple and complex layouts, manage the life cycle of a view, and add UI components. The full list of UI components that can be used in Tizen can be found in Mobile UI Components and Wearable UI Components.
          • +
          • Edje is the library used by Elementary to provide a powerful theme. You can also use Edje to create your own objects and use them in your application. You may also want to extend the default theme. You will find more information about Edje and the EDC format in Themes and Customizing Components.
          • +
          • Ecore is the library which manages the main loop of your application. The main loop is one of the most important concepts you need to know about to develop an application. The main loop is where events are handled, and where you interact with the user through the callback mechanism. The main loop mechanisms are explained in the Handling the Main Loop guide.
          • +
          • Evas is the canvas engine. Evas is responsible for managing the drawing of your content. All graphical objects that you create are Evas objects. Evas handles the entire state of the window by filling the canvas with objects and manipulating their states. In contrast to other canvas libraries, such as Cairo, OpenGL, and XRender, Evas is not a drawing library but a scene graph library that retains the state of all objects. The Evas concept is explained in Evas Rendering Concept and Method. Evas objects are created and then manipulated until they are no longer needed, at which point they are deleted. This allows the developer to work in the same terms that a designer thinks in: it is a direct mapping, as opposed to having to convert the concepts into drawing commands in the right order, calculate minimum drawing calls needed to get the job done, and so on.
          • +
          • Eina is the basis of all the EFL libraries. Eina is a toolbox that implements an API for data types in an efficient way. It contains all the functions needed to create lists and hashes, manage shared strings, open shared libraries, and manage errors and memory pools. Eina concepts are explained in Data Types and Tools.
          • +
          + +

          The EFL include more than just the above libraries, but the above are the most important libraries to get started with. The other libraries, such as Eet, Embryo, and Emotion, will be explored later in the programming guides and the API Reference (in mobile and wearable applications).

          + +

          The Hello World example shows you how to develop your first application with the EFL.

          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/elementary_animation_n.htm b/org.tizen.ui.practices/html/native/efl/elementary_animation_n.htm new file mode 100644 index 0000000..2dc4ea5 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/elementary_animation_n.htm @@ -0,0 +1,872 @@ + + + + + + + + + + + + + Elementary Animations + + + + + +
          + +

          Elementary Animations

          + +

          Elementary transitions (Elm_Transit) allow you to apply various transition effects, such as translation and rotation, to Evas objects. Elementary transitions are mostly based on Ecore animators, but provide some transition methods at a higher level of abstraction. Elementary transitions provide a simpler way of animating objects than Ecore animators or Edje animations.

          + +

          To use Elementary transitions, you must create an Elm_Transit object and define the desired transitions using the methods of this object. After the transitions are registered, they will be automatically managed: their callback functions will be called for the set duration, and they will be deleted upon completion.

          + +

          Use Elementary transitions only when Edje animations are not sufficient. Edje animations are better at handling transitions, have more flexibility, and can be manipulated inside themes. The only drawback is that Edje animations have their own definition language. If you want to code with the C language, use Elementary transitions.

          + +

          Getting Started

          +

          The first thing you need to do when creating an transition with Elm_Transit is to build your transit object using the elm_transit_add() function:

          + +
          Elm_Transit *transit = elm_transit_add();
          + +

          You now have an Elm_Transit instance that will allow you to perform transitions on one or more objects. The transit object holds the information about the target objects and the transition effects that will be used. The transit object also contains information about animation duration, number of repetitions, auto-reverse, and so on. The transit object starts playing as soon as the application enters the main loop.

          + +

          Adding Objects to an Animation

          + +

          You can add your Evas objects to your transition using the elm_transit_object_add() function:

          + +
          elm_transit_object_add(Elm_Transit *transit, Evas_Object *obj)
          + +

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the Evas object to animate.

          + + + + + + + + + + +
          Note

          The Evas object can be a low-level component, such as a rectangle, but also a UI component, such as a button, image, or calendar.

          +

          If you want to animate an Evas object handled by a container, such as a box, you need to either unpack the object before the animation or animate the whole container.

          + +

          If you want to know which objects are currently in your transition, use the elm_transit_objects_get() function. You will get a list of all the objects that are subject to the transition.

          + +

          At any time, you can remove objects from the transition:

          + +
          elm_transit_object_remove(Elm_Transit *transit, Evas_Object *obj)
          + +

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the Evas object to remove from the transition.

          + + + + + + + + + + +
          Note
          After you have added at least one Evas object to your transition, if the list of objects gets emptied somehow, be it because the transition has been terminated or all objects have been deleted, the transition will be automatically deleted. Otherwise, you will have to delete the transition by yourself using the elm_transit_del() function. If you delete the transit while the transition is running, the transition will stop.
          + +

          Adding Images to an Animation

          + +

          If you do not want to manage UI components for animating images, Elm_Transit provides a helper function for directly manipulating images:

          + +
          +elm_transit_effect_image_animation_add(Elm_Transit *transit, Eina_List *images)
          +
          + +

          The first argument is the Elm_Transit instance that handles the transition. The second argument is a list of the image paths.

          + + + + + + + + + + +
          Note
          This list and its contents will be deleted after the effect ends by the elm_transit_effect_image_animation_context_free() function.
          + +

          You can now define your image transitions exactly the same way as with any Evas object.

          + +

          The following example shows how to use Elm_Transit with images:

          + +
          char buf[PATH_MAX];
          +Eina_List *images = NULL;
          +Elm_Transit *transit = elm_transit_add();
          +snprintf(buf, sizeof(buf), "%s/images/btn_default.png", PACKAGE_DATA_DIR);
          +images = eina_list_append(images, eina_stringshare_add(buf));
          +snprintf(buf, sizeof(buf), "%s/images/btn_hover.png", PACKAGE_DATA_DIR);
          +images = eina_list_append(images, eina_stringshare_add(buf));
          +elm_transit_effect_image_animation_add(transit, images);
          + +

          Animation Duration

          + +

          With Elm_Transit, setting the transition duration is mandatory. To set the duration, use the elm_transit_duration_set() function:

          + +
          elm_transit_duration_set(Elm_Transit *transit, double duration)
          + +

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the duration in seconds.

          + + + + + + + + + + +
          Note
          The purpose of Elm_Transit is to abstract the low-level details of object interpolation, so you cannot create an infinite transition by specifying the duration. However, you can make your transition last forever using the repeat function.
          + +

          The following example shows how to make a complete revolution of the target Evas object in 2 seconds:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_rotation_add(transit, 0.0, 360);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_go(transit);
          +
          + +

          To get the duration of the transition, use the elm_transit_duration_get() function.

          + +

          Animation Acceleration Mode ("Tween Mode")

          + +

          Elm_Transit supports a number of built-in interpolation methods. By default, all interpolations are linear. If you want to change the animation's dynamics, use the elm_transit_tween_mode_set() function:

          + +
          elm_transit_tween_mode_set(Elm_Transit *transit, Elm_Transit_Tween_Mode tween_mode)
          + +

          The first argument is the Elm_Transit instance that handles the transition. The second argument is the tween mode of the transition, which can be one of the following:

          +
            +
          • ELM_TRANSIT_TWEEN_MODE_LINEAR: The default mode.
          • +
          • ELM_TRANSIT_TWEEN_MODE_SINUSOIDAL: The transition starts with acceleration and ends with deceleration.
          • +
          • ELM_TRANSIT_TWEEN_MODE_DECELERATE: The transition decelerates over time.
          • +
          • ELM_TRANSIT_TWEEN_MODE_ACCELERATE: The transition accelerates over time.
          • +
          • ELM_TRANSIT_TWEEN_MODE_BEZIER_CURVE: The transition uses an interpolated cubic-bezier curve adjusted with parameters.
          • +
          + +

          To get the current tween mode, use the elm_transit_tween_mode_get() function.

          + +

          Animation Repeat

          + +

          To set a transition to repeat, use the elm_transit_repeat_times_set() function:

          + +
          elm_transit_repeat_times_set(Elm_Transit *transit, int repeat)
          + +

          The function takes the following arguments:

          +
            +
          • The transition you want to repeat.
          • +
          • The number of times the transition repeats.
          • +
          + + + + + + + + + + +
          Note
          If the repeat argument is set to 0, the transition will not loop at all. If set to 1, the transition will run twice. If set to a negative value, the transition will repeat forever.
          + +

          To get the repeat value, use the elm_transit_repeat_times_get() function. The default value is 0.

          + +

          The following example shows how to make an Evas object spin for 3 complete revolutions in 6 seconds:

          + +
          Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_rotation_add(transit, 0.0, 360);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_repeat_set(transit, 3.0);
          +elm_transit_go(transit);
          + +

          Animation Auto-reverse

          + +

          Elm_Transit provides a helper function for automatically reversing the transition once it finishes:

          + +
          elm_transit_auto_reverse_set(Elm_Transit *transit, Eina_Bool reverse)
          + +

          The first argument is the transition you want to reverse. The second argument is the reverse state. If the reverse state is set to EINA_TRUE, this function will perform the same transition backwards as soon as the first transition is complete.

          + + + + + + + + + + +
          Note
          +

          Reversing the transition doubles the duration of the transition. Moreover, if the transition is set to repeat, the transition will run back and forth until the repeat count is finished.

          +

          You can calculate the duration as follows if both auto-reverse and repeat are set: 2 * duration * repeat.

          +
          + +

          The following example shows how to make an object perform half a turn and then reverse the animation to its original position in 4 seconds:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_rotation_add(transit, 0.0, 360);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_auto_reverse_set(transit, EINA_TRUE);
          +elm_transit_go(transit);
          +
          + +

          To determine whether the auto-reverse mode is enabled, use the elm_transit_auto_reverse_get() function.

          + +

          Transitions

          + +

          We distinguish two main transition types:

          +
            +
          • Transitions that are applied to the properties of objects, such as position, size, angle, and color.
          • +
          • Transitions from one object to another, where the first object is hidden to let the second one appear.
          • +
          +

          All transitions are based on the same principle: we set the starting and the ending values for the properties we want to animate, we then set the lifespan of the animation, and finally we inquire the preferred interpolation method (such as linear, acceleration, or bounce).

          + +

          You must declare the transitions after the parent window has been created, since the transition effects make use of the geometric properties of the parent window. If the parent window does not yet exist when calculating the interpolation, the interpolation may end up being based on wrong information.

          + +

          Built-in Transitions

          + +

          Elm_Transit provides several built-in transition definitions that are useful for the most common cases, so you that will not have to code them from scratch.

          + +

          All these built-in effects are implemented as follows:

          + +
          Elm_Transit *transit = elm_transit_add();
          +elm_transit_effect_add(transit,
          +                       elm_transit_effect_translation_op,
          +                       elm_transit_effect_translation_context_new(),
          +                       elm_transit_effect_translation_context_free);
          + +
            +
          • transit: The Elm_Transit object that contains the target Evas objects and all the information needed to setup the transition.
          • +
          • elm_transit_effect_translation_op: The callback function that performs the transition (resizing interpolation in this example).
          • +
          • elm_transit_effect_translation_context_new(): The callback function that returns the context used in the transition for calculations. In this example, the context is the coordinates of the before and after objects.
          • +
          • elm_transit_effect_translation_context_free: The callback function that frees up the memory once the transition is complete.
          • +
          + +

          All the definitions above can be rewritten as follows:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_effect_translation_add(transit, from_x, from_y, to_x, to_y);
          +
          + +

          Translation

          +

          To perform a translation on an Evas object, use the following method:

          + +
          +elm_transit_effect_translation_add(Elm_Transit *transit,
          +                                   Evas_Coord from_dx,
          +                                   Evas_Coord from_dy,
          +                                   Evas_Coord to_dx,
          +                                   Evas_Coord to_dy)
          +
          + +
            +
          • The first argument is the transit object that contains (among other things) all the Evas objects subject to the translation.
          • +
          • from_dx: The starting X coordinate (source).
          • +
          • from_dy: The starting Y coordinate (source).
          • +
          • to_dx: The ending X coordinate (destination).
          • +
          • to_dy: The ending Y coordinate (destination).
          • +
          + +

          The following example shows how to slide an Evas object (a rectangle) on a 45-degree diagonal, from bottom-left to top-right, at a constant speed, and in 1 second:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, rectangle);
          +elm_transit_effect_translation_add(transit, 0, 0, 280, 280);
          +elm_transit_duration_set(transit, 1);
          +elm_transit_go(transit);
          +
          + +

          Color Transition

          + +

          Color transitions allow you to dynamically change the color of Evas objects. The first argument is the transit object, while the other arguments will be used to define the color transition using RGB colors. There is also an alpha channel that controls the opacity of the color (the background of the object, not the object itself).

          + +
          +elm_transit_effect_color_add(Elm_Transit *transit,
          +                             unsigned int from_r,
          +                             unsigned int from_g,
          +                             unsigned int from_b,
          +                             unsigned int from_a,
          +                             unsigned int to_r,
          +                             unsigned int to_g,
          +                             unsigned int to_b,
          +                             unsigned int to_a)
          +
          + +
            +
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • +
          • from_r: The start value for "Red".
          • +
          • from_g: The start value for "Green".
          • +
          • from_b: The start value for "Blue".
          • +
          • from_a: The start value for "Alpha".
          • +
          • to_r: The end value for "Red".
          • +
          • to_g: The end value for "Green".
          • +
          • to_b: The end value for "Blue".
          • +
          • to_a: The end value for "Alpha".
          • +
          + +

          The following example shows how to transit a rectangle from red to blue in 3 seconds:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, rectangle);
          +elm_transit_effect_color_add(transit, // Target object
          +                             255, 0, 0, 255, // From color
          +                             0, 0, 255, 255); // To color
          +elm_transit_duration_set(transit, 3);
          +elm_transit_go(transit);
          +
          + +

          Rotation

          + +
          elm_transit_effect_rotation_add(Elm_Transit *transit, float from_degree, float to_degree)
          + +
            +
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • +
          • from_degree: The start degree of rotation.
          • +
          • to_degree: The end degree of rotation.
          • +
          + +

          This function can be used to perform a rotation on any Evas object. It works the same way as the other transit effects and takes two arguments for the starting and ending angles. Note that if you apply a rotation on multiple objects, they will individually mill around and not act as a group. If you want several objects to revolve around a common point, you must encapsulate the objects into a single parent object and apply the rotation to the parent object. The following example shows how to achieve this:

          + +
          +// Parent container
          +Evas_Object *parent = elm_box_add(my_window);
          +evas_object_show(parent);
          +elm_box_horizontal_set(parent, EINA_TRUE);
          +elm_box_homogeneous_set(parent, EINA_TRUE);
          +
          +// Button 1
          +Evas_Object *btn1 = elm_button_add(parent);
          +elm_object_text_set(btn1, "Btn1");
          +elm_box_pack_start(parent, btn1);
          +evas_object_show(btn1);
          +
          +// Button 2
          +Evas_Object *btn2 = elm_button_add(parent);
          +elm_object_text_set(btn2, "Btn2");
          +elm_box_pack_end(parent, btn2);
          +evas_object_show(btn2);
          +
          +// Make the parent container do a 360 degrees spin
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, parent);
          +elm_transit_effect_rotation_add(transit, 0.0, 360);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_go(transit);
          +
          + +

          Wipe Effect

          + +

          The wipe effect is designed to dynamically hide or show any element on the scene.

          + +
          +elm_transit_effect_wipe_add(Elm_Transit *transit,
          +                            Elm_Transit_Effect_Wipe_Type type,
          +                            Elm_Transit_Effect_Wipe_Dir dir)
          +
          + +

          In addition to the Elm_Transit instance passed as the first argument, the function takes the following arguments:

          + +
            +
          • type: The wipe type Elm_Transit_Effect_Wipe_Type defines whether to show or hide the target elements. The value can be one of the following: +
              +
            • ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE
            • +
            • ELM_TRANSIT_EFFECT_WIPE_TYPE_SHOW
            • +
            +
          • +
          • dir: The wipe direction Elm_Transit_Effect_Wipe_Dir defines in which direction the target will progressively appear or disappear. The value can be one of the following: +
              +
            • ELM_TRANSIT_EFFECT_WIPE_DIR_LEFT
            • +
            • ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT
            • +
            • ELM_TRANSIT_EFFECT_WIPE_DIR_UP
            • +
            • ELM_TRANSIT_EFFECT_WIPE_DIR_DOWN
            • +
            +
          • +
          + +

          The following example shows how to make an object disappear progressively from left to right:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_wipe_add(transit,
          +                            ELM_TRANSIT_EFFECT_TYPE_HIDE,
          +                            ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_go(transit);
          +
          + +

          Zoom Effect

          +

          Elm_Transit provides a zoom function.

          + +
          +elm_transit_effect_zoom_add(Elm_Transit *transit,
          +                            float from_rate,
          +                            float to_rate)
          +
          + +
            +
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • +
          • from_rate: The starting level of the zoom.
          • +
          • to_rate: The ending level of the zoom.
          • +
          + +

          The from_rate argument defines the scale of the target objects at the beginning of the animation. A value of 1 represents the initial scale of the objects.

          + +

          Setting the value of the to_rate argument to 2 will double the size of the target objects (double the width and double the height). When using this effect, the width and height of a target object will remain proportional to one another. If you want to customize the zoom effect, use the elm_transit_effect_resizing_add() function.

          + +

          The following example shows how to implement a zoom-out transition. At the end of the 2-secondstransition, the animated object will be half its original size.

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_zoom_add(transit, 1, 0.5);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_go(transit);
          +
          + +

          Resizing Effect

          + +

          The resizing effect allows you to design an interpolation of the width and height attributes of one or more target elements.

          + +
          +elm_transit_effect_resizing_add(Elm_Transit *transit,
          +                                Evas_Coord from_w,
          +                                Evas_Coord from_h,
          +                                Evas_Coord to_w,
          +                                Evas_Coord to_h)
          +
          + +
            +
          • transit: The transit object that contains (among other things) all the Evas objects subject to the translation.
          • +
          • from_w: The starting width.
          • +
          • from_h: The starting height.
          • +
          • to_w: The ending width.
          • +
          • to_h: The ending height.
          • +
          + +

          The from_w and from_h arguments define the size at the beginning of the animation. The to_w and to_h arguments define the size at the end.

          + + + + + + + + + + +
          Note
          If you are planning to use this method to hide an Evas object by setting one of the length attributes to zero, consider using the elm_transit_effect_wipe_add() function instead.
          + +

          The following example shows how to make a rectangle exchange its width and height properties in a 2-second transition:

          + +
          +Evas_Coord w, h;
          +evas_object_geometry_get(my_evas_object, NULL, NULL, &w, &h);
          +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, my_evas_object);
          +elm_transit_effect_resize_add(transit, // Transition object
          +                              w, h, // Original sizing
          +                              h, w); // Target sizing
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_go(transit);
          +
          + +

          Flip Effect

          +

          This transition combines the target Evas objects in pairs, so that one object will show up while the other one disappears. This association relates the even objects in the transit list of objects with the odd ones. The even objects are shown at the beginning of the animation, and the odd objects shown when the transition is complete. In other words, the effect applies to each pair of objects in the order in which they are listed in the transit list of objects.

          + +

          The flip effect itself is a pseudo-3D effect where the first object in the pair is the front object and the second one is the back object. When the transition launches, the front object rotates around a preferred axis in order to let the back object take its place.

          + +
          +elm_transit_effect_flip_add(Elm_Transit *transit,
          +                            Elm_Transit_Effect_Flip_Axis axis,
          +                            Eina_Bool cw)
          +
          + +

          The first argument is the transit object. The second argument is the preferred axis of rotation:

          +
            +
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_X
          • +
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_Y
          • +
          + +

          The third argument is the direction of the rotation:

          +
            +
          • EINA_TRUE is clockwise.
          • +
          • EINA_FALSE is counter-clockwise.
          • +
          + +

          The following example shows how to create a coin that flips indefinitely. Note that we use images as Elementary UI components for demonstration purposes. You can use the elm_transit_effect_image_animation_add() function if you do not want to bother creating UI components.

          + +
          +// Coin Heads
          +Evas_Object *coin_heads = elm_image_add(ad->win);
          +if (!elm_image_file_set(coin_heads, IMG_DIR"/coin_heads.png", NULL))
          +   printf("error: could not load image");
          +elm_win_resize_object_add(ad->win, coin_heads);
          +
          +// Coin Tails
          +Evas_Object *coin_tails = elm_image_add(ad->win);
          +if (!elm_image_file_set(coin_tails, IMG_DIR"/coin_tails.png", NULL))
          +   printf("error: could not load image");
          +elm_win_resize_object_add(ad->win, coin_tails);
          +
          +// Transition definition
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, coin_heads);
          +elm_transit_object_add(transit, coin_tails);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_auto_reverse_set(transit, EINA_TRUE);
          +elm_transit_repeat_times_set(transit, -1);
          +elm_transit_effect_flip_add(transit, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
          +elm_transit_go(transit);
          +
          + +

          Figure: Coin flip

          +

          Coin flip

          + +

          Resizable Flip Effect

          +

          In the flip example above, we used two objects that have the same size. However, you may sometimes want to flip from one object to another object with different size attributes. The most common example would be using buttons with dimensions that depend on their contents (such as labels). If you decide to use the classic elm_transit_effect_flip_add() function, the size of the object will change at the moment one object becomes completely hidden and the other one begins to show up. If you wish to interpolate the size attributes as well, use the elm_transit_effect_resizable_flip_add() function:

          + +
          +elm_transit_effect_resizable_flip_add(Elm_Transit *transit,
          +                                      Elm_Transit_Effect_Flip_Axis axis,
          +                                      Eina_Bool cw)
          +
          + +

          The first argument is the transit object. The second argument is the preferred axis of rotation:

          +
            +
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_X
          • +
          • ELM_TRANSIT_EFFECT_FLIP_AXIS_Y
          • +
          + +

          The third argument is the direction of the rotation:

          +
            +
          • EINA_TRUE is clockwise.
          • +
          • EINA_FALSE is counter-clockwise.
          • +
          + +

          This function works the exact same way as the standard flip effect function.

          + +

          Fade Effect

          + +

          This effect is used to transition from one Evas object to another one using a fading effect: the first object will slowly disappear to let the second object take its place.

          + +
          elm_transit_effect_fade_add(Elm_Transit *transit)
          + +

          This effect is applied to each pair of objects in the order in which they are listed in the transit list of objects. The first object in the pair will be the before object and the second one will be the after object.

          + +

          Building on the coin flip example, the following example shows how to fade out one face of the coin while fading in the other face:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, coin_heads);
          +elm_transit_object_add(transit, coin_tails);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_effect_fade_add(transit);
          +elm_transit_go(transit);
          +
          + +

          If you simply want to hide an object with a fade transition, consider using a transparent after object.

          + +

          Blend Effect

          + +

          Another transition involving at least two Evas objects is the blend effect. This transition makes the before object blurry before the after object appears.

          + +
          elm_transit_effect_blend_add(Elm_Transit *transit)
          + +

          The argument is the transition target of the blend effect.

          + +

          Building on the coin flip example, the following example shows how to blur out one face of the coin while blurring in the other face:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, coin_heads);
          +elm_transit_object_add(transit, coin_tails);
          +elm_transit_duration_set(transit, 2.0);
          +elm_transit_effect_blend_add(transit);
          +elm_transit_go(transit);
          +
          + +

          If you simply want to hide an object with a blur transition, consider using a transparent after object.

          + +

          Combining Transitions

          + +

          To use multiple transitions at the same time on the same objects, simply declare the transitions one after the other.

          + +

          Building on the coin flip example, the following example shows how to roll the coin on the ground using a rotation and a translation effect:

          + +
          +Evas_Object *coin_heads = elm_image_add(ad->win);
          +if (!elm_image_file_set(coin_heads, IMG_DIR"/coin_heads.png", NULL))
          +   printf("error: could not load image");
          +evas_object_resize(coin_heads, 100, 100);
          +evas_object_show(coin_heads);
          +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_object_add(transit, coin_heads);
          +elm_transit_duration_set(transit, 5.0);
          +elm_transit_effect_translation_add(transit, 0, 0, 3.1415 * 2 * 100, 0);
          +elm_transit_effect_rotation_add(transit, 0, 360);
          +elm_transit_go(transit);
          +
          + +

          Animation Chain

          + +

          Now that we have listed all the effects that can be implemented using Elm_Transit, we will see how to chain transitions into sequences. To create complex, chained animations without worrying about synchronization between the transitions, use the elm_transit_chain_transit_add() function. This function takes as arguments two Elm_Transit objects and will automatically take care of the chaining for you: the second transition will start as soon as the first transition is finished.

          + +

          The following example shows how to move a datetime component on a square trajectory:

          + +
          +Evas_Object *dt = elm_datetime_add(ad->win);
          +evas_object_resize(dt, 350, 50);
          +evas_object_show(dt);
          +
          +// The first transition
          +Elm_Transit *t1 = elm_transit_add();
          +elm_transit_object_add(t1, dt);
          +elm_transit_duration_set(t1, 2);
          +elm_transit_effect_translation_add(t1, 0, 0, 100, 0);
          +
          +// The second transition
          +Elm_Transit *t2 = elm_transit_add();
          +elm_transit_object_add(t2, dt);
          +elm_transit_duration_set(t2, 2);
          +elm_transit_effect_translation_add(t2, 100, 0, 100, 100);
          +
          +// The third transition
          +Elm_Transit *t3 = elm_transit_add();
          +elm_transit_object_add(t3, dt);
          +elm_transit_duration_set(t3, 2);
          +elm_transit_effect_translation_add(t3, 100, 100, 0, 100);
          +
          +// The fourth transition
          +Elm_Transit *t4 = elm_transit_add();
          +elm_transit_object_add(t4, dt);
          +elm_transit_duration_set(t4, 2);
          +elm_transit_effect_translation_add(t4, 0, 100, 0, 0);
          +
          +// Chaining the transitions
          +elm_transit_chain_transit_add(t1, t2);
          +elm_transit_chain_transit_add(t2, t3);
          +elm_transit_chain_transit_add(t3, t4);
          +
          +// Starting the transitions
          +elm_transit_go(t1);
          +
          + +

          Note that we cannot use transition chaining to make a loop animation, since the transit object is automatically destroyed as soon as the transition completes. Therefore, you cannot do something like this:

          + +
          elm_transit_chain_transit_add(t4, t1);
          + +

          To create a looped animation chain, you have to use low-level components provided by the Ecore and Evas transition libraries, or you can use the elm_transit_del_cb_set() function to define a callback function for when a transition gets deleted. This way, you could recreate your objects and reiterate the transition chain as soon as the last transition ends.

          + +
          +elm_transit_del_cb_set(Elm_Transit *transit, Elm_Transit_Del_Cb cb, void *data)
          +
          + +

          The first argument is the transition object. The second argument is the callback function to run on transition delete. The third argument is the data to pass to the callback function.

          + +

          You can severe the chain relationship between two transits by using the elm_transit_chain_transit_del() function:

          + +
          elm_transit_chain_transit_del(Elm_Transit *transit, Elm_Transit *chain_transit)
          + +

          The first argument is the first transition in the chain. The second argument is the second transition in the chain.

          + +

          To get the current chain transit list, use the elm_transit_chain_transits_get() function.

          + +

          Animation Timeline

          + +

          After you have defined all the properties that define your transition, start the transition with the elm_transit_go() function:

          + +
          elm_transit_go(Elm_Transit *transit)
          + +

          You can maintain full control over the execution process even after the transition has started. You can pause the transition by setting the paused argument to EINA_TRUE:

          + +
          elm_transit_paused_set(Elm_Transit *transit, Eina_Bool paused)
          + +

          You can resume the transition by using the same method but setting the paused argument to EINA_FALSE. If you want to know whether the transition is currently paused, use the elm_transit_paused_get() function.

          + +

          You can remain informed about the present transition flow and get the current frame by using the elm_transit_progress_value_get() function. This function will return the timeline position of the animation, ranging between 0.0 (start) and 1.0 (end).

          + +

          Custom Transitions

          + +

          Elm_Transit provides a standard function for defining any effect of your choosing that will be applied to some context data:

          + +
          +elm_transit_effect_add(Elm_Transit *transit,
          +                       Elm_Transit_Effect_Transition_Cb transition_cb,
          +                       Elm_Transit_Effect *effect,
          +                       Elm_Transit_Effect_End_Cb end_cb)
          +
          + +

          The first argument is the transition target of the new effect. The second argument is the transition callback function. The third argument is the new effect. The fourth argument is the callback function to call at the end of the effect.

          + +

          As described earlier in this programming guide, this function embraces three callbacks that will allow you to define every aspects of your transition from its creation to its deletion. The following is an example of how to build a custom resizing animation.

          + +

          First, we define a structure capable of holding the context information about resizing an Evas object:

          + +
          +typedef struct
          +{
          +   struct _size
          +   {
          +      Evas_Coord w, h;
          +   }
          +   from, to;
          +}
          +Custom_Effect;
          +
          + +

          We can now implement our custom resizing callback function. This function takes the following arguments:

          + +
            +
          • The context data that holds the custom properties of our transition, which are used as parameters to calculate the interpolation.
          • +
          • The transit object that contains the list of our Evas objects to animate and all the information about duration, auto-reverse, looping, and so on.
          • +
          • The progress (position along the animation timeline) that ranges from 0.0 to 1.0 and allows us to calculate the desired interpolation for each frame.
          • +
          + +
          +static void
          +_custom_op(void *data, Elm_Transit *transit, double progress)
          +{
          +   if (!data) return;
          +   Evas_Coord w, h;
          +   Evas_Object *obj;
          +   const Eina_List *elist;
          +   Custom_Effect *custom_effect = data;
          +   const Eina_List *objs = elm_transit_objects_get(transit);
          +   if (progress < 0.5)
          +   {
          +      h = custom_effect->from.h + (custom_effect->to.h * progress * 2);
          +      w = custom_effect->from.w;
          +   }
          +   else
          +   {
          +      h = custom_effect->from.h + custom_effect->to.h;
          +      w = custom_effect->from.w + (custom_effect->to.w * (progress - 0.5) * 2);
          +   }
          +   EINA_LIST_FOREACH(objs, elist, obj)
          +      evas_object_resize(obj, w, h);
          +}
          +
          + +

          The callback function above resizes our Evas objects in two steps. During the first half of the transition, only the height changes, while the width remains the same. During the second half, it is the other way around until we get to the desired size.

          + +

          You must then define the context used by your animation:

          + +
          +static void*
          +_custom_context_new(Evas_Coord from_w, Evas_Coord from_h, Evas_Coord to_w, Evas_Coord to_h)
          +{
          +   Custom_Effect *custom_effect;
          +
          +   custom_effect = calloc(1, sizeof(Custom_Effect));
          +   if (!custom_effect) return NULL;
          +
          +   custom_effect->from.w = from_w;
          +   custom_effect->from.h = from_h;
          +   custom_effect->to.w = to_w - from_w;
          +   custom_effect->to.h = to_h - from_h;
          +
          +   return custom_effect;
          +}
          +
          + +

          You must define the function that will take care of deleting all the context objects used by your custom transition and free up the allocated memory:

          + +
          +static void
          +_custom_context_free(void *data, Elm_Transit *transit __UNUSED__)
          +{
          +   free(data);
          +}
          +
          + +

          Finally, apply your custom transition to your Elm_Transit object:

          + +
          +Elm_Transit *transit = elm_transit_add();
          +elm_transit_effect_add(transit,
          +                       _custom_op,
          +                       _custom_context_new(),
          +                       _custom_context_free);
          +
          + +

          If you want to delete an effect from your effects list, use the elm_transit_effect_del() function.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/elementary_animation_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/elementary_animation_tutorial_n.htm new file mode 100644 index 0000000..cf6e719 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/elementary_animation_tutorial_n.htm @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + Creating Elementary Animations + + + + + + +
          +

          Creating Elementary Animations

          + + +

          This tutorial demonstrates how you can use Elm Transit to create animated transitions effects, such as rotation, wiping, zooming, resizing, and fading, to an Evas_Object.

          + + +

          Setting Up the Application

          + +

          To set up the application and create a resize effect:

          +
            +
          1. +

            Create a basic application as explained in the Hello World example and Creating Basic Mobile Interactions.

            +
          2. +
          3. +

            Create Evas objects and animate them. In this example, one single object is animated with different type of animations.

            + +

            Create the structure of the application, represented by the appdata struct, that holds the main UI components of the application:

            + +
            +typedef struct 
            +appdata 
            +{
            +   Evas_Object *win; // Main window
            +   Evas_Object *label; // Title label
            +   Evas_Object *button; // Button object, the target of the animations
            +   Evas_Object *buttonbck; // Button representing the back of the target button
            +   Evas_Object *hbox; // Horizontal box to store the vertical boxes
            +   Evas_Object *left_vbox; // Vertical box for the first button column
            +   Evas_Object *center_vbox; // // Vertical box for the second button column
            +   Evas_Object *right_vbox; // // Vertical box for the last button column
            +   float rt_angle, zto, zfrom; // Variables used to store values for animations
            +} appdata_s;
            +
            +
          4. +
          5. +

            Place the UI components on the application canvas:

            + +
            1. +

              The create_base_gui() function takes appdata_s *ad as its only parameter. This function is called by the creation of the app_create callback of the Tizen application (event_callback.create = app_create;) in the main() function of the application.

              +
              +create_base_gui(appdata_s *ad)
              +{
              +
              +
            2. +
            3. +

              Set up the rotation angle, the original zoom value (zfrom), and the destination zoom value (zto):

              +
              +   ad->rt_angle = 360.0;
              +   ad->zfrom = 1.0;
              +   ad->zto = 2.0;
              +
              +
            4. +
            5. +

              Create the main window with a title and add the delete callback:

              +
              +   // Window
              +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
              +   elm_win_autodel_set(ad->win, EINA_TRUE);
              +
              +   if (elm_win_wm_rotation_supported_get(ad->win)) 
              +   {
              +      int rots[4] = {0, 90, 180, 270};
              +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
              +   }
              +
              +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
              +
              +   // Label
              +   ad->label = elm_label_add(ad->win);
              +   elm_object_text_set(ad->label, "Effects Tutorial");
              +   evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +   elm_win_resize_object_add(ad->win, ad->label);
              +   evas_object_show(ad->label);
              +
              +   // Show the window after the base GUI is set up
              +   evas_object_show(ad->win);
              +
              +   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
              +
              +
            6. +
            7. +

              Create the animation target button and the back button. Call the button box creation function with the application data as its parameter.

              +
              +   // Create a button in the app window
              +   ad->button = elm_button_add(ad->win);
              +
              +   // Move the button to x = 50 y = 100
              +   evas_object_move(ad->button, 50, 100);
              +
              +   // Resize the button 100 x 50
              +   evas_object_resize(ad->button, 200, 50);
              +
              +   // Show the button
              +   evas_object_show(ad->button);
              +
              +   // Create a back button in the app window
              +   ad->buttonbck = elm_button_add(ad->win);
              +   elm_object_text_set(ad->buttonbck, "Button back");
              +   evas_object_move(ad->buttonbck, 50, 100);
              +   evas_object_resize(ad->buttonbck, 200, 50);
              +
              +   _create_btn_box(ad);
              +
              +} // End of create_base_gui
              +
              +
          6. +
          7. +

            Create the structure of the buttons box with 3 columns (vertical boxes) and one horizontal for the main container:

            +
            +// Create the main container box
            +ad->hbox = elm_box_add(ad->win);
            +elm_box_horizontal_set(ad->hbox, EINA_TRUE);
            +elm_box_homogeneous_set(ad->hbox, EINA_TRUE);
            +evas_object_move(ad->hbox, 10, 500);
            +evas_object_show(ad->hbox);
            +
            +// Create the first column
            +ad->left_vbox = elm_box_add(ad->hbox);
            +elm_box_horizontal_set(ad->left_vbox, EINA_FALSE);
            +elm_box_homogeneous_set(ad->left_vbox, EINA_TRUE);
            +evas_object_show(ad->left_vbox);
            +elm_box_pack_start(ad->hbox, ad->left_vbox);
            +
            +// Create the second column
            +ad->center_vbox = elm_box_add(ad->hbox);
            +elm_box_horizontal_set(ad->center_vbox, EINA_FALSE);
            +elm_box_homogeneous_set(ad->center_vbox, EINA_TRUE);
            +evas_object_show(ad->center_vbox);
            +elm_box_pack_end(ad->hbox, ad->center_vbox);
            +
            +// Create the last column
            +ad->right_vbox = elm_box_add(ad->hbox);
            +elm_box_horizontal_set(ad->right_vbox, EINA_FALSE);
            +elm_box_homogeneous_set(ad->right_vbox, EINA_TRUE);
            +evas_object_show(ad->right_vbox);
            +elm_box_pack_end(ad->hbox, ad->right_vbox);
            +
            +
          8. +
          9. +

            Create the first action button for the resize effect.

            +

            The evas_object_smart_callback_add() function defines the callback function that is to be called when the button is clicked. In this example, set a _btn_resize_cb() function and pass the application data ad to this callback function.

            +
            +// Create the button
            +btn_resize = elm_button_add(ad->win);
            +// Set the button text
            +elm_object_text_set(btn_resize, "Resize");
            +// Set the hint weight policy
            +evas_object_size_hint_weight_set(btn_resize, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +// Show the button
            +evas_object_show(btn_resize);
            +// Set the "clicked" callback
            +evas_object_smart_callback_add(btn_resize, "clicked", _btn_resize_cb, ad);
            +// Add the button to the first column
            +elm_box_pack_end(ad->left_vbox, btn_resize);
            +
            + +

            The callback by itself only sets a new text for the animation target button, and calls the evas_object_smart_callback function, which actually animates the button.

            +

            The evas_object_smart_callback function needs its specific prototype: it returns nothing and receives the data to be passed, the callback object, and the actual event (seldom used) as parameters.

            + +

            In this case, pass the application data to the callback. However, note that the parameter's type is void * and not appdata_s *, so you must initialize a variable of the correct type with the pointer.

            +
            +static void 
            +_btn_resize_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Resize");
            +   _resize_effect(ad->button);
            +}
            +
            +
          10. +
          11. +

            Use the application data in the callback function. At this point, you can create the animation directly in the callback function, but it is more straightforward to encapsulate the animation process into a dedicated function. The _resize_effect() function implements the following animation code:

            +
              +
            1. +

              Create an Elm_Transit * object representing the transition:

              +
              +static void 
              +_resize_effect(Evas_Object *obj)
              +{
              +   // Elementary Transition declaration and creation
              +   Elm_Transit *trans = elm_transit_add();
              +
              +
            2. +
            3. +

              Add the target object to the transition:

              +
              +   // Add the transition target object
              +   elm_transit_object_add(trans, obj);
              +
              +
            4. +
            5. +

              Add a resizing transition to the object with the origin and destination width and height in pixels:

              +
              +   // Set the resize effect
              +   elm_transit_effect_resizing_add(trans, 100, 50, 300, 150);
              +
              +

              100 and 50 are respectively the object's width and height when the effect begins, whereas 300 and 150 are respectively the object's width and height when the effect ends: the object grows from 100 x 50 to 300 x 150.

              +
            6. +
            7. +

              Set the transition duration with the elm_transit_duration_set() function:

              +
              +   // Set the transition duration
              +   elm_transit_duration_set(trans, 3.0);
              +
              +

              The animation lasts 3 seconds. The duration parameter is a double.

              +
            8. +
            9. +

              Start the animation by calling the elm_transit_go() function with the Elm_Transit object:

              +
              +   // Start the transition
              +   elm_transit_go(trans);
              +}
              +
              +

              When the resize button is clicked, the animation target button grows.

              + +

              All the action buttons are created exactly the same way as the resize button, with a callback and an animation function.

              +
            10. +
            +
          12. +
          + +

          Creating a Rotation Effect

          + +

          The rotation effect rotates the animation target button with an angle of 360°. This angle is stored in the application data as ad->rt_angle.

          +

          To create the rotation effect:

          +
            +
          1. +

            Create the button and add it to the center column in the _create_btn_box() function:

            +
            +// Rotation button
            +btn_rotate = elm_button_add(ad->win);
            +elm_object_text_set(btn_rotate, "Rotate");
            +evas_object_size_hint_weight_set(btn_rotate, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_rotate);
            +evas_object_smart_callback_add(btn_rotate, "clicked", _btn_rotate_cb, ad);
            +elm_box_pack_end(ad->center_vbox, btn_rotate);
            +
            +
          2. +
          3. +

            Call the effect function with the target button as the first parameter and the rotation angle as the second parameter:

            +
            +static void 
            +_btn_rotate_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Rotate");
            +   _rotation_effect(ad->button, ad->rt_angle);
            +}
            +
            +
          4. +
          5. +

            Define the animation function. The animation function rotates the animation target by adding a rotation effect with the elm_transit_effect_rotation_add() function. This function takes 3 parameters:

            + +
              +
            • Elm_Transit
            • +
            • Rotation position at which the effect begins (0°)
            • +
            • Rotation position at which the effect ends (360°)
            • +
            +

            The animation lasts 2 seconds.

            + +
            +static void 
            +_rotation_effect(Evas_Object *obj, float angle)
            +{
            +   Elm_Transit *trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +
            +   // Rotate the object from its original angle to given degrees to the right
            +   elm_transit_effect_rotation_add(trans, 0.0, angle);
            +   elm_transit_duration_set(trans, 2.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + +

          Creating a Zoom Effect

          + +

          The zoom effect zooms on the animation target to make it twice as big. Store the source and destination zoom level in the application data using ad->zfrom and ad->zto.

          + +

          To create a zoom effect:

          +
            +
          1. +

            Create the button and add it to the center column in the _create_btn_box() function:

            + +
            +// Zoom button
            +btn_zoom = elm_button_add(ad->win);
            +elm_object_text_set(btn_zoom, "Zoom");
            +evas_object_size_hint_weight_set(btn_zoom, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_zoom);
            +evas_object_smart_callback_add(btn_zoom, "clicked", _btn_zoom_cb, ad);
            +elm_box_pack_end(ad->right_vbox, btn_zoom);
            +
            +
          2. +
          3. +

            Add a callback function to perform the animation:

            + +
            +static void 
            +_btn_zoom_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Zoom");
            +   _zoom_effect(ad->button, ad->zfrom, ad->zto);
            +}
            +
            +
          4. +
          5. +

            Create the function which runs the animation.

            +

            To create the zoom effect, use the elm_transit_effect_zoom_add() function with the start and destination zoom level stored in the application data (ad->zfrom and ad->zto).

            + +
            +static void 
            +_zoom_effect(Evas_Object *obj, float from, float to)
            +{
            +   Elm_Transit *trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +
            +   elm_transit_effect_zoom_add(trans, from, to);
            +   elm_transit_duration_set(trans, 2.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + +

          Creating a Flip Effect

          + +

          This effect is applied to a pair of objects, in the order they are added, in the Elm_Transit transition. In this example, add the animation target button and the button called buttonbck, which represents the back of the target button.

          +

          To create a flip effect:

          +
            +
          1. +

            Create the action button for the flip effect:

            + +
            +// Flip button
            +btn_flip = elm_button_add(ad->win);
            +elm_object_text_set(btn_flip, "Flip x");
            +evas_object_size_hint_weight_set(btn_flip, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_flip);
            +evas_object_smart_callback_add(btn_flip, "clicked", _btn_flip_cb, ad);
            +elm_box_pack_end(ad->left_vbox, btn_flip);
            +
            +
          2. +
          3. +

            Create and start the animation with the 2 objects (target button and back button) to animate:

            + +
            +static void 
            +_btn_flip_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Flip");
            +   _flip_effect(ad->button, ad->buttonbck);
            +}
            +
            +
          4. +
          5. +

            Create the function which runs the animation.

            +

            This flip animation is created using the elm_transit_effect_flip_add() function. The second parameter is the axis of the flip: in this example it is the X axis, so the button flips down from top to show the back button. The last parameter is the flip direction: EINA_TRUE means clockwise.

            +
            +static void 
            +_flip_effect(Evas_Object *obj, Evas_Object *obj2)
            +{
            +   Elm_Transit *trans;
            +
            +   trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +   elm_transit_object_add(trans, obj2);
            +   elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_X, EINA_TRUE);
            +
            +   elm_transit_duration_set(trans, 3.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + +

          Creating a Blend Transition

          + +

          The blend effect works the same way as the flip, but without the axis or direction information. Use the back button in this case as well.

          + +

          To create a blend transition:

          +
            +
          1. +

            Create the blend effect button:

            +
            +// Blend button
            +btn_blend = elm_button_add(ad->win);
            +elm_object_text_set(btn_blend, "Blend");
            +evas_object_size_hint_weight_set(btn_blend, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_blend);
            +evas_object_smart_callback_add(btn_blend, "clicked", _btn_blend_cb, ad);
            +elm_box_pack_end(ad->center_vbox, btn_blend);
            +
            +
          2. +
          3. +

            Create the blend transition callback:

            +
            +static void 
            +_btn_blend_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Blend");
            +   _blend_effect(ad->button, ad->buttonbck);
            +}
            +
            +
          4. +
          5. +

            Create and start the blend animation.

            +

            This animation is created by adding 2 objects to Elm_Transit and using the elm_transit_effect_blend_add() function.

            + +
            +static void 
            +_blend_effect(Evas_Object *obj, Evas_Object *obj2)
            +{
            +   Elm_Transit *trans;
            +
            +   trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +   elm_transit_object_add(trans, obj2);
            +   elm_transit_effect_blend_add(trans);
            +   elm_transit_duration_set(trans, 3.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + + +

          Creating a Fade Effect

          + +

          The fade effect works exactly the same way as the blend effect.

          + +

          To create a fade effect:

          +
            +
          1. +

            Create the fade button:

            +
            +// Fade button
            +btn_fade = elm_button_add(ad->win);
            +elm_object_text_set(btn_fade, "Fade");
            +evas_object_size_hint_weight_set(btn_fade, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_fade);
            +evas_object_smart_callback_add(btn_fade, "clicked", _btn_fade_cb, ad);
            +elm_box_pack_end(ad->right_vbox, btn_fade);
            +
            +
          2. +
          3. +

            Add the button callback:

            +
            +static void 
            +_btn_fade_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Fade");
            +   _fade_effect(ad->button, ad->buttonbck);
            +}
            +
            +
          4. +
          5. +

            Create and start the animation. Call the elm_transit_effect_fade_add() function.

            + +
            +static void 
            +_fade_effect(Evas_Object *obj, Evas_Object *obj2)
            +{
            +   Elm_Transit *trans;
            +
            +   trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +   elm_transit_object_add(trans, obj2);
            +   elm_transit_effect_fade_add(trans);
            +   elm_transit_duration_set(trans, 3.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + +

          Creating a Flip on the Y Axis

          + +

          This is same as the flip transition, but on the Y axis.

          +

          To create a flip on the Y axis:

          +
            +
          1. +

            Create the flip y button:

            +
            // Flip y button
            +btn_flip_y = elm_button_add(ad->win);
            +elm_object_text_set(btn_flip_y, "Flip y");
            +evas_object_size_hint_weight_set(btn_flip_y, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_flip_y);
            +evas_object_smart_callback_add(btn_flip_y, "clicked", _btn_flip_y_cb, ad);
            +elm_box_pack_end(ad->left_vbox, btn_flip_y);
            +
            +
          2. +
          3. +

            Add the button callback:

            +
            +static void 
            +_btn_flip_y_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Flip 2");
            +   _flip_y_effect(ad->button, ad->buttonbck);
            +}
            +
            +
          4. +
          5. +

            Create and start the animation:

            +
            +static void 
            +_flip_y_effect(Evas_Object *obj, Evas_Object *obj2)
            +{
            +   Elm_Transit *trans;
            +
            +   trans = elm_transit_add();
            +   elm_transit_object_add(trans, obj);
            +   elm_transit_object_add(trans, obj2);
            +   elm_transit_effect_flip_add(trans, ELM_TRANSIT_EFFECT_FLIP_AXIS_Y, EINA_TRUE);
            +   elm_transit_duration_set(trans, 3.0);
            +   elm_transit_go(trans);
            +}
            +
            +
          6. +
          + +

          Creating a Wipe Effect

          + +

          The wipe transition is applied on an Evas object considering the wipe type and the direction.

          +

          To create a wipe effect:

          +
            +
          1. +

            Create the wipe animation button:

            + +
            +// Wipe button
            +btn_wipe = elm_button_add(ad->win);
            +elm_object_text_set(btn_wipe, "Wipe");
            +evas_object_size_hint_weight_set(btn_wipe, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(btn_wipe);
            +evas_object_smart_callback_add(btn_wipe, "clicked", _btn_wipe_cb, ad);
            +elm_box_pack_end(ad->right_vbox, btn_wipe);
            +
            +
          2. +
          3. +

            Add the button callback:

            + +
            +static void 
            +_btn_wipe_cb(void *data, Evas_Object *btn, void *ev)
            +{
            +   appdata_s *ad = data;
            +
            +   // Set the button text
            +   elm_object_text_set(ad->button, "Wipe");
            +   _wipe_effect(ad->button);
            +}
            +
            +
          4. +
          5. +

            Create and start the wipe animation.

            +

            The animation function calls the elm_transit_effect_wipe_add() function with ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE as the second parameter to hide the button and ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT as the last parameter to set the direction (left to right).

            + +
            +static void 
            +_wipe_effect(Evas_Object *obj)
            +{
            +    Elm_Transit *trans;
            +
            +    trans = elm_transit_add();
            +    elm_transit_object_add(trans, obj);
            +    elm_transit_effect_wipe_add(trans, ELM_TRANSIT_EFFECT_WIPE_TYPE_HIDE, ELM_TRANSIT_EFFECT_WIPE_DIR_RIGHT);
            +    elm_transit_duration_set(trans, 3.0);
            +    elm_transit_go(trans);
            +}
            +
            +
          6. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/elementary_transit_effect_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/elementary_transit_effect_tutorial_n.htm new file mode 100644 index 0000000..41961fe --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/elementary_transit_effect_tutorial_n.htm @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + Creating Elementary Transit Effects + + + + + + +
          +

          Creating Elementary Transit Effects

          + +

          This tutorial demonstrates how you can implement a variety of EFL animation effects using the APIs available in the EFL library.

          + +

          Initializing the Application Layout

          +

          The application uses UI components, such as elm_conformant and elm_naviframe for view management, layout classes, such as elm_list for the composition of the screen, and UI components, such as elm_button and elm_image for the content inside the view.

          +

          The transit is designed to apply various animated transition effects to the Evas_Object. The following transition effects are supported in the Tizen native applications:

          +
            +
          • Blend
          • +
          • Color
          • +
          • Fade
          • +
          • Flip
          • +
          • Rotation
          • +
          • Transition
          • +
          • Wipe
          • +
          • Zoom
          • +
          + +

          To initialize the application layout:

          +
            +
          1. +

            Create the layout with the create_base_gui() function. First, a window is created and the elm_conformant component is added to it to decorate the window with an indicator. The elm_naviframe component is added to act as a view manager for the window and provide the window title functionality.

            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Window
            +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   if (elm_win_wm_rotation_supported_get(ad->win)) 
            +   {
            +      int rots[4] = { 0, 90, 180, 270 };
            +      elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
            +   }
            +
            +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +
            +   // Conformant
            +   ad->conform = elm_conformant_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(ad->win, ad->conform);
            +   evas_object_show(ad->conform);
            +
            +   // Naviframe
            +   ad->nf = create_main_view(ad);
            +   elm_object_content_set(ad->conform, ad->nf);
            +
            +   // Show window after the base GUI is set up
            +   evas_object_show(ad->win);
            +
            +   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, ad);
            +}
            +
            +
          2. +
          3. +

            Create the main view with the create_main_view() function. The main view consists of a naviframe containing a list. This function returns a list of naviframe object pointers for the content set.

            +
            +static Evas_Object*
            +create_main_view(appdata_s *ad)
            +{
            +   Elm_Object_Item *nf_it;
            +   Evas_Object *navi, *list;
            +
            +   navi = elm_naviframe_add(ad->conform);
            +
            +   list = elm_list_add(navi);
            +   elm_list_mode_set(list, ELM_LIST_COMPRESS);
            +
            +   elm_list_item_append(list, "Blend", NULL, NULL, blend_cb, navi);
            +   elm_list_item_append(list, "Color", NULL, NULL, color_cb, navi
            +   elm_list_item_append(list, "Fade", NULL, NULL, fade_cb, navi);
            +   elm_list_item_append(list, "Flip", NULL, NULL, flip_cb, navi);
            +   elm_list_item_append(list, "Rotation", NULL, NULL, rotation_cb, navi);
            +   elm_list_item_append(list, "ResizableFlip", NULL, NULL, resizable_flip_cb, navi);
            +   elm_list_item_append(list, "Translation", NULL, NULL, translation_cb, navi);
            +   elm_list_item_append(list, "Wipe", NULL, NULL, wipe_cb, navi);
            +   elm_list_item_append(list, "Zoom", NULL, NULL, zoom_cb, navi);
            +   elm_list_item_append(list, "Custom", NULL, NULL, custom_cb, navi);
            +   elm_list_go(list);
            +
            +   nf_it = elm_naviframe_item_push(navi, "Transit", NULL, NULL, list, NULL);
            +
            +   return navi;
            +}
            +
            + +

            This tutorial describes only the rotation and zoom implementations. For more information about other effects, see the transit.c file and the Transit API. The following figure illustrates the rotation and zoom effects.

            + +

            Figure: Rotation and zoom

            +

            Rotation and zoom

            + +
          4. +
          + + +

          Implementing the Rotation Effect

          + +

          When the rotation effect is selected in the list, a related callback function that implements the animation effect is called. The data is sent as an Evas_Object.

          +

          To implement the rotation effect:

          +
            +
          1. Use the elm_transit object with the elm_transit_add() function to add the transit effect: +
            +static void
            +rotation_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *layout = (Evas_Object *) data;
            +   Elm_Transit *transit = elm_transit_add();
            +
            +
          2. +
          3. Set the transit rotation amount and duration: +
            +   // 360 degree rotation effect in the clockwise direction
            +   elm_transit_object_add(transit, layout);
            +   elm_transit_effect_rotation_add(transit, 0, 360);
            +   elm_transit_duration_set(transit, 1);
            +   elm_transit_del_cb_set(transit, transit_del_cb, NULL);
            +
            +
          4. +
          5. To start the transit animation, use the elm_transit_go() function: +
            +   elm_transit_go(transit);
            +}
            +
            +
          6. +
          + +

          Implementing the Zoom Effect

          + +

          When the zoom effect is selected in the list, a related callback function that implements the animation effect is called. The data is sent as an Evas_Object.

          +

          To implement the zoom effect:

          +
            +
          1. After adding the transit object, add an Evas_Object to get the zoom effect: +
            +static void
            +zoom_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *layout = (Evas_Object *) data;
            +
            +
          2. +
          3. Set the zoom from the original size (1.0) to 0.4 times the original size, and set the duration: +
            +   // Zoom out to scale 0.6
            +   Elm_Transit *transit = elm_transit_add();
            +   elm_transit_smooth_set(transit, EINA_FALSE);
            +   elm_transit_object_add(transit, layout);
            +   elm_transit_effect_zoom_add(transit, 1.0, 0.4);
            +   elm_transit_duration_set(transit, 0.5);
            +
            +
          4. +
          5. Similarly, set the zoom size (0.4) back to the original size (1.0), and set the duration: +
            +   // Zoom in to the original size
            +   Elm_Transit *transit2 = elm_transit_add();
            +   elm_transit_smooth_set(transit2, EINA_FALSE);
            +   elm_transit_object_add(transit2, layout);
            +   elm_transit_effect_zoom_add(transit2, 0.4, 1.0);
            +   elm_transit_duration_set(transit2, 0.5);
            +   elm_transit_del_cb_set(transit2, transit_del_cb, NULL);
            +
            +
          6. +
          7. Set both effects to be applied in sequence, and start the animation: +
            +   elm_transit_chain_transit_add(transit, transit2);
            +   elm_transit_go(transit);
            +}
            +
            +
          8. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/evas_advanced_objects_n.htm b/org.tizen.ui.practices/html/native/efl/evas_advanced_objects_n.htm new file mode 100644 index 0000000..5fb12ed --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_advanced_objects_n.htm @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + Advanced Manipulation of Evas Objects + + + + + + +
          +

          Advanced Manipulation of Evas Objects

          + + +

          This tutorial demonstrates how you can use Evas object extra functions.

          + +

          This tutorial shows how to create an application that enables scaling of an Evas text object by clicking buttons. Data setter and getter functions are used to pass the scalable object through the clicked button object to a callback.

          +

          The tutorial also shows how to change the Evas object rendering mode using the extra object manipulation API.

          + +

          Figure: Advanced Evas application

          +

          Advanced Evas application

          + + +

          Creating the Basic Application

          +

          To create the basic application:

          +
            +
          1. +

            To use the required APIs, include the following libraries:

            + +
            #include <app.h>
            +#include <Elementary.h>
            +#include <system_settings.h>
            +#include <efl_extension.h>
            +
          2. + +
          3. +

            Create objects for an Elementary window and buttons for scaling and changing the object render mode. Also create a text object and 2 rectangle objects to connect to the application data structure:

            + +
            typedef struct appdata 
            +{
            +   Evas_Object *win;
            +   Evas_Object *scale_incr_button;
            +   Evas_Object *scale_decr_button;
            +
            +   Evas_Object *render_text;
            +   Evas_Object *blend_mode_button;
            +   Evas_Object *copy_mode_button;
            +   Evas_Object *render_rect1;
            +   Evas_Object *render_rect2;
            +} 
            +appdata_s;
            +
          4. +
          + +

          Creating the Elementary Window

          +

          To create an elementary window:

          +
            +
          1. +

            Use the elm_win_util_standard_add() function and give there the name and title of the application. To set a callback for the Back hardware button, use the eext_object_event_callback_add() function. To display the Evas object, use the evas_object_show() function.

            + +
            static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Window
            +   ad->win = elm_win_util_standard_add("Extra object function", "Extra object function");
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   // Window callbacks
            +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, back_cb, ad);
            +
            +   // Show the window
            +   evas_object_show(ad->win);
            +}
            +
          2. + +
          3. + +

            Implement callback functions to enable closing the application:

            + +
            static void
            +back_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +
            +   elm_win_lower(ad->win);
            +}
            +
            +static void
            +win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   ui_app_exit();
            +}
            +
          4. +
          + +

          Creating an Application

          +

          Create an Elementary application with a GUI:

          + +
          static bool
          +app_create(void *data)
          +{
          +   appdata_s *ad = data;
          +
          +   // Create the application UI
          +   create_base_gui(ad);
          +
          +   return true;
          +}
          +
          +int
          +main(int argc, char *argv[])
          +{
          +   appdata_s ad = {0,};
          +
          +   ui_app_lifecycle_callback_s event_callback = {0,};
          +
          +   event_callback.create = app_create;
          +
          +   // Run the main loop
          +   return ui_app_main(argc, argv, &event_callback, &ad);
          +}
          + +

          Creating Buttons

          +

          To create buttons:

          +
            +
          1. +

            Create the scale buttons. The move() and resize() functions configure the buttons' custom geometry.

            + +
            // Scale increasing button
            +ad->scale_incr_button = elm_button_add(ad->win);
            +elm_object_text_set(ad->scale_incr_button, "Scale +");
            +evas_object_resize(ad->scale_incr_button, 120, 50);
            +evas_object_move(ad->scale_incr_button, 180, 20);
            +evas_object_show(ad->scale_incr_button);
            +
            +// Scale decreasing button
            +ad->scale_decr_button = elm_button_add(ad->win);
            +elm_object_text_set(ad->scale_decr_button, "Scale -");
            +evas_object_resize(ad->scale_decr_button, 120, 50);
            +evas_object_move(ad->scale_decr_button, 180, 170);
            +evas_object_show(ad->scale_decr_button);
            +
          2. + +
          3. +

            Create the render mode change buttons:

            + +
            // Blend render mode button
            +ad->blend_mode_button = elm_button_add(ad->win);
            +elm_object_text_set(ad->blend_mode_button, "BLEND Mode");
            +evas_object_resize(ad->blend_mode_button, 190, 50);
            +evas_object_move(ad->blend_mode_button, 30, 280);
            +evas_object_show(ad->blend_mode_button);
            +
            +// Copy render mode button
            +ad->copy_mode_button = elm_button_add(ad->win);
            +elm_object_text_set(ad->copy_mode_button, "COPY Mode");
            +evas_object_resize(ad->copy_mode_button, 190, 50);
            +evas_object_move(ad->copy_mode_button, 260, 280);
            +evas_object_show(ad->copy_mode_button);
            +
          4. +
          + +

          Creating Callbacks for the Button Click Signal

          +

          To create the callbacks:

          +
            +
          1. +

            Create callbacks:

            + +
            +evas_object_smart_callback_add(ad->scale_incr_button, "clicked", scale_incr_cb, NULL);
            +evas_object_smart_callback_add(ad->scale_decr_button, "clicked", scale_decr_cb, NULL);
            +evas_object_smart_callback_add(ad->blend_mode_button, "clicked", blend_mode_cb, ad);
            +evas_object_smart_callback_add(ad->copy_mode_button, "clicked", copy_mode_cb, ad);
            +
          2. + +
          3. +

            Implement callback functions to enable changing the scale and render mode:

            + +
            static void
            +scale_incr_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
            +   if (!evas_text)
            +      return;
            +
            +   double current_scale = evas_object_scale_get(evas_text);
            +
            +   if (current_scale >= 5.0)
            +      return;
            +
            +   evas_object_scale_set(evas_text, current_scale + 0.2);
            +}
            +
            +static void
            +scale_decr_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
            +   if (!evas_text)
            +      return;
            +
            +   double current_scale = evas_object_scale_get(evas_text);
            +
            +   if (current_scale <= 0.0)
            +   {
            +      return;
            +   }
            +
            +   evas_object_scale_set(evas_text, current_scale - 0.2);
            +}
            +
            +static void
            +blend_mode_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +
            +   evas_object_text_text_set(ad->render_text, "EVAS_RENDER_BLEND: d = d * (1-sa) + s");
            +   evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_BLEND);
            +}
            +
            +static void
            +copy_mode_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +
            +   evas_object_text_text_set(ad->render_text, "EVAS_RENDER_COPY: d = s");
            +   evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_COPY);
            +}
            +
          4. +
          + +

          Attaching Data to the Object

          +

          To attach data to the object:

          +
            +
          1. +

            Use the evas_object_data_set() function. To create the keyword to get the data, use the evas_object_data_get() function.

            + +

            Create the text object using the evas_object_text_add() function.

            + +
            +evas = evas_object_evas_get(ad->win);
            +
          2. + +
          3. +

            Create the Evas text object to be used as data attached to the button:

            + +
            +evas_text = evas_object_text_add(evas);
            +evas_object_text_text_set(evas_text, "Scalable Text Object");
            +evas_object_text_font_set(evas_text, "Sans", 10);
            +evas_object_color_set(evas_text, 50, 100, 200, 255);
            +evas_object_move(evas_text, 10, 90);
            +evas_object_show(evas_text);
            +
          4. +
          + +

          Attaching Data

          + +

          The data is passed to the function through buttons. Use the evas_object_data_set() function for the button. Give a pointer to the attach data, and the key name to associate it with the data.

          + +
          +evas_object_data_set(ad->scale_incr_button, "evas_text", evas_text);
          +evas_object_data_set(ad->scale_decr_button, "evas_text", evas_text);
          + +

          Getting data

          + +

          To get the file data attached to the object, use the evas_object_data_get() function and give the data key name added when you attached this data:

          + +
          Evas_Object *evas_text = evas_object_data_get(obj, "evas_text");
          + +

          Deleting data

          + +

          To delete the data attached to the object, use the evas_object_data_del() function and give the data key name added when you attached this data:

          + +
          evas_object_data_del(obj, "evas_text");
          + +

          Using Scale Functions

          + +

          To set the scale factor to a single Evas object instead of setting scale to the entire application, use the evas_object_scale_set() function. This is useful when you want scalable UI elements at runtime. However, only text and textblock objects have scaling change handlers. Other objects do not change visually on this call. In this application, the scale is defined in the button click callbacks.

          + +
          double current_scale = evas_object_scale_get(evas_text);
          +
          +if (current_scale >= 5.0)
          +   return;
          +
          +evas_object_scale_set(evas_text, current_scale + 0.2);
          + +

          Get the current scale of the Evas text object and check its maximum size. If the current size is smaller than the maximum size, the scale factor for the object is increased using the evas_object_scale_set function. The text object is updated on display and its size changes.

          + +

          Configuring the Evas Object Render Mode

          + +

          To change the render operation to be used for rendering the Evas object, use the evas_object_render_op_set() function. To get the current render operation, use the evas_object_render_op_get() function.

          + +

          Creating Rectangle Objects

          + +

          Creates Evas rectangle objects to change the Evas rendering mode for them:

          + +
          // Rectangle with yellow background
          +ad->render_rect1 = evas_object_rectangle_add(evas);
          +evas_object_color_set(ad->render_rect1, 240, 220, 50, 191);
          +evas_object_resize(ad->render_rect1, 260, 260);
          +evas_object_move(ad->render_rect1, 60, 400);
          +evas_object_show(ad->render_rect1);
          +
          +// Translucent rectangle with blue foreground
          +ad->render_rect2 = evas_object_rectangle_add(evas);
          +evas_object_color_set(ad->render_rect2, 25, 110, 220, 127);
          +evas_object_resize(ad->render_rect2, 260, 260);
          +evas_object_move(ad->render_rect2, 170, 500);
          +evas_object_show(ad->render_rect2);
          + +

          Changing the Render Operation

          + +

          To change the rendering mode, use the evas_object_render_op_set() function and give the render operation constant, which informs Evas of the function to use when drawing the eEvas object on canvas. By default, all evas objects use the EVAS_RENDER_BLEND mode and all colors are drawn using the "d = d*(1-sa) + s" formula, where "d" is destination color, "sa" is source alpha, and "s" is source color.

          + +

          Change the rendering mode to copy mode (d = s):

          + +
          evas_object_render_op_set(ad->render_rect2, EVAS_RENDER_COPY);
          + + + + + + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/evas_basic_objects_n.htm b/org.tizen.ui.practices/html/native/efl/evas_basic_objects_n.htm new file mode 100644 index 0000000..c6ade95 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_basic_objects_n.htm @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + Basic Manipulation of Evas Objects + + + + + + +
          +

          Basic Manipulation of Evas Objects

          + + +

          Most Evas objects can be manipulated using generic functions.

          + +

          The list of available basic actions does not depend on the object's type. Evas implements functionality that allows performing basic manipulation, such as showing, hiding, setting, and getting geometry, bringing a layer up or down, managing color, clipping, and reference counting.

          + +

          This tutorial introduces the basic manipulations available for Evas_Object object.

          + + +

          Working with Evas

          + +
            +
          1. +

            To start interacting with Evas, first create an Evas instance or get a reference to an already allocated Evas object:

            + +
            ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +Evas *evas = evas_object_evas_get(ad->win);
            +
          2. + +
          3. +

            When an instance of Evas object exists, you can start creating basic Evas objects using obtained reference to Evas as a parent for child objects. The following example creates an Evas_Object with size 480x800, position on window at 0,0 by x and y axis, and set as a background:

            + +
            +ad->bg = evas_object_rectangle_add(evas);
            +evas_object_color_set(ad->bg, 255, 255, 255, 255);
            +evas_object_resize(ad->bg, 480, 800);
            +evas_object_move(ad->bg, 0, 0);
            +evas_object_show(ad->bg);
            +
            + +

            Figure: Empty window

            +

            Empty window

            + +
          4. +
          + + +

          Clipping an Object

          + +

          You can set an Evas object as a clipper for another Evas object. To obtain a clipper object, create an Evas object, set its width and height parameters, and call the evas_object_clip_set() function to set the object as a clipper for other Evas objects:

          + +
          ad->img = evas_object_image_filled_add(evas);
          +_app_get_resource("images/enlightenment.png", image_path, PATH_MAX);
          +evas_object_image_file_set(ad->img, image_path, NULL);
          +if (evas_object_image_load_error_get(ad->img) != EVAS_LOAD_ERROR_NONE)
          +   return;
          +
          +evas_object_geometry_get(ad->spacer, NULL, NULL, &w, &h);
          +evas_object_name_set(ad->img, "background");
          +evas_object_resize(ad->img, WIDTH, HEIGHT);
          +evas_object_move(ad->img, w, h);
          +evas_object_show(ad->img);
          +
          +ad->clipper = evas_object_rectangle_add(evas);
          +evas_object_geometry_get(ad->img, &x, &y, &w, &h);
          +evas_object_move(ad->clipper, WIDTH / 4 + x, HEIGHT / 4 + y);
          +evas_object_resize(ad->clipper, w / 2, h / 2);
          +evas_object_clip_set(ad->img, ad->clipper);
          +evas_object_show(ad->clipper);
          +
          + +

          Figure: Using the clipper

          +

          Using the clipper

          + + +

          You can also unset the clipper object using the evas_object_clip_unset() function. As a result, there are 2 objects, an image and a rectangle. The rectangle is on top of the image object according to the creation order.

          + +
          static void
          +_clipper_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   const char *object_name = evas_object_name_get(ad->img);
          +   if (strcmp(object_name, "background") != 0)
          +      return;
          +
          +   if (evas_object_clip_get(ad->img) == ad->clipper)
          +      evas_object_clip_unset(ad->img);
          +   else
          +      evas_object_clip_set(ad->img, ad->clipper);
          +}
          + +

          Figure: Using the clipper

          +

          Using the clipper

          + +

          Changing Colors and Visibility

          + +

          You can manage the object colors and visibility. To change a color of a valid Evas_Object, use the evas_object_color_set() and pass a color value:

          + +
          static void
          +_color_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   int alpha, r, g, b;
          +
          +   evas_object_color_get(ad->clipper, &r, &g, &b, &alpha);
          +   evas_color_argb_unpremul(alpha, &r, &g, &b);
          +
          +   if (g > 0)
          +      g = b = 0;
          +   else
          +      g = b = 255;
          +
          +   evas_color_argb_premul(alpha, &r, &g, &b);
          +   evas_object_color_set(ad->clipper, r, g, b, alpha);
          +}
          + +

          Figure: Applying color

          +

          Applying color

          + +

          You can also change the opacity of the object:

          + +
          static void
          +_opacity_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   int alpha, r, g, b;
          +
          +   evas_object_color_get(ad->clipper, &r, &g, &b, &alpha);
          +   evas_color_argb_unpremul(alpha, &r, &g, &b);
          +
          +   alpha -= 20;
          +   if (alpha < 0)
          +      alpha = 255;
          +
          +   evas_color_argb_premul(alpha, &r, &g, &b);
          +   evas_object_color_set(ad->clipper, r, g, b, alpha);
          +}
          + +

          Figure: Changing opacity

          +

          Changing opacity

          + +

          You can also hide the object when it is not needed:

          + +
          static void
          +_visibility_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   if (evas_object_visible_get(ad->clipper))
          +      evas_object_hide(ad->clipper);
          +   else
          +      evas_object_show(ad->clipper);
          +}
          + +

          Figure: Changing visibility

          +

           Changing visibility

          + +

          Reference Counting

          + +

          Evas has a simple reference counting mechanism that is useful for scenarios like inside a code block, callbacks exist which would possibly delete an object we are operating on afterwards.

          +

          To increment the reference count of an object, use the evas_object_ref() function. If the reference count is greater than 0, the evas_object_del() function is called until all references are released. References cannot go below 0 and are limited to 2^32 - 1 for each object:

          + +
          ad->spacer = evas_object_rectangle_add(evas);
          +evas_object_color_set(ad->spacer, 0, 255, 100, 255);
          +evas_object_move(ad->spacer, 0, 0);
          +evas_object_resize(ad->spacer, 120, 20);
          +evas_object_show(ad->spacer);
          +evas_object_ref(ad->spacer);
          +
          +static void
          +_unref_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   if (!ad->spacer)
          +      return;
          +
          +   if (evas_object_ref_get(ad->spacer) != 0)
          +   {
          +      evas_object_unref(ad->spacer);
          +      return;
          +   }
          +
          +int x, y, w, h;
          +
          +evas_object_geometry_get(ad->spacer, &x, &y, NULL, NULL);
          +evas_object_move(ad->img, x, y);
          +evas_object_geometry_get(ad->img, &x, &y, &w, &h);
          +evas_object_move(ad->clipper, x + (w / 4), y + (h / 4));
          +evas_object_move(ad->clipper_border, x + (w / 4) - 3, y + (h / 4) - 3);
          +evas_object_del(ad->spacer);
          +ad->spacer = NULL;
          +}
          + + +

          A green rectangle is used as a padding and the clipper object calculates its x, y coordinates based on the rectangle position. The rectangle reference count is increased by calling the evas_object_ref() function and now it is equal to 1. When the _unref_cb callback is triggered, the reference count value is higher than 0 and the evas_object_del(ad->spacer) function has no effect on the object. After the second callback call, the evas_object_ref_get(ad->spacer) function returns 0 and the evas_object_del(ad->spacer) function marks the rectangle object for deletion.

          + +

          Figure: Removing padding

          +

          Removing padding

          + +

          Changing the Object Order on Canvas

          + +

          By default, the placing of objects on canvas is based on their creation order.

          + +
          +ad->order_rect1 = evas_object_rectangle_add(evas);
          +evas_object_name_set(ad->order_rect1, "red");
          +evas_object_color_set(ad->order_rect1, 255, 0, 0, 255);
          +evas_object_move(ad->order_rect1, 120, 310);
          +evas_object_resize(ad->order_rect1, 200, 200);
          +evas_object_show(ad->order_rect1);
          +
          +ad->order_rect2 = evas_object_rectangle_add(evas);
          +evas_object_name_set(ad->order_rect2, "blue");
          +evas_object_color_set(ad->order_rect2, 0, 0, 255, 255);
          +evas_object_move(ad->order_rect2, 180, 350);
          +evas_object_resize(ad->order_rect2, 200, 200);
          +evas_object_show(ad->order_rect2);
          +
          + +

          Figure: Default order of objects on canvas

          +

          Default order of objects on canvas

          + +

          You can change the object triggering the _object_order_cb() callback, which switches the order of the rectangles.

          + +
          static void
          +_object_order_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   Evas_Object *rect = evas_object_below_get(ad->order_rect2);
          +   if (!rect)
          +      return;
          +
          +   const char *name = evas_object_name_get(rect);
          +   if (name)
          +      if (strcmp(name, "red") == 0)
          +      {
          +         evas_object_stack_below(ad->order_rect2, rect);
          +
          +         return;
          +      }
          +
          +   rect = evas_object_below_get(ad->order_rect1);
          +   if (!rect)
          +      return;
          +
          +   name = evas_object_name_get(rect);
          +   if (name)
          +      if (strcmp(name, "blue") == 0)
          +      {
          +         evas_object_stack_below(ad->order_rect1, rect);
          +
          +         return;
          +      }
          +}
          + +

          Figure: Changed order of objects on canvas

          +

          Changed order of objects on canvas

          + +

          Evas allows placing an object to top and bottom layer of the canvas object stack. The of _raise_cb callback puts the canvas background on the top position of the screen. The call of _lower_cb callback puts the background to the bottom.

          + +
          static void
          +_lower_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   evas_object_lower(ad->bg);
          +}
          +
          +static void
          +_raise_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
          +{
          +   App_Data *ad = (App_Data *)data;
          +
          +   evas_object_raise(ad->bg);
          +   ad->isBgOnTop = EINA_TRUE;
          +}
          + +

          Figure: Canvas background by default and on top

          +

          Canvas background by default and on top

          + + + + + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/evas_map_animation_n.htm b/org.tizen.ui.practices/html/native/efl/evas_map_animation_n.htm new file mode 100644 index 0000000..d658dd6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_map_animation_n.htm @@ -0,0 +1,389 @@ + + + + + + + + + + + + + Evas Map Effects + + + + + +
          + +

          Evas Map Effects

          + +

          Evas Map animations allow you to apply transformations to all types of objects by way of UV mapping.

          + +

          In UV mapping, you map points in the source object to 3D space positions in the target object. This allows for rotation, perspective, scale, and other transformation effects, depending on the map. In addition, each map point can carry a multiplier color, which, if properly calculated, can be used to apply 3D shading effects on the target object.

          + +

          Evas provides both raw and easy-to-use functions for UV mapping. The raw functions allow you to create UV maps outside Evas and import them into your application, for example by loading them from an external file. The easy-to-use functions allow you to create UV maps directly in Evas by calculating the map points based on high-level parameters, such as rotation angle and ambient light.

          + +

          Map Points

          + +

          A map consists of a set of points. (Currently, only four points are supported.) Each point contains X and Y canvas coordinates that can be used to alter the geometry of the mapped object, and a Z coordinate that indicates the depth of the point. The Z coordinate does not normally affect the map, but several utility functions use it to calculate the right position of the point given the other parameters.

          + +

          First, create an Evas_Map object using the evas_map_new() function. This function creates the specified number of map points (currently only up to four points). Each point is empty and ready to be modified with Evas_Map functions.

          + +
          Evas_Map *m = evas_map_new(4);
          + +

          If you want to get the size (number of points) of an existing map, use the evas_map_count_get() function.

          + +

          To set the coordinates for each point, use the evas_map_point_coord_set() function:

          + +
          evas_map_point_coord_set(Evas_Map *m, int idx, Evas_Coord x, Evas_Coord y, Evas_Coord z)
          + +

          The following example shows a common way to define a map that matches the geometry of a rectangle (a square in this case):

          + +
          +evas_map_point_coord_set(m, 0, 100, 100, 0);
          +evas_map_point_coord_set(m, 1, 300, 100, 0);
          +evas_map_point_coord_set(m, 2, 300, 300, 0);
          +evas_map_point_coord_set(m, 3, 100, 300, 0);
          +
          + +

          Figure: Map

          +

          Map

          + +

          The following examples all produce the same result as the above example, but with simpler code:

          + +
            +
          • +

            To create a rectangle map using the starting X and Y coordinates combined with width and height, use the evas_map_util_points_populate_from_geometry() function:

            +
            evas_map_util_points_populate_from_geometry(Evas_Map *m, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Evas_Coord z)
            +

            The following example creates the same map as above:

            +
            evas_map_util_points_populate_from_geometry(m, 100, 100, 200, 200, 0);
            +
          • +
          • +

            To create a map based on the geometry of a given object, use the evas_map_util_points_populate_from_object() or evas_map_util_points_populate_from_object_full() function. The former sets the Z coordinate of all points to 0, whereas the latter allows you to define the same custom Z coordinate for all points:

            +
            evas_map_util_points_populate_from_object(Evas_Map *m, const Evas_Object *obj)
            +
            evas_map_util_points_populate_from_object_full(Evas_Map *m, const Evas_Object *obj, Evas_Coord z)
            +

            The following example creates the same map as above:

            +
            +Evas_Object *o;
            +evas_object_move(o, 100, 100);
            +evas_object_resize(o, 200, 200);
            +evas_map_util_points_populate_from_object(m, o);
            +// OR
            +evas_map_util_points_populate_from_object_full(m, o, 0);
            +
          • +
          + +

          You can apply several effects to an object by simply setting each point of the map to the appropriate coordinates. The following example shows how to create a simulated perspective:

          + +

          Figure: Simulated perspective

          +

          Simulated perspective

          + +
          +evas_map_point_coord_set(m, 0, 100, 100, 0);
          +evas_map_point_coord_set(m, 1, 250, 120, 0);
          +evas_map_point_coord_set(m, 2, 250, 280, 0);
          +evas_map_point_coord_set(m, 0, 100, 300, 0);
          +
          + +

          In the above example, the Z coordinate is unused: when setting points by hand, the Z coordinate is irrelevant.

          + +

          If you want to get the actual coordinates of a map, use the evas_map_point_coord_get() function:

          + +
          evas_map_point_coord_get(const Evas_Map *m, int idx, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z)
          + +

          After you have defined the map points, apply them to your map for transformation:

          + +
          +evas_object_map_set(o, m);
          +evas_object_map_enable_set(o, EINA_TRUE);
          +
          + +

          Finally, after you are done with the map, release the memory allocated to it using the evas_map_free() function:

          + +
          evas_map_free(m);
          + +

          The utility functions described in the next section allow you to perform the above tasks with less coding work.

          + +

          Utility Functions

          + +

          Utility functions take an already configured map and allow you to easily modify it to produce specific effects. For example, to rotate an object around its center, you need the rotation angle and the coordinates of each corner of the object to perform the math required to get the new set of coordinates that needs to be set for the map. Evas provides a utility function that does the math for you:

          + +
          evas_map_util_rotate(Evas_Map *m, double degrees, Evas_Coord cx, Evas_Coord cy)
          + +

          This function rotates the map based on the angle and the center coordinates of the rotation provided as arguments. A positive angle rotates the map clockwise, while a negative angle rotates the map counter-clockwise.

          + +

          The following example shows how to rotate an object around its center point by 45 degrees clockwise. In the following figure, the center of rotation is the red dot.

          + +
          +evas_object_geometry_get(o, &x, &y, &w, &h);
          +m = evas_map_new(4);
          +evas_map_util_points_populate_from_object(m, o);
          +evas_map_util_rotate(m, 45, x + (w / 2), y + (h / 2));
          +evas_object_map_set(o, m);
          +evas_object_map_enable_set(o, EINA_TRUE);
          +evas_map_free(m);
          +
          + +

          Figure: Rotating around the center point

          +

          Rotating around the center point

          + +

          You can rotate the object around any other point simply by setting the last two arguments of the evas_map_util_rotate() function to the appropriate values:

          + +
          evas_map_util_rotate(m, 45, x + w - 20, y + h - 20);
          + +

          Figure: Rotating around other points

          +

          Rotating around other points

          + +

          You can also set the center of the window as the center of the rotation using the appropriate coordinates of the Evas canvas:

          + +
          +evas_output_size_get(evas, &w, &h);
          +m = evas_map_new(4);
          +evas_map_util_points_populate_from_object(m, o);
          +evas_map_util_rotate(m, 45, w, h);
          +evas_object_map_set(o, m);
          +evas_object_map_enable_set(o, EINA_TRUE);
          +evas_map_free(m);
          +
          + +

          Zoom

          + +

          The evas_map_util_zoom() function zooms the points of the map from a center point, defined by cx and cy. The zoomx and zoomy arguments specify how much to zoom in on the X and Y axes. A value of 1.0 means no zoom, 2.0 means double the size, 0.5 means half the size, and so on. All the coordinates are global canvas coordinates.

          + +
          +evas_map_util_zoom(Evas_Map *m, double zoomx, double zoomy, Evas_Coord cx, Evas_Coord cy)
          +
          + +

          3D Maps

          + +

          Maps can also be used to achieve a 3D effect. In a 3D effect, the Z coordinate of each point is meaningful: the higher the value, the further back the point is located. Smaller values (usually negative) mean that the point is closer to the user.

          + +

          3D also introduces the concept of the back face of an object. An object is said to be facing the user when all its points are placed in a clockwise formation, as shown in the left map in the following figure. Rotating the map around its Y axis swaps the order of the points into a counter-clockwise formation, making the object face away from the user, as shown in the right map in the following figure. The back face is especially relevant in lighting (see below).

          + +

          Figure: Rotating around the Y axis

          +

          Rotating around the Y axis

          + +

          To determine whether a map is facing the user, use the evas_map_util_clockwise_get() function. This function returns EINA_TRUE if the map is facing the user and EINA_FALSE if the map is facing away from the user. This is normally done after all the other operations are applied to the map.

          + +
          evas_map_util_clockwise_get(Evas_Map *m)
          + +

          3D Rotation and Perspective

          + +

          The evas_map_util_3d_rotate() function transforms a map to apply a 3D rotation to the mapped object. You can apply the rotation around any point in the canvas (including a Z coordinate). You can also apply the rotation around any of the three axes.

          + +
          evas_map_util_3d_rotate(Evas_Map *m, double dx, double dy, double dz, Evas_Coord cx, Evas_Coord cy, Evas_Coord cz)
          + +

          Starting from this simple setup, and setting the maps so that the blue square rotates around the Y axis, we get the following:

          + +

          Figure: 3D rotation

          +

          3D rotation

          + +

          A simple overlay over the image shows the original geometry of each object and the axis around which they are being rotated. The Z axis is not shown, since it is orthogonal to the screen. To show the Z axis, that is, to add 3D perspective to the transformation, use the evas_map_util_3d_perspective() function on the map after its position has been set:

          + +
          evas_map_util_3d_perspective(Evas_Map *m, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
          + +

          The result makes the vanishing point the center of each object:

          + +

          Figure: Adding perspective

          +

          Adding perspective

          + +

          Color and Lighting

          + +

          Each point in a map can be set to a color, which will be multiplied with the object’s own color and linearly interpolated between adjacent points. To set the color separately for each point, use the evas_map_point_color_set() function:

          + +
          evas_map_point_color_set(Evas_Map *m, int idx, int r, int g, int b, int a)
          + +

          To set the same color for every point, use the evas_map_util_points_color_set() function:

          + +
          evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
          + +

          When using a 3D effect, colors can be used to improve its look by simulating a light source. The evas_map_util_3d_lighting() function makes this task easier by taking the coordinates of the light source and its color, along with the color of the ambient light. Evas then sets the color of each point based on its distance to the light source, the angle at which the object is facing the light source, and the ambient light. Here, the orientation of each point is important.

          + +
          evas_map_util_3d_lighting(Evas_Map *m, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab)
          + +

          If the map points are defined counter-clockwise, the object faces away from the user and is therefore obscured, since no light is reflecting back from it.

          + +

          Figure: Obscured object

          +

          Obscured object

          + +

          Mapping

          + +

          Images need special handling when mapped. While Evas can easily handle objects, it is completely oblivious to the contents of images. This means that each point in a map needs to be mapped to a specific pixel in the source image. Failing to do this can result in unexpected behavior.

          + +

          Let's get started with the following three images, each sized at 200 × 200 pixels:

          + +

          Figure: Starting point

          +

          Starting point

          + +

          The following three images illustrate the case where a map is set to an image object without setting the right UV mapping for each map point. The objects themselves are mapped properly to their new geometries, but the images are not displayed correctly within the mapped objects.

          + +

          Figure: Questionable result

          +

          Questionable result

          + +

          To transform an image correctly, Evas needs to know how to handle the image within the map. You can do this using the evas_map_point_image_uv_set() function, which allows you to map a given point in a map to a given pixel in a source image:

          + +
          +evas_map_point_image_uv_set(Evas_Map *m, int idx, double u, double v)
          +
          + +

          To match our example images to the maps above, all we need is the size of each image, which we can get using the evas_object_image_size_get() function.

          + +
          +// Tux 1: Some cropping and stretch up
          +evas_map_point_image_uv_set(m, 0, 0, 20);
          +evas_map_point_image_uv_set(m, 1, 200, 20);
          +evas_map_point_image_uv_set(m, 2, 200, 180);
          +evas_map_point_image_uv_set(m, 3, 0, 180);
          +evas_object_map_set(tux1, m);
          +evas_object_map_enable_set(tux1, EINA_TRUE);
          +
          +// Inverted texture for shadow:
          +evas_map_point_image_uv_set(m, 0, 0, 180);
          +evas_map_point_image_uv_set(m, 1, 200, 180);
          +evas_map_point_image_uv_set(m, 2, 200, 20);
          +evas_map_point_image_uv_set(m, 3, 0, 20);
          +evas_object_map_set(tux1_shadow, m);
          +evas_object_map_enable_set(tux1_shadow, EINA_TRUE);
          +
          +// Tux 2: Make it fit to the map:
          +evas_map_point_image_uv_set(m, 0, 0, 0);
          +evas_map_point_image_uv_set(m, 1, 200, 0);
          +evas_map_point_image_uv_set(m, 2, 200, 200);
          +evas_map_point_image_uv_set(m, 3, 0, 200);
          +evas_object_map_set(tux2, m);
          +evas_object_map_enable_set(tux2, EINA_TRUE);
          +
          +// Tux 3: Zoom and fit relatively to image size
          +evas_object_image_size_get(evas_object_image_source_get(tux3), &w, &h);
          +evas_map_point_image_uv_set(m, 0, 0.1 * w, 0.1 * h);
          +evas_map_point_image_uv_set(m, 1, 0.9 * w, 0.1 * h);
          +evas_map_point_image_uv_set(m, 2, 0.9 * w, 0.9 * h);
          +evas_map_point_image_uv_set(m, 3, 0.1 * w, 0.9 * h);
          +evas_object_map_set(tux3, m);
          +evas_object_map_enable_set(tux3, EINA_TRUE);
          +
          + +

          Figure: Correct result

          +

          Correct result

          + +

          You can also set a map to use only part of an image, or you can even map the points in inverted order. Combined with the evas_object_image_source_set() function, you can achieve more interesting results still.

          + +

          Lighting

          + +

          Evas_Map allows you to define an ambient light and a light source within the scene. Both of these light sources have their own colors.

          + +
          evas_map_util_3d_lighting(Evas_Map *m, Evas_Coord lx, Evas_Coord ly, Evas_Coord lz, int lr, int lg, int lb, int ar, int ag, int ab)
          + +

          The above function is used to apply lighting calculations (from a single light source) to a given map. The red, green, and blue values of each vertex will be modified to reflect the lighting based on the light source coordinates, its color, the ambient color, and the angle at which the map faces the light source. The points of a surface should be defined in a clockwise formation if the surface is facing the user, since faces have a logical side for lighting.

          + +

          To get the reflections (gradient) in the shadow of our previous example, you have to define a source of light close enough to the user and a very bright ambient light, for example:

          + +
          +evas_map_util_3d_lighting(m, // Evas_Map object
          +                          250/2, 150/2, -100, // Spot light coordinates
          +                          255, 255, 255, // Spot light color
          +                          200, 200, 200); // Ambient light color
          +
          + +

          Alpha Channel

          + +

          You can also use an alpha channel on your map by enabling the alpha channel feature:

          + +
          evas_map_alpha_set(Evas_Map *m, Eina_Bool enabled)
          + +

          Next, set the alpha value separately for each map point:

          + +
          evas_map_point_color_set(Evas_Map *m, int idx, int r, int g, int b, int a)
          + +

          Alternatively, you can set the same alpha value to all map points:

          + +
          evas_map_util_points_color_set(Evas_Map *m, int r, int g, int b, int a)
          + +

          The following code sets the shadow transparency for the first image in the above three-image example:

          + +
          +// Set object transparency to 50%:
          +evas_map_util_points_color_set(m, 255, 255, 255, 127);
          +
          +// Tux's head is almost invisible in the shadow:
          +evas_map_point_color_set(m, 3, 255, 255, 255, 15);
          +evas_map_point_color_set(m, 4, 255, 255, 255, 15);
          +
          + +

          Smoothing

          + +

          To enable smoothing when rendering a map, use the evas_map_smooth_set() function:

          + +
          evas_map_smooth_set(Evas_Map *m, Eina_Bool enabled)
          + +

          The first argument is the Evas_Map object to apply smoothing to. The second argument sets whether to enable the smoothing:

          + +
            +
          • EINA_TRUE: Enable smoothing.
          • +
          • EINA_FALSE: Disable smoothing.
          • +
          + +

          If the object is of a type that has its own smoothing settings, the smoothing settings must be disabled for both the object and the map. Map smoothing is enabled by default. To check whether map smoothing is enabled, use the evas_map_smooth_get() function.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/evas_map_effects_n.htm b/org.tizen.ui.practices/html/native/efl/evas_map_effects_n.htm new file mode 100644 index 0000000..79f4d71 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_map_effects_n.htm @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + Creating Evas Map Effects + + + + + + +
          +

          Creating Evas Map Effects

          + + +

          This tutorial demonstrates how you can use Evas map functions to create an application in which you can change the map point coordinates of Evas objects. You can modify the map point U and V texture source point using Evas map mapping APIs. "U" and "V" denote the axes of the 2D texture.

          + +

          Figure: Evas map mapping application

          +

          Evas map mapping application

          + +

          Creating the Basic Application

          +

          To create a basic application:

          +
            +
          1. +

            To use the required APIs, include the following libraries:

            + +
            #include <app.h>
            +#include <Elementary.h>
            +#include <system_settings.h>
            +#include <efl_extension.h>
            +
          2. + +
          3. +

            Create an Evas object for an Elementary window and a button for mapping the map information:

            + +
            typedef struct appdata 
            +{
            +   Evas_Object *win;
            +   Evas_Object *button;
            +Evas_Object *default_btn;
            +} 
            +appdata_s;
            +
          4. +
          5. +

            To create an Elementary window, use the elm_win_util_standard_add() function and give the name and title of the application. To set a callback on hardware Back button, the use eext_object_event_callback_add() function. To display the Evas object, use the evas_object_show() function.

            + +
            static void
            +create_base_gui(appdata_s *ad)
            +{
            +    Evas_Object *evas_text = NULL;
            +    Evas *evas                = NULL;
            +
            +   // Window
            +   ad->win = elm_win_util_standard_add("Extra object function", "Extra object function");
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   // Window callbacks
            +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, back_cb, ad);
            +
            +   evas = evas_object_evas_get(ad->win);
            +
            +   evas_text = evas_object_text_add(evas);
            +   evas_object_text_text_set(evas_text, "Evas Map Mapping");
            +   evas_object_text_font_set(evas_text, "Sans", 18);
            +   evas_object_color_set(evas_text, 50, 100, 200, 255);
            +   evas_object_move(evas_text, 10, 90);
            +   evas_object_show(evas_text);
            +
            +   // Evas map source code
            +
            +   evas_object_show(ad->win);
            +}
            +
          6. + +
          7. +

            Implement callback functions to enable closing the application:

            + +
            static void
            +back_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *ad = data;
            +
            +   elm_win_lower(ad->win);
            +}
            +
            +static void
            +win_delete_request_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   ui_app_exit();
            +}
            +
          8. + +
          9. +

            Create an elementary application with a GUI:

            + +
            static bool
            +app_create(void *data)
            +{
            +   appdata_s *ad = data;
            +
            +   // Create the application UI
            +   create_base_gui(ad);
            +
            +   return true;
            +}
            +
            +int
            +main(int argc, char *argv[])
            +{
            +   appdata_s ad = {0,};
            +
            +   ui_app_lifecycle_callback_s event_callback = {0,};
            +
            +   event_callback.create = app_create;
            +
            +   // Run the main loop
            +   return ui_app_main(argc, argv, &event_callback, &ad);
            +}
            +
          10. + +
          11. +

            Create the button for mapping. Use the move and resize functions to configure the button's custom geometry:

            + +
            // Create a button for mapping
            +ad->button = elm_button_add(ad->win);
            +elm_object_text_set(ad->button, "Evas Map Mapping ");
            +evas_object_move(ad->button, 15, 100);
            +evas_object_resize(ad->button, ELM_SCALE_SIZE(250), ELM_SCALE_SIZE(200));
            +evas_object_show(ad->button);
            +
            +// Create a default button
            +ad->default_btn = elm_button_add(ad->win);
            +elm_object_text_set(ad->default_btn, "Default Button ");
            +evas_object_move(ad->default_btn, 15, 300);
            +evas_object_resize(ad->default_btn, ELM_SCALE_SIZE(250), ELM_SCALE_SIZE(200));
            +evas_object_show(ad->default_btn);
            +
          12. +
          + +

          Creating Map Data

          + +

          By using the evas_map_new() and evas_map_*() functions, you can create map data to be attached to the button:

          + +
            +
          1. +

            Get the Evas_Map object to create map data using the evas_map_new() function:

            + +
            +Evas_Map *map;
            +map = evas_map_new(4);
            + +

            The map of transformation points is used later with an Evas object.

            +
          2. + +
          3. +

            Set the coordinates for each point using the evas_map_point_coord_set() function. You can apply several effects to the Evas object by setting each point of the map to the right coordinates.

            + +
            // Set map coordinates
            +evas_map_point_coord_set(map, 0, 15, 100, 0);
            +evas_map_point_coord_set(map, 1, 265, 100, 0);
            +evas_map_point_coord_set(map, 2, 265, 300, 0);
            +evas_map_point_coord_set(map, 3, 15, 400, 0);
            +
          4. + +
          5. +

            Set UV data using the evas_map_point_image_uv_set() function, which informs the map of the correct pixels in the image it is mapping:

            + +
            // Set image UV
            +evas_map_point_image_uv_set(map, 0, 0, 0);
            +evas_map_point_image_uv_set(map, 1, 500, 50);
            +evas_map_point_image_uv_set(map, 2, 500, 400);
            +evas_map_point_image_uv_set(map, 3, 0, 200);
            +
          6. +
          + + +

          Applying the Map to the Evas Object

          + +

          To set the map on a given object, use the evas_object_map_set() function for the object. A map contains 4 points, each having canvas x, y coordinates with an optional z point value for perspective correction, if available. Each point also has U an V coordinates.

          + +
          // Apply map to button evas object
          +
          +evas_object_map_set(ad->button, map);
          + +

          Clearing Map Data and Enabling Map Features

          + +

          Free the map data and all memory associated with it when you no longer need it:

          + +
          // Free map resources
          +
          +evas_map_free(map);
          + +

          You can enable or disable the map features for the object. When enabled, the object geometry is saved, and the new geometry changes its position and size to reflect the set map geometry.

          + +
          // Enable map features
          +
          +evas_object_map_enable_set(ad->button, EINA_TRUE);
          + + + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/evas_objects_n.htm b/org.tizen.ui.practices/html/native/efl/evas_objects_n.htm new file mode 100644 index 0000000..8cb88d4 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_objects_n.htm @@ -0,0 +1,824 @@ + + + + + + + + + + + + + Evas Objects + + + + + +
          + +

          Evas Objects

          + +

          An Evas object is the most basic visual entity used in Evas. Everything, be it a single line or a complex list of UI components, is an Evas object.

          + +

          Primitive Renderable Objects

          +

          Primitive objects are the base upon which to build a complex interface: rectangles, lines, polygons, images, textblocks, and texts.

          +

          Rectangle

          +

          There is only one function to deal with rectangle objects. However, the rectangle is manipulated using the generic evas object functions.

          +

          The evas rectangle serves a number of key functions when working on Evas programs.

          +
            +
          • background
          • +
          • debugging
          • +
          • clipper
          • +
          + +

          Background

          +

          A common requirement of Evas programs is to have a solid color background, which can be accomplished with the following code.

          +
          Evas_Object *bg = evas_object_rectangle_add(evas_canvas);
          +
          +// Here we set the rectangles red, green, blue and opacity levels
          +evas_object_color_set(bg, 255, 255, 255, 255); // opaque white background
          +evas_object_resize(bg, WIDTH, HEIGHT); // covers full canvas
          +evas_object_show(bg);
          +
          + +

          Debugging

          +

          When debugging visual issues with evas programs, the rectangle is a useful tool. The rectangle's simplicity means that it is easier to pinpoint issues with it than with more complex objects. A common technique to use when writing an evas program and not getting the desired visual result is to replace an object for a solid color rectangle and seeing how it interacts with the other elements. This often allows us to notice clipping, parenting or positioning issues. Once the issues are identified and corrected, the rectangle can be replaced for the original object, and in all likelihood any remaining issues are specific to that object's type.

          + +

          Clipping

          +

          Clipping serves two main functions:

          +
            +
          • limiting visibility
          • +
          • applying a layer of color to an object
          • +
          + + +

          Text

          +

          An Evas text object shows a basic single-line single-style text.

          +
          Evas_Object *text = evas_object_text_add(evas_canvas);
          +evas_object_text_text_set(text, "some text");
          +evas_object_color_set(text, 127, 0, 0, 127);
          +evas_object_show(text);
          +
          + +

          To set the text, use evas_object_text_text_set(text, some_text). You can set the current text with evas_object_text_text_get(text).

          +

          To set the font, use evas_object_text_font_set(text, font, size):

          +
            +
          • text: The text object
          • +
          • font: The font name you want to use
          • +
          • size: The font size you want to use. To query the current font, use evas_object_text_font_set(text, font, size).
          • +
          +

          To set the text style, use evas_object_text_style_set(text, style). The following styles are supported:

          +
            +
          • EVAS_TEXT_STYLE_PLAIN: Plain, standard text
          • +
          • EVAS_TEXT_STYLE_SHADOW: Text with shadow underneath
          • +
          • EVAS_TEXT_STYLE_OUTLINE: Text with an outline
          • +
          • EVAS_TEXT_STYLE_SOFT_OUTLINE: Text with a soft outline
          • +
          • EVAS_TEXT_STYLE_GLOW: Text with a glow effect
          • +
          • EVAS_TEXT_STYLE_OUTLINE_SHADOW: Text with both outline and shadow effects
          • +
          • EVAS_TEXT_STYLE_FAR_SHADOW: Text with (far) shadow underneath
          • +
          • EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW: Text with outline and soft shadow effects combined
          • +
          • EVAS_TEXT_STYLE_SOFT_SHADOW: Text with (soft) shadow underneath
          • +
          • EVAS_TEXT_STYLE_FAR_SOFT_SHADOW: Text with (far soft) shadow underneath
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT: Shadow growing to bottom right
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM: Shadow growing to the bottom
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT: Shadow growing to bottom left
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT: Shadow growing to the left
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT: Shadow growing to top left
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP: Shadow growing to the top
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT: Shadow growing to top right
          • +
          • EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT: Shadow growing to the right. To query the current style, use evas_object_text_style_get(text).
          • +
          +

          If the text does not fit, make an ellipsis on it by using evas_object_text_ellipsis_set(text, ellipsis). The (float) value specifies, which part of the text is shown.

          +
            +
          • 0.0: The beginning is shown and the end trimmed.
          • +
          • 1.0: The beginning is trimmed and the end shown.
          • +
          • Any value in between means that both ends of the text have ellipsis and the set part is shown.
          • +
          • -1.0: Ellipsis is disabled. To query the current ellipsis value, use evas_object_text_ellipsis_get(text).
          • +
          +

          When the text style is set to glow, set the glow color using evas_object_text_glow_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. The effect is placed at a short distance from the text but not touching it. For glows set right at the text, use evas_object_text_glow2_color_set(text, r, g, b, a). To query the current color, use evas_object_text_glow_color_get(text, r, g, b, a), respectively evas_object_text_glow2_color_get(text, r, g, b, a).

          +

          If your text style is set to display a shadow, use evas_object_text_shadow_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. To query the current color, use evas_object_text_shadow_color_get(text, r, g, b, a)

          +

          If your text style is set to display an outline, use evas_object_text_outline_color_set(text, r, g, b, a), where r, g, b, and a are respectively the red, green, blue, and alpha values. To query the current color, use evas_object_text_outline_color_get(text, r, g, b, a)

          + + +

          Primitive Smart Objects

          +

          A smart object is a special Evas object that provides custom functions to handle automatically clipping, hiding, moving, resizing color setting and more on child elements, for the smart object's user. They could be, for example, a group of objects that move together, or implementations of whole complex UI components, providing some intelligence and extension to simple Evas objects.

          + +

          Primitive Container Objects

          +

          A container is a Smart object that holds children Evas objects in a specific fashion.

          +

          Table

          +

          A table is a smart object that packs children using a tabular layout.

          +
          table = evas_object_table_add(evas);
          +evas_object_table_homogeneous_set(table, EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE);
          +evas_object_table_padding_set(table, 0, 0);
          +evas_object_resize(table, WIDTH, HEIGHT);
          +evas_object_show(table);
          +
          +rect = evas_object_rectangle_add(evas);
          +evas_object_color_set(rect, 255, 0, 0, 255);
          +evas_object_size_hint_min_set(rect, 100, 50);
          +evas_object_show(rect);
          +evas_object_table_pack(table, rect, 1, 1, 2, 1);
          +
          +rect = evas_object_rectangle_add(d.evas);
          +evas_object_color_set(rect, 0, 255, 0, 255);
          +evas_object_size_hint_min_set(rect, 50, 100);
          +evas_object_show(rect);
          +evas_object_table_pack(table, rect, 1, 2, 1, 2);
          +
          +rect = evas_object_rectangle_add(d.evas);
          +evas_object_color_set(rect, 0, 0, 255, 255);
          +evas_object_size_hint_min_set(rect, 50, 50);
          +evas_object_show(rect);
          +evas_object_table_pack(table, rect, 2, 2, 1, 1);
          +
          +rect = evas_object_rectangle_add(d.evas);
          +evas_object_color_set(rect, 255, 255, 0, 255);
          +evas_object_size_hint_min_set(rect, 50, 50);
          +evas_object_show(rect);
          +evas_object_table_pack(table, rect, 2, 3, 1, 1);
          +
          + +

          In this example, we add a non-homogeneous table to the canvas with its padding set to 0.

          +

          We then add four different colored rectangles with different properties.

          +
            +
          • the first one, at the first column and first line, spans two columns and one line
          • +
          • the second one, at the first column and second line, spans one columns and two lines
          • +
          • the third one, at the second column and second line, fits in one cell
          • +
          • the fourth one, at the second column and third line, also fits in one cell
          • +
          +

          To create a table, use evas_object_table_add(evas).

          +

          To set the table layout (the cells), use evas_object_table_homogeneous_set(table, homogeneous). The following values can be homogeneous:

          +
            +
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_NONE: This default value has columns and rows calculated based on hints of individual cells. This is flexible, but much heavier on computations.
          • +
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_TABLE: The table size is divided equally among children, filling the whole table area. If the children have a minimum size that is larger than this (including padding), then the table overflows and is aligned respecting the alignment hint, possibly overlapping sibling cells.
          • +
          • EVAS_OBJECT_TABLE_HOMOGENEOUS_ITEM: The greatest minimum cell size is used: if no element is set to expand, the contents of the table are the minimum size and the bounding box of all the children is aligned relatively to the table object using evas_object_table_align_get(). If the table area is too small to hold this minimum bounding box, then the objects keep their size and the bounding box overflows the box area, still respecting the alignment. To set the current mode, use evas_object_table_homogeneous_get(table).
          • +
          +

          The table's content alignment is set using evas_object_table_align_set(table, horizontal, vertical), where horizontal and vertical are floating values. To see them, use evas_object_table_align_get(table, horizontal, vertical).

          +

          To set the padding, use evas_object_table_padding_set(table, horizontal, vertical). To see the current value, use evas_object_table_padding_get(table, horizontal, vertical).

          +

          _To see the current column and row count, use evas_object_table_col_row_size_get(table, columns, rows).

          + +

          Grid

          +

          A grid is a smart object that packs its children as with a regular grid layout.

          +

          Grids are added to the canvas with evas_object_grid_add(evas).

          +

          To change a grid's virtual resolution, use evas_object_grid_size_set(grid, width, height), to see it, use evas_object_grid_size_get(grid, width, height).

          +

          To add an object, use evas_object_grid_pack(grid, child, x, y, w, h), where

          +
            +
          • x is the virtual X coordinate of the child
          • +
          • y is the virtual y coordinate of the child
          • +
          • w is the virtual width of the child
          • +
          • h is the virtual height of the child
          • +
          +

          Box

          +

          A box is a simple container that sets its children objects linearly.

          +

          To add a box to your canvas, use evas_object_box_add(evas).

          +

          To add a child to the box, use

          +
            +
          • evas_object_box_append(box, child): The child is appended.
          • +
          • evas_object_box_insert_after(box, child, reference): The child is added after reference.
          • +
          • evas_object_box_insert_before(box, child, reference): The child is added before reference.
          • +
          • evas_object_box_insert_at(box, child, pos): The child is added at the specified position.
          • +
          +

          To set the alignment, use evas_object_box_align_set(box, horizontal, vertical).

          +
            +
          • horizontal: 0.0 means aligned to the left, 1.0 means to the right;
          • +
          • vertical: 0.0 means aligned to the top, 1.0 means to the bottom.
          • +
          +

          Evas has predefined box layouts available:

          +
            +
          • evas_object_box_layout_horizontal();
          • +
          • evas_object_box_layout_vertical();
          • +
          • evas_object_box_layout_homogeneous_horizontal();
          • +
          • evas_object_box_layout_homogeneous_vertical();
          • +
          • evas_object_box_layout_homogeneous_max_size_horizontal();
          • +
          • evas_object_box_layout_homogeneous_max_size_vertical();
          • +
          • evas_object_box_layout_flow_horizontal();
          • +
          • evas_object_box_layout_flow_vertical();
          • +
          • evas_object_box_layout_stack().
          • +
          + +

          Image Objects

          + + +

          Using Evas, you can create and manipulate image objects. Evas supports image loaders of various formats as plug-in modules.

          +

          The image formats that Evas supports include bmp, edj, gif, ico, jpeg, pmaps, png, psd, svg, tga, tiff, wbmp, webp, and xpm.

          + +

          Figure: Evas image loader

          +

          Evas image loader

          + +

          Evas Object Image Functions

          + +

          Evas has over 70 image object functions. The following functions are discussed in this document:

          +
          +Evas_Object *evas_object_image_add(Evas *e);
          +void evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key);
          +void evas_object_image_fill_set(Evas_Object *obj, int x, int y, int w, int h);
          +void evas_object_image_filled_set(Evas *e, Eina_Bool setting);
          +Evas_Object *evas_object_image_filled_add(Evas *e);
          +void evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smoothscale);
          +void evas_object_image_load_size_set(Evas_Object *obj, int w, int h);
          +void evas_object_image_data_set(Evas_Object *obj, void *data);
          +void *evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writing);
          +void evas_object_image_size_set(Evas_Object *obj, int w, int h);
          +void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h);
          +Eina_Bool evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags);
          +
          + +

          Creating an Image Object and Setting the Image Data Source

          +

          A common use case of an image object is to set a file as the image data source. The process has 3 steps and each one involves the following API calls:

          +
            +
          • The evas_object_image_add() function creates an image object and returns the pointer. +
            Evas_Object *evas_object_image_add(Evas *e);
            +
          • +
          • The evas_object_image_file_set() function sets a source file on the image object. The object fetches the image pixel data from the source file. +
            void evas_object_image_file_set(Evas_Object *obj, const char *file, const char *key);
            +
          • +
          • The evas_object_image_fill_set() sets how to fill the image object's area with the given pixel data. +
            void evas_object_image_fill_set(Evas_Object *obj, int x, int y, int w, int h);
            +
          • +
          + +

          In the following code example, the main() function creates an image object and displays it on a window. The image object size is 300x300 and the source image resolution is 100x127. The image is scaled into 300 by 300 to fill the image object area using the evas_object_image_fill_set() function.

          +
          +#include <Elementary.h>
          +
          +int main(int argc, char **argv)
          +{
          +   elm_init(argc, argv);
          +
          +   // Create a window object
          +   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +   evas_object_resize(win, 400, 400);
          +   evas_object_show(win);
          +
          +   // Return Evas handle from window
          +   Evas *e = evas_object_evas_get(win);
          +
          +   // Create an image object
          +   Evas_Object *img = evas_object_image_add(e);
          +
          +   // Set a source file to fetch pixel data
          +   evas_object_image_file_set(img, "./logo.png", NULL);
          +
          +   // Set the size and position of the image on the image object area
          +   evas_object_image_fill_set(img, 0, 0, 300, 300);
          +
          +   evas_object_move(img, 50, 50);
          +   evas_object_resize(img, 300, 300);
          +   evas_object_show(img);
          +
          +   elm_run();
          +
          +   elm_shutdown();
          +
          +   return 0;
          +}
          +
          +

          Figure: Image object display

          +

          Image object display

          + +

          Managing Images

          + +

          To manage image objects in Evas:

          + +

          Limiting Visibility

          +

          Evas always supports the image file type it was compiled with. Check your software packager for the information and use the evas_object_image_extension_can_load_get() function.

          + +

          Create the image object. Set a source file on it, so that the object knows where to fetch the image data.

          +

          Define how to fill the image object area with the given pixel data. You can use a sub-region of the original image, or have it tiled repeatedly on the image object.

          + +
          +img = evas_object_image_add(canvas);
          +evas_object_image_file_set(img, "path/to/img", NULL);
          +evas_object_image_fill_set(img, 0, 0, w, h);
          +
          + + +

          If the entire source image is to be displayed on the image object, stretched to the destination size, use the evas_object_image_filled_set() function helper that you can use instead of the evas_object_image_fill_set() function:

          + +
          +evas_object_image_filled_set(img, EINA_TRUE);
          +
          + +

          Scaling Images

          +

          Resizing image objects scales the source images to the image object size, if the source images are set to fill the object area using the evas_object_image_filled_set() function.

          +

          Control the aspect ratio of an image for different sizes with functions to load images scaled up or down in memory.

          + +

          Evas has a scale cache, which caches scaled versions of images used often. You can also have Evas rescale the images smoothly, however, that is computationally expensive.

          + +

          Users can decide how to fill the image object area with the given image pixel data by setting the position, width, and height of the image using the evas_object_image_fill_set() function. Without setting this information, the image is not displayed. If the size of the image is bigger than the image object area, only a sub-region of the original image is displayed. If the image is smaller than the area, images are tiled repeatedly to fill the object area.

          + +

          Figure: Image scaling

          +

          Image scaling

          + + + + + + + + + + + + + + +

          evas_object_image_fill_set(obj, 50, 0, 300, 300)evas_object_image_fill_set(obj, 0, 0, 200, 200)evas_object_image_fill_set(obj, 0, 0, 100, 127)
          + +

          The evas_object_image_filled_set() function scales the image to fit the object area. Resizing the image object automatically triggers an internal call to the evas_object_image_fill_set() function.

          +
          +void evas_object_image_filled_set(Evas *e, Eina_Bool setting);
          + +

          The evas_object_image_filled_add() function creates a new image object that automatically scales its bound image to the object area. This is a helper function around the evas_object_image_add() and evas_object_image_filled_set() functions.

          + +
          Evas_Object *evas_object_image_filled_add(Evas *e);
          + +

          Scaled images' quality can differ according to scaling algorithms. Smooth scaling improves the image quality in the process of size reducing or enlarging. Evas runs its own smooth scaling algorithm by default and provides an API so users can disable the function.

          + +
          +void evas_object_image_smooth_scale_set(Evas_Object *obj, Eina_Bool smoothscale);
          + +

          The algorithm is implemented using the SIMD (Single Instruction Multiple Data) vectorization in case of software rendering. It is optimized on Intel and ARM CPU through MMX and NEON command respectively.

          + +

          There is a trade-off between image smoothness and rendering performance. The load gets bigger as the image gets bigger. Users can avoid such scaling overload by using the same size of the image object and the source image.

          + +

          In the following code, 2 image objects are created to show the effects of smooth scaling. The one with smooth scaling applied appears softer on the screen.

          + +
          +#include <Elementary.h>
          +
          +int main(int argc, char **argv)
          +{
          +   elm_init(argc, argv);
          +
          +   // Create a window object
          +   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +   evas_object_resize(win, 400, 200);
          +   evas_object_show(win);
          +
          +   // Return Evas handle from window
          +   Evas *e = evas_object_evas_get(win);
          +
          +   // Create an image object
          +   Evas_Object *img = evas_object_image_filled_add(e);
          +   evas_object_image_file_set(img, "./logo.png", NULL);
          +   evas_object_move(img, 0, 0);
          +   evas_object_resize(img, 200, 200);
          +   evas_object_show(img);
          +
          +   // Create another image object
          +   Evas_Object *img2 = evas_object_image_filled_add(e);
          +   evas_object_image_file_set(img2, "./logo.png", NULL);
          +
          +   // Disable smooth scaling
          +   evas_object_image_smooth_scale_set(img2, EINA_FALSE);
          +   evas_object_move(img2, 200, 0);
          +   evas_object_resize(img2, 200, 200);
          +   evas_object_show(img2);
          +
          +   elm_run();
          +
          +   elm_shutdown();
          +
          +   return 0;
          +}
          +
          + + + + + + + + + + + + +
          Figure: Smooth scaling effects

          Smooth scaling effects

          Smooth scaling effects

          Smooth scaling enabledSmooth scaling disabled
          + + +

          Evas caches scaled image data and reuses them. Users can save the memory by loading the image in the scaled size to the memory at the beginning. This option is available only for jpeg format at the moment.

          +
          +void evas_object_image_load_size_set(Evas_Object *obj, int w, int h);
          + +

          An example code is as follows.

          +
          +#include <Elementary.h>
          + 
          +int main(int argc, char **argv)
          +{
          +   elm_init(argc, argv);
          + 
          +   // Create a window object
          +   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +   evas_object_resize(win, 400, 200);
          +   evas_object_show(win);
          + 
          +   // Return Evas handle from window
          +   Evas *e = evas_object_evas_get(win);
          + 
          +   // Create an image object
          +   Evas_Object *img = evas_object_image_filled_add(e); 
          + 
          +   // Load the image scaled into the object size 
          +   // before evas_object_image_file_set() is called
          +   evas_object_image_load_size_set(img, 300, 300);
          + 
          +   evas_object_image_file_set(img, "./logo.png", NULL); 
          +   
          +   evas_object_move(img, 50, 50);
          +   evas_object_resize(img, 300, 300);
          +   evas_object_show(img); 
          + 
          +   elm_run();
          + 
          +   elm_shutdown();
          +
          +   return 0;
          +}
          +
          + +

          Setting Raw Data to Image Object

          +

          Users can set raw data to the image object manually using the evas_object_image_data_set() function instead of setting an image file as the data source. The image data should be in raw data form. In case of an 200x200 sized image with alpha channel enabled (32 bits per pixel), the size of the image data is 14000 (=200*200*4) bytes.

          + +
          void evas_object_image_data_set(Evas_Object *obj, void *data);
          + +

          Image objects fetch metadata such as width or height from the header of the image files. Since the raw data does not have the metadata, users must set the size of the image using the evas_object_image_size_set() function.

          + +
          void evas_object_image_size_set(Evas_Object *obj, int w, int h);
          + +

          The evas_object_image_data_get() function returns the data pointer of an image object and requires a parameter to determine whether the data is modified or not. If users pass EINA_TRUE for for_writing, Evas updates the image pixels in the next rendering cycle.

          + +
          void *evas_object_image_data_get(const Evas_Object *obj, Eina_Bool for_writing);
          + +

          The evas_object_image_data_update_add() helps to mark the updated area for rendering efficiency.

          + +
          void evas_object_image_data_update_add(Evas_Object *obj, int x, int y, int w, int h);
          + +

          The following example code and figure show how to specify the area to update.

          +
          +evas_object_image_data_update_add(image, 100, 100, 50, 50);
          +evas_object_image_data_update_add(image, 180, 100, 50, 50);
          +evas_object_image_data_update_add(image, 85, 200, 160, 80);
          +
          + +

          Figure: Partial image update

          +

          Partial image update

          + +

          The following code creates an image object and sets a source file on it. Then it implements the blur effect to the pixel data and saves them using the evas_object_image_save() function.

          + +
          Eina_Bool evas_object_image_save(const Evas_Object *obj, const char *file, const char *key, const char *flags);
          + +
          +#include <Elementary.h>
          +
          +void image_blur(Evas_Object *img)
          +{
          +   unsigned char *img_src = evas_object_image_data_get(img, EINA_TRUE);
          +
          +   int w, h;
          +   evas_object_image_size_get(img, &w, &h);
          +   int blur_size = 4;
          +   int x, y, xx, yy;
          +   
          +   for (y = 0; y < h; y++)
          +   {
          +      for (x = 0; x < w; x++)
          +      {
          +         int avg_color[3] = {0, 0, 0};
          +         int blur_pixel_cnt = 0;
          +
          +         for (xx = x; (xx < x + blur_size) && (xx < w); xx++)
          +         {
          +            for (yy = y; (yy < y + blur_size) && (yy < h); yy++)
          +            {
          +               int idx = (yy * w * 4) + (xx * 4);
          +               avg_color[0] += img_src[idx + 0];
          +               avg_color[1] += img_src[idx + 1];
          +               avg_color[2] += img_src[idx + 2];
          +               ++blur_pixel_cnt;
          +            }
          +         }
          +         avg_color[0] /= blur_pixel_cnt;
          +         avg_color[1] /= blur_pixel_cnt;
          +         avg_color[2] /= blur_pixel_cnt;
          +
          +         for (xx = x; (xx < x + blur_size) && (xx < w); xx++)
          +         {
          +            for (yy = y; (yy < y + blur_size) && (yy < h); yy++)
          +            {
          +               int idx = (yy * w * 4) + (xx * 4);
          +               img_src[idx + 0] = avg_color[0];
          +               img_src[idx + 1] = avg_color[1];
          +               img_src[idx + 2] = avg_color[2];
          +            }
          +         }
          +      }
          +   }
          +   evas_object_image_data_update_add(img, 0, 0, w, h);
          +}
          +
          +int main(int argc, char **argv)
          +{
          +   elm_init(argc, argv);
          +
          +   Evas_Object *win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
          +   evas_object_resize(win, 200, 200);
          +   evas_object_show(win);
          +
          +   Evas *e = evas_object_evas_get(win);
          +
          +   Evas_Object *img = evas_object_image_filled_add(e);
          +   evas_object_image_file_set(img, "./logo.png", NULL);
          +   evas_object_resize(img, 200, 200);
          +   evas_object_show(img);
          +
          +   image_blur(img);
          +
          +   evas_object_image_save(img, "logo2.png", NULL, "quality=100 compress=8");
          +
          +   elm_run();
          +
          +   elm_shutdown();
          +
          +   return 0;
          +}
          +
          + + + + + + + + + + + + +
          Figure: Blur effect

          Blur effect

          Blur effect

          BeforeAfter
          + +

          Giving Performance Hints

          +

          In image viewer applications, you can display an image in full size. The navigation to the adjacent images on your album must be fluid and fast. Thus, while displaying a given image, the program can load the next and previous image in the background to be able to immediately repaint the screen with a new image.

          + +

          Evas addresses this issue with image preloading:

          + +
          +prev = evas_object_image_filled_add(canvas);
          +evas_object_image_file_set(prev, "/path/to/prev", NULL);
          +evas_object_image_preload(prev, EINA_TRUE);
          +next = evas_object_image_filled_add(canvas);
          +evas_object_image_file_set(next, "/path/to/next", NULL);
          +evas_object_image_preload(next, EINA_TRUE);
          +
          + +

          If you are loading an image which is too big, set its loading size smaller.

          + +

          Load a scaled down version of the image in the memory if that is the size you are displaying (this can speed up the loading considerably):

          +
          evas_object_image_load_scale_down_set(img, zoom);
          +

          If you know you are showing a sub-set of the image pixels, you can avoid loading the complementary data:

          +
          evas_object_image_load_region_set(img, x, y, w, h);
          +
          + +

          Specifying Borders

          +

          With Evas, you can specify image margins to be treated as borders. The margins then maintain their aspects when the image is resized. This makes setting frames around other UI objects easier. The following figure illustrates the border behavior, when the image is resized.

          + +

          Figure: Borders in Evas

          +

          Borders in Evas

          + + +

          Textblock Objects

          + +

          Unlike basic text objects, a textblock handles complex text, managing multiple styles and multiline text based on HTML-like tags. However, these extra features are heavier on memory and processing cost.

          +

          The textblock objects is an object that shows big chunks of text. Textblock supports many features, including text formatting, automatic and manual text alignment, embedding items (icons, for example). Textblock has three important parts: the text paragraphs, the format nodes and the cursors.

          +

          To set markup to format text, use for example <font_size=50>Big!</font_size>. Set more than one style directive in one tag with <font_size=50 color=#F00>Big and Red!</font_size>. Please note that we used </font_size> although the format also included color. This is because the first format determines the matching closing tag's name. You can use anonymous tags, such as <font_size=30>Big</>, which pop any type of format, but it is advisable to use the named alternatives instead.

          +

          Textblock supports the following formats:

          +
            +
          • font: Font description in fontconfig such as format, for example "Sans:style=Italic:lang=hi". or "Serif:style=Bold".
          • +
          • font_weight: Overrides the weight defined in "font". For example, "font_weight=Bold" is the same as "font=:style=Bold". The supported weights are "normal", "thin", "ultralight", "light", "book", "medium", "semibold", "bold", "ultrabold", "black", and "extrablack".
          • +
          • font_style: Overrides the style defined in "font". For example, "font_style=Italic" is the same as "font=:style=Italic". The supported styles are "normal", "oblique", and "italic".
          • +
          • font_width: Overrides the width defined in "font". For example, "font_width=Condensed" is the same as "font=:style=Condensed". The supported widths are "normal", "ultracondensed", "extracondensed", "condensed", "semicondensed", "semiexpanded", "expanded", "extraexpanded", and "ultraexpanded".
          • +
          • lang: Overrides the language defined in "font". For example, "lang=he" is the same as "font=:lang=he".
          • +
          • font_fallbacks: A comma delimited list of fonts to try if finding the main font fails.
          • +
          • font_size: The font size in points.
          • +
          • font_source: The source of the font, for example an eet file.
          • +
          • color: The text color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • underline_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • underline2_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • outline_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • shadow_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • glow_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • glow2_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • strikethrough_color: The color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • align: The text alignment in one of the following formats: "auto" (according to text direction), "left", "right", "center" or "middle", which take a value between 0.0 and 1.0 or a value between 0% to 100%.
          • +
          • valign: The vertical text alignment in one of the following formats: "top", "bottom", "middle", "center", "baseline" or "base", which take a value between 0.0 and 1.0 or a value between 0% to 100%.
          • +
          • wrap: The text wrap in one of the following formats: "word", "char", "mixed", or "none".
          • +
          • left_margin: Either "reset" or a pixel value indicating the margin.
          • +
          • right_margin: Either "reset" or a pixel value indicating the margin.
          • +
          • underline: The style of underlining in one of the following formats: "on", "off", "single", or "double".
          • +
          • strikethrough: The style of text that is either "on" or "off".
          • +
          • backing_color: The background color in one of the following formats: "#RRGGBB", "#RRGGBBAA", "#RGB", or "#RGBA".
          • +
          • backing: The background color enabled or disabled: "on" or "off".
          • +
          • style: The style of the text in one of the following formats: "off", "none", "plain", "shadow", "outline", "soft_outline", "outline_shadow", "outline_soft_shadow", "glow", "far_shadow", "soft_shadow" or "far_soft_shadow". The direction is selected by adding "bottom_right", "bottom", "bottom_left", "left", "top_left", "top", "top_right" or "right". For example, "style=shadow,bottom_right".
          • +
          • tabstops: The pixel value for tab width.
          • +
          • linesize: To force a line size in pixels.
          • +
          • linerelsize: Either a floating point value or a percentage indicating the wanted size of the line relative to the calculated size.
          • +
          • linegap: To force a line gap in pixels.
          • +
          • linerelgap: Either a floating point value or a percentage indicating the wanted size of the line relative to the calculated size.
          • +
          • item: Creates an empty space that is filled by an upper layer. Use "size", "abssize", or "relsize" to define the item"s size, and an optional vsize = full/ascent to define the item's position in the line.
          • +
          • linefill: Either a float value or percentage indicating how much to fill the line.
          • +
          • ellipsis: A value between 0.0 and 1.0 to indicate the type of ellipsis, or -1.0 to indicate that an ellipsis is not wanted.
          • +
          • password: Either "on" or "off", this is used to specifically turn replacing chars with the password mode (that is, replacement char) on and off.
          • +
          + + +

          Clipping Objects

          + +

          Limiting Visibility

          +

          An Evas object can be clipped – in other words, its visible area is restricted with the clipper object.

          + +

          It is often necessary to show only parts of an object, and while it may be possible to create an object that corresponds only to the part that must be shown (which is not always possible), it is usually easier to use a clipper. A clipper is a rectangle that defines what is visible and what is not. The way to do this is to create a solid white rectangle (by default, so you need not use evas_object_color_set()) and give it a position and size of what is wanted visible. The following code exemplifies showing the center half of my_evas_object:

          +
          Evas_Object *clipper = evas_object_rectangle_add(evas_canvas);
          +evas_object_move(clipper, my_evas_object_x / 4, my_evas_object_y / 4);
          +evas_object_resize(clipper, my_evas_object_width / 2, my_evas_object_height / 2);
          +evas_object_clip_set(my_evas_object, clipper);
          +evas_object_show(clipper);
          +
          + +

          Layer of Color

          +

          A solid white clipper does not produce a change in the color of the clipped object, only hides what is outside the clipper's area. Changing the color of an object is accomplished by using a colored clipper. Clippers with color function by multiplying the colors of the clipped object. The following code shows how to remove all the red from an object.

          +
          Evas_Object *clipper = evas_object_rectangle_add(evas);
          +evas_object_move(clipper, my_evas_object_x, my_evas_object_y);
          +evas_object_resize(clipper, my_evas_object_width, my_evas_object_height);
          +evas_object_color_set(clipper, 0, 255, 255, 255);
          +evas_object_clip_set(obj, clipper);
          +evas_object_show(clipper);
          +
          + + +

          Mapping Objects

          + +

          Evas allows different transformations to be applied to all kinds of objects. These are applied by means of UV mapping. With UV mapping, one map points in the source object to a 3D space positioning at target. This allows rotation, perspective, scale, and many other effects depending on the map that is used.

          + +

          Creating a Map

          +

          A map consists of a set of points, but currently only four are supported. Each of these points contains a set of canvas coordinates x and y that are used to alter the geometry of the mapped object, and a z coordinate that indicates the depth of that point. This last coordinate does not normally affect the map, but is used by several of the utility functions to calculate the right position of the point given other parameters.

          +

          The coordinates for each point are set with evas_map_point_coord_set(map, index, x, y, z). In the example below, there is a rectangle whose coordinates are (100, 100) and (300, 300).

          +
          Evas_Object *object = evas_object_rectangle_add(evas);
          +evas_object_move(object, 100, 100);
          +evas_object_resize(object, 200, 200);
          +Evas_Map map = evas_map_new(4);
          +evas_map_point_coord_set(map, 0, 100, 100, 0);
          +evas_map_point_coord_set(map, 1, 300, 100, 0);
          +evas_map_point_coord_set(map, 2, 300, 300, 0);
          +evas_map_point_coord_set(map, 3, 100, 300, 0);
          +
          +

          There are functions to ease the process.

          +

          Use evas_map_util_points_populate_from_geometry(map, x, y, w, h, z), where the map coordinates are set to the given rectangle, and z is the coordinate in the Z axis, which is the same for all points.

          +
          Evas_Object *object = evas_object_rectangle_add(evas);
          +evas_object_move(object, 100, 100);
          +evas_object_resize(object, 200, 200);
          +Evas_Map map = evas_map_new(4);
          +evas_map_util_points_populate_from_geometry(map, 100, 100, 200, 200, 0);
          +
          + +

          You can also use evas_map_util_points_populate_from_object(map, object).

          +
          Evas_Object *object = evas_object_rectangle_add(evas);
          +evas_object_move(object, 100, 100);
          +evas_object_resize(object, 200, 200);
          +Evas_Map map = evas_map_new(4);
          +evas_map_util_points_populate_from_object(map, object);
          +
          + +

          You can also use evas_map_util_points_populate_from_object_full(map, object, z), where z is the coordinate in the Z axis, which is the same for all points.

          +
          Evas_Object *object = evas_object_rectangle_add(evas);
          +evas_object_move(object, 100, 100);
          +evas_object_resize(object, 200, 200);
          +Evas_Map map = evas_map_new(4);
          +evas_map_util_points_populate_from_object_full(map, object, 0);
          +
          + +

          Manual Point Setting

          +

          Several effects are applied to an object by setting each point of the map to the right coordinates. For example, a simulated perspective is achieved as follows.

          +
          evas_map_point_coord_set(map, 0, 300, 100, 0);
          +evas_map_point_coord_set(map, 1, 450, 120, 0);
          +evas_map_point_coord_set(map, 2, 450, 260, 0);
          +evas_map_point_coord_set(map, 3, 300, 300, 0);
          +
          + +

          The Z coordinate is not used when setting points by hand; thus its value is not important.

          + +

          Applying a Map

          +

          Regardless of the specific way you create a map, to apply it to a specific object, use

          +
          evas_object_map_set(object, map);
          +evas_object_map_enable_set(object, EINA_TRUE);
          +
          + +

          Basic Utility Functions

          +

          Evas provides utility functions for common transformations:

          +
            +
          • evas_map_util_rotate(map, angle, cx, cy): This performs a rotation of the angle degrees around the center point with the coordinates (cx, cy).
          • +
          • evas_map_util_zoom(map, zoomx, zoomy, cx, cy): This performs a zoomx and zoomy zoom in the X and Y directions respectively, with the center point with the coordinates (cx, cy).
          • +
          + +

          For example, the following code rotates an object around its center.

          +
          int x, y, w, h;
          +evas_object_geometry_get(object, &x, &y, &w, &h);
          +Evas_Map *map = evas_map_new(4);
          +evas_map_util_points_populate_from_object(map, object);
          +evas_map_util_rotate(map, 45, x + (w / 2), y + (h / 2));
          +evas_object_map_set(object, map);
          +evas_object_map_enable_set(object, EINA_TRUE);
          +evas_map_free(m);
          +
          + +

          The following code rotates an object around the center of the window.

          +
          int w, h;
          +evas_output_size_get(evas, &w, &h);
          +Evas_Map *map = evas_map_new(4);
          +evas_map_util_points_populate_from_object(map, object);
          +evas_map_util_rotate(map, 45, w / 2, h / 2);
          +evas_object_map_set(object, map);
          +evas_object_map_enable_set(object, EINA_TRUE);
          +evas_map_free(m);
          +
          + +

          3D Utility Functions

          +

          Evas provides utility functions for 3D transformations.

          +

          To make a 3D rotation, use evas_map_util_3d_rotate(map, anglex, angley, anglez, cx, cy, cz). With this code, you can set the Z coordinate of the rotation center, and the angles to rotate through around all axes.

          +

          Rotating in the 3D space does not look natural. A more natural look becomes by adding perspective to the transformation, which is done with evas_map_util_3d_perspective(map, px, py, z0, focal) on the map after its position has been set.

          + +
            +
          • px and py specify the "infinite distance" point in the 3D conversion, where all lines converge to.
          • +
          • z0 specifies the Z value at which there is a 1:1 mapping between spatial coordinates and screen coordinates: any points on this Z value do not have their X and Y coordinates modified in the transform, while those further away (Z value higher) shrink into the distance, and those less than this value expand.
          • +
          • focal determines the "focal length" of the camera: this is the distance in reality between the camera lens plane (the rendering results are undefined at or closer than this) and the z0 value; this function allows for some "depth" control.
          • +
          +

          Color and Lighting

          +

          Each point in a map can be set to a color, which is multiplied with the object's own color and linearly interpolated in between adjacent points. To do this, use evas_map_point_color_set(map, index, r, g, b, a) for each point of the map, or evas_map_util_points_color_set(map, r, g, b, a) to set every point into the same color.

          +

          To add lighting for the objects, which is useful with 3D transforms, use evas_map_util_3d_lighting(map, lightx, lighty, lightz, lightr, lightg, lightb, ambientr, ambientg, ambientb):

          +
            +
          • lightx, lighty and lightz are the local light source coordinates;
          • +
          • lightr, lightg and lightb are the local light source colors;
          • +
          • ambientr, ambientg and ambientb are the ambient light colors. Evas sets the color of each point based on the distance to the light source, the angle with which the object is facing the light and the ambient light. The orientation of each point is important. If the map is defined counter-clockwise, the object faces away from the user and becomes obscured, since no light does not reflect from it.
          • +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/evas_optimization_n.htm b/org.tizen.ui.practices/html/native/efl/evas_optimization_n.htm new file mode 100644 index 0000000..61223fd --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_optimization_n.htm @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + Optimizing Evas + + + + + + +
          +

          Optimizing Evas

          + +

          To optimize Evas:

          + + + +

          Using a Rectangle Object instead of a Solid Color Image

          +

          When you need a solid color object, it is more efficient to use a rectangle object than an image.

          + + + + + + + + + + + + + + + + + + +
          Before
          +
          +image = elm_image_add(win);
          +snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          +elm_image_file_set(image, buf, NULL);
          +evas_object_size_hint_weight_set(image, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_win_resize_object_add(win, image);
          +evas_object_show(image);
          +
          After
          +
          +rect = evas_object_rectangle_add(evas_object_evas_get(win));
          +evas_object_color_set(rect, 255, 255, 255, 255);
          +evas_object_size_hint_weight_set(rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_win_resize_object_add(win, rect);
          +evas_object_show(rect);
          +
          + + +

          Making an Object Invisible instead of Setting Alpha as 0

          + +

          To make an object invisible, it is more efficient to use the evas_object_hide() function instead of changing its alpha value to 0.

          + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +static void
          +_invisible_cb(void *data, Evas_Object *obj, void *ev)
          +{
          +   evas_object_color_set(obj, 0, 0, 0, 0);   
          +}
          +
          +
          +static void
          +_invisible_cb(void *data, Evas_Object *obj, void *ev)
          +{
          +   evas_object_hide(obj);   
          +}
          +
          + +

          Using evas_object_image for Maximum Optimization

          + +

          If you need maximum optimization, use the evas_object_image object instead of the elm_image and elm_icon objects.

          + + + + + + + + + + + + + + + + + + +
          Before
          +
          +img = elm_image_add((parent);
          +snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          +elm_image_file_set(img, buf, NULL);
          +evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +evas_object_show(img);
          +
          After
          +
          +img = evas_object_image_add(evas_object_evas_get(parent));
          +snprintf(buf, sizeof(buf), "%s/images/white_bg.png", elm_app_data_dir_get()); 
          +evas_object_image_file_set(img, buf, NULL);
          +evas_object_image_filled_set(img, EINA_TRUE);
          +evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +evas_object_show(img);
          +
          + + +

          Setting the Parent to Avoid the Elementary Tree Reconstruction

          +

          Before creating an object, make sure that the relationship between the parent and child is set correctly to avoid having to reconstruct later.

          + + + + + + + + + + + + + + + +
          BeforeAfter
          +
          +win = elm_win_add();
          +
          +scroller = elm_scroller_add(win);
          +
          +box = elm_box_add(win);
          +
          +button = elm_button_add(win);
          +
          +
          +win = elm_win_add();
          +
          +scroller = elm_scroller_add(win);
          +
          +box = elm_box_add(scroller);
          +
          +button = elm_button_add(box);
          +
          + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/evas_rendering_n.htm b/org.tizen.ui.practices/html/native/efl/evas_rendering_n.htm new file mode 100644 index 0000000..4f49d4e --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/evas_rendering_n.htm @@ -0,0 +1,288 @@ + + + + + + + + + + + + + Evas Rendering Concept and Method + + + + + +
          + +

          Evas Rendering Concept and Method

          + +

          Evas is a canvas display library. It is markedly different from most display and windowing systems as the canvas is structural and is also a state engine, whereas most display and windowing systems are immediate mode display targets. Evas handles the logic between a structural display via its state engine, and controls the target windowing system in order to produce rendered results of the current canvas' state on the display.

          +

          Immediate mode display systems retain very little or no state. A program executes a series of commands, as in the following pseudo code.

          +
          +draw line from position (0, 0) to position (100, 200);
          +
          +draw rectangle from position (10, 30) to position (50, 500);
          +
          +bitmap_handle = create_bitmap();
          +scale bitmap_handle to size 100 x 100;
          +draw image bitmap_handle at position (10, 30);
          +
          +

          The series of commands is executed by the windowing system and the results are typically displayed on the screen. Once the commands are executed, the display system does not know how to reproduce this image again, and has to be instructed by the application on how to redraw sections of the screen if needed. Each successive command is executed as instructed by the application and either emulated by software or sent to the graphics hardware on the device to be performed.

          +

          The advantage of such a system is that it is simple and gives a program tight control over how something looks and is drawn. Given the increasing complexity of displays and demands by users to have better looking interfaces, more work needs to be done at this level by the internals of UI component sets, custom display components and other programs. This means that more logic and display rendering code needs to be written again each time the application needs to figure out how to minimize redraws so that display is fast and interactive, and keep track of redraw logic.

          +

          For example, if in the scene below, the windowing system requires the application to redraw the area from 0, 0 to 50, 50 (also referred to as the "expose event"). Then the programmer calculates manually the updates and repaints it again.

          +
          +Redraw from position (0, 0) to position (50, 50):
          +
          +// What was in area (0, 0, 50, 50)?
          +
          +// 1. intersection part of line (0, 0) to (100, 200)?
          +   draw line from position (0, 0) to position (25, 50);
          +
          +// 2. intersection part of rectangle (10, 30) to (50, 500)?
          +   draw rectangle from position (10, 30) to position (50, 50)
          +
          +// 3. intersection part of image at (10, 30), size 100 x 100?
          +   bitmap_subimage = subregion from position (0, 0) to position (40, 20)
          +   draw image bitmap_subimage at position (10, 30);
          +
          + +

          If all elements in the above scene are opaque, the system is doing useless paints: part of the line is behind the rectangle, and part of the rectangle is behind the image. These useless paints tend to be very costly.

          +

          Evas is a structural system in which the programmer creates and manages display objects and their properties, and as a result of this higher level state management, the canvas is able to redraw the set of objects when needed to represent the current state of the canvas.

          +

          For example, see the following pseudo code.

          +
          +line_handle = create_line();
          +set line_handle from position (0, 0) to position (100, 200);
          +show line_handle;
          +
          +rectangle_handle = create_rectangle();
          +move rectangle_handle to position (10, 30);
          +resize rectangle_handle to size 40 x 470;
          +show rectangle_handle;
          +
          +bitmap_handle = create_bitmap();
          +scale bitmap_handle to size 100 x 100;
          +move bitmap_handle to position (10, 30);
          +show bitmap_handle;
          +
          +render scene;
          +
          + +

          This looks longer, but when the display needs to be refreshed or updated, the programmer only moves, resizes, shows, hides etc. the objects that need to change. The programmer thinks at the object logic level, and the canvas software does the rest of the work, figuring out what changed in the canvas since it was last drawn, how to most efficiently redraw the canvas and its contents to reflect the current state, and doing the actual drawing of the canvas.

          +

          This allows the programmer think in a more natural way when dealing with a display, and saves time and effort of working out how to load and display images, to render given the current display system etc. Since Evas is portable across different display systems, this gives the programmer the ability to port and display the code on different display systems with little work.

          +

          Evas is a display system somewhere between a UI component set and an immediate mode display system. It retains basic display logic, but does little high-level logic such as scrollbars, sliders, push buttons etc.

          + +

          For more information on the UI rendering modes (immediate and retained), see UI Rendering Mode.

          + + +

          Evas Engines Concept

          +

          Evas delegates most of the actual rendering work to its engines. Engines are the backends that Evas uses to render (primitive) objects on a canvas. The canvas can be the screen, or a buffer in the memory.

          +

          Evas can work with and provides multiple engines, such as (this list is non-exhaustive):

          +
            +
          • buffer: all the rendering takes place in a buffer
          • +
          • fb: the rendering takes place in the system's framebuffer
          • +
          • software_x11: this is the most used, using X11
          • +
          • gl_x11: this also renders to an X11 window, except that it uses OpenGL
          • +
          +

          These implement the rendering of all the basic objects by themselves, because they often can be accelerated by the hardware or backend software libraries to provide fast rendering.

          +

          If a particular engine does not have the provision for a certain primitive object, it reverts back to using a default software version.

          + +

          UI Rendering Mode

          + +

          Evas removes the need to know about the characteristics of your display system or what graphics calls are used to draw them and how. It deals on an object level where all you do is create and manipulate objects in a canvas, set their properties, and the rest is done for you. This rendering method is called the retained mode, whereas the immediate mode is an alternative rendering method.

          + +

          Immediate Mode

          + +

          The immediate mode is the most commonly used in graphics toolkit libraries, such as GTK+, GDI, and GDI+. The application is responsible for repainting the portion of the client area that is invalidated.

          + +

          Figure: Immediate mode

          +

          Immediate mode

          + +

          The application commands any drawing issues as it needs, and the display system draws some GUIs. After the drawing is done, it appears in the destination. This mode allows you to have a exact control over the render cycles. However, if the draw commands are misused, unnecessary drawing can be performed or drawing never happen at all.

          +

          The following example explains the common usage of the immediate mode:

          + +
          +void update()
          +{
          +   Image *img = load_image(NEW_IMG);
          +
          +   // Switch button image to new one
          +   update_button_image(img);
          +
          +   // Issue the invalidate area (button area) to be redrawn on the screen
          +   invalidate_area(button_x, button_y, button_w, button_h);
          +
          +   // Move rectangle from (200, 200) to (300, 300)
          +   int rect_prev_x = rect_x;
          +   int rect_prev_y = rect_y;
          +   rectangle_x = 300;
          +   rectangle_y = 300;
          +   set_rect_position(rect_x, rect_y);
          +   
          +   // Issue the invalidate area (changed area) to be redrawn on the screen
          +   int diff_x = rect_x – rect_prev_x;
          +   int diff_y = rect_y – rect_prev_y;
          +   invalidate_area(rect_prev_x, rect_prev_y, (rect_w + diff_x), (rect_h + diff_y));
          +
          +
          +   // After setting the invalidate area, request rendering to update the screen
          +   render();
          +
          +   // Now you can see how the button image and rectangle position are changed
          +}
          +
          + +

          Retained Mode

          + +

          A graphics system adopting the retained mode is basically responsible for responding to all repaint requests for rendering the application objects. Clients do not directly cause actual rendering, but objects are redrawn when parts of them are updated.

          + +

          Figure: Retained mode

          +

          Retained mode

          + +

          Since Evas works with the retained mode, there is no need to command any drawings. The following example shows how to write a GUI code with Evas for your application:

          + +
          +void create_image()
          +{
          +   // Initialize an image object to be displayed on the screen
          +   Evas_Object *img = evas_object_image_add(e);
          +
          +   // Set image resource
          +   evas_object_image_file_set(img, IMG, NULL);
          +
          +   // Set image position 
          +   evas_object_move(img, 100, 100);
          +
          +   // Set image size
          +   evas_object_resize(img, 200, 200);
          +
          +   // Set image visibility (show or hide)
          +   evas_object_show(img);
          +}
          +
          +void create_rectangle()
          +{
          +   // Initialize an rectangle object to be displayed on the screen
          +   Evas_Object *rect = evas_object_rectangle_add(e);
          +
          +   // Set rectangle color
          +   evas_object_color_set(rect, 255, 0, 0, 255);
          +
          +   // Set rectangle position
          +   evas_object_move(rect, 200, 200);
          +
          +   // Set rectangle size
          +   evas_object_resize(rect, 200, 200);
          +
          +   // Set rectangle visibility (show or hide)
          +   evas_object_show(rect);
          +}
          +
          + +

          A few main loops later you can replace the image with another one and move the rectangle. You only need to set a new image file to the image object and move the rectangle object. Evas computes the invalidate area and redraws the image and rectangle behind the application when it's on rendering time.

          + +
          +void update()
          +{
          +   // Set new image resource
          +   elm_image_file_set(img, NEW_IMG, NULL);
          +
          +   // Set new rectangle position
          +   evas_object_move(rect, 300, 300);
          +}
          +
          + +

          Evas Rendering

          + +

          Tizen Native applications work on the ecore main loop, and the loop goes on a few steps for every frame. Evas redraws some changes in the objects when the main loop goes to the idle enterer step. If there are no changes, Evas rendering is skipped. Otherwise, Evas calculates any changed portions of all display objects and redraws them.

          + +

          Figure: Evas rendering in the main loop

          +

          Evas rendering in the main loop

          + +

          To minimize the rendering, Evas tracks the states of all display objects, such as position, size, visibility, and color. Even if some of these states are changed but the object is hidden by other obscured objects, it is not redrawn. In other words, Evas draws only the necessary changes in the screen.

          + +

          The following figures illustrate how Evas redraws the changed area:

          + +
          • In the first example, there is a blue-color background object (a sky-blue color rectangle) and a partially hidden cloud image object. Above them, there are a red and green rectangle, and the "Hello out there" text is printed on the green rectangle.

            + +

            Figure: Evas redrawing example 1

            +

            Evas redrawing example 1

          • + +
          • In the second example, some of the objects have moved (the cloud image is moved to right and the green rectangle is moved downwards).

            + +

            Figure: Evas redrawing example 2

            +

            Evas redrawing example 2

          • + +
          • As a result, the third example illustrates some regions that require updates.

            + +

            Figure: Evas redrawing example 3

            +

            Evas redrawing example 3

          • + +
          • Evas decides which portions are invalid and to be redrawn. The fourth example shows the cleaned portion of the screen, which is the redrawn area.

            +

            Evas redraws the content only in the redrawn portions.

            +

            Figure: Evas redrawing example 4

            +

            Evas redrawing example 4

          • + +
          • Finally, the fifth example shows how the screen is updated and the result is visible.

            + +

            Figure: Evas redrawing example 5

            +

            Evas redrawing example 5

            + +

            If Evas worked in an immediate mode style, the application would need to calculate the changed areas themselves, adding extra work. With Evas, you can let Evas figure out the updates and you can yourself concentrate on the application and UI core and logic.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/event_handling_n.htm b/org.tizen.ui.practices/html/native/efl/event_handling_n.htm new file mode 100644 index 0000000..4ef258f --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/event_handling_n.htm @@ -0,0 +1,119 @@ + + + + + + + + + + + + + Event Handling: Managing the Event Flow + + + + + +
          + +

          Event Handling: Managing the Event Flow

          + +

          The EFLs rely on events and callbacks. In case of an event, (for example, a key press, mouse click or a battery running low), the mainloop calls the callback functions that are associated to that specific event. After the callbacks have finished, the mainloop takes over and waits for new events, upon which to trigger new callbacks.

          +

          It is important to do light work in the callbacks and to return to the mainloop relatively quickly. If there is heavy work to do, it is best to use an asynchronous mechanism like Ecore_con for network I/O or threads for CPU-intensive tasks. Failure to return quickly to the mainloop blocks the application's UI and it appears frozen.

          + +

          EFL Event Types

          +

          There are several event types in the EFLs, and their use depends on the level of the event. The event types from lower- to higher-level are:

          +
            +
          • Evas smart events are the most often used and take place on collections of evas objects (which are most typically handled). They are called "smart" because they have internal logic and can define their own events while other event types are fixed.
          • +
          • Ecore events are the lowest-level events and come directly from the system. Except for application-wide shortcuts, it is not advisable to use them.
          • +
          • Evas object events concern the objects that are on the canvas.
          • +
          • Evas events are events on the graphical canvas as a whole. They are fairly low-level and mostly useful when drawing directly on the canvas.
          • +
          + +

          Figure: Event types in the EFLs: Inner boxes are more specific than outer ones

          +

          Event types in the EFLs: Inner boxes are more specific than outer ones

          + + + + + + + + + + + + +
          Note
          There are also Edje signals, which come from program sections in themes; they can be used from high-level Elementary APIs or a low-level Edje API.
          + +

          Basic Event Flow

          +

          A realistic scenario involving various types of events is an application showing a button, which triggers the download of a file to be processed. There are progress bars for the operations.

          +

          Create the window, create a box, set it vertical and add a button and two progress bars. At first, only the button is fully visible.

          +

          When the user clicks on the button, an evas smart object event named "clicked" is emitted. The callback then starts the download in Ecore_con, displays the first progress bar and adds a callback to monitor the download progress. When the download progress changes, the callback updates the progress bar.

          +

          After the download is finished, the second progress bar is displayed and the file processing is offloaded to another thread through Ecore_thread. The processing function regularly updates the progress bar (wrapped in ecore_main_loop_thread_safe_call_async() because GUI operations are not thread-safe).

          +

          Events enable operations taking more than a few milliseconds' time to be executed outside of the mainloop, therefore not blocking UI redraws.

          +

          Below is an illustration for the event flow that follows a click on the screen.

          + +

          Figure: Event flow for a user click

          +

          Event flow for a user click

          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/event_types_n.htm b/org.tizen.ui.practices/html/native/efl/event_types_n.htm new file mode 100644 index 0000000..a9ca786 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/event_types_n.htm @@ -0,0 +1,461 @@ + + + + + + + + + + + + + Event Types + + + + + +
          + +

          Event Types

          + +

          EFL provides various event types that you can use to monitor and react to user interactions and system events in the UI.

          + +

          Ecore Events

          + +

          Ecore events are used for low-level handling of events, such as key presses, network connections, and communication with sub-processes. In case of shortcuts, the low-level handling of key presses is particularly useful: instead of adding a signal handler to a specific graphical element, you can add one globally to guarantee that no matter which UI component is currently receiving events, the shortcut is caught correctly.

          +

          Ecore events can also be used to implement new graphical back-ends. However, they are low-level and not useful for most applications.

          + +

          In addition to using predefined Ecore events, you can create your own events with the ecore_event_type_new() function. The function generates a new unique identifier, which you can use as the event type parameter when managing your events and event handlers.

          + + +

          Shortcut Events

          + +

          The following Ecore events are available for shortcuts. The event callbacks receive additional data through a void * object, whose type depends on the received event.

          + +
            +
          • ECORE_EVENT_KEY_DOWN and ECORE_EVENT_KEY_UP events: +
            +typedef struct _Ecore_Event_Key Ecore_Event_Key;
            +
            +struct _Ecore_Event_Key 
            +{
            +   const char *keyname;
            +   const char *key;
            +   const char *string;
            +   const char *compose;
            +   Ecore_Window window;
            +   Ecore_Window root_window;
            +   Ecore_Window event_window;
            +
            +   unsigned int timestamp;
            +   unsigned int modifiers;
            +
            +   int same_screen;
            +};
            +
            + +
          • + +
          • ECORE_EVENT_MOUSE_BUTTON_DOWN and ECORE_EVENT_MOUSE_BUTTON_UP events: +
            typedef struct _Ecore_Event_Mouse_Button Ecore_Event_Mouse_Button;
            +struct _Ecore_Event_Mouse_Button 
            +{
            +   Ecore_Window window;
            +   Ecore_Window root_window;
            +   Ecore_Window event_window;
            +
            +   unsigned int timestamp;
            +   unsigned int modifiers;
            +   unsigned int buttons;
            +   unsigned int double_click;
            +   unsigned int triple_click;
            +   int same_screen;
            +
            +   int x;
            +   int y;
            +   struct 
            +   {
            +      int x;
            +      int y;
            +   } root;
            +
            +   struct 
            +   {
            +      // 0 if normal mouse, 1+ for other mouse-devices (such as multi-touch - other fingers)
            +      int device; 
            +      // Radius of press point - radius_x and radius_y if it is an ellipse (radius is the average of the 2)
            +      double radius, radius_x, radius_y; 
            +      // Pressure - 1.0 == normal, > 1.0 == more, 0.0 == none
            +      double pressure; 
            +      // Angle relative to perpendicular (0.0 == perpendicular), in degrees
            +      double angle; 
            +      // Same as x, y, root.x, root.y, but with sub-pixel precision, if available
            +      double x, y; 
            +      struct 
            +      {
            +         double x;
            +         double y;
            +      } root;
            +   } multi;
            +};
            +
            + +
          • +
          • ECORE_EVENT_MOUSE_MOVE and ECORE_EVENT_MOUSE_WHEEL events: +
            +typedef struct _Ecore_Event_Mouse_Wheel Ecore_Event_Mouse_Wheel;
            +struct _Ecore_Event_Mouse_Wheel 
            +{
            +   Ecore_Window window;
            +   Ecore_Window root_window;
            +   Ecore_Window event_window;
            +
            +   unsigned int timestamp;
            +   unsigned int modifiers;
            +
            +   int same_screen;
            +   int direction;
            +   int z;
            +
            +   int x;
            +   int y;
            +   struct 
            +   {
            +      int x;
            +      int y;
            +   } root;
            +};
            +
            +
          • +
          • ECORE_EVENT_MOUSE_IN and ECORE_EVENT_MOUSE_OUT events: +
            +typedef struct _Ecore_Event_Mouse_Move Ecore_Event_Mouse_Move;
            +struct _Ecore_Event_Mouse_Move 
            +{
            +   Ecore_Window window;
            +   Ecore_Window root_window;
            +   Ecore_Window event_window;
            +
            +   unsigned int timestamp;
            +   unsigned int modifiers;
            +
            +   int same_screen;
            +
            +   int x;
            +   int y;
            +   struct 
            +   {
            +      int x;
            +      int y;
            +   } root;
            +
            +   struct 
            +   {
            +      // 0 if normal mouse, 1+ for other mouse-devices (such as multi-touch - other fingers)
            +      int device; 
            +      // Radius of press point - radius_x and radius_y if it is an ellipse (radius is the average of the 2)
            +      double radius, radius_x, radius_y; 
            +      // Pressure - 1.0 == normal, > 1.0 == more, 0.0 == none
            +      double pressure; 
            +      // Angle relative to perpendicular (0.0 == perpendicular), in degrees
            +      double angle; 
            +      // Same as x, y, root.x, root.y, but with sub-pixel precision, if available
            +      double x, y; 
            +      struct 
            +      {
            +         double x, y;
            +      } root;
            +   } multi;
            +};
            +
            + +
          • +
          +

          Managing Ecore Event Handlers

          + +

          To manage Ecore event handlers:

          + +
          1. To add an Ecore event handler, register a callback for a specific event with the ecore_event_handler_add() function. +

            The function takes as parameters the event type (such as ECORE_EVENT_KEY_DOWN for key presses), callback function, and additional data delivered to the callback. The function returns an event handler pointer, which you can use to remove the handler later.

          2. + +
          3. Define the Ecore_Event_Handler_Cb() callback function. +

            The function takes as parameters the additional data defined in the ecore_event_handler_add() function parameters, the event type, and the event object (Ecore_Event_Key, Ecore_Event_Mouse_Button, Ecore_Event_Mouse_Wheel, or Ecore_Event_Mouse_Move). The function returns ECORE_CALLBACK_PASS_ON to allow other callbacks for that event be called, or ECORE_CALLBACK_DONE to not call them.

          4. + +
          5. When no longer needed, remove the event handler with the ecore_event_handler_del() function, using the event handler pointer as a parameter.
          + +

          The following example shows how you can set a global variable to EINA_TRUE when the Ctrl key is pressed:

          +
          +Eina_Bool ctrl_pressed = EINA_FALSE;
          +
          +static Eina_Bool
          +_key_down_cb(void *data __UNUSED__, int type __UNUSED__, void *ev)
          +{
          +   // The callback is used with the ECORE_EVENT_KEY_DOWN signal: the
          +   // parameter "void *ev" is therefore of the actual type Ecore_Event_Key
          +   // The following renders its fields accessible
          +   Ecore_Event_Key *event = ev;
          +
          +   // Test whether the key that is pressed is Ctrl.
          +   if (!strcmp("Control_L", event->key))
          +   {
          +      // If it is, store that piece of information
          +      ctrl_pressed = EINA_TRUE;
          +   }
          +
          +   // Let the event continue to other callbacks which have not been called yet
          +   return ECORE_CALLBACK_PASS_ON;
          +}
          +
          +ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
          +
          + +

          Sending Ecore Events to the Main Loop

          + +

          You can send Ecore events to the main loop yourself to handle actions of various origins through the same codepath. This is a thread-safe operation.

          +

          To send an event, use the ecore_event_add() function. The function takes as parameters the event type (such as ECORE_EVENT_KEY_DOWN for key presses), additional data delivered to the callback, the Ecore_End_Cb() function used to free the additional data after it is deliver to the callback function, and the pointer to additional data delivered to the free function. The free function and the pointer to its additional data are optional; use NULL if you do not need them.

          + + +

          Edje Events

          + +

          Edje themes have small program sections, which are triggered upon the reception of a signal that can execute actions, such as changing the state of an Edje part and running another program.

          + +

          Managing a Single Signal Emitter

          +

          The following example shoes a program section. The program is called "change_color", it is triggered on mouse clicks on the current part, and it emits a "got.a.click" signal where the source is set to "color_changer".

          +
          program 
          +{
          +   name: "change_color";
          +   signal: "mouse,clicked,*";
          +   source: "*";
          +   action: SIGNAL_EMIT "got.a.click" "color_changer";
          +}
          +
          + +

          To catch the emitted signal from the C side, use either the edje_object_signal_callback_add() or elm_object_signal_callback_add() function. Their only difference is that the previous one operates on an Edje object and the latter one on an Elementary object. Unless you do not use the Elementary library at all, use the Elementary variant.

          + +

          Both the functions take as parameters the object emitting the signal, the signal name ("*" acts as a wildcard), the signal source, the Edje_Signal_Cb() callback function called when the signal name and source match, and additional data delivered to the callback. For the signal name and source, "*" acts as a wildcard. The additional data is optional; use NULL if you do not need it.

          + +

          The callback function takes as parameters the additional data defined in the edje_object_signal_callback_add() or elm_object_signal_callback_add() function parameters, the object emitting the signal, the signal name, and the signal source.

          + + +

          Managing Multiple Signal Emitters in Layouts

          + +

          Most of the time, Edje and Elementary are used together. In particular, you can define a group in Edje and use it as a layout (containing several parts) in Elementary. The layouts enable you to perform theming and object placement in Edje while benefiting from the higher-level functions of Elementary.

          +

          Since the layout contains multiple parts, you cannot use the elm_object_signal_callback_add() and edje_object_signal_callback_add() functions, as they require a single emitter object. The solution is to use the dedicated elm_layout_signal_callback_add() function.

          + +

          The elm_layout_signal_callback_add() function works similarly as the elm_object_signal_callback_add() and edje_object_signal_callback_add() functions. The only difference is the type of the object in the first parameter. For elm_layout_signal_callback_add(), it is a pointer to an Evas_Object, which is obtained through the elm_layout_add() function. For more information, see Layout.

          + + +

          Evas Events

          + +

          Evas events happen on a canvas as a whole. These events are too low-level for writing applications and are mostly used when writing the graphical toolkit itself.

          + +

          The following Evas event types are available:

          + +
            +
          • EVAS_CALLBACK_RENDER_FLUSH_PRE: Rendering on the canvas is about to be updated.
          • +
          • EVAS_CALLBACK_RENDER_FLUSH_POST: Rendering on the canvas is updated.
          • +
          • EVAS_CALLBACK_CANVAS_FOCUS_IN: Canvas receives focus.
          • +
          • EVAS_CALLBACK_CANVAS_FOCUS_OUT: Canvas loses focus.
          • +
          • EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN: Any object on the canvas receives focus. +

            Instead of this event type, use the EVAS_CALLBACK_FOCUS_IN type with the evas_object_event_callback_add() function.

          • +
          • EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT: Any object on the canvas loses focus. +

            Instead of this event type, use the EVAS_CALLBACK_FOCUS_OUT type with the evas_object_event_callback_add() function.

          • +
          • EVAS_CALLBACK_RENDER_PRE: Rendering on the canvas starts.
          • +
          • EVAS_CALLBACK_RENDER_POST: Rendering on the canvas finishes.
          • +
          + +

          To register the event handler, use the evas_event_callback_add() function. The function takes as parameters the Evas canvas on which the event happens (to obtain the canvas, use the Evas_Object through the evas_object_evas_get() function), the event type, the Evas_Event_Cb callback function, and the pointer to the additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          + +

          The callback function takes as parameters the additional data defined in the evas_event_callback_add() function parameters, the canvas where the event happened, and the event info data, which depends on the object type and the event at play.

          + + +

          Evas Object Events

          + +

          Each Evas object on a specific Evas canvas can be manipulated independently. Each object can send events, which you can handle by registering callback functions for them. The events all relate to single objects, not the whole canvas.

          + +

          The following Evas object event types are available:

          +
            +
          • EVAS_CALLBACK_MOUSE_IN: Pointer got over an object (with no other object between the 2). This takes place no matter how the pointer becomes directly above the object. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • +
          • EVAS_CALLBACK_MOUSE_OUT: Triggered similarly to the EVAS_CALLBACK_MOUSE_IN event, but when the pointer goes outside the object area. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Out struct.
          • +
          • EVAS_CALLBACK_MOUSE_DOWN: Mouse button is pressed while the object is receiving events (either because the pointer is on top of the object or because the object had focus). The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Down struct.
          • +
          • EVAS_CALLBACK_MOUSE_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Up struct.
          • +
          • EVAS_CALLBACK_MOUSE_MOVE: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Move struct.
          • +
          • EVAS_CALLBACK_MOUSE_WHEEL: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_Wheel struct.
          • +
          • EVAS_CALLBACK_MULTI_DOWN: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Down struct.
          • +
          • EVAS_CALLBACK_MULTI_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Up struct.
          • +
          • EVAS_CALLBACK_MULTI_MOVE: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Multi_Move struct.
          • +
          • EVAS_CALLBACK_KEY_DOWN: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Key_Down struct.
          • +
          • EVAS_CALLBACK_KEY_UP: Triggered similarly to the EVAS_CALLBACK_MOUSE_DOWN event. The event info parameter in the callback is a pointer to an Evas_Event_Key_Up struct.
          • +
          • EVAS_CALLBACK_FOCUS_IN: Object gained focus. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • +
          • EVAS_CALLBACK_FOCUS_OUT: Object lost focus. The event info parameter in the callback is a pointer to an Evas_Event_Mouse_In struct.
          • +
          • EVAS_CALLBACK_SHOW: Object is shown by a call to the evas_object_show() function. The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_HIDE: Object is hidden by a call to the evas_object_hide() function. The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_MOVE: Object origin was moved (origin is the top-left corner at the creation time of the object). The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_RESIZE: Object is resized. The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_RESTACK: Object is re-stacked by the evas_object_stack_below() or evas_object_stack_above() function, or other events. The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_DEL: Object is deleted.
          • +
          • EVAS_CALLBACK_FREE: For internal use only. Do not use (the object resources are about to be freed). The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_HOLD: For internal use only. The event info parameter in the callback is a pointer to an Evas_Event_Hold struct.
          • +
          • EVAS_CALLBACK_CHANGED_SIZE_HINTS: Object size hints changed.
          • +
          • EVAS_CALLBACK_IMAGE_PRELOADED: Image preloaded through the evas_object_image_preload() function is loaded. The event info parameter in the callback is NULL.
          • +
          • EVAS_CALLBACK_IMAGE_UNLOADED: Image data is unloaded. The event info parameter in the callback is NULL.
          • +
          + +

          To register the callback, use the evas_event_callback_add() function. The function takes as parameters the object to which the callback is attached, the event type, the Evas_Object_Event_Cb callback function, and the pointer to the additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          + +

          The callback function takes as parameters the additional data defined in the evas_event_callback_add() function parameters, the canvas where the event happened, the object to which the event happened, and the event info data, which depends on the object type and the event at play.

          + +

          When no longer needed, remove the callback with the evas_object_event_callback_del() function.

          + + +

          Evas Smart Object Events

          + +

          Evas smart object events are the most widely-used type of events in graphical applications, since they are used for signals, such as "clicked", "clicked,double" (double-click), and "pressed". They are identified by strings, and each smart object is able to define its own events (although the names follow conventions).

          + +

          Managing Evas Smart Object Event Handlers

          + +
          1. To add an Evas Smart Object event handler, register a callback for a specific event to an object with the evas_object_smart_callback_add() function. +

            The function takes as parameters the object to which the callback is added, the event name, the callback function, and additional data delivered to the callback. The additional data is optional; use NULL if you do not need it.

          2. + +
          3. Define the Evas_Smart_Cb() callback function. +

            The function takes as parameters the additional data defined in the evas_object_smart_callback_add() function parameters, the object to which the event happened, and the event info data, which depends on the object type and the event at play.

            +

            If some of the parameters are not used by the callback function, the compiler can raise the "unused parameter" warning. To avoid it, annotate the parameter with the __UNUSED__ macro, which is a compiler-independent way to let the compiler know that the parameter is unused willingly, rather than by a mistake:

            +
            void cb(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__);
            +
          4. + +
          5. When no longer needed, remove the event handler with the evas_object_smart_callback_del() function. +

            The function removes the first match for the given event and callback, and returns the data pointer that was used in the corresponding call to the evas_object_smart_callback_add() function.

          + +

          The following example shows the _button_clicked() function and sets it as the callback for the clicked event of an Evas_Object button:

          + +
          +static void
          +_button_clicked(void *data, Evas_Object *obj, void *event_info)
          +{
          +   // Insert function body here
          +}
          +
          +static void
          +some_function(void) 
          +{
          +   // Code to build the window object
          +   Evas_Object *button = elm_button_add(window);
          +   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          +}
          +
          + +

          For a specific object and event, callbacks are called in the order they have been registered. The evas_object_smart_callback_add() function does not execute any special processing, if it is called several times with the same callback function or data. Callbacks are called as many times as they have been added and in the order they have been added.

          + + + +

          Evas Smart Object Event Handling Examples

          + +

          The following example shows a button with a callback for the "clicked" signal:

          + +
          static void
          +_button_clicked(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
          +{
          +   fprintf(stdout, "Button clicked.\n");
          +   fflush(stdout);
          +   elm_exit();
          +}
          +
          +static void
          +_add_button(Evas_Object *window) 
          +{
          +   Evas_Object *button;
          +
          +   button = elm_button_add(window);
          +   elm_object_text_set(button, "Click Me To Exit!");
          +   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          +
          +   evas_object_show(button);
          +}
          +
          + +

          The following example shows a button with a callback for the "clicked" signal. Clicking the button removes the callback:

          + +
          static void
          +_button_clicked(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
          +{
          +   fprintf(stdout, "Button clicked.\n");
          +   fflush(stdout);
          +   evas_object_smart_callback_del(obj, "clicked", _button_clicked);
          +}
          +
          +static void
          +_add_button(Evas_Object *window) 
          +{
          +   Evas_Object *button;
          +
          +   button = elm_button_add(window);
          +   elm_object_text_set(button, "Click Me!");
          +   evas_object_smart_callback_add(button, "clicked", _button_clicked, NULL);
          +
          +   evas_object_show(button);
          +}
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/font_resource_n.htm b/org.tizen.ui.practices/html/native/efl/font_resource_n.htm new file mode 100644 index 0000000..3069993 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/font_resource_n.htm @@ -0,0 +1,94 @@ + + + + + + + + + + + + + Font Resources + + + + + +
          + +

          Font Resources

          + +

          The font metrics of the default font resource can be used as a guideline for designing your own font resources, which can be distributed as a downloadable font package in the Tizen Store.

          +

          The font resource details can also be used to determine the layout of the UI components for a better user experience.

          + +

          The following guidelines show how to design a font resource:

          +
            +
          • The EM size of TTF must be 1000.
          • + +
          • TTF must not contain any hinting information.
          • +
          • When exporting the font to TTF, the TTF files must be smaller than 1 MB.
          • +
          • The font metrics must follow the following values: +
            +OS/2 table:
            +   TypoAscender:775
            +   TypoDescender:-225
            +   TypoLineGap:0
            +   WinAscent:930
            +   WinDescent:270
            +
            +hhea table:
            +   Ascender:930
            +   Descender:-270
            +   LineGap:0
            +
            +head table:
            +   xMin:-515
            +   yMin:-297
            +   xMax:1261
            +   yMax:1022
            +
            +
          • + +
          • The font family name must contain the company name and font family name. This is recommended to avoid multiple font resources having the same family name.
          • +
          • It is recommended that the font package icon stands for the identity of the font resource.
          • +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/font_setting_n.htm b/org.tizen.ui.practices/html/native/efl/font_setting_n.htm new file mode 100644 index 0000000..8e94ab5 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/font_setting_n.htm @@ -0,0 +1,441 @@ + + + + + + + + + + + + + Fonts: Setting Application Text Fonts + + + + + +
          + +

          Fonts: Setting Application Text Fonts

          + + +

          Tizen provides various methods for setting fonts of the application text. Basically, all UI components have a default font, which can be changed according to the system settings.

          + +

          The font handling methods include:

          + +
            +
          • Setting the font for a UI component using the Elementary Fonts API (in mobile and wearable applications)
          • +
          • Setting the font using EDC
          • +
          • Changing the font and text size using the Edje Class: Text API (in mobile and wearable applications) + +

            In the application, you can set a system-wide font and font size to text(textblock) parts with text classes (except tizen). When the system applies a new system-wide font and font size to the application, the font size of text(textblock) parts with the tizen text class are not affected.

            +

            The following words in the text_class definition are reserved for the system:

            + +
              +
            • button
            • +
            • label
            • +
            • entry
            • +
            • title_bar
            • +
            • list_item
            • +
            • grid_item
            • +
            • toolbar_item
            • +
            • menu_item
            • +
            • tizen
            • +
            + + +

            Set a specific ratio to a given font size for each object through the text class. If you give a negative value as font size, it is used as the percentage of the originally given font size. The following example code show set the font size as 150% of the given font size.

            +
            +elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", -150);
            +elm_config_font_overlay_apply();
            +
            +
          • + +
          • Creating your own font resources +

            You can create your own font resources in the SDK to be distributed as a downloadable font package in the Tizen Store.

            +
          • +
          + +

          Applying System Font Settings

          + +

          Tizen provides a special "Tizen" font name. The "Tizen" font name does not match with any specific font; it is just an alias for a system-defined font (system font). When you create a text(textblock) part with the "Tizen" font name in the application's EDC, the system font is loaded into the user application when those objects are created. Additionally, you can apply the system font to a text or textblock part by using the text class, as described above.

          + +

          The following EDC example shows how to apply the system font to a TEXT or TEXTBLOCK part by using the "Tizen" font name and the tizen text class. As font name is "Tizen" and the font size is set to 36, the system font is loaded in size 36. If the system setting changes, this part loads the new system font. However, its font size is not changed, because the text class is tizen.

          + +
          +description 
          +{
          +   text 
          +   {
          +      font: "Tizen:style=Regular";
          +      font_size: 36;
          +      text_class: "tizen";
          +   }
          +}
          + +

          If the part has a predefined text classes other than tizen, its font size is resized as well.

          + +
          +description 
          +{
          +   text 
          +   {
          +      font: "Tizen:style=Regular";
          +      font_size: 36;
          +      text_class: "label";
          +   }
          +}
          + + +

          Supported Font Styles

          +

          The font styles supported by the EFL are listed in the following table.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Supported font styles
          Font featureStyle attribute
          font_stylenormal
          oblique
          italic
          font_widthnormal
          ultracondensed
          extracondensed
          condensed
          semicondensed
          semiexpanded
          expanded
          extraexpanded
          ultraexpanded
          font_weightnormal
          thin
          ultralight
          light
          book
          medium
          semibold
          bold
          ultrabold
          black
          extrablack
          + +

          The style attributes are not case-sensitive (however, the font feature names are).

          +

          If you set the weight or width attribute to style=, it is processed to the right attribute.

          +
          +font=TizenSans:style=Bold // Textblock
          +"TizenSans:style=Bold"; // Text font
          +<font=TizenSans:style=Bold> // Markup tag
          +
          + +

          You can also use each attribute separately:

          + +
          +font=TizenSans font_style=Regular font_weight=Bold // Textblock
          +<font=TizenSans font_style=Regular font_weight=Bold> // Markup tag
          +
          + + +

          Setting the Font for a UI Component

          + +

          You can use the Elementary Fonts API (in mobile and wearable applications) to set the font for an application.

          +

          To set a font for a UI component:

          +
            +
          • Set the font for a common UI component: + + + + + + + + + + +
            Note
            You can set the font for a textblock in the code, but not in EDC (Edje Data Collection). If you add markup tags for the font inside the text, you can change the font of the text. However, you cannot set the font for a text part in this way because the TEXT type does not support markup tags.
            + +
            +char *buf = "<font=Sans:style=Regular font_size=50>Hello</font/>Font";
            +elm_object_part_text_set(layout, "textblock1", buf);
            +
            +
          • +
          • Set the font for an entry component (in mobile and wearable applications) using the elm_entry_text_style_user_push() function. It overrides the default style of the entry component for each attribute. + + + + + + + + + + +
            Note
            The elm_entry_text_style_user_push() function only affects the main text of the UI component. To change the font of the guide text, you have to add markup tags.
            +
            +char *user_style = "DEFAULT='font=Sans:style=Regular font_size=40'";
            +elm_entry_text_style_user_push(entry, user_style);
            +elm_object_part_text_set(entry, "elm.guide",
            +   "<font=Sans:style=Regular font_size=40>Guide Text</font>");
            +
            +
          • +
          + +

          Setting the Font Using EDC

          + +

          To create a layout with text using the EDC, you can set the font for each text part or textblock:

          +
            +
          • Set the font of a text part using the font family name and a specific style of the font family: +
            +part 
            +{ 
            +   name: "text";
            +   type: TEXT;
            +   scale: 1;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      rel1.relative: 0.0 0.5;
            +      rel2.relative: 0.5 1.0;
            +      color: 0 136 170 255;
            +      color2: 0 136 170 50;
            +      color3: 0 136 170 25;
            +      text 
            +      {
            +         size: 25;
            +         font: "Sans:style=Bold";
            +         text: "Enventor";
            +         align: 0.5 0.5;
            +      }
            +   }
            +}
            +
            +
          • + +
          • Add style information, which can be used for multiple textblock parts: +
            +styles 
            +{
            +   style 
            +   { 
            +      name: "textblock_style1";
            +      base: "font=Sans:style=Regular font_size=30";
            +   }
            +}
            +
            +part 
            +{ 
            +   name: "textblock";
            +   type: TEXTBLOCK;
            +   scale: 1;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      align: 0.5 0.5;
            +      fixed: 0 0;
            +      min: 0 0;
            +      visible: 1;
            +      text.text: "TEXTBLOCK";
            +      text.style: "textblock_style1";
            +      rel1.relative: 0.16 0.18;
            +      rel2.relative: 0.88 0.38;
            +   }
            +}
            +
            +
          • +
          + +

          Using the Edje Text Class

          + +

          You can use the Edje Class: Text API (in mobile and wearable applications) to change multiple text occurrences as a batch. If you set a new font or font size to a text class, the change is applied to multiple objects.

          + + + + + + + + + + +
          Note
          Note that the text_class cannot be used in a UI component with markup text or the elm_entry_text_style_user_push() function. You must set the text_class in EDC.
          + + +

          To set the text class, you can use reserved words for text class, but you can also make your own text class:

          + +
            +
          • Set a class for a text part: + +
            +part 
            +{ 
            +   name: "text";
            +   type: TEXT;
            +   scale: 1;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      rel1.relative: 0.0 0.5;
            +      rel2.relative: 0.5 1.0;
            +      color: 0 136 170 255;
            +      color2: 0 136 170 50;
            +      color3: 0 136 170 25;
            +      text 
            +      {
            +         size: 25;
            +         font: "Sans:style=Bold";
            +         text: "Enventor";
            +         align: 0.5 0.5;
            +         text_class: "my_class";
            +      }
            +   }
            +}
            +
            +
          • +
          • Set a class for a textblock: +
            +styles 
            +{
            +   style 
            +   { 
            +      name: "textblock_style1";
            +      base: "font=Sans:style=Regular font_size=30 ... text_class=my_class";
            +   }
            +}
            +
            +part 
            +{ 
            +   name: "textblock";
            +   type: TEXTBLOCK;
            +   scale: 1;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      align: 0.5 0.5;
            +      fixed: 0 0;
            +      min: 0 0;
            +      visible: 1;
            +      text.text: "TEXTBLOCK";
            +      text.style: "textblock_style1";
            +      rel1.relative: 0.16 0.18;
            +      rel2.relative: 0.88 0.38;
            +   }
            +}
            +
            +
          • +
          • +

            You can handle font and font style per text_class. If you set your own text_class in the EDC, you can change the font and font size:

            + +
            +elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", 30);
            +elm_config_font_overlay_apply();
            +
            +
          • +
          • +

            Set a specific ratio to a given font size for each object through the text class. If you give a negative value as font size, it is used as the percentage of the originally given font size. The following example code show set the font size as 150% of the given font size.

            +
            +elm_config_font_overlay_set("my_class", "TizenSans:style=Bold", -150);
            +elm_config_font_overlay_apply();
            +
            +
          • +
          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/form_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/form_tutorial_n.htm new file mode 100644 index 0000000..5fafeae --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/form_tutorial_n.htm @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + Creating a Form for a Basic Application Layout + + + + + + +
          +

          Creating a Form for a Basic Application Layout

          + + +

          This tutorial explains how to create a basic application that has a single window and multiple views: contact list view and contact details form view (displaying and editing contact information when an item is selected on the contact list).

          + +

          Creating a Single-window Application

          + +

          To create an elementary application with a single window, use the following code:

          +
          static bool
          +app_create(void *data)
          +{
          +   appdata_s *ad = data;
          +   create_gui(ad);
          +   return true;
          +}
          +
          +int
          +main(int argc, char **argv)
          +{
          +   appdata_s ad = { 0 };
          +   ui_app_lifecycle_callback_s event_callback = { 0 };
          +
          +   event_callback.create = app_create;
          +
          +   // Zero out the structure
          +   memset(&ad, 0x0, sizeof(struct appdata));
          +
          +   // Run the mainloop
          +   return ui_app_main(&argc, &argv, &event_callback, &ad);
          +}
          +
          + + + +

          Use a naviframe in this application to switch between different views. The first displayed view is the contact list. When an item is selected in this list, information on the contact is displayed in a contact details form. Both the list and form views are opened in a naviframe, which handles the animations between the views. It also creates a back button in the top bar, and when the button is clicked, launches the back animation, deletes the form view, and shows the contact list again.

          + +

          Figure: Views (list and form)

          +

          Form tutorial: list Form tutorial: form

          + +

          Since the naviframe is the main layout of the window, it takes all the available space. To configure the naviframe size, use the elm_win_resize_object_add() function to add the naviframe object (second parameter) to the main window (first parameter). To ensure that the naviframe covers the entire window area, call the evas_object_resize_hint_weight_set() function on the naviframe object to force the naviframe to fill its parent (the main window). The naviframe object expands in both X and Y directions.

          +

          In the end, show the naviframe object on the screen.

          +
          +// Create the naviframe
          +nav = elm_naviframe_add(win);
          +evas_object_size_hint_weight_set(nav, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_win_resize_object_add(win, nav);
          +evas_object_show(nav);
          +
          + +

          Creating a Contact List

          + +

          To create a contact list:

          +
            +
          1. +

            Handle the contact list with the _create_contact_list() function. This function takes the parent object (naviframe) as the parameter and returns the genlist. To create the genlist, use the following code:

            +
            +static Evas_Object *
            +_create_contact_list(Evas_Object *parent)
            +{
            +   Evas_Object *list;
            +   int i;
            +
            +   // Create a new genlist
            +   list = elm_genlist_add(parent);
            +   evas_object_show(list);
            +
            +   // Create a new item class for the genlist
            +   itc = elm_genlist_item_class_new();
            +   itc->item_style = "default";
            +   // Set the callback used when the genlist text is created
            +   itc->func.text_get = _genlist_text_get;
            +   // Set the callback be used when the content of the item is created
            +   itc->func.content_get = _genlist_content_get;
            +   itc->func.state_get = NULL;
            +   itc->func.del = NULL;
            +}
            +
            + +

            The itc static variable contains the item class. The item class contains all functions that are called back when an item is created. In this case, create the _genlist_text_get() (for labels) and _genlist_content_get() (for icons) callbacks. These functions are called when labels and icons of the genlist item are created.

            + +

            The contact list is contained in an array of Contacts.

            +
            +typedef struct 
            +_Contact Contact;
            +
            +struct 
            +_Contact
            +{
            +   const char *name;
            +   const char *mobile;
            +   const char *address;
            +   const char *email;
            +   const char *icon;
            +};
            +
            +static 
            +Contact contacts[] = 
            +{
            +   {"Alexander Holmes", "+1234567896", "", "alexander_holmes@tizen.org", "c1.png"},
            +   {"Lara Alvaréz", "+9876543216", "", "lara_alvares@tizen.org", "c2.png"},
            +   {"Aksel Møller", "+1679432846", "", "aksel_moller@tizen.org", "c3.png"},
            +   {"Anir Amghar", "+1679432846", "", "anir_amghar@tizen.org", "c4.png"},
            +   {"Noémie Cordier", "+1679432846", "", "noemie_cordier@tizen.org", "c5.png"},
            +   {"Henry Thompson", "+1679432846", "", "henry_thompson@tizen.org", "c6.png"},
            +   {"Mai Phan", "+1679432846", "", "mai_phan@tizen.org", "c7.png"},
            +};
            +
            +
          2. +
          3. +

            Create a genlist item for each item of the array with the following code:

            +
            +// Create a genlist item for each item in the contacts array
            +for (i = 0; i < EINA_C_ARRAY_LENGTH(contacts); i++)
            +{
            +   // Append the item, add a callback when the item is selected, and use the
            +   // current contact item as data pointer for the callbacks
            +   elm_genlist_item_append(list, itc, &contacts[i], NULL,
            +                           ELM_GENLIST_ITEM_NONE, _contact_selected_cb, &contacts[i]);
            +}
            +
            + +

            Attach the _contact_selected_cb() callback function to the genlist item. When an item is selected in the list, the data pointer passed as the parameter calls this function. In this example, it is a pointer on the contact. Pass the contact in the array to all the item class callbacks.

            +
          4. +
          5. +

            Push the list at the top of the naviframe:

            +
            +// Create the list of contacts
            +list = _create_contact_list(win);
            +
            +// Push the list on top of the naviframe
            +elm_naviframe_item_push(nav, NULL, NULL, NULL, list, NULL);
            +
            +
          6. +
          7. +

            Call the item class functions, the _genlist_text_get() function first:

            +
            +static char *
            +_genlist_text_get(void *data, Evas_Object *obj EINA_UNUSED, const char *part)
            +{
            +   Contact *contact = data;
            +
            +   // Return a new allocated string for the contact name
            +   return strdup(contact->name);
            +}
            +
            + +

            These functions show the index of the contact in the array and return a freshly allocated string with the name of the contact.

            +

            When an item in the list is selected, a callback registers on the select signal and calls the corresponding function; in this case, _contact_selected_cb(). The index of the array passed in the data is retrieved and the form on contact information based on this index is created.

            +

            The _genlist_content_get function is called several times depending on the style of the created item. In this case, with the default style for the genlist item, there are 2 different swallow parts. A swallow part is a container in the edje file of the genlist item, which can contain an Evas object. The following figure shows the layout of different parts in the theme.

            + + +

            Figure: Genlist item

            +

            Genlist item

            + + +

            There are 2 elm.swallow parts. When the callback function for the icon creation is called, the part name is passed through the part variable. Compare this variable to elm.swallow.icon for the first object and to elm.swallow.end for the icon at the end.

            +
          8. +
          + +

          Creating the Icon

          +

          Create the icon when the callback is recognized. This example uses an elm_icon object.

          +
          +static Evas_Object *
          +_genlist_content_get(void *data, Evas_Object *obj, const char *part)
          +{
          +   Contact *contact = data;
          +
          +   // Test which part is being created
          +   if (!strcmp(part, "elm.swallow.icon"))
          +   {
          +      char filename[PATH_MAX];
          +      // Create a new icon
          +      Evas_Object *ic = elm_icon_add(obj);
          +      // Set the filename of the file which is to be loaded
          +      snprintf(filename, sizeof(filename), "%s%s", ICON_PATH, contact->icon);
          +      elm_image_file_set(ic, filename, NULL);
          +      // Keep the ratio squared
          +      evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
          +
          +      // Return the icon
          +      return ic;
          +   }
          +
          +   return NULL;
          +}
          +
          + +

          In case the part is elm.swallow.end, the return is NULL and no icon is added.

          +

          A genlist can seem like an unnecessarily complex structure with its separate callbacks for creating items. However, in a list with thousands of elements, it is quite efficient not to create the graphical items for all list elements at once. Instead only the elements currently displayed on the screen are created through the callbacks. And when the list is scrolled, further callbacks create new elements as they are needed.

          + + + + + + + + + + +
          Note
          When the genlist is first created, the Elementary needs to know the height of the list. All elements in the list are not necessarily the same size due to different kind of styles. Thus, the Elementary creates all elements once to know the size, and display the scroll bars correctly. If all your items have the same height, you can save CPU time by using the elm_genlist_homogeneous_set() function to impose the same height to all items. In this case, the Elementary does not create the complete list, as the global size is a multiple of the height of the first item.
          + +

          Creating a Contact Details Form

          +

          The contact details form is created inside the _create_contact_form() function. This function takes a parent Evas_Object and a contact item as parameters, and returns an Evas_Object. The parent is the naviframe object, and the contact item contains the information on the contact.

          +

          To display the various information about the contact, this example uses boxes.

          + +

          Figure: Contact form layout

          +

          Contact form layout

          + +

          To create a contact form:

          +
            +
          1. +

            Create a vertical box:

            +
            +vbox = elm_box_add(parent);
            +elm_box_align_set(vbox, 0, 0);
            +evas_object_show(vbox);
            +
            +

            The elm_box_align_set() function keeps the box element aligned to the top left corner.

            +
          2. +
          3. +

            Create an icon in the genlist item with the _genlist_content_get() function. For a bigger icon, set the minimum size of the icon object to 96 x 96 px.

            +
          4. +
          5. +

            Add the icon object at the end of the vertical box with the elm_box_pack_end() function. As the icon is the first object added, it is displayed at the top of the box.

            +
            +ic = elm_icon_add(vbox);
            +snprintf(filename, sizeof(filename), "%s%s", ICON_PATH, contact->icon);
            +elm_image_file_set(ic, filename, NULL);
            +evas_object_size_hint_min_set(ic, 96, 96);
            +evas_object_show(ic);
            +elm_box_pack_end(vbox, ic);
            +
            +
          6. +
          7. +

            Add the information on the contact: the name, the mobile phone number, the postal address, and the email address. For each information item, create a label and an edit line. The label defines the information type, and the edit box contains the actual information. To set the UI components in a horizontal layout, use a horizontal box.

            +
          8. +
          9. +

            Change the orientation of the box with the elm_box_horizontal_set() function. To add space between the elements of the vertical box, set padding to 32 px. To set the item of the box not to expand vertically, use the evas_object_size_hint_weight_set() function.

            +
            +hbox = elm_box_add(vbox);
            +elm_box_horizontal_set(hbox, EINA_TRUE);
            +elm_box_padding_set(hbox, 32, 32);
            +evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0);
            +evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, 0);
            +evas_object_show(hbox);
            +
            +
          10. +
          11. +

            Create the label object, which is an elm_label. Set its text, and do not align or expand it.

            +
            +label = elm_label_add(hbox);
            +elm_object_text_set(label, form_items[i]);
            +evas_object_size_hint_weight_set(label, 0, 0);
            +evas_object_size_hint_align_set(label, 0, 0);
            +evas_object_show(label);
            +
            +
          12. +
          13. +

            Create the edit line, which is an elm_entry:

            +
            +edit = elm_entry_add(hbox);
            +evas_object_size_hint_weight_set(edit, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(edit, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(edit);
            +
            +
          14. +
          15. +

            Add the label and the edit inside the horizontal box and add the horizontal box to the vertical box:

            +
            +elm_box_pack_end(hbox, label);
            +elm_box_pack_end(hbox, edit);
            +
            +elm_box_pack_end(vbox, hbox);
            +
            +
          16. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/genlist_tutorial_mn.htm b/org.tizen.ui.practices/html/native/efl/genlist_tutorial_mn.htm new file mode 100644 index 0000000..8139e6b --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/genlist_tutorial_mn.htm @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + Creating Mobile Genlists + + + + + + +
          +

          Creating Mobile Genlists

          + + +

          This tutorial shows how to create genlists, which are list components for large sets of elements. Genlists use callbacks to populate entries. The same UI component handles both flat lists and trees.

          + +

          This feature is supported in mobile applications only.

          + +

          Creating a Genlist

          + + +

          To initialize the application for a genlist and create the genlist component:

          +
            +
          1. +

            Create a window entitled Genlist Basic Tutorial. It consists of a conformant component that contains a naviframe component. The genlist goes inside the naviframe.

            +
            +static bool
            +_app_create(void *data)
            +{
            +   appdata_s *app = data;
            +
            +   app->win = elm_win_util_standard_add("main", "Genlist Basic Tutorial");
            +   elm_win_conformant_set(app->win, EINA_TRUE);
            +   evas_object_show(app->win);
            +   evas_object_resize(app->win, 480, 800);
            +   elm_win_autodel_set(app->win, EINA_TRUE);
            +
            +   app->conformant = elm_conformant_add(app->win);
            +   evas_object_size_hint_weight_set(app->conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(app->win, app->conformant);
            +   evas_object_show(app->conformant);
            +
            +   app->naviframe = elm_naviframe_add(app->win);
            +   evas_object_size_hint_weight_set(app->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(app->win, app->naviframe);
            +   evas_object_show(app->naviframe);
            +   elm_object_content_set(app->conformant, app->naviframe);
            +
            +   _create_list(app);
            +   elm_naviframe_item_push(app->naviframe, NULL, NULL, NULL, app->list, NULL);
            +
            +   return true;
            +}
            +
            +int
            +main(int argc, char **argv)
            +{
            +   // Declare a few structures and zero-initialize (C99 feature)
            +   struct app_data app = {0};
            +   ui_app_lifecycle_callback_s event_callback = {0};
            +
            +   event_callback.create = _app_create;
            +
            +   // Run the mainloop
            +   return ui_app_main(&argc, &argv, &event_callback, &ad);
            +}
            +
            +
          2. +
          3. +

            Declare the app_data struct:

            +
            struct 
            +app_data
            +{
            +   Evas_Object *win;
            +   Evas_Object *naviframe;
            +   Evas_Object *conformant;
            +   Evas_Object *list;
            +   Elm_Genlist_Item_Class *itc;
            +   Elm_Genlist_Item_Class *itc2;
            +};
            +
            +
          4. + + +
          5. +

            To create the genlist, call the elm_genlist_add() function:

            +
            +Evas_Object *list = elm_genlist_add(parent);
            +
          6. +
          +

          Figure: Genlist example

          +

          Genlist example

          + +

          Adding List Entries

          + +

          To add entries to the list:

          +
            +
          1. +

            Build a basic item class:

            +
            Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
            +itc->item_style = "default";
            +itc->func.text_get = NULL;
            +itc->func.content_get = NULL;
            +itc->func.state_get = NULL;
            +itc->func.del = NULL;
            +
            + +

            This example uses the item class to set the item_style to default and all other fields to NULL. Note that this leaves out the text_get and content_get fields, which are used to add text and an icon to the list entry. In general, the item class fields define the APIs that are used to manage the list items.

            +
          2. +
          3. +

            Add a new element to the list by calling the elm_genlist_item_append() function. Its second parameter is the item class structure which describes how to populate entries. Typically this structure is built once and re-used across calls to the elm_genlist_item_append() function.

            +
            +elm_genlist_item_append(list,
            +                        itc,
            +                        NULL, // Item data
            +                        NULL, // Parent item for trees, NULL if none
            +                        ELM_GENLIST_ITEM_NONE, // Item type; this is the common one
            +                        NULL, // Callback on selection of the item
            +                        NULL // Data for that callback function
            +);
            +
            +

            With most parameters as NULL and itc having most of its members NULL too, the elements of the list are blank and do not trigger anything when selected.

            +
          4. +
          5. +

            Use the text_get() callback to add text in the elements in the Elm_Genlist_Item_Class structure.

            +

            The callback must follow a prototype that takes data, an Evas Object, and a part variable as parameters. It returns a C string that is displayed in the part named after the part parameter. The callback is called for each user-settable text part according to the current theme.

            + +

            For more information on parts as used in the EFL files, see Writing a Simple EDC File.

            + + + + + + + + + + + +
            Note
            The value returned by the callback is freed by the EFL. The value must be freshly allocated: do not free it yourself and do not reuse it across list elements.
            + +

            The default theme (style defined for the item class) contains an elm.text part. The following example shows a possible implementation of the text_get() callback displaying text in the elm.text part:

            +
            +static char *
            +_genlist_text_get(void *data, Evas_Object *obj, const char *part)
            +{
            +   // Check this is text for the expected part
            +   if (strcmp(part, "elm.text") == 0) 
            +   {
            +      return strdup("Some text");
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            + + + + + + + + + + +
            Note
            The part names and positions depend on the item_style chosen when adding new items to the genlist. Setting a custom theme makes it possible to completely change genlists by adding and moving parts. For more information, see Introduction to EDC Programming.
            + +

            The data parameter makes it possible to vary the list behavior according to the data given to the EFL in the data parameter of the elm_genlist_item_append() function call. For example, given an integer in that field through casting with (void *)(uintptr_t) i, you can get its value back using (int)(uintptr_t)data:

            +
            +static char *
            +_genlist_text_get(void *data, Evas_Object *obj__UNUSED__, const char *part)
            +{
            +   if (strcmp(part, "elm.text") == 0) 
            +   {
            +      char *buf = malloc(16);
            +      snprintf(buf, 16, "Entry %d.", (int)(uintptr_t)data);
            +
            +      return buf;
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            +
          6. +
          7. +

            Add icons to the list with the content_get() callback. It returns a pointer to an Evas_Object and is called for each part whose content can be set. The callback must follow a prototype that takes data, an Evas Object, and a part variable as parameters. The only difference with the text_get() callback is that the content_get() function returns an Evas_Object* rather than a char *.

            + +

            The following example creates colored rectangles in the parts that are to be set. In the default theme, this displays a red rectangle on the left side of each list item and a green one on the right side.

            +
            +static Evas_Object *
            +_genlist_content_get(void *data, Evas_Object *obj, const char *part)
            +{
            +   int i = (int) (uintptr_t) data;
            +
            +   if (strcmp(part, "elm.swallow.icon") == 0) 
            +   {
            +      Evas_Object *bg = elm_bg_add(obj);
            +      elm_bg_color_set(bg, 255 * cos(i / (double) 10), 0, i % 255);
            +
            +      return bg;
            +   }
            +   else if (strcmp(part, "elm.swallow.end") == 0) 
            +   {
            +      Evas_Object *bg = elm_bg_add(obj);
            +      elm_bg_color_set(bg, 0, 255 * sin(i / (double) 10), i % 255);
            +
            +      return bg;
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            +
          8. +
          9. +

            Implement the genlist item events.

            +

            Genlist items trigger a callback when clicked. The callback is chosen when adding the new item, for example, when calling the elm_genlist_item_append() function:

            +
            +elm_genlist_item_append(list, itc, NULL,  NULL,  ELM_GENLIST_ITEM_NONE,
            +                        _genlist_selected_cb, // Callback on selection of the item
            +                        NULL);
            +
            + +

            The callback must follow a prototype that takes data, an Evas Object, and event information as parameters. The following implementation changes the item's style when the item is selected.

            +
            +static void
            +_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   struct app_data *app = data;
            +
            +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
            +
            +   elm_genlist_item_item_class_update(it, app->itc2);
            +}
            +
            +
          10. +
          + +

          Managing Item Style and Size

          + + +

          You can manage the item style and size:

          + +
            +
          • Managing the item style: +

            The number of parts that you can fill for an item depends on the item style that you select when creating the item class ( Elm_Genlist_Item_Class struct) for the genlist:

            +
            +app->itc->item_style = "default";
            +
            +

            For all available styles, see Genlist.

            +

            You can customize the styles by modifying the theme in the EDC file. In case the customization is only visual, it is a good practice to keep the same item style names for new themes. This makes it possible to change the theme and keep the code the same while also retaining the same overall item placement.

            +
          • +
          • Setting a homogeneous item size: +

            To set the scroller correctly, the actual height and width of the genlist must be computed at the beginning. Since this means computing the size of each item and adding all item sizes together, it has a cost and slows down the process of adding items to a genlist.

            +

            The elm_genlist_homogeneous_set() function solves the problem by assuming that all items are the same size as the first item of the list. This assumption speeds up large insertions; however, it can lead to serious graphical issues if the items are not actually the same size. Use this function with care.

          • +
          • Changing the item class after the item has been created: +

            Changing the item class of a UI component is an easy way to change its appearance based on user actions (for example, when it is selected). To change the item class, call the elm_genlist_item_item_class_update() function:

            +
            static void
            +_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
            +{
            +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
            +
            +   // Change the appearance and possibly content of the item being expanded
            +   elm_genlist_item_item_class_update(it, app->itc2);
            +
            +   elm_genlist_item_expanded_set(it, EINA_TRUE);
            +}
            +
            +
          • +
          + +

          Using Item Modes

          + +

          The previous genlist examples have all featured bare lists. However, the genlist component is able to display items in a tree or group mode:

          + +
            +
          • Tree mode uses the parenting relationship with other items. +

            The child elements are created on-demand when their parent is expanded, and deleted when it is contracted.

          • +
          • Group mode keeps an element visible as long as one of its children is visible. +

            When scrolling, the parent element remains at the top of the UI component until all its child elements have been scrolled through and another group replaces it. The group mode is very useful for "title" items.

          • +
          +

          A common UI design is to mix the group and tree modes to allows for a tree behavior while keeping the group header item visible.

          + +
            +
          • +

            To use the group mode:

            +
              +
            1. +

              Mark some elements as ELM_GENLIST_ITEM_GROUP and use the returned Elm_Object_Item to establish the parent-children relationship when adding the children items.

              +

              Since there are 2 kind of items, create 2 item classes. Give them different styles and callback functions.

              +
              +app->itc = elm_genlist_item_class_new();
              +app->itc->item_style = "default_style";
              +app->itc->func.text_get = _genlist_text_get_size;
              +app->itc->func.content_get = _genlist_content_get_bg;
              +app->itc->func.state_get = NULL;
              +app->itc->func.del = NULL; 
              +
              +app->itc2 = elm_genlist_item_class_new();
              +app->itc2->item_style = "icon_top_text_bottom";
              +app->itc2->func.text_get = _genlist_text_get_nosize;
              +app->itc2->func.content_get = _genlist_content_get_icon;
              +app->itc2->func.state_get = NULL;
              +app->itc2->func.del = NULL; 
              +
              +
            2. +
            3. +

              Add a group header and follow it with 10 children. This is repeated 1000 times.

              +

              The parent has the ELM_GENLIST_ITEM_GROUP type, while the children have the ELM_GENLIST_ITEM_NONE type.

              +

              Note that the value returned by the elm_genlist_item_append() function for a group header is stored and sent to the elm_genlist_item_append() call that adds the children. This creates the parent-child relationship.

              +
              +for (i = 0; i < 1000; i++) 
              +{
              +   it = elm_genlist_item_append(app->list, app->itc2, (void *)(uintptr_t) (10 * i), NULL,
              +                                ELM_GENLIST_ITEM_GROUP, NULL, NULL);
              +   for (j = 0; j < 10; j++)
              +   {
              +      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (10 * i + j), it,
              +                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
              +   }
              +}
              +
              +
            4. +
            +
          • + +
          • To use the tree mode:

            +
              +
            1. +

              Register the callbacks (expand,request, expanded, contract,request, and contracted) using the evas_object_smart_callback_add() function on the genlist object:

              +
              +evas_object_smart_callback_add(app->list, "expand,request",
              +                               _tree_item_expand_request, NULL);
              +evas_object_smart_callback_add(app->list, "expanded",
              +                               _tree_item_expanded, NULL);
              +
              +evas_object_smart_callback_add(app->list, "contract,request",
              +                               _tree_item_contract_request, NULL);
              +evas_object_smart_callback_add(app->list, "contracted",
              +                               _tree_item_contracted, NULL);
              +
              + +

              The expand,request and contract,request callbacks do only one thing: decide whether the element is expanded or contracted. This is done by using the elm_genlist_item_expanded_set() function; if it changes the expansion status of the item, the next callback is called (either expanded or contracted, depending on whether it was an expand,request or contract,request event). The following examples show a minimal implementation of these callbacks.

              +
              +static void
              +_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_item_class_update(it, app->itc2);
              +
              +   elm_genlist_item_expanded_set(it, EINA_TRUE);
              +}
              +
              + +
              +static void
              +_tree_item_contract_request(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_item_class_update(it, app->itc);
              +
              +   elm_genlist_item_expanded_set(it, EINA_FALSE);
              +}
              +
              + + + + + + + + + +
              Note
              The above examples have an extra line: the call to the elm_genlist_item_item_class_update() function. This function changes the item style after the item creation.
              +
            2. +
            3. +

              Expand the list. Once the genlist item status is set to expanded, the expanded event is triggered and it is the duty of a callback for that event to populate the list with the item's children. This relies on the parent parameter of functions (such as elm_genlist_item_append()), similar to the group mode.

              +

              The following function is a callback implementation for the expanded event. It adds items that are built similarly to previous items, the only change is the parent parameter which is not NULL. Conveniently, the parent Elm_Object_Item pointer that is passed to the elm_genlist_item_append() function is given in the event_info callback and needs to be cast.

              +
              +static void
              +_tree_item_expanded(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
              +   int i_parent = (int)(uintptr_t) data;
              +   int i;
              +
              +   for (i = 0; i < 10; i++) 
              +   {
              +      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (i + i_parent), it_parent,
              +                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
              +   }
              +}
              +
              +
            4. +
            5. +

              Contract the list. The following code has the callback function for the contracted event. It simply calls the elm_genlist_item_subitems_clear() function to clear all children (including their own children if they have any) of the given item. Again, the item that is being contracted is available through the event_info parameter to the callback.

              +
              static void
              +_tree_item_contracted(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_subitems_clear(it_parent);
              +}
              +
              +
            6. +
            +
          • +
          • +

            To mix group and tree modes:

            +
              +
            1. Create an item of the group type, and an item of the tree type whose parent is the group type item.
            2. +
            3. Add the callbacks to populate the children of the tree item in the regular way.
            4. +
            +
          • +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/genlist_tutorial_wn.htm b/org.tizen.ui.practices/html/native/efl/genlist_tutorial_wn.htm new file mode 100644 index 0000000..becad45 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/genlist_tutorial_wn.htm @@ -0,0 +1,486 @@ + + + + + + + + + + + + + + Creating Wearable Genlists + + + + + + +
          +

          Creating Wearable Genlists

          + +

          This tutorial shows how to create genlists, which are list components for large sets of elements. Genlists use callbacks to populate entries. The same UI component handles both flat lists and trees.

          + +

          This feature is supported in wearable applications only.

          + + +

          Creating a Genlist

          + +

          To initialize the application for a genlist and create the genlist component:

          +
            +
          1. +

            Create a window entitled Genlist Basic Tutorial. It consists of a conformant component that contains a naviframe component. The genlist goes inside the naviframe.

            +
            +static bool
            +_app_create(void *data)
            +{
            +   appdata_s *app = data;
            +
            +   app->win = elm_win_util_standard_add("main", "Genlist Basic Tutorial");
            +   elm_win_conformant_set(app->win, EINA_TRUE);
            +   evas_object_show(app->win);
            +   evas_object_resize(app->win, 480, 800);
            +   elm_win_autodel_set(app->win, EINA_TRUE);
            +
            +   app->conformant = elm_conformant_add(app->win);
            +   evas_object_size_hint_weight_set(app->conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(app->win, app->conformant);
            +   evas_object_show(app->conformant);
            +
            +   app->naviframe = elm_naviframe_add(app->win);
            +   evas_object_size_hint_weight_set(app->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(app->win, app->naviframe);
            +   evas_object_show(app->naviframe);
            +   elm_object_content_set(app->conformant, app->naviframe);
            +
            +   _create_list(app);
            +   elm_naviframe_item_push(app->naviframe, NULL, NULL, NULL, app->list, NULL);
            +
            +   return true;
            +}
            +
            +int
            +main(int argc, char **argv)
            +{
            +   // Declare a few structures and zero-initialize (C99 feature)
            +   struct app_data app = {0};
            +   ui_app_lifecycle_callback_s event_callback = {0};
            +
            +   event_callback.create = _app_create;
            +
            +   // Run the mainloop
            +   return ui_app_main(&argc, &argv, &event_callback, &ad);
            +}
            +
            +
          2. +
          3. +

            Declare the app_data struct:

            +
            struct 
            +app_data
            +{
            +   Evas_Object *win;
            +   Evas_Object *naviframe;
            +   Evas_Object *conformant;
            +   Evas_Object *list;
            +   Elm_Genlist_Item_Class *itc;
            +   Elm_Genlist_Item_Class *itc2;
            +};
            +
            +
          4. + + +
          5. +

            To create the genlist, call the elm_genlist_add() function:

            +
            +Evas_Object *list = elm_genlist_add(parent);
            +
          6. +
          +

          Figure: Genlist example

          +

          Genlist example

          + +

          Adding List Entries

          + +

          To add entries to the list:

          +
            +
          1. +

            Build a basic item class:

            +
            Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
            +itc->item_style = "default";
            +itc->func.text_get = NULL;
            +itc->func.content_get = NULL;
            +itc->func.state_get = NULL;
            +itc->func.del = NULL;
            +
            + +

            This example uses the item class to set the item_style to default and all other fields to NULL. Note that this leaves out the text_get and content_get fields, which are used to add text and an icon to the list entry. In general, the item class fields define the APIs that are used to manage the list items.

            +
          2. +
          3. +

            Add a new element to the list by calling the elm_genlist_item_append() function. Its second parameter is the item class structure which describes how to populate entries. Typically this structure is built once and re-used across calls to the elm_genlist_item_append() function.

            +
            +elm_genlist_item_append(list,
            +                        itc,
            +                        NULL, // Item data
            +                        NULL, // Parent item for trees, NULL if none
            +                        ELM_GENLIST_ITEM_NONE, // Item type; this is the common one
            +                        NULL, // Callback on selection of the item
            +                        NULL // Data for that callback function
            +);
            +
            +

            With most parameters as NULL and itc having most of its members NULL too, the elements of the list are blank and do not trigger anything when selected.

            +
          4. +
          5. +

            Use the text_get() callback to add text in the elements in the Elm_Genlist_Item_Class structure.

            +

            The callback must follow a prototype that takes data, an Evas Object, and a part variable as parameters. It returns a C string that is displayed in the part named after the part parameter. The callback is called for each user-settable text part according to the current theme.

            + +

            For more information on parts as used in the EFL files, see Writing a Simple EDC File.

            + + + + + + + + + + + +
            Note
            The value returned by the callback is freed by the EFL. The value must be freshly allocated: do not free it yourself and do not reuse it across list elements.
            + +

            The default theme (style defined for the item class) contains an elm.text part. The following example shows a possible implementation of the text_get() callback displaying text in the elm.text part:

            +
            +static char *
            +_genlist_text_get(void *data, Evas_Object *obj, const char *part)
            +{
            +   // Check this is text for the expected part
            +   if (strcmp(part, "elm.text") == 0) 
            +   {
            +      return strdup("Some text");
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            + + + + + + + + + + +
            Note
            The part names and positions depend on the item_style chosen when adding new items to the genlist. Setting a custom theme makes it possible to completely change genlists by adding and moving parts. For more information, see Introduction to EDC Programming.
            + +

            The data parameter makes it possible to vary the list behavior according to the data given to the EFL in the data parameter of the elm_genlist_item_append() function call. For example, given an integer in that field through casting with (void *)(uintptr_t) i, you can get its value back using (int)(uintptr_t)data:

            +
            +static char *
            +_genlist_text_get(void *data, Evas_Object *obj__UNUSED__, const char *part)
            +{
            +   if (strcmp(part, "elm.text") == 0) 
            +   {
            +      char *buf = malloc(16);
            +      snprintf(buf, 16, "Entry %d.", (int)(uintptr_t)data);
            +
            +      return buf;
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            +
          6. +
          7. +

            Add icons to the list with the content_get() callback. It returns a pointer to an Evas_Object and is called for each part whose content can be set. The callback must follow a prototype that takes data, an Evas Object, and a part variable as parameters. The only difference with the text_get() callback is that the content_get() function returns an Evas_Object* rather than a char *.

            + +

            The following example creates colored rectangles in the parts that are to be set. In the default theme, this displays a red rectangle on the left side of each list item and a green one on the right side.

            +
            +static Evas_Object *
            +_genlist_content_get(void *data, Evas_Object *obj, const char *part)
            +{
            +   int i = (int) (uintptr_t) data;
            +
            +   if (strcmp(part, "elm.swallow.icon") == 0) 
            +   {
            +      Evas_Object *bg = elm_bg_add(obj);
            +      elm_bg_color_set(bg, 255 * cos(i / (double) 10), 0, i % 255);
            +
            +      return bg;
            +   }
            +   else if (strcmp(part, "elm.swallow.end") == 0) 
            +   {
            +      Evas_Object *bg = elm_bg_add(obj);
            +      elm_bg_color_set(bg, 0, 255 * sin(i / (double) 10), i % 255);
            +
            +      return bg;
            +   }
            +   else 
            +   {
            +      return NULL;
            +   }
            +}
            +
            +
          8. + + + + + + + + + + +
            Note
            The swallow parts have no minimum size. This means that if you do not fix the minimum size, the part cannot be seen.
            + +
          9. +

            Implement the genlist item events.

            +

            Genlist items trigger a callback when clicked. The callback is chosen when adding the new item, for example, when calling the elm_genlist_item_append() function:

            +
            +elm_genlist_item_append(list, itc, NULL,  NULL,  ELM_GENLIST_ITEM_NONE,
            +                        _genlist_selected_cb, // Callback on selection of the item
            +                        NULL);
            +
            + +

            The callback must follow a prototype that takes data, an Evas Object, and event information as parameters. The following implementation changes the item's style when the item is selected.

            +
            +static void
            +_genlist_selected_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   appdata_s *app = data;
            +
            +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
            +
            +   elm_genlist_item_item_class_update(it, app->itc2);
            +}
            +
            +
          10. +
          + +

          Managing Item Style and Size

          + + +

          You can manage the item style and size:

          + +
            +
          • Managing the item style: +

            The number of parts that you can fill for an item depends on the item style that you select when creating the item class ( Elm_Genlist_Item_Class struct) for the genlist:

            +
            +app->itc->item_style = "default";
            +
            +

            For all available styles, see Genlist.

            +

            You can customize the styles by modifying the themein the EDC file. In case the customization is only visual, it is a good practice to keep the same item style names for new themes. This makes it possible to change the theme and keep the code the same while also retaining the same overall item placement.

            +
          • +
          • Setting a homogeneous item size: +

            To set the scroller correctly, the actual height and width of the genlist must be computed at the beginning. Since this means computing the size of each item and adding all item sizes together, it has a cost and slows down the process of adding items to a genlist.

            +

            The elm_genlist_homogeneous_set() function solves the problem by assuming that all items are the same size as the first item of the list. This assumption speeds up large insertions; however, it can lead to serious graphical issues if the items are not actually the same size. Use this function with care.

          • +
          • Changing the item class after the item has been created: +

            Changing the item class of a UI component is an easy way to change its appearance based on user actions (for example, when it is selected). To change the item class, call the elm_genlist_item_item_class_update() function:

            +
            static void
            +_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
            +{
            +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
            +
            +   // Change the appearance and possibly content of the item being expanded
            +   elm_genlist_item_item_class_update(it, app->itc2);
            +
            +   elm_genlist_item_expanded_set(it, EINA_TRUE);
            +}
            +
            +
          • +
          + +

          Using Item Modes

          + +

          The previous genlist examples have all featured bare lists. However, the genlist component is able to display items in a tree or group mode:

          + +
            +
          • Tree mode uses the parenting relationship with other items. +

            The child elements are created on-demand when their parent is expanded, and deleted when it is contracted.

          • +
          • Group mode keeps an element visible as long as one of its children is visible. +

            When scrolling, the parent element remains at the top of the UI component until all its child elements have been scrolled through and another group replaces it. The group mode is very useful for "title" items.

          • +
          +

          A common UI design is to mix the group and tree modes to allows for a tree behavior while keeping the group header item visible.

          +
            +
          • +

            To use the group mode:

            +
              +
            1. +

              Mark some elements as ELM_GENLIST_ITEM_GROUP and use the returned Elm_Object_Item to establish the parent-children relationship when adding the children items.

              +

              Since there are 2 kind of items, create 2 item classes. Give them different styles and callback functions.

              +
              +app->itc = elm_genlist_item_class_new();
              +app->itc->item_style = "default";
              +app->itc->func.text_get = _genlist_text_get_size;
              +app->itc->func.content_get = _genlist_content_get_bg;
              +app->itc->func.state_get = NULL;
              +app->itc->func.del = NULL; 
              +
              +app->itc2 = elm_genlist_item_class_new();
              +app->itc2->item_style = "1text.1icon";
              +app->itc2->func.text_get = _genlist_text_get_nosize;
              +app->itc2->func.content_get = _genlist_content_get_icon;
              +app->itc2->func.state_get = NULL;
              +app->itc2->func.del = NULL; 
              +
              +
            2. +
            3. +

              Add a group header and follow it with 10 children. This is repeated 1000 times.

              +

              The parent has the ELM_GENLIST_ITEM_GROUP type, while the children have the ELM_GENLIST_ITEM_NONE type.

              +

              Note that the value returned by the elm_genlist_item_append() function for a group header is stored and sent to the elm_genlist_item_append() call that adds the children. This creates the parent-child relationship.

              +
              +for (i = 0; i < 1000; i++) 
              +{
              +   it = elm_genlist_item_append(app->list, app->itc2, (void *)(uintptr_t) (10 * i), NULL,
              +                                ELM_GENLIST_ITEM_GROUP, NULL, NULL);
              +   for (j = 0; j < 10; j++)
              +   {
              +      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (10 * i + j), it,
              +                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
              +   }
              +}
              +
              +
            4. +
            +
          • + +
          • To use the tree mode:

            +
              +
            1. +

              Register the callbacks (expand,request, expanded, contract,request, and contracted) using the evas_object_smart_callback_add() function on the genlist object:

              +
              +evas_object_smart_callback_add(app->list, "expand,request",
              +                               _tree_item_expand_request, NULL);
              +evas_object_smart_callback_add(app->list, "expanded",
              +                               _tree_item_expanded, NULL);
              +
              +evas_object_smart_callback_add(app->list, "contract,request",
              +                               _tree_item_contract_request, NULL);
              +evas_object_smart_callback_add(app->list, "contracted",
              +                               _tree_item_contracted, NULL);
              +
              + +

              The expand,request and contract,request callbacks do only one thing: decide whether the element is expanded or contracted. This is done by using the elm_genlist_item_expanded_set() function; if it changes the expansion status of the item, the next callback is called (either expanded or contracted, depending on whether it was an expand,request or contract,request event). The following examples show a minimal implementation of these callbacks.

              +
              +static void
              +_tree_item_expand_request(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_item_class_update(it, app->itc2);
              +
              +   elm_genlist_item_expanded_set(it, EINA_TRUE);
              +}
              +
              + +
              +static void
              +_tree_item_contract_request(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_item_class_update(it, app->itc);
              +
              +   elm_genlist_item_expanded_set(it, EINA_FALSE);
              +}
              +
              + + + + + + + + + +
              Note
              The above examples have an extra line: the call to the elm_genlist_item_item_class_update() function. This function changes the item style after the item creation.
              +
            2. +
            3. +

              Expand the list. Once the genlist item status is set to expanded, the expanded event is triggered and it is the duty of a callback for that event to populate the list with the item's children. This relies on the parent parameter of functions (such as elm_genlist_item_append()), similar to the group mode.

              +

              The following function is a callback implementation for the expanded event. It adds items that are built similarly to previous items, the only change is the parent parameter which is not NULL. Conveniently, the parent Elm_Object_Item pointer that is passed to the elm_genlist_item_append() function is given in the event_info callback and needs to be cast.

              +
              +static void
              +_tree_item_expanded(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
              +   int i_parent = (int)(uintptr_t) data;
              +   int i;
              +
              +   for (i = 0; i < 10; i++) 
              +   {
              +      elm_genlist_item_append(app->list, app->itc, (void *)(uintptr_t) (i + i_parent), it_parent,
              +                              ELM_GENLIST_ITEM_NONE, NULL, NULL);
              +   }
              +}
              +
              +
            4. +
            5. +

              Contract the list. The following code has the callback function for the contracted event. It simply calls the elm_genlist_item_subitems_clear() function to clear all children (including their own children if they have any) of the given item. Again, the item that is being contracted is available through the event_info parameter to the callback.

              +
              static void
              +_tree_item_contracted(void *data, Evas_Object *o, void *event_info)
              +{
              +   Elm_Object_Item *it_parent = (Elm_Object_Item*) event_info;
              +
              +   elm_genlist_item_subitems_clear(it_parent);
              +}
              +
              +
            6. +
            +
          • +
          • +

            To mix group and tree modes:

            +
              +
            1. Create an item of the group type, and an item of the tree type whose parent is the group type item.
            2. +
            3. Add the callbacks to populate the children of the tree item in the regular way.
            4. +
            +
          • +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/graphical_objects_n.htm b/org.tizen.ui.practices/html/native/efl/graphical_objects_n.htm new file mode 100644 index 0000000..30474de --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/graphical_objects_n.htm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + Graphical Objects: Managing and Rendering Evas Objects + + + + + +
          + +

          Graphical Objects: Managing and Rendering Evas Objects

          + +

          Evas is a clean display canvas API for several target display systems that can draw anti-aliased text, smooth super and sub-sampled scaled images, alpha-blend objects and much more.

          +

          It abstracts any need to know much about what the characteristics of your display system are, what graphics calls are used to draw them, and how. It deals on an object level where all you do is create and manipulate objects in a canvas and set their properties.

          +

          Evas optimizes the rendering pipeline to minimize effort in redrawing changes made to the canvas and so takes this work out of the programmers hand, saving a lot of time and energy.

          +

          It is designed to work on embedded systems all the way to large and powerful multi-cpu workstations. It can be compiled to only have the features you need for your target platform if you so wish. It has several display back-ends, allowing it display on several display systems, making it portable for cross-device and cross-platform development.

          + +

          Evas is not a UI component set or a UI component toolkit, but it is their base. See Elementary for a toolkit based on Evas, Edje, Ecore and other Enlightenment technologies.

          +

          It is not dependent or aware of main loops, input or output systems. Input must be polled from various sources and fed to Evas. It does not create windows or report windows updates to your system, but draws the pixels and reports to the user the areas that are changed. These operations are ready to be used in Ecore, particularly in Ecore_Evas wrapper/helper set of functions.

          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/guides_efl_n.htm b/org.tizen.ui.practices/html/native/efl/guides_efl_n.htm new file mode 100644 index 0000000..5ec6712 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/guides_efl_n.htm @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + EFL + + + + + + +
          +

          EFL

          + +

          EFL is an open-source UI toolkit that provides a set of libraries that offer useful features to applications. EFL covers a number of areas from UI component sets to data structures. EFL is one of the Tizen native UI modules and is available in various Tizen profiles. In Tizen, EFL is commonly used for UI applications, although you can also use it for non-UI applications.

          + +

          When creating an EFL application, make sure you understand the following main features:

          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/hw_input_n.htm b/org.tizen.ui.practices/html/native/efl/hw_input_n.htm new file mode 100644 index 0000000..89686b1 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/hw_input_n.htm @@ -0,0 +1,64 @@ + + + + + + + + + + + + + Hardware Input Handling: Managing Hardware Events with EFL Extension + + + + + +
          + +

          Hardware Input Handling: Managing Hardware Events with EFL Extension

          + +

          The Tizen platform offers the Menu, Back, and Home keys as physical hardware keys for mobile devices and rotary component parts for wearable devices. You can also utilize the hardware keys in other applications with key grabbing.

          + +

          Basically, EFL does not depend on any specific hardware input methods, such as hardware keys, to generate back and home events, or rotary component parts to generate rotary events. Instead these hardware input events have tightly related to the Tizen UX. As a result, EFL has created the EFL extension library to support common UX behavior between applications and hardware events.

          + +

          When the user presses the Menu or Back key, the key generates a signal with its key property. The Ecore library receives the signal and propagates it to application layers as an event. The EFL extension library consumes the events and handles the views of the application according to key properties. Otherwise, EFL extension manages the rotary events, which are generated from rotary components in wearable devices and delivered to application layers by defining an event callback or a handler function, and registering it.

          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/key_events_mn.htm b/org.tizen.ui.practices/html/native/efl/key_events_mn.htm new file mode 100644 index 0000000..1707301 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/key_events_mn.htm @@ -0,0 +1,178 @@ + + + + + + + + + + + + + Managing Menu and Back Key Events + + + +
          +
          +

          Mobile native

          +
          + +
          +

          Related Info

          + +
          +
          + +
          +

          Managing Menu and Back Key Events

          + +

          The Menu and Back functions are common UX behaviors in applications. Generally, the user taps the Back hardware key to return to the previous screen. The applications usually also provide option menus to manipulate their functions through the tapping of the Menu hardware key.

          + +

          This feature is supported in mobile applications only.

          + +

          Normally, the key events are only delivered to the object in focus. However, with the EFL Extension functions, you can let visible objects without focus get events from the Menu and Back keys.

          + +

          Figure: Menu and Back keys

          +

          Menu and Back keys

          + +

          The EFL Extension maintains its own object stack for determining which object to deliver events to. Only visible objects are added to this stack. The stack is based on the Evas layer. It means that if 2 objects are registered for the same EFL Extension event, the object on the higher Evas layer gets the event.

          + +

          The following figure shows an example of objects and their layers. Objects 1, 2, and 3 are registered with EFL Extension callbacks for the same event, such as a Back key event. When the event occurs, object 3, which is on the highest layer (layer 3), gets the event callback.

          + +

          Figure: Objects with layers

          +

          Objects with layers

          + +

          If objects stay on the same layer, the object which is registered to the callback first gets the event.

          + +

          To register a callback for the Menu or Back key, use the eext_object_event_callback_add() function with the application callback type:

          +
            +
          • EEXT_CALLBACK_BACK: Hardware Back key event
          • +
          • EEXT_CALLBACK_MORE: Hardware Menu key event
          • +
          + +

          To delete a registered event in the EFL Extension, use the eext_object_event_callback_del() function.

          + +

          The EFL Extension also provides other convenient functions to work with the Menu and Back keys for popup, ctxpopup, naviframe, and entry components.

          + +

          Managing Hardware Key Events

          + +

          The application has a window that contains a naviframe and registers the EFL Extension Menu and Back key events for the naviframe.

          +

          When the Menu key is pressed, a popup is created and an EFL Extension Back key event for this popup is registered. If the popup is shown and the Back key is pressed, the popup is removed. Otherwise, if the Back key is pressed and there is no popup, the application is hidden.

          + +

          To manage hardware key events:

          +
            +
          1. +

            To use the functions and data types of the Efl Extension API, include the <efl_extension.h> header file in your application:

            +
            +#include <efl_extension.h>
            +
            +
          2. + +
          3. Create objects using the window and naviframe: +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   Evas_Object *win = NULL;
            +
            +   // Create the window
            +   win = elm_win_util_standard_add(NULL, "extension sample");
            +   evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
            +
            +   // Create the naviframe
            +   Evas_Object *nf = NULL;
            +   nf = elm_naviframe_add(win);
            +   evas_object_size_hint_weight_set(win, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(win, nf);
            +   evas_object_show(nf);
            +
            +   // Content
            +   Evas_Object *label = NULL;
            +   label = elm_label_add(nf);
            +   elm_object_text_set(label, "Press menu key to show popup,<br/>back key to exit.");
            +   elm_naviframe_item_push(nf, "Efl Extension usage", NULL, NULL, label, NULL);
            +
            +   // Show the window
            +   evas_object_show(win);
            +}
            +
            +
          4. + +
          5. Register EFL Extension callbacks for the naviframe: +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   // Register the EFL extension callbacks for Menu and Back key events
            +   eext_object_event_callback_add(nf, EEXT_CALLBACK_MORE, _create_popup, NULL);
            +   eext_object_event_callback_add(nf, EEXT_CALLBACK_BACK, _nf_back_cb, win);
            +}
            +
            +
          6. + +
          7. Create a popup and register EFL Extension Back key event callbacks for it: +
            +static void
            +_create_popup(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *parent = obj;
            +
            +   Evas_Object *popup = NULL, *content = NULL;
            +   popup = elm_popup_add(parent);
            +   elm_object_part_text_set(popup, "title,text", "Title");
            +   elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
            +
            +   // Popup content
            +   content = elm_label_add(parent);
            +   elm_object_text_set(content, "Press back key to remove popup.");
            +   elm_object_content_set(popup, content);
            +
            +   // Register the EFL extension callback for the Back key event
            +   eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            +   evas_object_show(popup);
            +}
            +
            + +

            To remove the popup when a Back key event occurs, use the eext_popup_back_cb callback.

            + +

            The callback function for menu key callback:

            +
            +static void
            +_nf_back_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   Evas_Object *win = data;
            +
            +   // Hide the window
            +   elm_win_lower(win);
            +}
            +
            +
          8. +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/key_events_n.htm b/org.tizen.ui.practices/html/native/efl/key_events_n.htm old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/native/efl/key_events_n.htm rename to org.tizen.ui.practices/html/native/efl/key_events_n.htm diff --git a/org.tizen.ui.practices/html/native/efl/key_grab_n.htm b/org.tizen.ui.practices/html/native/efl/key_grab_n.htm new file mode 100644 index 0000000..fcca868 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/key_grab_n.htm @@ -0,0 +1,699 @@ + + + + + + + + + + + + + Grabbing Hardware Key Events + + + + + +
          + +

          Grabbing Hardware Key Events

          + +

          The applications do not normally grab hardware key events, because each key event is delivered to the focused window by default. Some applications, however, have more advanced functionalities and behavior. For example, a memo application can use the volume key to resize the text. However, in most cases, if the volume keys are pressed, a volume control popup opens. To receive special hardware key events in the application, use the eext_win_keygrab_set() and eext_win_keygrab_unset() functions.

          + +

          To grab hardware key events:

          +
            +
          1. To use the functions and data types of the EFL Extension API (in mobile and wearable applications), include the <efl_extension.h> header in your application: +
            +#include <efl_extension.h>
            +
            +
          2. + +
          3. Create the objects using the window. For more information, see UI Containers. +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   Evas_Object *win = NULL;
            +
            +   // Create the window
            +   win = elm_win_util_standard_add(NULL, "extension sample");
            +   evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
            +
            +   // Show the window
            +   evas_object_show(win);
            +}
            +
            +
          4. + +
          5. Register the key event callbacks for the window. For more information, see Ecore Events. +
            +Eina_Bool ctrl_pressed = EINA_FALSE;
            +
            +static Eina_Bool
            +_key_down_cb(void *data __UNUSED__, int type __UNUSED__, void *ev)
            +{
            +   // The callback is used with the ECORE_EVENT_KEY_DOWN signal: the
            +   // parameter "void *ev" is therefore of the actual Ecore_Event_Key type
            +   // The following renders its fields accessible
            +   Ecore_Event_Key *event = ev;
            +
            +   // Test whether the key that is pressed is Ctrl
            +   if (!strcmp("Control_L", event->key))
            +   {
            +      // If it is, store that piece of information
            +      ctrl_pressed = EINA_TRUE;
            +   }
            +
            +   // Let the event continue to other callbacks which have not been called yet
            +   return ECORE_CALLBACK_PASS_ON;
            +}
            +
            +ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
            +
            +
          6. + +
          7. Grab the key events using the eext_win_keygrab_set() function. The parameters are the window object created in step 2 above, and the key string. +
            +eext_win_keygrab_set(win, "XF86AudioRaiseVolume")
            +
            +
          8. + +
          9. When the application no longer needs to grab the key events, use the eext_win_keygrab_unset() function to ungrab them: +
            +eext_win_keygrab_unset(win, "XF86AudioRaiseVolume")
            +
            +
          10. +
          + +

          The following table lists the hardware keys from which you can grab events in different profiles.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Supported hardware keys +
          KeyDescriptionMobileWearableTV
          "XF86AudioRaiseVolume"Key to raise the volumeYesYesYes
          "XF86AudioLowerVolume"Key to lower the volumeYesYesYes
          "XF86PowerOff"Power key to switch the device on and offYesYesYes
          "XF86Menu"Application-specific menu keyYesYesYes
          "XF86Home"Key to go to the home screenYesYesYes
          "XF86Back"Key to go back to the previous status or pageYesYesYes
          "XF86Camera"Half shutter key to do something before taking a picture on the cameraYes--
          "XF86Camera_Full"Key to take a picture on the cameraYesYesYes
          "XF86Search"Key to go to the search applicationYesYesYes
          "XF86AudioPlay"Key to play mediaYesYesYes
          "XF86AudioPause"Key to pause the media being playedYesYesYes
          "XF86AudioStop"Key to stop the media being playedYesYesYes
          "XF86AudioNext"Key to go to the next media itemYesYesYes
          "XF86AudioPrev"Key to go to the previous media itemYesYesYes
          "XF86AudioRewind"Key to rewind the playing position of the mediaYesYesYes
          "XF86AudioForward"Key to forward the playing position of the mediaYesYesYes
          "XF86AudioMedia"Key to go to the media playerYesYesYes
          "XF86AudioPlayPause"Key to toggle between play and pauseYesYesYes
          "XF86AudioMute"Key to mute the mediaYesYesYes
          "XF86AudioRecord"Key to start recording mediaYesYesYes
          "Cancel"Key to cancel the action triggered by the previous keysYesYesYes
          "XF86SoftKBD"Key to show and hide the soft keyboardYesYesYes
          "XF86QuickPanel"Key to toggle the quick panelYes-Yes
          "XF86TaskPane"Key to toggle the task switcherYesYesYes
          "XF86HomePage"Key to go to the homepage of the user-defined Web browserYes-Yes
          "XF86WWW"Key to launch the user-defined Web browserYes-Yes
          "XF86Mail"Key to go to the user-defined email applicationYes-Yes
          "XF86ScreenSaver"Key to activate the screen lock (such as a pattern lock or a PIN lock)YesYesYes
          "XF86MonBrightnessDown"Key to lower the screen brightnessYesYesYes
          "XF86MonBrightnessUp"Key to raise the screen brightnessYesYesYes
          "XF86Voice"Key to activate a voice-related applicationYesYesYes
          "Hangul"Key to toggle the current languageYes-Yes
          "XF86Apps"Key to call the application holder applicationYesYesYes
          "XF86Call"Key to launch the call applicationYesYesYes
          "XF86Game"Key to go to the game applicationYes-Yes
          "XF86VoiceWakeUp_LPSD"Key to wake up from voice input (LPSD)YesYesYes
          "XF86VoiceWakeUp"Key to wake up from voice inputYesYesYes
          "XF86TV"Key to display the TV screen directly--Yes
          "XF86Display"Key to toggle the video source --Yes
          "XF86RCConfig"Key to set the remote control's specific configuration--Yes
          "XF86RCMode"Key to show and hide the virtual remote control on the screen--Yes
          "1"Numeric key 1 on the remote control--Yes
          "2"Numeric key 2 on the remote control--Yes
          "3"Numeric key 3 on the remote control--Yes
          "4"Numeric key 4 on the remote control--Yes
          "5"Numeric key 5 on the remote control--Yes
          "6"Numeric key 6 on the remote control--Yes
          "7"Numeric key 7 on the remote control--Yes
          "8"Numeric key 8 on the remote control--Yes
          "9"Numeric key 9 on the remote control--Yes
          "0"Numeric key 0 on the remote control--Yes
          "-"Minus key on the remote control--Yes
          "XF86LowerChannel"Key to lower the channel number--Yes
          "XF86RaiseChannel"Key to raise the channel number--Yes
          "XF86ChannelList"Key to display the channel list--Yes
          "XF86PreviousChannel"Key to display the previous channel--Yes
          "XF86SysMenu"Key to launch the system menu--Yes
          "XF86SimpleMenu"Key to launch the simple menu--Yes
          "XF86History"Key to launch the history functionality--Yes
          "XF86Favorites"Key to launch the favorite channels functionality--Yes
          "Up"Arrow key UP on the remote control--Yes
          "Down"Arrow key DOWN on the remote control--Yes
          "Left"Arrow key LEFT on the remote control--Yes
          "Right"Arrow key RIGHT on the remote control--Yes
          "Return"OK key on the remote control to confirm or select an item--Yes
          "XF86Close"Exit key on the remote control to terminate the current menu or application--Yes
          "XF86Info"Key to display the basic and auxiliary information on the screen--Yes
          "XF86Red"Key to execute the functionality registered to the RED key--Yes
          "XF86Green"Key to execute the functionality registered to the GREEN key--Yes
          "XF86Yellow"Key to execute the functionality registered to the YELLOW key--Yes
          "XF86Blue"Key to execute the functionality registered to the BLUE key--Yes
          "XF86ProgInfo"Key to display the program information--Yes
          "XF86PictureMode"Key to change the screen mode--Yes
          "XF86PictureSize"Key to change the screen size and aspect ratio--Yes
          "XF86PIP"Key to set the PIP (Picture-In-Picture) mode to display one screen on the other--Yes
          "XF86Guide"Key to display the user guide--Yes
          "XF86AudioMode"Key to set or change the audio mode--Yes
          "XF86Subtitle"Key to display or hide the subtitles--Yes
          "XF863D"Key to set or change the 3D mode--Yes
          + + + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/layout_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/layout_tutorial_n.htm new file mode 100644 index 0000000..775e358 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/layout_tutorial_n.htm @@ -0,0 +1,782 @@ + + + + + + + + + + + + + + Creating UI Screen Layouts + + + + + + +
          + +

          Creating UI Screen Layouts

          + + +

          This tutorial demonstrates how you can compose a UI screen layout using the layout classes available in the EFL UI component library. It also highlights the capabilities of the EFL layout classes in free style layouting as well as layouting in a particular sequence (such as linear or grid).

          + + +

          Creating the UI Layout

          + +

          The sample application uses UI components, such as elm_naviframe and elm_toolbar for the view management, layout classes, such as elm_table, elm_box, and elm_grid for the composition of the screen, and UI components, such as elm_label and elm_image for the content inside the view.

          + +

          To create the UI layout:

          +
            +
          1. +

            Create the application layout with the create_base_gui() function:

            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   Elm_Object_Item *nf_it, *tabbar_it;
            +   // Window
            +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
            +
            +
          2. +
          3. +

            Add the elm_conformant component to the application to decorate the window with an indicator:

            +
            +   // Conformant
            +   ad->conform = elm_conformant_add(ad->win);
            +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(ad->win, ad->conform);
            +   evas_object_show(ad->conform);
            +
            +
          4. +
          5. +

            Add the elm_naviframe component to act as a view manager for the window and provide the window title functionality:

            +
            +   // Naviframe
            +   ad->nf = elm_naviframe_add(ad->conform);
            +   elm_object_content_set(ad->conform, ad->nf);
            +   evas_object_show(ad->nf);
            +   nf_it = elm_naviframe_item_push(ad->nf, "UiLayout", NULL, NULL, NULL, "tabbar/icon/notitle");
            +
            +   // Tabbar
            +   ad->tabbar = create_toolbar(ad);
            +   elm_object_item_part_content_set(nf_it, "tabbar", ad->tabbar);
            +
            +   // Set the first view
            +   tabbar_it = elm_toolbar_first_item_get(ad->tabbar);
            +   elm_toolbar_item_selected_set(tabbar_it, EINA_TRUE);
            +
            +   // Show the window after the base GUI is set up
            +   evas_object_show(ad->win);
            +
            +   ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, keydown_cb, NULL);
            +}
            +
            +
          6. +
          7. +

            Add the toolbar to the naviframe using the create_toolbar() function:

            +
            +static Evas_Object*
            +create_toolbar(appdata_s *ad)
            +{
            +   Evas_Object *tabbar;
            +
            +   tabbar = elm_toolbar_add(ad->nf);
            +   elm_object_style_set(tabbar, "tabbar");
            +   elm_toolbar_shrink_mode_set(tabbar, ELM_TOOLBAR_SHRINK_EXPAND);
            +   elm_toolbar_transverse_expanded_set(tabbar, EINA_TRUE);
            +
            +   elm_toolbar_item_append(tabbar, NULL, "Box", tabbar_item_cb, ad);
            +   elm_toolbar_item_append(tabbar, NULL, "Grid", tabbar_item_cb, ad);
            +   elm_toolbar_item_append(tabbar, NULL, "Table", tabbar_item_cb, ad);
            +
            +   return tabbar;
            +}
            +
            + +

            The following figure illustrates the UI Layout.

            + +

            Figure: UI Layout screen

            +

            UI Layout screen

            +
          8. +
          + +

          Adding Content to the Screen

          + +

          To add content to the screen:

          +
            +
          1. +

            Compose a box layout using a recursive composition with the create_box_view() function:

            +
            +static Evas_Object*
            +create_box_view(Evas_Object *parent)
            +{
            +   Evas_Object *box, *box1, *box2, *box3;
            +
            +   box = elm_box_add(parent);
            +   elm_box_padding_set(box, 10, 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);
            +
            +   box1 = elm_box_add(box);
            +   elm_box_horizontal_set(box1, EINA_TRUE);
            +   elm_box_padding_set(box1, 8, 8);
            +   evas_object_size_hint_weight_set(box1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(box1, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_show(box1);
            +
            +   box2 = elm_box_add(box);
            +   elm_box_padding_set(box2, 6, 6);
            +   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);
            +
            +   box3 = elm_box_add(box);
            +   elm_box_padding_set(box3, 5, 5);
            +   evas_object_size_hint_weight_set(box3, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(box3, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   elm_box_homogeneous_set(box3, EINA_FALSE);
            +   evas_object_show(box3);
            +} 
            +
            +
          2. +
          3. +

            Add content or another box layout to the box.

            +
            +// Add an item to the box
            +Evas_Object *item1 = create_content(box, "Item 1");
            +evas_object_size_hint_min_set(item1, 0, 40);
            +elm_box_pack_end(box, item1);
            +elm_box_pack_end(box, box1);
            +elm_box_pack_end(box, box3);
            +elm_box_pack_end(box, create_content(box, "Item 4"));
            +
            +// Add an item to the box1
            +elm_box_pack_end(box1, create_content(box1, "Item 2.1"));
            +elm_box_pack_end(box1, box2);
            +elm_box_pack_end(box1, create_content(box1, "Item 2.3"));
            +
            +// Add an item to the box2
            +elm_box_pack_end(box2, create_content(box2, "Item 2.2.1"));
            +elm_box_pack_end(box2, create_content(box2, "Item 2.2.2"));
            +
            +// Add an item to the box3
            +elm_box_pack_end(box3, create_content(box3, "Item 3.1"));
            +elm_box_pack_end(box3, create_content(box3, "Item 3.2"));
            +
            +

            The box layout implements the size policy during the size calculation.

            +
          4. +
          5. +

            Compose a table layout with a content and grid view with the create_table_view() function:

            +
            +static Evas_Object*
            +create_table_view(Evas_Object *parent)
            +{
            +   Evas_Object *table, *item;
            +
            +   table = elm_table_add(parent);
            +   elm_table_padding_set(table, 10, 10);
            +   elm_table_homogeneous_set(table, EINA_TRUE);
            +   evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +
            +   item = create_content(table, "Item 1");
            +   elm_table_pack(table, item, 0, 0, 2, 1);
            +
            +   item = create_content(table, "Item 2");
            +   elm_table_pack(table, item, 2, 0, 1, 1);
            +
            +   item = create_content(table, "Item 3");
            +   elm_table_pack(table, item, 0, 1, 3, 1);
            +
            +   // Add a grid view item
            +   item = create_grid_view(table);
            +   evas_object_show(item);
            +   elm_table_pack(table, item, 0, 2, 3, 10);
            +
            +   return table;
            +}
            +
            +

            The table layout can be used for freestyle layouting, and for standard layouts, such as lists and grids. It does not consider the size policy of the child item during size calculation.

            +
          6. +
          7. +

            Compose a grid layout with the create_grid_view() function, and also use the box and table layouts as child items to pack inside a grid.

            + +
            +static Evas_Object*
            +create_grid_view(Evas_Object *parent)
            +{
            +   Evas_Object *grid, *item;
            +
            +   grid = elm_grid_add(parent);
            +   evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +
            +   // Red background for the grid
            +   item = create_bg(grid, 255, 0, 0);
            +   elm_grid_pack(grid, item, 0, 0, 100, 100);
            +
            +   // Add the item to the grid
            +   item = create_content(grid, "Item1");
            +   elm_grid_pack(grid, item, 1, 1, 98, 98);
            +
            +   item = create_content(grid, "Item2");
            +   elm_grid_pack(grid, item, 2, 5, 20, 20);
            +
            +   item = create_content(grid, "Item3");
            +   elm_grid_pack(grid, item, 23, 5, 76, 94);
            +
            +   item = create_content(grid, "Item4");
            +   elm_grid_pack(grid, item, 2, 27, 20, 70);
            +
            +   // Black background for the box view item
            +   item = create_bg(grid, 40, 40, 40);
            +   elm_grid_pack(grid, item, 25, 10, 73, 87);
            +
            +   // Add the box view item to the grid
            +   item = create_box_view(grid);
            +   evas_object_show(item);
            +   elm_grid_pack(grid, item, 26, 11, 71, 85);
            +
            +   return grid;
            +}
            +
            +

            The grid layout uses free style layouting, and during size evaluation of the child item, it does not take the size policy of the child item into consideration.

            +
          8. +
          + +

          Using the Base Layout

          + +

          When developing a Tizen native application, it is recommended that you base your application layout on the base layout. The base layout supports the indicator and view management. The following figure shows the wireframe and UI component hierarchy of the base layout:

          + +

          Figure: Base layout wireframe and UI component hierarchy

          +

          Base layout wireframe and UI component hierarchy

          + +

          The UI components have the following roles:

          + +
            +
          • Window (Elm_win): Every UI component from Elementary is rendered in a window.
          • +
          • Conformant (Elm_Conformant): Conformant supports the indicator area and resizing the application due to rotation or the ISF (keypad).
          • +
          • Naviframe (Elm_Naviframe): Naviframe acts as a view manager and optionally provides the application title. The main layout of the application is added to the naviframe's view area.
          • +
          + + +

          Sample Setting Application with the Base Layout

          + +

          The mobile Setting application consists of a list to show as a menu. To organize the application, create the application layout with a screen-size list and place the layout into the naviframe's view area.

          + +

          Figure: Setting UI and layout

          +

          Settings UI and layout

          + +

          Sample Application Store Application with the Base Layout

          + +

          To organize the mobile Application Store application, add a scroller to the base layout, since the total height of the layout is greater than the screen size, and you therefore need to scroll the screen content up and down. If the layout is larger than the screen, the scroller makes the view itself scrollable.

          + +

          You can use a list or grid if the same objects are shown repeatedly. In this sample application, however, the various items are shown in a layout.

          + +

          Figure: Application Store UI and layout

          +

          Application Store UI and layout

          + +

          Sample Calculator Application with a Customized Layout

          + +

          The mobile Calculator is a good example of an exception to the base layout. The application has no view changes and no application title. As these are the 2 reasons why you must use a Naviframe, you do not need to add a naviframe to the Calculator.

          + +

          You can organize the application layout with container components. Container components are used for arranging UI components, both basic UI components and other container components.

          + +

          Figure: Calculator UI and layout

          +

          Calculator UI and layout

          + + +

          Sample Email Application with a Customized Layout

          + +

          The mobile Email application shows information using a list. The main view is the same as in the Setting application, consisting of a screen-size list for displaying emails. However, the Email application has an additional feature called drawer, which is used for displaying the menu with a hierarchy.

          + +

          To develop the application as a Tizen native application, add a layout on the conformant, and add a naviframe to the layout. This layout has a content area for the drawer and naviframe, and its style name is "layout/drawer/panel". To use this layout, use the following code:

          + +
          +layout = elm_layout_add(parent);
          +elm_layout_theme_set(layout, "layout", "drawer", "panel");
          +
          + +

          The style includes parts for locating the drawer and the main view. In the drawer area, you can add a list to indicate the menu. In the main view, you can add a naviframe to organize the view of the layout.

          + +

          Figure: Email UI and layout

          +

          Email UI and layout

          + + +

          Creating a Simple Clock View

          + +

          The following sample creates a basic clock view that shows the time, current city, and date. This sample demonstrates how to use a box (container component) and label to create a basic layout. The application includes the following UI components:

          + +
            +
          • Elm_window: Basic canvas for rendering the screen
          • +
          • Elm_conformant: Support for the indicator area
          • +
          • Elm_naviframe: View manager component
          • +
          • Elm_box: Container component for layouting other UI components
          • +
          • Elm_label: Basic UI component for showing text with a tag
          • +
          + +

          The following figure illustrates the main view of the simple clock application and its wireframe structure.

          + +

          Figure: Simple clock screen

          +

          Simple clock screen

          + +

          To create a simple clock view:

          +
            +
          1. +

            Implement the data structure for the application in the world_clock.c file:

            +
            +typedef struct appdata
            +{
            +   // Save the window
            +   Evas_Object *win;
            +} 
            +appdata_s;
            +
            + +

            The information in appdata is used for the entire system. In this sample application, the information is related to handling the hardware back key.

            +
          2. +
          3. +

            Create the basic UI with the app_create() function:

            +
            +int
            +main(int argc, char *argv[])
            +{
            +   appdata_s *ad = {0,};
            +   app_event_callback_s event_callback = {0,};
            +   int ret = 0;
            +
            +   event_callback.create = app_create;
            +   event_callback.terminate = app_terminate;
            +   event_callback.pause = app_pause;
            +   event_callback.resume = app_resume;
            +   event_callback.app_control = app_control;
            +
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
            +   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
            +
            +   ret = ui_app_main(argc, argv, &event_callback, &ad);
            +   if (ret != APP_ERROR_NONE) 
            +   {
            +      dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret);
            +   }
            +
            +   return ret;
            +}
            +
            +static bool
            +app_create(void *data)
            +{
            +   appdata_s *ad = data;
            +   create_base_gui(ad);
            +
            +   return true;
            +}
            +
            +
          4. +
          5. +

            Use the create_base_gui() function to create a basic layout with a window, conformant, and naviframe. This is the basic layout in the Tizen mobile environment.

            +
            +// Window
            +ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +// Conformant
            +conform = elm_conformant_add(ad->win);
            +elm_win_conformant_set(ad->win, EINA_TRUE);
            +evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_win_resize_object_add(ad->win, conform);
            +evas_object_show(conform);
            +
            +// Naviframe
            +nf = elm_naviframe_add(conform);
            +elm_object_content_set(conform, nf);
            +evas_object_show(nf);
            +
            +
          6. +
          7. +

            Create the main layout for the application. In this sample, it contains a box with 3 labels. The labels show the time, city, and date.

            +

            Set the text to the labels. You can set or decorate the text in the labels using the elm_object_text_set() function. You can modify the text size, color and thickness with the <font_size>, <color>, and <b> elements. To add the labels to the box, use the elm_box_pack_end() function.

            +
            +// Add the box
            +box = elm_box_add(nf);
            +// Create a label
            +label1 = elm_label_add(box);
            +// Set text to the label with a tag
            +elm_object_text_set(label1, "<font_size=110><color=#000000>07:26</color></font_size>");
            +// Add the label to the box
            +elm_box_pack_end(box, label1);
            +// Change label visibility
            +evas_object_show(label1);
            +
            +// Repeat with other labels
            +
            +evas_object_show(box);
            +
            +
          8. +
          9. +

            Set the box as a new view. You can also set the title of the application. These operations are handled by the naviframe using the elm_naviframe_item_push() function. The parameters include the title, the name of the UI component added as a new view, and the naviframe style. The basic style is used for a simple view with a normal title.

            +
            +elm_naviframe_item_push(nf, _("World Clock"), NULL, NULL, box, "basic");
            +
            + +

            The following figure illustrates the UI component hierarchy of the application.

            + +

            Figure: Simple clock components

            +

            Simple clock components

            +
          10. +
          11. +

            Set the hardware key handler. The Tizen mobile environment supports multiple hardware keys, but only the back key is handled in this sample.

            +
            +eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
            +
            + +

            After setting the callback function, the win_back_cb callback is invokes when a back key is pressed. The win_back_cb() callback hides the window.

            +
            +static void
            +win_back_cb(void *data , int type , void *event)
            +{
            +   appdata_s *ad = data;
            +   elm_win_lower(ad->win);
            +}
            +
            +
          12. +
          + +

          Creating a Complex Clock View

          + +

          The following sample creates a complex clock view. The sample demonstrates how to organize a basic layout using boxes. The application includes the following UI components:

          + + +
            +
          • Elm_window: Basic canvas for rendering the screen
          • +
          • Elm_conformant: Support for the indicator area
          • +
          • Elm_naviframe: View manager component
          • +
          • Elm_box: Container component for layouting other UI components
          • +
          • Elm_label: Basic UI component for showing text with a tag
          • +
          • Elm_genlist: List component
          • +
          • Elm_button: Simple push button
          • +
          + +

          The following figure illustrates the main view of the complex clock sample application and its wireframe structure.

          + +

          Figure: Complex clock screen

          +

          Complex clock screen

          + +

          To create a complex clock view:

          +
            +
          1. +

            Implement the data structure for the basic UI in the world_clock.c file:

            +
            +typedef struct appdata
            +{
            +   // Save the window
            +   Evas_Object *win;
            +} 
            +appdata_s;
            +
            + +

            The information in appdata is used for the entire system. In this sample application, the information is related to handling the hardware back key.

            +
          2. +
          3. +

            Create the base UI for the application with the app_create() function:

            + +
            int
            +main(int argc, char *argv[])
            +{
            +   appdata_s *ad = {0,};
            +   app_event_callback_s event_callback = {0,};
            +   int ret = 0;
            +
            +   event_callback.create = app_create;
            +   event_callback.terminate = app_terminate;
            +   event_callback.pause = app_pause;
            +   event_callback.resume = app_resume;
            +   event_callback.app_control = app_control;
            +
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
            +   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
            +   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
            +
            +   ret = ui_app_main(argc, argv, &event_callback, &ad);
            +   if (ret != APP_ERROR_NONE) 
            +   {
            +      dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main() is failed. err = %d", ret);
            +   }
            +
            +   return ret;
            +}
            +
            +static bool
            +app_create(void *data)
            +{
            +   appdata_s *ad = data;
            +   create_base_gui(ad);
            +
            +   return true;
            +}
            +
            + +

            The base UI of the application contains the clock, list, and main layout with buttons.

            +
          4. +
          5. +

            Create the clock element. The clock element contains 3 labels. The labels are packed as a single box component, which is part of the main layout.

            +
            +static Evas_Object *
            +create_clock(Evas_Object *nf)
            +{
            +   Evas_Object *box, *label1, *label2, *label3;
            +
            +   // Box
            +   box = elm_box_add(nf);
            +
            +   label1 = elm_label_add(box);
            +   elm_object_text_set(label1, "<font_size=110><color=#000000>07:26</color></font_size>");
            +   elm_box_pack_end(box, label1);
            +   evas_object_show(label1);
            +
            +   evas_object_show(box);
            +
            +   return box;
            +}
            +
            +
          6. +
          7. +

            Create the list element. This element contains a list of cities. The UI component used is genlist, which is a complex list able to show information with various styles.

            +
            +static Evas_Object *
            +create_list(Evas_Object *nf)
            +{
            +   Evas_Object* list;
            +   Elm_Genlist_Item_Class *itc = NULL;
            +   int i, num_of_item;
            +   Elm_Object_Item *it;
            +
            +   list = elm_genlist_add(nf);
            +}
            +
            +
          8. +
          9. +

            Add a new item class using the Elm_Genlist_Item_Class class. After adding a new class, set a callback function to detect when the item is rendered.

            +
            +itc = elm_genlist_item_class_new();
            +itc->item_style = "2line.top.4";
            +itc->func.text_get = gl_text_get_cb;
            +itc->func.content_get = NULL;
            +itc->func.del = NULL;
            +
            +

            In this application, all the list items are similar and use the same gl_text_get_cb() callback function for setting text, so only 1 item class is created:

            +
            static char*
            +gl_text_get_cb(void *data, Evas_Object *obj, const char *part)
            +{
            +   item_data_s *id = data;
            +   char buf[1024];
            +
            +   if (id->index == 0) 
            +   {
            +      if (!strcmp(part, "elm.text.main.left.top")) 
            +      {
            +         snprintf(buf, 1023, "%s", "07:26");
            +
            +         return strdup(buf);
            +      }
            +      else if (!strcmp(part, "elm.text.sub.right.top")) 
            +      {
            +         snprintf(buf, 1023, "%s", "Cardiff");
            +
            +         return strdup(buf);
            +      }
            +      else if (!strcmp(part, "elm.text.sub.left.bottom")) 
            +      {
            +         snprintf(buf, 1023, "%s", "Wen, Jan 1");
            +
            +         return strdup(buf);
            +      }
            +      else if (!strcmp(part, "elm.text.sub.right.bottom")) 
            +      {
            +         snprintf(buf, 1023, "%s", "wales");
            +
            +         return strdup(buf);
            +      }
            +   }
            +
            +   return NULL;
            +}
            +
            +
          10. +
          11. +

            Append items to the list using the elm_genlist_item_append() function. In this application, 3 items are added:

            +
            +num_of_item = 3;
            +
            +for (i = 0; i < num_of_item; i++) 
            +{
            +   item_data_s *id = calloc(sizeof(item_data_s), 1);
            +   id->index = i;
            +   it = elm_genlist_item_append(list,
            +                                itc,
            +                                id,
            +                                NULL,
            +                                ELM_GENLIST_ITEM_NONE,
            +                                NULL,
            +                                id);
            +   id->item = it;
            +}
            +
            +
          12. +
          13. +

            Create the main layout. In the main layout, the other layout elements are merged together and a button is added.

            +
            +static void
            +create_base_gui(appdata_s *ad)
            +{
            +   Evas_Object *conform, *nf, *box, *clock, *layout, *rect, *button;
            +   // Window
            +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
            +   elm_win_autodel_set(ad->win, EINA_TRUE);
            +
            +   // Conformant
            +   conform = elm_conformant_add(ad->win);
            +   elm_win_conformant_set(ad->win, EINA_TRUE);
            +   evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_win_resize_object_add(ad->win, conform);
            +   evas_object_show(conform);
            +
            +   // Naviframe
            +   nf = elm_naviframe_add(conform);
            +   elm_object_content_set(conform, nf);
            +   evas_object_show(nf);
            +
            +
          14. +
          15. +

            Add a box component. The box component is used to organize the main layout. The box is expanded as much as possible to fill the entire view.

            +
            +   // Box
            +   box = elm_box_add(nf);
            +   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);
            +
            + +

            The box contains the following elements:

            + +
              + +
            • The clock element contains 3 labels. The parameter for the evas_object_size_hint_weight_set() function is 0.1 meaning that the height of the clock box occupies 30% of the available area.

              +
              +   clock = create_clock(nf);
              +   evas_object_size_hint_weight_set(clock, EVAS_HINT_EXPAND, 0.3);
              +   evas_object_size_hint_align_set(clock, EVAS_HINT_FILL, EVAS_HINT_FILL);
              +   elm_box_pack_end(box, clock);
              +
              +
            • + +
            • The list element is packed into the box. As the genlist elements do not have a determined size, their size depends on the layout parameter.

              +
              +   layout = elm_layout_add(box);
              +   elm_layout_theme_set(layout, "layout", "application", "default");
              +   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);
              +   rect = create_list(nf);
              +   elm_layout_content_set(layout, "elm.swallow.content", rect);
              +   evas_object_show(rect);
              +   evas_object_show(layout);
              +   elm_box_pack_end(box, layout);
              +
              +
            • + +
            • The button element has a callback function to detect when the button is clicked.

              +
              +   button = elm_button_add(box);
              +   evas_object_smart_callback_add(button, "clicked", btn_clicked_cb, NULL);
              +   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 0.1);
              +   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
              +   elm_object_text_set(button, "Terminate");
              +   evas_object_show(button);
              +   elm_box_pack_end(box, button);
              +}
              +
              +
            • +
            + +

            The following figure illustrates the UI component hierarchy of the application.

            + +

            Figure: Complex clock components

            +

            Complex clock components

            +
          16. +
          17. +

            Set the hardware key handler:

            +
            +eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
            +
            + +

            After setting the callback function, the win_back_cb() callback is invokes when a back key is pressed. The win_back_cb() callback hides the window.

            +
            +static void
            +win_back_cb(void *data , int type , void *event)
            +{
            +   appdata_s *ad = data;
            +   elm_win_lower(ad->win);
            +}
            +
            +
          18. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/main_loop_n.htm b/org.tizen.ui.practices/html/native/efl/main_loop_n.htm new file mode 100644 index 0000000..07ce510 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/main_loop_n.htm @@ -0,0 +1,409 @@ + + + + + + + + + + + + + Handling the Main Loop + + + + + +
          + +

          Handling the Main Loop

          + +

          The EFL is event-driven. This means that the application polls for data, and listens for events to interact with it.

          + +

          The Ecore library provides the main loop abstraction. It gets data when data is available and sends the events so that costly polling threads are not needed. Ecore manages polling, timers, events, and file descriptors. When there is no ongoing event, the main loop automatically enters an idle mode, minimizing the power consumption. The loop wakes up when needed.

          + +

          Starting the Main Loop

          + +

          To start the Ecore main loop and move your application into the running state, call the ui_app_main() function. The Ecore main loop handles all general events, such as touch, mouse, key, and network events.

          + +
          +int
          +main(int argc, char *argv[])
          +{
          +   ret = ui_app_main(argc, argv, &event_callback, &ad);
          +
          +   return ret;
          +}
          +
          + +

          When your application is running:

          +
          1. Create a window and organize the UI components inside the window.
          2. +
          3. Create the application logic code to be called when callbacks or timed events occurs (for example, animators for animations and timers for timeouts).
          + + +

          Timers

          + +

          Ecore provides timers, which schedule events that are executed later at a specific time. The event can occur once or several times at specific intervals.

          + +

          A timer callback prototype looks like the my_timed_cb() callback function. This function receives data from the application, and returns a Boolean value to specify whether it is called again or completed. The following macros are also provided:

          + +
            +
          • ECORE_CALLBACK_RENEW: the function is called again after the timeout.
          • +
          • ECORE_CALLBACK_CANCEL: the function is not called again, Ecore destroys automatically everything associated with the timer.
          • +
          + +

          To create and destroy a timer:

          + +
            +
          • To create a timer, use the ecore_timer_add() function. The interval, specified in seconds, indicates when the given function is called, and receives the specified data as a parameter. It returns an Ecore_Timer object. +

            In the following example, the my_timed_cb() function is run after 2 seconds and it receives my_data. It is renewed while its count variable value is under 5, and stops after that.

            +
            +Eina_Bool my_timed_cb(void *data)
            +{
            +   static int count = 0;
            +   count++;
            +
            +   if (count < 5) 
            +      return ECORE_CALLBACK_RENEW;
            +
            +   return ECORE_CALLBACK_CANCEL;
            +}
            +ecore_timer_add(2.0, my_timed_cb, my_data);
            +
            +
          • + +
          • To delete the timer, use the ecore_timer_del() function. The timer to delete must still be running, that is, it has not returned a false value. If the timer is not running, the function cannot be called.
          • +
          + +

          To manage a timer:

          +
            +
          • To change the timer's interval, use the ecore_timer_interval_set() function. The interval is specified in seconds. If set during a timer call, this affects the next interval. Use the ecore_timer_interval_get() function to get the timer's current interval.
          • + +
          • To get the timer's pending time, use the ecore_timer_pending_get() function.
          • + +
          • To delay the timer's next occurrence, use the ecore_timer_delay() function. The function adds the specified time to the current interval. It does not change the future occurrences' interval. You can also reset the current interval to its full value by using the ecore_timer_reset() function.
          • + +
          • To pause the currently running timer, use the ecore_timer_freeze() function. The remaining time is saved and used again when the timer is resumed with the ecore_timer_thaw() function.
          • + +
          • To query the current value of the defined timer infrastructure precision, use the ecore_timer_precision_get() function. A higher delay means that more timers can be run together. It diminishes the need to use system wake-ups and thus lowers the power consumption. +

            To set the precision, use the ecore_timer_precision_set() function. This sets the precision for all timers. For example, there are 2 timers, one that expires in 2.0 seconds and another that expires in 2.1 seconds. If the precision is set to 0.1 seconds, Ecore requests the next expiration to happen in 2.1 seconds and runs both callbacks at once, instead of one at 2.0 seconds and the other one 0.1 seconds later. However, if there is no timer expiring in 2.1 seconds, the timeout is at the minimum interval, 2 seconds.

          • +
          + +

          Animators

          + +

          Animators are a specific type of timer, specially designed for on-screen animation purposes:

          + +
            +
          • The time interval is usually known when they are created.
          • +
          • They are called at each screen refresh and their interval can vary. The interval can depend on the system load, the target power consumption, and other factors. The exact interval is not relevant.
          • +
          + +

          To implement animators, Ecore provides the Ecore animator subsystem.

          + +

          Forever-running Animator

          + +

          To create an animation that runs for an indefinite time:

          + +
          +Eina_Bool my_anim_cb(void *data)
          +{
          +   static int count = 0;
          +   count++;
          +   if (count < 5) 
          +      return ECORE_CALLBACK_RENEW;
          +
          +   return ECORE_CALLBACK_CANCEL;
          +}
          +ecore_animator_add(my_anim_cb, my_data);
          +
          + +

          This example looks the same as the one using an Ecore timer. The ecore_animator_add() function takes the callback function and data to pass to it, and returns an Ecore_Animator object. The function is called at a system-defined interval until it returns ECORE_CALLBACK_CANCEL instead of ECORE_CALLBACK_RENEW.

          + +

          Specific-duration Animator

          + +

          An animator callback for an animator running a specific time has a different prototype than the forever running animator.

          + +

          This callback function receives both data and a position which represents the current time among the full timeline, 0 meaning the beginning of the animation, and 1 meaning the end of the animation, returning ECORE_CALLBACK_CANCEL to abort, or ECORE_CALLBACK_RENEW to continue.

          + +

          To create and destroy the animator:

          +
            +
          • To create the animator, use the ecore_animator_timeline_add() function. The first parameter specifies the animator duration, the second parameter is the callback function, and the third parameter is the data to pass to the callback. The data parameter is optional. +
            +Eina_Bool my_anim_cb(void *data, double position)
            +{
            +   if (position < .5) 
            +      return ECORE_CALLBACK_RENEW;
            +
            +   return ECORE_CALLBACK_CANCEL;
            +}
            +ecore_animator_timeline_add(5., my_anim_cb, my_data);
            +
            + +

            In this example, the animator is specified to run for five seconds. The function returns ECORE_CALLBACK_CANCEL as soon as the position among the timeline passes half of the duration, 2.5 seconds.

            + +

            Ecore can generate a virtual position from the original one using ecore_animator_pos_map(position, map, v1, v2). Several maps are available:

            + +
              +
            • ECORE_POS_MAP_LINEAR: linear from 0.0 to 1.0.
            • +
            • ECORE_POS_MAP_ACCELERATE: start slow, then speed up.
            • +
            • ECORE_POS_MAP_DECELERATE: start fast, then slow down.
            • +
            • ECORE_POS_MAP_SINUSOIDAL: start slow, speed up, then slow down at the end.
            • +
            • ECORE_POS_MAP_ACCELERATE_FACTOR: start slow, then speed up, v1 being a power factor: 0.0 is linear, 1.0 is standard acceleration, 2.0 is a much more pronounced acceleration (squared), and 3.0 is cubed.
            • +
            • ECORE_POS_MAP_DECELERATE_FACTOR: start fast, then slow down, v1 being a power factor: 0.0 is linear, 1.0 is standard deceleration, 2.0 is a much more pronounced deceleration (squared), and 3.0 is cubed.
            • +
            • ECORE_POS_MAP_SINUSOIDAL_FACTOR: start slow, speed up, then slow down at the end, v1 being a power factor: 0.0 is linear, 1.0 is a standard sinusoidal, 2.0 is a much more pronounced sinusoidal (squared), and 3.0 is cubed.
            • +
            • ECORE_POS_MAP_DIVISOR_INTERP: start at gradient * v1, interpolated with the power of v2 curve.
            • +
            • ECORE_POS_MAP_BOUNCE: start at 0.0, then drop like a ball bouncing to the ground at 1.0, and bounce v2 times, with a decay factor of v1.
            • +
            • ECORE_POS_MAP_SPRING: start at 0.0, then wobble like a spring to the rest position 1.0, and wobble v2 times, with a decay factor of v1.
            • +
            + +

            Figure: Position maps

            +

            Position maps

            +
          • + +
          • To destroy the animator, use the ecore_animator_del() function. The animator to destroy must be running, that is, it has not returned a false value. If the animator is not running, the function cannot be called.
          • +
          + +

          To manage the animator:

          +
            +
          • To pause the currently running animator, use the ecore_animator_freeze() function. Note that time continues ticking even if the animator is frozen, and that resuming the animation using the ecore_animator_thaw() function does not actually resume, if the full runtime has been passed in the meanwhile.
          • + +
          • To query Ecore for the interval between 2 animator calls, use the ecore_animator_frametime_get() function.
          • + +
          • To change the interval, use the ecore_animator_frametime_set(interval) function. Note that too small a value causes performance and power consumption issues, and too high a value makes the animation jerky.
          • +
          + +

          File Descriptors

          + +

          Ecore provides an infrastructure to monitor file descriptors, so that files do not have to be blocked or polled to read or write on them. Instead, monitor sockets, pipes, or other streams are used to get a file descriptor.

          + +

          To manage the file descriptors:

          +
            +
          • To set a callback, use the _my_cb_func() function. Its first parameter is the data passed to it (optional), and the second one is the Ecore file descriptor handler. Its return value is, as in most Ecore callbacks, ECORE_CALLBACK_RENEW or ECORE_CALLBACK_CANCEL. It tells Ecore whether it wants to be called again or whether its treatment is finished.
          • + +
          • To listen to events, use the ecore_main_fd_handler_add() function.
          • + +
          • To wait for incoming data (that is, to read data) on the my_fd file descriptor, passing my_data: + +
            +Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler)
            +{
            +   int fd;
            +   fd = ecore_main_fd_handler_fd_get(handler);
            +   count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block
            +
            +   return ECORE_CALLBACK_RENEW;
            +}
            +ecore_main_fd_handler_add(my_fd, ECORE_FD_READ, my_fd_cb, my_data, NULL, NULL);
            +
            +
          • + +
          • To delete a file descriptor handler, use the ecore_main_fd_handler_del() function. This does not close the file descriptor. Always delete the handlers before closing the actual file descriptors.
          • + +
          • To get the handler's file descriptor, use the ecore_main_fd_handler_fd_get() function.
          • + +
          • To select whether a flag is active on a handler, use the ecore_main_fd_handler_active_get() function. For example, the handler is set to monitor both ECORE_FD_READ and ECORE_FD_ERROR. The following example finds out whether the function was called because of an error: + +
            +Eina_Bool my_fd_cb(void *data, Ecore_Fd_Handler *handler)
            +{
            +   int fd;
            +   fd = ecore_main_fd_handler_fd_get(handler);
            +   if (ecore_main_fd_handler_active_get(handler, ECORE_FD_ERROR) == EINA_TRUE) 
            +   {
            +      // We have an error!
            +
            +      return ECORE_CALLBACK_CANCEL;
            +   }
            +   count = read(fd, buf, sizeof(buf)); // This is guaranteed not to block
            +
            +   return ECORE_CALLBACK_RENEW;
            +}
            +ecore_main_fd_handler_add(my_fd, ECORE_FD_READ | ECORE_FD_ERROR, my_fd_cb, my_data, NULL, NULL);
            +
            +
          • + +
          • To change the flags the handler is monitoring, use the ecore_main_fd_handler_active_set() function.
          • +
          + +

          Threads

          + +

          EFL is not entirely thread-safe. This means that if a task is running in another thread and, for example, an Evas object shows the status progress of this task, the object cannot be updated from within the thread. Updating can only be done from the main thread that runs the main loop.

          + +

          Ecore provides a facility to perform tasks on separate worker threads. It is not a simple wrapper around standard threads provided by the operating system. With Ecore threads, it is easier to dispatch a worker function to perform some heavy tasks and get the result once it completes. It does not block the application UI. It is also easy to cancel and reschedule threads. Several threads can be launched simultaneously, since Ecore schedules them according to the number of processors the system has and the maximum amount of concurrent threads set for the application.

          + +

          Ecore has 2 kinds of threads:

          +
            +
          • Short jobs do not give any kind of information on their status to the parent. They are best used for short computing-intensive snippets of code.
          • +
          • Feedback jobs give information on their status to the parent. They are best used for longer snippets requiring a feedback loop, such as an ongoing file download.
          • +
          + +

          Ecore creates a pool of worker threads. The exact count is computed from the number of CPUs or cores, or it can be specified by the application itself.

          + +

          When a worker thread is idle, it picks a job to execute from the waiting list until there is none left. In the following example, there are 2 threads defined by my_short_job() and my_feedback_job(). Both threads take 2 parameters: some data passed to them, and the actual thread running. Call a callback when the jobs end, whether they are cancelled (my_job_cancel()) or end normally (my_job_end()).

          + +
          +struct feedback_msg
          +{
          +   int pos;
          +};
          +
          +void my_short_job(void *data, Ecore_Thread *thread)
          +{
          +   usleep(200000);
          +}
          +
          +void my_feedback_job(void *data, Ecore_Thread *thread)
          +{
          +   int i;
          +   for (i = 0; i < 100; i++) 
          +   {
          +      usleep(50000); // You can have some real computation done
          +      struct feedback_msg *message = malloc(sizeof(struct feedback_msg));
          +      if (message) 
          +      {
          +         message->pos = i;
          +         ecore_thread_feedback(thread, message);
          +      }
          +      if (ecore_thread_check(thread))
          +         return;
          +   }
          +}
          +
          +void my_feedback_job_notify(void *data, Ecore_Thread *thread, void *msg)
          +{
          +   struct feedback_msg *message = msg;
          +   free(message);
          +}
          +
          +void my_job_end(void *data, Ecore_Thread *thread)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Thread has normally ended.\n");
          +}
          +
          +void my_job_cancel(void *data, Ecore_Thread *thread)
          +{
          +   dlog_print(DLOG_INFO, LOG_TAG, "Thread has been cancelled.\n");
          +}
          +
          +ecore_thread_run(my_short_job, my_job_end, my_job_cancel, my_data);
          +ecore_thread_feedback_run(my_feedback_job, my_feedback_job_notify, my_job_end, 
          +                          my_job_cancel, my_data, EINA_FALSE);
          +
          + +

          To manage threads:

          + +
            +
          • To cancel a thread, use the ecore_thread_cancel() function. However, note that this is done cooperatively: the thread continues to run until it exists. Call the ecore_thread_check() function regularly to check whether the thread has been marked for cancellation and exit if true.
          • + +
          • To run threads that are not accounted for in the worker thread pool, use the ecore_thread_feedback_run() function with the last parameter set to EINA_TRUE. + +

            The feedback message a thread sends as notification can be any kind of data. In the above example, it is a simple integer, but it can be as complex as needed.

            +
          • + +
          • To execute a thread later, use the ecore_thread_reschedule() function. This function is added to the end of the pending tasks.
          • + +
          • To get the maximum number of concurrent threads, use the ecore_thread_max_get() function. If needed, set it by using the ecore_thread_max_set() function, or reset the default value using the ecore_thread_max_reset() function.
          • + +
          • To query the number of active threads, use the ecore_thread_active_get() function. To query the number of available worker threads, use the ecore_thread_available_get() function, which is basically the same as the ecore_thread_max_get() - ecore_thread_active_get().
          • +
          + +

          Idlers

          + +

          When the rendering is done and all work is finished, the main loop enters its idle state until the next loop. You can get the functions of your application called back before the main loop enters or exits the idle state, or when it is in the idle state. They are respectively called Ecore_Idle_Enterer, Ecore_Idle_Exiter, and Ecore_Idler.

          + +

          Figure: Idle loop

          +

          Idle loop

          + +

          The idle enterers, exiters, and idlers all have the same prototype, my_idler(), which receives data and returns ECORE_CALLBACK_RENEW or ECORE_CALLBACK_CANCEL to tell Ecore whether it wants to be called again or is finished.

          + +

          To manage the idlers:

          +
            +
          • To add an idler, use the ecore_idler_add() function.
          • +
          • To delete an idler, use the ecore_idler_del() function.
          • + +
          • To add and delete idle exiters, use the ecore_idle_exiter_add() and ecore_idle_exiter_del() functions.
          • + +
          • To add and delete idle enterers, use the ecore_idle_enterer_add() and ecore_idle_enterer_del() functions. The ecore_idle_enterer_before_add() function is also available, if you want your function to be added at the top of the list so that it is called before the others.
          • +
          + +
          +Eina_Bool my_idle_enterer_cb(void *data)
          +{
          +   return ECORE_CALLBACK_RENEW;
          +}
          +
          +Eina_Bool my_idle_exiter_cb(void *data)
          +{
          +   return ECORE_CALLBACK_CANCEL;
          +}
          +
          +Eina_Bool my_idler(void *data)
          +{
          +   return ECORE_CALLBACK_RENEW;
          +}
          +
          +ecore_idle_enterer_add(my_idle_enterer_cb, my_data);
          +ecore_idle_exiter_add(my_idle_exiter_cb, my_data);
          +ecore_idler_add(my_idler_cb, my_data);
          +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/menu_tutorial_mn.htm b/org.tizen.ui.practices/html/native/efl/menu_tutorial_mn.htm new file mode 100644 index 0000000..7287e25 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/menu_tutorial_mn.htm @@ -0,0 +1,612 @@ + + + + + + + + + + + + + + Creating Mobile Menus + + + + + + +
          +

          Creating Mobile Menus

          + + +

          This tutorial shows how to add menus to the application. The example code creates an application with 3 views, which can be accessed from a menu bar at the top of the application window. The application also has a hidden menu that appears only when the menu button is pressed.

          + +

          This feature is supported in mobile applications only.

          + + +

          Defining the Menu Application Structure

          + +

          To define the application structure:

          +
            +
          1. +

            Define the main structure of the application:

            +
            +typedef struct 
            +appdata
            +{
            +   Evas_Object* win; // Main window
            +   Evas_Object* layout; // Edje layout
            +   Evas_Object* conform; // Conform
            +   Evas_Object *nf; // Naviframe to handle the views
            +   appmenu_s *menu; // Main menu
            +   appmenu_s *sidemenu; // Side menu
            +   mainview_s *main_view; // Main view (dayselector)
            +   calview_s *cal_view; // Calendar view
            +   dateview_s *date_view; // Date and time view
            +   settview_s *settings_view; // Settings view
            +   Eina_Bool sdmenu_up; // Boolean variable to keep the side menu status
            +} appdata_s;
            +
            +

            This structure contains some specific variables for the views and the menus.

            +
          2. +
          3. +

            Define the main view by using the mainview structure. It is composed of a box (the main container), a dayselector, an img image, and an lb_main label.

            +
            +typedef struct 
            +mainview
            +{
            +   Evas_Object *box; // Main container of the view
            +   Evas_Object *colorselector; // Color selector
            +   Evas_Object *img; // Image 
            +   Evas_Object *lb_day; // Label
            +} mainview_s;
            +
            +
          4. +
          5. +

            Define the date view. The date view is very similar to the main view. It contains a box, a datetime component and an lb_date label.

            +
            +typedef struct 
            +dateview
            +{
            +   Evas_Object *box; // Main container of the view 
            +   Evas_Object *datetime; // Datetime component 
            +   Evas_Object *lb_date; // Label 
            +} dateview_s;
            +
            +
          6. +
          7. +

            Define the calendar view. It contains a box, a calendar and an lb_cal label.

            +
            +typedef struct 
            +calview
            +{
            +   Evas_Object *box; // Main container of the view 
            +   Evas_Object *calendar; // Calendar component  
            +   Evas_Object *lb_cal; // Label component
            +} calview_s;
            +
            +
          8. +
          9. +

            Define the toolbar and submenu items. The main menu is fixed and visible, and the side menu is hidden on application start. These menus are represented by the appmenu structure.

            +
            +typedef struct 
            +appmenu
            +{
            +   Evas_Object *tb; // Toolbar
            +   Elm_Object_Item *submenu; // Submenu item
            +} appmenu_s;
            +
            +
          10. +
          + +

          Defining the Menus in the Application Theme

          + +

          This tutorial uses the Basic EDC UI Application template, which defines the application theme in an EDC file.

          +

          The following figure shows the application theme structure.

          + +

          Figure: Theme structure

          +

          Theme structure

          +

          The window, conformant, and layout are set by the Basic EDC UI Application template. You only need to set up the containers for the UI components and views.

          + +

          To define the application theme for the menus and views:

          +
            +
          1. +

            To define the main menu at the top of the screen, create the menu/main SWALLOW part in the .edc file.

            +

            This part has 2 descriptions, one for the real menu position at the top named up, and another that is placed out of the screen as the default position.

            +
            +part
            +{
            +   name: "menu/main";
            +   type: SWALLOW;            
            +   description 
            +   {
            +      state: "default" 0.0;
            +      rel1.relative: 0.0 1.0;
            +      rel2.relative: 1.0 1.0;
            +   }
            +   description 
            +   {
            +      state: "up" 0.0;
            +      rel1.relative: 0.0 0.01;
            +      rel2.relative: 1.0 0.18;
            +      
            +   }
            +} // End menu/main
            +
            +
          2. +
          3. +

            Create the animation,menu_main program to change the main menu state at the application start. The state is changed from default to up, and linearly moves the menu from its out-of-the-screen position to the top of the screen.

            +
            +program
            +{ 
            +   name: "animation,menu_main";
            +   source: "";
            +   signal: "load";
            +   action: STATE_SET "up" 1.0;
            +   target: "menu/main";
            +   transition: LINEAR 0.5;
            +} // END animation,menu_main
            +
            +
          4. +
          5. +

            Create another SWALLOW part as a container for the views. This part also has 2 descriptions for animation purposes.

            +
            +part 
            +{
            +   name: "view/main";
            +   type: SWALLOW;            
            +   description 
            +   {
            +      state: "default" 0.0;
            +      rel1.relative: 0.0 1.0;
            +      rel2.relative: 1.0 1.0;
            +   }
            +   description 
            +   {
            +      state: "up" 0.0;
            +      rel1.relative: 0.0 1.1;
            +      rel1.to: "menu/main";
            +      rel2.relative: 1.0 1.0;
            +      color: 0 255 0 255; 
            +   }
            +} // END view/main 
            +
            +
          6. +
          7. +

            Create the animation,view_main program to move the view along the main menu:

            +
            +program 
            +{ 
            +   name: "animation,view_main";
            +   source: "";
            +   signal: "load";
            +   action: STATE_SET "up" 1.0;
            +   target: "view/main";
            +   transition: LINEAR 0.2;
            +} // END animation,view_main
            +
            +
          8. +
          9. +

            Create the menu/side side menu container. In the default state, the side menu is hidden, and in the up state, it is shown on the left of the screen.

            +
            +part 
            +{ 
            +   name: "menu/side";
            +   type: SWALLOW;
            +   description 
            +   { 
            +      state: "default" 0.0;
            +      rel1.relative: -0.3 0.0;
            +      rel2.relative: -0.3 1.0;
            +      color: 255 0 0 255; 
            +   }
            +   description 
            +   {
            +      state: "up" 0.0;
            +      rel1.relative: 0.0 0.01;
            +      rel2.relative: 0.3 1.0;
            +     color: 255 0 0 255;
            +   }
            +} // END menu/side
            +
            +
          10. +
          11. +

            You can show the side menu by clicking the menu button.

            +

            Create the animation,menu_side program to run the related animation. This program runs when it receives a show,sidemenu event from the MenuButton source, and changes the side menu state to up, making the menu visible.

            +
            +program 
            +{ 
            +   name: "animation,menu_side";
            +   source: "MenuButton";
            +   signal: "show,sidemenu";
            +   action: STATE_SET "up" 1.0;
            +   target: "menu/side";
            +   transition: LINEAR 0.2;
            +} // END animation,menu_side
            +
            +
          12. +
          13. +

            You can hide the side menu with another menu button click.

            +

            Create the animation,menu_side,hide program that starts when it receives a hide,sidemenu signal from the MenuButton source. It changes the side menu state back to default, hiding the menu.

            +
            +program 
            +{ 
            +   name: "animation,menu_side,hide";
            +   source: "MenuButton";
            +   signal: "hide,sidemenu";
            +   action: STATE_SET "default" 1.0;
            +   target: "menu/side";
            +   transition: LINEAR 0.2;
            +} // END animation,menu_side,hide
            +
            +
          14. +
          + +

          Creating the Menu Bar and Views

          + +

          The naviframe handles views, which in this example are implemented as box containers. For more information, see the UI Container guide.

          +

          The following figure shows the structure of the view/main container.

          + +

          Figure: Main view

          +

          Main view

          + + +

          To create the menu bar and views for the UI:

          +
            +
          1. +

            Create the naviframe with the create_base_gui() function and allocate the memory to handle the views of the application:

            +
            +// Memory allocation
            +ad->main_view = calloc(1, sizeof(mainview_s)); // Allocate memory for the main view 
            +ad->cal_view = calloc(1, sizeof(calview_s)); // Allocate memory for the calendar view 
            +ad->date_view = calloc(1, sizeof(dateview_s)); // Allocate memory for the date view 
            +ad->settings_view = calloc(1, sizeof(settview_s)); // Allocate memory for the settings view
            +// END of memory allocation
            +
            +
          2. +
          3. +

            Use the app_terminate() function to free the memory for the views and menus:

            +
            +app_terminate(void *data)
            +{
            +   // Release all resources
            +   appdata_s *ad = data;
            +
            +   free(ad->menu);
            +   free(ad->sidemenu);
            +   free(ad->main_view);
            +   free(ad->cal_view);
            +   free(ad->settings_view);
            +} // END of app_terminate
            +
            +
          4. +
          5. +

            Create the main menu after most of the containers are created:

            +
              +
            1. +

              Create a new _build_main_menu() function that takes appdata_s as a parameter. This function is called by the create_base_gui() function.

              +
              +static void 
              +_build_main_menu(appdata_s *ad)
              +{
              +   // Memory allocation for the main menu function
              +   appmenu_s *menu = calloc(1, sizeof(appmenu_s));
              +   // Put the main menu in the application data
              +   ad->menu = menu;
              +
              +
            2. + +
            3. +

              Create a toolbar with the elm_toolbar_add() function. This toolbar is a child of the main window. Set ad->win as its parameter.

              +
              +   // Create the main menu toolbar
              +   menu->tb = elm_toolbar_add(ad->win);
              +
              +
            4. +
            5. +

              Set up the behavior of the toolbar.

              +

              The display mode is set by using the elm_toolbar_shrink_mode_set() function. The toolbar does not scroll under the #ELM_TOOLBAR_SHRINK_NONE mode, but it enforces a minimum size, so that all the items fit inside it. It does not scroll or show the items that do not fit under the #ELM_TOOLBAR_SHRINK_HIDE mode. Finally, it scrolls under the #ELM_TOOLBAR_SHRINK_SCROLL mode, and it creates a button to aggregate items which did not fit with the #ELM_TOOLBAR_SHRINK_MENU mode.

              +
              +   // Set the "Menu" Toolbar properties
              +   elm_toolbar_shrink_mode_set(menu->tb, ELM_TOOLBAR_SHRINK_NONE);
              +
              +

              In this example, there is only a limited number of menu elements and the ELM_TOOLBAR_SHRINK_NONE mode is used.

            6. +
            7. +

              Expand the transverse length of the item according to the transverse length of the toolbar, giving EINA_TRUE as second parameter of the elm_toolbar_transverse_expanded_set() function.

              +
              +   elm_toolbar_transverse_expanded_set(menu->tb, EINA_TRUE);
              +
              +
            8. +
            9. +

              Make the menu items have the same size by setting EINA_TRUE to the elm_toolbar_homogeneous_set() function. This activates the homogeneous mode of the toolbar.

              +
              +   elm_toolbar_homogeneous_set(menu->tb, EINA_FALSE);
              +
              +
            10. +
            11. +

              Add menu items to the toolbar using the elm_toolbar_item_append() functions. It takes 5 parameters:

              +
                +
              • Target toolbar
              • +
              • Icon path for the menu item
              • +
              • Item label (also used in the callback function)
              • +
              • Function to call when the item is clicked
              • +
              • Data to associate with the item for related callbacks.
              • +
              +
              +   // Add menu items to the main menu toolbar
              +   elm_toolbar_item_append(menu->tb, ICON_DIR"/home.png", "Home", _menu_item_selected_cb, ad);
              +   elm_toolbar_item_append(menu->tb, ICON_DIR"/calendar.png", "Calendar", _menu_item_selected_cb, ad);
              +   elm_toolbar_item_append(menu->tb, ICON_DIR"/clock.png", "Date", _menu_item_selected_cb, ad);
              +   elm_toolbar_item_append(menu->tb, ICON_DIR"/settings.png", "Settings", _menu_item_selected_cb, ad);
              +
              +

              For the icons, add some images in the res/images application resource directory, and define a macro to contain this path in the application .h file. In this example, it is inc/menututorial.h.

              +

              Use the PACKAGE macro to setup this ICON_DIR macro. This way you can add items to the toolbar using icon images placed in the resource directory of the application.

              + +
              +#define ICON_DIR "/opt/usr/apps/"PACKAGE"/res/images"
              +
              +
            12. +
            13. Show the toolbar and add the UI component to the main menu container: +
              +   // Show the UI component
              +   evas_object_show(menu->tb);
              +
              +   // Add the UI component to the "menu/main" SWALLOW container
              +   elm_object_part_content_set(ad->layout, "menu/main", menu->tb);
              +
              +   // Set the default view 
              +   elm_toolbar_item_selected_set(elm_toolbar_first_item_get(menu->tb), EINA_TRUE);
              +}
              +
              +
            +
          6. +
          7. +

            Enable switching between views based on the menu item selection.

            + +

            When a menu item is selected, the _menu_item_selected_cb() callback is triggered. In this example, this same callback is used for all menu items. However, you can also create a separate callback for each item.

            + +

            The callback must follow the Evas_Smart_Cb prototype that takes the application data, Evas Object, and event info as parameters.

            + +

            In this example, the callback creates the requested view by recovering the calling object text to call the correct view creation function. The available views are Calendar, Date, Settings, and Home (main view). The view names are stored as the menu item labels, to be able to compare the returned string with the view names. When the name matches, the view is built by calling the correct function. Store the view in the application data and set up a new content to the naviframe before exiting.

            + +

            The naviframe component destroys its content on each call of the elm_object_content_set() function. That is why the content must be built again on each item click.

            +
            +it = ev;
            +
            +// Get the menu item text
            +str = elm_object_item_text_get(it);
            +
            +// Compare with the possible view names
            +if (!strcmp(str, "Calendar")) 
            +{
            +   // Build the "Calendar View"
            +   _build_calendar_view(ad);
            +   // Set the view from the application data
            +   view = ad->cal_view->box;
            +}
            +else if (!strcmp(str, "Date")) 
            +{
            +   // Build the "Date View"
            +   _build_date_view(ad);
            +   // Set the view from the application data
            +   view = ad->date_view->box;
            +}
            +else if (!strcmp(str, "Home")) 
            +{
            +   // Build the "Home or main View"
            +   _build_main_view(ad);
            +   // Set the view from the application data
            +   view = ad->main_view->box;
            +}
            +else if (!strcmp(str, "Settings")) 
            +{
            +   // Build the "Settings" view
            +   _build_settings_view(ad);
            +   // Set the view from the application data
            +   view = ad->settings_view->box;
            +}
            +else if (!strcmp(str, "Clock")) 
            +{
            +   // Build the "Date View" 
            +   _build_date_view(ad);
            +   // Set the view from the application data
            +   view = ad->date_view->box;
            +}
            +
            +// Show the view in the naviframe 
            +elm_object_content_set(ad->nf, view);
            +
            +
          8. +
          9. +

            Define the functions which create the views. Each function creates a view and stores it in the application data.

            +
            +static void 
            +_build_main_view(appdata_s *ad)
            +{
            +   mainview_s *view = ad->main_view;
            +   char buf[PATH_MAX];
            +
            +   // Main box
            +   view->box = elm_box_add(ad->nf);
            +   elm_box_horizontal_set(view->box, EINA_FALSE);
            +   elm_box_homogeneous_set(view->box, EINA_TRUE);
            +
            +   view->colorselector = elm_colorselector_add(view->box);
            +   elm_colorselector_mode_set(view->colorselector, ELM_COLORSELECTOR_PALETTE);
            +   elm_box_pack_start(view->box, view->colorselector);
            +   evas_object_show(view->colorselector);
            +
            +   view->img = elm_image_add(view->box);
            +   evas_object_size_hint_weight_set(view->img, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_align_set(view->img, 0.5, 0.5);
            +   evas_object_size_hint_min_set(view->img, 256, 256);
            +   ;snprintf(buf, sizeof(buf), "%s/%s", ICON_DIR, "tizen-logo.png");
            +   if (!elm_image_file_set(view->img, buf, NULL))
            +      elm_object_text_set(view->lb_day, "Problem loading image");
            +   elm_box_pack_start(view->box, view->img);
            +   evas_object_show(view->img);
            +
            +   view->lb_day = elm_label_add(view->box);
            +   elm_object_text_set(view->lb_day, "Main view");
            +   evas_object_size_hint_weight_set(view->lb_day, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_box_pack_end(view->box, view->lb_day);
            +   evas_object_show(view->lb_day);
            +}
            +
            +static void
            +_build_calendar_view(appdata_s *ad)
            +{
            +   calview_s *view = ad->cal_view;
            +
            +   // Main box image = elm_image_add(win);
            +
            +   view->box = elm_box_add(ad->nf);
            +   elm_box_horizontal_set(view->box, EINA_FALSE);
            +   elm_box_homogeneous_set(view->box, EINA_TRUE);
            +
            +   view->calendar = elm_image_add(ad->nf);
            +   evas_object_size_hint_weight_set(view->calendar, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_size_hint_align_set(view->calendar, 0.5, 0.5);
            +   evas_object_size_hint_min_set(view->calendar, 256, 256);
            +   elm_image_file_set(view->calendar, ICON_DIR"/calendar.png", NULL);
            +   elm_box_pack_start(view->box, view->calendar);
            +   evas_object_show(view->calendar);
            +
            +   view->lb_cal = elm_label_add(view->box);
            +   elm_object_text_set(view->lb_cal, "The calendar view");
            +   evas_object_size_hint_weight_set(view->lb_cal, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   elm_box_pack_end(view->box, view->lb_cal);
            +   evas_object_show(view->lb_cal);
            +} // End of_build_calendar_view
            +
            + +
          10. +
          + +

          Creating a Hidden Menu

          + +

          To create a hidden menu:

          +
            +
          1. +

            Define the _build_side_menu() function to create the side menu toolbar and add some items to it. This function takes the application data as parameter and stores the built menu in the sidemenu attribute of the structure.

            +
            +static void 
            +_build_side_menu(appdata_s *ad)
            +{
            +   appmenu_s *sidemenu = calloc(1, sizeof(appmenu_s));
            +   ad->sidemenu = sidemenu;
            +
            +   sidemenu->tb = elm_toolbar_add(ad->win);
            +
            +   elm_toolbar_shrink_mode_set(sidemenu->tb, ELM_TOOLBAR_SHRINK_EXPAND);
            +   elm_toolbar_transverse_expanded_set(sidemenu->tb, EINA_TRUE);
            +
            +   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/home.png", "Home", _menu_item_selected_cb, ad);
            +   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/account.png", "Account", NULL, NULL);
            +   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/contacts.png", "Friends", NULL, NULL);
            +   elm_toolbar_item_append(sidemenu->tb, ICON_DIR"/clock.png", "Clock", _menu_item_selected_cb, ad);
            +   elm_toolbar_homogeneous_set(sidemenu->tb, EINA_FALSE);
            +   evas_object_show(sidemenu->tb);
            +   elm_object_part_content_set(ad->layout, "menu/side", sidemenu->tb);
            +   elm_toolbar_horizontal_set(sidemenu->tb, EINA_FALSE);
            +   elm_toolbar_item_selected_set(elm_toolbar_first_item_get(sidemenu->tb), EINA_TRUE);
            +}
            +
            +

            The side menu is created, but hidden by default. To make it appear, the menu (Home) button must be clicked.

            +
          2. +
          3. +

            Create the hidden menu functionality.

            +

            By default, the Basic EDC UI Application template creates a keydown_cb() function to handle the key down events. In the create_base_gui() function, an ecore_event_handler_add() function is called with the ECORE_EVENT_KEY_DOWN macro and with the keydown_cb() function as a callback. In this callback, the KEY_END event puts the window in the lower state.

            +
            +keydown_cb(void *data , int type , void *event)
            +{
            +   appdata_s *ad = data;
            +   Ecore_Event_Key *ev = event;
            +   if (!strcmp(ev->keyname, KEY_END)) 
            +   {
            +      // Let window go to hidden state
            +      elm_win_lower(ad->win);
            +   }
            +
            +   return ECORE_CALLBACK_DONE;
            +}
            +
            +
          4. +
          5. +

            Add the menu button key press handling to the keydown_cb() callback. The key name of the menu button is XF86Send. The menu is shown on the first press and hidden on the second press. Use Eina_Bool sdmenu_up on the application data to store the menu status during the application execution. If ad->sdmenu_up is EINA_TRUE, the menu is visible.

            + +

            The animation,menu_side program is defined in the .edc theme file. This program is run when the show,sidemenu signal is received from the MenuButton source. In addition, the program that hides the side menu is defined and is called animation,menu_side,hide, starting on the hide,sidemenu signal.

            + +

            Test the side menu status by sending the signals using the elm_object_signal_emit() function.

            +
            +if (!strcmp(ev->keyname, "XF86Send")) 
            +{
            +   if (ad->sdmenu_up == EINA_TRUE) 
            +   {
            +      // If the menu is visible send a "hide,sidemenu" signal
            +      elm_object_signal_emit(ad->layout, "hide,sidemenu", "MenuButton");
            +      // Store the new menu status (hidden)
            +      ad->sdmenu_up = EINA_FALSE;
            +   }
            +}
            +
            +

            Now the menu appears and disappears when the menu button is pressed.

            +
          6. +
          7. +

            When the user clicks the first side menu button (Home), the menu disappears:

            +
            +// Hide the side menu if it's visible
            +if (ad->sdmenu_up == EINA_TRUE) 
            +{
            +   elm_object_signal_emit(ad->layout, "hide,sidemenu", "MenuButton");
            +      ad->sdmenu_up = EINA_FALSE;
            +}
            +
            +
          8. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/multiple_screens_n.htm b/org.tizen.ui.practices/html/native/efl/multiple_screens_n.htm new file mode 100644 index 0000000..04b31e6 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/multiple_screens_n.htm @@ -0,0 +1,259 @@ + + + + + + + + + + + + + Multiple Screen Support + + + + + +
          + +

          Multiple Screen Support

          + +

          Tizen is available in various devices which support different screen sizes and resolutions. When developing Tizen applications, you must take this into account if you want your application to function well in various device models.

          +

          Before implementing multiple screen support, make sure you are familiar with the key concepts of multiple screen support.

          + +

          Key Concepts

          +

          Before building a native application for multiple resolutions using Tizen native UI framework, make sure you are familiar with the following concepts:

          + + +

          Multi-scale in Tizen Native UI Framework

          +

          Tizen native UI framework supports multiple scaling. If the application is implemented considering scalability, it is enough to change the elm_scale value in different device environments without modifying the application code.

          + +

          Scale 1.0 in Tizen native UI framework means that the application is displayed in a set size and is not scaled. Scale 1.0 is used in a display environment, such as a desktop. In the desktop environment, the monitor has a resolution between 1280 x 800 and 1920 x 1080, with a size between 20 and 27 inch, and the dpi between 80 and 100.

          + +

          If an application is scaled up or down after implementing it in a desktop environment, it can be used in another device without modifying the code. Each device has a proper scale value for adjusting the application size. Edje, which handles layout and themes in Tizen native UI framework, gets the size of an object by multiplying the size specified by an application using the scale value.

          + +

          The following figure illustrates a 50 px wide object in a 1280 px wide monitor. If the same object is displayed with not scaling in mobile environment, it looks very small. To show the object in mobile environment in the similar size as in the monitor, define the scale is 2.0, so that the object size is 100 px instead of 50 px.

          + +

          Figure: Scaling from desktop to mobile

          +

          Scaling from desktop to mobile

          + +

          Base Scale

          +

          The object scaling must be defined in the config.xml file of this application to show the application in a proper size in other devices. However, the scaling must be based on scale 1.0 or, if the application is based on another scale, this scale must be defined in the config.xml file. This predefined scale is called the "base scale".

          + +

          The size of a scalable object is multiplied with the device scale value, as illustrated in the following figure. If the scalable object (on the left) with the size 10 is created in a device with scale 1.0, the size of the object is 20 in a device with scale 2.0, and 40 in a device with scale 4.0.

          + +

          Figure: Base scale

          +

          Base scale

          + +

          The middle object has a base scale 2.0. The following example shows its scaling in a device with scale 4.0:

          + + + + + + + +
          Scale = Device scale (information in the target) / Base scale (information in the application) +

          For example: 2.0 = 4.0 / 2.0

          +
          + + +

          Applying the Base Scale

          +

          To create an application that supports multiple screen sizes, you must learn how to set the base scale in:

          + + +

          Calculating the Base Scale

          + +

          To get the base scale value of your own display, you must know the DPI of the display. Based on the display DPI, you can calculate the base scale, since it is basically proportional to the display DPI with the following formula:

          + +
          +base_scale = (DPI / 90) * profile_factor
          + +

          The profile factor is the value for fitting the object size as a profile. The distance between the user eye and the display differs for each profile. This means that the object size must be different if the device display is changed.

          + +

          The following table lists the profile factors for various profiles.

          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Profile factors
          ProfileProfile factor
          Wearable0.4
          Mobile - small screen (until 4.4 inch)0.7
          Mobile - normal screen (4.5 inch and upwards)0.8
          Desktop1.0
          + +

          For example, if your display has 233 dpi and the platform uses the mobile profile (small screen), the base scale is calculated like this:

          +
          +1.8 = (233 / 90) * 0.7
          + +

          The base scale of the device is 1.8. If the application is made in the environment using 233 dpi and mobile profile, its base scale must be set to 1.8. For a desktop, the DPI is 90, and its base scale is 1.0.

          + + +

          Setting the Base Scale in EDC

          +

          The application must specify the scale its base scale. The edje objects are scaled properly if the base scale is set in the collection of the edc file, as in the following example:

          + + + + + + + + +
          Note
          The base scale for WVGA is 1.8, and for HD application, 2.4.
          +
          collections 
          +{
          +   base_scale: 1.8; // This value is for WVGA application
          +   parts 
          +   {
          +      part 
          +      {
          +         name: "box"; 
          +         type: RECT;
          +         min: 100 100;
          +         scale: 1;
          +      }
          +   }
          +}
          +
          +

          Setting the Base Scale in C

          +

          The size of the object must be specified in EDC. However, sometimes it is better for an application to the object size in a C file. If the size is defined with no scaling in the C file, the application is displayed in the same size even if the scale changes. To avoid this, use the ELM_SCALE_SIZE macro, as in the following example:

          + +
          #define ELM_SCALE_SIZE(x) x / elm_app_base_scale_get() * elm_config_scale_get()
          + +

          in the definition, the size (x) is changed to a size based on 1.0 (x/elm_app_base_scale_get()) and it is multiplied with the scale of the current target (elm_config_scale_get()).

          + +

          Set the base scale using the elm_app_base_scale_set() function:

          + +
          int app_create(void *data)
          +{
          +   elm_app_base_scale_set(1.8); // This value is for WVGA application
          +}
          +
          +

          After setting the base scale, use the ELM_SCALE_SIZE macro to set the size of an object in the application:

          + +
          evas_object_size_hint_min_set(object, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
          +evas_object_resize(object, ELM_SCALE_SIZE(50), ELM_SCALE_SIZE(50));
          +
          + +

          You can use ELM_SCALE_SIZE macro in any API related with setting objects sizes in Tizen native applications.

          + +

          Scaling without the Base Scale

          + +

          In Tizen, each device has a scale value in proportion to the display. If scaling is enabled, the objects are drawn on the display by multiplying with the user-defined object size and the device scale. If the base scale is set, the objects are drawn by dividing the user-defined object size with the base scale and multiplying it by the device scale.

          + +

          If you use the scale feature without setting the base scale, the result is the same as if you set the base scale to 1.0. Then you do not need to care about the base scale variables, because the pixels roll like a virtual pixel. For example, if you set 1 pixel in 129 dpi without setting the base scale value, the 1 pixel before scaling is equivalent to 1 real physical pixel after scaling. In case of 233 dpi, it is the same with 1.8 pixels after scaling.

          + +

          Always consider the pixel before scaling when defining the application UI, in order to ensure a proper UI display on the screen with a diversity of densities.

          + +
          int app_create(void *data)
          +[ Conversion Formula ]
          +Real physical pixel = (a pixel before scaling) x (dpi / 90) x 0.7
          +
          +

          Where 90 is the default DPI on a desktop and 0.7 is the mobile profile factor.

          + +

          The following table shows some examples.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Pixel conversions
          BaseLow-density device (such as WVGA, 4 inch)High-density device (such as HD, 5 inch)
          DPI129233294
          A pixel before scaling100100100
          Real physical pixel100180260
          Actual base scale1.01.82.6
          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/multipoint_touch_n.htm b/org.tizen.ui.practices/html/native/efl/multipoint_touch_n.htm new file mode 100644 index 0000000..9289034 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/multipoint_touch_n.htm @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + Tracking Multi-point Touch Events + + + + + + +
          +

          Tracking Multi-point Touch Events

          + + +

          This tutorial demonstrates how you can use the Evas_Object to paint on a canvas and track touch events.

          + +

          Initializing Multi-point Touch

          + +

          This sample is a fully functional application able to track multiple simultaneous clicks. For every click, a black rectangle spot is drawn on the screen. This way it is easy to test the multi-point touch operation with the application.

          + +

          Initialization is implemented in the multitouch.c file.

          +

          The appdata structure includes Evas_Object pointers, a list, and a Boolean flag.

          +
          +typedef struct appdata 
          +{
          +   Evas_Object *win;
          +   Evas_Object *conform;
          +   Evas_Object *nf;
          +   Evas_Object *button;
          +   Evas_Object *box;
          +   Evas_Object *rect;
          +   Evas_Object *label;
          +
          +   // List of mouse spots
          +   Eina_List *spots;
          +
          +   // Flag for checking the mouse down event
          +   Eina_Bool down; 
          +} 
          +appdata_s;
          +
          + +

          The main() function initializes event callbacks and calls the ui_app_main() function to start the EFL application.

          +
          +int
          +main(int argc, char *argv[])
          +{
          +   appdata_s *ad = {0,};
          +   int ret = 0;
          +
          +   ui_app_lifecycle_callback_s event_callback = {0,};
          +   app_event_handler_h handlers[5] = {NULL,};
          +
          +   event_callback.create = app_create;
          +   event_callback.terminate = app_terminate;
          +   event_callback.pause = app_pause;
          +   event_callback.resume = app_resume;
          +   event_callback.app_control = app_control;
          +
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          +   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          +
          +   ret = ui_app_main(argc, argv, &event_callback, &ad);
          +
          +   return ret;
          +}
          +
          + + +

          The following figure illustrates the Multi-point Touch.

          + +

          Figure: Multi-point Touch screens

          +

          Multi-point Touch screens

          + +

          Handling the Canvas

          + +

          The create_base_gui() function creates base GUI elements including Naviframe and the Naviframe button. Naviframe includes each view screen as an item, which in turn includes the title and a button which clears spots when clicked.

          + +
          static void
          +create_base_gui(appdata_s *ad)
          +{
          +   Elm_Object_Item *nf_it;
          +
          +   // Naviframe
          +   ad->nf = elm_naviframe_add(ad->conform);
          +   elm_object_content_set(ad->conform, ad->nf);
          +   evas_object_show(ad->nf);
          +
          +   // Button
          +   ad->button = elm_button_add(ad->nf);
          +   elm_object_text_set(ad->button, "Clear");
          +   evas_object_smart_callback_add(ad->button, "clicked", button_clicked_cb, ad);
          +
          +   // Create main view
          +   ad->box = create_main_view(ad);
          +   nf_it = elm_naviframe_item_push(ad->nf, "Multi-point Touch",
          +                                   NULL, NULL, ad->box, NULL);
          +   elm_object_item_part_content_set(nf_it, "title_right_btn", ad->button);
          +} 
          +
          + +

          The create_main_view() function creates the main view including the label and an event rectangle.

          +

          The label displays information on mouse event status and coordinates (x, y positions). The event rectangle is received completely through mouse (touch) events. To show 2 elements in a Naviframe content area, a container combining those elements is necessary. A box container functions in that role. The label and rectangle pack end the box and the box is embedded into the Naviframe content area.

          + +
          static Evas_Object *
          +create_main_view(appdata_s *ad)
          +{
          +   Evas_Object *box;
          +
          +   // Box
          +   box = elm_box_add(ad->nf);
          +   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   evas_object_show(box);
          +
          +   // Label
          +   ad->label = elm_label_add(box);
          +   elm_object_text_set(ad->label, "None");
          +   evas_object_size_hint_weight_set(ad->label, EVAS_HINT_EXPAND, 0);
          +   evas_object_size_hint_align_set(ad->label, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +   evas_object_repeat_events_set(ad->label, EINA_TRUE);
          +   elm_box_pack_end(box, ad->label);
          +   evas_object_show(ad->label);
          +
          +   // Event Rect
          +   ad->rect = evas_object_rectangle_add(evas_object_evas_get(box));
          +   evas_object_size_hint_weight_set(ad->rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   evas_object_size_hint_align_set(ad->rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +   evas_object_color_set(ad->rect, 204, 204, 204, 255);
          +   evas_object_repeat_events_set(ad->rect, EINA_TRUE);
          +   elm_box_pack_end(box, ad->rect);
          +   evas_object_show(ad->rect);
          +}
          +
          + +

          The create_spot() function creates a rectangle, resizes the rectangle according to received size input, and moves the rectangle according to received coordinates (x, y positions) input.

          + +
          Evas_Object *
          +create_spot(Evas_Object *parent, Evas_Coord x, Evas_Coord y, int size)
          +{
          +   Evas_Object *spot;
          +   spot = evas_object_rectangle_add(evas_object_evas_get(parent));
          +   evas_object_resize(spot, size, size);
          +   // Adjust x, y positions to be center of object
          +   evas_object_move(spot, x - (size/2), y - (size/2));
          +   evas_object_show(spot);
          +
          +   return spot;
          +}
          +
          + +

          The rectangle object is stored in Eina_List (ad->spots) for managing other functions. The button_clicked_cb() function removes all evas_objects into the ad->spots list, meaning all spot rectangles are cleared.

          + +
          static void
          +button_clicked_cb(void *data, Evas *evas, Evas_Object *object, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   Evas_Object *spot;
          +
          +   EINA_LIST_FREE(ad->spots, spot)
          +   {
          +      evas_object_del(spot);
          +      spot = NULL;
          +   }
          +   elm_object_text_set(ad->label, "Clear");
          +}
          +
          + +

          Managing Touch Events

          + +

          On the bottom of the create_main_view() function, event callbacks are added to the event rectangle. An event callback is added using the evas_object_event_callback_add() function.

          + +

          The following touch event types are supported:

          +
            +
          • EVAS_CALLBACK_MOUSE_DOWN: This event is called when the given object receives the mouse down event.
          • +
          • EVAS_CALLBACK_MOUSE_UP: This event is called when the given object receives the mouse up event.
          • +
          • EVAS_CALLBACK_MOUSE_MOVE: This event is called when the given object receives the mouse move event.
          • +
          • EVAS_CALLBACK_MULTI_DOWN: This event is called when the given object has already received the mouse down event and receives the multi-mouse down event.
          • +
          • EVAS_CALLBACK_MULTI_UP: This event is called when the given object receives the multi-mouse up event.
          • +
          • EVAS_CALLBACK_MULTI_MOVE: This event is called when the given object receives the multi-mouse move event.
          • +
          +

          If the given object receives a mouse event, a callback function is called, and event information, such as coordinates (x, y positions) is passed. The mousemove_cb() function sets the mouse status, positions text in the label, and draws a spot rectangle. To distinguish down and up positions, set different colors for the down and up rectangles.

          + +
          +static void
          +mousemove_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
          +{
          +   appdata_s *ad = data;
          +   Evas_Object *spot;
          +   char buf[1024];
          +   Evas_Event_Mouse_Move *ev = event_info;
          +   Evas_Coord x = ev->cur.canvas.x;
          +   Evas_Coord y = ev->cur.canvas.y;
          +   int size = (int) 5 * elm_config_scale_get();
          +
          +   if (!ad->down)
          +      return;
          +
          +   snprintf(buf, sizeof(buf), "Mouse Move, %d, %d", x, y);
          +   elm_object_text_set(ad->label, buf);
          +
          +   // Draw spot on event position
          +   spot = create_spot(ad->rect, x, y, size);
          +   evas_object_color_set(spot, 0, 0, 0, 255);
          +   ad->spots= eina_list_append(ad->spots, spot);
          +}
          +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/naviframe_tutorial_n.htm b/org.tizen.ui.practices/html/native/efl/naviframe_tutorial_n.htm new file mode 100644 index 0000000..f3de69b --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/naviframe_tutorial_n.htm @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + Creating a Naviframe for Navigation + + + + + + +
          +

          Creating a Naviframe for Navigation

          + +

          Naviframes are containers useful for implementing interfaces where several screens have a previous/next relationship.

          + +

          This tutorial shows a UI with 3 naviframes. Each naviframe is made of 20 screens, each made up of a label with the text label<n>, a title with the same text, and the Previous and Next buttons, which are used to navigate between the screens.

          +

          The naviframe is "one-way". This means that elements are added, and when the Previous button is clicked, they are removed, and there is no Next button by default. To add the Next button, define a structure that holds the naviframe object along with a stack of the elements that the user has popped by using the Previous button.

          +

          You can also create the elements on the fly each time the Next button is pressed. Both approaches are valid.

          + +

          To create a naviframe:

          +
            +
          1. Create a naviframe_zipper structure:

            +
            +// NOTE: A zipper is a data structure for an ordered set of elements and a
            +// cursor in this set, meaning there are elements before the cursor (which are
            +// stored inside the naviframe) and after (which are stored in the "popped" list
            +struct 
            +naviframe_zipper 
            +{
            +   Evas_Object *naviframe;
            +   Eina_List *popped;
            +};
            +
            +
          2. +
          3. Create a function that factors the creation of several naviframes and initializes the naviframe_zipper structure:

            +
            +static struct naviframe_zipper *
            +_naviframe_add(Evas_Object *parent)
            +{
            +   struct naviframe_zipper *z = malloc(sizeof(struct naviframe_zipper));
            +   z->naviframe = elm_naviframe_add(parent);
            +   z->popped = NULL;
            +
            +   evas_object_size_hint_weight_set(z->naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +   evas_object_size_hint_align_set(z->naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +   evas_object_show(z->naviframe);
            +   // By default, objects are destroyed when they are popped from the naviframe
            +   // To save and reuse them, enable "preserve_on_pop"
            +   elm_naviframe_content_preserve_on_pop_set(z->naviframe, EINA_TRUE);
            +
            +   return z;
            +}
            +
            +
          4. +
          5. +

            Create the buttons that are at the top of the naviframe and allow the user to go back and forth between the screens. The naviframe component builds a Previous button by default, but you can create your own buttons as well. The naviframe has a specific slot for the Next button.

            +
            +// Save the element that is popped from the naviframe
            +static void
            +_naviframe_prev(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
            +{
            +   struct naviframe_zipper *z = data;
            +   z->popped = eina_list_prepend(z->popped, elm_naviframe_item_pop(z->naviframe));
            +}
            +
            +// Set the first element after the current one available and push it to the naviframe
            +static void
            +_naviframe_next(void *data, Evas_Object *o __UNUSED__, void *event_info __UNUSED__)
            +{
            +   struct naviframe_zipper *z = data;
            +   Evas_Object *label, *prev, *next;
            +   const char *text;
            +   Elm_Object_Item *it;
            +
            +   label = eina_list_data_get(z->popped);
            +   z->popped = eina_list_remove_list(z->popped, z->popped);
            +   if (label != NULL) 
            +   {
            +      // UI component is saved inside the naviframe but nothing more 
            +      // You need to create new buttons and set the title text again 
            +      // (copy the one from the label that is saved)
            +      text = elm_object_text_get(label);
            +      // _button function creates a button which is
            +      // either Previous (-1) or Next (1)
            +      prev = _button(z, -1);
            +      next = _button(z, 1);
            +      it = elm_naviframe_item_push(z->naviframe, text, prev, next, label, NULL);
            +   }
            +}
            +
            +
          6. +
          7. +

            Populate the naviframe when the naviframe and the pages that go inside it are built.

            +

            Remember that 3 naviframes are created, each populated in a different way. The common bits have been factored out as a function and the specific parts are executed through a callback. The generic function is shown in the following example.

            +
            +// Generic naviframe-populate function:
            +// Its third (and last) parameter is a callback for customization. It pushes
            +// the new items to a specific position and returns a "context" value that is
            +// used between its calls and enables behaviors such as "push after the
            +// previously pushed item" 
            +static struct naviframe_zipper*
            +_naviframe_populate_gen(Evas_Object *parent, const char *id,
            +                        void * (*populate_cb) (Evas_Object *nav, const char *title, Evas_Object
            +                        *prev, Evas_Object *next, Evas_Object *label, Elm_Object_Item *context))
            +{
            +   struct naviframe_zipper *z;
            +   Evas_Object *label, *prev, *next;
            +   Elm_Object_Item *context = NULL;
            +   char buf[256];
            +   int i;
            +
            +   z = _naviframe_add(parent);
            +
            +   for (i = 0; i < 20; i++) 
            +   {
            +      label = elm_label_add(z->naviframe);
            +      snprintf(buf, sizeof(buf), "%s [%d]", id, i);
            +      elm_object_text_set(label, buf);
            +      evas_object_show(label);
            +      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);
            +      // _button function creates a button which is
            +      // either Previous (-1) or Next (1)
            +      prev = _button(z, -1);
            +      next = _button(z, 1);
            +      // Use the populate_cb callback to provide the customization of the way the
            +      // elements are added inside the naviframe
            +      context = populate_cb(z->naviframe, buf, prev, next, label, context);
            +   }
            +
            +   return z;
            +}
            +
            +

            The prototype of the callbacks is fairly large, but that is because of the syntax for callbacks in C.

            +
            +// Push items one after the other
            +static Elm_Object_Item *
            +_populate_cb__push(Evas_Object *nav, const char *title,
            +                   Evas_Object *prev, Evas_Object *next, Evas_Object *label,
            +                   Elm_Object_Item *context)
            +{
            +   return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
            +}
            +
            +// Push items one after the other but use insert_after
            +static Elm_Object_Item *
            +_populate_cb__push_then_insert_after(Evas_Object *nav, const char *title,
            +                                     Evas_Object *prev, Evas_Object *next, Evas_Object *label,
            +                                     Elm_Object_Item *context)
            +{
            +   if (context == NULL) 
            +   {
            +      return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
            +   }
            +   else 
            +   {
            +      return elm_naviframe_item_insert_after(nav, context, title, prev, next, label, NULL);
            +   }
            +}
            +
            +// Push one item and repeatedly insert new items before the last inserted item
            +static Elm_Object_Item *
            +_populate_cb__push_then_insert_before(Evas_Object *nav, const char *title,
            +                                      Evas_Object *prev, Evas_Object *next, Evas_Object *label,
            +                                      Elm_Object_Item *context)
            +{
            +   if (context == NULL) 
            +   {
            +      return elm_naviframe_item_push(nav, title, prev, next, label, NULL);
            +   }
            +   else 
            +   {
            +      return elm_naviframe_item_insert_before(nav, context, title, prev, next, label, NULL);
            +   }
            +}
            +
            +
          8. +
          9. +

            Create a window with a vertical box, which holds the 3 naviframes from the Appcore's app_create callback.

            + +
            +static bool
            +_app_create(void *data)
            +{
            +   Evas_Object *w, *box;
            +   struct naviframe_zipper *z;
            +
            +   w = elm_win_util_standard_add("Naviframe Test", "Naviframe Test");
            +
            +   box = elm_box_add(w);
            +   elm_box_horizontal_set(box, EINA_FALSE);
            +   elm_box_homogeneous_set(box, EINA_TRUE);
            +   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);
            +   elm_win_resize_object_add(w, box);
            +
            +   z = _naviframe_populate_gen(w, "Before", _populate_cb__push_then_insert_before);
            +   elm_box_pack_end(box, z->naviframe);
            +
            +   z = _naviframe_populate_gen(w, "After", _populate_cb__push_then_insert_after);
            +   elm_box_pack_end(box, z->naviframe);
            +
            +   z = _naviframe_populate_gen(w, "Push", _populate_cb__push);
            +   elm_box_pack_end(box, z->naviframe);
            +
            +   evas_object_show(w);
            +}
            +
            +
          10. +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/notification_window_n.htm b/org.tizen.ui.practices/html/native/efl/notification_window_n.htm new file mode 100644 index 0000000..6c0fbff --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/notification_window_n.htm @@ -0,0 +1,426 @@ + + + + + + + + + + + + + Notification Windows: Supporting Notification Levels, Screenshots, and Input Generators + + + + + +
          + +

          Notification Windows: Supporting Notification Levels, Screenshots, and Input Generators

          + +

          The EFL UTIL utility package supports the following EFL functionalities:

          + + + + +

          Notification Window and Level

          + +

          The EFL UTIL API allows you to set and get the notification level of the notification window (which is of the EFL window type):

          + +
          • efl_util_set_notification_window_level()
          • +
          • efl_util_get_notification_window_level()
          + +

          To understand notification levels, you must first learn about the Tizen window layer hierarchy. Window layers are logical containers used to control the window stack order. Each window belongs to 1 layer and can change the stack order in the layer. Windows in same layer are always placed on or under a window in another layer. In addition to the default "normal layer", there exists a "notification layer", which is always placed above the normal layer.

          + + +

          Figure: Window layers

          +

          Window layers

          + + +

          Each window is set to a specific layer according to its type or properties. Most application windows belong to the normal layer. However, in case of an important alarm or other information crucial to the user, you can set the window to belong to the notification layer. This ensures that the user notices the information immediately, because the window belonging to the notification layer is always shown above the windows in the normal layer.

          + +

          Using the Notification Windows

          + +

          A window that belongs to the notification layer is called a "notification window". To make a notification window:

          + +
          1. Set the window type to NOTIFICATION, by calling the elm_win_add() function with the third parameter set to ELM_WIN_NOTIFICATION.
          2. +
          3. Set the notification level by calling the efl_util_set_notification_window_level() function. +

            The notification level defines the priority of the window, and the notification layer contains 3 levels (EFL_UTIL_NOTIFICATION_LEVEL_1, EFL_UTIL_NOTIFICATION_LEVEL_2, and EFL_UTIL_NOTIFICATION_LEVEL_3).

            +

            The default notification window level is EFL_UTIL_NOTIFICATION_LEVEL_1. Most of notification windows can be set to this level. The EFL_UTIL_NOTIFICATION_LEVEL_2 is a higher level than EFL_UTIL_NOTIFICATION_LEVEL_1, which means that the window set to EFL_UTIL_NOTIFICATION_LEVEL_2 is always on the EFL_UTIL_NOTIFICATION_LEVEL_1 level window. The EFL_UTIL_NOTIFICATION_LEVEL_3 is the highest level in notification windows. Very few applications can use this level.

            + +

            If there are notification windows that have the same level, the most recently created notification window is placed on top of the other window.

            + +
          + +

          Figure: Notification levels

          +

          Notification levels

          + +

          In general, notification levels in Tizen are used as follows:

          +
            +
          • NOTIFICATION_LEVEL_1 is the basic level which is used as a normal notification popup.
          • +
          • NOTIFICATION_LEVEL_2 is used for the lock screen window.
          • +
          • NOTIFICATION_LEVEL_3, the highest layer, is used in case the user needs to be notified in any circumstances. For example, the incoming call popup can use this level.
          • +
          + +

          The following code snippets shown how to make a notification window with a higher level.

          + +
          +#include <Elementary.h>
          +#include <efl_util.h>
          +#include <dlog.h>
          +
          +static Evas_Object *create_win(const char *name)
          +{
          +   Evas_Object *eo;
          +   efl_util_error_e error;
          +   // Create the NOTIFICATION window object
          +   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          +
          +   if (!eo) return NULL;
          +
          +   // Set the NOTIFICATION level
          +   error = efl_util_set_notification_window_level(eo, EFL_UTIL_NOTIFICATION_LEVEL_1);
          +
          +   elm_win_title_set(eo, name);
          +   elm_win_autodel_set(eo, EINA_TRUE); 
          +   evas_object_smart_callback_add(eo, "delete,request", _quit_cb, NULL); 
          +	
          +   return eo;
          +}
          + +

          Use the efl_util_get_notification_window_level() function to get the currently set notification level of a window. If the window is not of the notification type, the function returns the -EFL_UTIL_ERROR_NOT_SUPPORTED_WINDOW_TYPE error.

          +
          +#include <Elementary.h>
          +#include <efl_util.h>
          +#include <dlog.h>
          +
          +void get_notification_level (Evas_Object *eo)
          +{
          +   efl_util_error_e error;
          +   efl_util_notification_level_e  notification_level;
          +
          +   if (!eo) return;
          +
          +   // Get the window notification level
          +   error = efl_util_get_notification_window_level (eo, &notification_level);
          +
          +   // Check the return value
          +   if (error== EFL_UTIL_ERROR_NONE)
          +   {
          +      switch (notification_level)
          +      {
          +         case EFL_UTIL_NOTIFICATION_LEVEL_1:
          +            // Do something for level 1
          +            break;
          +
          +         case EFL_UTIL_NOTIFICATION_LEVEL_2:
          +            // Do something for level 2
          +            break;
          +      }
          +   }
          +   else
          +   {
          +      // Error handling
          +   }
          +}
          + +

          Screenshot

          + +

          The EFL UTIL SCREENSHOT API (in mobile and wearable applications) allows you to get the screen image to the user.

          + +

          First you must make the efl_util_screenshot_h structure and initialize the structure members with the efl_util_screenshot_initialize() function. To take the actual screenshot, create screen capture data and return it to the tbm_surface handler with the efl_util_screenshot_take_tbm_surface() function.

          +

          When no longer needed, remember to free the efl_util_screenshot_h structure with the efl_util_screenshot_deinitialize() function.

          + + +

          Input Generator

          + +

          The EFL UTIL INPUT API (in mobile and wearable applications) allows you to generate input events (such as key and touch events).

          + +

          First you must create the efl_util_inputgen_h structure and initialize the structure members with the efl_util_input_initialize_generator() function. To generate actual key or touch events, use the efl_util_input_generate_key() or efl_util_input_generate_touch() function.

          +

          When no longer needed, remember to free the efl_util_inputgen_h structure with the efl_util_input_deinitialize_generator() function.

          + + + + +

          Initializing EFL Utility

          + +

          To use the EFL UTIL API, the following header file has to be included:

          +
          #include <efl_util.h>
          + +

          Creating a Notification Window and Setting a Notification Window Level

          + +

          To create a notification window and set the window level, use the efl_util_set_notification_window_level() function. If the window type is not notification type, the function returns an error.

          +
          #include <Elementary.h>
          +#include <dlog.h>
          +
          +void create_win() 
          +{
          +   Evas_Object *eo;
          +   efl_util_error_e error;
          +   char *name = "Notification window";
          +   
          +   // Create notification window
          +   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          +   if (!eo) return;
          +   
          +   // Set notification level
          +   error = efl_util_set_notification_window_level
          +           (eo, EFL_UTIL_NOTIFICATION_LEVEL_1);
          +   if (error != EFL_UTIL_ERROR_NONE)
          +   {
          +      // Do error handling
          +   }
          +}
          +
          + +

          Getting the Notification Window Level

          + +

          To get the notification window level, use the efl_util_get_notification_window_level() function:

          + +
          void create_win() 
          +{
          +   Evas_Object *eo;
          +   efl_util_error_e error;
          +   efl_util_notification_level_e notification_level;
          +   char *name = "Notification window";
          +   
          +   // Create notification window
          +   eo = elm_win_add(NULL, name, ELM_WIN_NOTIFICATION);
          +   if (!eo) return;
          +   
          +   // Get notification level
          +   error = efl_util_get_notification_window_level
          +           (eo, &notification_level);
          +   if (error == EFL_UTIL_ERROR_NONE) 
          +   {
          +      switch (notification_level) 
          +      {
          +         case EFL_UTIL_NOTIFICATION_LEVEL_1:
          +            // Do something for notification level 1
          +            break;
          +         case EFL_UTIL_NOTIFICATION_LEVEL_2:
          +            // Do something for notification level 2
          +            break;
          +      }
          +   }
          +}
          + +

          Getting a Screenshot

          + +

          To get a screenshot:

          + +
          1. Initialize with the efl_util_screenshot_initialize() function: +
            +#include <tbm_surface.h>
            +#include <X11/Xlib.h>
            +
            +void capture()
            +{
            +   efl_util_screenshot_h screenshot = NULL;
            +   tbm_surface_h tbm_surface = NULL;
            +   tbm_surface_info_s tsuri;
            +
            +   screenshot = efl_util_screenshot_initialize(width, height);
            +
          2. + +
          3. After getting the efl_util_screenshot_h structure, execute the efl_util_screenshot_take_tbm_surface() function to get the tbm_surface handler which has the screenshot data. +
            +   if (screenshot) 
            +   {
            +      tbm_surface = efl_util_screenshot_take_tbm_surface(screenshot);
            +      if (tbm_surface) 
            +      {
            +         // Treat tbm_surface handler (screenshot data)
            +      }
            +
          4. + +
          5. Free the resources with the efl_util_screenshot_deinitialize() function: +
            +      efl_util_screenshot_deinitialize(screenshot);
            +   }
            +}
          + +

          Generating a Key Input Event

          + +

          To generate key input events:

          + +
          1. Execute the efl_util_input_initialize_generator() function: +
            +void key_event_generator()
            +{
            +   int ret = EFL_UTIL_ERROR_NONE;
            +   efl_util_inputgen_h inputgen = NULL;
            +
            +   inputgen = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_KEYBOARD);
            +   if (!inputgen)
            +   {
            +      // Failed to initialize the input generator system
            +
            +      return;
            +   }
            +
            +
          2. + +
          3. After setting input device type, execute the efl_util_input_generate_key() function to generate key input events: +
            +   ret = efl_util_input_generate_key(inputgen, "XF86Menu", 1);
            +   if (ret != EFL_UTIL_ERROR_NONE) 
            +   {
            +      // Failed to generate a "XF86Menu" key press event
            +      ret = efl_util_input_deinitialize_generator(inputgen);
            +      if (ret != EFL_UTIL_ERROR_NONE)
            +      {
            +         // Failed to deinitialize the input generator system
            +      }
            +      return;
            +   }
            +
            +   ret = efl_util_input_generate_key(inputgen, "XF86Menu", 0);
            +   if (ret != EFL_UTIL_ERROR_NONE) 
            +   {
            +      // Failed to generate a "XF86Menu" key release event
            +      ret = efl_util_input_deinitialize_generator(inputgen);
            +      if (ret != EFL_UTIL_ERROR_NONE)
            +      {
            +         // Failed to deinitialize the input generator system
            +      }
            +      return;
            +   }
            +
          4. + +
          5. Free the resources with the efl_util_input_deinitialize_generator() function: +
            +   ret = efl_util_input_deinitialize_generator(inputgen);
            +   if (ret != EFL_UTIL_ERROR_NONE)
            +   {
            +      // Failed to deinitialize the input generator system
            +   }
            +}
            +
          + + + +

          Generating a Touch Input Event

          + +

          To generate touch input events:

          + +
          1. Execute the efl_util_input_initialize_generator() function: +
            +void touch_event_generator()
            +{
            +   int ret = EFL_UTIL_ERROR_NONE;
            +   efl_util_inputgen_h inputgen = NULL;
            +
            +   inputgen = efl_util_input_initialize_generator(EFL_UTIL_INPUT_DEVTYPE_TOUCHSCREEN);
            +   if (!inputgen)
            +   {
            +      // Failed to initialize the input generator system
            +
            +      return;
            +   }
            +
          2. +
          3. After setting input device type, execute the efl_util_input_generate_touch() function to generate touch input events: +
            +   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_BEGIN, 100, 100);
            +   if (ret != EFL_UTIL_ERROR_NONE) 
            +   {
            +      // Failed to generate a first finger touch press event on (100, 100)
            +      ret = efl_util_input_deinitialize_generator(inputgen);
            +      if (ret != EFL_UTIL_ERROR_NONE)
            +      {
            +         // Failed to deinitialize the input generator system
            +      }
            +      return;
            +   }
            +   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_UPDATE, 110, 110);
            +   if (ret != EFL_UTIL_ERROR_NONE) 
            +   {
            +      // Failed to generate a first finger touch move event to (110, 110)
            +      ret = efl_util_input_deinitialize_generator(inputgen);
            +      if (ret != EFL_UTIL_ERROR_NONE)
            +      {
            +         // Failed to deinitialize the input generator system
            +      }
            +
            +      return;
            +   }
            +   ret = efl_util_input_generate_touch(inputgen, 0, EFL_UTIL_INPUT_TOUCH_END, 110, 110);
            +   if (ret != EFL_UTIL_ERROR_NONE) 
            +   {
            +      // Failed to generate a first finger touch release event to (110, 110)
            +      ret = efl_util_input_deinitialize_generator(inputgen);
            +      if (ret != EFL_UTIL_ERROR_NONE)
            +      {
            +         // Failed to deinitialize the input generator system
            +      }
            +
            +      return;
            +   }
            +
          4. +
          5. Free the resources with the efl_util_input_deinitialize_generator() function: +
            +   ret = efl_util_input_deinitialize_generator(inputgen);
            +   if (ret != EFL_UTIL_ERROR_NONE)
            +   {
            +      // Failed to deinitialize the input generator system
            +   }
            +}
            +
          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/panes_tutorial_mn.htm b/org.tizen.ui.practices/html/native/efl/panes_tutorial_mn.htm new file mode 100644 index 0000000..362b985 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/panes_tutorial_mn.htm @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + Creating Panes + + + + + + +
          +

          Creating Panes

          + + +

          This tutorial explains how to use panes in the application.

          + +

          This feature is supported in mobile applications only.

          + +

          Initializing the Panes Application

          + +

          Create a window entitled Panes tutorial, composed of a conformant component that contains a naviframe component.

          +
          +#include <Elementary.h>
          +#include <app.h>
          +
          +struct _appdata 
          +{
          +   const char *name;
          +   Evas_Object *win;
          +};
          +
          +static void app_terminate(void *user_data)
          +{
          +   struct _appdata *ad;
          +
          +   if (!user_data)
          +      return;
          +
          +   ad = user_data;
          +
          +   if (ad->win)
          +      evas_object_del(ad->win);
          +}
          +
          +static bool app_create(void *user_data)
          +{
          +   struct _appdata *ad;
          +   Evas_Object *win, *conformant, *naviframe, *panes, *panes_h, *nav_it, *bt;
          +
          +   if (!user_data)
          +      return false;
          +
          +   ad = user_data;
          +
          +   // Create window 
          +   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
          +   win = elm_win_util_standard_add("panes", "Panes tutorial");
          +   elm_win_autodel_set(win, EINA_TRUE);
          +
          +   if (!win)
          +      return false;
          +
          +   ad->win = win;
          +
          +   // Add elm_conformant 
          +   conformant = elm_conformant_add(win);
          +   elm_win_resize_object_add(win, conformant);
          +   evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   evas_object_show(conformant);
          +
          +   // Add naviframe to conformant 
          +   naviframe = elm_naviframe_add(conformant);
          +   elm_object_content_set(conformant, naviframe);
          +   evas_object_show(naviframe);
          +
          +   evas_object_resize(win, 320, 400);
          +   evas_object_show(win);
          +
          +   return true;
          +}
          +
          +int main(int argc, char **argv)
          +{
          +   appdata_s *ad = {0,};
          +   int ret = 0;
          +
          +   ui_app_lifecycle_callback_s event_callback = {0,};
          +   app_event_handler_h handlers[5] = {NULL,};
          +
          +   event_callback.create = app_create;
          +   event_callback.terminate = app_terminate;
          +   event_callback.pause = app_pause;
          +   event_callback.resume = app_resume;
          +   event_callback.app_control = app_control;
          +
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
          +   ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
          +   ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
          +
          +   ret = ui_app_main(argc, argv, &event_callback, &ad);
          +
          +   return ret;
          +}
          +
          + + +

          Creating a Panes Component

          + +

          To add a new panes object to the application, do it within the _create() function.

          + +

          When you create a panes component, the elm_panes component adds a draggable bar between 2 contents. When dragged, this bar resizes the contents' size. To create a new panes component into an Elementary object, use the elm_panes_add() function.

          +

          In the following example, the panes component is created and added in the naviframe:

          +
          +// Add an elm_panes 
          +panes = elm_panes_add(naviframe);
          +evas_object_size_hint_weight_set(panes, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +elm_win_resize_object_add(win, panes);
          +evas_object_show(panes);
          +
          +nav_it = elm_naviframe_item_push(naviframe, "Panes view", NULL, NULL, panes, NULL);
          +
          + + +

          Configuring the Panes

          + +

          To configure the panes component:

          +
            +
          • +

            Modify the panes component orientation with the elm_panes_horizontal_set() function.

            +

            By default, the orientation of the panes component is vertical.

            +
            +// Add a horizontal elm_panes 
            +panes_h = elm_panes_add(naviframe);
            +elm_panes_horizontal_set(panes_h, EINA_TRUE);
            +
            +

            The above code creates a panes object and sets the horizontal orientation. To add content in a panes, use the elm_object_part_content_set() function. In the following example, a horizontal panes component (panes_h) is added to the "left" part of the panes component (panes) created in the previous use case.

            +
            +elm_object_part_content_set(panes, "left", panes_h);
            +
            +
          • +
          • +

            Set a button object to the "right" side of the vertical panes component:

            +
            +// Create a button object 
            +bt = elm_button_add(naviframe);
            +elm_object_text_set(bt, "Right");
            +evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(bt);
            +
            +// Set the button object to the "right" part of the vertical panes 
            +elm_object_part_content_set(panes, "right", bt);
            +
            +
          • +
          • +

            Set the content of the horizontal panes component with 2 button objects (up and down).

            +

            When populating a vertically displayed panes component, the left content is placed at the top, and the right content is placed at the bottom.

            +
            +// Create an "Up" button 
            +bt = elm_button_add(naviframe);
            +elm_object_text_set(bt, "Up");
            +evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(bt);
            +elm_object_part_content_set(panes_h, "left", bt);
            +
            +// Create a "Down" button 
            +bt = elm_button_add(naviframe);
            +elm_object_text_set(bt, "Down");
            +evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
            +evas_object_show(bt);
            +elm_object_part_content_set(panes_h, "right", bt);
            +
            +
          • +
          • +

            Resize the panes component.

            +

            To change the size of the panes component, drag the elm_panes with the mouse. The proportion can also be set with the elm_panes_content_left_size_set() and elm_panes_content_right_size_set() functions. The following example shows how to set the left size of both panes to 80%.

            +
            +// Set the proportion of the panes to 80% 
            +elm_panes_content_left_size_set(panes, 0.8);
            +elm_panes_content_left_size_set(panes_h, 0.8);
            +
            +
          • +
          • +

            Set a fixed size for the panes component's size and proportions with the elm_panes_fixed_set() function.

            +
            +// Fix the panes proportion 
            +elm_panes_fixed_set(panes_h, EINA_TRUE);
            +
            +
          • +
          + +

          Figure: Panes tutorial

          +

          Panes tutorial

          + +

          Handling Signals

          + +

          The panes component emits 4 different signals, depending on the user interaction with the draggable bar:

          +
            +
          • clicked - Pane is clicked. +

            The following example, a callback function is registered to the vertical panes component, and it prints Clicked to standard output:

            +
            +// clicked callback 
            +static void
            +_clicked_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   dlog_print(DLOG_INFO, PANES_TAG, "Clicked\n");
            +}
            +
            +evas_object_smart_callback_add(panes, "clicked", _clicked_cb, panes);
            +
            +
          • + +
          • press - Pane is pressed. +

            The following example, a callback function is registered to the vertical panes component, and it prints Pressed to standard output:

            +
            +// press callback 
            +static void
            +_press_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   dlog_print(DLOG_INFO, PANES_TAG, "Pressed\n");
            +}
            +
            +evas_object_smart_callback_add(panes, "press", _press_cb, panes);
            +
            +
          • + +
          • unpressed - Pane is released after being pressed. +

            The following example, a callback function is registered to the vertical panes component, and it prints the proportion size of the left content of the panes component to standard output using the elm_panes_content_left_size_get() function:

            +
            +// unpress callback 
            +static void
            +_unpress_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   dlog_print(DLOG_INFO, PANES_TAG, "Unpressed, size : %f\n",
            +              elm_panes_content_left_size_get(obj));
            +}
            +
            +evas_object_smart_callback_add(panes, "unpress", _unpress_cb, panes);
            +
            +
          • + +
          • clicked,double - Pane is double-clicked. +

            The following example, a callback function is registered to the vertical panes component. It hides the left part of the panes component and sets the left proportion to 0.0. To restore the left part proportion with a double-click on the hidden part of the panes component, use the elm_panes_content_left_size_get() and elm_panes_content_left_size_set() functions, and a variable to store the value of the current proportion.

            + +
            +// clicked,double callback 
            +static void
            +_clicked_double_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   static double size = 0.0;
            +   double tmp_size = 0.0;
            +   tmp_size = elm_panes_content_left_size_get(obj);
            +   if (tmp_size > 0)
            +   {
            +      elm_panes_content_left_size_set(obj, 0.0);
            +      dlog_print(DLOG_INFO, PANES_TAG, "Double clicked, hidden.\n");
            +   }
            +   else
            +   {
            +      elm_panes_content_left_size_set(obj, size);
            +      dlog_print(DLOG_INFO, PANES_TAG,
            +                 "Double clicked, restoring size.\n");
            +   }
            +   size = tmp_size;
            +}
            +
            +evas_object_smart_callback_add(panes, "clicked,double", _clicked_double_cb, panes);
            +
            +
          • +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/popup_tutorial_wn.htm b/org.tizen.ui.practices/html/native/efl/popup_tutorial_wn.htm new file mode 100644 index 0000000..89d6648 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/popup_tutorial_wn.htm @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + Creating Wearable Popups + + + + + + +
          +

          Creating Wearable Popups

          + + +

          This tutorial teaches the basics of popup component interactions.

          + +

          This feature is supported in wearable applications only.

          + +

          Initializing the Popup Application

          + +

          Create an application with a window entitled Popup Basic Tutorial. The window consists of a conformant component, and you can add the popup inside the conformant with the create_popup() function.

          + +
          +static void
          +create_base_gui(appdata_s *ad)
          +{
          +   // Window
          +   ad->win = elm_win_util_standard_add("main", "Popup Basic Tutorial");
          +   elm_win_autodel_set(ad->win, EINA_TRUE);
          +
          +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          +   eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
          +
          +   // Conformant
          +   ad->conform = elm_conformant_add(ad->win);
          +   elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
          +   elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
          +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_win_resize_object_add(ad->win, ad->conform);
          +   evas_object_show(ad->conform);
          +
          +   create_popup(ad->conform);
          +
          +   // Show the window after the base GUI is set up
          +   evas_object_show(ad->win);
          +}
          +
          +static bool
          +app_create(void *data)
          +{
          +   appdata_s *ad = data;
          +   create_base_gui(ad);
          +
          +   return true;
          +}
          +
          +int
          +main(int argc, char **argv)
          +{
          +   struct app_data ad = {0,};
          +   ui_app_lifecycle_callback_s event_callback = {0,};
          +
          +   event_callback.create = app_create;
          +
          +   return ui_app_main(&argc, &argv, &event_callback, &ad);
          +}
          + +

          Using Popup Styles

          + +

          To create popups using various styles:

          + +
          • Create a basic text-only popup: + +
            +Evas_Object *popup;
            +struct appdata *ad;
            +ad = (struct appdata *) data;
            +
            +popup = elm_popup_add(ad->win_main);
            +evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            +eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            +elm_object_text_set(popup, "This has only texts");
            +evas_object_show(popup);
            +
          • + +
          • Create a popup with a title and text. The title,text attribute is the title area text part that defines the title label. +
            +Evas_Object *popup;
            +struct appdata *ad;
            +ad = (struct appdata *) data;
            +
            +popup = elm_popup_add(ad->win_main);
            +evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            +elm_object_part_text_set(popup, "title,text", "Title");
            +elm_object_text_set(popup,"This Popup has title area and text");
            +eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            +evas_object_show(popup);
            +
          • + +
          • Create a popup with a title, text, and 2 buttons: +
            +Evas_Object *popup;
            +Evas_Object *btn;
            +struct appdata *ad = (struct appdata *) data;
            +
            +popup = elm_popup_add(ad->win_main);
            +evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            +elm_object_part_text_set(popup, "title,text", "Title");
            +eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            +elm_object_text_set(popup, "This is title text 2button popup");
            +
            +btn = elm_button_add(popup);
            +elm_object_style_set(btn, "popup");
            +evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_object_text_set(btn, "Cancel");
            +elm_object_part_content_set(popup, "button1", btn);
            +evas_object_smart_callback_add(btn, "clicked", _response_cb, popup);
            +
            +btn = elm_button_add(popup);
            +elm_object_style_set(btn, "popup");
            +evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_object_text_set(btn, "OK");
            +elm_object_part_content_set(popup, "button2", btn);
            +evas_object_smart_callback_add(btn, "clicked", _response_cb, popup);
            +
            +evas_object_show(popup);
            +
          • + +
          • Create a toast popup: +
            +Evas_Object *popup;
            +struct appdata *ad = (struct appdata *) data;
            +
            +popup = elm_popup_add(ad->win_main);
            +elm_object_style_set(popup, "toast");
            +elm_popup_orient_set(popup, ELM_POPUP_ORIENT_BOTTOM);
            +evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
            +elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
            +eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, eext_popup_back_cb, NULL);
            +elm_object_part_text_set(popup,"elm.text", "Saving Contacts to sim");
            +
            +evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
            +elm_popup_timeout_set(popup, 2.0);
            +evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
            +
            +evas_object_show(popup);
            +
          • +
          + +

          Managing Popup Events

          +

          The Elementary popups respond to user interactions with several events.

          +

          To manage popup events:

          + +
            +
          • Handle timeout events: +

            The timeout event is triggered whenever a popup is closed as a result of a timeout:

            +
            +static void 
            +_timeout_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   evas_object_del(obj);
            +}
            +elm_popup_timeout_set(popup, 3.0);
            +evas_object_smart_callback_add(popup, "timeout", _timeout_cb, NULL);
            +
          • + +
          • Handle block clicked events: +

            The block,clicked event is triggered whenever the user taps on a blocked event area:

            +
            +static void 
            +_block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
            +{
            +   evas_object_del(obj);
            +}
            +evas_object_smart_callback_add(popup, "block,clicked", _block_clicked_cb, NULL);
            +
          • + +
          + + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/resource_fallback_n.htm b/org.tizen.ui.practices/html/native/efl/resource_fallback_n.htm new file mode 100644 index 0000000..efe9679 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/resource_fallback_n.htm @@ -0,0 +1,164 @@ + + + + + + + + + + + + + Resource Fallback Support + + + + + +
          + +

          Resource Fallback Support

          + +

          Tizen native applications can run on different types of devices, such as wearable, phone, tablets, and TVs. Tizen also supports various resolutions (WVGA ~ XQXGA) and resources. Regardless of these advantages, remember that you must always polish your work to create an optimal application for each device.

          + +

          For more information, see Resource Explorer.

          + +

          Providing an Alternative Image Set through Edje

          +

          The image set elements are used to display a specific image on the screen based on the container size. The image sets can have the following properties:

          +
          • name: image-name +

            Specifies the name of the image file.

          • +
          • size: minw minh maxw maxh +

            Specifies the minimum and maximum size that causes a specified image to be selected and shown. The image set is used to control the resource quality when the image part is scaled to multiple devices. According to the size of the part's container, an appropriate image is loaded.

          + + + + + + + +
          +
          +collections 
          +{
          +   group 
          +   {
          +      name: "property_test";
          +
          +      images 
          +      {
          +         set 
          +         {
          +            name: "alternative_animal";
          +            image 
          +            {
          +               image: "pig.png" COMP;
          +               size: 640 800 1200 1500;
          +            }
          +            image 
          +            {
          +               image: "monkey.png" COMP;
          +               size: 400 500 639 799;
          +            }
          +            image 
          +            {
          +               image: "cat.png" COMP;
          +               size: 240 300 399 499;
          +            }
          +            image 
          +            {
          +               image: "mouse.png" COMP;
          +               size: 80 100 239 299;
          +            }
          +            image 
          +            {
          +               image: "snail.png" COMP;
          +               size: 0 0 79 99;
          +            }
          +         }
          +      }
          +
          +      parts 
          +      {
          +         part 
          +         {
          +            name: "image1";
          +            description 
          +            {
          +               state: "default" 0.0;
          +               rel1 {relative: 0.0 0.0;}
          +               rel2 {relative: 1.0 0.45;}
          +               image.normal: "alternative_animal";
          +               aspect: 4/5 4/5;
          +               aspect_preference: BOTH;
          +            }
          +         }
          +         part 
          +         {
          +            name: "image2";
          +            description 
          +            {
          +               state: "default" 0.0;
          +               rel1 {relative: 0.0 0.5;}
          +               rel2 {relative: 1.0 0.75;}
          +               image.normal: "alternative_animal";
          +               aspect: 4/5 4/5;
          +               aspect_preference: BOTH;
          +            }
          +         }
          +         part 
          +         {
          +            name: "image3";
          +            description 
          +            {
          +               state: "default" 0.0;
          +               rel1 {relative: 0.0 0.8;}
          +               rel2 {relative: 1.0 1.0;}
          +               image.normal: "alternative_animal";
          +               aspect: 4/5 4/5;
          +               aspect_preference: BOTH;
          +            }
          +         }
          +      }
          +   }
          +}	 
          +
          +

          Image set

          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.guides/html/native/efl/rotary_events_n.htm b/org.tizen.ui.practices/html/native/efl/rotary_events_n.htm old mode 100755 new mode 100644 similarity index 100% rename from org.tizen.ui.guides/html/native/efl/rotary_events_n.htm rename to org.tizen.ui.practices/html/native/efl/rotary_events_n.htm diff --git a/org.tizen.ui.practices/html/native/efl/rotary_events_wn.htm b/org.tizen.ui.practices/html/native/efl/rotary_events_wn.htm new file mode 100644 index 0000000..3608a56 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/rotary_events_wn.htm @@ -0,0 +1,276 @@ + + + + + + + + + + + + + Managing Rotary Events + + + + + +
          +

          Managing Rotary Events

          + + +

          You can use various functions to work with the rotary events. The functions manage the rotary events, which are fired from the rotary device and delivered to a suitable target. To receive rotary events, you must define an event callback or a handler function, and register it using the EFL Extension functions. There are 2 ways to receive the rotary events: the rotary event handler and the rotary object event callback.

          + +

          This feature is supported in wearable applications only.

          + +

          Rotary Event Handler

          + +

          The rotary event handler is suitable when you want to handle rotary events without taking care about an Evas Object or when the application is not implemented using an Evas Object. The handler works like the Ecore event in EFL:

          + +
          • The application registers a rotary event handler with the eext_rotary_event_handler_add() function.

            + +

            The rotary event handlers are treated "first come first served". It means that the first registered handler is called first when rotary events happens. If the handler returns EINA_TRUE, the next handler is called. Otherwise, EFL Extension stops delivering the rotary events.

            +
          • +
          • To remove a rotary event handler, use the eext_rotary_event_handler_del() function.

          + + + +

          Rotary Object Event Callback

          + +

          The rotary object event callback is suitable when you want EFL Extension to handle the event delivery between objects. It means that EFL Extension manages a callback and an object list and decides which object's callback must be called when rotary events happen:

          + +
          • The application registers a callback using the eext_rotary_object_event_callback_add() function.

            + +

            EFL Extension treats callbacks based on the callback priority. If the application registers callbacks for a same object, the callback with the lowest priority number is called first. If this callback returns EINA_TRUE, the higher priority number is called. The above function registers the rotary event callback with a default priority number (value is 0). To register the rotary event callback with another priority number, use the eext_rotary_object_event_callback_priority_add() function.

          • +
          • To remove a registered callback from an object, use the eext_rotary_object_event_callback_del() function:

          + +

          The rotary events are only delivered to 1 object named the activated object. If there is no activated object, the rotary event is not delivered to any object. If the activated object has registered callbacks and the callbacks return EINA_TRUE, the rotary events are delivered to the upper parents of the activated object until there is 1 callback that consumes the rotary event or it reaches the top parent object.

          +

          To set the object as the activated object, use the eext_rotary_object_event_activated_set() function.

          + +

          Providing the activated parameter with the EINA_TRUE value sets the object as the activated object. Providing the EINA_FALSE value deactivates the object. Since there is only 1 object which is the activated object, if an object is set as the activated object, the previously activated object is deactivated and becomes a normal object. An activated signal named rotary,activated is sent when an object is set as the activated object, and the rotary,deactivated signal is sent when an object is deactivated.

          + +

          You can register callbacks for activated or deactivated signals with the evas_object_smart_callback_add() function.

          + +

          For more information, see the Evas smart callback function.

          + +

          Managing Rotary Events

          + +

          To manage rotary events:

          +
            +
          1. Create the rotary event handler: +
              +
            1. Create the window: +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +Evas_Object *win = NULL;
              +
              +   // Window
              +   win = elm_win_util_standard_add(NULL, "extension circle sample");
              +   elm_win_autodel_set(win, EINA_TRUE);
              +   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb, NULL);
              +
              +   // Show the window after base gui is set up
              +   evas_object_show(win);
              +}
              +
              +
            2. + +
            3. Register the rotary event handler: +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +   // Register the rotary event handler
              +   eext_rotary_event_handler_add(_rotary_handler_cb, NULL);
              +}
              +
            4. +
            5. Define the callback function: +
              +Eina_Bool _rotary_handler_cb(void *data, Eext_Rotary_Event_Info *ev)
              +{
              +   if (ev->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
              +   {
              +      dlog_print(DLOG_DEBUG, LOG_TAG, "ROTARY HANDLER: Rotary device rotated in clockwise direction");
              +   }
              +   else
              +   {
              +      dlog_print(DLOG_DEBUG, LOG_TAG, "Rotary device rotated in counter clockwise direction");
              +   }
              +
              +   return EINA_FALSE;
              +}
              +
              +
            6. + +
            7. Remove the rotary event handler and release all resources when you do not need it anymore. +
              +static void
              +app_terminate(void *data)
              +{
              +   // Release all resources
              +   eext_rotary_event_handler_del(_rotary_handler_cb);
              +}
              +
              +
            8. +
            +
          2. +
          3. Create a rotary event callback for a normal Evas object. +

            When a rotary event occurs, the slider value is adjusted accordingly.

            +
              +
            1. Create the objects. +

              The window and the slider are created using the Elementary APIs.

              +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +   Evas_Object *win = NULL, *slider = NULL;
              +
              +   // Window 
              +   win = elm_win_util_standard_add(NULL, "extension sample");
              +   elm_win_autodel_set(win, EINA_TRUE);
              +   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb, NULL);
              +
              +   // Slider
              +   slider = elm_slider_add(win);
              +   evas_object_size_hint_weight_set(slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +   elm_slider_min_max_set(slider, 0, 50);
              +   elm_slider_step_set(slider, 1.0);
              +   evas_object_show(slider);
              +   elm_win_resize_object_add(win, slider);
              +
              +   // Show the window after the base GUI is set up 
              +   evas_object_show(win);
              +}
              +
              +
            2. +
            3. Register the rotary event callback. +

              To receive the rotary event, register the rotary event callback and set the activated object as the slider object.

              +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +   // Register rotary event callback 
              +   ext_rotary_object_event_callback_add(slider, _rotary_event_cb, NULL);
              +   eext_rotary_object_event_activated_set(slider, EINA_TRUE);
              +}
              +
              +

              Define the rotary callback function:

              +
              +Eina_Bool _rotary_event_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *ev)
              +{
              +   Evas_Object *slider = obj;
              +   int val = elm_slider_value_get(slider);
              +   if (ev->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
              +   {
              +      elm_slider_value_set(slider, val + 1);
              +   }
              +   else
              +   {
              +      elm_slider_value_set(slider, val - 1);
              +   }
              +
              +   return EINA_FALSE;
              +}
              +
              +
            4. +
            +
          4. +
          5. Create a rotary event callback for an EFL Extension object. +

            When a rotary event occurs, the slider value is adjusted accordingly.

            +
              +
            1. Create the objects: +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +   Evas_Object *win = NULL, *conform = NULL;
              +   Eext_Circle_Surface *sur = NULL;
              +
              +   // Window 
              +   win = elm_win_util_standard_add(NULL, "extension circle sample");
              +   elm_win_autodel_set(win, EINA_TRUE);
              +   evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb, NULL);
              +
              +   // Conformant
              +   conform = elm_conformant_add(win);
              +   elm_win_indicator_mode_set(win, ELM_WIN_INDICATOR_SHOW);
              +   elm_win_indicator_opacity_set(win, ELM_WIN_INDICATOR_OPAQUE);
              +   evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
              +   elm_win_resize_object_add(win, conform);
              +   evas_object_show(conform);
              +
              +   // Surface 
              +   sur = eext_circle_surface_conformant_add(conform);
              +
              +   // Slider
              +   slider = eext_circle_object_slider_add(conform, sur);
              +   eext_circle_object_value_min_max_set(slider, 0.0, 30.0);
              +   eext_circle_object_value_set(slider, 0.0);
              +
              +   // Show the window after the base GUI is set up
              +   evas_object_show(win);
              +}
              +
              +
            2. +
            3. Set the activated object. +

              Since the EFL Extension API is used to create the slider object, the created slider object already registers the rotary event callbacks internally. To receive a rotary event, you only need to set the activated object as the desired object (slider).

              +
              +static void
              +create_base_gui(appdata_s *ad)
              +{
              +   // Activate circle slider's rotary object event
              +   // Its value increases/decreases its value by 1.0 to clockwise or 
              +   // counter-clockwise rotary event
              +   eext_rotary_object_event_activated_set(slider, EINA_TRUE);
              +   eext_circle_object_slider_step_set(slider, 1.0);
              +}
              +
              +
            4. +
            +
          6. +
          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/scalability_n.htm b/org.tizen.ui.practices/html/native/efl/scalability_n.htm new file mode 100644 index 0000000..d2d918b --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/scalability_n.htm @@ -0,0 +1,762 @@ + + + + + + + + + + + + + Scalability Support + + + + + +
          + +

          Scalability Support

          +

          To ensure that your application works well in diverse devices, you must consider scalability when designing the application layout:

          + + +

          Key Concepts

          + +

          When designing the application layout to be scalable, you must pay attention to the following key concepts:

          + +
          • Understand the character of the relative position and the fixed position + +

            In the relative position, the size is determined in proportion to the size of the referred object. For example, if an orange rectangle occupies 30% of the green rectangle, and the green rectangle is expanded, the orange rectangle is expanded accordingly. However, if the scaling value is changed and the green rectangle is not scaled, the orange rectangle remains unchanged too.

            + +

            Figure: Relative position

            +

            Relative position

            + +

            In the fixed position, the size is determined by a value set for the object. For example, the orange rectangle set to the size of 10. If the green rectangle is expanded, the orange rectangle does not change. However, if the scaling value is, for example, doubled, the size of the orange rectangle grows to 20.

            + +

            Figure: Fixed position

            +

            Fixed position

          • + +
          • Use the relative position +

            If you set the object size as a percentage, the ratio remains fixed regardless of the changes in the screen size or resolution. If you want the object size changed in proportion of the window size, use the relative position.

            + +

            Figure: Scaling relative position

            +

            Scaling relative position

          • + +
          • Multiply the scaling value, if you use the fixed size +

            If you use the EDC file to set up the layout, you can set the scale in the part element:

            +
            +parts 
            +{
            +   part 
            +   { 
            +      name: "box"; 
            +      type: RECT;
            +      scale: 1;
            +   }
            +}
            +
            + +

            If you set the fixed size in C code, you can use the ELM_SCALE_SIZE macro:

            +
            evas_object_size_hint_min_set(object, ELM_SCALE_SIZE(100), ELM_SCALE_SIZE(100));
            + +

            For more information see Applying the Base Scale.

          • + +
          • Do not fill the width or height out with a fixed size only +

            If you fill the entire height out with a fixed size only and it is scaled, the end result can be larger than the screen size.

            + +

            Figure: Height filled with a fixed size

            +

            Height filled with a fixed size

            + +

            If you set a partial width or height with a fixed size and leave the remaining area flexible, the layout does not expand outside the screen.

            + +

            Figure: Height with a flexible area

            +

            Height with a flexible area

          + + + +

          Scalability Using Elementary UI Components

          + +

          The Tizen platform provides a UI component toolkit library, called Elementary, that includes an extensive set of UI components. You can use elementary UI components to compose your application user interface (UI). While creating the UI, you can set specific properties for the UI components to control the scalable behavior of the UI. Before you try to create a scalable UI using elementary UI components, make sure you understand the following core concepts on how scalability works with elementary UI components.

          + + + + + + + + + + +
          Note
          The Elementary library provides 3 groups of APIs: +
          • Infrastructure: to control the behavior of elementary.
          • +
          • Container: UI components that can contain other UI components.
          • +
          • UI components: elementary UI components, such as buttons, lists, and check and radio boxes.
          + +

          Using Containers for Effective Layouts

          + +

          The Elementary library provides several containers to display UI components in an effective layout. The containers have no visual identity of their own.

          + +
          • Box + +

            The box container makes a layout where child UI components are stacked in either horizontal or vertical direction. The box size is the sum of its child UI components' size:

            +
            • A vertical box calculates its height as the sum of its children's height and its width as the width of the widest child.
            • +
            • A horizontal box calculates its width as the sum of its children's width and its height as the height of the tallest child.
            + +

            Figure: Box layout

            +

            Box layout

            + +

            The box-based linear layout is the best solution to ensure a minimum size for the child UI components in any device or any orientation.

          • + +
          • Grid + +

            The grid container makes a layout where child UI components set their position and size relative to the container position and size. You can define the virtual width and height of the grid (by default: 100 x 100). You then packs the child UI components into the grid while setting their position and size based on the virtual size of the grid.

            + +

            Figure: Grid layout

            +

            Grid layout

            + +

            The grid-based relative layout can always fill the full screen in any device or any orientation. However, the size of the child UI components is changed based on the screen size.

          + + +

          Using Weight and Align Properties

          + +

          To make a layout scalable with UI components, the UI components must be packed into a container using only the weight and align properties based on their minimum size. Do not resize the UI components directly using pixels.

          + +

          The weight and align properties are associated with every elementary UI component, and they serve as hints for the container they are in. They tell the container how the UI component wants to occupy the space and pack itself with other UI components in the container.

          + +

          Weight

          + +

          You can set the weight property with the evas_object_size_hint_weight_set(x_weight, y_weight) function:

          + +
          • Containers use the weights of the child UI components by normalizing them across all child UI components along both X and Y directions.
          • +
          • The parameter values can be 0 or positive values (default: 0.0). +

            0.0 means that the container allocates a minimum size of the UI component area.

            +

            1.0 (EVAS_HINT_EXPAND) means that the container allocates all of the remaining area to the UI component.

          • +
          • If the container has several UI components, it allocates the UI component area relative to the weights of other UI components.
          + +

          Figure: Weight hint

          +

          Weight hint

          + +

          Figure: Weight hint across multiple child UI components

          +

          Weight hint across multiple child UI components

          + +

          Align

          + +

          You can set the align property with the evas_object_size_hint_align_set(x_align, y_align) function:

          + +
          • UI components use the alignment for their position or size along both X and Y directions.
          • +
          • The parameter values can be from 0.0 to 1.0 or -1.0 (default: 0.5).
          • +
          • The values define positions as follows: left is (x=0.0), right is (x=1.0), top is (y=0.0), and bottom is (y=1.0). The center is (x=0.5, y=0.5). +

            -1.0 (EVAS_HINT_FILL) means that the UI component fills all of the allocated area.

          + +

          Figure: Alignment hint

          +

          Alignment hint

          + +

          Scalability Using Edje

          + +

          The Tizen platform provides a complex graphical design and layout library called Edje, which provides an abstraction layer between the application code and the interface. You can use Edje in your Tizen applications to create visual elements and control the layout, look, and feel.

          +

          Internally, Edje holds a geometry state machine and a state graph that defines, for example, what is visible, where, at what size, and with what colors. These details are described to Edje using an Edje .edj file. The file can be produced by using Edje_cc to take a text file (a .edc file) and "compile" an output .edj file that contains the state graph information, images, and any other needed data.

          + +

          While creating Edje, you set specific element properties to control the scalable behavior of the UI. Before creating a scalable UI using Edje, you must be familiar with the following scalability properties and part types.

          + +

          Part

          +

          Parts are used to represent the most basic layout elements, such as a line in a border or a text on an image.

          +

          The parts can have the following property:

          +
          • scale: 0-1 +

            Specifies whether the part scales its size with the scaling factor (Tizen has a scaling factor to resize the application layout and object). This property is used to scale properties, such as font size or min/max size of the part.

            +

            The default value is 0 (off) and the default scaling factor is 1.0. To make a part scalable, set the property to 1 (on).

            +
          + +

          Description

          +

          Every part can have one or more description blocks to define the layout properties of the part.

          +

          The descriptions can have the following properties:

          + +
          • min/max: width height +

            Specifies the minimum or maximum size of the part in pixels. It has no effect on the container size.

            +

            When the scale property of the part is set to 1 (on), the size is multiplied by the scaling factor.

          • + +
          • fixed: 0-1 0-1 +

            When the min or max property is set, this property sets a boolean value for each dimension (horizontal and vertical, respectively) that tells the application whether it must be scaled when resized.

            +

            The default value is 0 0. To fix a part size to its min or max, set the value to 1.

          • + +
          • align: X-axis Y-axis +

            When the displayed object size is smaller than its container, this property moves it along both axes using the relative position.

            +

            To move the property, use x = 0.0 to move to left, x = 1.0 to move to right, y = 0.0 to move to the top, and y = 1.0 to move to the bottom. The x = 0.5, y = 0.5 value sets the object at the center of its container.

            +

            The default value is 0.5 0.5.

          • + +
          • rel1/rel2 +

            Specifies the position of the left-top and bottom-right corners of the part's container.

            +
            • relative: X-axis Y-axis +

              Specifies the relative position of the part's container.

              +

              The default value is 0.0 0.0 for rel1.relative and 1.0 1.0 for rel2.relative.

            • +
            • to/to_x/to_y +

              Specified that a corner must be positioned relatively to another part's container.

              +

              By default, the corners of a part are placed to the whole interface.

            + + + + + + + + +
            Table: Edje part property example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +                                                                 
            +      images 
            +      {
            +         image: "panorama.png" COMP;
            +      }  
            +                                                                 
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "rect1";
            +            type: RECT;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.3 0.4;}
            +               rel2 {relative: 0.7 0.6;}
            +               color: 0 127 255 255;
            +            }
            +         }
            +         part 
            +         {
            +            name: "rect2";
            +            type: RECT;
            +            // Affected by scaling factor
            +            scale: 1; 
            +            description 
            +            {
            +               state: "default" 0.0;
            +               fixed: 0 1;
            +               // Height: 100 pixels (when the scaling factor is 1.0)
            +               min: 0 100;
            +               rel1 {relative: 0.0 1.0;}
            +               rel2 {relative: 1.0 1.0;}
            +               // Bottom-aligned
            +               align: 0.5 1.0;
            +               color: 255 127 0 255;
            +            }
            +         }
            +         part 
            +         {
            +            name: "image";
            +            // Affected by scaling factor
            +            scale: 1;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               fixed: 1 1;
            +               // Image size: 720 x 180 pixels (when the scaling factor is 1.0)
            +               min: 720 180;
            +               // Y-axis is positioned relative to "rect2" part
            +               rel1 {relative: 0.5 0.0; to_y: "rect2";}
            +               rel2 {relative: 0.5 0.0; to_y: "rect2";}
            +               // Bottom-aligned
            +               align: 0.5 1.0;
            +               image.normal: "panorama.png";
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Part example

            +
          • + +
          • aspect: min max +

            Specifies the width to height ratio to keep when the part is resized. When both values are the same, the ratio is fixed. When they differ, the part is forced to keep the ratio between the min and max properties when resized.

            +

            The default value is 0.0 0.0.

          • + +
          • aspect_preference: dimension +

            Specifies the scope of the aspect property to a given dimension.

            +

            The possible values are BOTH, VERTICAL, HORIZONTAL, and NONE. The default is NONE.

            + + + + + + + + +
            Table: Edje part property aspect example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +
            +      images 
            +      {
            +         image: "island.png" COMP;
            +      }
            +   
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "image";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.0;}
            +               rel2 {relative: 1.0 1.0;}
            +               image.normal: "island.png";
            +               aspect: 8/5 8/5;
            +               // Keep the aspect ratio based on the part width
            +               aspect_preference: HORIZONTAL;
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Part aspect example

            +
          + +

          Text

          +

          The text elements are used to display text on the screen.

          +

          The texts can have the following properties:

          + +
          • size: font-size +

            Specifies the font size for the text. When the scale property of the part is set to 1 (on), the size is multiplied by the scaling factor.

          • + +
          • min: horizontal vertical +

            Specifies a pair of boolean values that define whether the container can be reduced further than the text size. The property is used to prevent the container from chopping the text.

            +

            When min is set horizontally or vertically, the minimum height or width of the part is decided by the text size.

            +

            The default value is 0 0.

          • + +
          • max: horizontal vertical +

            Specifies a pair of boolean values that define whether the container can be expanded further than the text size.

            +

            When max is set horizontally or vertically, the maximum height or width of the part is decided by the text size.

            +

            The default value is 0 0.

            + + + + + + + + +
            Table: Edje text property example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "text";
            +            type: TEXT;
            +            scale: 1;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.0;}
            +               rel2 {relative: 1.0 0.0;}
            +               align: 0.5 0.0;
            +               color: 108 108 108 255;
            +               text 
            +               {
            +                  font: "TIZEN";
            +                  // Affected by scaling factor
            +                  size: 80;
            +                  // Minimum height of the part container is decided by the text size
            +                  min: 0 1;
            +                  text: "Test properties!!";
            +               }
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Text example

            + +
          • +
          • fit: horizontal vertical +

            Specifies a pair of values that define whether the text is scaled to fill its container horizontally and/or vertically.

            +

            The default value is 0 0.

            + + + + + + + + +
            Table: Edje text property fit example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "text";
            +            type: TEXT;
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.0;}
            +               rel2 {relative: 1.0 0.1;}
            +               color: 108 108 108 255;
            +               text 
            +               {
            +                  font: "TIZEN";
            +                  // Resize text to fill the container height
            +                  fit: 0 1;
            +                  text: "Test properties!!";
            +               }
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Text fit example

          + + +

          Image

          +

          The image elements are used to display images on the screen.

          +

          The images can have the following properties:

          + +
          • border: left right top bottom +

            Specifies the border size of the image in pixels. This property sets the area of each side of the image to be displayed as a fixed size border, preventing the corners from being changed on a resize.

          • + +
          • border_scale +

            Specifies whether the border scales its size according to the scaling factor.

            +

            The default value is 0 (off). To make the border scalable, the value must be set to 1 (on).

            + + + + + + + + +
            Table: Edje image property example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +
            +      images 
            +      {
            +         image: "00_button_01_normal.png" COMP;
            +      }
            +
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "image";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.6;}
            +               rel2 {relative: 1.0 0.7;}
            +               image.normal: "00_button_01_normal.png";
            +            }
            +         }
            +         part 
            +         {
            +            name: "ninepatch_image";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.8;}
            +               rel2 {relative: 1.0 0.9;}
            +               image 
            +               {
            +                  normal: "00_button_01_normal.png";
            +                  border: 4 4 0 0;
            +                  // Affected by scaling factor
            +                  border_scale: 1;
            +               }
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Image example

            + +
          +

          Image Set

          +

          The image set elements are used to display a specific image on the screen based on the container size.

          +

          The image sets can have the following properties:

          + +
          • name: image-name +

            Specifies the name of the image file.

          • + +
          • size: minw minh maxw maxh +

            Specifies the minimum and maximum size that causes a specified image to be selected and shown.

            +

            The image set is used to control resource quality when the image part is scaled to multiple devices. According to the size of the part's container, an appropriate image is loaded.

            + + + + + + + + +
            Table: Edje image set property example
            +
            +collections 
            +{
            +   group 
            +   {
            +      name: "property_test";
            +
            +      images 
            +      {
            +         set 
            +         {
            +            name: "alternative_animal";
            +            image 
            +            {
            +               image: "pig.png" COMP;
            +               size: 640 800 1200 1500;
            +            }
            +            image 
            +            {
            +               image: "monkey.png" COMP;
            +               size: 400 500 639 799;
            +            }
            +            image 
            +            {
            +               image: "cat.png" COMP;
            +               size: 240 300 399 499;
            +            }
            +            image 
            +            {
            +               image: "mouse.png" COMP;
            +               size: 80 100 239 299;
            +            }
            +            image 
            +            {
            +               image: "snail.png" COMP;
            +               size: 0 0 79 99;
            +            }
            +         }
            +      }
            +
            +      parts 
            +      {
            +         part 
            +         {
            +            name: "image1";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.0;}
            +               rel2 {relative: 1.0 0.45;}
            +               image.normal: "alternative_animal";
            +               aspect: 4/5 4/5;
            +               aspect_preference: BOTH;
            +            }
            +         }
            +         part 
            +         {
            +            name: "image2";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.5;}
            +               rel2 {relative: 1.0 0.75;}
            +               image.normal: "alternative_animal";
            +               aspect: 4/5 4/5;
            +               aspect_preference: BOTH;
            +            }
            +         }
            +         part 
            +         {
            +            name: "image3";
            +            description 
            +            {
            +               state: "default" 0.0;
            +               rel1 {relative: 0.0 0.8;}
            +               rel2 {relative: 1.0 1.0;}
            +               image.normal: "alternative_animal";
            +               aspect: 4/5 4/5;
            +               aspect_preference: BOTH;
            +            }
            +         }
            +      }
            +   }
            +}
            +

            Image set example

            +
          + +

          Part Types

          +

          You can use fixed and flexible parts:

          + +
          • Fixed parts + +
            • Fixed parts have a minimum size (at least width or height).
            • +
            • When the part scale property is set to 1 (on), the scaling factor has an effect on the minimum size.
            • +
            • Fixed parts are used when the parts must keep a fixed size in any device or any orientation.
          • +
          • Flexible parts +
            • Flexible parts resize according to the container size and other fixed parts' size.
            • +
            • Flexible parts are used when the parts can be resized in any device or any orientation.
          + +

          Figure: Fixed and flexible parts

          +

          Fixed and flexible parts

          + + +

          Aspect Ratio

          + +

          In Tizen, the application generally fills out the screen. However, sometimes you want the application to be shown in a specific aspect ratio, regardless of the screen size.

          +

          As images are scaled in different devices, they are resized based on the container size. The images have specific properties that define the area to be shown when resized.

          + +

          For example, the following table illustrates what happens to the parts marked with yellow rectangles in the following figures, when scaling properties are applied.

          + +

          Figure: Original image [1920x1280 (8:5)]

          +

          Original image [1920x1280 (8:5)]

          + + + + + + + + + + + +
          Note
          To set the required aspect ratio, use the evas_object_size_hint_aspect_set() function or the aspect_preference attribute in the EDC.
          + + + ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Image resizing effects with a specific aspect ratio
          AspectContainer area
          720x384 (15:8)720x640 (9:8)
          HORIZONTAL +

          Resizing based on the container width while keeping the image aspect ratio.

          +

          Extra height goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          VERTICAL +

          Resizing based on the container height while keeping the image aspect ratio.

          +

          Extra width goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          BOTH +

          Resizing based on the container area while keeping the image aspect ratio.

          +

          No extra width or height goes outside the image area, so the entire image is always shown.

          Scaling effect

          Scaling effect

          NONE +

          Resizing to fill the available area while keeping the image aspect ratio.

          +

          Extra width or height goes outside the image area and is clipped.

          Scaling effect

          Scaling effect

          + +

          Setting the Image Aspect Ratio

          +

          In case of an image object, you can set its aspect ratio with additional APIs:

          + +
          • elm_image_fill_outside_set() +

            If the function is set to TRUE, the image resizes to fill the entire area while keeping its aspect ratio. It lets the extra width or height go outside of the area (same result as with the aspect NONE in the above table).

          • + +
          • elm_image_aspect_fixed_set() + +

            If the function is set to FALSE, the image resizes to fill the entire area without keeping its original aspect ratio. The image can be distorted to fit the area.

            + + + + + + + + + + + + + + +
            Table: Image resizing without keeping the aspect ratio
            Container area
            720x384 (15:8)720x640 (9:8)

            Scaling effect

            Scaling effect

            +
          + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/theme_n.htm b/org.tizen.ui.practices/html/native/efl/theme_n.htm new file mode 100644 index 0000000..8683d01 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/theme_n.htm @@ -0,0 +1,72 @@ + + + + + + + + + + + + + Themes: Specifying the UI Look and Feel + + + + + +
          + +

          Themes: Specifying the UI Look and Feel

          + + +

          Tizen provides powerful theme features you can use to easily change your applications' UI look and feel. A theme is a collection of visual identities, which provide the graphical appearance of applications. A theme comprises a layout, shapes, fonts, and colors for the UI components.

          + +

          The Tizen platform provides a default theme for UI components implemented based on the Tizen UX design concept (AIR – light and simple). To change the current look and feel, you can replace the default theme with a customized theme package.

          + +

          The Edje library used by Elementary provides themes. You can also use Edje to create your own objects to modify the application appearance with a unique GUI. The UI components are customizable so that each application can have its own customized theme to overlay the default theme.

          + +

          Edje supports separation between layout and logic. While it is possible to implement both GUI and logic in the C code, a loose coupling of GUI and logic is more convenient when you want to revise, add, or delete application UI components. In EFL, the GUI is handled by Edje, while application logic is handled in the C code.

          + +

          Edje was designed as a theme layer for moving the look, feel, and animation of objects into separate data files loaded at runtime. Using a plain text EDC file you can create your application's layout without writing a single line of code. EFL can even change the theme of application at runtime without restarting the application.

          + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/threads_n.htm b/org.tizen.ui.practices/html/native/efl/threads_n.htm new file mode 100644 index 0000000..2ff6f1b --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/threads_n.htm @@ -0,0 +1,507 @@ + + + + + + + + + + + + + Using Threads + + + + + +
          + +

          Using Threads

          + +

          Threads are concurrent execution environments that are lighter than full-blown processes because they share some operating system resources. Threads make it possible to do several things at the same time while using less resources and offering simpler synchronization and data exchange compared to processes.

          + +

          If you move a blocking operation to a separate thread, it cannot block the event loop and keeps the user interface reactive. Blocking the event loop and using long-running callbacks means the application cannot update its graphical user interface.

          + +

          While threads can be useful, they are not always the best choice:

          + +
          • The first rule to using threads is to avoid them as much as possible, as there are often better tools and approaches. For example, to do network transfers, use Ecore_Con that integrates with the event loop to use a function based on callbacks. Being able to use such a function means that specific support work has been done in libraries. In some cases, using a function and libraries is impossible, and in those situations threads are required.
          • +
          • Use threads in CPU-intensive tasks and disk IOs. For example, a thread is the appropriate way to apply filters to an image or to a video without blocking the interface.
          • +
          • Use threads to take advantage of multiple available CPU cores, if the workload can be split into several units of work and spread across the cores. A typical example for an image processing application on a quad-core CPU is to process 4 images at once, each on 1 thread. For such tasks, the thread pool helps with the creation and scheduling of the threads, handling all the grunt work.
          + +

          Thread Safety

          + +

          If several strings have to work on the same resources, conflicts can happen as the threads are run in parallel. For example, if thread A modifies several values while thread B is reading them, it is likely that some of the values read by B are outdated. Similar issues can happen if both threads are modifying data concurrently.

          + +

          These kinds of conflicts are called race-conditions: depending on which thread is faster, the output changes and can be incorrect. Avoiding such issues is called thread safety. Thread safety involves critical sections, which are blocks of code that operate on shared resources and must not be accessed concurrently by another thread.

          + +

          The usual solution for ensuring exclusive access to shared resources is mutual exclusion: only 1 thread can operate on the data at any given time. Mutual exclusion is often implemented through locks. Before attempting to operate on a shared resource, the thread waits until it can lock something called a mutex (stands for mutual exclusion), then operates on the resource, and unlocks the mutex. Operating systems guarantee that only 1 thread can lock a mutex at a given time: this ensures that only 1 thread operates on the shared resource at one time.

          + +

          For more information on thread safety, see Low-level Functions.

          + +

          Thread Pools

          + +

          Threads are operating system resources: while much lighter than processes, they still have a cost. Moreover, spawning a thousand threads means that each of them only gets 1/1000th of the total CPU time: each thread is progressed slowly and, in the worst case, the system wastes all of its time switching between threads without doing any actual work.

          + +

          Thread pools solve this problem. In thread pools, up to a maximum number of threads are created on-demand and used to execute tasks. When the tasks are finished, they are kept alive but sleeping. This avoids the cost of creating and destroying them.

          + +

          In EFL, the thread pool is controlled by a thread_max parameter, which defines the maximum number of threads running at the same time. Another control feature is the func_end() callback that runs from the main loop thread after a task has completed and is typically used to extract the data from the finished task and make it available to the main loop.

          + +

          To manage the maximum number of threads:

          + +
            +
          • To retrieve the current value, use the ecore_thread_max_get() function. +
          • + +
          • To set the value, use the ecore_thread_max_set() function. The value has a maximum of 16 times the CPU count. +
          • + +
          • To reset the maximum number of threads, use the ecore_thread_max_reset() function. + +
          • + +
          • To get the number of available threads in the pool, use the ecore_thread_available_get() function. The function returns the current maximum number of threads minus the number of running threads. The number can be a negative value, if the maximum number of threads has been lowered. +
          • +
          + +

          The following figures illustrate the thread pool. The first figure shows the occupancy of a hypothetical thread pool. There are several tasks, of which 4 are running. The thread_max parameter of the pool is 4, and the other tasks are waiting. There is no thread with its func_end() callback currently called.

          + +

          Figure: Thread pool, step 1

          +

          Thread pool, step 1

          + +

          When a task, applying the sepia filter on image1, finishes, the corresponding func_end() function is invoked from the main loop.

          + +

          Figure: Thread pool, step 2

          +

          Thread pool, step 2

          + +

          With the task done, one of the threads from the pool becomes available, and another thread, adding the reverberation effect on audio3, can run in it.

          + +

          Figure: Thread pool, step 3

          +

          Thread pool, step 3

          + +

          As long as there are tasks to be done, the thread pool continues the same way, running tasks in its threads whenever a thread is available.

          + + +

          Thread Management with Ecore

          + +

          Ecore offers a simplified API for managing threads in EFL applications. The Ecore API applies to a typical scenario where the main thread creates another thread, which in turn sends data back to the main thread or calls GUI-related functions. GUI-related functions are not thread-safe.

          + +

          Creating Threads with Ecore

          + +

          The threads created with Ecore are by default integrated with the thread pool and offer simple callback-based ways to interact with the main loop. New threads are created as needed until the maximum capacity of the thread pool is reached.

          + +
          • To return values to the main thread: +

            Use the ecore_thread_feedback_run() function to send intermediate feedback from the thread to the main loop.

          • + +
          • To return only the final value to the main thread: +

            To create and run a thread, use the ecore_thread_run() function. It runs a function inside a thread from the thread pool and takes care of all the low-level work. It returns the corresponding thread handler or NULL on failure.

            + +

            The most common way to return data from one thread to the main thread is to put a pointer to it in the data. When the thread is aborted or finishes, either func_cancel() or func_end() is called from the main loop. The functions are running in the simpler context of a single thread running at once and therefore avoid race-conditions.

            + +

            The data pointer approach can only be used when the data is shared between the one thread and the main thread only. However, this does not prevent you from using the func_end() callback to merge the results into a single data structure. For example, you can add all the values computed by the threads to an Eina_List, as all the operations on the list happen from a single thread and therefore one after the other and not concurrently.

          + + +

          Running Callbacks from the Main Loop

          + +

          If you are performing operations in another thread and want to update a progress bar, the update operation must be done from the main thread. The simplest way is to use the ecore_main_loop_thread_safe_call_async() function, which takes a function and some data as parameters and instructs the main loop to execute the given function with the given data.

          + +

          Depending on the kind of thread the function is called from, the process differs:

          +
            +
          • If the function is called from a thread that is not the main one, the function sends a message to the main loop and returns quickly. The message is processed in order, similarly to others.
          • + +
          • If the function is called from the main thread, the function is called immediately as if it were a direct call.
          • +
          + +

          If you want to wait until the callback is called and returns, use the ecore_main_loop_thread_safe_call_sync() function, which is similar but synchronous. Since it is synchronous, it can also return the value returned by the callback.

          + +

          Low-level Functions

          + +

          Eina offers low-level functions that are portable across the operating system, such as locks, conditions, semaphores, barriers, and spinlocks. The functions follow closely the logic of pthreads.

          + +

          While these functions are useful, they are building blocks and not usually useful in EFL applications considering the higher-level functions that are available in Ecore.

          + +

          For an introduction to threads and pthreads in particular, see:

          + + + +

          If you are already familiar with threads, see the standard pthreads documentation and the Eina reference documentation, or the following function lists. Remember that the Eina functions map very closely to the pthreads functions.

          + + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Locks (mutual exclusions)
          pthreads functionEina equivalent
          pthread_mutex_new()eina_lock_new()
          pthread_mutex_destroy()eina_lock_free()
          pthread_mutex_lock()eina_lock_take()
          pthread_mutex_trylock()eina_lock_take_try()
          pthread_mutex_unlock()eina_lock_release()
          none (prints debug information on the lock)eina_lock_debug()
          + + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Conditions (notifications when condition objects change)
          pthreads functionEina equivalent
          pthread_cond_init()eina_condition_new()
          pthread_cond_destroy eina_condition_free()
          pthread_cond_wait()eina_condition_wait()
          pthread_cond_timedwait()eina_condition_timedwait()
          pthread_cond_broadcast()eina_condition_broadcast()
          pthread_cond_signal()eina_condition_signal()
          + + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
          RWLocks (Read-write locks, for multiple-readers/single-writer scenarios)
          pthreads functionEina equivalent
          pthread_rwlock_init() +eina_rwlock_new()
          pthread_rwlock_destroy()eina_rwlock_free()
          pthread_rwlock_rwlock_rdlock() +eina_rwlock_take_read()
          pthread_rwlock_rwlock_wrlock() +eina_rwlock_take_write()
          pthread_rwlock_unlock() +eina_rwlock_release()
          + + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
          TLS (Thread-Local Storage)
          pthreads functionEina equivalent
          pthread_key_create()eina_tls_new()
          pthread_key_delete()eina_tls_free()
          pthread_getspecific()eina_tls_get()
          pthread_setspecificeina_tls_set()
          + + + ++++ + + + + + + + + + + + + + + + + + + + + + + +
          Semaphores (access restrictions for a set of resources)
          pthreads functionEina equivalent
          sem_init()eina_semaphore_new()
          sem_destroy()eina_semaphore_free()
          sem_wait()eina_semaphore_lock()
          sem_post()eina_semaphore_release()
          + + + ++++ + + + + + + + + + + + + + + + + + + +
          Barriers
          pthreads functionEina equivalent
          pthread_barrier_init()eina_barrier_new()
          pthread_barrier_destroy()eina_barrier_free()
          pthread_barrier_wait()eina_barrier_wait()
          + +

          Thread Use Examples

          + +

          The following examples display a window with a label. An auxiliary thread semi-regularly changes the text of the label. If you want to display a regular animation, use the Ecore animators described in the Main Loop guide.

          + +

          To use the ecore_thread_feedback() function:

          + +
            + +
          1. Implement the GUI function that sets the text of a label and can be called from the main thread. + +
            +static void
            +_set_label_text(void *data, Ecore_Thread *thread __UNUSED__, void *msgdata)
            +{
            +   char buf[64];
            +   appdata_s *ad = data;
            +   snprintf(buf, sizeof(buf), "Tick %d", (int)(uintptr_t)msgdata);
            +   elm_object_text_set(ad->label, buf);
            +}
            +
            +
          2. +
          3. Send the feedback from the other thread using the ecore_thread_feedback() function. The following function does nothing besides sending the feedback and sleeping. + +
            +static void
            +_long_function(void *data __UNUSED__, Ecore_Thread *thread)
            +{
            +   int iteration;
            +   // Change the text roughly every 1 second. This is only an example; if you
            +   // want regular animations, use Ecore animators!
            +   for (iteration = 0; ; iteration++) 
            +   {
            +      // Since you are running from another thread, you need to take special
            +      // care and instead send data to the main thread and have it run the
            +      // feedback function given when creating the thread
            +      ecore_thread_feedback(thread, (void*)(uintptr_t)iteration);
            +      // Sleep for roughly one second
            +      sleep(1);
            +   }
            +}
            +
            +
          4. + +
          5. Create an end function that is called when the thread exits. In this example, the end function is called only right before the application exits. However, if the blocking function is more complex, it can trigger the end function. + +
            +static void
            +_end_func(void *data, Ecore_Thread *thread __UNUSED__)
            +{
            +   appdata_s *ad = data;
            +   elm_object_text_set(ad->label, "Ticks over");
            +}
            +
            +
          6. + +
          7. Call the ecore_thread_feedback_run() function to start the thread: + +
            +ecore_thread_feedback_run(_long_function, _set_label_text, _end_func, NULL, ad, EINA_FALSE);
            +
            +
          8. +
          + +

          To use the ecore_main_loop_thread_safe_call_sync() function:

          + +
            +
          1. Implement the GUI function that sets the text of a label and can be called from the main thread. The function receives data as a structure and alternatively displays "Tick d" or "Tock d". + +
            +struct thd 
            +{
            +   appdata_s *ad;
            +   Eina_Bool tick_not_tock;
            +   int iteration;
            +};
            +static void *
            +_set_label_text_tick_tock(void *data)
            +{
            +   char buf[64];
            +   struct thd *thd = data;
            +   snprintf(buf, sizeof(buf), "%s %d", (thd->tick_not_tock ? "Tick" : "Tock"), thd->iteration);
            +   elm_object_text_set(thd->ad->label, buf);
            +
            +   return NULL;
            +}
            +
            +
          2. + +
          3. Use the ecore_main_loop_thread_safe_call_sync() function call the GUI function. Differentiate between the ticks and the tocks: + +
            +static void
            +_long_function_tick_tock(void *data, Ecore_Thread *thread __UNUSED__)
            +{
            +   struct thd *thd = malloc(sizeof(struct thd));
            +   thd->ad = data;
            +   for (thd->iteration = 0; ; (thd->iteration)++) 
            +   {
            +      thd->tick_not_tock = EINA_TRUE;
            +      ecore_main_loop_thread_safe_call_sync(_set_label_text_tick_tock, thd);
            +      sleep(1);
            +      thd->tick_not_tock = EINA_FALSE;
            +      ecore_main_loop_thread_safe_call_sync(_set_label_text_tick_tock, thd);
            +      sleep(1);
            +   }
            +   free(thd);
            +}
            +
            +
          4. + +
          5. Start the thread through the ecore_thread_run() function: + +
            +ecore_thread_run(_long_function_tick_tock, _end_func, NULL, ad);
            +
            +
          6. +
          + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/tools_n.htm b/org.tizen.ui.practices/html/native/efl/tools_n.htm new file mode 100644 index 0000000..5234fea --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/tools_n.htm @@ -0,0 +1,243 @@ + + + + + + + + + + + + + Tools + + + +
          +
          +

          Mobile native Wearable native

          +
          + + +
          + +
          + +

          Tools

          +

          Eina provides a number of tools, such as string manipulation, that make your life easier when coding applications:

          + +
            +
          • Convert fast: conversion from, for example, strings to integers and double
          • +
          • Counter: measures the number of calls and their time
          • +
          • Error: error identifiers
          • +
          • File: file list and path split
          • +
          • Lazy allocator: lazy allocator
          • +
          • Log: full-featured logging system
          • +
          • Magic: provides runtime type checking
          • +
          • Memory Pool: abstraction for various memory allocators
          • +
          • Module lists: loads and shares modules using the Eina_Module standard
          • +
          • Rectangle: rectangle structure and standard manipulation methods
          • +
          • Safety Checks: extra checks that report unexpected conditions and can be disabled during compilation
          • +
          • String: set of functions that manage C strings
          • +
          + +

          String

          + +

          When creating applications, you always need to manipulate strings. Eina provides a very useful API for manipulating C strings:

          + +
          • + +

            The most common string manipulation is the "split". If you have a string, such as "Rasterman:Bluebugs:Tasn:Illogict:billiob:Puppet_Master", and you want to print it in an easily readable format, you can use the eina_str_split() function to split the string using a delimiter. The first parameter is the string to split, the second determines where to split the string, and the final parameter is the maximum number of strings to split the string into. If you set a number less than 1, it splits the string as many times as possible.

            +

            The function returns a newly-allocated NULL-terminated array of strings, or NULL, if it fails to allocate the array. Always remember to free the memory allocated by the eina_str_split() function.

            + +
            +char *nicks = "Rasterman:Bluebugs:Tasn:Illogict:billiob:Puppet_Master";
            +char **result_arr;
            +int i;
            +
            +// Splitting the string with ':' delimiter
            +result_arr = eina_str_split(names, ":", 0);
            +// Printing the result
            +for (i = 0; result_arr[i]; i++)
            +   printf("Nick : %s\n", result_arr[i]);
            +// Remember to free memory
            +free(arr[0]);
            +free(arr);
            +
          • + + +
          • To change the string to lowercase or uppercase, use the eina_str_tolower() and eina_str_toupper() functions. They change the case for all characters of the given string. These functions modify the original strings.

            + +
            +char *str;
            +// Initialize the string
            +str = malloc(sizeof(char) * 4);
            +strcpy(str, "bsd");
            +// Change the string to uppercase
            +eina_str_toupper((char **)&str);
            +printf("%s\n", str);
            +// Change the string to lowercase
            +eina_str_tolower(&str);
            +printf("%s\n", str);
            +// Free the allocated memory
            +free(str);
            +
          • +
          • If you need to "join" 2 strings of known length, use the eina_str_join() function. The fist parameter is the buffer to store the result, the second is the size of the buffer, the third is the separator between the 2 strings, and the 2 final parameters are the stings to be joined.

            + +
            +char *part1 = "Tizen powered by";
            +char *part2 = "Enlightenment Foundation Libraries";
            +char *res;
            +size_t size;
            +// Calculate the string size + 1 for the delimiter
            +size = strlen(part1) + strlen(part2) + 1
            +// Allocate memory for the result
            +res = malloc(sizeof(char) * size);
            +// Join the strings
            +eina_str_join(res, size, ' ', part1, part2);
            +printf("%s\n", res);
            +// Free the allocated memory
            +free(res):
            +
          • +
          • To check whether a string starts or ends with another string, use the eina_str_has_prefix() or eina_str_has_suffix() function. You can also check whether a string has a particular extension with the eina_str_has_extension() function.

            + +

            These functions return EINA_TRUE if the given string contains the specified prefix, suffix, or extension, and EINA_FALSE if it does not.

            + +
            +char *names = "Carsten;Cedric;Tom;Chidambar;Boris;Philippe"
            +if (eina_str_has_prefix(names, "Carsten"))
            +   printf("String starts with 'Carsten'")
            +if (eina_str_has_suffix(names, "Philippe"))
            +   printf("String ends with 'Philippe'")
            +if (eina_str_has_extension(names, "philippe"))
            +   printf("String has extension 'philippe'")
            +else
            +   printf("String does not have extension "philippe)
            +
          + +

          Memory Pool

          + +

          The Eina_Mempool tool provides memory pool functionality. With a memory pool, you can preallocate fixed-size memory spaces for easy memory management.

          + +

          The following mempools are available:

          +
            +
          • buddy
          • +
          • chained_pool
          • +
          • ememoa_fixed and ememoa_unknown
          • +
          • fixed_bitmap
          • +
          • pass_through
          • +
          • one_big
          • +
          + +

          Safety Checks

          + +

          Eina safety checks are a set of macros that can be used to check for parameters or values that must never occur. The concept is similar to the assert() function, but safety checks log the parameter or value and return instead of aborting your program.

          + +

          The following safety checks are available:

          +
            +
          • EINA_SAFETY_ON_NULL_RETURN(exp)
          • +
          • EINA_SAFETY_ON_NULL_RETURN_VAL(exp, val)
          • +
          • EINA_SAFETY_ON_NULL_GOTO(exp, label)
          • +
          • EINA_SAFETY_ON_TRUE_RETURN(exp)
          • +
          • EINA_SAFETY_ON_TRUE_RETURN_VAL(exp, val)
          • +
          • EINA_SAFETY_ON_TRUE_GOTO(exp, label)
          • +
          • EINA_SAFETY_ON_FALSE_RETURN(exp)
          • +
          • EINA_SAFETY_ON_FALSE_RETURN_VAL(exp, val)
          • +
          • EINA_SAFETY_ON_FALSE_GOTO(exp, label)
          • +
          • EINA_ARG_NONNULL(...)
          • +
          + +

          To return if a variable is NULL, use the EINA_SAFETY_ON_NULL_RETURN() function. This macro calls return if the given parameter is NULL.

          + +
          +Eina_Bool myfunction(char *param) 
          +{
          +   // If my param is NULL, EINA_SAFETY_ON_NULL_RETURN calls "return"
          +   EINA_SAFETY_ON_NULL_RETURN(param);
          +
          +   printf("My pram is : %s\n", param);
          +
          +   return EINA_TRUE;
          +} 
          +
          + +

          To return a specific value, use the EINA_SAFETY_ON_NULL_RETURN_VAL() function instead of the EINA_SAFETY_ON_NULL_RETURN() function. This macro returns the given value.

          + +
          +Eina_Bool void myfunction(char *param)
          +{
          +   // If the parameter is NULL, return EINA_FALSE;
          +   EINA_SAFETY_ON_NULL_RETURN_VAL(param, EINA_FALSE);
          +   printf("My pram is : %s\n", param);
          +
          +   return EINA_TRUE;
          +}
          +
          + +

          To call another function if a parameter is NULL, use the EINA_SAFETY_ON_NULL_GOTO() function. This macro works similarly to the EINA_SAFETY_ON_NULL_RETURN() function except that it calls goto with the given function instead of return.

          + +
          +static void isnullcb()
          +{
          +   printf("The parameter is NULL\n");
          +}
          +Eina_Bool void myfunction(char *param)
          +{
          +   // If the parameter is NULL we return EINA_FALSE;
          +   EINA_SAFETY_ON_NULL_GOTO(param, isnullcb);
          +   printf("My pram is : %s\n", param);
          +
          +   return EINA_TRUE;
          +}
          +
          + +

          Eina also provides macros that check whether a given value is TRUE or FALSE. For example, to call return if a given value is TRUE, use the EINA_SAFETY_ON_TRUE_RETURN() function. To call "goto" in a given function if a given value is TRUE, use the EINA_SAFETY_ON_NULL_GOTO() function.

          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/touch_gesture_n.htm b/org.tizen.ui.practices/html/native/efl/touch_gesture_n.htm new file mode 100644 index 0000000..624be6c --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/touch_gesture_n.htm @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + Handling Component Touch Gestures + + + + + + +
          +

          Handling Component Touch Gestures

          + + +

          This tutorial demonstrates how you can implement different types of gestures provided by the EFL library and instructions on how to use them.

          + +

          Initializing Touch Gestures

          + +

          The EFL library provides a wide range of touch gestures, such as tap, double tap, triple tap, long tap, momentum, line, zoom and rotate, which can be used by the application to build a dynamic user interface interaction which is simple to use as well as intuitive.

          +

          The create_base_gui function creates the application layout. It starts by creating a window, then adds the elm_conformant component to it to decorate the window with an indicator. It then adds the elm_naviframe component which acts as a view manager for the window and provides the window title functionality. After this it creates a gesture view by using the create_main_view() function and adds it to naviframe.

          +
          +static void
          +create_base_gui(appdata_s *ad)
          +{
          +   Elm_Object_Item *nf_it, *tabbar_it;
          +   // Window
          +   ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
          +   elm_win_autodel_set(ad->win, EINA_TRUE);
          +   evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
          +   // Conformant
          +   ad->conform = elm_conformant_add(ad->win);
          +   elm_win_conformant_set(ad->win, EINA_TRUE);
          +   evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
          +   elm_win_resize_object_add(ad->win, ad->conform);
          +   evas_object_show(ad->conform);
          +   // Naviframe
          +   ad->nf = elm_naviframe_add(ad->layout);
          +   // Calendar View
          +   create_main_view(ad);
          +   elm_naviframe_item_push(ad->nf, "Calendar", NULL, NULL, ad->calendar, NULL);
          +   elm_object_part_content_set(ad->layout, "elm.swallow.content", ad->nf);
          +   // Show window after the base GUI is set up
          +   evas_object_show(ad->win);
          +}
          +
          + +

          The create_main_view function creates the application layout by arranging the labels and rectangles by using recursive composition of the box layout:

          +
          +static void
          +create_main_view(appdata_s *ad)
          +{
          +   // Box
          +   ad->box = elm_box_add(ad->nf);
          +   evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, VAS_HINT_EXPAND);
          +   elm_box_padding_set(ad->box, 0, 5 * elm_config_scale_get());
          +   evas_object_show(ad->box);
          +   // Event Rect
          +   ad->rect = evas_object_rectangle_add(evas_object_evas_get(ad->box));
          +   evas_object_size_hint_weight_set(ad->rect, EVAS_HINT_EXPAND, VAS_HINT_EXPAND);
          +   evas_object_size_hint_align_set(ad->rect, EVAS_HINT_FILL, EVAS_HINT_FILL);
          +   evas_object_color_set(ad->rect, 204, 204, 204, 255);
          +   evas_object_repeat_events_set(ad->rect, EINA_TRUE);
          +
          +   ad->gl = create_gesture_layer(ad);
          +
          +   elm_box_pack_end(ad->box, ad->rect);
          +   evas_object_show(ad->rect);
          +}
          +
          + +

          A gesture layer is added to the rectangle object. This layer is able to receive the gesture event:

          +
          +static Evas_Object *
          +create_gesture_layer(appdata_s *ad)
          +{
          +   Evas_Object *g = elm_gesture_layer_add(ad->win);
          +   elm_gesture_layer_attach(g, ad->rect);
          +}
          +
          + +

          The following figure illustrates the Gesture Detector.

          + +

          Figure: Gesture Detector screen

          +

          Gesture Detector screen

          + +

          Implementing Touch Gestures

          + +

          The elm_gesture_layer_attach() is the function to which a gesture layer for a particular object is attached.

          +

          A gesture can have 4 different states:

          +
            +
          • ELM_GESTURE_STATE_START
          • +
          • ELM_GESTURE_STATE_MOVE
          • +
          • ELM_GESTURE_STATE_ABORT
          • +
          • ELM_GESTURE_STATE_END
          +

          Every gesture starts with the ELM_GESTURE_STATE_START state and finishes with either the ELM_GESTURE_STATE_END or ELM_GESTURE_STATE_ABORT state depending on whether the gesture is completed or aborted on that object.

          +

          If an application only needs to track a finished gesture, it can listen for the finished state only. For a more complete control of the gesture, an application can listen for all state changes for that particular gesture.

          +

          The elm_gesture_layer_cb_set() function is used for registering state change callback for a particular gesture.

          +

          For more information about the gestures, see the gesture documentation.

          + +

          To detect touch gestures:

          +
            +
          • The following example adds callbacks for listening to the tap gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            +   ELM_GESTURE_STATE_START, n_finger_tap_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            +   ELM_GESTURE_STATE_END, n_finger_tap_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
            +   ELM_GESTURE_STATE_ABORT, n_finger_tap_abort, ad);
            +
          • +
          • The following example adds callbacks for listening to the double tap gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            +   ELM_GESTURE_STATE_START, dbl_click_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            +   ELM_GESTURE_STATE_MOVE, dbl_click_move, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            +   ELM_GESTURE_STATE_END, dbl_click_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
            +   ELM_GESTURE_STATE_ABORT, dbl_click_abort, ad);
            +
          • + +
          • The following example adds callbacks for listening to the triple tap gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            +   ELM_GESTURE_STATE_START, triple_click_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            +   ELM_GESTURE_STATE_MOVE, triple_click_move, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            +   ELM_GESTURE_STATE_END, triple_click_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
            +   ELM_GESTURE_STATE_ABORT, triple_click_abort, ad);
            +
          • +
          • The following example adds callbacks for listening to the long tap gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_START, momentum_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_END, momentum_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_ABORT, momentum_abort, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_MOVE, momentum_move, ad);
            +
          • + +
          • The following example adds callbacks for listening to the momentum gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_START, momentum_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_END, momentum_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_ABORT, momentum_abort, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
            +   ELM_GESTURE_STATE_MOVE, momentum_move, ad);
            +
          • + +
          • The following example adds callbacks for listening to the line gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            +   ELM_GESTURE_STATE_START, line_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            +   ELM_GESTURE_STATE_MOVE, line_move, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            +   ELM_GESTURE_STATE_END, line_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
            +   ELM_GESTURE_STATE_ABORT, line_abort, ad);
            +
          • + +
          • The following examples add callbacks for listening to the flick gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            +   ELM_GESTURE_STATE_START, flick_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            +   ELM_GESTURE_STATE_END, flick_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
            +   ELM_GESTURE_STATE_ABORT, flick_abort, ad);
            +
          • + +
          • The following examples add callbacks for listening to the zoom gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            +   ELM_GESTURE_STATE_START, zoom_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            +   ELM_GESTURE_STATE_END, zoom_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            +   ELM_GESTURE_STATE_ABORT, zoom_abort, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
            +   ELM_GESTURE_STATE_MOVE, zoom_move, ad);
            +
          • + +
          • The following example adds callbacks for listening to the rotate gesture:

            +
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            +   ELM_GESTURE_STATE_START, rotate_start, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            +   ELM_GESTURE_STATE_END, rotate_end, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            +   ELM_GESTURE_STATE_ABORT, rotate_abort, ad);
            +elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
            +   ELM_GESTURE_STATE_MOVE, rotate_move, ad);
            +
          • + +
          • The following example adds a callback for getting the tap gesture finishing notification:

            +
            +static Evas_Event_Flags
            +n_finger_tap_end(void *data, void *event_info)
            +{
            +   appdata_s *ad = data;
            +   Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
            +   return EVAS_EVENT_FLAG_ON_HOLD;
            +}
            +
          • +
          + + + + +
          + +Go to top + + + + + + + diff --git a/org.tizen.ui.practices/html/native/efl/ui_components_mn.htm b/org.tizen.ui.practices/html/native/efl/ui_components_mn.htm new file mode 100644 index 0000000..032b728 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ui_components_mn.htm @@ -0,0 +1,1088 @@ + + + + + + + + + + + + + Mobile UI Components + + + +
          +
          +

          Mobile native

          +
          + + +
          + +
          + +

          Mobile UI Components

          + +

          The EFL Elementary is a set of fast, finger-friendly, scalable, and themeable UI component libraries. The number of supported UI components is around 80, including both containers and non-containers. Originally, the Elementary was developed as part of the Window Manager development on Desktop devices. For the mobile profile, Tizen reused the proper UI components and created new ones, and then enhanced and adjusted all of them for Tizen native applications.

          + +

          This feature is supported in mobile applications only.

          + +

          The UI components are mobile-friendly: for example, the Naviframe component supports view-managing for multiple views, the Entry component supports many modes (such as Password, Single/Multi-line, Edit/No-Edit), the Index component supports fast access to another group of UI items, and the Toolbar component shows a menu when an item is selected.

          +

          The mobile UI components were designed to allow the user to interact with touch screen-equipped mobile devices. Therefore, when developing mobile applications, you can easily use them through the mobile-related infrastructure in company with view managing and when reacting to touch events and the user finger size.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Available UI components +
          CategoryComponent nameDescription
          Navigation elementsToolbarThe toolbar component is a scrollable list of items. It can also show a menu when an item is selected. Only one item can be selected at a time.
          IndexThe index component provides an index for fast access to another group of UI items.
          SegmentcontrolThe segmentcontrol component is a horizontal control made of multiple segment items, each segment item functioning similarly as a discrete 2-state button.
          Presentation viewsWinThe win component is the root window component that will be often used in an application. It allows you to create some content in it, and it is handled by the window manager.
          BackgroundThe background component can be used to set a solid background decoration to a window or a container object. It works like an image, but has some background specific properties, such as setting it to tiled, centered, scaled, or stretched.
          GenlistThe genlist component displays a scrollable list of items. It can hold a lot of items while still being fast and memory-efficient (only the visible items are allocated memory).
          GengridThe gengrid component displays objects on a grid layout and renders only the visible objects.
          PanelThe panel component is an animated object that can contain child objects. It can be expanded or contracted by clicking on the button on its edge.
          ListThe list component is a very simple list for managing a small number of items. If you need to manage a lot of items, use the genlist component instead.
          LabelThe label component displays text with simple HTML-like markup.
          ImageThe image component can load and display an image from a file or from memory.
          IconThe icon component inherits from the image component. It is used to display images in an icon context.
          ProgressbarThe progressbar component can be used to display the progress status of a given job.
          PhotocamThe photocam component is designed to display high-resolution photos taken with a digital camera. It allows you to zoom photos, load photos fast, and fit photos. It is optimized for JPEG images and has a low memory footprint.
          User inputButtonThe button component is a simple push button. It is composed of a label icon and an icon object, and has an auto-repeat feature.
          CheckThe check component toggles the value of a Boolean between true and false.
          RadioThe radio component can display 1 or more options, but the user can only select one of them. The UI component is composed of an indicator (selected/unselected), an optional icon, and an optional label. Even though it is usually grouped with 2 or more other radio components, it can also be used alone.
          EntryThe entry component is a box to which the user can enter text.
          SliderThe slider component is a draggable bar that is used to select a value from a range of values.
          DatetimeThe datetime component can display and input date and time values.
          ColorselectorThe colorselector component provides a color selection solution to the user. It has different modes available, each of them showing a different configuration of the color selection.
          SpinnerThe spinner component enables the user to increase or decrease a numeric value by using arrow buttons.
          Assist viewsPopupThe popup component shows a pop-up area that can contain a title area, a content area, and an action area.
          CtxpopupThe ctxpopup component is a contextual popup that can show a list of items.
          NotifyThe notify component displays a container in a specific region of the parent object. It can receive some content, and it can be automatically hidden after a certain amount of time.
          TooltipThe tooltip component is a smart object used to show tips or information about a parent object when the mouse hovers over the parent object.
          TransitionTransitThe transit component can apply several transition effects to an Evas object, such as translations and rotations.
          FlipThe flip component can hold two Evas objects and let the user flip between these objects using a variety of predefined animations.
          Hardware accelerationGLViewThe GLView component can render OpenGL in an Elementary object, hiding EvasGL complexity.
          MiscellaneousMapThe map component can display a geographic map. The default map data is provided by the OpenStreetMap project (http://www.openstreetmap.org/).
          PlugThe plug component allows you to show an Evas object created by another process. It can be used anywhere like any other Elementary UI component.
          + + +

          Mobile UI Component Styles

          + +

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          + +

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component. For more detailed information, see the Themes.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Button styles
          StyleSampleText partSwallow partNotes
          elm/button/base/default elm.textelm.swallow.content
          elm/button/base/anchorelm.textelm.swallow.content
          elm/button/base/bottomelm.textelm.swallow.contentThis style is used widely at the bottom of the screen.
          elm/button/base/circleelm.textelm.swallow.content
          elm/button/base/dropdownelm.text
          elm/button/base/hoversel_horizontal/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_horizontal_entry/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_vertical/defaultelm.textelm.swallow.content
          elm/button/base/hoversel_vertical_entry/defaultelm.textelm.swallow.content
          elm/button/base/icon_reorder
          elm/button/base/naviframe/drawers
          elm/button/base/naviframe/title_cancel
          elm/button/base/naviframe/title_done
          elm/button/base/option
          + + + +++ + + + + + + + + + + + + + + + + + +
          Table: Check styles
          StyleSample
          elm/check/base/default
          elm/check/base/favorite
          elm/check/base/on&off
          + + + + + + + + + + + + + + + +
          Table: Colorselector styles
          StyleSampleNotes
          elm/colorselector/item/color/colorplaneUse the following command: elm_colorselector_mode_set(colorselector, ELM_COLORSELECTOR_PALETTE);
          + + + + + + + + + + + + + + + + + +
          Table: Progressbar styles
          StyleSample
          default
          wheel
          + + + +++ + + + + + + + + + +
          Table: Radio styles
          StyleSample
          default
          + + + + + + + + + + + + + + + + + +
          Table: List styles
          StyleSampleText partSwallow part
          defaultelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          + + + + + + + + + + + + + + + + + +
          Table: Multi Button Entry styles
          StyleSampleText partNotes
          elm/multibuttonentry/base/defaultelm.text, guideThe guide text part is used when there is no item in the Multi Button Entry. It is removed automatically when an item is appended in the Multi Button Entry.
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Toolbar styles
          StyleSampleText partSwallow partNotes
          elm/toolbar/base/default
          elm/toolbar/base/navigationbar
          elm/toolbar/base/tabbar_with_title
          elm/toolbar/item/defaultelm.textelm.swallow.iconThis style is for the toolbar's item. Check the elm_toolbar_item_append() function to set the text and the icon.
          elm/toolbar/item/navigationbarelm.textThis style is for the toolbar's item. Check the elm_toolbar_item_append() function to set the text and the icon.
          + + + +++ + + + + + + + + + +
          Table: Flipselector styles
          StyleSample
          default
          + +

          The style of the genlist's item is not set by external APIs. Check the guide of Genlist to check how to use the item class to set the item's style.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          default_styleelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          double_labelelm.text: for the main text. +

          elm.text.sub: for the sub text.

          elm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          end_iconelm.textelm.swallow.icon
          fullelm.swallow.contentThe swallow part is the full size of the item. There is no padding in the item.
          group_indexelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          one_iconelm.textelm.swallow.icon
          messageelm.text: for the text on the top. +

          elm.title.1: for the text in the middle.

          +

          elm.title.2: for the text on the bottom.

          + +

          The style of the gengrid's item is not set by external APIs. For more information on using the item class to set the item's style, see the guide of gengrid.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Gengrid styles
          StyleSampleText partSwallow partNotes
          defaultelm.swallow.icon
          album-previewelm.textelm.swallow.icon
          blockThis style is used to show an empty area.
          group_indexelm.textelm.swallow.icon
          default_gridelm.swallow.icon
          default_gridtext2elm.textelm.swallow.icon
          default_gridtextelm.textelm.swallow.icon
          default_styleelm.textelm.swallow.icon
          + + + + + + + + + + + + + +
          Table: Segmentation Control styles
          StyleSample
          default
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Index styles
          StyleSampleNotes
          defaultThis style is for supporting the vertical style.
          defaultThis style is for supporting the horizontal style. To set a horizontal index, use the elm_index_horizontal_set.
          pagecontrolThis style is used for the "page control" layout. For more information, refer to the Core Control sample application.
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Contextual Popup (Ctxpopup) styles
          StyleSampleNotes
          default
          dropdown/listThe size of the item and the ctxpopup follow the size of the screen.
          dropdown/labelThe size of the item and the ctxpopup follow the maximum length of the item.
          + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Icon styles
          StyleSample
          apps
          arrow_down
          arrow_left
          arrow_right
          arrow_up
          chat
          clock
          close
          delete
          edit
          file
          home
          media_player/forward
          media_player/info
          media_player/next
          media_player/pause
          media_player/play
          media_player/prev
          media_player/rewind
          media_player/stop
          menu/apps
          menu/arrow_down
          menu/arrow_left
          menu/arrow_right
          menu/arrow_up
          menu/chat
          menu/clock
          menu/close
          menu/delete
          menu/edit
          menu/file
          menu/folder
          menu/home
          menu/refresh
          no_photo
          photo/no_photo
          refresh
          toolbar/apps
          toolbar/arrow_down
          toolbar/arrow_left
          toolbar/arrow_right
          toolbar/arrow_up
          toolbar/chat
          toolbar/clock
          toolbar/close
          toolbar/delete
          toolbar/edit
          toolbar/file
          toolbar/folder
          toolbar/home
          toolbar/more_menu
          toolbar/refresh
          + + + + + + + + + + + + + + + + + + + +
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. +

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          + + + +++ + + + + + + + + + + + + + + + + + +
          Table: Datetime styles
          StyleSample
          date_layout
          time_layout
          time_layout_24hr
          + + + + + + + + + + + + + + + + + +
          Table: Panel (drawer) styles
          StyleSampleSwallow partNotes
          defaultelm.swallow.contentFor more information on the drawer, see the [UI Sample] Core Control guide.
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          horizontal/center_pointelm.swallow.icon
          vertical/center_point
          vertical/default
          + + + +++ + + + + + + + + + + + + + +
          Table: Popup styles
          StyleSample
          default
          toast
          + + + +++ + + + + + + + + + + + + + +
          Table: Spinner styles
          StyleSample
          horizontal
          vertical
          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/ui_components_n.htm b/org.tizen.ui.practices/html/native/efl/ui_components_n.htm new file mode 100644 index 0000000..0079e6f --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ui_components_n.htm @@ -0,0 +1,693 @@ + + + + + + + + + + + + + UI Components: Handling Elementary UI Component Libraries + + + + + +
          + +

          UI Components: Handling Elementary UI Component Libraries

          + +

          Before writing an application, you should already have an answer to the following question: What is an application? An application is a process launched by the user. Every application has at least one window for presenting its content. Users can interact with the content through events. Different sources of events can modify the life cycle of the application. The application may receive data from a network connection, and it may also receive touch and key events. From the computer's point of view, an application is a collection of code that reacts to events and displays content on the screen. Elementary bridges this divide between the user and the code.

          + +

          Elementary provides a variety of pre-built UI components, such as layout objects and components, that allow you to build rich graphical user interfaces for your applications. Every Elementary application has at least one window for presenting its content. The window provides the area in which to display the content and where the Evas canvas is placed.

          + +

          There are three main groups of objects provided by Elementary:

          + +
            +
          • UI components: These are the components with which you build your application UI.
          • +
          • Containers: These are the containers that hold the components.
          • +
          • Infrastructure: These are the modules that deal with Elementary as a whole.
          • +
          + +

          Using UI Components

          + +

          The Elementary library is a simple toolkit. It provides several UI components than can be used to compose the user interface of your application. UI components allow you to build your application without having to reinvent basic objects, such as buttons, lists, or text entries. UI components will often generate signals that can be caught in the application when the user interacts with the UI components. This guide teaches you the basics of Elementary, describes selected concepts of the Elementary configuration framework, and describes the most common UI components.

          + +

          Figure: Elementary

          +

          Elementary

          + + +

          Getting Started with the Elementary Library

          + + +

          Elementary UI components are built in a hierarchical fashion. The idea is to factorize as much code as possible between UI components that behave in a similar manner to facilitate the creation of new UI components. The Elementary UI components inherit a lot of their code from the container UI components and the layout component (a container component that takes a standard Edje design file and wraps it very thinly). You can use the container and layout functions on the Elementary UI components, as well as the Elementary object functions, such as elm_object_part_content_set(), elm_object_part_content_get(), and elm_object_part_content_unset().

          + +

          To use the Elementary library:

          + +
          1. Initialize the Elementary library with the elm_init() function.
          2. +
          3. Start the Elementary main loop with the elm_run() function. +

            The function does not return, instead, it constantly loops and runs the event and the processing tasks.

          4. +
          5. Add Elementary UI components in the main loop. +

            Generally, an Elementary UI component can be added with the elm_<UI component name>_add() function, which returns an Evas object (Evas_Object*). The Evas object is passed to the functions that are used to configure the UI component.

          6. +
          7. Stop the main loop and return to the main() function with the elm_exit() function.
          8. +
          9. When your application terminates, shut down the Elementary library with the elm_shutdown() function. +

            The function frees the Elementary objects that were allocated in the main loop, so you do not need to separately deallocate them.

          + + +

          The following code snippet shows the main() function of a minimal Elementary application:

          + +
          +#include <Elementary.h>
          +int main(int argc, char **argv)
          +{
          +   elm_init(argc, argv);
          +   elm_run();
          +   elm_shutdown();
          +
          +   return 0;
          +}
          + + +

          Elementary Objects

          + +

          All objects created using Elementary are of the Evas_Object* type. This means that both Evas and Elementary functions can be used on an Elementary object. However, use Elementary functions on Elementary objects only when you do not know which API to use.

          + +

          Since an Elementary object can take up a lot of memory, the Elm_Object_Item type has been created for situations where you need to use a lot of items, such as in a genlist or gengrid component, and to save memory. Using the Elm_Object_Item type, an Elementary UI component can, in theory, contain a lot of items while maintaining a small memory footprint. In practice, the Elm_Object_Item instance is bigger than expected, but can still help in saving memory.

          + +

          For more information, see Evas Objects.

          + +

          Elementary Callbacks

          + +

          Several callbacks can be registered to handle Elementary object events:

          + +
            +
          • Evas event callback +

            Use the evas_object_event_callback_add() function to add a callback for input events (key up, key down, mouse wheel) on an Evas object. In case of an Elementary object, the callback is registered on the underlying Evas object without considering the Elementary object infrastructure (no event propagation).

            +
          • + +
          • Evas smart callback +

            Use the evas_object_smart_callback_add() function to add a callback for a smart event emitted by an Elementary object. Smart callbacks can only be registered on smart objects, and the "smart event" to register must be implemented by the corresponding smart object. Otherwise, the callback does nothing. The callback does not apply to input events (keyboard or mouse).

            +
          • + +
          • Edje signal callback +

            Use the edje_object_signal_callback_add() function to add a callback for a signal coming from an Edje object (a theme object).

            +
          • + +
          • Elementary signal callback +

            Use the elm_object_signal_callback_add() function to add a callback for a signal coming from an Elementary UI component's theme. The callback does not apply to input events (keyboard or mouse).

            +
          • + +
          • Elementary event callback +

            Use the elm_object_event_callback_add() function to add a callback for an input event (keyboard or mouse) coming from an Elementary object. In contrast to the Evas event callback, the Elementary event callback takes the hierarchy of the object into account: the event can be propagated to the parents of the object, and the parents can process the event.

            +
          • +
          + +

          For more information about events related to Elementary objects, see Event Handling. For more information about Evas objects and smart objects, see Evas Rendering Concept and Method.

          + +

          Managing Elementary Profiles

          + +

          An Elementary profile is a set of preconfigured options that affects the entire look and feel of an application. The options linked to a specific profile form an Elementary configuration, which can be used to store the desired set of options for use in multiple sessions. Once loaded, the Elementary profile configures all the options and sets the look and feel of your Elementary application.

          + +

          To manage Elementary profiles:

          +
            +
          • List the existing profiles: +
            +Eina_List *list = elm_config_profile_list_get();
            +
            +
          • +
          • Set a particular profile: +
            +elm_config_profile_set("myprofile");
            +
            +
          • +
          • Get the current profile: +
            +char *profile = elm_config_profile_get();
            +
            +
          • +
          • To save the current option values as an Elementary configuration for later use, use the Elementary Configuration Save function. +
          • +
          • To reload the Elementary configuration saved for the current profile: +
            +elm_config_reload();
            +
            +
          • +
          + +

          Configuring Elementary Options

          + +

          You can set the following options in the Elementary configuration. In addition, you can customize themes and manage focus.

          +
            + +
          • To scale UI components: +

            You can configure UI component scaling in terms of both interactive and readable areas.

            +
              +
            • Set the global scaling factor (for example, setting it to 2.0 doubles the size of all scalable UI components): +
              +elm_config_scale_set(2.0);
              +
              +
            • + +
            • Set the finger size: +
              +elm_config_finger_size_set(1.5);
              +
              +
            • +
            +
          • + +
          • To manage caches: +
              +
            • Enable the globally configured cache flush, and set the flush interval (in this example, to 60 seconds): +
              +elm_config_cache_flush_enabled_set(EINA_TRUE);
              +elm_config_cache_flush_interval_set(60);
              +
              +
            • + +
            • Configure the font and image cache sizes (to 500 and 5 000 000 bytes, respectively): +
              +elm_config_cache_font_cache_size_set(500);
              +elm_config_cache_image_cache_size_set(5000000);
              +
              +
            • + +
            • Set the Edje collection and Edje file cache sizes: +
              +elm_config_cache_edje_file_cache_size_set(500);
              +elm_config_cache_edje_collection_cache_size_set(500);
              +
              +
            • +
            +
          • + + +
          • To configure the gesture layer: +

            You can set the duration of the long tap and double tap events on the gesture layer objects. The following example sets the duration to 500 ms.

            + +
            +elm_config_glayer_long_tap_start_timeout_set(0.5);
            +elm_config_glayer_double_tap_timeout_set(0.5);
            +
            +
          • +
          • To manage scrolling: +
              +
            • Make the scroller bounce when it reaches its viewport's edge during scrolling by using the elm_config_scroll_bounce_enabled_set() function: +
              +elm_config_scroll_bounce_enabled_set(EINA_TRUE);
              +
              +
            • + +
            • Control the inertia of the bounce animation by using the elm_config_scroll_bounce_friction_set() function: +
              +elm_config_scroll_bounce_friction_set(0.5);
              +
              +

              You can also set the friction for a page scroll, include animations, and zoom animations.

              +
            • + +
            • Set the scroller to be draggable by using the elm_config_scroll_thumbscroll_enabled_set() function. You can configure several drag options, such as friction, sensitivity, acceleration, and momentum. + +

              The following example sets the scroller to be draggable, defines that the number of pixels one must travel while dragging the scroller view to actually trigger scrolling is 20 pixels.

              +
              +elm_config_scroll_thumbscroll_enabled_set(EINA_TRUE);
              +elm_config_scroll_thumbscroll_threshold_set(20);
              +
              +
            • +
            +
          • + +
          • To configure long press events: +

            Get the current timeout before a long press event is retrieved, and modify it. The following example increases the timeout by 1 second.

            +
            +double lp_timeout = elm_config_longpress_timeout_get();
            +elm_config_longpress_timeout_set(lp_timeout + 1.0);
            +
            +
          • + +
          • To configure tooltips: +

            Set the duration after which a tooltip is shown. The following example sets the delay to 2 seconds.

            + +
            +elm_config_tooltip_delay_set(2.0);
            +
            +
          • + +
          • To configure the password show last feature: +

            The password show last feature enables the user to view the last input entered for a few seconds before it is masked.

            + +
              +
            • Enable the password show last feature: +
              +elm_config_password_show_last_set(EINA_TRUE);
              +
              +
            • +
            • Set the visibility timeout (how many seconds the input is visible): +
              +elm_config_password_show_last_timeout_set(5.0);
              +
              +
            • +
            +
          • +
          • To set the Elementary engine: +

            You can define the rendering engine that Elementary uses to draw the windows. The following rendering engines are supported:

            + +
              +
            • "software_x11"
            • +
            • "fb"
            • +
            • "directfb"
            • +
            • "software_16_x11"
            • +
            • "software_8_x11"
            • +
            • "xrender_x11"
            • +
            • "opengl_x11"
            • +
            • "software_gdi"
            • +
            • "software_16_wince_gdi"
            • +
            • "sdl"
            • +
            • "software_16_sdl"
            • +
            • "opengl_sdl"
            • +
            • "buffer"
            • +
            • "ews"
            • +
            • "opengl_cocoa"
            • +
            • "psl1ght"
            • +
            + +
            +elm_config_engine_set("opengl_x11");
            +
            +
          • + +
          • To activate the access mode: +

            Set the access mode as active, so that information about an Elementary object is read when the object receives an EVAS_CALLBACK_MOUSE_IN event.

            +
          • + +
          • To configure the selection mode: +

            Set the selection mode so that the selection is cleared when the entry component is unfocused:

            +
            +elm_config_selection_unfocused_clear_set(EINA_TRUE);
            +
            +
          • + +
          • To enable mirroring: +

            Elementary allows UI mirroring both on a single object and on the entire UI. If mirroring is enabled, an Elementary UI component displays as if there was a vertical mirror in the middle of it. Only the controls and the disposition of the UI component are mirrored. Text is not mirrored.

            + +
            +elm_config_mirrored_set(EINA_TRUE);
            +
            +
          • + +
          • To set the frame rate: +

            Define the frames per second (FPS) value for the ecore_animator_frametime and edje_frametime calculations. This example sets the FPS 60.

            + +
            +elm_config_fps_set(60.0);
            +
            +
          • +
          + +

          Customizing Themes

          + +

          Elementary uses Edje to theme its UI components. Edje provides a default theme for each UI component in an application. You can change the theme using the ELM_THEME environment variable. You can also modify the theme globally with the elementary_config utility.

          + +

          For custom styles, use extensions. Extensions allow you to write styles for specific UI components. Add a new extension to the list of Elementary themes with the elm_theme_extension_add() function, and apply the new style to the UI component with the elm_object_style_set() function. Once set, the extension replaces the default theme of the UI component.

          + + + + + + + + + + +
          Note
          When developing an extension, to respect the signals emitted and the elements that need to be in place, you must know how the UI component is themed. If something is missing from the extension, it can break the UI component's behavior.
          + +

          To modify Elementary themes, you can also use overlays. An overlay can replace the look of all UI components by overriding the default styles. As with extensions, you must write the correct overlay theme for a UI component. When looking for a theme to apply, Elementary first checks the list of overlays, then the set theme, and finally the list of extensions. To add or remove an overlay, use the elm_theme_overlay_add() and elm_theme_overlay_del() functions.

          + + + + + + + + + + +
          Note
          With overlays, you can replace the default view and affect every UI component. This is very similar to setting the theme for the whole application, and probably clashes with end user options. Using overlays also runs the risk of non-matching styles across the application. Unless you have a very good reason to use them, avoid overlays.
          + +

          Managing Focus

          + +

          When an Elementary object has the focus, input events are directly passed to that object in the application window. The focused object can also change its decoration to show the user where the focus is. In an Elementary application, only one object can have the focus at a time.

          + +

          To set the focus to a new Elementary object and take the focus away from the previous focused object, use the elm_object_focus_set() function. You can make an object unfocusable with the elm_object_focus_allow_set() function.

          + + + + + + + + + + +
          Note
          Only visible objects can have the focus.
          + +

          Elementary supports focus chains that allow you to cycle through all the focusable objects in a window. By default, the focus chain is defined by the order in which the UI components are added to the code. It is also possible to define custom focus chains, when needed.

          + +

          For more information on focus, see Component Focus.

          + +

          To manage the focus:

          + +
            +
          • To define a custom focus chain, create an Eina_List, and add the Elementary objects to it in the desired focus order. Use the elm_object_focus_custom_chain_set() function to set the final list as the custom focus chain of the parent object (in the following example, container_object is the parent object). + +
            Eina_List *obj_list = NULL;
            +
            +list = eina_list_append(list, obj1); 
            +list = eina_list_append(list, obj4);
            +list = eina_list_append(list, obj2); 
            +list = eina_list_append(list, obj3);
            +
            +elm_object_focus_custom_chain_set(container_object, list);
            +
          • + +
          • To remove the custom focus chain and use the default focus chain instead, use the elm_object_focus_custom_chain_unset() function. +
          • + +
          • To programmatically cycle through the focus chain, use the elm_object_focus_next() function. +
          • + +
          • To show a highlight on the focused object: + +
            +elm_config_focus_highlight_enabled_set(EINA_TRUE);
            +
            +
          • + +
          • To activate an animation when the focus shifts from one object to another: + +
            +elm_config_focus_highlight_animate_set(EINA_TRUE);
            +
            +
          • +
          + +

          Scaling UI Components

          + +

          Elementary, through its configuration API (elm_config), provides a way to scale UI components with two different parameters. Finger size parameter is used when the interactive zones (clickable, editable) of the UI components need to be scaled in order to be comfortably used with a finger. Scale parameter is responsible for scaling readable parts of a UI component (text or icons for example), so that it is more visible in the user interface.

          + +

          Finger Size

          + +

          Finger size parameter scales UI components based on the user's finger size. This is useful when using a touchscreen with a finger rather than with a stylus. The finger size parameter is in pixels and determines the minimum size of a square on the screen that is reliably hittable with a finger. This parameter scales the input and interactive areas.

          + +

          The global finger size is set with the elm_config_finger_size_set() function. This adjusts the size and hit area of UI components so they are easy to hit with a finger. The current value is retrieved with the elm_config_finger_size_get() call. The finger size is always in pixel.

          + +

          To increase the current global finger size by 20px:

          + +
          +Evas_Coord finger_size;
          +
          +// Get the current finger size
          +finger_size = elm_config_finger_size_get();
          +
          +// Add 20px to finger size parameter and set it 
          +// to the global Elementary configuration
          +elm_config_finger_size_set(finger_size + 20);
          +
          + +

          Scale

          + +

          This parameter only scales the readable areas of the UI component (text, icons). Parts that must stay pixel-perfect like the highlights, shading, textures and decorations stay as they are.

          + +

          elm_config_scale_set() function is used to set the global scaling factor, that affects to all the UI components. It is also possible to use elm_object_scale_set() to set the scaling factor on a given Elementary UI component and all its children.

          + + + + + + + + + + +
          Note
          The scaling factor is multiplicative, if a child already has a scale size set, it is multiplied by its parent's scale size.
          + +

          The following example sets the global scaling factor to 2.0. Then, the scaling factor of an existing Elementary object is set to 2.0, meaning that this object appears as if it had a 4.0 scale factor, the rest of the application is displayed with a 2.0 scaling factor:

          + +
          +Evas_Object *button;
          +
          +// The button object is created and configured
          +
          +// Set the global scale factor to 2.0
          +elm_config_scale_set(2.0);
          +
          +// Set the scaling factor of the button component to 2.0, this component
          +// appears 4 times bigger than its initial size
          +elm_object_scale_set(button, 2.0);
          +
          + +

          Example

          + +

          This chapter shows the visual result of finger size and scaling factors modification.

          + +

          Figure: elementary_config application

          +

          elementary_config application

          + +

          The previous picture shows the elementary_config application that enables the user to set global scale factor and finger size parameter. As the user drags the sliders, the UI is updated, directly showing the result of the new parameter value.

          + +

          The next picture shows the behavior when the finger size parameter has been increased to 1.30. The text of the sliders and the text of the items in the toolbar are bigger.

          + +

          Figure: Scale increased (1.30)

          +

          Scale increased (1.30)

          + +

          A finger size increase is showed in the image below (increase from 50px to 90 px). Now, the buttons in the toolbar are bigger, so the user can more reliably hit them with a big finger.

          + +

          Figure: Finger size increased (90px)

          +

          Finger size increased (90px)

          + + + + + + + + + + +
          Note
          It is up to the theme (Edje file) to set the parts that are scalable. This is something that needs to be taken into account when developing a new Edje theme. This can be done in EDC with the scale parameter. For more information on how to do that, see Introduction to EDC Programming.
          + +

          Creating Scalable EDC Objects

          + +

          Scale Parameter

          + +

          This chapter explains how to make a scalable Edje object and give hints how to write an EDC file that is scalable. The example shows a basic button that is composed of a background image part and a swallow part that can receive some content.

          + +
          +group 
          +{ 
          +   name: "button";
          +   images 
          +   {
          +      image: "bg.png" COMP;
          +   }
          +   parts 
          +   {
          +      part 
          +      { 
          +         name: "bg";
          +         type: IMAGE;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            image.normal: "bg.png";
          +         }
          +      }
          +      part 
          +      { 
          +         name: "elm.swallow.content";
          +         type: SWALLOW;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            visible: 0;
          +         }
          +         description 
          +         { 
          +            state: "visible" 0.0;
          +            visible:1;
          +         }
          +      }
          +   }
          +}
          +
          + +

          To have a scalable object, set the scale parameter to 1 on the parts you want to be scalable. Here the bg and elm.swallow.content parts must be scalable.

          + +
          +group 
          +{ 
          +   name: "button";
          +   images 
          +   {
          +      image: "bg.png" COMP;
          +   }
          +   parts
          +   {
          +      part 
          +      { 
          +         name: "bg";
          +         type: IMAGE;
          +         scale: 1;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            image.normal: "bg.png";
          +         }
          +      }
          +      part 
          +      { 
          +         name: "elm.swallow.content";
          +         type: SWALLOW;
          +         scale: 1;
          +         description 
          +         { 
          +            state: "default" 0.0;
          +            visible: 0;
          +         }
          +         description 
          +         { 
          +            state: "visible" 0.0;
          +            visible:1;
          +         }
          +      }
          +   }
          +}
          +
          + +

          Image Set

          + +

          If your application needs to be used at different resolutions it is recommended to have 2 images for the background image bg.png. Here the bg_low.png is added to the application. It is used when the size of the image is under 500 px, and a bg_high.png image is for higher resolutions. Use a set on the bg.png image.

          + +
          +group 
          +{ 
          +   name: "button";
          +   images 
          +   {
          +      set 
          +      {
          +         name: "bg.png";
          +         image
          +         {
          +            image: "bg_low.png" COMP;
          +            size: 0 0 200 100;
          +         }
          +         image
          +         {
          +            image: "bg_high.png" COMP;
          +            size: 201 101 5000 5000;
          +         }
          +      }
          +   }
          +}
          +
          + +

          The image below shows three buttons with only a background part visible (the SWALLOW part is empty).

          + +

          Figure: Image set example

          +

          Image set example

          + +

          The first button's size is 100x50 pixels, the background image (bg_low.png) is the same size. The second button is twice bigger than the first one (200x100 pixels). The image is scaled and it does not render well, the borders are quite blurry.

          + +

          To prevent this, the image set has a bigger image to use when the size is bigger than 200x100 pixels (bg_high.png). The third button size is 201x101 pixels and it uses the new image, which has a better quality than the scaled image.

          + +

          Image Borders

          + +

          When the button is resized, the image part is also resized because it is marked as scalable. To get the image resized but to keep the image border as it is, use the border parameter. It specifies the border size which is not resized even if the image is.

          + +

          To add a 40 pixel border on the left and right part of the bg image and a 20 pixel border on top and bottom borders:

          + +
          +parts 
          +{
          +   part 
          +   { 
          +      name: "bg";
          +      type: IMAGE;
          +      scale: 1;
          +      description 
          +      { 
          +         state: "default" 0.0;
          +         image.normal: "bg.png";
          +         image.border: 40 40 20 20;
          +      }
          +   }
          +}
          +
          + +

          The image below shows that when resizing the button, the corners keep their initial ratio. Only the middle part of the button is resized.

          + +

          Figure: Border example

          +

          Border example

          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/ui_components_wn.htm b/org.tizen.ui.practices/html/native/efl/ui_components_wn.htm new file mode 100644 index 0000000..49b57f8 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ui_components_wn.htm @@ -0,0 +1,883 @@ + + + + + + + + + + + + + Wearable UI Components + + + + + +
          + +

          Wearable UI Components

          + +

          The EFL Elementary is a set of fast, finger-friendly, scalable, and themeable UI component libraries. The number of supported UI components is around 80, including both containers and non-containers. Originally, the Elementary was developed as part of the Window Manager development on Desktop devices. For the wearable profile, Tizen reused the proper UI components and created new UI styles for rectangular and circular wearable devices, and then enhanced and adjusted all of them for Tizen native applications.

          + +

          This feature is supported in wearable applications only.

          + +

          The UI components are wearable-friendly: for example, the Circle Datetime component extends the elm_date_time by visualizing the selected field, the Circle Genlist component provides a scrollbar with circular movement, and the Circle progress bar/scroller/slider components are adjusted to the circular design.

          +

          The wearable UI components were designed to allow the user to interact with small touch screen-equipped wearable devices with rotary component parts. Therefore, when developing wearable applications, you can easily use them through the wearable-related infrastructure in company with full notification and when reacting to touch and rotary events and the user finger size.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Available UI components +
          CategoryComponent nameDescription
          Navigation elementsIndexThe index component provides an index for fast access to another group of UI items.
          Presentation viewsWinThe win component is the root window component that will be often used in an application. It allows you to create some content in it, and it is handled by the window manager.
          BackgroundThe background component can be used to set a solid background decoration to a window or a container object. It works like an image, but has some background specific properties, such as setting it to tiled, centered, scaled, or stretched.
          GenlistThe genlist component displays a scrollable list of items. It can hold a lot of items while still being fast and memory-efficient (only the visible items are allocated memory).
          ListThe list component is a very simple list for managing a small number of items. If you need to manage a lot of items, use the genlist component instead.
          LabelThe label component displays text with simple HTML-like markup.
          ImageThe image component can load and display an image from a file or from memory.
          IconThe icon component inherits from the image component. It is used to display images in an icon context.
          ProgressbarThe progressbar component can be used to display the progress status of a given job.
          User inputButtonThe button component is a simple push button. It is composed of a label icon and an icon object, and has an auto-repeat feature.
          CheckThe check component toggles the value of a Boolean between true and false.
          RadioThe radio component can display 1 or more options, but the user can only select one of them. The UI component is composed of an indicator (selected/unselected), an optional icon, and an optional label. Even though it is usually grouped with 2 or more other radio components, it can also be used alone.
          EntryThe entry component is a box to which the user can enter text.
          SliderThe slider component is a draggable bar that is used to select a value from a range of values.
          DatetimeThe datetime component can display and input date and time values.
          Assist viewsPopupThe popup component shows a pop-up area that can contain a title area, a content area, and an action area.
          CtxpopupThe ctxpopup component is a contextual popup that can show a list of items.
          NotifyThe notify component displays a container in a specific region of the parent object. It can receive some content, and it can be automatically hidden after a certain amount of time.
          TransitionTransitThe transit component can apply several transition effects to an Evas object, such as translations and rotations.
          Hardware accelerationGLViewThe GLView component can render OpenGL in an Elementary object, hiding EvasGL complexity.
          MiscellaneousPlugThe plug component allows you to show an Evas object created by another process. It can be used anywhere like any other Elementary UI component.
          + +

          The following UI components were designed for specific circular wearable devices which have rotary component parts. In a circular device, you can draw round UI components, such as a slider, progressbar, and scroller. Generally, wearable UI components provide compatibility between the rectangular and circular wearable devices. However, use circular UI components for circular wearable devices only, because they have a dependency with the round UX and rotary events. For more information on the compatibility of the UI components between rectangular and circular, see the Wearable Design Guidelines.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Available circular UI components +
          Component nameDescription
          Circle DatetimeThe circle datetime extends elm_datetime by visualizing the selected field.
          Circle GenlistThe circle genlist provides a scrollbar with circular movement. It is also operated with rotary events to move to the next or previous item.
          Circle ObjectThe circle object extends elementary components in a form of circular design. Sometimes a circle object merely provides additional UI features to elementary component, and sometimes it works as an independent component with UI and functionalities. +

          Circular components can usually be added with the eext_circle_object_[component_name]_add() function, which returns a circle object handle. Circular components are shown in a form of an arch with radius, line width, and color. These properties can be set with the eext_circle_object_item* APIs. The circle object can also take a rotary event. Generally, a clockwise rotary event increases the value of the rotary event activated by the circle object, and a counter clockwise rotary event decreases the value.

          Circle ProgressbarThe circle progressbar aims to show the progress status of a given task with circular design. It visualizes the progress status within a range.
          Circle ScrollerThe circle scroller changes corresponding to the rotary events. It shows the whole scrollable area with a circular scroll bar.
          Circle SliderThe circle slider changes corresponding to rotary events. The circle slider not only extends the UI feature of the elm_slider, but also replaces the functionalities of the elm_slider in a circular design.
          Circle SurfaceThe circle surface manages and renders circle objects. Multiple circle objects can be connected to one circle surface as candidates of an object to be rendered.
          Rotary SelectorThe rotary selector shows multiple items around a selector, and can change pages through rotary events.
          More OptionThe more option contains a cue button, which, when clicked, reveals a rotary selector view.
          Circle SpinnerThe circle spinner shows a spinner value as a marker around the circular display.
          + +

          Wearable Rectangular UI Component Styles

          + +

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          + +

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component. For more detailed information, see the Themes.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Button styles
          StyleSampleText partSwallow partNotes
          default elm.textelm.swallow.content
          greenelm.textelm.swallow.content
          orangeelm.textelm.swallow.content
          redelm.textelm.swallow.content
          nextdepth
          naviframe/title_iconelm.swallow.contentThe icon can be set with the elm_object_part_content_set(btn, "icon", ic) function.
          + + + +++ + + + + + + + + + + + + + +
          Table: Check styles
          StyleSample
          default
          on&off
          + + + + + + + + + + + + + + + +
          Table: Contextual popup (Ctxpopup) styles
          StyleSampleNotes
          defaultUse the elm_ctxpopup_item_append() function to add both text and an icon to the list.
          + + + +++ + + + + + + + + + + + + + +
          Table: Datetime styles
          StyleSample
          datepicker_layout
          timepicker_layout
          + + + + + + + + + + + + + + + + + + + +
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. +

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          group_indexelm.text: for the main text. +

          elm.text.1: for the sub text.

          elm.icon
          1textelm.text
          1text.1iconelm.textelm.icon
          2textelm.text: for the main text. +

          elm.text.1: for the sub text.

          2text.1elm.text: for the main text. +

          elm.text.1: for the sub text.

          1text.1icon.dividerelm.textelm.icon: for the icon. +

          elm.divider: for the icon divider.

          1text.1icon.1elm.textelm.icon
          2text.1icon.1elm.text: for the main text. +

          elm.text.1: for the sub text.

          elm.icon
          multiline/1textelm.text: for the multi-line text.
          multiline/2textelm.text: for the main text. +

          elm.text.1: for the multi-line sub text.

          + + + + + + + + + + + + + + + + + + +
          Table: Index styles
          StyleSample
          thumbnail
          tab
          + + + +++ + + + + + + + + + + + + + +
          Table: Popup styles
          StyleSample
          default
          toast
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Progressbar styles
          StyleSample
          default
          pending_list
          process
          process/groupindex
          + + + +++ + + + + + + + + + +
          Table: Radio styles
          StyleSample
          default
          + + + + + + + + + + + + + + + + +
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          + + +

          Wearable Circular UI Component Styles

          + +

          EFL can separate the GUI and logic of each UI component, resulting in each component having a different style of look. To change the styles of UI components, use the elm_object_style_get() and elm_object_style_set() functions to get and apply the style for a specific UI component.

          + +

          The following tables list the styles for each winset, including the names of the styles, and the name of the part where to set text or some other Evas_Object in the UI component.

          + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Button styles
          StyleSampleText partSwallow partNotes
          default elm.textelm.swallow.content
          bottomelm.textelm.swallow.content
          + + + +++ + + + + + + + + + + + + + + + + + +
          Table: Check styles
          StyleSample
          default
          small
          on&off
          + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Contextual popup (Ctxpopup) styles
          StyleSampleNotes
          select_mode
          select_mode/topPair this style with select_mode/bottom.
          select_mode/bottomPair this style with select_mode/top.
          + + + +++ + + + + + + + + + + + + + +
          Table: Datetime styles
          StyleSample
          datepicker/circle
          timepicker/circle
          + + + + + + + + + + + + + + + + + + + +
          Table: Entry styles
          StyleSampleText partSwallow partNotes
          defaultelm.guide: for the guide text. +

          elm.text: for the main text.

          The guide text is automatically erased when the main text is entered.
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          Table: Genlist styles
          StyleSampleText partSwallow partNotes
          defaultelm.textelm.swallow.icon: for the icon on the left. +

          elm.swallow.end: for the icon on the right.

          titleelm.text
          groupindexelm.text
          1textelm.text
          1text.1iconelm.textelm.icon
          2textelm.text: for the main text. +

          elm.text.1: for the sub text.

          1text.1icon.dividerelm.textelm.icon: for the icon. +

          elm.divider: for the icon divider.

          1text.1icon.1elm.textelm.icon
          2text.1icon.1elm.text: for the main text. +

          elm.text.1: for the sub text.

          elm.icon
          editfieldelm.text
          + + + + + + + + + + + + + + + + + + +
          Table: Index styles
          StyleSample
          thumbnail
          circle
          + + + +++ + + + + + + + + + + + + + +
          Table: Popup styles
          StyleSample
          circle
          toast/circle
          + + + + + + + + + + + + + + + + + +
          Table: Progressbar styles
          StyleSample
          process
          process/small
          + + + +++ + + + + + + + + + +
          Table: Radio styles
          StyleSample
          default
          + + + + + + + + + + + + + + + + +
          Table: Slider styles
          StyleSampleSwallow part
          horizontal/defaultelm.swallow.icon
          + + + + + + + + + + + +
          Note
          Except as noted, this content is licensed under LGPLv2.1+.
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/ui_containers_n.htm b/org.tizen.ui.practices/html/native/efl/ui_containers_n.htm new file mode 100644 index 0000000..44bf030 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ui_containers_n.htm @@ -0,0 +1,131 @@ + + + + + + + + + + + + + UI Containers: Creating Layouts Using Container UI Components + + + + + +
          + +

          UI Containers: Creating Layouts Using Container UI Components

          + +

          All applications use containers to create the layout of the UI. The EFL and Elementary support several ways to create this layout. You can use predefined layouts or animated layouts, or you can create your own layouts. It is important to note that container UI components do not have their own visual identity - only logical structures for assignment or placement of the UI components.

          + +

          When you use container components, such as naviframe, conformant, button, and box, you need to understand certain APIs related to alignment, and EDC parts for, for example, the core layout and animated layout. For more information on the containers EDC parts, see Positioning and Laying out Parts Using the EDC File. The use of the container UI components only differs from the use of the UI components through their absence of a visual identity.

          + +

          Most of the time, your application has to manage multiple views. The easiest way to handle them with the EFL is to create a naviframe object. This object is a container. At first, it is used to contain the pages your application is composed of. Every Tizen application can use this top-layer object to facilitate navigation. More details can be found in Creating a Naviframe for Navigation.

          + +

          Another interesting object that has to be present in every application is the conformant object. Conformant is a container component that accounts for the space taken up by the indicator, virtual keyboard, and softkey windows. The conformant content will be resized and positioned based on the space available. When the virtual keyboard is displayed, the content does not change.

          + +

          Figure: Basic EFL application structure

          +

          Basic EFL application structure

          + +

          Container Components

          + +

          The following table lists the available UI container components.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Available container components +
          Container nameDescription
          BoxOne of the most simple containers in the EFL is a box.
          ConformantA conformant is a container component that accounts for the space taken by the indicator, virtual keyboard, and softkey windows.
          GridIn a grid, objects are placed at specific positions along a fixed grid.
          LayoutA layout is a container component that takes a standard Edje design file and wraps it very thinly in a UI component.
          MapbufA mapbuf is a container component that uses an Evas map to hold a content object. This UI component is used to improve the moving and resizing performance of complex UI components.
          NaviframeA naviframe component consists of a stack of views. New views are pushed on top of previous ones, and only the top-most view is displayed.
          Panes
          (in mobile applications only)
          A panes component adds a draggable bar between two sections of content. The sections are resized when the bar is dragged.
          ScrollerA scroller holds (and clips) a single object and allows you to scroll across it.
          TableA table is like a box but with 2 dimensions.
          + + + + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/efl/ui_scalability_n.htm b/org.tizen.ui.practices/html/native/efl/ui_scalability_n.htm new file mode 100644 index 0000000..5c5bca9 --- /dev/null +++ b/org.tizen.ui.practices/html/native/efl/ui_scalability_n.htm @@ -0,0 +1,70 @@ + + + + + + + + + + + + + Scaling: Handling Screen and Object Sizes + + + + + +
          + +

          Scaling: Handling Screen and Object Sizes

          + +

          Supporting UI scalability in a user interface toolkit means that container components and UI components are scaled properly when the resolution or screen size changes. The Elementary library allows you to manipulate scaling on a per-UI-component basis using a scale factor based on the screen resolution, size, and profile configurations.

          + +

          Tizen native applications can run on different types of devices, such as wearable, phone, tablets, and TVs. Tizen also supports various resolutions (WVGA - XQXGA) with the same layouts and resources. However, remember that you must always polish your work to create an optimal application for each device.

          + +

          The main scalability features are:

          +
            +
          • Multiple Screen Support

            Enables you to design applications for different kinds of screens.

          • +
          • Scalability Support

            Enables you to design applications so that their UI can be scaled for diverse devices without problems.

          • +
          • Resource Fallback Support

            Enables you to design applications which can use alternative resources for the device display state.

          • +
          + + + +
          + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/native/guides_n.htm b/org.tizen.ui.practices/html/native/guides_n.htm new file mode 100644 index 0000000..9aa849b --- /dev/null +++ b/org.tizen.ui.practices/html/native/guides_n.htm @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + Tizen Native UI Practices + + + + + + +
          +

          Tizen
          +Native UI Practices

          + +

          The UI framework features include various aspects of creating a visual outlook for the user application to ensure the best possible user experience.

          + +

          The UI framework is a universal, reusable software environment that provides the essential building blocks as part of the Tizen platform to facilitate the development of Tizen native applications. The framework provides the window, UI components, and scene-based graphic rendering architecture needed to manage your application user interface. In addition, the framework provides animations and effects needed to make your application more fresh and vivid, event handling and the main loop to interact with the user and system, and more features, such as scalability, and font setting.

          + +

          The Tizen platform provides the following native UI toolkit frameworks for developing a native application:

          + +
            +
          • EFL (Enlightenment Foundation Libraries) +

            EFL provides streamlined graphic core libraries you need to create powerful applications. EFL needs lower memory but provides high performance, and supports a retained mode graphics system and user-centric features, such as themes, 2D/3D effects, and accessibility. In addition, EFL supports various resolutions with the same layout, fast and small file systems, a variety of programming language bindings, and a separate UI and logic.

            +

            Generally, select the EFL UI toolkit if you are creating a 2D-based Tizen native application. However, EFL supports 2.5D and 3D effects and 3D objects as well.

          • +
          • DALi (Dynamic Animation Library) +

            DALi is based on OpenGL ES 2.0 and 3.0; however it hides the complexity of the OpenGL ES API from you. DALi requires a GPU (Graphical Processing Unit) on the device.

            +

            Select the DALi 3D UI toolkit if you are creating a high-performance rich UI application.

          • +
          + + + + + +
          + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/scripts/common.js b/org.tizen.ui.practices/html/scripts/common.js new file mode 100644 index 0000000..60250b6 --- /dev/null +++ b/org.tizen.ui.practices/html/scripts/common.js @@ -0,0 +1,1752 @@ +$(document).ready(function(){ + $('#contents table').each(function(){ + if (!$(this).parent().hasClass('table')) { + $(this).wrap('
          '); + } + }); + + // Lnb Menu Initialize + if($('div#contents').find('.lnb').length){ + if($("ul li.events_news").size() > 0) { + $("ul.lnb").after("

          \"Samsung

          "); + } + initLnb(); + initScript(staticURL + "/js/fixednavbar.js", function(){}); + } + + //family site + if($('div#footer').find('dl#familySlider').length){ + fn_rollToEx('familySlider', 'sliderBanner', 1, true); + } + + // Svn Commit Test + + // Language Selection + if($('div#header').find('.util').length){ + var $lang = $('div#header').find('.util'); + $lang.find('a.lang').toggle(function(){ + $(this).css('background-image', $(this).css('background-image').replace('.gif','_.gif')).next('ul.language').show(); + },function(){ + $(this).css('background-image', $(this).css('background-image').replace('_.gif','.gif')).next('ul.language').hide(); + }); + + $lang.bind('mouseleave',function(){ + $(this).find('ul.language').hide(); + $lang.find('a.lang').css('background-image', $lang.find('a.lang').css('background-image').replace('_.gif','.gif')); + }); + + $lang.find('ul.language').children().last().on("keydown", function(e) { + if(e.which == 9 && e.shiftKey) { + return true; + } + + if(e.which == 9) { + e.preventDefault(); + $lang.find('ul.language').hide(); + $lang.find('a.lang').css('background-image', $lang.find('a.lang').css('background-image').replace('_.gif','.gif')); + setTimeout(function() { + $("#searchTop").focus(); + }, 1); + } + }); + } + + // Open the Sitemap + var $open = $('div#header').find('.bt-open'); + $open.bind('click',function(){ + var $self = $(this); + var $sitemap = $('div#wrapper').find('div#sitemap'); + //var source = $sitemap.is(':visible') ? $self.css('background-image').replace('_.gif','.gif') : $self.css('background-image').replace('.gif','_.gif'); + + if($sitemap.is(':visible')){ + var source = $self.css('background-image').replace('_.gif','.gif'); + //if($('body#main').length) $('#header .util').css('border-bottom','3px solid #e4e4e4'); + + $self.attr('title','open sitemap'); + }else{ + var source = $self.css('background-image').replace('.gif','_.gif'); + //if($('body#main').length) $('#header .util').css('border-bottom','3px solid #114196'); + + $self.attr('title','close sitemap'); + } + + $self.css('background-image',source); + $sitemap.slideToggle('fast'); + + $sitemap.find('ul').filter(':last').children().filter(':last').focusout(function(){ + var source = $self.css('background-image').replace('_.gif','.gif'); + $self.css('background-image',source); + $sitemap.slideToggle('fast'); + }); + + }); + + // Search Auto Complete + var $search = $('div#header').find('fieldset.search'); + var $searchList = $search.find('#topAutocomplete>ul'); + + if($search.length){ + $search.find('> input').each(function(){ + $(this).bind({ + keydown : function(e){ + + if(e.type=='keydown'&& $(this).val().length!=0){ + $search.find('#topAutocomplete').show(); + var hei = $searchList.outerHeight(); + if(hei>400){ + $searchList.css({'height':'400px','overflow-y':'auto'}); + } + } + if(e.keyCode==9){ + $search.unbind('focusout.search'); + } + if(e.keyCode==40){ + $search.find('#topAutocomplete>ul').children(':first').find('a').focus(); + //window.scrollTo(0,0); + } + }, + focusin : function(e){ + if($(this).val()==='Search'){ + $(this).val(''); + } + }, + focusout : function(e){ + if($(this).val().length==0) $(this).val('Search'); + } + }); + }); + + //$('#topAutocomplete>ul').children().find('a').bind('focusin',function(e){ + // if(e.keyCode==40){ + // $(this).parent().next().css('border','1px solid red').find('a').focus(); + // } + //}); + + $search.find('#topAutocomplete').bind('mouseleave',function(e){ + if($search.find('> input').val().length==0){ + $search.find('> input').val('Search'); + } + $search.find('#topAutocomplete').hide(); + }); + + $search.find('#topAutocomplete>ul').children().last().focusout(function(){ + $search.find('> input').val('Search'); + $search.find('#topAutocomplete').hide(); + + //$search.bind('focusout.search', function(){ + // $(this).find('> input').val('Search'); + // $(this).find('#topAutocomplete').hide(); + //}); + }); + } +}); + +// 비차단 동적 스크립트 로딩 +function initScript(url, callback){ + var script = document.createElement("script"); + script.type = "text/javascript"; + + if(script.readyState){ // 인터넷 익스플로러 + script.onreadystatechange = function(){ + if(script.readyState=="loaded" || script.readyState=="complete"){ + script.onreadystatechange = null; + callback(); + } + }; + }else{ // 다른 브라우저 + script.onload = function(){ + callback(); + }; + } + + script.src = url; + document.getElementsByTagName("head")[0].appendChild(script); +} + + +// lnb +function initLnb(){ + var sMenu = $('.lnb'); + var sItem = sMenu.find('>li'); + + sItem.each(function(){ + if($(this).find('a').hasClass('more')){ + if($(this).find('ul').is(":visible")) { + $('').insertAfter($(this).find('a').eq(0)); + } else { + $('').insertAfter($(this).find('a').eq(0)); + } + } + }); + + var setIcoArrText = function(obj) { + if(obj.next().is(":visible")) { + obj.text("close submenu"); + } else { + obj.text("open submenu"); + } + } + + sItem.find('.ico-arr').on("click", function() { + var $that = $(this); + var liBox = $that.parent(); + var ulBox = $that.next(); + + sItem.not(liBox).not(".on").find("a.more").next().next().hide(); + sItem.not(liBox).removeClass("active").find("a").removeClass("bov"); + + if(liBox.hasClass("on")) { + if(ulBox.is(":visible")) { + ulBox.hide(); + $that.addClass("ico-on"); + } else { + ulBox.show(); + $that.removeClass("ico-on"); + } + setIcoArrText($that); + return true; + } + + if(liBox.hasClass("active")) { + liBox.removeClass("active").find("a").eq(0).removeClass("bov"); + ulBox.hide(); + } else { + liBox.addClass("active").find("a").eq(0).addClass("bov"); + ulBox.show(); + } + setIcoArrText($that); + }); + + sItem.hover(function(){ + if($(this).hasClass('on')||$(this).hasClass('active')) return false; + $(this).find("a").eq(0).addClass("bov"); + },function(){ + if($(this).hasClass('on')||$(this).hasClass('active')) return false; + $(this).find("a").eq(0).removeClass("bov"); + + }); +} + +//footer rolling banner +function fn_rollToEx(container,objectId,step,auto){ + + // 롤링할 객체를 변수에 담아둔다. + var el = $('#'+container).find('#'+objectId); + var lastChild; + var speed = 3000; + var timer = 0; + var autoplay = false; + + el.data('prev', $('#'+container).find('.prev')); //이전버튼을 data()메서드를 사용하여 저장한다. + el.data('next', $('#'+container).find('.next')); //다음버튼을 data()메서드를 사용하여 저장한다. + el.data('size', el.children().outerWidth()); //롤링객체의 자식요소의 넓이를 저장한다. + el.data('len', el.children().length); //롤링객체의 전체요소 개수 + el.data('animating',false); + el.data('step', step); //매개변수로 받은 step을 저장한다. + el.data('autoStart', false); //매개변수로 받은 step을 저장한다. + + el.css('width',el.data('size')*el.data('len')); //롤링객체의 전체넓이 지정한다. + + if(arguments.length==4){ + el.data('autoStart', auto); + } + + if(el.data('autoStart')){ + if(timer==0){ + timer = setInterval(moveNextSlide, speed); + autoplay = true; + } + } + + el.bind({ + mouseenter:function(){ + if(!autoplay) return false; + + if(timer!=0 && el.data('autoStart')){ + clearInterval(timer); + timer=0; + } + }, + mouseleave:function(){ + if(!autoplay) return false; + + if(timer==0 && el.data('autoStart')){ + timer = setInterval(moveNextSlide, speed); + } + } + }); + + + //el에 첨부된 prev 데이타를 클릭이벤트에 바인드한다. + el.data('prev').bind({ + click:function(e){ + e.preventDefault(); + movePrevSlide(); + }, + mouseenter:function(){ + + $(this).find('img').addClass('btnOn'); + + if(!autoplay) return false; + + if(timer!=0 && el.data('autoStart')){ + clearInterval(timer); + timer=0; + } + }, + mouseleave:function(){ + + $(this).find('img').removeClass('btnOn'); + + if(!autoplay) return false; + + if(timer==0 && el.data('autoStart')){ + timer = setInterval(moveNextSlide, speed); + } + } + }); + + //el에 첨부된 next 데이타를 클릭이벤트에 바인드한다. + el.data('next').bind({ + click:function(e){ + e.preventDefault(); + moveNextSlide(); + }, + mouseenter:function(){ + + $(this).find('img').addClass('btnOn'); + + if(!autoplay) return false; + + if(timer!=0 && el.data('autoStart')){ + clearInterval(timer); + timer=0; + } + }, + mouseleave:function(){ + + $(this).find('img').removeClass('btnOn'); + + if(!autoplay) return false; + + if(timer==0 && el.data('autoStart')){ + timer = setInterval(moveNextSlide, speed); + } + } + }); + + function movePrevSlide(){ + if(!el.data('animating')){ + //전달된 step개수 만큼 롤링객체의 끝에서 요소를 선택하여 복사한후 변수에 저장한다. + var lastItem = el.children().eq(-(el.data('step')+1)).nextAll().clone(true); + lastItem.prependTo(el); //복사된 요소를 롤링객체의 앞에 붙여놓는다. + el.children().eq(-(el.data('step')+1)).nextAll().remove(); //step개수만큼 선택된 요소를 끝에서 제거한다 + el.css('left','-'+(el.data('size')*el.data('step'))+'px'); //롤링객체의 left위치값을 재설정한다. + + el.data('animating',true); //애니메이션 중복을 막기 위해 첨부된 animating 데이타를 true로 설정한다. + + el.animate({'left': '0px'},'normal',function(){ //롤링객체를 left:0만큼 애니메이션 시킨다. + el.data('animating',false); + }); + } + return false; + } + + function moveNextSlide(){ + if(!el.data('animating')){ + el.data('animating',true); + + el.animate({'left':'-'+(el.data('size')*el.data('step'))+'px'},'normal',function(){ //롤링객체를 첨부된 size와 step을 곱한 만큼 애니메이션 시킨다. + //전달된 step개수 만큼 롤링객체의 앞에서 요소를 선택하여 복사한후 변수에 저장한다. + var firstChild = el.children().filter(':lt('+el.data('step')+')').clone(true); + firstChild.appendTo(el); //복사된 요소를 롤링객체의 끝에 붙여놓는다. + el.children().filter(':lt('+el.data('step')+')').remove(); //step개수만큼 선택된 요소를 앞에서 제거한다 + el.css('left','0px'); ////롤링객체의 left위치값을 재설정한다. + + el.data('animating',false); + }); + } + return false; + } + +} + +function fn_slide(options){ + + var opts = jQuery.extend({},options); + + var $bt = $('#'+opts.container).find('#'+opts.bt).children(); //롤링버튼에 대한 선택자 + var $obj = $('#'+opts.container).find('#'+opts.obj); //objectId를 id로 갖는 롤링객체의 선택자 + var $prev = $('#'+opts.container).find('#'+opts.prev).hide(); //이전버튼에 대한 선택자 + var $next = $('#'+opts.container).find('#'+opts.next); //다음버튼에 대한 선택자 + var size = $obj.children().outerWidth(); //롤링객체의 각 이미지 넓이값 + var len = $obj.children().length; //롤링객체의 이미지 갯수 + var effect = false; //슬라이드효과를 위한 boolean변수 + var auto = false; + var current = 0; //현재 보여지는 이미지의 인덱스값을 저장하기 위한 변수 + var time; + + + $obj.css('width',size*len); //롤링객체의 전체넓이 지정 + effect = opts.effect; + auto = opts.auto; + + if(auto){ + time = setTimeout('slideShow()',3000); + } + + slideShow = function(){ + + if(current < len-1){ + current++; + }else{ + current=0; + } + + controllStatus(); + + moveControl('next'); + + time = setTimeout('slideShow()',3000); + } + + controllStatus = function(){ + //이미지의 인덱스값에 따라 이전,다음 버튼 활성여부 지정 + if(current>0||current=len-1){ + $prev.show(); + $next.hide(); + } + } + + moveControl = function(msg){ + if(opts.bt!=null){ + msg=='next'? $bt.eq(current-1).find('img').attr('src', $bt.eq(current-1).find('img').attr('src').replace('_.png','.png')) + :$bt.eq(current+1).find('img').attr('src', $bt.eq(current-1).find('img').attr('src').replace('_.png','.png')); //이전에 활성화된 롤링버튼을 비활성화 + $bt.eq(current).find('img').attr('src', $bt.eq(current).find('img').attr('src').replace('.png','_.png')); //현재 인덱스값을 가지는 롤링버튼을 활성화 + } + + if(effect!=true){ //action변수가 true가 아닐경우 슬라이드 효과없이 현재의 인덱스값을 갖는 이미지를 보여줌. + $obj.children().hide(); + $obj.children().eq(current).show(); + }else{ //action변수가 true일 경우 현재의 인덱스값을 갖는 이미지로 슬라이드됨 + $obj.animate({'left':'-'+size*current},'slow'); + } + } + + $obj.bind({ + mouseenter:function(){ + if(!auto) return false; + clearTimeout(time); + }, + mouseleave:function(){ + if(!auto) return false; + time = setTimeout('slideShow()',3000); + } + }); + + //롤링 버튼 클릭시 + $bt.bind({ + mouseenter:function(){ + if(!auto) return false; + clearTimeout(time); + }, + mouseleave:function(){ + if(!auto) return false; + time = setTimeout('slideShow()',3000); + }, + click:function(){ + var idx = $bt.index(this); //클릭한 롤링버튼의 인덱스값 저장 + + current = idx; //롤링버튼의 인덱스값을 이미지의 인덱스값으로 지정 + + controllStatus(); + + if(effect!=true){ //action변수가 true가 아닐경우 슬라이드 효과없이 현재의 인덱스값을 갖는 이미지를 보여줌. + $obj.children().hide(); + $obj.children().eq(current).show(); + }else{ //action변수가 true일 경우 현재의 인덱스값을 갖는 이미지로 슬라이드됨 + $obj.animate({'left':'-'+size*current},'slow'); + } + + // 모든 롤링 버튼을 비활성화 + $bt.each(function(){ + var source = $(this).find('img').attr('src').replace('_.png','.png'); + $(this).find('img').attr('src',source); + }); + + // 선택한 롤링버튼을 활성화 + var source = $(this).find('img').attr('src').replace('.png','_.png'); + $(this).find('img').attr('src',source); + + return false; + } + }); + + //이전 버튼 클릭시 + $prev.bind({ + mouseenter:function(){ + var source = $(this).find('img').attr('src').replace('.png','_.png'); + $(this).find('img').attr('src',source); + if(!auto) return false; + clearTimeout(time); + }, + mouseleave:function(){ + var source = $(this).find('img').attr('src').replace('_.png','.png'); + $(this).find('img').attr('src',source); + if(!auto) return false; + time = setTimeout('slideShow()',3000); + }, + click:function(){ + if(current==len-1) $next.show(); //이미지 인덱스값이 마지막이 아닐경우 비활성화된 다음버튼을 활성화 + current--; //이미지 인덱스값 1씩 감소 + + moveControl('prev'); + + if(current==0) $(this).hide(); //이미지 인덱스값이 0일 경우, 즉 현재 첫번째 이미지가 활성화될 경우 이전버튼을 비활성화 + + return false; + } + }); + + //다음 버튼 클릭시 + $next.bind({ + mouseenter:function(){ + var source = $(this).find('img').attr('src').replace('.png','_.png'); + $(this).find('img').attr('src',source); + if(!auto) return false; + clearTimeout(time); + }, + mouseleave:function(){ + var source = $(this).find('img').attr('src').replace('_.png','.png'); + $(this).find('img').attr('src',source); + if(!auto) return false; + time = setTimeout('slideShow()',3000); + }, + click:function(){ + current++; //이미지 인덱스값 1씩 증가 + + moveControl('next'); + + if(current>=len-1) $(this).hide(); //이미지인덱스값이 마지막일 경우, 즉 현재 마지막 이미지가 활성화될 경우 다음버튼을 비활성화 + if(current>0) $prev.show(); //이미지인덱스값이 0이 아닌경우 이전버튼 활성화 + + return false; + } + }); + +} + +// main rolling banner +function slideMotion1(){ + var $banner = $('#rolling .motionview'), + //$nav = $('#rolling ul.nav'), + banner = {prev:null, next:null}, + size = $banner.children().length; + index = 1, + speed = 3000, + timer = null, + auto = true, + width = parseInt(100/size), + rest = parseInt(100%size); + + var $nav = $('
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/animation_w.htm b/org.tizen.ui.practices/html/web/tau/animation_w.htm new file mode 100644 index 0000000..25f88a2 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/animation_w.htm @@ -0,0 +1,278 @@ + + + + + + + + + + + + + Animation: Supporting Animation for HTML Elements + + + +
        +
        +

        Mobile Web Wearable Web

        +
        + +
        +

        Content

        + +

        Related Info

        + +
        +
        + + +
        + +

        Animation: Supporting Animation for HTML Elements

        +

        TAU Animation is a module for animating target objects. It allows you to make and use animation without using any other animation library. TAU Animation provides good usability, high performance, and various functionalities.

        + +

        TAU Animation provides the following features:

        +
          +
        • Single or group animation +

          Provides usability from minimized parameters and APIs. You can easily make an animation or TimeLine.

        • +
        • Group effects +

          Provided by a stagger. Insert a stagger into the option, and all objects in the group are applied a sequential delay.

        • +
        • Time control +

          You can use ease, duration, and delay.

        • +
        • Effect +

          Provides predefined effects. This means that you can use a fancy effect just by sting instead of specifying an animation value. Predefined effects are fully controlled in TAU Animation. You can also stop the animation.

        • +
        • CSS animation +

          Target objects can be animated using CSS styles, such as backgroundColor, border, margin, padding, and shadow. A CSS animation can also be controlled by TAU Animation.

        • +
        • HTML element-based animation (in future) +

          You can set an animation in an element instead of JavaScript. If you are skilled in HTML, you can make the animation in HTML.

        • +
        • Custom KeyFrame (in future) +

          You can make an animation based on a custom KeyFrame.

        • +
        • Callback functions +

          Provides the onStart, onUpdate, and onComplete callback functions. CSS animations do not support the updateCallback and progress callbacks. TAU Animation provides these features.

        • +
        + +

        To use TAU Animation, you must load the tau.animation.min.js file, which can work with any other library or Web framework. There are no other prerequisites.

        + +

        Animation Fundamentals

        + +

        The tau.animation.js file has its own modules for animating target objects when animation functions are invoked.

        +

        The general idea of animating target objects is for several parts to interact with each other.

        +

        Figure: Animation parts

        +

        Animation parts

        +
          +
        • Ticker: Switches the requestAnimationFrame() function on and off. Ticker is operated based on events.
        • +
        • TweenAnimator: Runs the whole time logic. The TweenAnimator invokes the animation to play or stop, and it also updates the tween value per frame.
        • +
        • SimpleAnimation: Consists of the animation play logic. The animation makes the tween object and target object, and it also interacts with the TweenAnimator.
        • +
        • SimpleAnimationGroup: Group of simpleAnimation objects. It can include several objects for animation.
        • +
        • SimpleAnimation Extension: Provides the mixin functionality. Pure DOM can be a target object with the simpleAnimation extension.
        • +
        • DomObject: Target object that also has a render logic. If the tick is switched on, the TweenAnimator invokes the update function. And then, the render logic of DomObject is invoked, and the target objects are moved based on the animation option.
        • +
        • AnimationObject: Interface for various target objects. In this example, the DomObject is used as a reference.
        • +
        +

        To make and call several animations:

        + +
          +
        1. Make a target object for the animation. +

          After making the target object, you can make and call animations.

          + +

          Figure: Target object

          +

          Target object

          +
          +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;">
          +</div>
          +
          +
          +var t = tau.animation.target,
          +        blueBox = document.getElementById('blueBox');
          +t('#blueBox');
          +/* Pure HTML element can be a target */
          +t(blueBox);
          +
          +
        2. +
        3. Create an animation with transform, CSS properties, effects, and ease. +

          Once the target object is made, you can create an animation. The animation consists of an animation value including transform, CSS properties, and effect. Basically, an animation option is inserted with the duration of 1 s (1000 ms) only as a default. If you want to add an ease function, delay, loop, or callback, create an object for an animation option.

          +
          +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;">
          +</div>
          +
          +
          +var t = tau.animation.target;
          +t('#blueBox').tween({translateX: 1000}, {duration: 1000, delay: 500})
          +             .tween({scaleX: 1.2, scaleY: 1.2}, {duration: 1000})
          +             .tween({rotateZ: 30}, {duration: 1000})
          +             .tween({skewX: 30}, {duration: 1000});
          +
          +
        4. +
        5. Put the animations into an animation queue. +

          After making an animation, the animation is inserted into the animation queue automatically.

          + +

          Figure: Animation queue

          +

          Animation queue

          + +
        6. +
        7. After inserting the animation, send an event to the Ticker. +

          In the above queue, there are 4 animations in queue. When all animations are inserted, the animations are popped and animated sequentially by the TweenAnimator.

          +
        8. +
        9. The Ticker calls the requestAnimationFrame() function. +

          The TweenAnimator invokes the play and tick functions in the Ticker. The Ticker calls the on function, and the on function includes requestAnimationFrame(). The RAF() function is invoked until the TweenAnimator's tick time reaches the end of the duration.

          +
        10. +
        11. During the requestAnimationFrame() function call, the AnimationObject renders the target object and the TweenAnimator's time logic is operating. +

          The AnimationObject can get the time value using the calculating animation. The AnimationObject renders the target object based on the time value. If the duration is 1000 (ms), the TweenAnimator gives time 0 through 1000.

          +

          Figure: TweenAnimator

          +

          TweenAnimator

          +
        12. +
        + +

        Animation Functions

        + +

        To provide better functionality, various animation features have been implemented. You can easily increase and improve an animation effect. If you want to connect several animations, use chaining animations. Predefined effects and animations with CSS properties and stagger are also provided.

        + +

        Tween

        + +

        You can make an animation using the tween() function. If a tween animation is made, the animation is run right away. The tween() function consists of 2 parameters, {animation} and {option}:

        +
        +tween({animation}, {option});
        +
        +

        {animation} can be various animations, such as transform, CSS property, or predefined effect. Basically, {animation} indicates the destination of the animation. For example, {rotateZ: 90} indicates a rotation from the current value to 90 degrees. To do this, you must set the starting point of the animation, and for this, an additional animation form is provided. {rotateZ: [30, 90]} indicates the changing rotation value of the transform from 30 to 90.

        +
        +<div id="redBox" style="background-color: 'red'; position:absolute; width:100px; height:100px;"></div>
        +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px; left: 200px;"></div>
        +
        +
        var t = tau.animation.target;
        +t('#redBox').tween({translateX: 1000}, 1000); /* Translate from current position to 1000 */
        +t('#blueBox').tween({left: 200, top:[100, 300]}, 1000); /* Add left property from current to 200, add top property from 100 to 300 */
        +
        + +

        Chaining

        +

        The animation is inserted to the animation queue automatically before playing. At first, this feature does not seem important for making an animation, but if this function is supported, the LOC (Line Of Code) is decreased significantly.

        +
        +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;"></div>
        +
        +
        var t = tau.animation.target;
        +t('#blueBox').tween({translateX: [500, 1000]}, 1000).tween({translateY: 500}, 1000)
        +             .tween({rotateZ: 120}, 1000).tween({skewX: [0, 30]}, 1000)
        +             .tween({opacity: [1, 0]}, 1000).tween({opacity: 0.5}, 1000);
        +
        + +

        Figure: Animation queue and chaining

        +

        Animation queue and chaining

        + +

        The chaining feature makes an intuitive sequence group animation.

        + +

        Predefined Effects

        +

        The following predefined effects are available:

        +

        bounce, flash, pulse, rubberBand, shake, swing, tada, wobble, jello, bounceIn, bounceInDown, bounceInLeft, bounceInRight, bounceInUp, bounceOut, bounceOutDown, bounceOutLeft, bounceOutRight, bounceOutUp, fadeIn, fadeInDown, fadeInLeft, fadeInRight, fadeInUp, +fadeOut, fadeOutDown, fadeOutLeft, fadeOutRight, fadeOutUp, flip, flipInX, flipInY, flipOutX, flipOutY, +lightSpeedIn, lightSpeedOut, rotateIn, rotateInDownLeft, rotateInDownRight, rotateInUpLeft, rotateInUpRight, +rotateOut, rotateOutDownLeft, rotateOutDownRight, rotateOutUpLeft, rotateOutUpRight, slideInUp, slideInDown, slideInLeft, slideInRight, +slideOutUp, slideOutDown, slideOutLeft, slideOutRight, zoomIn, zoomInDown, zoomInLeft, zoomInRight, zoomInUp, zoomOut, zoomOutDown, zoomOutLeft, zoomOutRight, zoomOutUp, hinge, rollIn, rollOut

        + + +

        To make an identical effect, you can make many single animations. The following example shows the shake effect:

        +
        +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;"></div>
        +
        +
        +var t = tau.animation.target;
        +t('#blueBox').tween({translateX: -10}, 100);
        +t('#blueBox').tween({translateX: 10}, 100);
        +t('#blueBox').tween({translateX: -10}, 100);
        +t('#blueBox').tween({translateX: 10}, 100);
        +t('#blueBox').tween({translateX: -10}, 100);
        +t('#blueBox').tween({translateX: 10}, 100);
        +t('#blueBox').tween({translateX: -10}, 100);
        +t('#blueBox').tween({translateX: 10}, 100);
        +t('#blueBox').tween({translateX: -10}, 100);
        +t('#blueBox').tween({translateX: 0}, 100);
        +
        +

        Or instead, you can use a predefined animation:

        +
        +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;"></div>
        +
        +
        +var t = tau.animation.target;
        +t('#blueBox').tween('shake', 1000);
        +
        + +

        Group

        +

        Sometimes, you need to animate all objects with the same animation. To make an animation group for this purpose, the target method is provided. If all classes of DOM are box, you can create a box group. Like a CSS selector, '.' means a class selector and '#' means an ID selector. Also, a pure HTML element can be a parameter of the target function.

        +
        +<div class="box"></div>
        +<div class="box"></div>
        +<div class="box"></div>
        +<div class="box"></div>
        +
        +
        +var t = tau.animation.target;
        +t('.box').tween({rotateZ: 120}, 1000);
        +/* All DOM are rotated */
        +
        + +

        Stagger

        +

        In case of handling an animation group, you can apply a different delay value to a group. The following example shows a delay with the zoomIn effect:

        +
        +<div class='box'></div>
        +<div class='box'></div>
        +<div class='box'></div>
        +<div class='box'></div>
        +<div class='box'></div>
        +
        +
        +var t = tau.animation.target;
        +t('.box').tween('zoomIn', {duration: 1000, stagger: 200});
        +/* Each box is animated with 200 ms time difference */
        +
        + +

        Callback

        +

        You can add some actions before and after an animation. If you add the onStart callback, it is invoked before the animation. The onComplete callback is invoked after the animation.

        +
        +<div id='blueBox'></div>
        +
        +
        var t = tau.animation.target;
        +t('#blueBox').tween({translateY: [0, 150], rotateZ: [0, 180]}, 
        +{
        +   duration: 1000,
        +   onStart: function ()
        +   {
        +      t('#blueBox').innerText = 'start';
        +   },
        +   onComplete: function () 
        +   {
        +      t('#blueBox').tween({backgroundColor: 'navy'}, {duration: 1000});
        +   }
        +});
        +
        +

        In the above animation, the box is translated by Y axis from 0 to 150 and rotated from 0 to 180. Before translating and rotating, the start text is inserted into the box. After translating and rotating, the box's background color is changed to navy.

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/circle_progressbar_ww.htm b/org.tizen.ui.practices/html/web/tau/circle_progressbar_ww.htm new file mode 100644 index 0000000..5cdf2a9 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/circle_progressbar_ww.htm @@ -0,0 +1,257 @@ + + + + + + + + + + + + + Creating Circle-shaped Progress Bars + + + +
        +
        +

        Wearable Web

        +
        + + +
        + +
        +

        Creating Circle-shaped Progress Bars

        + +

        You can create a circle-shaped progress bar component with the CircleProgressBar API.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the progress bar component in a rectangular and circular UI.

        + +

        Figure: Circle-shaped progress bar component in rectangular and circular devices

        +

        Circle-shaped progress bar component in a rectangular device Circle-shaped progress bar component in a circular device

        + +

        To implement the progress bar component:

        + +
          +
        1. Edit the HTML code to add the component to your application screen: + +
          +<div class="ui-page ui-page-active" id="pageCircleProgressBar" data-enable-page-scroll="false">
          +   <header class="ui-header">
          +      <h2 class="ui-title">Circle Progress</h2>
          +   </header>
          +   <div class="ui-content content-padding">
          +      <div class="result" id="result"></div>
          +   </div>
          +   <footer class="ui-footer ui-grid-col-2">
          +      <a href="#" class="ui-btn" id="minus">-10%</a>
          +      <a href="#" class="ui-btn" id="plus">+10%</a>
          +   </footer>
          +   <progress class="ui-circle-progress" id="circleprogress" max="100" value="20"></progress>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set the visual style of the progress bar: + +
          +.ui-progressbar-large 
          +{
          +   position: absolute;
          +   top: 50%;
          +   left: 50%;
          +   -webkit-transform: translate3d(-50%, -50%, 0);
          +}
          +.result 
          +{
          +   font-size:35px;
          +   text-align:center;
          +   top: 33%;
          +   left: 50%;
          +   -webkit-transform: translate3d(-50%, -50%, 0);
          +   position: absolute;
          +}
          +
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   .result 
          +   {
          +      top: 50%;
          +      margin: 0;
          +   }
          +   .ui-footer 
          +   {
          +      display: none;
          +   }
          +}
          +
          +
        4. + +
        5. Edit the JavaScript code to manage the progress bar events and other functionality: + +
          +(function()
          +{
          +   var page = document.getElementById("pageCircleProgressBar"),
          +       progressBar = document.getElementById("circleprogress"),
          +       minusBtn = document.getElementById("minus"),
          +       plusBtn = document.getElementById("plus"),
          +       resultDiv = document.getElementById("result"),
          +       isCircle = tau.support.shape.circle,
          +       progressBarWidget,
          +       resultText,
          +       i;
          +
          +   function printResult() 
          +   {
          +      resultText = progressBarWidget.value();
          +      resultDiv.innerHTML = resultText + "%";
          +   };
          +
          +   function clearVariables() 
          +   {
          +      page = null;
          +      progressBar = null;
          +      minusBtn = null;
          +      plusBtn = null;
          +      resultDiv = null;
          +   };
          +
          +   function unbindEvents() 
          +   {
          +      page.removeEventListener("pageshow", pageBeforeShowHandler);
          +      page.removeEventListener("pagehide", pageHideHandler);
          +      if (isCircle) 
          +      {
          +         document.removeEventListener("rotarydetent", rotaryDetentHandler);
          +      } 
          +      else 
          +      {
          +         minusBtn.removeEventListener("click", minusBtnClickHandler);
          +         plusBtn.removeEventListener("click", plusBtnClickHandler);
          +      }
          +   };
          +
          +   function minusBtnClickHandler() 
          +   {
          +      i = i - 10;
          +      if (i < 0) 
          +      {
          +         i = 0;
          +      }
          +      progressBarWidget.value(i);
          +      printResult();
          +   };
          +
          +   function plusBtnClickHandler() 
          +   {
          +      i = i + 10;
          +      if (i > 100) 
          +      {
          +         i = 100;
          +      }
          +      progressBarWidget.value(i);
          +      printResult();
          +   };
          +
          +   function rotaryDetentHandler() 
          +   {
          +      /* Get the rotary direction */
          +      var direction = event.detail.direction,
          +          value = parseInt(progressBarWidget.value());
          +
          +      if (direction === "CW") 
          +      {
          +         /* Right direction */
          +         if (value < 100) 
          +         {
          +            value++;
          +         } 
          +         else 
          +         {
          +            value = 100;
          +         }
          +      } 
          +      else if (direction === "CCW") 
          +      {
          +         /* Left direction */
          +         if (value > 0) 
          +         {
          +            value--;
          +         } 
          +         else 
          +         {
          +            value = 0;
          +         }
          +      }
          +
          +      progressBarWidget.value(value);
          +      printResult();
          +   }
          +
          +   function pageBeforeShowHandler() 
          +   {
          +      if (isCircle) 
          +      {
          +         /* Make the circular progressbar object */
          +         progressBarWidget = new tau.widget.CircleProgressBar(progressBar, {size: "full"});
          +         document.addEventListener("rotarydetent", rotaryDetentHandler);
          +      } 
          +      else 
          +      {
          +         progressBarWidget = new tau.widget.CircleProgressBar(progressBar, {size: "large"});
          +         minusBtn.addEventListener("click", minusBtnClickHandler);
          +         plusBtn.addEventListener("click", plusBtnClickHandler);
          +      }
          +
          +      i = parseInt(progressBarWidget.value());
          +      resultDiv.innerHTML = i + "%";
          +   };
          +
          +   function pageHideHandler() 
          +   {
          +      unbindEvents();
          +      clearVariables();
          +      /* Release the object */
          +      progressBarWidget.destroy();
          +   };
          +
          +   page.addEventListener("pagebeforeshow", pageBeforeShowHandler);
          +   page.addEventListener("pagehide", pageHideHandler);
          +}());
          +
          +
        6. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/circular_ui_ww.htm b/org.tizen.ui.practices/html/web/tau/circular_ui_ww.htm new file mode 100644 index 0000000..3a26cb5 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/circular_ui_ww.htm @@ -0,0 +1,218 @@ + + + + + + + + + + + + + Applications for Circular UI: Developing UI on Circular Wearable Applications + + + + + +
        +

        Applications for Circular UI: Developing UI on Circular Wearable Applications

        + +

        TAU supports different types of wearable devices (rectangular and circular) in the same application. To support a circular UI along with a rectangular UI, a media query is required.

        + +

        This feature is supported in wearable applications only.

        + + +

        Applying the Circular UI

        + +

        To support the circular UI:

        + +
          +
        1. Include the link element for the latest tau.css file into the <head> element in HTML. Note that for the compatibility with the rectangular UI, you must use the latest version of the TAU library.
        2. + +
        3. Include the link element for the latest tau.circle.css file with the media query feature (-tizen-geometric-shape: circle) next to the link element for the tau.css. Note that adding the tau.circle.css file following the general tau.css file covers the additional circular UI.
        4. + +
        5. Include the link element for the latest tau.js script file at the end of <body> element in HTML.
        6. + +
        7. For writing a separate code for a circular UI in JavaScript, you can use the tau.support.shape.circle property for detecting the circular device.
        8. +
        + +
        +<head name="viewport" content="width=device-width, user-scalable=no">
        +   <title>Support for Circular UI</title>
        +   <link rel="stylesheet" href="tau.css">
        +   <!-- CSS media query on a link element -->
        +   <link rel="stylesheet" media="all and (-tizen-geometric-shape: circle)" href="tau.circle.css">
        +   <link rel="stylesheet" href="css/style.css">
        +</head>
        +<body>
        +   <script type="text/javascript" src="tau.js"></script>
        +   <script>
        +      if (tau.support.shape.circle) 
        +      {
        +         /* Implement your code for the circular UI */
        +      } 
        +      else 
        +      {
        +         /* Implement your code for the rectangular UI */
        +      }
        +   </script>
        +</body>
        +
        + +

        The following figure shows how the media query -tizen-geometric-shape: circle works in a rectangular and circular UI.

        +

        Figure: Media query in a rectangular device and circular device

        +

        + Media query in a rectangular device and circular device +

        + +

        Overriding the Circular CSS Style with a Media Query

        + +

        For some styles to be applied selectively, you can use the -tizen-geometric-shape media query feature with a rectangle or circle value to distinguish the type difference. Note that the -tizen-geometric-shape feature is only available in Tizen devices.

        + + + + + + + + + + + + + + + + + + + + +
        Table: -tizen-geometric-shape feature description
        -tizen-geometric-shape
        Valuerectangle | circle
        Applied toVisual media types
        Accept min/max prefixesNo
        + +
        +.className 
        +{
        +   /* Implement the basic CSS style for all types of devices (rectangular and circular) */
        +}
        +
        +@media screen and (-tizen-geometric-shape: circle) 
        +{
        +   .className
        +   {
        +      /* Implement the CSS style to be overridden in circular */
        +   }
        +}
        +
        + +

        Writing JavaScript Selectively for the Circular UI

        +

        TAU provides the tau.support.shape.circle property that checks whether the device screen is a circle. If you want to implement code selectively for a circular UI and rectangular UI, you can use the property with a boolean value. Note that for developing in a browser environment, this property is always set to true when the tau.circle.css file is loaded.

        + +
        +if (tau.support.shape.circle) 
        +{
        +   /* Implement your code for the circular UI */
        +} 
        +else 
        +{
        +   /* Implement your code for the rectangular UI */
        +}
        +
        + +

        Supported UI Components

        +

        The following components can be used in both rectangular and circular devices.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: UI components supported by a rectangular and circular UI
        ComponentDescription
        Helper ScriptShows how to support some application components.
        Snap ListShows how to create a snap list component.
        Expandable HeaderShows how to create a header component.
        Circle-shaped Progress BarShows how to create a circle progress bar component.
        Full Size Processing ComponentShows how to create a processing component.
        Footer ButtonShows how to create a footer button component.
        ThumbnailShows how to create a thumbnail component.
        Popup ButtonShows how to create a popup component.
        Index Scroll BarShows how to create an index scroll bar component.
        More OptionsShows how to create a more options button component.
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/creating_animation_w.htm b/org.tizen.ui.practices/html/web/tau/creating_animation_w.htm new file mode 100644 index 0000000..3c90eea --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/creating_animation_w.htm @@ -0,0 +1,191 @@ + + + + + + + + + + + + + Creating Applications with Animation + + + +
        +
        +

        Mobile Web Wearable Web

        +
        + + +
        + + +
        + +

        Creating Applications with Animation

        +

        You can create a simple application using TAU Animation. With the following example, you can learn how to import TAU Animation into your application and create a basic simple application with animation.

        + +

        Loading a TAU Animation

        +

        You can import the TAU Animation with HTML:

        +
        +<head>
        +   <title>TAU Animation Sample</title>
        +   <script src="lib/tau/animation/tau.animation.min.js" type="text/javascript"></script>
        +</head>
        +
        +

        tau.animation is the namespace of the TAU Animation. You can call TAU Animation functions through this namespace.

        + + +

        Creating TAU Animations

        + +

        The following code snippet shows how to create a TAU Animation:

        + +
        +<div id="redBox" style="background-color: 'red'; position:absolute; width:100px; height:100px;"></div>
        +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px; left: 200px;"></div>
        +
        +
        var t = tau.animation.target;
        +t('#redBox').tween('swing', 1000);
        +t('#blueBox').tween({rotateZ: 120}, 1000).tween({translateX: 400}, 1000);
        +
        + +

        If you want to animate the HTML element directly, you can use mixin. You can animate any effect, transform, or CSS property. You can use the 'target' method. Like a CSS selector, '.' means class selector, '#' means ID selector. Also, a pure HTML element can be a parameter of the target function.

        + +

        Available animation methods:

        +
        • Predefined effects +

          When the first parameter of the tween() method indicates a string (such as 'swing' above) instead of an object, it is a predefined effect animation. Various predefined effects are available.

        • + +
        • Chaining +

          The blueBox animation above is a type of a connected animation. If animations are connected to the same target object, it is added to the queue. And if the play() function is invoked, all animations in the queue are called in the sequence order.

        • + +
        • Tween +

          tween() is a TAU Animation method. It animates a target object based on parameters. The following example shows the use of the tween() method:

          +
          +tween({animation}, {option})
          +
          +
            +
          • animation is the part moving, such as a transform, CSS, or predefined effect.
          • +
          • transform options: +

            translateX, translateY, translateZ, rotateX, rotateY, rotateZ, scaleX, scaleY, skewX, skewY

            +
          • +
          • css options: +

            left, top, width, height, background-color, color, border, border-width, border-color, margin, marginTop, marginRight, marginBottom, marginLeft, padding, paddingTop, paddingRight, paddingBottom, paddingLeft, font-size, line-height, clip-path, background-position, background-size, box-shadow

            +
          • +
          +
          +<div id="redBox" style="background-color: 'red'; position:absolute; width:100px; height:100px;"></div>
          +
          +
          +var t = tau.animation.target;
          +t('#redBox').tween({rotateZ: 120}, 1000); /* Transform */
          +t('#redBox').tween({backgroundColor: 'red', border: '10px 10px 10px 3px white'}, 1000); /* CSS property */
          +t('#redBox').tween('swing', 1000).tween('tada', 1000); /* Pre-defined effect */
          +
        • + +
        • Option +

          An option consists of a duration, ease, delay, callback, and stagger. In order to provide better usage, if you want to use only duration, you can set the duration as a number value like in the previous examples. If any other options are needed, you must make an {option} object and insert the duration: value into the object. +

          +
          +<div id="redBox" style="background-color: 'red'; position:absolute; width:100px; height:100px;"></div>
          +<div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px; left: 200px;"></div>
          +<div class="box"></div>
          +<div class="box"></div>
          +<div class="box"></div>
          +<div class="box"></div>
          +
          +
          var t = tau.animation.target;
          +t('#redBox').tween({rotateZ: 120}, 1000);
          +t('#redBox').tween({rotateZ: 120}, {duration: 1000});
          +/* The result of this tween method is identical with the above method */
          +t('#blueBox').tween({rotateZ: 120}, {duration: 1000, ease: 'bounceInOut'});
          +t('#blueBox').tween({rotateZ: 120}, {duration: 1000, delay: 500}); /* After 500ms, blueBox is rotated */
          +t('#blueBox').tween({rotateZ: 120}, {duration: 1000, onStart: function()
          +   {
          +      t('#blueBox').style.innerText = 'start'; /* Before animation, the text is inserted into blueBox */
          +   },
          +   onComplete: function()
          +   {
          +      t('#blueBox').tween('swing', 1000); /* After animation, blueBox is animated with a pre-defined effect */
          +   }
          +});
          +/* All boxes that include the className 'box' are rotated sequentially with a 200ms time difference */
          +t('.box').tween({rotateZ: 120}, {duration: 1000, stagger: 200}); 
          +
        + + +

        The following code snippet shows the full code for the first animation example described above.

        +
        +<!DOCTYPE html>
        +<html>
        +<head>
        +   <style>
        +      .box 
        +      {
        +         position: absolute;
        +         width: 100px;
        +         height: 100px;
        +         background-color: red;
        +         left: 100px;
        +         top: 100px;
        +      }
        +   </style>
        +
        +   <title>TAU Animation Sample</title>
        +
        +   <!-- load TAU Animation -->
        +   <script src="lib/tau/animation/tau.animation.min.js" type="text/javascript"></script>
        +</head>
        +<body>
        +   <div id="redBox" style="background-color: 'red'; position:absolute; width:100px; height:100px;"></div>
        +   <div id="blueBox" style="background-color: 'blue'; position:absolute; width:100px; height:100px;"></div>
        +   <div class="box"></div>
        +   <div class="box"></div>
        +   <div class="box"></div>
        +   <div class="box"></div>
        +
        +   <script>
        +      var t = tau.animation.target;
        +      t('#redBox').tween('swing', 1000); /* Single animation */
        +      t('#blueBox').tween({rotateZ: 120}, 1000).tween({translateX: 400}, 1000); /* Single animation */
        +      t('.box').tween({translateY: 500}, {duration: 1000, stagger: 200}); /* Group animation */
        +   </script>
        +</body>
        +</html>
        +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/event_handling_w.htm b/org.tizen.ui.practices/html/web/tau/event_handling_w.htm new file mode 100644 index 0000000..92aeee9 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/event_handling_w.htm @@ -0,0 +1,185 @@ + + + + + + + + + + + + + Event Handling: Handling User Interactions + + + +
        +
        +

        Mobile Web Wearable Web

        +
        + + +
        + +
        +

        Event Handling: Handling User Interactions

        +

        The Tizen platform supports some device events for user interaction. To provide a full user experience for your application users, you must handle various events in your application.

        + +

        Hardware Key Events

        + +

        The Tizen platform supports hardware key events for user interaction on devices.

        + + +

        The following figures show the hardware keys and events for mobile (on the left) and wearable (on the right) devices.

        + +

        Figure: Hardware keys and events

        +

        Menu and Back keys in mobile Back event in wearable

        + + + + + + + + + + + + + + + + +
        Table: Hardware key events
        TypeDescriptionAttribute
        tizenhwkeyEvent is triggered when a device detects the user interaction through a special point of hardware. + event.keyName +
          +
        • back for wearable
        • +
        • back, menu for mobile
        • +
        +
        +

        To bind an event callback on the tizenhwkey events, use the following code:

        +
        +window.addEventListener("tizenhwkey", function(ev)
        +{
        +   if (ev.keyName == "back") 
        +   {
        +      /* Call window.history.back() to go to previous browser window */
        +      /* Call tizen.application.getCurrentApplication().exit() to exit application */
        +      /* Add script to add another behavior */
        +   }
        +});
        +
        + +

        Exiting the Application with the Back Key

        +

        When the application binds a tizenhwkey event, it checks the page ID and decides to go back or exit with several lines of app-side script.

        +

        The Tizen Device APIs provide an application exit method. Even if the application has many pages, it can handle the back/exit process.

        +

        With a TAU page, just remember the ID of the main page. In the following example, the ID of the main page is main.

        +
        (function()
        +{
        +   window.addEventListener("tizenhwkey", function(ev);
        +   {
        +      if(ev.keyName === "back")
        +      {
        +         var page = document.getElementsByClassName("ui-page-active")[0],
        +             pageid = page ? page.id: "";
        +         if(pageid === "main")
        +         {
        +            try
        +            {
        +               tizen.application.getCurrentApplication().exit();
        +            }
        +            catch(ignore)
        +            {
        +            }
        +         }
        +         else
        +         {
        +            window.history.back();
        +         }
        +      }
        +   });
        +}());
        + +

        Rotary Events

        + +

        The Tizen platform supports rotary events for user interaction on a wearable rotary device or sensor. The rotary device can rotate clockwise or counter-clockwise, and dispatch an event for each movement. The rotary device has points called detents. If the rotary device detects the detent point while rotating, it dispatches a separate new event about the point. The number of the available detent points depends on the device hardware.

        + + + + + + + + + + +
        Note
        This feature is supported in wearable applications only.
        + + +

        Figure: Rotary device

        +

        Rotary device

        +

        Rotary events are used to deliver the rotary device or sensor data to the application. The following table describes the rotary events.

        + + + + + + + + + + + + + + + +
        Table: Rotary events
        TypeDescriptionAttribute
        rotarydetentEvent is triggered when a device detects the detent point.detail.direction: rotation direction +
        • CW for clockwise rotation direction
        • +
        • CCW for counter-clockwise rotation direction
        + +

        To bind an event callback on rotary events, use the following code:

        +
        +document.addEventListener("rotarydetent", function(ev)
        +{
        +   var direction = ev.detail.direction;
        +   /* Add behavior for detent detected event with a direction value */
        +});
        +
        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/footerbutton_ww.htm b/org.tizen.ui.practices/html/web/tau/footerbutton_ww.htm new file mode 100644 index 0000000..faa34a9 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/footerbutton_ww.htm @@ -0,0 +1,182 @@ + + + + + + + + + + + + + Creating Footer Buttons + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        + +

        Creating Footer Buttons

        + +

        You can create a footer button component that is supported in both a rectangular and circular UI.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figures show the layout of the footer button component in a rectangular and circular UI.

        +

        Figure: Footer button component in rectangular and circular devices

        +

        Footer button in a rectangular device Footer button in a circular device

        + +

        Figure: Multiple footer buttons in rectangular and circular devices

        +

        Multiple footer buttons in a rectangular device Multiple footer buttons in a circular device

        +

        The footer button on the circular UI has the ui-bottom-button class. When there are multiple buttons, the other buttons except for the first button use the drawer component in the circular UI.

        + + +

        To implement footer buttons:

        + +
          +
        • To implement a single footer button: +

          Edit the HTML code to add the footer button component to your application screen.

          + +
          +<div class="ui-page ui-page-active" id="bottomButtonPage" >
          +   <header class="ui-header">
          +      <h2 class="ui-title">Bottom Button</h2>
          +   </header>
          +   <div class="ui-content content-padding">
          +      It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
          +   </div>
          +   <footer class="ui-footer ui-bottom-button">
          +      <a href="#" class="ui-btn">Button</a>
          +   </footer>
          +</div>
          +
          +
        • +
        • To implement multiple footer buttons: + + +
            +
          1. Edit the HTML code to add the footer button components to your application screen. +

            When there are multiple buttons, the buttons (except for the first button) use the drawer in the circular UI.

            + +
            +<div class="ui-page ui-page-active" id="bottomButtonWithMorePage" >
            +   <header class="ui-header">
            +      <h2 class="ui-title">Multiple Buttons</h2>
            +   </header>
            +   <div class="ui-content content-padding">
            +      It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
            +   </div>
            +
            +   <a class="drawer-handler"></a>
            +
            +   <!-- Circle profile -->
            +   <div id="moreoptionsDrawer" class="ui-drawer drawer-elem" data-drawer-target="#bottomButtonWithMorePage" data-position="right" data-enable="true" data-drag-edge="1">
            +      <div id="selector" class="ui-selector">
            +         <div class="ui-item show-icon" data-title="2"></div>
            +         <div class="ui-item human-icon" data-title="3"></div>
            +      </div>
            +   </div>
            +
            +   <footer class="ui-footer ui-grid-col-3 ui-bottom-button">
            +      <a href="#" class="ui-btn">1</a>
            +      <a href="#" class="ui-btn">2</a>
            +      <a href="#" class="ui-btn">3</a>
            +
            +   </footer>
            +</div>
            +
            +
          2. + +
          3. Edit the CSS code to set the visual style of the buttons: + +
            +.drawer-elem 
            +{
            +   display: none;
            +}
            +
            +@media all and (-tizen-geometric-shape: circle) 
            +{
            +   .drawer-handler 
            +   {
            +      width:24px;
            +      height: 115px;
            +      position: fixed;
            +      top: 122px;
            +      right: 0;
            +      color: transparent;
            +      background-color: #a4a4a4;
            +      -webkit-mask-image: url(/*path of the image*/);
            +      -webkit-mask-size: 18px 36px;
            +      -webkit-mask-repeat: no-repeat;
            +      -webkit-mask-position: 0 40px;
            +   }
            +   .ui-bottom-button a + a 
            +   {
            +       display: none;
            +   }
            +}
            +
            + +
          4. +
          5. Edit the JavaScript code to manage the footer button events and other functionalities: +
            +(function()
            +{
            +   var page = document.querySelector("#bottomButtonWithMorePage"),
            +       drawer = page.querySelector("#moreoptionsDrawer"),
            +       handler = page.querySelector(".ui-more");
            +
            +   page.addEventListener("pagebeforeshow", function() 
            +   {
            +      if (tau.support.shape.circle) 
            +      {
            +         tau.helper.DrawerMoreStyle.create(drawer, 
            +         {
            +            handler: ".drawer-handler",
            +
            +         });
            +      }
            +   });
            +})();
            +
            +
          6. +
          +
        • +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/globalization_w.htm b/org.tizen.ui.practices/html/web/tau/globalization_w.htm new file mode 100644 index 0000000..3074e51 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/globalization_w.htm @@ -0,0 +1,484 @@ + + + + + + + + + + + + + Globalization: Supporting Internationalization and Localization + + + + + + +
        +

        Globalization: Supporting Internationalization and Localization

        + +

        The TAU Globalize utility supports internationalization and localization. It wraps the Globalize functionality for easy access from Tizen Web applications, and it is extended to support the right-to-left (RTL) languages.

        + +

        jQuery and Globalize

        + +

        Globalize is a jQuery JavaScript library for internationalization and localization that leverages the official Unicode CLDR JSON data. The library works both for the browser and as a Node.js module. jQuery and Globalize have dependencies with cldr.js, which is a CLDR low-level manipulation tool.

        + +

        Globalize:

        +
          +
        • Leverages the Unicode CLDR data and follows its UTS#35 specification.
        • +
        • Keeps the code separate from the i18n content. Does not host or embed any locale data in the library. Empowers you to control the loading mechanism of your choice.
        • +
        • Allows you to load as much or as little data as you need. Avoids duplicating data if using multiple i18n libraries that leverage CLDR.
        • +
        • Keeps the code modular. Allows you to load the i18n functionalities you need.
        • +
        • Runs in browsers and Node.js, and consistently across all of them.
        • +
        • Makes globalization as easy to use as jQuery.
        • +
        + +

        CLDR Data

        + +

        The Unicode CLDR provides the key building blocks for software to support the world's languages. It includes:

        +
          +
        • Locale-specific patterns for formatting and parsing dates, times, time zones, numbers, and currency values
        • +
        • Translations of names: languages, scripts, countries and regions, currencies, eras, months, weekdays, day periods, time zones, cities, and time units
        • +
        • Language and script information: characters used, plural cases, gender of lists, capitalization, rules for sorting and searching, writing direction, transliteration rules, rules for spelling out numbers, and rules for segmenting text into graphemes, words, and sentences
        • +
        • Country information: language usage, currency information, calendar preference and week conventions, and postal and telephone codes
        • +
        • ISO and BCP 47 code support (such as cross-mappings) and keyboard layouts
        • +
        + +

        CLDR uses the XML format provided by UTS #35: Unicode Locale Data Markup Language (LDML). LDML is a format used not only for CLDR, but also for the general interchange of locale data. For more information about CLDR, see CLDR release notes, and to download the JSON format file , see JSON Data from the Unicode CLDR Project.

        +

        The TAU Globalize utility uses the CLDR 26 release, and when you create a Tizen Web application project, you find CLDR in the <project>/lib/tau/<profile>js/cldr-data folder.

        + +

        Using the Globalize Utility

        + +

        To use the TAU Globalize utility in your application:

        +
          +
        1. Download the following dependency files for your application: + +
        2. +
        3. Create a folder structure, as shown in the following table. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Globalize folder structure +
          Folder structureDescription

          +

          Globalize folder structure

          +

          Globalize main folder

          cldr/: Copy the cldr.js library in this folder.
          cldr-data/: Copy the cldr-data files in this folder. +

          cldr-data/main: Copy the languages to be supported in this folder.

          + + + + + + + + + +
          Note
          Do not copy all languages, just the ones you need.
          globalize/: Copy the Globalize library in this folder.
          locale/: Make the custom locale string in this folder.
          script/: JavaScript files.
          style/: CSS, image, and other style related files.
          view/: HTML files
          +
        4. +
        5. Set the locale using the following example code: +
          +var globalize = tau.util.globalize,
          +   localeId  = "ko-KR";
          +
          +document.addEventListener('pageshow', function()
          +{
          +   globalize.setLocale(localeId)
          +   .done(function(ko)
          +   {
          +      /* "ko" is the Globalize utility instance */
          +      console.log(ko.getLocale()) /* "ko" */
          +   })
          +})
          +
          + +

          The setLocale() method is not synchronous, and it returns the deferred object with the methods then(), done(), and fail(). Use these methods to receive the Globalize utility instance.

          +

          You can specify locales in 2 ways using IETF language tags, such as en, pt-BR, or zh-Hant-TW:

          +
            +
          • Specify the locale ID in the lang attribute of the body element, such as <body lang="ko-KR">.
          • +
          • Use a string variable as an input argument of the setLocale() method (for example ko.setLocale("en")) to overwrite the body element setting.
          • +
          +

          If no lang attribute or setLocale() input argument is defined, the Globalize utility finds the locale by checking the window.navigator.language property. If the check result is false, the utility uses the default locale "en".

          +

          The following table illustrates the locale setting method order.

          + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: Locale setting methods +
          OrderLocale setting methods
          1setLocale(LocaleId)
          2<body lang="ko-KR">
          3window.navigator.language
          4Default locale "en"
          +
        6. +
        7. Make sure that you have all required CLDR files. +

          The setLocale() method automatically loads the basic CLDR data files which are match the given locale by local AJAX. During the method call, the Globalize utility also loads the basic CLDR JSON files:

          +
            +
          • cldr/main/locale/ca-gregorian.json
          • +
          • cldr/main/locale/numbers.json
          • +
          • cldr/main/locale/currencies.json
          • +
          • cldr/supplemental/likelySubtags.json
          • +
          • cldr/supplemental/scriptMetaData.json
          • +
          • cldr/supplemental/timeData.json
          • +
          • cldr/supplemental/weekData.json
          • +
          • cldr/supplemental/numberingSystems.json
          • +
          • cldr/supplemental/plurals.json (for cardinals)
          • +
          • cldr/supplemental/ordinals.json (for ordinals)
          • +
          +

          In addition to the basic files, each Globalize method requires a special set of CLDR portions. Determine which Globalize module functionalities you need, and make sure you have the required files, as defined in the following table.

          + + + + + + + + + + + + + + + + + + + + + + + + + +
          + Table: CLDR requirements +
          ModuleRequired CLDR JSON files
          Core modulecldr/supplemental/likelySubtags.json
          Date modulecldr/main/locale/ca-gregorian.json +

          cldr/main/locale/timeZoneNames.json

          +

          cldr/supplemental/timeData.json

          +

          cldr/supplemental/weekData.json

          +

          CLDR JSON files from the number module

          Number modulecldr/main/locale/numbers.json +

          cldr/supplemental/numberingSystems.json

          Plural modulecldr/supplemental/plurals.json (for cardinals) +

          cldr/supplemental/ordinals.json (for ordinals)

          +
          +
        8. +
        + +

        Using the Globalize Utility Methods

        +

        The following code snippets show how to use the TAU Globalize utility methods:

        +
          +
        • formatCurrency(): +
          +var globalize = tau.util.globalize,
          +    localeId  = "ko-KR",
          +    currency_unit = "KRW"; /* ISO 4217 */
          +
          +document.addEventListener('pageshow', function()
          +{
          +   globalize.setLocale(localeId)
          +   .done(function(ko)
          +   {
          +      console.log(ko.formatCurrency(69000, currency_unit)); /* ₩69,900 */
          +   })
          +})
          +
          +

          For more information, see the currency unit standard in ISO 4217.

          +
        • + +
        • formatDate(): +
          +var globalize = tau.util.globalize,
          +    localeId  = "ko-KR",
          +    currency_unit = "KRW"; /* ISO 4217 */
          +
          +document.addEventListener('pageshow', function()
          +{
          +   globalize.setLocale(localeId)
          +   .done(function(ko)
          +   {
          +      console.log(ko.formatDate(new Date(), {datetime:"medium"});
          +   })
          +})
          +
          +

          For more information, see date-formatter.

          +
        • + +
        • getCalendar(): +
          +var globalize = tau.util.globalize,
          +    localeId  = "ko-KR";
          +
          +document.addEventListener('pageshow', function()
          +{
          +   globalize.setLocale(localeId)
          +   .done(function(ko)
          +   {
          +      console.log(ko.getCalendar().months.format.wide, undefined, 4));
          +   })
          +})
          +
          +

          The calendar format is specified in the gregorian.json file in the CLDR data.

          +
        • + +
        • formatMessage(): +

          This method supports custom locale data.

          +
            +
          1. Create a directory for each locale that has localized content under the locales directory in the project root. The locale names are defined in the W3C IANA language subtag registry. +
            +index.html
            +locale
            +   en.json
            +   ko.json
            +
            +
          2. +
          3. Create a JSON file for the formatMessage strings (custom locale strings) in locales paths: +
            +{
            +   "en":
            +   {
            +      "like":
            +      [
            +         "{0, plural, offset:1",
            +         "=0 {Be the first to like this}",
            +         "=1 {You liked this}",
            +         "one {You and someone else liked this}",
            +         "other {You and # others liked this}",
            +         "}"
            +      ],
            +      "greeting":
            +      {
            +         "hello":"hello",
            +         "bye":"bye"
            +      },
            +      "longText":
            +      [
            +         "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eligendi non",
            +         "quis exercitationem culpa nesciunt nihil aut nostrum explicabo",
            +         "reprehenderit optio amet ab temporibus asperiores quasi cupiditate.",
            +         "Voluptatum ducimus voluptates voluptas?"
            +      ]
            +   }
            +}
            +
            +
          4. + +
          5. Call the setLocale() method to load the custom locale files automatically: +
            +var globalize = tau.util.globalize,
            +    localeId  = "ko-KR";
            +
            +document.addEventListener('pageshow', function()
            +{
            +   globalize.setLocale(localeId)
            +   .done(function(ko)
            +   {
            +      console.log(ko.formatMessage("greeting/hello"));
            +      console.log(ko.formatMessage("greeting/bye"));
            +      console.log(ko.formatMessage("longText"));
            +   })
            +})
            +
            +
          6. +
          +
        • + +
        • messageFormatter(): +

          This method returns a function that formats a message using the ICU message format pattern. For more information, see message-formatter.

          +
            +
          1. Create a locale resource in the locales path: +
            +{
            +   "en":
            +   {
            +      "formatter":
            +      {
            +         "welcome":"Hello Mr. {0}",
            +         "thankyou":"Bye Mr. {custom}."
            +      }
            +   }
            +}
            +
            +
          2. + +
          3. Use the messageFormatter() method: +
            +var globalize = tau.util.globalize,
            +    localeId  = "en-US";
            +
            +document.addEventListener('pageshow', function()
            +{
            +   globalize.setLocale(localeId)
            +   .done(function(en)
            +   {
            +      var welcomeFormatter = en.messageFormatter('formatter/welcome'),
            +          thankyouFormatter  = en.messageFormatter('formatter/thankyou'),
            +          welcomeMessageList = ["Tom"],
            +          thankyouMessageList = {custom:"Tom"};
            +
            +      console.log(welcomeFormatter(welcomeMessageList));
            +      console.log(thankyouFormatter(thankyouMessageList));
            +   })
            +})
            +
            +
          4. +
          +
        • +
        + +

        Right-to-left (RTL) Language Support

        + +

        TAU offers 2 ways to handle right-to-left (RTL) languages:

        +
          +
        • Locale-specific CSS
        • +
        • RTL property in a locale object
        • +
        +

        When the setLocale() method is called, it automatically applies a CSS class to the body element of your DOM if the given locale has an RTL direction.

        +

        The following examples show how to use the locale-specific CSS:

        + +
          +
        • The following example has ar-EG as the given locale, and the language has an RTL direction: +
          +var globalize = tau.util.globalize,
          +    localeId  = "ar-EG";
          +
          +document.addEventListener('pageshow', function()
          +{
          +   globalize.setLocale(localeId)
          +   .done(function(ar)
          +   {
          +      ...
          +   })
          +})
          +
          +
        • + +
        • The following example has a DOM of body with a locale-specific CSS named ui-script-direction-rtl: +
          +<body class="ui-script-direction-rtl">
          +
          +
        • + +
        • The following example uses the locale-specific CSS to switch on the RTL feature for a UI component: +
          +.ui-script-direction-rtl .ui-listview
          +{
          +   direction: rtl;
          +}
          +.ui-script-direction-rtl .ui-li.ui-li-static
          +{
          +   text-align: right;
          +   unicode-bidi: bidi-override;
          +}
          +
          +
        • +
        + +

        The following example shows how to use the RTL property in a locale object (the rtl variable). If a given locale has an RTL direction, the variable is true.

        +
        +var globalize = tau.util.globalize,
        +    localeId  = "ar-EG";
        +
        +document.addEventListener('pageshow', function()
        +{
        +   globalize.setLocale(localeId)
        +   .done(function(ar)
        +   {
        +      console.log(ar.rtl) /* true */
        +   })
        +})
        +
        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/guides_tau_w.htm b/org.tizen.ui.practices/html/web/tau/guides_tau_w.htm new file mode 100644 index 0000000..9d396ee --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/guides_tau_w.htm @@ -0,0 +1,131 @@ + + + + + + + + + + + + + TAU + + + +
        +
        +

        Mobile Web Wearable Web

        +
        + +
        + +

        Related Info

        + +
        +
        + +
        +

        TAU

        + +

        The Tizen Advanced UI Framework components allow you to create and manage various kinds of UI components. The components represent a visual UI element, such as a button or slider, which gives you interaction and manipulation features.

        +

        TAU is the standard Web UI library for Tizen platform, originated from the Tizen Web UI Framework Library (standard library for Tizen 2.2.1), which was mainly an extension to jQuery Mobile. The key features of the Web UI Framework Library were coding simplification and application creation speed. The purpose of TAU is to be the "framework advanced to the next level".

        + + + + + + + + + + +
        Note
        Tizen Advanced UI Framework is optional, but recommended for making Web applications for Tizen. +
        + +

        With TAU, you can take advantage of the following benefits in your code:

        +
          +
        • TAU is a standalone library, so no additional libraries are needed.
        • +
        • TAU can be used with jQuery, as it exposes a special API to the jQuery object identical to jQuery Mobile. Migration is painless.
        • +
        • TAU has been written with speed in mind, and all the code is tweaked for maximum performance.
        • +
        • Applications can be built to dramatically improve startup performance.
        • +
        • TAU is ECMAScript5- and HTML5-compliant.
        • +
        • TAU has a large and open API, TAU methods and core functions (event utility functions) are available and not hidden.
        • +
        • TAU is customizable and easy to extend (to create new UI components).
        • +
        • TAU is optimized for wearable, mobile, and TV devices.
        • +
        • TAU supports various profiles (mobile, wearable, and TV).
        • +
        + + + + + + + + + + +
        Note
        TAU (Tizen Advanced UI) is the new name of the tizen-web-ui-fw. In all documents and source code, TAU is used instead of tizen-web-ui-fw. +

        Since 2.3, tizen-web-ui-fw has been deprecated (including tizen-web-ui-fw.js, tizen-web-ui-fw-libs.js, and tizen-web-ui-fw.css). Since 2.4, tizen-web-ui-fw is fully deleted and not supported anymore.

        +
        + +

        To learn to use the TAU features in your application UI, see the following topics:

        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/header_ww.htm b/org.tizen.ui.practices/html/web/tau/header_ww.htm new file mode 100644 index 0000000..933828f --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/header_ww.htm @@ -0,0 +1,128 @@ + + + + + + + + + + + + + Creating Expandable Headers + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating Expandable Headers

        + +

        You can create an expandable header component for your application. The expandable header offers events to support interactivity with other components.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the header component in a rectangular and circular UI.

        + +

        Figure: Header component in rectangular and circular devices

        +

        Header component in a rectangular device Header component in a circular device

        + +

        To implement the header component, edit the HTML code to add the header component to your application screen:

        +
        +<div class="ui-page ui-page-active" id="headerPage" >
        +   <header class="ui-header" id="myHeader">
        +      <h2 class="ui-title">Long title with ExpandableHeader</h2>
        +   </header>
        +   <div class="ui-content content-padding">
        +      Header is expandable in Circular UI.
        +   </div>
        +</div>
        +
        + + +

        The header component supports the following events.

        + + + + + + + + + + + + + + + + + + + + +
        Event nameDescription
        headerexpandTriggered when the header starts to expand.
        headerexpandcompleteTriggered after the header has fully expanded.
        headercollapseTriggered when the header returns to the state before expanding.
        + +

        You can use the headerexpand and headercollapse events if you need to do something when the header expands and collapses.

        +

        The following examples show header events with Marquee.

        + +
        +var page = document.querySelector("#myPage");
        +
        +page.addEventListener("pagebeforeshow", function() 
        +{
        +   var textElement = page.querySelector(".ui-title"),
        +       marquee = new tau.widget.Marquee(textElement);
        +}, false);
        +
        +page.addEventListener("headercollapse", function() 
        +{
        +   if (marquee) 
        +   {
        +      marquee.reset();
        +   }
        +}, false);
        +
        +page.addEventListener("headerexpandcomplete", function() 
        +{
        +   if (marquee) 
        +   {
        +      marquee.start();
        +   }
        +}, false);
        +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/helloworld_w.htm b/org.tizen.ui.practices/html/web/tau/helloworld_w.htm new file mode 100644 index 0000000..06b8d3b --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/helloworld_w.htm @@ -0,0 +1,183 @@ + + + + + + + + + + + + + Hello World: Creating a Basic Hello World Page + + + + + +
        +

        Hello World: Creating a Basic Hello World Page

        + +

        You can import TAU into your application and create a basic Hello World page with TAU.

        + +

        The following example shows a basic TAU template:

        +
        +<!DOCTYPE html>
        +<html>
        +   <head>
        +      <meta name="viewport" content="width=device-width, user-scalable=no"/>
        +      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
        +      <link rel="stylesheet" href="myapp.css" />
        +      <title>Hello TAU</title>
        +   </head>
        +   <body>
        +      <!--HTML BODY CONTENT-->
        +      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
        +      <script src="myapp.js"></script>
        +   </body>
        +</html>
        +
        + + +

        Scaling the UI

        +

        The Tizen Advanced UI (TAU)-based template provides 2 scaling methods: device-width and fixed-width.

        +
          +
        • Device-width scaling +

          This scaling mode is suited for most mobile devices, such as Tizen, iPhone® and Android®. In this mode, the viewport width is set to device-width, enabling rem scaling using the Rem and Em units. These units calculate the size of a source element automatically based on the container font size (Em) or the base font size (Rem). In Tizen Web applications, a 320 px screen width is assumed.

          +
          <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
          +
        • +
        • Fixed-width scaling +

          This scaling mode is best suited for Tizen devices, since the entire screen can be scaled on the viewport level. In the viewport scaling mode, set the size of all resources to fit the 360 px screen width.

          +

          You can also use fixed-width scaling if you do not want to scale your application or if you want to set your own scale. In this case, declare a viewport but note that the default viewport scaling is overridden by the declared viewport. In the Tizen Web UI components, viewport scaling is set automatically to device-width:

          +
          <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
          +

          To enable fixed-width scaling, the header must contain the <meta name="viewport"> element:

          +
          <meta name="viewport" content="width=360, initial-scale=1, user-scalable=no">
          +
        • +
        + +

        Importing TAU

        +

        You can import TAU with HTML. For better performance, all CSS files must be included in the header and all script elements must be put before the body element's close tag:

        +
        +<!DOCTYPE html>
        +<html>
        +   <head>
        +      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
        +   </head>
        +   <body>
        +      <!-- HTML BODY CONTENT -->
        +      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
        +   </body>
        +</html>
        +
        +

        In HTML, use the <script> and <link> elements. These default elements are used to load the basic Tizen Advanced UI (TAU) libraries that must be included in Tizen Web applications. The loaded libraries are:

        +
          +
        • TAU library: tau(.min).js

          This element is mandatory, as it imports the TAU library, which you need to use the TAU JavaScript Interface.

        • +
        • TAU theme: tau(.min).css

          This element is also mandatory, as it imports the TAU theme.

        • +
        + +

        Running Custom JavaScript and CSS

        +

        You can add an additional <script src="<CUSTOM_LIBRARY>"> or <link rel="stylesheet" src="<CUSTOM_CSS>"> element to include your own scripts and style sheets. However, place them after the default <script> elements, as you can use any TAU APIs provided by the default libraries.

        +

        To load your JavaScript file, include the file in the <script> element in the HTML header. Since the TAU files are already loaded, you can use any APIs from these libraries as well.

        +
        <script src="{YOUR_SCRIPT_PATH}"></script>
        + +

        Creating a Page in the Body

        + +

        The body section of the HTML file contains 1 or more pages.

        +

        To create a page in <body>, you can use the "ui-page" class with the <div> element:

        +
        +<body>
        +   <div class="ui-page" id="main">
        +   </div>
        +</body>
        +
        + +

        Each page has a header, mandatory content, and a footer:

        +
        +<body>
        +   <div class="ui-page" id="main">
        +      <div class="ui-header">
        +         <h1>Hello World</h1>
        +      </div>
        +      <div class="ui-content">
        +         <p>Hello TAU!</p>  
        +      </div>
        +      <div class="ui-footer">
        +         <button>OK</button>  
        +      </div>
        +   </div>
        +</body>
        +
        + +

        The following example shows a basic sample code for Hello World :

        +
        +<!DOCTYPE html>
        +<html>
        +   <head>
        +      <meta name="viewport" content="width=device-width, user-scalable=no"/>
        +      <link rel="stylesheet" href="./lib/tau/mobile/theme/default/tau.css"/>
        +      <link rel="stylesheet" href="myapp.css" />
        +      <title>Hello TAU</title>
        +   </head>
        +   <body>
        +      <div class="ui-page" id="main">
        +         <div class="ui-header">
        +            <h1>Hello World</h1>
        +         </div>
        +         <div class="ui-content">
        +            <p>Hello TAU!</p>  
        +         </div>
        +         <div class="ui-footer">
        +            <button>OK</button>  
        +         </div>
        +      </div>
        +      <script type="text/javascript" src="./lib/tau/mobile/js/tau.js"></script>
        +      <script src="myapp.js"></script>
        +   </body>
        +</html>
        +
        + + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/helper_ww.htm b/org.tizen.ui.practices/html/web/tau/helper_ww.htm new file mode 100644 index 0000000..c8dbcb7 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/helper_ww.htm @@ -0,0 +1,230 @@ + + + + + + + + + + + + + Using the Helper Script + + + + +
        +

        Using the Helper Script

        + +

        You can use the TAU helper script to support some components for the Web applications. SnapListMarqueeStyle allows you to create a marquee-able and expandable list style with the SnapListview.

        + +

        This feature is supported in wearable applications only.

        + +

        You can use the helper script as follows:

        + +
        +<script>
        +   var helperInstance = tau.helper.NameSpace
        +</script>
        +
        + +

        The SnapListMarqueeStyle helper provides a helper script to support creating some usable components for the list style. It supports making the list view more effective using the SnapListview and Marquee components.

        + + + + + + + + + + +
        Note
        This helper script is supported since Tizen 2.3.
        + +

        The following example shows how to create your own listview style with SnapListMarqueeStyle. In the example, the list item text scrolls horizontally and the sub text appears if the list item is placed in the middle of the screen.

        + +

        To create a SnapListMarqueeStyle:

        + +
          +
        1. Edit the HTML code to add the SnapListMarqueeStyle component to your application screen. +

          You can add a multiline style listview as follows.

          + +
          +<div class="ui-page ui-page-active" id="snaplistTest">
          +   <header class="ui-header">
          +      <h2 class="ui-title">Bottom Button</h2>
          +   </header>
          +   <div class="ui-content">
          +      <ul class="ui-listview ui-snap-listview expand-list" id="snapList">
          +         <li class="li-has-2line">
          +            <div class="ui-marquee ui-marquee-gradient">1.SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-2line">
          +            <div class="ui-marquee ui-marquee-gradient">2.SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-2line">
          +            <div class="ui-marquee ui-marquee-gradient">3.SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-2line">
          +            <div class="ui-marquee ui-marquee-gradient">4.SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +      </ul>
          +   </div>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set your list animation style: +
          .ui-listview.expand-list li.li-has-2line .ui-marquee
          +{
          +   -webkit-transform: translate3d(0, 16px, 0);
          +   -webkit-transition: all ease .5s;
          +}
          +.ui-listview.expand-list li.li-has-2line.ui-snap-listview-selected .ui-marquee
          +{
          +   -webkit-transform: translate3d(0, 0, 0);
          +   -webkit-transition: all ease 1s;
          +}
          +
          +.ui-listview.expand-list li.li-has-2line .ui-li-sub-text
          +{
          +   -webkit-transform: translate3d(0, -20px, 0);
          +   opacity: 0;
          +   -webkit-transition: all ease .5s;
          +}
          +.ui-listview.expand-list li.li-has-2line.ui-snap-listview-selected .ui-li-sub-text
          +{
          +   -webkit-transform: translate3d(0, 0, 0);
          +   opacity: 1;
          +   -webkit-transition: all ease 1s;
          +}
          +
          +
        4. + +
        5. Edit the JavaScript code to make your list into a SnapListMarqueeStyle component and manage the list events: +
          +<script>
          +var page = document.getElementById("snaplistTest"),
          +    list = document.getElementById("snapList"),
          +    listHelper;
          +
          +page.addEventListener("pageshow", function() 
          +{
          +   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
          +});
          +
          +page.addEventListener("pagehide", function() 
          +{
          +   listHelper.destroy();
          +});
          +</script>
          +
          +
        6. +
        + +

        The following table shows the options you have in creating your SnapListMarqueeStyle component.

        + + + + + + + + + + + + + + + + + + +
        OptionInput typeDefault valueDescription
        marqueeDelaynumber0Sets the delay time (in milliseconds) for the marquee component.
        + +

        You can use the following methods with the SnapListMarqueeStyle:

        + +
          +
        • create() +

          Creates the related components for SnapListMarqueeStyle.

          +

          This method is supported since Tizen 2.3.

          +

          The following code example shows the use of the method:

          +
          +<ul class="ui-listview ui-snap-listview" id="snapList">
          +   <li>some element or text</li>
          +</ul>
          +
          +<script>
          +   var list = document.getElementById("snapList"),
          +       listHelper;
          +
          +   /* Create the helper */
          +   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
          +</script>
          +
          +
        • +
        • destroy() +

          Destroys the related components for SnapListMarqueeStyle.

          +

          This method is supported since Tizen 2.3. It has no return value.

          +

          The following code example shows the use of the method:

          +
          +<ul class="ui-listview ui-snap-listview" id="snapList">
          +   <li>some element or text</li>
          +</ul>
          +
          +<script>
          +   var list = document.getElementById("snapList"),
          +       listHelper;
          +
          +   /* Create the helper */
          +   listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
          +
          +   /* Destroy the helper */
          +   listHelper.destroy();
          +</script>
          +
          +
        • +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/indexscrollbar_ww.htm b/org.tizen.ui.practices/html/web/tau/indexscrollbar_ww.htm new file mode 100644 index 0000000..72abb36 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/indexscrollbar_ww.htm @@ -0,0 +1,202 @@ + + + + + + + + + + + + + Creating Index Scroll Bars + + + + + +
        +

        Creating Index Scroll Bars

        + +

        You can create a circle- or rectangle-shaped index scroll bar component with the CircularIndexScrollBar and IndexScrollBar APIs.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the index scroll bar component in a rectangular and circular UI.

        + +

        Figure: Index scroll bar component in rectangular and circular devices

        +

        Index scroll bar component in a rectangular device Index scroll bar component in a circular device

        + + +

        To implement the index scroll bar component:

        + +
          +
        1. Edit the HTML code to add the component to your application screen: +
          <div class="ui-page ui-page-active" id="pageIndexScrollbar" >
          +   <header class="ui-header ui-header-small">
          +      <h2 class="ui-title ui-title-text-fadeout">Index Scroll Bar</h2>
          +   </header>
          +   <div id="indexscrollbar"></div>
          +   <section class="ui-content">
          +      <ul class="ui-listview ui-snap-listview" id="list1">
          +         <li class="ui-listview-divider">A</li>
          +         <li>Anton</li>
          +         <li class="ui-listview-divider">B</li>
          +         <li>Barry</li>
          +         <li>Bob</li>
          +         <li class="ui-listview-divider">C</li>
          +         <li>Carry</li>
          +         <li class="ui-listview-divider">D</li>
          +         <li>Daisy</li>
          +         <li class="ui-listview-divider">E</li>
          +         <li>Eric</li>
          +         <li class="ui-listview-divider">F</li>
          +         <li>Fay</li>
          +         <li class="ui-listview-divider">G</li>
          +         <li>Garry</li>
          +       </ul>
          +   </section>
          +</div>
          +
          +
        2. + +
        3. Edit the JavaScript code to manage the index scroll bar events and other functionality: +

          To create a component selectively:

          +
          +var indexScrollbarElement = document.getElementById("indexscrollbar");
          +
          +if (!tau.support.shape.circle) 
          +{
          +   /* Create IndexScrollbar */
          +   indexScrollbar = new tau.widget.IndexScrollbar(indexScrollbarElement);
          +} 
          +else 
          +{
          +   /* Create CircularIndexScrollbar */
          +   indexScrollbar = new tau.widget.CircularIndexScrollbar(indexScrollbarElement);
          +}
          +
          + +

          To use the callback:

          +
          +indexScrollbarElement.addEventListener("select", function(event) 
          +{
          +   var index = event.detail.index;
          +   /* Do something using the index */
          +   console.log(index);
          +});
          +
          + +

          In the following example, the list scrolls to the position of the list item defined using the ui-listview-divider class, selected by the index scroll bar.

          +

          Note that in a rectangular UI, touching the index generates the selection, but in a round UI, the selection occurs when using the rotary.

          + +
          +(function() 
          +{
          +   var page = document.getElementById("pageIndexScrollbar"),
          +       listviewElement = document.getElementById("list1"),
          +       isCircle = tau.support.shape.circle,
          +       scroller,
          +       indexScrollbar;
          +
          +   page.addEventListener("pageshow", function(ev) 
          +   {
          +      var indexScrollbarElement = document.getElementById("indexscrollbar"),
          +          listDividers = listviewElement.getElementsByClassName("ui-listview-divider"), /* List dividers */
          +          dividers = {}, /* Collection of list dividers */
          +          indices = [],	/* Index list */
          +          divider,
          +          i, idx;
          +
          +      /* For all list dividers */
          +      for (i = 0; i < listDividers.length; i++) 
          +      {
          +         /* Add the list divider elements to the collection */
          +         divider = listDividers[i];
          +         idx = divider.innerText;
          +         dividers[idx] = divider;
          +
          +         /* Add the index to the index list */
          +         indices.push(idx);
          +      }
          +
          +      scroller = tau.util.selectors.getScrollableParent(listviewElement);
          +
          +      if (!isCircle) 
          +      {
          +         indexScrollbar = new tau.widget.IndexScrollbar(indexScrollbarElement, {index: indices, container: scroller});
          +      }
          +      else 
          +      {
          +         /* Create IndexScrollbar */
          +         indexScrollbar = new tau.widget.CircularIndexScrollbar(indexScrollbarElement, {index: indices});
          +
          +         /* Add SnapListview item "selected" event handler */
          +         listviewElement.addEventListener("selected", function (ev) 
          +         {
          +            var indexValue = ev.target.textContent[0];
          +            indexScrollbar.value(indexValue);
          +         });
          +      }
          +
          +      /* Add IndexScrollbar index "select" event handler */
          +      indexScrollbarElement.addEventListener("select", function (ev) 
          +      {
          +         var divider,
          +             idx = ev.detail.index;
          +
          +         divider = dividers[idx];
          +         if (divider && scroller) 
          +         {
          +            /* Scroll to the ui-listview-divider element */
          +            scroller.scrollTop = divider.offsetTop - scroller.offsetTop;
          +         }
          +      });
          +   });
          +
          +   page.addEventListener("pagehide", function(ev) 
          +   {
          +      indexScrollbar.destroy();
          +   });
          +} ());
          +
          +
        4. +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/list_ww.htm b/org.tizen.ui.practices/html/web/tau/list_ww.htm new file mode 100644 index 0000000..fd667cd --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/list_ww.htm @@ -0,0 +1,191 @@ + + + + + + + + + + + + + Creating Snap Lists + + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating Snap Lists

        + +

        You can create a snap list component with the marquee component using the SnapListview API and the helper script.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the list component in a rectangular and circular UI.

        +

        Figure: List component in rectangular and circular devices

        +

        List component in a rectangular device List component in a circular device

        + +

        To implement the list component:

        + +
          +
        1. Edit the HTML code to add the list component to your application screen: +
          +<div class="ui-page ui-page-active" id="snapListPage" >
          +   <header class="ui-header">
          +      <h2 class="ui-title">Snap List</h2>
          +   </header>
          +   <div class="ui-content">
          +      <ul class="ui-listview ui-snap-listview expand-list" id="snapList">
          +         <li class="li-has-3line">
          +         <div class="ui-marquee ui-marquee-gradient">1.3line SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-3line">
          +            <div class="ui-marquee ui-marquee-gradient">2.3line SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-3line">
          +            <div class="ui-marquee ui-marquee-gradient">3.3line SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-3line">
          +            <div class="ui-marquee ui-marquee-gradient">4.3line SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +         <li class="li-has-3line">
          +            <div class="ui-marquee ui-marquee-gradient">5.3line SnapListview with Marquee SnapListview with Marquee</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +            <div class="li-text-sub ui-li-sub-text">sub-text</div>
          +         </li>
          +      </ul>
          +   </div>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set the visual style of the list: +
          +.ui-listview li .li-text-sub 
          +{
          +   display: block;
          +   text-overflow: ellipsis;
          +   overflow: hidden;
          +   line-height: 32px;
          +   color: rgb(51, 51, 51);
          +}
          +
          +.ui-listview li.li-has-3line 
          +{
          +   padding-top: 0;
          +   padding-bottom: 0;
          +   height: 115px;
          +}
          +
          +.ui-listview.expand-list li.li-has-3line .ui-marquee
          +{
          +   -webkit-transform: translate3d(0, 30px, 0);
          +}
          +
          +.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-marquee
          +{
          +   -webkit-transform: translate3d(0, 0, 0);
          +   -webkit-transition: all ease 1s;
          +}
          +
          +.ui-listview.expand-list li.li-has-3line .ui-li-sub-text:nth-child(2)
          +{
          +   -webkit-transform: translate3d(0, -10px, 0);
          +   opacity: 0;
          +}
          +
          +.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-li-sub-text:nth-child(2)
          +{
          +   -webkit-transform: translate3d(0, 0, 0);
          +   opacity: 1;
          +   -webkit-transition: all ease 1s;
          +}
          +
          +.ui-listview.expand-list li.li-has-3line .ui-li-sub-text:last-child
          +{
          +   -webkit-transform: translate3d(0, -42px, 0);
          +   opacity: 0;
          +}
          +
          +.ui-listview.expand-list li.li-has-3line.ui-snap-listview-selected .ui-li-sub-text:last-child
          +{
          +   -webkit-transform: translate3d(0, 0, 0);
          +   opacity: 1;
          +   -webkit-transition: all ease 1s;
          +}
          +
          +
        4. + +
        5. Edit the JavaScript code to manage the list events and other functionality: +
          +var page = document.querySelector("#snapListPage"),
          +    listHelper;
          +
          +page.addEventListener( "pagebeforeshow", function() 
          +{
          +   var list = document.getElementById("snapList");
          +
          +   if (tau.support.shape.circle) 
          +   {
          +      listHelper = tau.helper.SnapListMarqueeStyle.create(list, {marqueeDelay: 1000});
          +   }
          +});
          +
          +page.addEventListener( "pagehide", function() 
          +{
          +   if (tau.support.shape.circle) 
          +   {
          +      if (listHelper) 
          +      {
          +         listHelper.destroy();
          +      }
          +   }
          +});
          +
          +
        6. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/managing_page_w.htm b/org.tizen.ui.practices/html/web/tau/managing_page_w.htm new file mode 100644 index 0000000..e85eac3 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/managing_page_w.htm @@ -0,0 +1,262 @@ + + + + + + + + + + + + + Managing Pages: Creating and Routing a Page + + + + + +
        +

        Managing Pages: Creating and Routing a Page

        + +

        The basic building block of an application UI in the TAU library is the Page element, which includes all other elements. The element is optional and extendable, so you can have any element for grouping controls you want.

        + +

        Page Structure

        +

        The page consist of:

        +
          +
        • Header area +

          Shows the user which page is currently open. The header can contain buttons, menus, and toolbars. The header is optional.

        • +
        • Content area +

          Contains the main application content. The content area has an optional scroll bar.

        • +
        • Footer area +

          Contains a status line or buttons. The footer is optional.

        • +
        +

        All the page areas are specified by a corresponding class attribute.

        + +

        Figure: Page content

        +

        Application UI Schema

        + +

        If there is no Page element in the markup, TAU creates one. For example, if no Page element exists:

        +
        <span>I have no page</span>
        +

        TAU creates a page:

        +
        <div class="ui-page"><span>I have no page</span></div>
        +
        + + +

        Creating a Single Page

        + + +

        To create a page:

        +
          +
        1. Create a single page with the following code:

          +
          <div class="ui-page">
          +   Simple page
          +</div>
          +
          + +

          To create a page for your application, use the class attribute with the ui-page value. TAU uses that information to properly acquire the div element and bind the DOM element to its JavaScript component implementation.

          +
        2. +
        3. Create a header area by using the class="ui-header" attribute:

          +
          <div class="ui-page">
          +   <div class="ui-header">This is a header</div>
          +</div>
          +
        4. +
        5. Create a footer area by using the class="ui-footer" attribute:

          +
          <div class="ui-page">
          +   <div class="ui-footer">This is a footer</div>
          +</div>
          +
        6. + +
        7. Create the main content area by using the class="ui-content" attribute:

          +
          <div class="ui-page">
          +   <div class="ui-header">MyApplication header</div>
          +   <div class="ui-content">
          +      Hello world!
          +   </div>
          +   <div class="ui-footer">Application status line</div>
          +</div>
          +
          +

          The previous example shows a full page structure. The header and footer areas can contain multiple UI components, such as buttons or images.

          +

          The following example shows a title bar with a More Options button and an icon:

          +
          <div class="ui-page">
          +   <div class="ui-header">
          +      <h2 class="ui-title ui-icon" style="background-image: url(image.png);">Title</h2>
          +      <button type="button" class="ui-more ui-icon-overflow">More Options</button>
          +   </div>
          +   <div class="ui-content">MyApplication content</div>
          +</div>
          +
          +
        8. +
        9. +

          You can also create a popup for your page:

          +
          <div class="ui-page">
          +   <div class="ui-header">Popup Open Page</div>
          +   <div class="ui-content">
          +      <a href="#popup" class="ui-btn" data-rel="popup">Popup Open</a>
          +   </div>
          +
          +   <div id="popup" class="ui-popup">
          +      <div class="ui-popup-header">Popup Page</div>
          +      <div class="ui-popup-content">Popup Content</div>
          +   </div>
          +</div>
          +
          +

          The popup works because TAU opens (makes visible) the page whose id attribute corresponds to the #hashtag page. This is basic page routing; for more information, see Page Routing.

          +
        10. +
        + +

        Creating Multiple Pages in One HTML Code

        + + +

        You can implement a template containing multiple page containers in the application's index.html file.

        +

        In a multi-page layout, the main page is defined with the ui-page-active class. If no page has the ui-page-active class, the framework automatically sets up the first page in the source order as the main page. You can improve the launch performance by explicitly defining the main page to be displayed first. If the application has to wait for the framework to set up the main page, the page is displayed with some delay only after the framework is fully loaded.

        +
        +<body>
        +   <div class="ui-page ui-page-active" id="first">
        +      <div class="ui-content">
        +         <!--CONTENT-->
        +      </div>
        +   </div>
        +
        +   <div class="ui-page" id="two">
        +      <div class="ui-content">
        +         <!--CONTENT-->
        +      </div>
        +   </div>
        +</body>
        +
        + +

        Page Routing

        + +

        TAU is basically a UI framework, but since its purpose is to ease application building, it also provides basic functionality for changing pages in multi-page applications. The mechanics behind page routing are simple, and work without any additional JavaScript code. You can use the JavaScript API to get more powerful page routing functionalities.

        + +

        To manage page routing:

        + +
          +
        • To route without JavaScript: +

          TAU routing is based on URL hash changes, and it has a built-in mechanism for history tracking. The framework responds to #hashtag changes and tries to display the page that has the id attribute equal to the hashtag value. This approach works for pages defined inside the same HTML document.

          +

          TAU uses every <a> element in the page and binds routing methods for them. In addition, all button instances that are based on that tag and have a proper href attribute work with the framework router. The active page has a ui-page-active class assigned. Set that class yourself to be sure the correct page is displayed.

          +
          <!--pageOne.html-->
          +<div class="ui-page ui-page-active" id="first">
          +   <div class="ui-content">
          +      <a href="pageTwo.html">Go to page two</a>
          +   </div>
          +</div>
          +
          +<!--pageTwo.html-->
          +<div class="ui-page" id="two">
          +   <div class="ui-content">
          +      <a href="pageOne.html">Go to page one</a>
          +   </div>
          +</div>
          +
          +

          With multiple pages in one HTML code, you can use only the ID of the page in the href attribute:

          +
          +<div class="ui-page ui-page-active" id="first">
          +   <div class="ui-content">
          +      <a href="#two">Go to page two</a>
          +   </div>
          +</div>
          +
          +<div class="ui-page" id="two">
          +   <div class="ui-content">
          +      <a href="#first">Go to page one</a>
          +   </div>
          +</div>
          +
          +
        • +
        • To route using the API: +

          You can change pages through the TAU API by using the tau.changePage() method:

          +
          <!--pageTwo.html-->
          +<div class="ui-page ui-page-active" id="first">
          +   <div class="ui-content">
          +      You are viewing the first page of the example.
          +      <button id="first-button">Click here to change to page two</button>
          +   </div>
          +   <script>
          +      var el1 = document.getElementById("first-button");
          +      el1.addEventListener("click", function ()
          +      {
          +         tau.changePage("pageTwo.html");
          +      });
          +   </script>
          +</div>
          +
          +<!--pageTwo.html-->
          +<div class="ui-page" id="second">
          +   <div class="ui-content">
          +      This is the second page of the example.
          +      <button id="second-button">Click here to change to page one</button>
          +   </div>
          +   <script>
          +      var el2 = document.getElementById("second-button");
          +      el2.addEventListener("click", function ()
          +      {
          +         tau.changePage("pageOne.html");
          +      });
          +   </script>
          +</div>
          +
          +
        • + +
        • To load pages from external resources: +

          When an external page is supplied to the routing engine, TAU fetches that page and appends it to the current document, while changing the base element's href attribute to that page path. This ensures that all other resources, such as CSS, JS, or images, are loaded from the correct path without no real page reloads. Instead, TAU simply switches the current page to the new page.

          +

          To load pages from external resources, define the proper local address in the href attribute of the link:

          +
          <div class="ui-page">
          +   <div class="ui-content">
          +      <a href="external_text.html">Change to external</a>
          +   </div>
          +</div>
          +
          +

          To create an external link that is not supposed to be handled by the TAU router, use the rel="external", data-ajax="false", or target="_self" attribute:

          +
          <div class="ui-page">
          +   <div class="ui-content">
          +      <a href="external_text.html" target="_self">Change to external</a>
          +   </div>
          +</div>
          +
          +
        • +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/moreoptions_ww.htm b/org.tizen.ui.practices/html/web/tau/moreoptions_ww.htm new file mode 100644 index 0000000..f25dbc1 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/moreoptions_ww.htm @@ -0,0 +1,184 @@ + + + + + + + + + + + + + Implementing More Options + + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Implementing More Options

        + + +

        In a rectangular UI, you can implement more options using the button and popup components. In a circular UI, the selector component provides the more options button. The following example shows how to create a more options button for the circular UI.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the more options component in a rectangular and circular UI.

        +

        Figure: More options component in rectangular and circular devices

        +

        More options component in a rectangular device More options component in a circular device

        + +

        To implement the more options component:

        +
          + +
        1. Edit the HTML code to add the more options component to your application screen: +
          <div id="moreoptionsPage" class="ui-page">
          +   <link rel="stylesheet"  href="./moreoptions.css">
          +   <header class="ui-header ui-has-more">
          +      <h2 class="ui-title">More Options</h2>
          +      <button type="button" class="ui-more ui-icon-overflow">More Options</button>
          +   </header>
          +   <div class="ui-content content-padding">
          +      It was a real pleasure for me to finally get to meet you. My colleagues join me in sending you our holiday greetings.
          +   </div>
          +
          +   <!-- Rectangular profile -->
          +   <div id="moreoptionsPopup" class="ui-popup" data-transition="slideup">
          +      <div class="ui-popup-header">Options</div>
          +      <div class="ui-popup-content">
          +         <ul class="ui-listview">
          +            <li><a href="#">1</a></li>
          +            <li><a href="#">2</a></li>
          +            <li><a href="#">3</a></li>
          +         </ul>
          +      </div>
          +   </div>
          +
          +   <!-- Circular profile -->
          +   <div id="moreoptionsDrawer" class="ui-drawer" data-drawer-target="#moreoptionsPage" data-position="right" data-enable="true" data-drag-edge="1">
          +      <div id="selector" class="ui-selector">
          +         <div class="ui-item show-icon" data-title="Show"></div>
          +         <div class="ui-item human-icon" data-title="Human"></div>
          +         <div class="ui-item delete-icon" data-title="Delete"></div>
          +         <div class="ui-item show-icon" data-title="Show"></div>
          +         <div class="ui-item human-icon" data-title="Human"></div>
          +         <div class="ui-item delete-icon" data-title="Delete"></div>
          +         <div class="ui-item x-icon" data-title="X Icon"></div>
          +         <div class="ui-item fail-icon" data-title="Fail"></div>
          +         <div class="ui-item show-icon" data-title="Show"></div>
          +         <div class="ui-item human-icon" data-title="Human"></div>
          +         <div class="ui-item delete-icon" data-title="Delete"></div>
          +         <div class="ui-item show-icon" data-title="Show"></div>
          +         <div class="ui-item human-icon" data-title="Human"></div>
          +      </div>
          +   </div>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set the visual style of the buttons: + +
          +#moreoptionsDrawer
          +{
          +   display: none;
          +}
          +
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   #moreoptionsDrawer
          +   {
          +      display: block;
          +      background-color: rgba(255, 255, 255, 0.1);
          +      border-radius: 100%;
          +   }
          +   #moreoptionsPopup
          +   {
          +      display: none;
          +   }
          +}
          +
          + +
        4. +
        5. Edit the JavaScript code to manage the option button events and other functionality: + +
          +(function()
          +{
          +   var page = document.querySelector("#moreoptionsPage"),
          +       popup = page.querySelector("#moreoptionsPopup"),
          +       handler = page.querySelector(".ui-more"),
          +       drawer = page.querySelector("#moreoptionsDrawer"),
          +       selector = page.querySelector("#selector"),
          +       helper,
          +       clickHandlerBound;
          +
          +   function clickHandler(event)
          +   {
          +      tau.openPopup(popup);
          +   }
          +
          +   page.addEventListener("pagebeforeshow", function()
          +   {
          +      if (tau.support.shape.circle)
          +      {
          +         helper = tau.helper.DrawerMoreStyle.create(drawer,
          +         {
          +            handler: ".drawer-handler"
          +         });
          +      }
          +      else
          +      {
          +         /* Shape is square */
          +         clickHandlerBound = clickHandler.bind(null);
          +         handler.addEventListener("click", clickHandlerBound);
          +      }
          +   });
          +
          +   page.addEventListener("pagebeforehide", function() 
          +   {
          +      if (tau.support.shape.circle)
          +      {
          +         handler.removeEventListener("click", clickHandlerBound);
          +         helper.destroy();
          +      }
          +   });
          +})();
          +
          +
        6. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/notepad_w.htm b/org.tizen.ui.practices/html/web/tau/notepad_w.htm new file mode 100644 index 0000000..0c94eb8 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/notepad_w.htm @@ -0,0 +1,448 @@ + + + + + + + + + + + + + Creating a Notepad UI Application + + + +
        +
        +

        Mobile Web Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating a Notepad UI Application

        + +

        The notepad application shows all the notes in the main page, and allows the user to add new notes, edit existing notes, and delete notes by swiping them. The notes on the main page can be scrolled and edited, and a button is provided for adding a new note. After you click a note, it is displayed in the edit page for editing.

        + +

        To create a simple notepad application using the TAU library:

        + +
          +
        1. Generate an application from the Tizen SDK. +

          Create a simple basic application that can be used for further development:

          +
          1. In the IDE menu, go to + File > New > Tizen Web Project > WEARABLE-2.4 > Wearable UI > Basic Application.
          2. +
          3. Enter the application name as Notes and click Finish.
          +

          The IDE creates the application with a default file structure.

          +
        2. +
        3. Edit the section header for the index.html file. +

          Because the application runs on mobile or wearable devices, make sure that you have the correct tau.css styles for the corresponding profile:

          +
          • Mobile: +
            <link rel="stylesheet" type="text/css" href="lib/tau/mobile/theme/default/tau.min.css"/>
          • +
          • Wearable: +
            <link rel="stylesheet" type="text/css" href="lib/tau/wearable/theme/default/tau.min.css"/>
            +
          +

          Add also your own styles for the application:

          +
          <link rel="stylesheet" type="text/css" href="css/style.css"/>
          +
          + +

          The following example shows how the section header looks after editing:

          +
          +<head>
          +   <meta charset="utf-8" />
          +   <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
          +   <meta name="description" content="Tizen basic template generated by Tizen Web IDE"/>
          +
          +   <title>Notepad</title>
          +
          +   <!--Use 'mobile' or 'wearable' to choose the device TAU profile-->
          +   <link rel="stylesheet" type="text/css" href="lib/tau/mobile/theme/default/tau.css"/>
          +   <link rel="stylesheet" type="text/css" href="css/style.css"/>
          +</head>
          +
        4. +
        5. Create the pages: the main page for displaying the notes and the editing page for adding and editing notes. +
            +
          1. The main page is the first page, defined with the div block with the ui-page class and main id. +
            1. Add the title header (Notes) for the page: +
              +<div id="main" class="ui-page">
              +   <header class="ui-header">
              +      <h1>Notes</h1>
              +   </header>
              +</div>
              +
            2. +
            3. Add content for the main page by adding a div element with + the _ui-content class. Add to this a ul element, which creates the list of notes. +

              Set the data-scroll="y" and data-handler="true" attributes.

              +

              The item in the list is represented as a li element. When a note on the main page is clicked, the application triggers the changepage event to the editor page and shows the item.

              +
              +<div class="ui-content" data-scroll="y" data-handler="true">
              +   <ul class="ui-listview" id="notesList"></ul>
              +</div>
              +
            4. +
            5. Add a navigation button to the application to change to the editor page. The button is placed in the footer, and it is created from an a element, + which has the id="newBtn" attribute. +
              +<div class="ui-footer">
              +   <a class="ui-btn" href="javascript:void()" id="newBtn">New note</a>
              +</div>
              +
            +

            The above examples apply to a wearable application. The following example shows the full code for the main page in a mobile application:

            +
            +<div class="ui-page" id="main">
            +   <div class"ui-header" data-position="fixed">
            +      <h1>Notes</h1>
            +   </div>
            +   <div class="ui-content" data-scroll="y" data-handler="true">
            +      <ul class="ui-listview" id="notesList"></ul>
            +   </div>
            +   <div class="ui-footer">
            +      <a class="ui-btn" href="javascript:void()" id="newBtn">New note</a>
            +   </div>
            +</div>
            +
            + + + + + + + + + +
            Note
            In mobile applications, pages are constructed using the data-role attribute, while the wearable applications use the class attribute. In addition, the value of the data-role attribute in mobile applications differs from the class attribute value in the wearable applications.
            +
          2. + +
          3. On the editing page, the header and footer are similar to the main page. +

            The only difference is that the action triggered after pressing the button adds an item to the items array and adds the item to the top of the visible list. The editing page is defined with a div block with the id="editor" and class="ui-page" attributes.

            +

            The editing page is needed for adding or editing a selected note. It has a textarea element to allow the user to edit the selected note.

            + +
            +<!--This code applies to wearable applications-->
            +<div class="ui-page" id="editor">
            +   <div class="ui-header">
            +      <h1>Editor</h1>
            +   </div>
            +   <div class="ui-content">
            +      <textarea id="editorField" placeholder="enter note"></textarea>
            +   </div>
            +   <div class="ui-footer">
            +      <a href="javascript:void()" id="saveBtn">Save</a>
            +   </div>
            +</div>
            +
        6. + +
        7. Link to the TAU library sources and add the script to the application: +
          +<script src="lib/jquery.js"></script>
          +<script type="text/javascript" src="lib/tau/mobile/js/tau.js" data-build-remove="false"></script>
          +<script src="js/main.js"></script>
          +
          + +

          The index.html file is now ready.

          +
        8. + +
        9. Add styles for the content: +
          +a
          +{
          +   color: #FFF;
          +}
          +
          +#notesList.ui-listview
          +{
          +   width: 100%;
          +}
          +
          +#notesList.ui-listview li
          +{
          +   margin: 0;
          +   white-space: nowrap;
          +}
          +
          +#notesList.ui-listview li .ui-inline
          +{
          +   position: absolute;
          +   right: 5px;
          +   top: 5px;
          +}
          +
          +#notesList.ui-listview li .ui-swipe-item-cover-inner
          +{
          +   text-overflow: ellipsis;
          +   overflow: hidden;
          +}
          +
          +#editor .ui-scrollview-view
          +{
          +   height: 100%;
          +}
          +
          +#editor textarea
          +{
          +   height: 95%;
          +   width: 100%;
          +}
          +
          +
        10. +
        11. Create the main.js file and create a function to close the application. +

          The application is started when the HTML content is ready.

          +
          +document.addEventListener("DOMContentLoaded", function ()
          +   {
          +      'use strict';
          +
          +      var newBtn = document.getElementById('newBtn'),
          +          saveBtn = document.getElementById('saveBtn'),
          +          editorField = document.getElementById('editorField'),
          +          notesList = document.getElementById('notesList'),
          +          editorPage = document.getElementById('editor'),
          +
          +          mainPageId = '#main',
          +          editorPageId = '#editor',
          +
          +          currentIndex = null,
          +
          +          EMPTY_CONTENT = '(empty)',
          +          STORAGE_KEY = 'notepad';
          +
          +      /**
          +      * Get data from local storage
          +      * @return {Array}
          +      */
          +      function getStorage(key)
          +      {
          +         return JSON.parse(window.localStorage.getItem(key)) || false;
          +      }
          +
          +      /**
          +      * Add data to local storage
          +      * @param {Array} data
          +      */
          +      function addStorage(data)
          +      {
          +         window.localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
          +      }
          +
          +      /**
          +      * Return current page ID
          +      * @returns
          +      */
          +      function getCurrentPageId()
          +      {
          +         return $('.ui-page:visible')[0].id;
          +      }
          +
          +      /* Refresh current page */
          +      function refreshCurrentPage()
          +      {
          +         $('#' + getCurrentPageId()).trigger('create');
          +      }
          +
          +      /**
          +      * Get notes from storage
          +      * @return {Array}
          +      */
          +      function getNotes()
          +      {
          +         return getStorage(STORAGE_KEY) || [];
          +      }
          +
          +      /* Clear list with notes */
          +      function clearNotesList()
          +      {
          +         notesList.innerHTML = '';
          +      }
          +
          +      /* Delete note from storage */
          +      function deleteNote(index)
          +      {
          +         var notes = getNotes();
          +
          +         if (notes[index] !== undefined)
          +         {
          +            notes.splice(index, 1);
          +            addStorage(notes);
          +         }
          +         else
          +         {
          +            console.error('deleteNote: note not found');
          +         }
          +
          +         showNotes();
          +         refreshCurrentPage();
          +         event.stopPropagation();
          +      }
          +
          +      /**
          +      * Edit note using array index
          +      * @param index
          +      */
          +      function editNote(index)
          +      {
          +         var notes = getNotes();
          +
          +         if (notes[index] !== undefined)
          +         {
          +            currentIndex = index;
          +            editorField.value = getNotes()[index];
          +            tau.changePage(editorPageId);
          +         }
          +         else
          +         {
          +            console.error('editNote: note not found');
          +            showNotes();
          +            refreshCurrentPage();
          +         }
          +      }
          +
          +      /* Show all notes extracted from local storage */
          +      function showNotes()
          +      {
          +         var notes = getNotes(),
          +             notesLen = notes.length,
          +             li = {},
          +             swipeCover = {},
          +             swipeItem = {},
          +             deleteBtn = {},
          +             i = 0,
          +             notesListInst;
          +
          +         clearNotesList();
          +
          +         for (i; i < notesLen; i += 1)
          +         {
          +            li = document.createElement('li');
          +            li.addEventListener('click', editNote.bind(this, i), false);
          +
          +            deleteBtn = document.createElement('button');
          +            deleteBtn.className('ui-btn');
          +            deleteBtn.setAttribute('data-inline', 'true');
          +            deleteBtn.innerText = 'Delete';
          +
          +            deleteBtn.addEventListener('click', deleteNote.bind(this, i), false);
          +
          +            li.innerText = notes[i].replace(/\n/g, ' ') || EMPTY_CONTENT;
          +            li.appendChild(deleteBtn);
          +            notesList.appendChild(li);
          +            notesListInst = tau.widget.getInstance(notesList);
          +            tau.widget.Button(deleteBtn);
          +            notesListInst.refresh();
          +         }
          +      }
          +
          +      /* Clear editor textarea */
          +      function clearEditor()
          +      {
          +         editorField.value = '';
          +      }
          +
          +      /* Save note to storage */
          +      function saveNote()
          +      {
          +         var notes = getNotes();
          +
          +         if (currentIndex !== null)
          +         {
          +            notes[currentIndex] = editorField.value;
          +         }
          +         else
          +         {
          +            notes.push(editorField.value);
          +         }
          +
          +         addStorage(notes);
          +
          +         clearEditor();
          +         showNotes();
          +         tau.changePage(mainPageId);
          +      }
          +
          +      /* New note button handler */
          +      function newNote()
          +      {
          +         currentIndex = null;
          +         clearEditor();
          +
          +         tau.changePage(editorPageId);
          +      }
          +
          +      /* On editor page show handler */
          +      function onEditorPageShow()
          +      {
          +         editorField.focus();
          +      }
          +
          +      /* Attach events */
          +      function events()
          +      {
          +         newBtn.addEventListener('click', newNote);
          +         saveBtn.addEventListener('click', saveNote);
          +
          +         editorPage.addEventListener('pageshow', onEditorPageShow);
          +
          +         window.addEventListener('tizenhwkey', function (e)
          +         {
          +            if (e.keyName === "back"
          +               && window.tizen
          +               && window.tizen.application)
          +            {
          +               switch (getCurrentPageId())
          +               {
          +                  case 'main':
          +                     window.tizen.application.getCurrentApplication().exit();
          +                     break;
          +                  default:
          +                     window.history.back();
          +                     break;
          +               }
          +               return false;
          +            }
          +         }, false);
          +      }
          +
          +      /* Initialize */
          +      function init()
          +      {
          +         showNotes();
          +         events();
          +      }
          +
          +      init();
          +   }, false);
          +
          +

          Now the application is ready and you can deploy it to a device or Emulator.

          +
        12. +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/popup_ww.htm b/org.tizen.ui.practices/html/web/tau/popup_ww.htm new file mode 100644 index 0000000..95c2ce5 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/popup_ww.htm @@ -0,0 +1,114 @@ + + + + + + + + + + + + + Creating Popup Buttons + + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating Popup Buttons

        + +

        You can create bottom and side popup button components with the Popup API.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figures show the layout of the popup component in a rectangular and circular UI.

        + +

        Figure: Bottom popup component in rectangular and circular devices

        + +

        Bottom popup in a rectangular device Bottom popup in a circular device

        + +

        Figure: Side popup component in rectangular and circular devices

        + +

        Side popup component in a rectangular device Side popup component in a circular device

        + +

        To implement the popup button component:

        + +
          +
        • To implement a bottom popup button component: + +

          Edit the HTML code to add the bottom popup button component to your application screen. To add the bottom button to the circular UI, you must add the ui-bottom-button class to the popup footer. The popup can have only 1 bottom button.

          +
          +<div id="bottomBtnPopup" class="ui-popup">
          +   <div class="ui-popup-content">
          +      Turning on Power
          +      saving mode will
          +      limit the maximum
          +      power
          +   </div>
          +   <div class="ui-popup-footer ui-bottom-button">
          +      <button id="bottomBtn" class="ui-btn">Check</button>
          +   </div>
          +</div>
          +
          +
        • + +
        • To implement a side popup button component: +

          Edit the HTML code to add the side popup button component to your application screen. To add side buttons for the circular UI, you must add the ui-side-button class to the popup footer. The popup can have only 2 side buttons.

          +
          +<style>
          +   .btn-icon-cancel::before {-webkit-mask-image: url(./cancel.png)}
          +   .btn-icon-ok::before {-webkit-mask-image: url(./ok.png)}
          +</style>
          +<div id="sideBtnPopup" class="ui-popup">
          +   <div class="ui-popup-content">
          +      Turning on Power
          +      saving mode will
          +      limit the maximum
          +      power
          +   </div>
          +   <div class="ui-popup-footer ui-grid-col-2 ui-side-button">
          +      <button id="sideBtn-1" class="ui-btn btn-icon-cancel">Cancel</button>
          +      <button id="sideBtn-2" class="ui-btn btn-icon-ok">OK</button>
          +   </div>
          +</div>
          +
          +
        • +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/processing_ww.htm b/org.tizen.ui.practices/html/web/tau/processing_ww.htm new file mode 100644 index 0000000..a9bfff7 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/processing_ww.htm @@ -0,0 +1,105 @@ + + + + + + + + + + + + + Creating Full Size Processing Components + + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating Full Size Processing Components

        + +

        You can create a full size processing component with the Processing API.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the processing component in a rectangular and circular UI.

        +

        Figure: Processing component in rectangular and circular devices

        + +

        Processing component in a rectangular device Processing component in a circular device

        + +

        To implement the processing component:

        +
          +
        1. Edit the HTML code to add the processing component to your application screen: +
          +<div class="ui-page ui-page-active" id="pageProcessing" data-enable-page-scroll="false">
          +   <header class="ui-header">
          +      <h2 class="ui-title">Processing</h2>
          +   </header>
          +   <div class="ui-content content-padding">
          +      <div class="ui-processing"></div>
          +      <div class="ui-processing-text">
          +         Description about progress
          +      </div>
          +   </div>
          +   <div class="ui-processing ui-processing-full-size"></div>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set the visual style of the processing component: +
          +.ui-processing-full-size 
          +{
          +   display: none;
          +}
          +
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   .ui-processing 
          +   {
          +      display: none;
          +   }
          +   .ui-processing.ui-processing-full-size 
          +   {
          +      display: block;
          +   }
          +}
          +
          +
        4. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/tau_porting_w.htm b/org.tizen.ui.practices/html/web/tau/tau_porting_w.htm new file mode 100644 index 0000000..a78c928 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/tau_porting_w.htm @@ -0,0 +1,817 @@ + + + + + + + + + + + + + 2.4 Porting Guide: Changed APIs in 2.4 TAU + + + + + +
        +

        2.4 Porting Guide: Changed APIs in 2.4 TAU

        + +

        This guide describes the changes required to migrate a TAU element from 2.3 to 2.4.

        + +

        As the Tizen version number changes, TAU has been updated with new features. When migrating from 2.3 to 2.4, consider the following issues:

        +
          +
        • Selectors for defining the UI components
        • +
        • New and deprecated components in 2.4
        • +
        • Gesture event handling
        • +
        + +

        Backward Compatibility in TAU

        + +

        To support backward compatibility, TAU provides the tau.support-2.3.js and tau.support-2.3.css files.

        +

        If you want to use deprecated components, you can import those files. See the following example:

        + +
        +<html>
        +   <head>
        +      <script type="text/javascript" src="../lib/tau/mobile/js/tau.js"></script>
        +      <script type="text/javascript" src="../lib/tau/mobile/js/tau.support-2.3.js"></script>
        +      <link rel="stylesheet"  href="../lib/tau/mobile/theme/default/tau.css">
        +      <link rel="stylesheet"  href="../lib/tau/mobile/theme/default/tau.support-2.3.css">
        +      <link rel="stylesheet"  href="css/custom.css">
        +   </head>
        +</html>
        +
        + + + + + + + + + + + +
        Note
        The tau.support-2.3 file is only for backward compatibility. The above components are DEPRECATED since Tizen 2.4 and are deleted in Tizen 3.0.
        + +

        Component Definitions

        + +

        Since Tizen 2.4, it is strongly recommended to use the class selector to define the components in HTML files. The "data-role" selector has been deprecated and is no longer supported.

        + +

        The class selectors in TAU are composed with the "ui-" prefix and followed by the <COMPONENT_NAME>. For more information, see the UI Component API Reference (in mobile and wearable applications).

        +

        The following example shows how to define the UI components before and after:

        +
          +
        • Before: + +
          +<!-- Create Expandable component -->
          +<div data-role="expandable">
          +   <h1>Expandable head</h1>
          +   <div>Content</div>
          +</div>
          +
          +<!-- Create ToggleSwitch component -->
          +<select data-role="toggleswitch">
          +   <option value="off"></option>
          +   <option value="on"></option>
          +</select>
          +
          +<!-- Create SectionChanger component -->
          +<div data-role="section-changer">
          +   <div>
          +      <section>
          +         <h3>LEFT1 PAGE</h3>
          +      </section>
          +   </div>
          +</div>
          +
          + + + + + + + + + +
          Note
          The old selector with data-role can still be used in 2.4, but it is DEPRECATED and no longer supported in the next version.
          +
        • +
        • After: +
          +<!-- Create Expandable component -->
          +<div class="ui-expandable">
          +   <h1>Expandable head</h1>
          +   <div>Content</div>
          +</div>
          +
          +<!-- Create ToggleSwitch component -->
          +<select class="ui-toggleswitch">
          +   <option value="off"></option>
          +   <option value="on"></option>
          +</select>
          +
          +<!-- Create SectionChanger component -->
          +<div class="ui-section-changer">
          +   <div>
          +      <section>
          +         <h3>LEFT1 PAGE</h3>
          +      </section>
          +   </div>
          +</div>
          +
          +
        • +
        + + + +

        New Components in 2.4

        + +

        Some new mobile components are added in TAU since 2.4. Some are renamed from old components (such as Checkbox and Radio) and others are newly added with a new feature and theme (such as Colored ListView). The following table shows the new TAU components in 2.4.

        +

        For more information, see the Mobile UI Component API Reference.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: New TAU mobile components in 2.4
        UI componentDescription
        CheckboxThe checkbox component changes the default browser checkboxes to a form more adapted to the mobile environment.
        Colored List ViewThe colored list view component shows each list item with a gradient background color.
        Dropdown MenuThe dropdown menu component is used to select one option. It is created as a drop-down list form.
        ExpandableThe expandable component allows you to expand or collapse content when tapped.
        Floating ActionsThe floating actions component shows a floating action button that can be moved left and right.
        Grid ViewThe grid view component provides a grid-type list and presents content that are easily identified as images.
        Index ScrollbarThe index scrollbar component shows a shortcut list that is bound to its parent scrollbar and list view.
        Page IndicatorThe page indicator component presents as a dot-typed indicator.
        Panel ChangerThe panel changer and panel component provide a multi-page layout in a page component.
        RadioThe radio component changes the default browser radio button to a form more adapted to the mobile environment.
        Search InputThe search input component is used to search for page content.
        Section ChangerThe section changer component provides an application architecture, which has multiple sections on one page.
        TabsThe tabs component shows an unordered list of buttons on the screen wrapped together in a single group.
        Text EnveloperThe text enveloper component changes a text item to a button.
        + + +

        Deprecated Components

        + +

        Some mobile components are deprecated and no longer supported since 2.4. Instead of using deprecated components, see the following table and replace the components by new components or an HTML element.

        +

        For more information on deprecated components, see the Mobile Component API Reference.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: Deprecated TAU mobile components
        UI componentReplace with
        Autodividers-
        CheckboxRadioCheckbox component for the checkbox, radio component for the radio button.
        CollapsibleExpandable component.
        ControlGroupImplement your own customized application style.
        Fast ScrollIndex scrollbar component.
        GalleryImplement your own gallery with the section changer component.
        List DividerUse the ui-group-index class for a group index.
        NotificationPopup component with the ui-popup-toast class.
        Progress BarProgress component with the data-type="bar" option.
        Scroll Handler-
        Search BarSearch input component.
        Select MenuDropdown menu component.
        Swipe-
        Tab BarTabs component.
        Token Text AreaText enveloper component.
        + +

        If your application used the above deprecated components, see the following examples for successful migration:

        +
          +
        • CheckboxRadio +

          Before:

          +
          +<input type="checkbox" name="checkbox-1" id="checkbox-1"/>
          +<input type="radio" name="radio-1" id="radio-1"/>
          +
          +<script>
          +   var element1 = document.getElementById("checkbox-1"),
          +       element2 = document.getElementById("radio-1"),
          +       checkboxWidget = tau.widget.Checkboxradio(element1),
          +       radioWidget = tau.widget.Checkboxradio(element2);
          +
          +   checkboxWidget.enable();
          +   radioWidget.disable();
          +</script>
          +
          + +

          After:

          +
          +<input type="checkbox" name="checkbox-1" id="checkbox-1"/>
          +<input type="radio" name="radio-1" id="radio-1"/>
          +
          +<script>
          +   var element1 = document.getElementById("checkbox-1"),
          +       element2 = document.getElementById("radio-1"),
          +       checkboxWidget = tau.widget.Checkbox(element1),
          +       radioWidget = tau.widget.Radio(element2);
          +
          +   checkboxWidget.enable();
          +   radioWidget.disable();
          +</script>
          +
          +
        • +
        • Collapsible +

          Before:

          +
          +<ul data-role="listview">
          +   <li id="collapsible" data-role="collapsible" data-inset="false">
          +      <h2>Collapsible head</h2>
          +      <!--Sub list in collapsible li-->
          +      <ul data-role="listview">
          +         <li>sub list item1</li>
          +         <li>sub list item2</li>
          +      </ul>
          +   </li>
          +   <!--List item in 1st depth-->
          +   <li>other list item</li>
          +   <li>other list item</li>
          +</ul>
          +
          +<script>
          +   var collapsibleElement = document.getElementById("collapsible"),
          +       collapsible = tau.widget.Collapsible(collapsibleElement);l
          +</script>
          +
          + +

          After:

          +
          +<div id="expandable" class="ui-expandable" data-collapsed="false">
          +   <h1>Expandable head</h1>
          +   <div>Content</div>
          +</div>
          +
          +<script>
          +   var expandableEl = document.getElementById("expandable"),
          +       expandableWidget = tau.widget.Expandable(expandableEl);
          +</script>
          +
          +
        • +
        • Fast Scroll +

          Before:

          +
          +<div data-role="page" id="main">
          +   <div data-role="content">
          +      <ul id="list" data-role="listview" data-fastscroll="true">
          +         <li data-role="list-divider">A</li>
          +         <li>Anton</li>
          +         <li>Arabella</li>
          +         <li data-role="list-divider">B</li>
          +         <li>Barry</li>
          +         <li>Bily</li>
          +      </ul>
          +   </div>
          +</div>
          +
          +<script>
          +   var fastscroll = tau.widget.FastScroll(document.getElementById("list"));
          +</script>
          +
          + +

          After:

          +
          +<div class="ui-page" id="indexscrollbarPage">
          +   <div class="ui-indexscrollbar" id="indexscrollbar"></div>
          +   <div class="ui-content">
          +      <ul class="ui-listview" id="isbList">
          +         <li class="ui-group-index">A</li>
          +         <li class="ui-li-static">Anton</li>
          +         <li class="ui-li-static">Arabella</li>
          +         <li class="ui-group-index">B</li>
          +         <li class="ui-li-static">Barry</li>
          +         <li class="ui-li-static">Bibi</li>
          +      </ul>
          +   </div>
          +</div>
          +
          +<script>
          +   var isb = tau.widget.IndexScrollbar(document.getElementById("indexscrollbar"));
          +</script>
          +
          +
        • + +
        • Gallery +

          Before:

          +
          +<div data-role="content" data-scroll="none">
          +   <div data-role="gallery" id="gallery" data-vertical-align="middle"></div>
          +</div>
          +
          +<script>
          +   var galleryWidget = tau.widget.Gallery(document.getElementById("gallery"));
          +
          +   galleryWidget.add("./images/01.jpg");
          +   galleryWidget.add("./images/02.jpg");
          +   galleryWidget.add("./images/03.jpg");
          +   galleryWidget.refresh(1);
          +</script>
          +
          + +

          After:

          +
          +<div id="gallerySection" class="ui-content ui-section-changer" data-orientation="horizontal">
          +   <div>
          +      <section class="gallery-section">
          +         <img src="images/01.jpg" />
          +      </section>
          +      <section class="gallery-section">
          +         <img src="images/02.jpg" />
          +      </section>
          +   </div>
          +</div>
          +
          +<script>
          +   var sectionChangerElement = document.getElementById("gallerySection"),
          +       sectionChangerWidget = tau.widget.SectionChanger(sectionChangerElement),
          +       newSectionElement = document.createElement("section");
          +
          +   newSectionElement.innerHTML = "<img src='images/03.jpg'>";
          +   sectionsParentNode.appendChild(newSectionElement);
          +   sectionChangerWidget.refresh();
          +   sectionChangerWidget.setActiveSection(1);
          +</script>
          +
          +
        • + +
        • List Divider +

          Before:

          +
          +<ul data-role="listview">
          +   <li data-role="list-divider">Item styles</li>
          +   <li><a href="#">Normal lists</a></li>
          +   <li><a href="#">Normal lists</a></li>
          +   <li><a href="#">Normal lists</a></li>
          +</ul>
          +
          + +

          After:

          +
          +<ul class="ui-listview">
          +   <li class="ui-group-index">Item styles</li>
          +   <li class="ui-li-anchor"><a href="#">Normal lists</a></li>
          +   <li class="ui-li-anchor"><a href="#">Normal lists</a></li>
          +   <li class="ui-li-anchor"><a href="#">Normal lists</a></li>
          +</ul>
          +
          +
        • + +
        • Notification +

          Before:

          +
          +<div data-role="page" id="demo">
          +   <div data-role="notification" id="notification" data-type="popup">
          +      <p>Notification Demo TEST</p>
          +   </div>
          +   <div data-role="header" data-position="fixed">
          +      <h1>Notification</h1>
          +   </div>
          +   <div data-role="content">
          +      <div data-role="button" id="noti-demo">Show small popup</div>
          +   </div>
          +</div>
          +
          +<script>
          +   var notification = tau.widget.Notification(document.getElementById("notification")),
          +       buttonEl = document.getElementById("noti-demo");
          +
          +   buttonEl.addEventListener("vclick", function()
          +   {
          +      notification.open();
          +   });
          +</script>
          +
          + +

          After:

          +
          +<div data-role="content">
          +   <a class="ui-btn" id="open" data-inline="true">Button</a>   
          +   <div id="popup_toast" data-role="popup" class="ui-popup ui-popup-toast">
          +      <div class="ui-popup-content">
          +         Toast popup text Toast popup text
          +      </div>
          +   </div>
          +</div>
          +
          +<script>
          +   var btn = document.getElementById("open");
          +
          +   btn.addEventListener("vclick", function()
          +   {
          +      tau.openPopup("#popup_toast");
          +   });
          +</script>
          +
          +
        • + +
        • Progress Bar +

          Before:

          +
          +<div data-role="progressbar" id="progressbar"></div>
          +
          +<script>
          +   var progressbarWidget = tau.widget.ProgressBar(document.getElementById("progressbar"));
          +
          +   progressbarWidget.value(30);
          +</script>
          +
          + +

          After:

          +
          +<div class="ui-progress" data-type="bar" id="progressbar"></div>
          +
          +<script>
          +   var progressWidget = tau.widget.Progress(document.getElementById("progressbar"));
          +
          +   progressWidget.value(30);
          +</script>
          +
          +
        • + +
        • Search Bar +

          Before:

          +
          +<input type="search" name="search" id="search-bar"/>
          +
          +<script>
          +   var searchBarElement = document.getElementById("searchbar"),
          +       searchBarWidget = tau.widget.SearchBar(searchBarElement);
          +
          +   value = searchBarWidget.disable();
          +</script>
          +
          + +

          After:

          +
          +<input type="search" id="search-test" />
          +
          +<script>
          +   var searchEl = document.getElementById("search-test"),
          +       searchWidget = tau.widget.SearchInput(searchEl);
          +
          +   searchInputWidget.disable();
          +</script>
          +
          +
        • + +
        • Select Menu +

          Before:

          +
          +<select id="selectmenu" data-native-menu="false">
          +   <option value="1">Item1</option>
          +   <option value="2">Item2</option>
          +   <option value="3">Item3</option>
          +   <option value="4">Item4</option>
          +</select>
          +
          +<script>
          +   var element = document.getElementById("selectmenu"),
          +       widget = tau.widget.SelectMenu(element);
          +
          +   widget.open();
          +</script>
          +
          + +

          After:

          +
          +<select id="dropdownmenu" data-native-menu="false">
          +   <option value="1">Item1</option>
          +   <option value="2">Item2</option>
          +   <option value="3">Item3</option>
          +   <option value="4">Item4</option>
          +</select>
          +
          +<script>
          +   var element = document.getElementById("dropdownmenu"),
          +       widget = tau.widget.DropdownMenu(element);
          +
          +   widget.open();
          +</script>
          +
          +
        • + +
        • Tab Bar +

          Before:

          +
          +<div data-role="header">
          +   <div data-role="tabbar" id="tab-bar">
          +      <ul>
          +         <li><a href="#">Tabbar1</a></li>
          +         <li><a href="#">Tabbar2</a></li>
          +         <li><a href="#">Tabbar3</a></li>
          +      </ul>
          +   </div>
          +</div>
          +
          +<script>
          +   var tabBar = tau.widget.TabBar(document.getElementById("tab-bar"));
          +</script>
          +
          + +

          After:

          +
          +<!-- Tabs component is composed with Tabbar and SectionChanger -->
          +<div id="tabs" class="ui-tabs">
          +   <div class="ui-tabbar">
          +      <ul>
          +         <li><a href="#" class="ui-btn-active">Tab1</a></li>
          +         <li><a href="#">Tab2</a></li>
          +         <li><a href="#">Tab3</a></li>
          +      </ul>
          +   </div>
          +   <div class="ui-section-changer">
          +      <div>
          +         <section class="ui-section-active">
          +            <p>Tab1</p>
          +         </section>
          +         <section>
          +            <p>Tab2</p>   
          +         </section>
          +         <section>
          +            <p>Tab3</p>        
          +         </section>
          +      </div>
          +   </div>
          + </div>
          +
          +<script>
          +   var tabsElement = document.getElementById("tabs"),
          +       tabs = tau.widget.Tabs(tabsElement);
          +
          +   tabs.setIndex(1);
          +</script>
          +
          +
        • + +
        • Token Text Area +

          Before:

          +
          +<div data-role="tokentextarea" id="tokentext"></div>
          +
          +<script>
          +   var tokenWidget = tau.widget.TokenTextarea(document.getElementById("tokentext"));
          +
          +   tokenWidget.add("foobar");
          +</script>
          +
          + +

          After:

          +
          +<div class="ui-text-enveloper"></div>
          +
          +<script>
          +   var textEnveloperElement = document.getElementById("textenveloper"),
          +      textEnveloper = tau.component.TextEnveloper(textEnveloperElement);
          +
          +   textEnveloper.add("hello");
          +</script>
          +
          +
        • + +
        + + +

        Event Handling

        +

        Some events are changed. The following examples illustrate how to handle events:

        +
          +
        • Swipe event +

          In the previous version, the swipe event was triggered in every area in the page automatically, but since 2.4, for efficient trigger and handling, the swipe event is only triggered when the Gesture event is created.

          +

          To enable the swipe event, use the enableGesture() method. The following example shows how to enable the swipe event on the content area:

          +
          +<!-- HTML code -->
          +<div class="ui-page ui-page-active" id="pageSwipe">
          +   <header class="ui-header">
          +      <h2 class="ui-title">Swipe Event</h2>
          +   </header>
          +   <div id="content" class="ui-content></div>
          +</div>
          +
          +
          +(function()
          +{
          +   var page = document.getElementById("pageSwipe");
          +   page.addEventListener("pagebeforeshow", function()
          +   {
          +      var content = document.getElementById("content");
          +      tau.event.enableGesture(content, new tau.event.gesture.Swipe(
          +      {
          +         orientation: "horizontal"
          +      }));
          +   });
          +}());
          +
          +

          When the swipe event is enabled, the application can handle this event with some event detail data:

          +
          +(function()
          +{
          +   var content = document.getElementById("content");
          +
          +   content.addEventListener("swipe", function(e)
          +   {
          +      console.log("swipe direction = " + e.detail.direction);
          +   });
          +}());
          +
          + +

          For more information, see the Gesture Event API.

          + +
        • + +
        • Tap event +

          Since 2.4, the tap event has been deprecated. Use the click event instead.

          +

          If the application has one button in the content area:

          +
          +<div class="ui-content">
          +   <a id="btn" href="#" class="ui-btn">Click me</a>
          +</div>
          +
          +

          Before:

          +
          +var button = document.getElementById("btn");
          +
          +button.addEventListener("tap", eventHandler);
          +
          + +

          After:

          +
          +var button = document.getElementById("btn");
          +
          +button.addEventListener("click", eventHandler);
          +
          +
        • +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/thumbnail_ww.htm b/org.tizen.ui.practices/html/web/tau/thumbnail_ww.htm new file mode 100644 index 0000000..06719e2 --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/thumbnail_ww.htm @@ -0,0 +1,158 @@ + + + + + + + + + + + + + Creating Thumbnails + + + +
        +
        +

        Wearable Web

        +
        + +
        +

        Related Info

        + +
        +
        + +
        +

        Creating Thumbnails

        + +

        You can create a thumbnail component with the SectionChanger API.

        + +

        This feature is supported in wearable applications only.

        + +

        The following figure shows the layout of the thumbnail component in a rectangular and circular UI.

        + +

        Figure: Thumbnail component in rectangular and circular devices

        + +

        Thumbnail component in a rectangular device Thumbnail component in a circular device

        + + +

        To implement the thumbnail component:

        +
          +
        1. Edit the HTML code to add the thumbnail component to your application screen: +
          +<div class="ui-page ui-page-active" id="sectionChangerPage" data-enable-page-scroll="false" >
          +   <div id="sectionChanger" class="ui-content ui-section-changer">
          +      <div id="scroller">
          +         <section class="ui-section-active">
          +            <div class="thumbnail">1</div>
          +         </section>
          +         <section>
          +            <div class="thumbnail">2</div>
          +         </section>
          +         <section>
          +            <div class="thumbnail">3</div>
          +         </section>
          +      </div>
          +   </div>
          +</div>
          +
          +
        2. + +
        3. Edit the CSS code to set the visual style of the thumbnail: +
          +section 
          +{
          +   padding: 0 10px 0 10px;
          +   height: 100%;
          +}
          +.thumbnail 
          +{
          +   height: 300px;
          +   width: 200px;
          +   background-color: #80482f;
          +   top: 50%;
          +   transform: translate3d(0, -50%, 0);
          +   position: relative;
          +   text-align: center;
          +   line-height: 300px;
          +}
          +.ui-section-active .thumbnail
          +{
          +   background-color: #000000;
          +   border: 1px solid #a06322;
          +}
          +
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   section 
          +   {
          +      padding: 0;
          +   }
          +   .thumbnail 
          +   {
          +      height: 200px;
          +      width: 200px;
          +      border-radius: 50%;
          +      background-color: #802532;
          +      top: 50%;
          +      position: relative;
          +      text-align: center;
          +      line-height: 200px;
          +      transform: scale(0.8) translate3d(0, -60%, 0);
          +      transition: transform 300ms;
          +   }
          +   .ui-section-active .thumbnail
          +   {
          +      transform: scale(1) translate3d(0, -50%, 0);
          +   }
          +}
          +
          +
        4. +
        5. Edit the JavaScript code to manage the thumbnail events and other functionalities: +
          +(function()
          +{
          +   var page = document.getElementById("sectionChangerPage"),
          +       sectionChanger = document.getElementById("sectionChanger");
          +
          +   page.addEventListener("pagebeforeshow", function() 
          +   {
          +      tau.widget.SectionChanger(sectionChanger, 
          +      {
          +         orientation: "horizontal",
          +         fillContent: false
          +      });
          +   });
          +})();
          +
          +
        6. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/tau/ui_component_w.htm b/org.tizen.ui.practices/html/web/tau/ui_component_w.htm new file mode 100644 index 0000000..48fb58f --- /dev/null +++ b/org.tizen.ui.practices/html/web/tau/ui_component_w.htm @@ -0,0 +1,211 @@ + + + + + + + + + + + + + UI Components: Managing UI Components + + + + + +
        +

        UI Components: Managing UI Components

        + + +

        Each UI component in TAU has its own selector for autodetecting in an HTML file. The most popular selector is class. The old selector style is the data-role, which is deprecated. Some UI components have also simple HTML selectors, such as button (button component), or input[type=checkbox] (CheckboxRadio component).

        + + +

        Defining UI Components

        + +

        You can define UI components in 2 different ways using selectors:

        +
          +
        • With a class selector +

          It is recommended to use the class selector for each component. Class selectors in TAU are composed with a ui-prefix and <COMPONENT_NAME>.

          +

          The following example shows the creation of some components with a class selector:

          +
          +<!-- Create an Expandable component -->
          +<div class="ui-expandable" id="expandable-test">
          +   <h1>Expandable head</h1>
          +   <div>Content</div>
          +</div>
          +
          +<!-- Create a ToggleSwitch component -->
          +<select class="ui-toggleswitch">
          +   <option value="off"></option>
          +   <option value="on"></option>
          +</select>
          +
        • +
        • With a data-role selector +

          The data-role selector in TAU is composed with <COMPONENT_NAME> in lowercase.

          +

          The following example shows the creation of some components with a data-role selector:

          +
          +<!-- Create a TextEnveloper component -->
          +<div data-role="textenveloper"></div>
          +
          +<!-- Create a Drawer component -->
          +<div data-role="drawer">
          +   <ul data-role="listview">
          +      <li><a href="#">List item 1</a></li>
          +   </ul>
          +</div>
          +
        • +
        + +

        Setting UI Component Options

        + +

        TAU supports several ways of setting options for a UI component. For more information, see Mobile UI Components and Wearable UI Components.

        +

        To set the options:

        +
          +
        • Initializing options with the data- attribute +

          Various options can be set with data- attribute when the component is being created. You can set options this way only when the component is created. After creating the component, changing the data attributes on the HTML element does not change the component options.

          +

          The following example shows a SectionChanger code with a data- option:

          +
          <div id="hasSectionchangerPage" class="ui-page">
          +   <header class="ui-header">
          +      <h2 class="ui-title">SectionChanger</h2>
          +   </header>
          +   <div class="ui-section-changer" data-orientation="horizontal" data-circular="true" data-use-tab="true">
          +      <div>
          +         <section>
          +            <h3>LEFT1 PAGE</h3>
          +         </section>
          +         <section class="ui-section-active">
          +            <h3>MAIN PAGE</h3>
          +         </section>
          +         <section>
          +      </div>
          +   </div>
          +</div>
          +

          The data-circular and data-use-tab attributes are the initial options for creating a SectionChanger.

          +
        • + + +
        • Setting options with a manual constructor +

          Options can be set as arguments to the component constructor. When using options as arguments, you must use the camelCase name.

          +

          The following example shows the use of a manual constructor:

          +
          <div id="hasSectionchangerPage" class="ui-page">
          +   <header class="ui-header">
          +      <h2 class="ui-title">SectionChanger</h2>
          +   </header>
          +   <div class="ui-section-changer" id="sectionchanger">
          +      <div>
          +         <section>
          +            <h3>LEFT1 PAGE</h3>
          +         </section>
          +         <section class="ui-section-active">
          +            <h3>MAIN PAGE</h3>
          +         </section>
          +      </div>
          +   </div>
          +</div>
          +
          +<script>
          +   var sectionEl = document.getElementById("sectionchanger"),
          +       sectionChangerWidget = tau.widget.SectionChanger(sectionEl, 
          +   { 
          +      orientation: "horizontal",
          +      circular: true
          +      useTab: true
          +   });
          +</script>
          +
          +
        • + +
        • Setting options with a method call +

          To set options dynamically, use the option() method.

          +
          <div id="hasSectionchangerPage" class="ui-page">
          +   <header class="ui-header">
          +      <h2 class="ui-title">SectionChanger</h2>
          +   </header>
          +   <div class="ui-section-changer" data-orientation="horizontal" data-circular="true" data-use-tab="true">
          +      <div>
          +         <section>
          +            <h3>LEFT1 PAGE</h3>
          +         </section>
          +         <section class="ui-section-active">
          +            <h3>MAIN PAGE</h3>
          +         </section>
          +         <section>
          +      </div>
          +   </div>
          +</div>
          +
          +<script>
          +   var sectionEl = document.getElementById("sectionchanger"),
          +       sectionChangerWidget = tau.widget.SectionChanger(sectionEl);
          +
          +   sectionChangerWidget.option("circular", true);
          +</script>
          +
          +
        • +
        + +

        Managing UI Components with jQuery

        +

        You can use jQuery with TAU for convenience. Also for backward compatibility, TAU supports the jQuery interface for UI components. However, it is strongly recommended to use the new TAU style.

        +

        To manage the UI components if the jQuery library is loaded:

        +
          +
        1. Create the UI component: +
          <div class="ui-indexscrollbar" id="indexscrollbar"></div>
          +<script>
          +   $("#indexscrollbar").indexscrollbar();
          +</script>
          +
        2. +
        3. Use the call methods: +
          $(".selector").componentName("methodName", argument1, argument2, ...);
          +
          <div class="ui-indexscrollbar" id="indexscrollbar"></div>
          +<script>
          +   /* If the IndexScrollBar component is created */
          +   $("#indexscrollbar").indexscrollbar("destroy");
          +</script>
          +
        4. +
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/animation_w.htm b/org.tizen.ui.practices/html/web/w3c/animation_w.htm new file mode 100644 index 0000000..b2a5647 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/animation_w.htm @@ -0,0 +1,336 @@ + + + + + + + + + + + + + CSS Animations Module (Level 3): Creating Animations + + + + + + +
        +

        CSS Animations Module (Level 3): Creating Animations

        + +

        Animations (like transitions) change the presentational value of the CSS properties over time. The principal difference between animations and transitions is that while transitions are triggered implicitly when property values change, animations are explicitly executed when the animation properties are applied. This means that for animations, you must use animation keyframes to define explicit values for the properties being animated.

        + +

        When using the CSS animation properties, the Tizen browser requires the -webkit- prefix.

        + +

        Keyframes

        +

        The CSS animations work based on @-webkit-keyframes rules defined for specific elements. The rules can define various property changes complementing the simple running of a transition.

        +

        If the animation only has one set of changes over its whole iteration, the rule values can be assigned with a from {} to {} rule, where from is the beginning of the animation at 0% and to is the end at 100%. If there are multiple changes required, you can define their exact time periods using multiple <number>% {} rules that together cover the entire animation iteration from 0% to 100%.

        +

        The following code snippet demonstrates how to use keyframes. For a complete source code, see animation_keyframes.html

        +
        +<style type="text/css">
        +
        +   @-webkit-keyframes boxani 
        +   {
        +      from {left: 0; top: 0;}
        +      to {left: 100px; top: 100px;}
        +   }
        +   @-webkit-keyframes boxani_case01 
        +   {
        +      0% {left: 0; top: 0;}
        +      25% {left: 100px; top: 0;}
        +      50% {left: 100px; top: 100px;}
        +      75% {left: 0; top: 100px;}
        +      100% {left: 0; top: 0;}
        +   }
        +
        +</style>
        +
        + +

        Animation Properties

        + +

        You can define various properties for an animation to control how it is played:

        + +
          +
        • animation-name +

          This property uses the name defined in the @-webkit-keyframes rules to play the animation.

        • + +
        • animation-duration +

          This property defines how long one iteration of the animation takes.

        • + +
        • animation-iteration-count +

          This property defines how many times the animation is repeated. If the value is set as infinite, the repetitions are unlimited.

        • + +
        • animation-timing-function +

          This property defines the pace of the animation.

        • + +
        • animation-direction +

          This property defines the replay direction. The reverse value plays the animation from 100% keyframe to 0% keyframe, while the alternate value plays the animation normally during odd iterations, and from 100% keyframe to 0% keyframe during even iterations.

        • + +
        • animation-play-state +

          This property defines the replay status of the animation. The paused value temporarily stops the animation.

        • +
        • animation-delay +

          This property defines the delay time before the start of the animation.

        • + +
        • animation-fill-mode +

          This property defines the state of the animation before or after the animation is played. The forwards value maintains the last value of the keyframe rule when the animation is over, while the backwards value fills up the first value of the keyframe rule when the animation with the animation-delay property is in a standby state. The both value covers both the start and the end of the animation.

        + +

        The following code snippet demonstrates how to use animation properties. For a complete source code, see:

        + + +
        +<head>
        +   <style type="text/css">
        +      .box 
        +      {
        +         -webkit-animation-name: boxani;
        +         -webkit-animation-duration: 5s;
        +         -webkit-animation-iteration-count: infinite;
        +         -webkit-animation-timing-function: linear;
        +         -webkit-animation-direction: normal;
        +         -webkit-animation-delay: 1s;
        +         -webkit-animation-fill-mode: none;
        +      }
        +
        +      .box.case01: hover 
        +      {
        +         -webkit-animation-play-state: paused;
        +         -webkit-animation-fill-mode: forwards;
        +      }
        +   </style>
        +</head>
        +
        +<body>
        +   <h1>animation-name</h1>
        +   <div class="boxarea">
        +      <div class="box">
        +         <p>animate</p>
        +         <p>animation-name: boxani;</p>
        +      </div>
        +   </div>
        +   <div class="boxarea">
        +      <div class="box case01">
        +         <p>animate</p>
        +         <p>animation-name: boxani_case01;</p>
        +      </div>
        +   </div>
        +</body>
        +
        + + + + + + + + + +
        Note
        The hover pseudo class in Tizen maintains a mouseover state when an element is tapped, and becomes a mouseout state when another element is tapped.
        + +

        The animation property allows you to define all the animation properties in a shorthand mode in the order of animation-name | animation-duration | animation-timing-function | animation-delay | animation-iteration-count | animation-direction | animation-fill-mode. If you omit a property value, a default value is used instead.

        + +
        +<style type="text/css">
        +   .box 
        +   {
        +      width: 150px; height: 100px; background: Coral; position: relative;
        +      -webkit-animation: boxani 3s ease 1s infinite alternate backwards;
        +   }
        +</style>
        +
        + +

        Creating a Logo Animation

        + +

        To enhance the user experience of your application, you must learn to create a logo animation, where element properties can be assigned and changed for each element and keyframe. The logo animation is similar to the animation that appears when a Tizen device (or Emulator) is switched on:

        + +
          +
        1. No elements are initially shown on the screen.
        2. +
        3. The Tizen logo gradually appears in the middle of the screen, and as it moves to the right, it becomes smaller.
        4. +
        5. Each letter in the word "TIZEN" consecutively comes in from the left of the screen and moves to the right to its correct location.
        6. +
        +

        Figure: Logo animation (in mobile applications only)

        +

        Logo animation

        +

        To create a logo animation:

        +
          +
        1. Create the HTML layout for the animation. To be able to manage the movement of each animation part separately, you must define individual elements for each part. +
          +<div class="animation-holder">
          +   <span class="tizen-txt t"></span>
          +   <span class="tizen-txt i"></span>
          +   <span class="tizen-txt z"></span>
          +   <span class="tizen-txt e"></span>
          +   <span class="tizen-txt n"></span>
          +   <span class="tizen-txt tm"></span>
          +   <span class="tizen-logo"></span>
          +</div>
          +
          +
        2. +
        3. Define the basic style for the animation: +
          +.example-body {width: 320px; height: 480px; background: #000; margin: 0 auto; 
          +               position: relative; border: 2px solid #fff; overflow: hidden;}
          +.animation-holder {width: 280px; height: 88px; position: absolute; 
          +                   left: 50%; top: 50%; margin: -54px 0 0 -140px;} 
          +
          +.tizen-txt, .tizen-logo {position: absolute; display: block; 
          +                         background-repeat: no-repeat; background-position: 50% 50%}
          +.tizen-txt.t {width: 48px; height: 56px; background-image: url(images/txt_t.png);}
          +.tizen-txt.i {width: 15px; height: 56px; background-image: url(images/txt_i.png);}
          +.tizen-txt.z {width: 46px; height: 56px; background-image: url(images/txt_z.png);}
          +.tizen-txt.e {width: 45px; height: 56px; background-image: url(images/txt_e.png);}
          +.tizen-txt.n {width: 54px; height: 58px; background-image: url(images/txt_n.png);}
          +.tizen-txt.tm {width: 11px; height: 6px; background-image: url(images/txt_tm.png);}
          +.tizen-logo {width: 220px; height: 211px; left: 30px; top: -61px; 
          +             background-image: url(images/logo_tizen.png); background-size: 100% 100%;}
          +
          +
        4. +
        5. Create the animation: +
            +
          1. To ensure that all the animation elements are played within the same time frame, some common properties are defined for the animation. The animation movement time is 7 seconds, and the animation repeats infinitely. +

            When an animation that repeats itself is activated, it can look unnatural when it suddenly returns to its initial position after finishing an iteration. To make the repetition move naturally, set the animation-direction property to alternate. The alternate direction means that during the odd iterations the animation proceeds in the normal direction (from the 0% keyframe to the 100% keyframe), while during the even iterations the keyframes are played in the opposite direction from 100% to 0%.

            +
            +.tizen-txt, .tizen-logo 
            +{
            +   -webkit-animation-duration: 7s;
            +   -webkit-animation-iteration-count: infinite;
            +   -webkit-animation-direction: alternate;
            +}
            +
            +
          2. +
          3. Create the keyframes to implement the flow for the Tizen logo: +
              +
            • During the first 25% of the animation total playing time (7 seconds), the transparency disappears and the Tizen logo appears.
            • +
            • During the 25 - 50% of the playing time, the logo size becomes smaller as the width and height values are reduced, and due to the left and top value, the logo is positioned to the top right corner of the screen.
            • +
            • During the 50 - 100% of the playing time, the values do not change, and the logo remains in its new position.
            • +
            +

            +
            +@-webkit-keyframes tizen-logo 
            +{
            +   0% {width: 220px; height: 211px; left: 30px; top: -61px; opacity: 0;}
            +   25% {width: 220px; height: 211px; left: 30px; top: -61px; opacity: 1;}
            +   50% {left: 247px; top: 0px; width: 33px; height: 32px; opacity: 1;}
            +   100% {left: 247px; top: 0px; width: 33px; height: 32px; opacity: 1;}
            +}
            +
            + + + + + + + + + + +
            Note
            If the 100% keyframe is not defined, the animation is executed based on the original properties, and the logo size increases to its original size at the end.
          4. +
          5. Create the keyframes to implement the flow for each letter in the word "TIZEN": +
              +
            • To hide the letter initially, the property has been assigned outside the screen at the 0% keyframe. To allow the Tizen logo to appear first, the first letter is introduced at the 30% keyframe.
            • +
            • To create a slight collision animation, the letter element moves to -10 px of the final value at the 40% keyframe before reaching its final 0 px value at the 45% keyframe.
            • +
            • The animation-timing-function property can be changed for each keyframe point, and is used to determine the pace of the animation. When the letter is actually shown on the screen and moved to its final location, the ease in and out timing functions are used.
            • +
            + +

            To show the letters one at a time, the timing is pushed back a bit more for each consecutive letter:

            +
            +<!--Letter T-->
            +@-webkit-keyframes tizen-txt-t 
            +{
            +   0% {left: 340px; top: 31px;}
            +   30% {left: 340px; top: 31px; animation-timing-function: ease-in;}
            +   40% {left: -10px; top: 31px; animation-timing-function: ease-out;}
            +   45% {left: 0; top: 31px;}
            +   100% {left: 0; top: 31px;}
            +}
            +
            +<!--Letter I-->
            +@-webkit-keyframes tizen-txt-i 
            +{
            +   0% {left: 340px; top: 31px;}
            +   40% {left: 340px; top: 31px; animation-timing-function: ease-in;}
            +   50% {left: 47px; top: 31px; animation-timing-function: ease-out;}
            +   55% {left: 57px; top: 31px;}
            +   100% {left: 57px; top: 31px;}
            +}
            +
            +<!--Remaining letters-->
            +
          6. + +
          7. After creating all the keyframes, define the animation-name property for each element:

            +
            +.tizen-txt.t 
            +{
            +   -webkit-animation-name: tizen-txt-t;
            +}
            +.tizen-txt.i 
            +{
            +   -webkit-animation-name: tizen-txt-i;
            +}
            +
          8. + +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/background_w.htm b/org.tizen.ui.practices/html/web/w3c/background_w.htm new file mode 100644 index 0000000..30ba322 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/background_w.htm @@ -0,0 +1,188 @@ + + + + + + + + + + + + + CSS Backgrounds and Borders Module (Level 3): Specifying Background and Border Styles + + + + + + +
        +

        CSS Backgrounds and Borders Module (Level 3): Specifying Background and Border Styles

        + +

        You can manage the CSS properties for specifying the border style or background of any HTML element.

        + +

        When creating a background for an element, you can use the following properties:

        +
          +
        • background-color +

          Defines the color of the background.

        • +
        • background-image +

          Defines the image to be used. You can add images as separate layers to an element. To add multiple images, separate them by commas to add each image as a separate layer. The images are added in the order they are defined.

        • +
        • background-position +

          Defines the exact position of the image.

        • +
        • background-repeat +

          Defines whether the image is repeated to fill the entire background (in case the image is too small to do it otherwise).

        • +
        • background-origin +

          Defines the position of the initial background for the item.

        • +
        • background-size +

          Defines the size of the image in the background.

        • +
        • background-clip +

          Defines the area of the cropped background element.

        • +
        + +

        The border properties specify the line thickness, style, and color for the element border. You can define the border using 3 separate properties (border-width, border-style, and border-color), or by listing the values for all 3 properties together in 1 border property. To define rounded corners for the border, you can additionally use the border-radius property.

        + +

        To define shading for an element, you can define the horizontal and vertical offset, blur radius, and the spread distance values within the box-shadow property. To switch the shadow from outside to inside the element, add the inset keyword to the property too.

        + +

        The following image shows a simple background color (top left), a background image (top right), multiple images with a solid black border (bottom left), and an element with shading and a solid black border with rounded corners (bottom right). The background image at top right is automatically repeated to cover the entire background, while the images at bottom left are not repeated due to the background-repeat property value.

        + +

        Figure: Background examples

        +

        Background examples

        +

        The following code snippet demonstrates how to set the background color, images, borders, and shadings.

        + +
        +<!--Background color-->
        +#one 
        +{
        +   width: 180px;
        +   height: 40px;
        +   background-color: lightblue;
        +}
        +
        +<!--Background image--> 
        +#one 
        +{
        +   width: 200px;
        +   height: 100px;
        +   background-color: #00F;
        +   background-image: url(t3.png);
        +}
        +
        +<!--Multiple images--> 
        +#multi 
        +{
        +   width: 155px;
        +   height: 100px;
        +   border: 1px solid #000;
        +   background-color: #87CEFA;
        +   background-image: url(t1.png), url(t2.png), url(t3.png);
        +   background-position: center center, 20% 100%, top left;
        +   background-repeat: no-repeat;
        +}
        +
        +<!--Shading and border with rounded corners-->
        +#shading 
        +{
        +   width: 160px;
        +   height: 40px;
        +   border: 1px solid #000;
        +   border-radius: 20px;
        +   background-color: #88f;
        +   box-shadow: #888 10px 10px;
        +}
        +
        + +

        Creating Backgrounds

        + +

        To enhance the user experience of your application, you must learn to create a multilayer background with the parallax effect using the CSS box model. The background consists of 3 images on separate layers, and 2 of the layers can be moved over each other.

        + +

        Figure: Background with the parallax effect

        +

        Background with the parallax effect

        + +
        1. Prepare 3 images (tizen.png, tizen2.png, and dot.png), each with a transparent background. + +

          tizen.png, tizen2.png, and dot.png images

        2. + +
        3. Create a div element with id="parallelexample" and a slider input element with the minimum, maximum, and initial value: +
          +<div id="parallelexample"></div>
          +<input id="position" type="range" min="1" max="200" value="50">
          +
        4. + +
        5. Define the needed styles for the div element in the <head> section using the parallelexample ID. +

          Define a background using the prepared images in the correct order. The images are shown in the order they have been added, with the first image on the topmost layer. Use the same order when defining the background position for each image.

          +
          +#parallelexample
          +{
          +   width: 300px;
          +   height: 300px;
          +   background-image: url(tizen2_32.png), url(tizen3_32.png), url(dot.png);
          +   background-position: 6.25em 8em, 3.125em 4em, center top;
          +   background-repeat: repeat, repeat, repeat;
          +   border: 1px solid black;
          +   margin: 0px auto;
          +}
          +
        6. +
        7. To create the parallax effect, create a method that moves the background layers by changing the horizontal position values of the images in the div element. To determine the position value change, add an onchange event handler for the slider to determine the change based on the slider handle movement. +
          +function moveLayers() 
          +{
          +   /* Get slider value */
          +   var poz = document.getElementById('position');
          +   /* Get the div element */
          +   var example = document.getElementById('ParallaxExamle');
          +   /* Add the event handler */
          +   poz.onchange = function()
          +   {
          +      var layer1 = this.value/8, layer2 = this.value/16;
          +      example.style.backgroundPosition = layer1 +'em 8em, ' 
          +                                         + layer2 + 'em 4em, center top';
          +   }
          +}
          +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/basic_ui_w.htm b/org.tizen.ui.practices/html/web/w3c/basic_ui_w.htm new file mode 100644 index 0000000..68d5d4b --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/basic_ui_w.htm @@ -0,0 +1,201 @@ + + + + + + + + + + + + + CSS Basic User Interface Module (Level 3): Applying Styles to HTML Documents + + + + + + +
        +

        CSS Basic User Interface Module (Level 3): Applying Styles to HTML Documents

        + +

        You can apply styles to HTML documents.

        +

        The CSS3 version has caused changes in the Selector, Color, Web Form, and Fonts CSS modules. In addition, the CSS3 UI API also handles changes related to the following user interface items:

        +
          +
        • User interface selectors +

          The CSS Selector is an essential module for applying a CSS to HTML in order to enable the DOM element selection. The pseudo-element selectors can be used to assign the user interface state. With the selectors, you can change the Web form style according to the user input without using JavaScript.

        • + +
        • Box model properties +

          A box model refers to all DOM elements excluding design elements, such as <br> and <i>. The box model area is set as defined in the following figure.

          +
            +
          • Content: Content area
          • +
          • Padding: Gap between the content and boundary
          • +
          • Border: Boundary
          • +
          • Margin: Overall size of the box model
          • +
          +

          Figure: Box model structure

          +

          Figure: Box model structure

          + +

          You can use the box model properties to assign styles to the selected DOM elements:

          +
            +
          • The box-sizing property assigns the box size range.
          • +
          • The outline properties make the box outstanding.
          • +
          • The text-overflow property handles the text extending outside the box.
          +
        • +
        + +

        Using Pseudo-element Selectors

        + +

        To enhance the user experience of your application, you must learn how to use pseudo-element selectors:

        +
          +
        1. Use the pseudo-classes, such as :enabled and :disabled, to add different styles based on the state of the DOM elements:

          +
          input: enabled {border: 1px solid blue}
          +input: disabled {border: 1px solid red}
          + + + + + + + + + +
          Note
          In the versions prior to CSS3, pseudo-elements, such as :hover, :active, and :focus, were used, and required an attribute selector. Since the :enabled and :disabled classes are not influenced by the display and visibility attributes, they improve the accessibility.
        2. +
        3. To control the state of the HTML5 Web Forms (in mobile or wearable applications), use the :in-range and :out-of-range pseudo-classes. +

          They check for any values that have exceeded the inserted range. (The following figure applies to mobile applications only.)

          +
          +<!--HTML--> 
          +<input type="number" step="10" min="10" max="100">
          +
          +
          +<!--CSS-->
          +input[type="number"]: in-range {border: 3px solid blue; width: 90%}
          +input[type="number"]: out-of-range {border: 3px solid red; width: 90%}
          +
          +

          Element ranges (in mobile applications only)

        4. +
        5. To apply different styles to required input items and option items, use the :required and :optional pseudo-classes. (The following figure applies to mobile applications only.) +
          +<!--HTML-->
          +<fieldset>
          +   <legend>required and optional</legend>
          +   <label>email: <input type="email" required></label>
          +   <label>password: <input type="Password" placeholder="required area" required></label>
          +
          +   <label>date: <input type="date" placeholder="You know what to do, huh?"></label>
          +   <textarea placeholder="Comment"></textarea>
          +</fieldset>
          +
          +<!--CSS-->
          +input: required, textarea: required {border: 1px solid red}
          +input: optional, textarea: optional {border: 1px solid #777}
          +
          +

          Required and optional elements (in mobile applications only)

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + +

        Using Box Model Properties

        + +

        To enhance the user experience of your application, you must learn how to use box model properties:

        + + + + + + + + + +
        Note
        The properties dependent on mouse and keyboard functions are not discussed in this tutorial.
        +
          +
        1. To assign the area that is included in the width and height of the box automatically, use the box-sizing property. To assign the width without a margin, use the box-sizing: border-box property. +
          +div.content-box {box-sizing: content-box} <!--width (height) = content-->
          +div.border-box {box-sizing: border-box} <!--width (height) = content + padding + border-->
          +div.border-box: before {height: 40px}
          +
        2. + +
        3. To draw an outline without using up the area, use the outline property: +
          +.Test-Box {outline: 5px dashed red}
          +.outline: before {outline: 2px dashed red}
          +.outline-offset: before {outline-offset: 35px}
          +
        4. + +
        5. To handle text that exceeds the area of the box model, use the text-overflow property. The text-overflow: ellipsis property is used to indicate the text exceeded the padding area as '...'. +
          div 
          +{
          +   width: 250px;
          +   margin: 20px auto;
          +   padding: 20px 30px;
          +   background-color: #eee;
          +   color: #333;
          +   border: 5px solid #333;
          +   font-weight: bold;
          +   overflow: hidden;
          +   white-space: nowrap;
          +}
          +
          +.clip {text-overflow: clip}
          +.ellipsis {text-overflow: ellipsis}
        6. +
        + +

        The following figure illustrates the box model properties; from left to right, it shows the effects of the box sizing, outline, and text overflow properties.

        +

        Figure: Box model properties (in mobile applications only)

        +

        Box model properties (in mobile applications only)

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/clipboard_mw.htm b/org.tizen.ui.practices/html/web/w3c/clipboard_mw.htm new file mode 100644 index 0000000..10a0d7f --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/clipboard_mw.htm @@ -0,0 +1,288 @@ + + + + + + + + + + + + + Clipboard API and events: Transferring Content Between Applications + + + + + +
        +

        Clipboard API and events: Transferring Content Between Applications

        + + +

        The clipboard and events feature is used for cutting, copying, and pasting content to easily transfer it between Web applications.

        + +

        This feature is supported in mobile applications only.

        + +

        The main features of Clipboard API and events include:

        + + +

        Copying Content

        + +

        To enhance the user experience of your application with clipboard operations, you must learn to use the copy event:

        +
          +
        1. Add an event listener to detect the copy event: +
          +<script>
          +   document.addEventListener("copy", function(e)
          +   {
          +      copyHandler(e);
          +   }, false);
          +
        2. +
        3. When you start copying, the copy event is fired and the copyHandler() method is called.

          +

          Stop the system clipboard basic operation and set the range you want to copy:

          +
             function copyHandler(e) 
          +   {
          +      e.preventDefault();
          +
          +      var range = window.getSelection();
          + + + + + + + + + +
          Note
          If the current selection is not influenced and there is no selected range, the clipboard imports the setData() method. The copied content cannot be edited apart from adding a DataTransferItemList item.
          +
        4. +
        5. Store the data of the selected range: +
                e.clipboardData.setData("text/plain", range);
          +   };
          +</script>
          +
          +
        6. +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Cutting Content

        + +

        To enhance the user experience of your application with clipboard operations, you must learn to use the cut event:

        +
          +
        1. Add an event listener to detect the cut event: +
          +<script>
          +   document.addEventListener("cut", function(e) 
          +   {
          +      cutHandler(e);
          +   }, false);
          + +
        2. +
        3. When you start cutting, the cut event is fired and the cutHandler() method is called.

          +

          Stop the system clipboard basic operation and set the range you want to cut:

          +
             function cutHandler(e) 
          +   {
          +      e.preventDefault();
          +
          +      var range = window.getSelection();
          + +
        4. +
        5. Store the data of the selected range: +
                e.clipboardData.setData("text/plain", range);
          +   };   
          +</script>
          +
          + + + + + + + + + +
          Note
          Before the setData() method is imported, the basic motion of the system event must be cancelled using the preventDefault() method. Otherwise, the data to be allocated to the clipboard is overwritten by the system clipboard.
          +
        6. +
        + +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Pasting Content

        + +

        To enhance the user experience of your application with clipboard operations, you must learn to use the paste event:

        +
          +
        1. Add an event listener to detect the paste event: +
          +<script>
          +   document.addEventListener("paste", function(e)
          +   {
          +      pasteHandler(e);
          +   }, false);
          +
        2. +
        3. When you start pasting, the paste event is fired and the pasteHandler() method is called.

          +

          Stop the system clipboard basic operation:

          +
             function pasteHandler(e) 
          +   {
          +      e.preventDefault();
          +
        4. +
        5. Paste the clipboard data to the target using the getData() method: +
          +      pasteTarget.innerHTML = e.clipboardData.getData("text/plain");
          +   };              
          +</script>
          +
          +
        6. +
        + +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Copying and Pasting Content into an Editable Element

        + +

        To enhance the user experience of your application with clipboard operations, you must learn to copy content and paste it in an editable HTML element:

        + +
          +
        1. Define the editable element into which copied data is to be pasted:

          +
          +<head>
          +   <style>
          +      .log {border: 1px solid #d9d9d9; margin: 10px; padding: 5px;}
          +      .target {border: 1px solid #36c; margin: 10px; padding: 5px;}
          +   </style>
          +</head>
          +<body>
          +   <h1>Clipboard API</h1>
          +   <div style="width: 300px; height: 100px; border: 1px solid #d9d9d9" contenteditable>
          +      Edit Section
          +   </div>
          +   <div  class="target">
          +      <h4>Target Element</h4>
          +      <p id="target contenteditable">Paste content</p>
          +   </div>
          +   <div id="ev-log" class="log">Event log</div>
          +   <div contenteditable>
          +      This section is informative
          +      This specification defines the common clipboard operations of cutting, 
          +      copying and pasting, in such a way that they are exposed to Web Applications 
          +      and can be adapted to provide advanced functionalities. 
          +      Its goal is to provide for compatibility where possible with existing implementations.
          +   </div>
          +<body>
          +
          +
        2. + +
        3. Add event listeners to detect the copy and paste events:

          +
          +<script>
          +   var pasteTarget = document.getElementById("target");
          +   var evLogBox = document.getElementById("ev-log");    
          +
          +   document.addEventListener("copy", function(e)
          +   {
          +      copyHandler(e);
          +   }, false);
          +
          +   document.addEventListener("paste", function(e)
          +   {
          +      pasteHandler(e);
          +   }, false);
          +
          +
        4. + +
        5. When the copy event occurs, stop the system clipboard basic operation and set the range you want to copy: +
          +   function copyHandler(e) 
          +   {
          +      e.preventDefault();
          +
          +      var range = window.getSelection();
          +
        6. +
        7. Store the data of the selected range: +
                e.clipboardData.setData("text/plain", range);
          +      evLogBox.innerHTML = "Event log : copy";
          +   };
          +
        8. +
        9. When the paste event occurs, stop the system clipboard basic operation and paste the clipboard data to the target using the getData() method: +
             function pasteHandler(e) 
          +   {
          +      e.preventDefault();
          +
          +      pasteTarget.innerHTML = e.clipboardData.getData("text/plain");
          +      evLogBox.innerHTML = "Event log : paste";
          +   };  
          +</script>
          +
          +
        10. +
        + +

        Figure: Copying and pasting

        +

        Copying and pasting

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/color_w.htm b/org.tizen.ui.practices/html/web/w3c/color_w.htm new file mode 100644 index 0000000..c5cefcd --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/color_w.htm @@ -0,0 +1,222 @@ + + + + + + + + + + + + + CSS Color Module (Level 3): Specifying Color and Opacity + + + + + + +
        +

        CSS Color Module (Level 3): Specifying Color and Opacity

        + +

        You can manage the CSS properties for specifying the color and opacity of an HTML element, and the CSS color value type.

        + +

        You can specify the color of an element with the following formats:

        +
          +
        • Keyword values +

          You can use basic keywords, such as red, green, blue, or deepskyblue, as defined in Extended color keywords.

          +

          The currentColor keyword can be used with all properties that accept a color value (borders, box shadows, outlines, or backgrounds). The computed value of the currentColor keyword is the computed value of the color property. If the currentColor keyword is set on the color property itself, it is treated as color: inherit. +

          +

          You can use the transparent keyword with all properties that accept a color value (borders, box shadows, outlines, or backgrounds), to turn the element in question transparent (invisible).

          +
        • +
        • RGB values +
            +
          • In hexadecimal notation +

            The format is '#' followed by either 3 or 6 hexadecimal characters. The 3-digit RGB notation (#rgb) is converted into a 6-digit form (#rrggbb) by replicating digits. For example, #fc0 expands to #ffcc00.

          • +
          • In functional notation +

            The format is 'rgb(' followed by a comma-separated list of 3 numerical values (integer or percentage) followed by ')'. The integer value 255 corresponds to 100%, and to F or FF in a hexadecimal notation: rgb(255, 255, 255) = rgb(100%, 100%, 100%) = #FFF. White space characters are allowed around the numerical values. +

          • +
          +
        • +
        • RGBA values +

          The RGB color model is extended to include "alpha" to allow the color opacity to be specified. The RGBA values are defined using functional notation where the final value is the alpha (range from 0.1 to 1). For example: rgba(255, 0, 0, 0.7).

          +
        • +
        • HSL value +

          You can use numerical hue-saturation-lightness (HSL) colors as an alternative to numerical RGB colors. The HSL colors are encoded as a triple (hue, saturation, lightness). The hue is represented as the angle of the color circle, where by definition red=0°=360° and other colors are spread around the circle. The saturation and lightness are represented as percentages, where 100% is full saturation or black lightness, and 0% is a shade of gray or white lightness. 50% lightness is "normal". For example: hsl(0, 100%, 50%). +

        • +
        • HSLA value +

          The HSL color model is extended to include "alpha" to allow the color opacity to be specified. The HSLA values are defined using the HSL notation where a final alpha value is added (range from 0.1 to 1). For example: hsla(120, 100%, 50%, 0.8).

        • +
        + + + + + + + + + + +
        Note

        The CSS2 System Color values have been deprecated in favor of the CSS3 UI 'appearance' property.

        + +

        The following code snippet demonstrates how to specify a color for an element. For a complete source code, see:

        + +
        +<!--Keywords-->
        +#one
        +{
        +   color: blue;
        +   background: white;
        +   border: 1px solid springgreen;
        +}
        +#one span 
        +{
        +   background: currentColor;
        +}
        +#one span.hide
        +{
        +   color: transparent;
        +}
        +
        +<!--RGB-->
        +#two
        +{
        +    color: #ff0000;
        +}
        +
        +<!--RGBA-->
        +#three
        +{
        +   color: rgba(100%, 0, 0, 0.5);
        +}
        +
        +<!--HSL-->
        +#four
        +{
        +   color: hsl(0, 100%, 50%);
        +}
        +
        +<!--HSLA-->
        +#five
        +{
        +   color: hsla(0, 100%, 50%, 0.5);
        +}
        +
        + +

        Creating a Color Generator

        + +

        To enhance the user experience of your application, you must learn to create a HSLA color generator to set the color value for an element in the HSLA format.

        + +

        Figure: HSLA color generator

        +

        HSLA color generator

        + + + +
        1. To create the color generator, define 2 <div> elements for displaying the HSLA value as text and in a color box. You also need 4 slider inputs for defining the HSLA color: +
            +
          • The first input has a range of 0 - 360 and represents hue.
          • +
          • The second and third inputs have a range of 0 - 100 and represent saturation and lightness.
          • +
          • The last input has a range of 0 - 10 and represents alpha transparency. +

            The range should be 0.1 - 1, but the minimum value of the min attribute is 0 so the value can be divided by 10.

          + +
          +<div id="color-generator">
          +   <div id="text-box"></div>
          +   <div id="color-box"></div>
          +
          +   <label>Hue</label>
          +   <input id="hue" value="0" type="range" min="0" max="360">
          +
          +   <label>Saturation</label>
          +   <input id="saturation" value="100" type="range" min="0" max="100">
          +
          +   <label>Lightness</label>
          +   <input id="lightness" value="50" type="range" min="0" max="100">
          +
          +   <label>Alpha</label>
          +   <input id="alpha" value="10" type="range" min="0" max="10">
          +</div>
          +
        2. +
        3. Obtain the values from the slider inputs with the getElementById method. Remember to divide the alpha value by 10 to reach the correct range of 0.1 - 1. +
          +var h = document.getElementById('hue').value,
          +    s = document.getElementById('saturation').value,
          +    l = document.getElementById('lightness').value,
          +    a = document.getElementById('alpha').value / 10;
          +
        4. +
        5. Set the HSLA text and the color of the color box by defining the color from the inputs in the HSL and HSLA formats. +

          If the alpha is 1, the HSL format is displayed. Otherwise, the HSLA format is used.

          +
          +/* Define formats */
          +hsl = 'hsl(' + h + ', ' + s + '%, ' + l + '%)';
          +hsla = 'hsla(' + h + ', ' + s + '%, ' + l + '%, ' + a + ')';
          +
          +/* Set the color of the box */
          +cBox = document.querySelector('#color-box'),
          +
          +/* Set the text */
          +tBox = document.querySelector('#text-box');
          +
        6. + +
        7. Add an event handler to the input sliders to change the displayed text and color box color when the slider values change. +
          +var inputs = document.querySelectorAll('#color-generator input[type=range]');
          +			
          +for (i = 0; i < inputs.length; i++)
          +{
          +   inputs[i].onchange = function()
          +   {
          +      /* Show color */
          +   }
          +}
          +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/drag_drop_mw.htm b/org.tizen.ui.practices/html/web/w3c/drag_drop_mw.htm new file mode 100644 index 0000000..bbf1db5 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/drag_drop_mw.htm @@ -0,0 +1,318 @@ + + + + + + + + + + + + + HTML5 Drag and Drop: Handling Drag and Drop Events + + + + + +
        +

        HTML5 Drag and Drop: Handling Drag and Drop Events

        + +

        HTML5 drag and drop activates through event-based JavaScript and added attributes. +

        + +

        This feature is supported in mobile applications only.

        +

        +The main features of the HTML5 Drag and drop API include: +

        +
          +
        • Using drag and drop +

          To make an element draggable, add the draggable="true" attribute to it. Only elements thus defined as draggable can generate drag and drop events.

          +

          A drag and drop requires a source, target, and data. It is used through the following events:

          +
          • dragstart
          • +
          • drag
          • +
          • dragleave
          • +
          • dragenter
          • +
          • dragover
          • +
          • drop
          • +
          • dragend
          +

          The dragstart and drop events send data through the DataTransfer interface.

          +
        • +
        • Transferring data +

          You can transfer data from the drag source to the drop target. The DataTransfer interface instance receives the dragstart event and fills itself with the data to be transferred. It then receives a drop event, and puts the data into the drop target.

        • +
        + + + + + + + + + + +
        Note
        To use drag and drop in a Tizen device, long-press the draggable element. When the context menu appears, select the Drag menu.
        + +

        Handling Drag and Drop Events

        + +

        Learning how to handle drag and drop events is a basic user interaction skill:

        + + +
          +
        1. Define the draggable elements by adding the draggable="true" attribute to them:

          +
          +<h1>Drag and drop tutorial</h1>
          +<div class="example_body">
          +   <div id="drag-list">
          +      <div class="drag-row" draggable="true">1</div>
          +      <div class="drag-row" draggable="true">2</div>
          +   </div>
          +   <div>Drag state: <span id="log"></span></div>
          +</div>
          +
          +
        2. + +
        3. Add event listeners for the various drag and drop events: +
          +<script>
          +   var cols = document.querySelectorAll('#drag-list_.drag-row');
          +   var colsLength = cols.length;
          +
          +   for (var i = 0; i < colsLength; i++) 
          +   {
          +      cols[i].addEventListener('dragstart', dragStart, false);
          +      cols[i].addEventListener('drag', dragIng, false);
          +      cols[i].addEventListener('dragenter', dragEnter, false);
          +      cols[i].addEventListener('dragover', dragOver, false);
          +      cols[i].addEventListener('dragleave', dragLeave, false);
          +      cols[i].addEventListener('drop', dragDrop, false);
          +      cols[i].addEventListener('dragend', dragEnd, false);
          +   };
          +</script>
          +
          +
        4. + +
        5. Define event handlers for the events. In this case, each event handler displays a text on the screen. +
          +function dragStart(e) 
          +{
          +   log.innerHTML = "dragStart"
          +};
          +
          +function dragIng(e) 
          +{
          +   log.innerHTML = "drag"
          +};
          +
          +function dragOver(e) 
          +{
          +   e.preventDefault();
          +   log.innerHTML = "dragOver"
          +};
          +
          +function dragEnter(e) 
          +{
          +   log.innerHTML = "dragEnter"
          +};	
          +
          +function dragLeave(e) 
          +{
          +   log.innerHTML = "dragLeave"
          +};
          +
          +function dragDrop(e) 
          +{
          +   e.stopPropagation();
          +   log.innerHTML = "dragDrop"	
          +};
          +	
          +function dragEnd(e) 
          +{
          +   log.innerHTML = "dragEnd"
          +};
          +
          +
        6. +
        + +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Transferring Data over Drag and Drop

        + +

        Learning how to transfer data in a simple drag and drop puzzle is a basic user interaction skill:

        + +
          +
        1. Define the draggable elements by adding the draggable="true" attribute to them. +

          In this example, the Tizen logo image has been divided and allocated randomly. Each imager part is defined as draggable, so that the user can rearrange the image parts in the correct order.

          +
          +<h1>Drag and drop tutorial</h1>
          +<div class="example_body">
          +   <div>Drag state: <span id="log"></span></div>
          +   <div class="holder">
          +      <div>
          +         <img src="images/logo.png">
          +         <p class="txt">Complete the puzzle to see a picture</p>
          +      </div>
          +      <ul id="puzzle">
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_06.png">
          +         </li>
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_02.png">
          +         </li>
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_04.png">
          +         </li>
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_05.png">
          +         </li>
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_01.png">
          +         </li>
          +         <li class="puzzle-piece" draggable="true">
          +            <img src="images/puzz_03.png">
          +         </li>
          +      </ul>
          +   </div>
          +</div>
          +
          +
        2. + +
        3. Add event listeners for the dragover, dragleave, dragstart, and drop events: +
          +<script>
          +   var cols = document.querySelectorAll('#puzzle_.puzzle-piece');
          +   var colsLength = cols.length;
          +   for (var i = 0; i < colsLength; i++) 
          +   {
          +      cols[i].addEventListener('dragstart', dragStartHandler, false);
          +      cols[i].addEventListener('dragover', dragOverHandler, false);
          +      cols[i].addEventListener('dragleave', dragLeaveHandler, false);
          +      cols[i].addEventListener('drop', dragDropHandler, false);
          +   };
          +</script>
          +
          +
        4. + +
        5. Transfer data (in this case, image parts): +
            +
          1. Declare the dragElem variable, which is an empty object for the data exchange: +
            +var dragElem = null;
            +
            +
          2. + +
          3. Use the DataTransfer interface in the dragStartHandler() and dragDropHandler() event handlers to exchange image parts: +
            +function dragStartHandler(e) 
            +{
            +   /* Set data */
            +   dragElem = this;
            +   e.dataTransfer.effectAllowed = 'move';
            +   e.dataTransfer.setData('text/html', this.innerHTML);
            +   this.classList.add('over');
            +   for (var i = 0; i < colsLength; i++)
            +   {
            +      cols[i].classList.add('start');
            +   };
            +};
            +function dragDropHandler(e) 
            +{
            +   /* Get data */
            +   dragElem.innerHTML = this.innerHTML;
            +   this.innerHTML = e.dataTransfer.getData('text/html');
            +   for (var i = 0; i < colsLength; i++)
            +   {
            +      cols[i].className = "puzzle-piece";
            +   };
            +   /* Check key */
            +   puzzleCheck();
            +};
            +
            +
          4. + +
          5. Check the completion of the puzzle by making a user key using a simple array, and comparing the user key against the puzzle key (correct answer): +
            +var puzzleKey =  ["01", "02", "03", "04", "05", "06"];
            +var puzzleArray = [];
            +
            +function puzzleCheck() 
            +{
            +   /* Initialize the user key */
            +   puzzleArray = [];
            +   /* Insert the keys in the array */
            +   for (var i = 0; i < colsLength; i++) 
            +   {
            +      puzzleArray.push(cols[i].children[0].getAttribute('src').substring(12, 14));
            +   };
            +   originKey = puzzleKey.join();
            +   userKey = puzzleArray.join();
            +
            +   if (originKey === userKey)
            +   {
            +      alert("Success !");
            +   };
            +};
            +
            +
          6. +
          +
        6. +
        +

        Figure: Drag and drop puzzle

        +

        Drag and drop puzzle

        +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/flexible_w.htm b/org.tizen.ui.practices/html/web/w3c/flexible_w.htm new file mode 100644 index 0000000..6844969 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/flexible_w.htm @@ -0,0 +1,355 @@ + + + + + + + + + + + + + CSS Flexible Box Layout Module: Adjusting the Layout + + + + + +
        +

        CSS Flexible Box Layout Module: Adjusting the Layout

        + +

        CSS attributes, such as float, display, and position, can be used to adjust and align the screen layout according to various resolutions. However, operating the layout accurately among changing screen sizes is difficult.

        + +

        Tizen supports the CSS Flexible Box Layout Module API that enables you to create an easily manageable flexible layout, which fluidly adjusts the layout according to viewport size changes. When you create and use a flexible box layout, the alignment method or object (flex item) size within a specific area (flex container) can be adjusted.

        +

        The main components of the flexible box layout include:

        +
          +
        • Flex container, which refers to flex or inline-flex DOM elements assigned by the display.

          You can use the flex container to assign a flex area and the flex items included in it. The flex container properties are used to assign the indication area and alignment method.

        • +
        • Flex item, which refers to the child nodes of the flex container. +

          The flex item changes its size fluidly according to the area of the flex container. You can define flex item properties to assign the sizes of the respective items and the alignment method.

        • +
        +

        Figure: Flexible box layout

        +

        Flexible box layout

        + +

        Using the Flex Container

        +

        To enhance the user experience of your application, you must learn how to assign size and alignment to the flex container:

        + +
          +
        1. Assign the area (flex container) where the flexible box layout is applied by using the display: flex property: +
          <style>
          +   .flex_container {display: -webkit-flex}
          +</style>
          +
          +<div class="flex_container">
          +   <div class="flex_item">A</div>
          +   <div class="flex_item">B</div>
          +   <div class="flex_item">C</div>
          +   <div class="flex_item">D</div>
          +<div>
          + +

          The child nodes within the assigned flex container become flex items.

          +
        2. +
        3. Define the necessary properties for the flex container to assign the alignment of the flex items within it:

          +
            +
          • flex-direction property sets the alignment direction of the flex items: +
              +
            • row: Align from left to right.
            • +
            • row-reverse: Align from right to left.
            • +
            • column: Align from top to bottom.
            • +
            • column-reverse: Align from bottom to top.
            • +
          • + +
          • flex-wrap property sets the line changing of the flex items: +
              +
            • nowrap: Reduces the size of the flex items without changing lines.
            • +
            • wrap: The flex items reaching beyond the flex container area are divided into multiple lines using the cross axis direction of the current writing mode.
            • +
            • wrap-reverse: The flex items reaching beyond the flex container area are divided into multiple lines using the opposite cross axis direction than in the wrap value.
            • +
          • + +
          • justify-content property sets the handling of gaps between the flex items on the main axis: +
              +
            • flex-start: Gathers the items at the alignment starting point.
            • +
            • flex-end: Gathers the items at the alignment finishing point.
            • +
            • center: Gathers the items in the center.
            • +
            • space-between: Aligns the start and end item at both ends, and creates equal gaps in between the rest of the items.
            • +
            • space-around: Creates equal gaps between all items.
            • +
            + + + + + + + + + +
            Note
            This property is similar to text-align, but the alignment direction and the starting point are based on the flex-direction and flex-wrap properties.
          • + +
          • align-content property sets the handling of gaps between the flex items on the cross axis. It has the same values as the justify-content property, and 1 additional value: +
              +
            • stretch: Extends the size of the flex items and aligns them without gaps.
            • +
          • +
          • align-items property sets the relative location and size between the flex items on the cross axis: +
              +
            • flex-start: Aligns the items vertically to the top.
            • +
            • flex-end: Aligns the items vertically to the bottom.
            • +
            • center: Aligns the items vertically to the middle.
            • +
            • baseline: Aligns the items vertically to the baseline.
            • +
            • stretch: Extends the height of the flex items and aligns them without gaps.
            • +
            + + + + + + + + + +
            Note
            If the flex-wrap property is set to wrap-reverse, the start and end points of the alignment are reversed.
        +

        The following figure shows examples of flex containers and how their flex items have been aligned.

        +

        Figure: Flex container properties (in mobile applications only)

        +

        Flex container properties (in mobile applications only)

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + +

        Using the Flex Items

        + +

        To enhance the user experience of your application, you must learn how to assign size and alignment to the flex items:

        + +
          +
        1. Assign the area (flex container) where the flexible box layout is applied, and define the flex items for it: +
          <style>
          +   .flex_container {display: -webkit-flex}
          +</style>
          +
          +<div class="flex_container">
          +   <div class="flex_item">A</div>
          +   <div class="flex_item">B</div>
          +   <div class="flex_item">C</div>
          +<div>
          +
        2. + +
        3. Define the necessary properties for the flex items:

          +
            +
          • align-self property is similar as the align-items property of the flex container. + + + + + + + + + +
            Note
            If both the align-self and align-items properties are used simultaneously, the align-items property is ignored.
          • + +
          • flex property is a shorthand expression defining the flex item size handling: +
              +
            • flex-grow: Sets whether the spaces between flex items are filled.
            • +
            • flex-shrink: Sets whether the width of the flex items is reduced according to the size of the flex container.
            • +
            • flex-basis: Sets the default width of the relevant flex items.
            • +
        +

        The following figure shows examples of how flex items can be placed and sized within a flex container.

        +

        Figure: Flex items (in mobile applications only)

        +

        Flex items (in mobile applications only)

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + +

        Creating a Flexible Layout with CSS3

        + +

        To enhance the user experience of your application, you must learn how to create flexible box layout:

        +
          +
        1. Define the HTML content for the flexible layout. In this example, create 2 articles areas, 1 for a text list and 1 for an icon list: +
          <div class="container">
          +   <article class="events">
          +      <h2>UPCOMING EVENTS</h2>
          +      <ul>
          +         <li>
          +            <div class="date"><span>APR</span><br> 15</div>
          +            <p class="title">
          +               Linux Foundation Collaboration Summit <span class="local">San Francisco, CA</span>
          +            </p>
          +         </li>
          +         <!--Other text items-->
          +      </ul>
          +   </article>
          +   <article class="schedule">
          +      <h2>SCHEDULE</h2>
          +      <div class="img_list">
          +         <img src="folder.png" alt="folder">
          +         <img src="alert.png" alt="alert">
          +         <!--Other icons-->
          +      </div>
          +   </article>
          +</div>
        2. + +
        3. Define styles to decorate the article areas. (The following figure applies to mobile applications only.) +
          <!--Border for the article areas-->
          +.container article > * {border: 1px solid #ccc;}
          +
          +<!--Font style for the article area titles-->
          +.container .events > h2, .container .schedule > h2 
          +{
          +   padding: 10px 20px;
          +   text-shadow: 1px 1px 2px #fff, -1px -1px 2px #000;
          +}
          +
          +<!--List styles-->
          +.container .events > ul, .container .schedule .img_list  
          +{
          +   height: 100%; 
          +   padding: 10px;
          +}
          +
          +<!--Text style for the text list item title-->
          +.container .events > ul > li .title 
          +{
          +   color: #51809e;
          +   text-shadow: 1px 1px 2px #000;
          +}
          +
          +<!--Text style for the text list item location info-->
          +.container .events > ul > li .title .local 
          +{
          +   text-indent: 10px;
          +   text-shadow: 0 0 0 #fff;
          +}
          +
          +<!--Styles for the text list item date box-->
          +.container .events > ul > li .date 
          +{
          +   text-align: center;
          +}
          +.container .events > ul > li .date 
          +{
          +   background-color: #ddd;
          +   border-radius: 10px;
          +   box-shadow: inset -2px -2px 4px rgba(0, 0, 0, .5);
          +}
          +.container .events > ul > li .date > span 
          +{
          +   background-color: #fff;
          +   border-radius: 5px;
          +}
          +

          Article areas with styles defined (in mobile applications only)

        4. + + +
        5. Define a flexible alignment for the article areas to support screen orientation changes and ensure that the content fills up the entire available screen area regardless of the orientation: +
            +
          1. Define the text list items and the icon list as flex containers using the display: -webkit-flex; property: +
              +
            • For the text list items, align them vertically in the middle, define a 0 margin at the top for the first item, and center-align the text for the date box.
            • +
            • For the icon list, align the icon list so that the first and last icon are placed at the ends and the gaps between the rest of the icons are equal.
            +

            (The following figure applies to mobile applications only.)

            +
            <!--Flexible alignment of text list-->
            +.container .events > ul > li 
            +{
            +   display: -webkit-flex;
            +   -webkit-align-items: center;
            +}
            +.container .events > ul > li: first-child 
            +{
            +   margin-top: 0;
            +}
            +
            +.container .events > ul > li .date 
            +{
            +   -webkit-flex: 0 0 20%;
            +   text-align: center;
            +}
            +
            +<!--Flexible alignment of icon list-->
            +.container .schedule .img_list 
            +{
            +   display: -webkit-flex;
            +   -webkit-justify-content: space-between;
            +}
            +

            Article areas with a flexible box layout defined (in mobile applications only)

          2. + + +
          3. Special consideration can be given for some screen sizes. The following example defines a specific layout for small screens (where the screen width is less than 390 pixels). (The following figure applies to mobile applications only.) +
            +@media screen and (min-width: 390px) 
            +{
            +   .container .schedule .img_list 
            +   {
            +      display: -webkit-flex;
            +      -webkit-flex-wrap: wrap;
            +      -webkit-justify-content: space-between;
            +      -webkit-align-content: space-around;
            +   }
            +
            +   .container {display: -webkit-flex;}
            +   .container > * {-webkit-align-content: center;}
            +   .container article {height: 250px;}
            +}
            +

            Article areas with a flexible box layout for small screens (in mobile applications only)

            +

            For more information on defining screen-size-specific rules, see Media Queries.

            +
        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/font_w.htm b/org.tizen.ui.practices/html/web/w3c/font_w.htm new file mode 100644 index 0000000..afbaf7f --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/font_w.htm @@ -0,0 +1,214 @@ + + + + + + + + + + + + + CSS Fonts Module (Level 3): Manipulating Fonts + + + + + + +
        +

        CSS Fonts Module (Level 3): Manipulating Fonts

        + +

        You can change the text fonts easily.

        + +

        The new text features in CSS Fonts Module Level 3 API include:

        +
          +
        • Font properties +

          You can use CSS font properties, such as font-style, font-weight, font-variant, font-size, and font-family, to modify the appearance of text.

        • +
        + + +

        Manipulating Fonts

        + +

        To enhance the user experience of your application, you must learn to handle fonts using CSS font properties:

        + +
          +
        1. Define the font-style property within a <style> element in the <head> section of the Web page to apply different font styles:

          + +
          +<head>
          +   <style>
          +      p:nth-child(1) em{font-style: normal}
          +      p:nth-child(2) em{font-style: italic}
          +      p:nth-child(3) em{font-style: oblique}
          +   </style>
          +</head>
          +<body>
          +   <p>font-style: <em>normal</em></p>
          +   <p>font-style: <em>italic</em></p>
          +   <p>font-style: <em>oblique</em></p>
          +</body>
          +
          + +
        2. + +
        3. Define the font-weight property, +which controls the weight of the text:

          + +
          +<head>
          +   <style>
          +      p:nth-child(1) {font-weight: normal}
          +      p:nth-child(2) {font-weight: bold}
          +      p:nth-child(3) {font-weight: 300}
          +      p:nth-child(4) {font-weight: 500}
          +      p:nth-child(5) {font-weight: 700}
          +   </style>
          +</head>
          +<body>
          +   <p>font-weight: <em>normal</em></p>
          +   <p>font-weight: <em>bold</em></p>
          +   <p>font-weight: <em>300</em></p>
          +   <p>font-weight: <em>500</em></p>
          +   <p>font-weight: <em>700</em></p>
          +</body>
          +
          + +
        4. + +
        5. Define the font-variant property to +change the font to, for example, use small capital letters: +
          +<head>
          +   <style>
          +      p:nth-child(1) {font-variant: normal}
          +      p:nth-child(2) {font-variant: small-caps}
          +   </style>
          +</head>
          +<body>
          +   <p>font-variant: <em>normal</em></p>
          +   <p>font-variant: <em>small-caps</em></p>
          +</body>
          +
          + +
        6. + +
        7. Define the font-size property, which controls the size of the font: +
          +<head>
          +   <style>
          +      p:nth-child(1) {font-size: 150%}
          +      p:nth-child(2) {font-size: 1.2em}
          +   </style>
          +</head>
          +<body>
          +   <p>font-size: <em>150%</em></p>
          +   <p>font-size: <em>1.2em</em></p>
          +</body>
          +</html>
          +
          +
        8. + +
        9. Define the line-height property, which controls the height of a text line: +
          +<head>
          +   <style>
          +      p:nth-child(1) {line-height: 1}
          +      p:nth-child(2) {line-height: 1.5}
          +      p:nth-child(3) {line-height: 5}
          +   </style>
          +</head>
          +<body>
          +   <p>line-height: <em>1</em></p>
          +   <p>line-height: <em>1.5</em></p>
          +   <p>line-height: <em>5</em></p>
          +</body>
          +
          + +
        10. + +
        11. Define the font-family property, which assigns a specific font or its representative to an element. The list order within the <style> element determines the property priority. +

          If the assigned font is not installed on the target, a different font is obtained based on the user system.

          +
          +<head>
          +   <style>
          +      p:nth-child(1) {font-family: serif}
          +      p:nth-child(2) {font-family: sans-serif}
          +      p:nth-child(3) {font-family: monospace}
          +      p:nth-child(4) {font-family: cursive}
          +      p:nth-child(5) {font-family: fantasy}
          +      p:nth-child(6) {font-family: 'Arial Black', sans-serif}
          +      p:nth-child(7) {font-family: Tahoma, sans-serif}
          +      p:nth-child(8) {font-family: Verdana, sans-serif}
          +      p:nth-child(9) {font-family: Arial, sans-serif}
          +   </style>
          +</head>
          +<body>
          +   <p>font-family: <em>serif</em></p>
          +   <p>font-family: <em>sans-serif</em></p>
          +   <p>font-family: <em>monospace</em></p>
          +   <p>font-family: <em>cursive</em></p>
          +   <p>font-family: <em>fantasy</em></p>
          +   <p>font-family: <em>'Arial Black', sans-serif</em></p>
          +   <p>font-family: <em>Tahoma, sans-serif</em></p>
          +   <p>font-family: <em>Verdana, sans-serif</em></p>
          +   <p>font-family: <em>Arial, sans-serif</em></p>
          +</body>
          +</html>
          +
          +
        12. +
        + + +

        The following figure shows examples of manipulating the text font properties.

        +

        Figure: Font properties (in mobile applications only)

        +

        Font properties (in mobile applications only)

        + + + + + + + + + + +
        Note
        For a complete list of CSS Fonts Module Level 3 font properties (in mobile or wearable applications) and their possible values, see the Property index.
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/frame_flattening_mw.htm b/org.tizen.ui.practices/html/web/w3c/frame_flattening_mw.htm new file mode 100644 index 0000000..3fdec22 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/frame_flattening_mw.htm @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + Frame Flattening: Expanding Content According to Size + + + + + +
        +
        + +
        +
        +

        Mobile Web

        +
        + +

        Frame Flattening: Expanding Content According to Size

        + +

        In the Tizen WebKit, content placed within the <frame> and <iframe> tags is expanded automatically according to the content size. This enables users to view the whole content at once without scrolling.

        + +

        This feature is supported in mobile applications only.

        + +

        The Tizen WebKit supports this feature since scrolling through small subframes on small screen devices is a tedious task and, occasionally, causes confusion between scrolling subframes and scrolling the Web page itself.

        +

        To implement scrollable content in the Tizen WebKit, use the CSS overflow: scroll or webkit-overflow-scrolling: touch property instead of iframe.

        + + + +
        + +Go to top + + + + + + + + diff --git a/org.tizen.ui.practices/html/web/w3c/guides_w3c_w.htm b/org.tizen.ui.practices/html/web/w3c/guides_w3c_w.htm new file mode 100644 index 0000000..629c2e1 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/guides_w3c_w.htm @@ -0,0 +1,142 @@ + + + + + + + + + + + + + W3C + + + + + + +
        + +

        W3C/HTML5

        + +

        The W3C specifications provide HTML and CSS, which are the core technologies for building Web pages and Web applications.

        + +

        To learn how to use the W3C features in your application UI, see the following topics:

        + + + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/html5forms_w.htm b/org.tizen.ui.practices/html/web/w3c/html5forms_w.htm new file mode 100644 index 0000000..cba7328 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/html5forms_w.htm @@ -0,0 +1,432 @@ + + + + + + + + + + + + + HTML5 Forms: Implementing Web Forms for User Input Using HTML5 Elements + + + + + +
        + +

        HTML5 Forms: Implementing Web Forms for User Input Using HTML5 Elements

        + +

        The HTML5 forms provide a convenient way to create consistent screens in your application for accepting user input. In the past, the Web form allowed you to accept user input before transmitting it to a server. With HTML5, you can now improve the user experience without having to use JavaScript by adding simple features, for example, email validity checks and date pickers, and using more advanced functionality, such as security checks and input value pattern definitions.

        + +

        New HTML5 Elements

        +

        The following table lists the new elements available for your forms in HTML5. For a complete source code, see elements.html.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: New HTML5 elements
        ElementDescriptionExample
        datalist

        Defines a set of option elements that represent predefined options for other controls. The element is used together with the input element to predefine its value.

        +

        In Tizen, the value selected in the datalist element can be edited.

        +
        +<input type="text" list="search">
        +<datalist id="search">
        +   <option value="Tomato">Tomato</option>
        +   <option value="banana">banana</option>
        +   <option value="Watermelon">Watermelon</option>
        +</datalist>
        +
        +
        keygen

        Defines a control for generating a public-private key pair and for submitting the public key from that key pair. The element creates an encrypted key with the value of the name attribute, saves it in the user's computer and Web server, and activates the next procedure when the 2 values match.

        +
        +<label>user:<input type="text" name="user_name"></label>
        +<label>keygen:<keygen name="keygen"></label>
        +
        +
        meter

        Represents a scalar measurement within a known range (the distribution of the assigned range), or a fractional value.

        +
        +<meter value="75" min="0" max="100" low="60" high="80" optimum="81">
        +   75/100
        +</meter>
        +
        +
        output

        Represents the result of a calculation. The element generally shows the calculated result of the value that the user has entered, and is used within the form element.

        +
        +<fieldset onsubmit="return false"
        +          oninput="foobar.value = parseInt(foo.value) * parseInt(bar.value)">
        +   <input type="number" id="foo" name="foo"> *
        +   <input type="number" id="bar" name="bar"> =
        +   <output for="foo bar" name="foobar"></output>
        +</fieldset>
        +
        +
        progress

        Represents the progress of a task.

        +
        +<progress value="75" max="100">
        +   75/100
        +</progress>
        +
        + +

        New Input Element Types

        +

        The following table lists the new input element types available for your forms in HTML5. Many of the new elements activate a specific keyboard suitable for the type of value the user is expected to enter (for example, an email or URL). For a complete source code, see types.html.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: New input element types
        TypeDescriptionExample
        color

        Select an HSL color from the color picker. The value format is HEX (#0099ff).

        +
        +
        +<input type="color"
        +       value="#ff0000">
        +<input type="datetime"
        +       value="2012-12-12T03:30Z">
        +<input type="email"
        +       required>
        +<input type="number"
        +       step="3">
        +<input type="range"
        +       min="1" max="10">
        +<input type="tel">
        +<input type="url">
        +
        +
        date

        Enter a date with no time zone (yyyy-mm-dd).

        +
        datetime

        Enter a date and time with the (UTC) time zone (yyyy-mm-ddTtt:mmZ).

        + +
        datetime-local

        Enter a date and time with no time zone (yyyy-mm-ddTtt:mm).

        +
        email

        Enter an email address with the email keyboard.

        +

        If the required attribute is used, the system checks whether the input format is in line with the ABNF regular expression (1*(atext / ".") "@" ldh-str 1*("." ldh-str)).

        +
        month

        Enter a year and month with no time zone (yyyy-mm).

        +
        number

        Enter numbers with the number keyboard.

        +
        range

        Select a value from the slider.

        +
        search

        No specific functionality is defined for this element in the HTML5 specifications.

        +
        tel

        Enter a phone number with the number keyboard.

        +
        time

        Enter a time with no time zone (tt:mm:ss).

        +
        url

        Enter a URL with the URL keyboard.

        +
        week

        Enter a year and week with no time zone (yyyy-week).

        +
        + +

        New Input Element Attributes

        + +

        The following table lists the new input element attributes available for your forms in HTML5. For a complete source code, see attributes.html.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: New input element attributes
        AttributeDescriptionExample
        autocomplete

        Prefilling feature, which helps the users by, for example, prefilling the user's address based on earlier user input.

        +

        The text used by the user before (such as an input element) is listed in a datalist form. The attribute can be used in all form elements, and is activated if the value is "on" and deactivated if the value is "off".

        +
        +
        +<input type="range" min="1" max="10">
        +<input type="tel" pattern="[0-9]+" required>
        +<input placeholder="You know what to do, huh?">
        +<input type="number" step="3">
        +
        +
        min and max

        Allowed range of values for the element.

        +
        pattern

        Regular expression against which the control's value is checked.

        +

        The attribute can be used to check the validity of the form data. During service, a guide requiring the input format from the user is necessary.

        +
        placeholder

        Short hint intended to aid the user with the data entry.

        +

        The attribute can be used in the majority of form elements for various purposes, such as hint text or advertisement.

        +
        required

        Boolean attribute which, when specified, defines that the element is mandatory.

        +
        step

        Granularity expected of the value, limiting the allowed values.

        +
        + +

        Creating a Basic Login Form

        + +

        To create simple user input forms, you must learn to use the HTML5 features in Web forms:

        + +
          +
        1. Create a simple form where the user can enter their login details (email address and password):

          +
          +<form action="" method="">
          +   <label>email: <input type="text"></label>
          +   <label>password: <input type="password"></label>
          +    
          +   <input type="submit" value="Login">
          +</form>
          +
        2. +
        3. To check the validity of the entered email address automatically, add the required attribute to the input element with the email type:

          +
          +<label>email: <input type="email" required></label>
          +
        4. +
        5. Define the password field as mandatory by using the required attribute in that input element too:

          +
          +<label>password: <input type="password" required></label>
          +
        6. +
        7. Because a device has limited space on the screen, remove the field labels and replace them with hint texts using the placeholder attribute:

          +
          +<input type="email" placeholder="e-mail address" required>
          +<input type="password" placeholder="password" required>
          +
        + +

        The final form that checks the email validity and requires the mandatory password input is complete:

        +
        +<form action="" method="">
        +   <fieldset>
        +      <legend>Login</legend>
        +      <input type="email" placeholder="e-mail address" required>
        +      <input type="password" placeholder="password" required>
        +   </fieldset>
        +    
        +   <input type="submit" value="Login">
        +</form>
        +
        + +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Creating an Advanced Login Form

        + +

        To create advanced user input forms, you must learn to use the HTML5 features in Web forms:

        + +
          +
        1. Create a login form that checks the email validity and requires the mandatory password input:

          +
          +<form action="" method="">
          +   <fieldset>
          +      <legend>Login</legend>
          +      <input type="email" placeholder="e-mail address" required>
          +      <input type="password" placeholder="password" required>
          +   </fieldset>
          +    
          +   <input type="submit" value="Login">
          +</form>
          +
        2. + +
        3. When the form page is loaded on the screen, put the focus automatically to the email field by using the autofocus attribute:

          +
          +<input type="email" placeholder="e-mail address" required autofocus>
          +
        4. + +
        5. +

          To spare the user from filling in information that they have given previously, use the autocomplete attribute, which shows the previously successfully inserted entries in a datalist, from which the user can select and use them.

          +

          You can apply the autocomplete attribute to a specific field by adding it to the appropriate input element. If you add it to the form element, it applies to all child elements within the form.

          + +
          +<form action="" method="" autocomplete="on">
          +
          +
        6. +
        7. In general, apply the autocomplete attribute to the form element, and then separately set it to off for those fields that must not use it.

          +

          In the following example, the password field must not use autocomplete, to prevent unauthorized access by any user.

          +
          +<input type="password" placeholder="password" required autocomplete="off">
          +
          +
        8. +
        9. Protect the password with private and public key pair using the keygen element.

          +

          The element is used to transform the data sent from the connected form to a pair of encrypted keys using the RSA (Rivest Shamir Adleman) method. When the input data is sent from the form, the private key is saved in the local computer, and the public key is delivered to the server. Only if the keys match, the login process proceeds forwards.

          + +
          +<keygen name="keyvalue">
          +
        10. + +
        11. Use the pattern attribute to perform a validity check that ensures that the password field value matches the given regular expression. The required attribute is used to ensure that the field value must be entered and then the validity check can be performed.

          +

          In the following example, the password only accepts numbers and letters of the alphabet. If an invalid value is entered, the login cannot proceed.

          + +
          <input type="password" placeholder="password" required
          +       pattern="[a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*" 
          +       autocomplete="off">
          +
        12. +
        13. Define the required length of the password within the pattern attribute.

          +

          In the following example, the password must be 6 to 12 characters long.

          + +
          +<input type="password" placeholder="password" required 
          +       pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
          +       autocomplete="off">
          +
        14. +
        + +

        The final form with autofocus and autocomplete features, strengthened security, and password value requirements is complete:

        + +
        +<form action="" method="" autocomplete="on">
        +   <fieldset>
        +      <legend>Login</legend>
        +      <input type="email" placeholder="e-mail address" required autofocus>
        +      <input type="password" placeholder="password" required 
        +             pattern="(?=([a-zA-Z]+[0-9]+[a-zA-Z0-9]*|[0-9]+[a-zA-Z]+[a-zA-Z0-9]*)).{6,12}" 
        +             autocomplete="off">
        +   </fieldset>
        +
        +   <keygen name="keyvalue">
        +    
        +   <input type="submit" value="Login">
        +</form>
        +
        + + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/html_priority_w.htm b/org.tizen.ui.practices/html/web/w3c/html_priority_w.htm new file mode 100644 index 0000000..886a6d6 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/html_priority_w.htm @@ -0,0 +1,449 @@ + + + + + + + + + + + + + HTML Priorities: Understanding HTML Behavior + + + + + +
        + +

        HTML Priorities: Understanding HTML Behavior

        + +

        The HTML markup is not as important as before, because JavaScript APIs can be used to create various functionalities. For example, graphics APIs (in mobile or wearable applications) can be used for making games, media APIs (in mobile or wearable applications) for creating video chats, and communication APIs (in mobile or wearable applications) for various types of messaging. However, HTML remains the basis of Web applications, and it is useful to be familiar with its behavior.

        + +

        The structure of the HTML document can be classified into DOCTYPE and HTML DOM (Document Object Model). When an HTML document is loaded, the browser renders the contents in its screen as follows:

        +
          +
        1. HTML is parsed referring to the rules defined in the <!DOCTYPE> element.
        2. +
        3. HTML DOM tree is established.
        4. +
        5. DOM elements, including references to JavaScript, are arranged based on the information defined in the head element. This is called rendering.
        6. +
        7. The elements are painted on the screen based on CSS rules.
        8. +
        + +

        <!DOCTYPE> Element

        + +

        The <!DOCTYPE> element informs the browser of the HTML version and which rules it must follow. It is not a composition element of the HTML.

        + +

        The browser, based on the version defined in the <!DOCTYPE> element and DTD (Document Type Definition), decides how to handle the HTML before interpreting it. Therefore, the <!DOCTYPE> element must be declared at the beginning of an HTML document.

        + +
        <!--HTML5-->
        +<!DOCTYPE html>
        +
        +<!--Prior to HTML5-->
        +<!DOCTYPE html PUBLIC "{HTML Version Information}" "{DTD (Document Type Definition) file link defined by Rule in HTML DOM}">
        +
        + +

        HTML DOM Tree

        + +

        HTML DOM is a structured model to control Web elements. It is an official W3C standard to express the document regardless of platforms or languages, and the foundation of the HTML5 APIs.

        + +

        The <html> element is the top-level element of the HTML DOM tree that wraps the entire document, and it has the <head> and <body> elements as child nodes:

        + +
        <!DOCTYPE html>
        +<html>
        +   <head>
        +      <!--Content-->
        +   </head>
        +   <body>
        +      <!--Content-->
        +   </body>
        +</html>
        + +

        <head> element

        + +

        The <head> element contains the information that the browser refers to when rendering the body element to interpret information, such as the title of HTML document, CSS, JavaScript, and favicon:

        + +
        <!DOCTYPE html>
        +<html>
        +   <head>
        +      <meta charset="utf-8" />
        +      <title> Tizen (in mobile applications) or Tizen Wearable (in wearable applications) </title>
        +      <link rel="stylesheet" href="css/style.css" />
        +      <script src="/common/js/ui.js"></script>
        +   </head>
        +   <body>
        +      <!--Content-->
        +   </body>
        +</html>
        + +

        The <head> contains the following subelements:

        + +
          +
        • <title>: Defines the title of the document.
        • +
        • <meta>: Defines information, such as encoding, creator, and keywords of the document. + + + + + + + + + + +
          Note
          The viewport element, which sets the screen area, is included in the meta information.
        • +
        • <style>, <link>: Sets the styles of the document.
        • +
        • <script>, <noscript>: Adds functions to the document.
        • +
        + +

        <body> element

        + +

        The <body> element defines the area displaying content on the browser screen:

        + +
        <!DOCTYPE html>
        +<html>
        +   <head>
        +      <!--Content-->
        +   </head>
        +   <body>
        +      <section id="tizen_wrap">
        +         <header>
        +            <h1>Tizen Web App (in mobile applications) or Tizen Wearable Web App (in wearable applications)</h1>
        +         </header>
        +         <section id="contents">
        +            <!--Content-->
        +         </section>
        +         <footer>
        +            <p>&copy; All rights reserved.</p>
        +         </footer>
        +      </section>
        +   </body>
        +</html>
        + +

        CSS Rule Priorities

        +

        The basic rule of HTML, CSS, and JavaScript is that the code is applied from the top to the bottom of the document. Sometimes the lack of understanding of the CSS rule priorities can cause a result you do not expect.

        +

        The following figure illustrates this problem in mobile applications by applying a font color to a black background.

        + +

        Figure: Expected and actual result of applying a font color (in mobile applications only)

        +

        Expected and actual result of applying a font color (in mobile applications only)

        + +

        Basic CSS Rules

        + +

        When creating a CSS document, the following rules apply:

        + +
          +
        • When more than 1 overlapping styles are applied to the same element, only the last style is visible: + +
          p {color: red}
          +p {color: blue}
          +<!--Blue color is applied-->
          +
        • +
        • The style applied in the parent node at the DOM tree is inherited. For more information, see W3C inheritance documentation. +
        • +
        • The style that has the highest CSS specificity is applied. The specificity of different elements is defined as follows: +
            +
          • ID attribute = 100
          • +
          • Class attribute = 10
          • +
          • Element = 1
          • +
          + +
          <body>
          +   <p id="target" class="target">Hello World</p>
          +</body>
          +
          +<style>
          +   p#target {color: black} /* Specificity: 101 */
          +   p#target {color: red} /* Specificity: 101 */
          +   p.target {color: blue} /* Specificity: 11 */
          +   p {color: tomato} /* Specificity: 1 */
          +</style>
          +<!--Red color is applied-->
          +
        • +
        • When the !important attribute is used, it has the highest priority: +
          <body>
          +   <p id="target" class="target">Hello World</p>
          +</body>
          +
          +<style>
          +   p#target {color: black !important}
          +   p#target {color: red}
          +   p.target {color: blue}
          +   p {color: tomato}
          +</style>
          +<!--Black color is applied-->
          +
        • +
        + +

        Keeping these rules in mind, you can use any of the following ways to achieve the expected result illustrated in the figure above:

        +
        .contents {color: #999 !important;}
        +
        +section.contents {color: #999;}
        +
        +body .contents {color: #999;}
        +
        +#container > .contents {color: #999;}
        +
        + +

        Using CSS with HTML

        + +

        There are various ways to connect CSS with HTML. Creating a separate CSS file and managing it separately is convenient when it comes to applying changes in the future. The file is connected to the HTML file using a <link> tag in the <head> element.

        + +

        In the following example, the applied order of the CSS elements is as follows:

        +
          +
        1. <link> tag in the <head> element
        2. +
        3. <style> tag in the <head> element
        4. +
        5. @import attribute in the CSS area
        6. +
        7. style attribute in a HTML element
        8. +
        + +
        <!DOCTYPE html>
        +<html>
        +   <head>
        +      <!--Link in head-->
        +      <link rel="stylesheet" href="css/style.css"/>
        +
        +      <!--Style tag in head-->
        +      <style>
        +         p {color: tomato}
        +      </style>
        +
        +      <!--@import in CSS area-->
        +      <style>
        +         @import url("css/style.css");
        +      </style>
        +   </head>
        +
        +   <body>
        +      <!--Style attribute in HTML element-->
        +      <p style="color: red">Hello World</p>
        +   </body>
        +</html>
        +
        +

        However, the priority order of the elements is as follows:

        +
          +
        1. style attribute in a HTML element
        2. +
        3. <style> tag in the <head> element
        4. +
        5. @import attribute in the CSS area
        6. +
        7. <link> tag in the <head> element
        8. +
        + +

        The style attribute in the HTML element has the highest priority after the !important attribute.

        + +

        Using the order above, if all other color styles are applied to <p> elements, the style attribute is used to apply the red color that has been directly defined in the HTML. This rule differs from the CSS specificity rules.

        + +

        Generally, when the @import attribute is used, connect to the top of CSS file that has been linked externally, as illustrated in the figure below. If the attribute is applied in the middle of the CSS file, it is difficult to know the point where CSS has been applied, and to find the file connected to the source in the future. Therefore, group the CSS file at the top.

        + + + + + + + + + + +
        Note
        Using the @import attribute gives the same result as connecting an external file, but it does not function correctly in older browsers (IE 5.5 and below).
        +

        Figure: Using the @import attribute

        +

        Using the @import attribute

        + +

        The markup in the corresponding files is as follows:

        +
          +
        • In the HTML code: +
          <head>
          +   <link rel="stylesheet" href="css/style.css"/>
          +</head>
          +
        • +
        • In the style.css file: +
          @import url("priorities1.css");
          +
          +p: after {content: " : linked in head"}
          +
          +

          Figure: Result of linking the @import attribute

          +

          Result of linking the @import attribute

        • +
        • In the priorities1.css file: +
          p: after {content: " : Using @import in CSS area"}
          +
          +

          Figure: Result of using the @import attribute in the CSS area

          +

          Result of using the @import attribute in the CSS area

        • +
        + +

        JavaScript Behavior

        +

        With the advent of HTML5, numerous powerful HTML5 APIs have been introduced. Since the usage of JavaScript has increased, it has become important to use it accurately in accordance with optimized JavaScript performance.

        + +

        JavaScript used in Web applications can be divided into the core, ECMAScript, and DOM, which all manipulate HTML. ECMAScript is executed when a method is called, or it can be executed when an event is fired within a HTML document through a linkage with DOM.

        + +

        Using JavaScript with HTML

        +

        Used with HTML, JavaScript works as follows:

        +
          +
        1. During HTML parsing, the content of the <script> tag is parsed to JavaScript Interpreter.
        2. +
        3. The Interpreter parses the received script code.
        4. +
        5. Requests that need not be handled immediately are suspended.
        6. +
        7. The handled result is passed over to the browser, which continues to parse HTML.
        8. +
        + +

        The following example shows how you can use JavaScript with HTML either by linking to a JavaScript file, or embedding it directly in the HTML code:

        +
        /* Linking from HTML */
        +<script src="js/main.js"></script>
        +
        +/* Direct use in HTML */
        +<script>
        +   var obj = document.querySelector(".animated");
        +    
        +   function animate() 
        +   {
        +      /* Execute */
        +   };
        +    
        +   /* Call the animation function when the event is fired */
        +   webkitRequestAnimationFrame(animate);  
        +</script>
        +
        +
        +

        Both ways described above give the same result in behavior. However, the position of the JavaScript code affects the order in which the methods are called.

        + + + + + + + + + +
        Note
        Previously, adding JavaScript code within head tag was recommended because it is easy to maintain. Currently, adding it to the end of the body and executing it after parsing the HTML document is common.
        + +

        JavaScript Events

        + +

        JavaScript generally calls a method when a specific event is fired. More than 70 types of events, such as onload and onclick are available.

        + +

        The following example shows the use of a simple event:

        + +
        <!--HTML-->
        +<body onload="touchEventHandler()">
        +
        +<script>
        +   /* JavaScript */
        +   /* Directly assigning */  
        +   window.onload = touchEventHandler; /* Assigns the name of the subject method */
        +    
        +   /* Event listener (W3C standard) */
        +   document.addEventListener("touchstart", touchEventHandler, false);
        +</script>
        +

        Prefer using W3C standard event listener methods. The inline JavaScript code applied directly to an HTML tag is difficult to maintain. Assigning a method directly to an event is also difficult when passing parameters, as the method needs to be assigned for every event.

        + +

        JavaScript Priorities

        + +

        The rendering order of JavaScript code is based on the following rules:

        +
          +
        • JavaScript within the <head> element is temporarily saved, but not handled.
        • +
        • JavaScript within the <body> element is immediately handled when it is parsed.
        • +
        • When the temporarily saved JavaScript content is executed, the <head> element content is rendered first, and the <body> element content after it.
        • +
        + + +

        Using JavaScript Code within HTML

        + +

        To provide users with JavaScript-based features, you must learn to use JavaScript code within an HTML document:

        + +
          +
        • To use JavaScript code in the <head> element, place the relevant JavaScript content in a <script> tag: +
          +<head>
          +   <script src="js/jquery_1.9.0_min.js"></script>
          +   <script>       
          +      window.onload = function() 
          +      {
          +         testLog('head onload');
          +      };
          +
          +      $(document).ready(function() 
          +      {
          +         testLog('head ready');
          +      });
          +   </script>
          +</head>
          + +

          The JavaScript code within the <head> element is sent to Interpreter. As there are no methods to be handled immediately, its execution is suspended.

          +
        • +
        • To use JavaScript code in the <body> element, place the relevant JavaScript content in a <script> tag: +
          +<body>
          +   <script src="js/jquery_1.9.0_min.js"></script>
          +   <script>
          +      function testLog(txt) 
          +      {
          +         var logText = document.querySelector('.log');
          +         logText.innerHTML += '<li>JavaScript in HTML ' + txt + '</li>';
          +      };
          +    
          +      window.onload = function() 
          +      {
          +         testLog('body onload');
          +      };
          +
          +      $(document).ready(function() 
          +      {
          +         testLog('body ready');
          +      });
          +
          +      testLog('body');
          +
          +      (function() 
          +      {
          +         testLog('body anonymous function');
          +      }();
          +   </script>
          +</body>
          +
          +

          The JavaScript code within the <body> element is sent to Interpreter. The anonymous method is immediately executed, and the HTML DOM structure is set up. The methods in the $(document).ready method and in the onload event are executed in the stored order.

          +
        + + + + + + + + + + + +
        Note
        jQuery has to be called from both the <head> and <body> elements. The logText variable has to be called from the <body> element. The method connected to the onload event in the <head> element is not executed.
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/media_query_w.htm b/org.tizen.ui.practices/html/web/w3c/media_query_w.htm new file mode 100644 index 0000000..a8c6c41 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/media_query_w.htm @@ -0,0 +1,342 @@ + + + + + + + + + + + + + Media Queries: Labeling Output Devices in Style Sheets + + + + + +
        +

        Media Queries: Labeling Output Devices in Style Sheets

        + +

        Media queries allow you to apply the CSS differently according to the media type (type of device) and media features (viewport status). Previously, you were able to use the media type only and create Web services with fixed layouts. However, smart phones, tablets, and other devices with various resolutions require a liquid layout. HTML5 now makes various characteristics and conditional defining possible, and can be used to implement responsive Web design (RWD), which is a liquid layout that mainly reacts according to the device resolution.

        + +

        You can use media queries in 3 ways:

        + +
          +
        • In CSS +

          You can define attribute values depending on given conditions:

          +
          @media only screen and (max-width: 480px) {styles}
          +
          + + + + + + + + + +
          Note
          This approach is popular since it can reduce style overlapping; however, if all the styles are applied to 1 CSS, the maintenance work efficiency decreases.
          +
        • +
        • In an @import rule in CSS +

          You can import from CSS a file that matches the condition:

          +
          @import url(example.css) not screen and (min-width: 480px)
          +
          +
        • +
        • In HTML +

          You can directly import the CSS file that matches the condition:

          +
          <link rel="stylesheet" media="all and (max-width: 480px)" href="example.css">
          + + + + + + + + + +
          Note
          The disadvantage of this approach is that every time the condition is expanded, the HTML file must be edited. However, since this approach only imports the CSS files that match the condition, the file transmission amount can be reduced.
          +
        • +
        + +

        For more information on the CSS priorities when different media queries are used, see Media Query Priorities.

        + +

        Media Query Conditions

        + +

        You can define the following conditions for the media queries:

        + +
          +
        • Combination and relevancy +

          You can combine multiple conditions into 1 Boolean query with the and operator. To define a negative condition (something not being relevant), use the not operator.

          +
          @media not screen and (min-width: 320px), screen and (max-width: 480px) 
          +{
          +   .example: after {content: "width: 320px ~ 480px"}
          +}
          +
          +
        • +
        • Viewport width +

          You can define the query to match to a specific viewport width range using the min-width and max-width attributes.

          +
          @media all and (min-width: 320px) and (max-width: 480px) 
          +{
          +   .example: after {content: "width: 320px ~ 480px"}
          +}
          +
          +
        • +
        • Device and viewport height +

          The height attribute refers to restoring the viewport's height, and the device-height attribute refers to restoring the resolution set in the device.

          +

          The same difference applies to the width and aspect-ratio attributes, which can assign 'device-'.

          +
          @media screen and (min-device-height: 700px) 
          +{
          +   .example: after {content: "min-device-height"}
          +}
          +@media screen and (min-height: 550px) 
          +{
          +   .example: after {content: "min-height"}
          +}
          +
          +

          In the above example, a device with the width-height resolution of 480/720 has the {content: "min-height"} rule applied as a priority in a portrait screen, but the {content "min-device-height"} rule applied in a landscape screen.

          + +
        • +
        • Device aspect ratio +

          You can use the device-aspect-ratio attribute to check the width-length ratio (aspect ratio) of the printing device.

          +
          @media all and (device-aspect-ratio: 9/16) and (orientation: portrait),  
          +       all and (device-aspect-ratio: 2/3) and (orientation: portrait) 
          +{
          +   .example: after {content: "aspect-ratio, portrait"}
          +}
          +
          + + + + + + + + + +
          Note
          The device aspect ratio is a reliable way to distinguish the portrait and landscape modes of a smart phone. However, because the aspect ratio of all the devices has to be specified, a precise rule is hard to define. (Currently wildly used screen ratios are 15:9, 16:10, 16:9, 3:2, and 4:3, but devices with other screen ratios may be added in the future.)
          +
        • +
        + +

        Media Query Priorities

        + +

        When multiple media queries and conditions are defined, CSS is applied with the following priorities:

        +
          +
        • In case of the CSS reiteration declaration, the CSS that has been declared last is applied.
        • +
        • In case of specificity, the CSS with the highest specificity is applied. +

          The specificity is calculated as follows:

          • id attribute = 100
          • +
          • class attribute = 10
          • +
          • element = 1
          +

          Selectors, such as section#content > .title p, carry the specificity of 112.

        • +
        • In case of user override, the user CSS is applied instead of the creator CSS.
        • +
        • CSS is applied first based on the conditions in the @import rule, then based on the conditions in CSS, and finally based on the conditions in HTML.

        • +
        • In media queries, regardless of CSS priority, CSS which has not been imported still exists based on the conditions.

        • +
        + +

        To apply media query, consider an example with the following files:

        +
        +<!--example.html-->
        +<link rel="stylesheet" media="all and (max-width: 768px)" href="c.css">
        +<link rel="stylesheet" media="all and (max-width: 768px)" href="a.css">
        +<link rel="stylesheet" media="all and (min-width: 768px)" href="b.css">
        +<style>
        +   @media all and (max-width: 400px) 
        +   {
        +      .example: after {content: "In HTML head"}
        +   }
        +</style>
        +
        +<!--a.css-->
        +body {background-color: #ccc}
        +
        +@media screen and (max-width: 480px) 
        +{
        +   .example: after {content:"a.css : width: ~ 480px"}
        +}
        +@media screen and (min-width: 480px) and (max-width: 768px) 
        +{
        +   .example: after {content: "a.css : width: 480px ~ 768px"}
        +}
        +
        +<!--b.css-->
        +@import url("c.css");
        +
        +body {background-color: #333; color: #fff}
        +
        +@media screen and (min-width: 768px) and (max-width: 1024px) 
        +{
        +   .example: after {content: "b.css : width: 768px ~ 1024px"}
        +}
        +
        +<!--c.css-->
        +body {background-color: tomato}
        +
        +@media screen and (min-width: 768px) and (max-width: 1024px) 
        +{
        +   .example: after {content: "c.css : width: 768px ~ 1024px"}
        +}
        +@media screen and (min-width: 1024px) and (max-width: 1280px) 
        +{
        +   .example: after {content: "c.css : width: 1024px ~ 1280px"}
        +}
        +
        + +

        The CSS is applied based on the viewport:

        +
          +
        • If the viewport is 320 px: +
            +
          • The a.css file is applied (based on content: "a.css : width: ~ 480px").
          • +
          • The c.css and b.css files are not imported.
          • +
          • CSS is applied instead of the HTML <head> (the a.css file has higher priority than content: "In HTML head").
          • +
        • +
        • If the viewport is 700 px: +
          • The a.css file is applied (based on content: "a.css : width: 480px ~ 768px").

          • +
          • The c.css and b.css files are not imported.
        • +
        • If the viewport is 900 px: +
            +
          • The b.css file is imported.
          • +
          • c.css is applied (based on content: "c.css : width: 768px ~ 1024px").
          • +
          • The a.css file is not imported.
          • +
          • The b.css file is applied (based on content: "b.css : width: 768px ~ 1024px").
          • +
        • +
        + + +

        Creating a Liquid Layout

        +

        To enhance the user experience of your application, you must learn to define media queries to determine the styles to be used in the Web document. This example creates a simple Web document with a liquid layout that organically changes according to the device resolution to show the optimized layout on both portrait and landscape modes.

        + + +
          +
        1. Define a page with title and content elements: +
          +<header>
          +   <h1>Media queries tutorial</h1>
          +   <h1><img src="logo.png" alt="Tizen"></h1>
          +</header>
          +<div class="container">
          +   <section class="contents">
          +      <h2>Section Title</h2>
          +      <p class="desc">
          +         The quick brown fox jumps over a lazy dog.  The quick brown...
          +      </p>
          +   </section>
          +   <aside>
          +      Aside
          +   </aside>
          +</div>
          +
        2. +
        3. Define basic styles for the page, using a flexible box (in mobile or wearable applications) and multi-column (in mobile applications only) layout with 2 columns. (The following figure applies to mobile applications only.) +
          +.container 
          +{
          +   display: -webkit-flex;
          +}
          +.container aside 
          +{
          +   -webkit-flex: 1 0 20%;
          +}
          +.contents 
          +{
          +   -webkit-columns: 5em 3;
          +   -webkit-column-rule: 1px solid #999;
          +   -webkit-column-gap: 2em;
          +   -webkit-flex: 1 1 auto;
          +}
          +.contents h2 
          +{
          +   -webkit-column-span: all;
          +}
          +
          + +

          Fixed layout example (in mobile applications only)

          +

          The page is easy to view as long as the screen width is about 600 px; however, in a smaller screen below 400 px, the legibility rapidly decreases. You can edit the layout by reducing the number of columns to 1 and moving the Aside area at the bottom of the screen, but those changes then decrease legibility on a wider screen.

          + +
        4. +
        5. +

          To solve the problem, use a media query to define a liquid layout that changes according to the screen resolution:

          + +
          +@media all and (max-width: 480px) and (orientation: portrait) 
          +{
          +   .contents {-webkit-columns: 1;}
          +}
          +@media all and (min-width: 480px) and (max-width: 768px) 
          +{
          +   .contents {-webkit-columns: 2;}
          +   .container {display: -webkit-flex;}
          +}
          +
          +

          With the above media query, the normal resolution has 2 columns (shown on the right in the figure), while in a smaller resolution in a portrait mode only 1 column is used (shown on the left). (The following figure applies to mobile applications only.)

          +

          Liquid layout example (in mobile applications only)

          + +
        6. +
        7. If you need to define specific styles for a certain resolution range, simply add more media queries. However, too many conditions make the maintenance harder, so carefully consider what kind of resolution ranges you need. +

          + +

          The following conditions are generally used and cover all possibilities up to a Web browser in a PC:

          +
          +<!--Portrait mode of a smart phone-->
          +@media screen and (max-width: 480px) and (orientation: portrait) {<!--Specific layout-->}
          +
          +<!--Landscape mode of a smart phone and a small tablet-->
          +@media screen and (min-width: 480px) and (max-width: 768px) {<!--Specific layout-->}
          +
          +<!--Tablet and a small laptop-->
          +@media screen and (min-width: 768px) and (max-width: 1024px) {<!--Specific layout-->}
          +
          +<!--PC browser-->
          +@media screen and (min-width: 1024px) {<!--Specific layout-->}
          +@media print {<!--Specific layout-->}
          +
        8. + +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/multi_mw.htm b/org.tizen.ui.practices/html/web/w3c/multi_mw.htm new file mode 100644 index 0000000..0c5fc97 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/multi_mw.htm @@ -0,0 +1,611 @@ + + + + + + + + + + + + + CSS Multi-column Layout Module: Creating Multi-column Layouts + + + + + +
        +

        CSS Multi-column Layout Module: Creating Multi-column Layouts

        + + +

        You can arrange the screen content into columns. Using the CSS column- properties, the content elements can flow between columns when the column height or number changes. You can use the properties alone to create a basic layout, or add JavaScript code to make the layout dynamic.

        + +

        This feature is supported in mobile applications only.

        + +

        You can manage the following column-related features:

        + + + + + + + + + + + +
        Note
        Up to Tizen SDK version 2.2, most CSS properties and values used in Tizen required the -webkit- prefix. To ensure future compatibility, these properties can now be used with or without the prefix.
        + +

        Setting the Column Number and Width

        + +

        When the layout is set to a constant number of columns using the column-count (or -webkit-column-count) property, the column width is set to fill the available horizontal space.

        +

        In the following code snippet and figure, the column number is set to 4. As a result, on a 480 x 800 display (shown on the top), the column width is 116 px, whereas on a 720 x 1280 display (shown on the bottom), the column with is 143 px.

        +

        The following code snippet demonstrates how to use the column-count property. For a complete source code, see multi_column_column_count/renamed_index.html.

        +
        +article
        +{
        +   column-count: 4;
        +   -webkit-column-count: 4;
        +   margin: 10px;
        +}
        +
        + +

        Figure: 4 columns on different resolution displays

        +

        4 columns on different resolution displays

        + +

        The column-width (or -webkit-column-width) property sets the base column width.

        +

        In the following code snippet and figure, the column width is set to 153 px, but the effective column width is 288 px for a 480 x 800 display (shown on the left) and 154 px for a 720 x 1280 display (shown on the right). The parameter sets the column to at least the defined width, but not wider than the available display space or twice the defined width. The actual column width is calculated using a pseudo-algorithm.

        +

        The code snippet shows how the multi-column layout is implemented when the vertical space is limited. If there is more content than fits the available space, the next column is set outside the available space. Using the overflow: scroll property, the column can be scrolled horizontally.

        +

        The following code snippet demonstrates how to use the column-width property. For a complete source code, see multi_column_column_width/renamed_index.html.

        +
        +article
        +{
        +   width: 90vw;
        +   height: 90vh;
        +   column-width: 153px;
        +   -webkit-column-width: 153px;
        +   margin: 5vw;
        +   background: #c3c8ca;
        +   overflow: scroll;
        +}
        +
        + +

        Figure: Column width 153 px on different resolution displays

        +

        Column width 153 px on different resolution displays

        + +

        Setting the Column Gap

        +

        The column-gap (or -webkit-column-gap) property sets the distance between columns. The property affects the column width, as the column width, gap, and margins all take available space. In the following code snippet and figure, the column gap is set to 17 px.

        +

        The following code snippet demonstrates how to use the column-gap property. For a complete source code, see multi_column_column_gap/renamed_index.html.

        +
        +article 
        +{
        +   height: 303px;
        +   column-width: 153px;
        +   -webkit-column-width: 153px;
        +   column-gap: 17px;
        +   -webkit-column-gap: 17px;
        +   margin: 7px;
        +   padding: 3px;
        +   background: #c3c8ca;
        +}
        +
        + +

        Figure: Column gap

        +

        Column gap

        + +

        Setting the Column Rule

        +

        The column-rule (or -webkit-column-rule) property displays a vertical line in the middle of the column gap.

        +

        The rule has analogical parameters, such as width, line style, and color, but its size is not included in the available space, and it is a drawing similar to the background.

        + +

        Rules are only displayed in the content area. If the padding property is set in the same element, the rule appears shorter than the background. In the following code snippet and figure, the rule width is set to 5 px.

        +

        The following code snippet demonstrates how to use the column-rule property. For a complete source code, see multi_column_column_rule/renamed_index.html.

        +
        article 
        +{
        +   -webkit-column-rule-width: 5px;
        +   -webkit-column-rule-color: rgb(92, 203, 246);
        +   -webkit-column-rule-style: solid;
        +}
        +
        + +

        Figure: Column rule

        +

        Column rule

        + + + + + + + + + + +
        Note
        In Tizen SDK version 2.2, to avoid displaying the rules incorrectly, do not use the column-rule (or -webkit-column-rule) property with horizontal scrolling of the columns.
        + +

        Setting the Column Span

        +

        By default, all elements within the columns are no wider than the column width. The column-span (or -webkit-column-span) property can be used to display content across all columns.

        +

        When using this property with column elements which have the column-count or column-width property set, the following restrictions apply:

        +
          +
        • Column element height is not used and elements in columns take more vertical space than is set in height.
        • +
        • If the column element has the overflow property set to hidden, the column-span property is ignored.
        • +
        • An element using the column-span property does not have to be a direct child of the column element.
        • +
        +

        In the figure below, the blue arrow shows the order of the column elements. In the upper header area, the column-span property is not used, and in the lower header area, the column-span property is set to all, as in the following code snippet.

        +

        The following code snippet demonstrates how to use the column-span property. For a complete source code, see multi_column_column_span/renamed_index.html.

        +
        +article.left header 
        +{
        +   column-span: all;
        +   -webkit-column-span: all;
        +}
        +
        + +

        Figure: Column span

        +

        Column span

        + +

        Setting the Column Break

        +

        By default, column elements are broken to balance column height. The break-before (or -webkit-column-break-before), break-after (or -webkit-column-break-after), and break-inside (or -webkit-column-break-inside) properties can be used to define that an element cannot be broken between columns (set to avoid), or that an element must begin or end within a given column.

        + +

        The following code snippet and figure illustrate the use of the break- property. In the upper header area, the break- property is not used, and in the lower header area, the break-before property is set to always.

        +

        The following code snippet demonstrates how to use the column-break property. For a complete source code, see multi_column_column_break/renamed_index.html.

        +
        +article.lower section
        +{
        +   break-before: always;
        +   -webkit-column-break-before: always;
        +}
        +
        + +

        Figure: Column break

        +

        Column break

        + +

        Creating a Basic Layout

        + +

        To enhance the user experience of your application by providing a consistent behavior across a wide range of displays with different resolution and orientation, you must learn to create a basic layout using CSS:

        + +
          +
        1. +

          Create the HTML layout, defining separate sections for the column content and including an image file:

          +
          +<body>
          +   <article id="article">
          +      <section>
          +         <header>
          +            <h1>Section 1</h1>
          +         </header>
          +         <p>Lorem ipsum dolor (...), id.</p>
          +         <img src="images/pinwheel_green.png" alt="">
          +         <p>Maecenas at (...)tortor.</p>
          +      </section>
          +      <section>
          +         <header>
          +            <h1>Section 2</h1>
          +         </header>
          +         <img src="images/Tizen_Pinwheel_Secondary_Confetti.png" alt="">
          +         <p>Nullam bibendum (...) Curabitur.</p>
          +         <img src="images/Tizen_WhiteFold_4.png" alt="">
          +      </section>
          +      <section>
          +         <header>
          +            <h1>Section 3</h1>
          +         </header>
          +         <p>Sed sagittis, (...) Vivamus sed est sit amet.</p>
          +         <img id="figure" src="images/pinwheel_yellow.png" alt="">
          +         <p>Pellentesque habitant (...). Duis lobortis, nibh.</p>
          +      </section>
          +   </article>
          +</body>
          +
        2. + +
        3. Set the CSS column properties: +
            +
          1. +

            The article element acts as a multi-column container. Set the column-width (or -webkit-column-width) property to enable the multi-column layout:

            + +
            +article 
            +{
            +   width: 80vw;
            +   column-width: 119px;
            +   -webkit-column-width: 119px;
            +
            +   margin: 2vh 5vw;
            +   padding: 2vh 5vw;
            +   background: #c3c8ca;
            + +

            The column-width property defines the default column width but the visible width is not always similar. An algorithm calculates the width according to available space. Normally, a column has a different display width from the one set in the property because as the columns are sized to fill all available space.

            +

            For example, on a 480 x 800 display with portrait orientation, the device width is 123 px, whereas on a 720 x 1280 display with a landscape orientation, the width is 120 px. The space available for columns is the width attribute value reduced by padding, in this case 80vw - (2 * 5vw) = 70vw, which means 70/100 width of the device display.

            +
          2. +
          3. +

            Use the column-gap (or -webkit-column-gap) property to set the distance between columns:

            +
            +   column-gap: 10px;
            +   -webkit-column-gap: 10px;
            +
            +
          4. +
          5. + +

            Use the column-rule (or -webkit-column-rule) property to draw a vertical line between columns. Define the width, color, and style of the rule:

            + +
            +   -webkit-column-rule-width: 1px;
            +   -webkit-column-rule-color: #677784;
            +   -webkit-column-rule-style: solid;
            +   column-rule-width: 1px;
            +   column-rule-color: #677784;
            +   column-rule-style: solid;
            +}
            + +

            The rule width does not increase the distance between columns. It is drawn under the column gap and can be even wider than the gap.

            + +
          + +

          The figure below shows the layout with the column-rule width set to 40 px and the column-gap set to 10 px.

          + +

          Figure: Column settings

          +

          Column settings

          +
        4. +
        5. +

          Define the footer element with the display height set to 5/100 and padding set to 2 * 2vh:

          + +
          +footer 
          +{
          +   padding: 2vh;
          +   height: 5vh;
          +   background: rgba(103, 119, 132, 0.2);
          +}
          +
          +
        6. +
        7. +

          Define the section elements setting the border-bottom and vertical padding values. It is not necessary to define horizontal padding, as it has been defined for the article element.

          + +
          +article>section
          +{
          +   border-bottom: 1px solid #d8d9d4;
          +   padding: 4px 0;
          +   text-align: center;
          +}
          +
          +
        8. +
        9. +

          Set image elements to have an automatic margin to center them within the column.

          +

          In case of the image whose id attribute is set to figure, set it to be a floating element with text drawn around it.

          + +
          +img{
          +   display: block;
          +   margin: 4px auto;
          +}
          +
          +#figure
          +{
          +   float: right;	
          +   margin: 4px;
          +}
          +
          +
        + +

        The following figures illustrate the created layout in different display sizes and orientations.

        + +

        Figure: Basic layout on a 480 x 800 display

        +

        Basic layout on a 480 x 800 display

        + +

        Figure: Basic layout on a 720 x 1280 display

        +

        Basic layout on a 720 x 1280 display

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + +

        Creating a Layout with Dynamic Content

        + +

        To enhance the user experience of your application by providing a consistent behavior across a wide range of displays with different resolution and orientation, you must learn to create a layout displaying a varying amount of content using CSS:

        +
          +
        1. +

          Create the HTML layout. The article element displays the columns, and the nav element contains buttons to add and remove content in the columns.

          +
          +<body>
          +   <article id="article">
          +   </article>
          +   <nav>
          +      <a id="addSections" href="#">Add images</a> 
          +      <input type="number" id="howMany" value="3"> 
          +      <a id="removeGroup" href="#">Remove last Group</a>
          +   </nav>
          +   <footer> Multicolumn Layout Tutorial 02</footer>
          +</body>
          +
          +
        2. +
        3. Set the CSS properties: +
            +
          1. +

            Define the CSS display and column properties:

            +
            +body 
            +{
            +   display: flex;
            +   display: -webkit-flex;
            +   flex-direction: column;
            +   -webkit-flex-direction: column;
            +   background: #fefffa;
            +}
            +
            +
          2. +
          3. +

            Set the article, nav and footer elements in one column using the flexible box layout.

            +

            The nav element is also a flexible box layout container to set UI elements in.

            +
            +nav 
            +{
            +   height: 20vh;
            +   padding-left: 20%;
            +   padding-top: 10px;
            +   display: flex;
            +   display: -webkit-flex;
            +   flex-flow: row wrap;
            +   -webkit-flex-flow: row wrap;
            +   flex: none;
            +   -webkit-flex: none;
            +   justify-content: space-around;
            +   -webkit-justify-content: space-around;
            +   align-items: center;
            +   -webkit-align-items: center;
            +   background: url(../images/white_logo.png) no-repeat;
            +   background-position: 2%;
            +   background-size: auto 70%;
            +}
            +
            +
          4. +
          5. +

            Define the styles for the a elements within the nav element to make them appear as buttons:

            +
            +nav a 
            +{
            +   margin: 3px;
            +   border-radius: 5px;
            +   padding: 5px 15px;
            +   background: rgba(103, 119, 132, 0.2);
            +   text-align: center;
            +   font-weight: bold;
            +}
            +
            +

            When the user taps the Add images button, the images and their descriptions are displayed.

            +
          6. +
          7. +

            Define the input element (with the property type set to number) style with an increased height to match the buttons around it:

            +
            +nav input
            +{
            +   width: 50px;
            +   height: 2em;
            +}
            +
            +
          8. +
          9. +

            The article element contains the column properties. Use the -webkit-column-width property to set the column width. The real width is calculated based on available space.

            +
            +article 
            +{
            +   width: 90vw;
            +   column-width: 136px;
            +   -webkit-column-width: 136px;
            +   margin: 1vh 2vh;
            +   padding: 1vh;
            +   background: #c3c8ca;
            +}
            +
            +
          10. +
          11. +

            Set the images within the article element with a block display to separate them from text:

            +
            +article img 
            +{
            +   margin: 0 auto;
            +   display: block;
            +}
            +
            +
          12. +
          13. +

            Define the column-span property as all for the h1 elements:

            +
            +article>h1 
            +{
            +   background: rgba(103, 119, 132, 0.5);
            +   padding: 4px;
            +   text-align: center;
            +   color: #eed484;
            +   column-span: all;
            +   -webkit-column-span: all;
            +}
            +
            +

            As a result, the h1 elements are spread across the columns. When the column-span property is used, you cannot have more columns than can fit in the available horizontal space.

            +
          14. +
          15. +

            Define the break-inside property as avoid to avoid breaking elements between columns:

            +
            +article>section 
            +{
            +   break-inside: avoid;
            +   -webkit-column-break-inside: avoid;
            +   border-bottom: 1px solid #d8d9d4;
            +   padding: 4px 0;
            +   text-align: center;
            +}
            +
            +
          16. +
          17. +

            Set the footer size:

            +
            +footer 
            +{
            +   padding: 2vh;
            +   height: 5vh;
            +   background: rgba(103, 119, 132, 0.2);
            +}
            +
            +
          18. +
          +
        4. +
        5. Add the JavaScript code to make the content dynamic: +
            +
          1. +

            Declare a variable for the images. Elements included in the variable amount to data displayed in a column layout, such as a newsfeed:

            +
            +var images = ["images/pinwheel_green.png",
            +              "images/Tizen_Pinwheel_Secondary_Confetti.png", 
            +              "images/Tizen_WhiteFold_4.png", 
            +              "images/pinwheel_yellow.png"];
            +
            +
          2. +
          3. +

            Declare a variable for the input element for selecting the number of images added to the content:

            +
            +var howManyInput;
            +
            +
          4. +
          5. +

            Use the addGroup() method with the input parameter value to add random images to the column layout and initialize the button events:

            + +
            +window.onload = function() 
            +{
            +   addGroup(4);
            +   howManyInput = document.getElementById('howMany');
            +   var addBtn = document.getElementById('addSections');
            +   addBtn.onclick = function() 
            +   {
            +      addGroup(howManyInput.value);
            +
            +      return false;
            +   };
            +   var removeBtn = document.getElementById('removeGroup');
            +   removeBtn.onclick = function() 
            +   {
            +      removeGroup();
            +
            +      return false;
            +   };
            +};
            +
            +
          6. +
          7. +

            Declare the h1No variable containing the number of h1 elements included in the article elements, and one added to next lines.

            + +

            Declare the newHTML variable to add new content to the column layout. Each added element contains an h1 element as a header, and section elements. Include an img element with a text description in each section element to display a random image. The art variable is initialized, and new HTML code (newHTML) is concatenated with the existing one (innerHTML):

            +
            +function addGroup(howMany) 
            +{
            +   var h1No = document.querySelectorAll('article>h1').length + 1;
            +   var newHTML = "<h1>Group " + h1No + "</h1>";
            +   var i;
            +
            +   for (i = 0; i < howMany; ++i) 
            +   {
            +      newHTML += "<section><img alt='' src='";
            +      newHTML += images[Math.floor(Math.random() * 4)];
            +      newHTML += "'>Lorem ipsum dolor sit amet diam sodales rutrum.</section>";
            +   }
            +   var art = document.getElementById("article");
            +   art.innerHTML += newHTML;
            +}
            +
            +
          8. +
          9. +

            When the user taps the Remove last Group button, the removeGroup() method is called to remove the group of images that was added last. Use the all variable to select all h1 elements in the content using the querySelectorAll() method. If the last value is less than 0, there is no element to remove. Use the removeNextSibling() method to recursively delete the next sibling element, and the removeChild() method to remove the h1 elements from its parent.

            +
            +function removeGroup() 
            +{
            +   var all = document.querySelectorAll('article>h1');
            +   var last = all.length - 1;
            +   if (last < 0) 
            +   {
            +      return;
            +   }
            +   removeNextSibling(all[last].nextSibling);
            +   all[last].parentElement.removeChild(all[last]);
            +}
            +
            +
          10. +
          +
        +

        The following figures illustrate the created layout in different display sizes and orientations.

        + +

        Figure: Dynamic layout on a 480 x 800 display

        +

        Dynamic layout on a 480 x 800 display

        + +

        Figure: Dynamic layout on a 720 x 1280 display

        +

        Dynamic layout on a 720 x 1280 display

        +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/multiple_screens_mw.htm b/org.tizen.ui.practices/html/web/w3c/multiple_screens_mw.htm new file mode 100644 index 0000000..a6f9aa3 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/multiple_screens_mw.htm @@ -0,0 +1,372 @@ + + + + + + + + + + + + + Multiple Screen Support: Supporting Different Screen Sizes + + + + + +
        +

        Multiple Screen Support: Supporting Different Screen Sizes

        + +

        Tizen is available in various devices which support different screen sizes and resolutions. When developing Tizen Web applications, you must take this into account if you want your application to function well in various device models.

        + +

        This feature is supported in mobile applications only.

        + +

        Before implementing multiple screen support, make sure you are familiar with the key concepts of multiple screen support.

        +

        Tizen provides the UI scalability resolution feature, which allows you to create scalable applications.

        +

        To optimize images used in Web applications, images based on a single resource can be used in various resolutions.

        +

        Key Concepts

        +

        Before building a Web application for multiple resolutions, make sure you are familiar with the following W3C Web content scaling standards, which must be taken into account when developing Web applications:

        +
          +
        • Viewport meta tag
        • +
        • CSS media query
        • +
        +

        Viewport Meta Tag

        +

        A viewport defines the application area that displays the Web page content.

        +

        In a Web browser, the viewport size depends on the browser window size. If the viewport is smaller than the Web content size, horizontal and vertical scrollbars are displayed for page navigation. The Web browser viewport does not support the zoom feature. However, in a mobile Web browser, there are no window scrollbars and the viewport supports the zoom feature.

        +

        The viewport meta tag enables you to customize the viewport size and zoom levels in a majority of mobile Web browsers. Using this tag, you can set the width, height, initial scale, and scale range for Web pages.

        +

        To use the viewport meta tag while developing Web applications, you must note the following:

        +
          +
        • The device-height and device-width attributes defined in the viewport meta tag are not the same as the real device width and height in pixels.
        • +
        • Using the viewport meta tag, the Web browsers of different devices display the same content with different layout size and scale factor. The scale factor is calculated using the device pixel ratio (DPR).
        • +
        +

        CSS Media Query

        +

        The CSS media query enables you to set conditions for particular media features and types to apply different CSS files for the application content. For Web content scaling, you can use the CSS media query to, for example:

        +
          +
        • Define the image resource to be used based on the screen dots per inch (DPI) ratio.
        • +
        • Determine the CSS layout to be used based on the screen width.
        • +
        +

        +

        UI Scalability

        +

        With UI scalability, you can support multiple screen resolutions in a single Tizen Web application. Tizen automatically converts and translates the size and position values that are defined in the application's logical resolution to the physical resolution at runtime. The Tizen Advanced UI (TAU) uses the viewport meta tag to fit the Web page into the device screen, and the rem unit to determine the size of the Tizen Web UI components.

        +

        Setting the Viewport

        +

        Tizen devices support a variety of screen resolutions and dots per inch (DPI) values. If the viewport meta tag is not defined, TAU uses the default viewport width and scale factor. This ensures that Web content layout varies between different screen resolutions.

        +

        In the following example, the viewport width is set to device-width, which is determined by the width of the Tizen device. The device-width value is retrieved to set similar virtual DPI values and to display UI components with similar physical sizes across all devices. (TAU uses the example value by default, if no other viewport value is defined.)

        +
        <meta name="viewport"
        +      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
        +

        If the viewport width is set to device-width, the width and scale factor values are calculated by the Web browser. The following table shows different layout sizes and scale factors of the Tizen Web site (http://tizen.org) on different devices with the viewport width set to device-width.

        +
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
        + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        + Table: Layout size and scale factor +
        Device screen resolutionReal screen DPIDevice DPIWeb browser pageViewport widthScale factor
        720 x 1280306320captured screen1360 px2.0
        480 x 800218240captured screen2320 px1.5
        +

        Working with Tizen Web Winsets

        +

        The default sizes of Tizen Web winsets (such as Popup, Button, and Checkbox) are designed based on the reference viewport DPI of 160. Therefore, these winsets are of similar sizes on any Tizen device if the viewport width is set to device-width.

        +

        If you manually set the viewport width of your application to a fixed value, the Tizen Web winsets may not fit appropriately in the application. To avoid the problem, Tizen Web winsets use the rem unit for the winset length, which depends on the base font size of the winset. Each Tizen Web winset theme has its own base font size, and the <html> element font size is also set to the base font size. If the viewport width is set to a fixed value, this base font size is recalculated and set to the <html> element to adjust the Tizen Web winset sizes accurately.

        +

        Creating Applications Supporting Multiple Screens

        +

        To create an application that supports multiple screen sizes, you must consider the following while coding your application:

        +
          +
        • Configuring the viewport
        • +
        • Optimizing resources
        • +
        • Creating screen resolution-independent UI
        • +
        +

        Configuring the Viewport

        +

        To use UI scalability in your application, set the viewport meta tag while creating a Web application project in IDE. To configure the viewport in the Tizen Web applications, add the viewport meta tag in the <head> section of the index.html file:

        +
        <meta name="viewport"
        +      content="width=device-width, initial-scale=1.0,
        +               minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
        +

        Optimizing Resources

        +

        By default, the Tizen Advanced UI (TAU) consists of the HD Web winsets. The winset scale is lowered for lower screen resolution devices. To optimize resources for different screen resolutions and devices, use the CSS media query for different resolutions available in Tizen. You can use CSS media queries in the HTML or CSS files.

        +

        In the HTML file:

        +
        <link media="only screen and (min-resolution: 320dpi)"
        +      href="high-quality-images.css" type= "text/css" rel="stylesheet">
        +

        In the CSS file:

        +
        @media screen and (max-resolution: 159dpi)
        +{
        +   <!--Set styles-->
        +}
        +
        +@media screen and (min-resolution: 160dpi and max-resolution: 239dpi)
        +{
        +   <!--Set styles-->
        +}
        +
        +@media screen and (min-resolution: 240dpi and max-resolution: 319dpi)
        +{
        +   <!--Set styles-->
        +}
        +
        +@media screen and (min-resolution: 320dpi)
        +{
        +   <!--Set styles-->
        +}
        +
        +

        You can also set different layout and resources for the portrait and landscape views in the CSS file:

        +
        @media screen and (orientation: portrait)
        +{
        +   <!--Set styles-->
        +}
        +
        +@media screen and (orientation: landscape)
        +{
        +   <!--Set styles-->
        +}
        +
        +

        Creating Screen Resolution-independent UI

        +

        The Tizen base font size is 22 px. This base font size value varies based on the device screen resolution. However, to create a screen resolution-independent UI, the Web browser engine renders the base font size as a logical pixel size instead of a physical pixel size.

        +

        Image Resolution Optimization

        + +

        In Web applications, optimization of applications for various platforms (regarding devices, OS, and resolution) is efficient.

        +

        Media Queries and Flexible Box Layout can be used to create flexible layouts, and to build the deployable package easily.

        + +

        Images can be used in Web applications in the following ways:

        + +

        When selecting an option from the list above, consider the type of the image resource you are going to use.

        +

        You can use the following types of image resources:

        + +

        Photos

        +

        An image can be added to an application using the HTML img tag, or CSS background property as shown in the following example:

        +
        <!--HTML-->
        +<img src="images/sample.jpg" alt="sample image" />
        +
        +<!--CSS-->
        +.photo
        +{
        +   background: url(../images/sample.jpg) 0 0 no-repeat;
        +   background-size: 100%;
        +   width: 100%;
        +   height: 200px;
        +}
        +
        +

        In terms of performance, there is no difference between the options.

        + +

        The image color is expressed based on pixels. Therefore, the higher resolution an image has, the better it looks on a large screen. For full HD display, a resolution bigger than the image size displayed on the screen is needed. However, since a high resolution image tends to have a large size, limit the image size as to fit the maximum screen size:

        +
        • 1024 x 768 px: 90 KB
        • 300 x 200 px: 39 KB
        • 300 x 200 px: 15 KB
        +

        Current full HD displays have a resolution that is 1.5 to 2 times bigger than the actual screen size. The image quality is guaranteed if you size images as 2 times bigger than their original size.

        +
        img
        +{
        +   max-width: 100%;
        +}
        +
        + +

        Figure: Enlarging a low-resolution image

        +

        Enlarging a low-resolution image

        +

        Icons

        +

        Icons generally have a fixed size. Size icon images as 2 times bigger than their original size. Using the CSS3 background-size property, you can add an image with the size of, for example, 40 x 40 px, compressed as 20 x 20 px.

        +
        .prev_icon, .next_icon
        +{
        +   padding-left: 30px;
        +   height: 30px;
        +   line-height: 30px;
        +   font-size: 1.2em;
        +   background-repeat: no-repeat;
        +   background-position: 0 50%;
        +   background-size: auto 20px;
        +}
        +
        +.prev_icon.icon1
        +{
        +   background-image: url(../images/page_navi_arrow_left_01.png);
        +}
        +
        + +

        When multiple icons are used on a page, all the image files are called separately. This slows down the loading speed and causes a large number of network roundtrips, as illustrated in the figure below.

        + +

        Figure: Network speed when calling each image separately

        +

        Calling each of image separately

        + +

        You can use the sprite image technique (grouping multiple images as one and showing the only desired images defined with the background-position property) to noticeably reduce the page loading speed without any loss in quality of the image, as the following example shows. +

        +
        .prev_icon, .next_icon
        +{
        +   background-size: 20px auto; <!--Full HD Display-->
        +   background-image: url(../images/page_navi_arrow.png);
        +}
        +
        +.prev_icon.icon1
        +{
        +   background-position: 0 0;
        +}
        +
        +.prev_icon.icon2
        +{
        +   background-position: 0 -50px;
        +}
        +
        +

        Figure: Network speed when using sprite images

        +

        Network speed when using sprite image

        +

        Animated Images

        +

        Animated images can be created in various formats and with many tools, such as GIF, JavaScript, Canvas, and SVG.

        + +

        To create a simple and repetitive animation effect as below as effectively as possible, use GIF images, JavaScript, or the CSS3 animation attribute.

        +

        Figure: JAVA mascot character in GIF (source: http://lea.verou.me)

        +

        JAVA mascot character  in GIF


        + +

        Below, the network capacity usage and timeline using the following animation types are compared using the Web Inspector:

        + + +

        GIF Animation

        + +

        Using GIF animation, the resource usage is as follows:

        +
        • Events: Fires only the painting event
        • +
        • Memory: 3 ~ 4 MB
        • +
        • Network: 10 ~ 25 ms
        • +
        + +

        Figure: Events for a GIF image

        +

        Events


        +

        Figure: Memory usage of a GIF image

        +

        Memory


        +

        Figure: Network capacity usage of a GIF image

        +

        Network


        + +

        GIF animation can be created in various resolutions without quality loss, when you use the option introduced in Photos. This, however, increases memory occupancy.

        + +

        JavaScript Animation

        + +

        JavaScript animation is less affected by enlarging or reducing its screen size. However, it uses a lot of device resources compared to using CSS3 animations:

        +
        • +Events: Event is fired every 100 ms, the interval of setInterval().
        • +Memory: Increases in proportion to time, from the initial size 90 KB.
        • +Network: Used until the animation is stopped.
        +

        Figure: Events for a JavaScript animation

        +

        Events


        +

        Figure: Memory usage of a JavaScript animation

        +

        Memory


        +

        Figure: Network capacity usage of a JavaScript animation

        +

        Network


        +

        The following example shows how JavaScript animation can be implemented:

        +
        <script>
        +   var obj = document.querySelector(".animated img"), flag = 0;
        +   function animate()
        +   {
        +      obj.src = './images/sprite_' + ((flag++) % 10) + '.png';
        +   };
        +   setInterval(animate, 100);
        +</script>
        +
        + +

        You can use the requestAnimationFrame() method of the Timing control for script-based animations API to prevent animation freezes that occur occasionally:

        + +
        <script>
        +   var obj = document.querySelector(".animated img"), flag = 0, i = 0;
        +   function animate()
        +   {
        +      if (!(i % 6)) obj.src = './images/sprite_' + ((flag++) % 10) + '.png';
        +         i++;
        +      -webkit-RequestAnimationFrame(animate);
        +   };
        +   -webkit-RequestAnimationFrame(animate);
        +</script>
        +
        + +

        CSS3 Animation

        + +

        CSS3 animation has a low usage of events, memory, and network capacity. It is efficient for animations that have a fixed size. However, since CSS3 animation is pixel-based, it is difficult to use for animations that need to be enlarged or reduced, in which case JavaScript is a better option:

        +
        • +Events: Fires only rendering and painting events
        • +Memory: 50 ~ 90 KB
        • +Network: 9 ~ 21 ms
        + +

        Figure: Events for a CSS3 animation

        +

        Events


        +

        Figure: Memory usage of a CSS3 animation

        +

        Memory


        +

        Figure: Network capacity usage of a CSS3 animation

        +

        Network


        + +

        The following example shows how CSS3 animation can be implemented:

        +
        <style>
        +   .css_animation
        +   {
        +      width: 50px;
        +      height: 70px;
        +      background-image: url(../images/sprite.png);
        +      -webkit-animation: cssAni .8s steps(10) infinite;
        +   }
        +
        +   @-webkit-keyframes cssAni
        +   {
        +      from {background-position: 0px;}
        +      to {background-position: -500px;}
        +   }
        +</style>
        +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/selector_w.htm b/org.tizen.ui.practices/html/web/w3c/selector_w.htm new file mode 100644 index 0000000..6c4057c --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/selector_w.htm @@ -0,0 +1,214 @@ + + + + + + + + + + + + + Selectors API (Level 1 and 2): Selecting DOM Elements + + + + + +
        +

        Selectors API (Level 1 and 2): Selecting DOM Elements

        + +

        The selectors allow you to select element nodes in the DOM tree by matching them against a group of selectors, and testing whether the element matches a particular selector. Using selectors makes searching and selecting complex elements faster.

        + +

        You can use the querySelector() and querySelectorAll() methods to retrieve the element nodes. Both methods accept a single parameter, a string selector. The string selector is a selector or a group of selectors that can be surrounded by whitespace. If you use a selector group as the string selector with the querySelector() method, the method returns the first element (if any) that matches any of the selectors in the group.

        + +

        The main features of the Selectors API Level 1 and Level 2 include:

        + +

        You can also create an accordion menu.

        + +

        Selecting a Single Node

        +

        To enhance the user experience of your application, you must learn to use selectors to handle page elements, and to select a single node:

        +
          +
        1. To select the first matching element found in the child nodes, use the querySelector() method with CSS selectors. You get the same result as when using the getElementById(), getElementsByTagName(), and getElementsByClassName() methods. +
          var obj1 = document.getElementsByTagName('td')[0]; /* First <td> element in the document */
          +var obj2 = document.getElementById('foo'); /* Element with the ID #foo */
          +var obj3 = document.getElementsByClassName('bar')[0]; /* First element in the bar class */
          +  
          +var obj4 = document.querySelector('td'); /* Same as obj1 */
          +var obj5 = document.querySelector('#foo'); /* Same as obj2 */ 
          +var obj6 = document.querySelector('.bar'); /* Same as obj3 */
          +

          The querySelector() method returns the first matching element node within the subtrees of the context node. If no matching element is found, the method returns null.

        2. +
        3. You can use the CSS selectors to ensure that elements with complex structures can be easily selected. +

          For example, the following example selects the last element among the child nodes of the second <tr> element, which is a child of the <tbody> element in the second <table> element of the document.

          +
          var obj = document.querySelector('table:nth-child(2) tbody > tr:nth-child(2) :last-child');
        4. +
        5. You can use method chaining to select an element: +
          var obj = document.querySelector('table:nth-child(2)');
          +var targetObj = obj.querySelector('tbody > tr:nth-child(2) :last-child')
        6. +
        + +

        Figure: Single node selection (in mobile applications only)

        +

        Single node selection (in mobile applications only)

        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Selecting Multiple Nodes

        +

        To enhance the user experience of your application, you must learn to use selectors to handle page elements, and to select multiple nodes in a node list:

        +
          +
        1. Select an element in the node list using the querySelector() method: +
          var obj = document.querySelector('table:nth-child(2)');
          +

          The querySelector() method returns the first matching element node within the subtrees of the context node. If no matching element is found, the method returns null. The query above selects the second <table> element in the document as a single element.

          +
        2. + +
        3. Select multiple elements in the node list using the querySelectorAll() method, and define a variable to represent the length of the targetObj node list: +
          var targetObj = obj.querySelectorAll('thead th, tbody td');
          +var i = targetObj.length;
          +

          The querySelectorAll() method returns an array containing all of the matching element nodes within the subtrees of the context node, in the document order, and saves the elements in a node list. If there are no matching nodes, the method returns an empty array. The query above selects the <th> elements in the table head and the <td> elements in the table body.

          +
        4. +
        5. Apply a defined style to all elements stored in the targetObj node list: +
          while (0 < i) 
          +{
          +   i--;
          +   targetObj[i].style.backgroundColor = 'orange';
          +   targetObj[i].textContent = 'Exam 3' + i;
          +}
        + +

        Figure: Multiple node selection (in mobile applications only)

        +

        Multiple node selection (in mobile applications only)

        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Creating an Accordion Menu

        + +

        To enhance the user experience of your application, you must learn to retrieve element nodes from the DOM tree to create a simple accordion menu.

        +

        The accordion menu is created using the CSS3 Basic User Interface Module Level 3 API (in mobile or wearable applications). When a title is touched, the relevant content is shown, and other content is hidden.

        +
          +
        1. Create the HTML layout: +
          <ul class="accordion">
          +   <li>
          +      <p class="title current">Title 1<p>
          +      <div>contents 1</div>
          +   </li>
          +   <li>
          +      <p class="title">Title 2</p>
          +      <div>contents 2</div>
          +   </li>
          +   <!--Other list elements-->
          +</ul>
        2. + +
        3. Use CSS transitions to add sliding effects when content appears: +
          .accordion  > li  > div 
          +{
          +   padding: 0 15px;
          +
          +   <!--Assign time for CSS transformation-->
          +   -webkit-transition: all .5s;
          +   opacity: 0;
          +   height: 0;
          +   box-shadow: inset 1px 1px 4px rgba(0, 0, 0, .5);
          +   line-height: 2;
          +}
          +<!--Assign styles to be applied in case the current class is added to p.title-->
          +.accordion  > li  > p.current 
          +{
          +   background: -webkit-linear-gradient(top, #666, #000);
          +   color: #fff;
          +}
          +.accordion > li > p.current + div 
          +{
          +   opacity: 1;
          +   height: 200px;
          +}
        4. +
        5. Use the querySelector() and querySelectorAll() methods to change the class of the subject in the elements where the event is fired: +
          var testAccordion = function(obj) 
          +{
          +   var targetObj = document.querySelector(obj);
          +   var targetLength = document.querySelectorAll(obj + 'li').length;
          +
          +   /* In case the elements are not selected */
          +   if (targetLength <= 0) 
          +      return false;
          +
          +   targetObj.onclick = function(e) 
          +   {
          +      var that = e.target;
          +
          +      /* In case the e.target class is not title */
          +      if ((that.className !== 'title')) return false;
          +
          +      for (var i = 0; i < targetLength; i++) 
          +      {
          +         /* Change all classes of the 'li p' elements at the bottom of .accordion to title */
          +         targetObj.querySelectorAll('li p')[i].className = 'title';
          +      }
          +      /* Define the e.target class as current */
          +      that.className += 'current';
          +   }
          +}
          +
        6. +
        7. Define the elements that use the accordion menu: +
          testAccordion('.accordion');
        + +

        Figure: Accordion menu (in mobile applications only)

        +

        Accordion menu (in mobile applications only)

        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/session_history_w.htm b/org.tizen.ui.practices/html/web/w3c/session_history_w.htm new file mode 100644 index 0000000..f31132c --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/session_history_w.htm @@ -0,0 +1,204 @@ + + + + + + + + + + + + + HTML5 Session History: Managing the Device Browsing History + + + + + +
        + + +

        HTML5 Session History: Managing the Device Browsing History

        + +

        You can manage the session history of browsing contexts.

        +

        The history interface is used to save in the session history the page information that has been read by the user. You can also use the state object to directly store the page information which has already been analyzed in the URL, or general information which is not stored in the URL (such as location, or the scroll state of the page or a certain DOM element).

        + + +

        The main features of the HTML5 session history of browsing contexts API include:

        +
          +
        • Adding entries to the session history +

          You can use the pushState() method of the history interface to add an entry to the session history. With the replaceState() method, you can update the session history details. +

        • +
        • Detecting session history status changes +

          The popstate event is fired when the user navigates to a page stored in the session history. The popstate event +references the information stored with the pushState() or replaceState() methods, and enables you to change the status of the page based on the stored session history (such as moving focus to a certain DOM element).

          +
        • +
        + +

        Managing Session History Entries

        + +

        Learning how to manage the session history enhances the user browsing experience in your application:

        + +
          +
        1. To add an entry to the session history, use the pushState() method of the history interface: +
          +<script>
          +   history.pushState({index: currentIndex}, document.title);
          +</script>
          +
          + + + + + + + + + +
          Note
          The pushState() method accepts the data, title, and url (optional) parameters. The title parameter refers to the key value used to search for entries saved in the session history, and is currently ignored in all browsers.
          +
        2. + +
        3. To update the entry details, use the replaceState() method: +
          +<script>
          +   history.replaceState({index: currentIndex}, document.title, '#page' + currentIndex);
          +</script>
          +
          +

          The replaceState() method uses the same parameters as the pushState() method. The history_sample.html is the url parameter, which refers to the address of the page that is to be changed.

          +
        4. + +
        5. To use the session history information: +
            +
          1. Implement a page with the Prev and Next buttons: +
            +<nav class="paging">
            +   <a href="#">Prev</a>
            +   <a href="#">Next</a>
            +</nav>
            +<p>Current Index: <output> </output></p>
            +
            +<a href="http://tizen.org/">Tizen.org</a>
            +
            +
          2. +
          3. When the user clicks the buttons, the current index value (representing page numbers) is changed and stored in the state object of the history interface: +
            +var currentIndex = 0;
            +var prev = document.querySelector('.paging > a:nth-child(1)');
            +var next = document.querySelector('.paging > a:nth-child(2)');
            +
            +/* Prev button click event */ 
            +prev.onclick = function() 
            +{
            +   currentIndex -= 1;   
            +   setState(currentIndex);
            +    
            +   return false;
            +};
            +    
            +/* Next button click event */ 
            +next.onclick = function() 
            +{
            +   currentIndex += 1;  
            +   setState(currentIndex);
            +    
            +   return false;
            +};
            +
            +
          4. + +
          5. If the state object has data in it, use the replaceState() method to change the previously stored information. Otherwise, add new info with the pushState() method. +
            +function setState(currentIndex) 
            +{
            +   if (history.state) 
            +   {
            +      history.replaceState({index: currentIndex}, document.title, '#page' + currentIndex);
            +   } 
            +   else 
            +   {
            +      history.pushState({index: currentIndex}, document.title);
            +   }
            +   output.textContent = currentIndex;
            +}
            +
            +
          6. +
          +
        6. +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Detecting Session History Changes

        + +

        Learning how to track session history changes enhances the user browsing experience in your application:

        + +
        1. A page with data stored in the session history fires a popstate event when the page is loaded (for example, because it is refreshed or moved to from the previous page). +

          Register the event listener:

          + +
          +window.addEventListener("popstate", foo, false);
          +
        2. + +
        3. Define the event handler for the event. You can use the data stored in the state object to retrieve the correct location on the page to be loaded. +
          +var output = document.querySelector('output');
          +
          +window.onpopstate = function() 
          +{
          +   currentIndex = history.state.index;
          +   output.textContent = currentIndex;
          +}
          +
          +

          In the snippet above, when a popstate event is fired, it saves the index value stored in the state object to the currentIndex variable, and outputs the <output> element from the correct index location. +

          + +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + + + +
        + +Go to top + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/text_module_w.htm b/org.tizen.ui.practices/html/web/w3c/text_module_w.htm new file mode 100644 index 0000000..cdea394 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/text_module_w.htm @@ -0,0 +1,244 @@ + + + + + + + + + + + + + CSS Text Module (Level 3): Manipulating Text + + + + + + +
        +

        CSS Text Module (Level 3): Manipulating Text

        + +

        You can apply various text effects easily.

        + +

        The new text features in CSS Text Module Level 3 include:

        +
          + +
        • Text properties +

          You can use CSS text properties, such as text-transform, text-align, text-indent, letter-spacing, and word-spacing, to manipulate and transform text.

        • +
        + +

        Manipulating Text

        + +

        To enhance the user experience of your application, you must learn to handle line breaking, justification, alignment, white space handling, and text transformations using CSS text properties:

        + +
          +
        1. Define the text-transform property within a <style> element in the <head> section of the Web page to control the text capitalization: + +
          +<head>
          +   <style>
          +      p:nth-child(1) {text-transform: none;}
          +      p:nth-child(2) {text-transform: capitalize;}
          +      p:nth-child(3) {text-transform: uppercase;}
          +      p:nth-child(4) {text-transform: lowercase;}
          +      p:nth-child(5) {text-transform: full-width;}
          +   </style>
          +</head>
          +<body>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +</body>
          +
          + +
        2. + +
        3. Define the text-align property, which controls the text alignment: + +
          +<head>
          +   <style>
          +      p:nth-child(1) {text-align: start;}
          +      p:nth-child(2) {text-align: end;}
          +      p:nth-child(3) {text-align: left;}
          +      p:nth-child(4) {text-align: right;}
          +      p:nth-child(5) {text-align: center;}
          +      p:nth-child(6) {text-align: justify;}
          +   </style>
          +</head>
          +
          + +
        4. + +
        5. Define the text-indent property, which controls the text indentation: + +
          +<head>
          +   <style>
          +      p:nth-child(1) {text-indent: 0}
          +      p:nth-child(2) {text-indent: 1em}
          +      p:nth-child(3) {text-indent: -1em}
          +      p:nth-child(4) {text-indent: 5%}
          +      p:nth-child(5) {text-indent: -5%}
          +   </style>
          +</head>
          +
          + +
        6. + +
        7. Define the letter-spacing property, which controls the letter spacing: +
          +<head>
          +   <style>
          +      p:nth-child(1) {letter-spacing: .5em}
          +      p:nth-child(2) {letter-spacing: -.1em}
          +   </style>
          +</head>
          +
          + +
        8. + +
        9. Define the word-spacing property, which controls the space between words: +
          +<head>
          +   <style>
          +      p:nth-child(1) {word-spacing: 1em}
          +      p:nth-child(2) {word-spacing: -.1em}
          +   </style>
          +</head>
          +
          + +
        10. + +
        11. Define the word-break property, which determines the line breaking rules for non-CJK (Chinese, Japanese, and Korean) scripts: +
          +<head>
          +   <style>
          +      p:nth-child(1) {word-break: normal}
          +      p:nth-child(2) {word-break: keep-all}
          +      p:nth-child(3) {word-break: break-all}
          +   </style>
          +</head>
          +
          + +
        12. + +
        13. Define the white-space property, which determines the handling of empty space within an element: +
          +<head>
          +   <style>
          +      p:nth-child(1) {white-space: normal}
          +      p:nth-child(2) {white-space: pre}
          +      p:nth-child(3) {white-space: nowrap}
          +      p:nth-child(4) {white-space: pre-wrap}
          +      p:nth-child(5) {white-space: pre-line}
          +   </style>
          +</head>
          +<body>
          +   <p>The quick brown fox jumps
          +   over a lazy dog.</p>
          +   <p>The quick brown fox jumps
          +   over a lazy dog.</p>
          +   <p>The quick brown fox jumps
          +   over a lazy dog.</p>
          +   <p>The quick brown fox jumps
          +   over a lazy dog.</p>
          +   <p>The quick brown fox jumps
          +   over a lazy dog.</p>
          +</body>
          +</html>
          +
          + +
        14. + +
        15. Define the text-shadow property, which adds a shadow effect to text: +
          +<head>
          +   <style>
          +      p:nth-child(1) {text-shadow: 0.1em 0.1em 0.2em rgba(0, 0, 0, .7)}
          +      p:nth-child(2) {text-shadow: -0.2em 0.2em 0.2em #000, 0.2em -0.2em 0.2em #f00}
          +      p:nth-child(3) {color: #fff; text-shadow: 0 0 .7em #000;}
          +      p:nth-child(4) {color: #fff; text-shadow: 0 0 1px #f00;}
          +   </style>
          +</head>
          +
          + +
        16. + +
        17. Define the word-wrap and overflow-wrap properties, which control forced line breaks when the length of a word is longer than the area where it is displayed: +
          +<head>
          +   <style>
          +      p:nth-child(1) {word-wrap: normal}
          +      p:nth-child(2) {word-wrap: break-word}
          +      p:nth-child(3) {overflow-wrap: normal}
          +      p:nth-child(4) {overflow-wrap: break-word}
          +   </style>
          +</head>
          +<body>
          +   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
          +   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
          +   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
          +   <p>The quick brown foxxxxxxxxxxxxxxxxxxxxxxxx jumps over a lazy dog.</p>
          +</body>
          +
          + +
        18. + +
        + + +

        The following figure shows examples of manipulating the text properties.

        +

        Figure: Text properties (in mobile applications only)

        +

        Text properties (in mobile applications only)

        + + + + + + + + + + +
        Note
        For a complete list of CSS Text Module Level 3 text properties (in mobile or wearable applications) and their possible values, see the Property index.
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/transform_w.htm b/org.tizen.ui.practices/html/web/w3c/transform_w.htm new file mode 100644 index 0000000..4bc2dba --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/transform_w.htm @@ -0,0 +1,772 @@ + + + + + + + + + + + + + CSS Transforms: Manipulating Elements + + + + + + +
        +

        CSS Transforms: Manipulating Elements

        + +

        Transforms allow you to modify the coordinate space where each element is positioned. The elements can be translated, rotated, and scaled in 2- or 3-dimensional space. According to the API, the coordinate system is a visual formatting model, and positions and sizes in the coordinate space are expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

        + +

        To enhance the rendering performance and user experience, you can use hardware acceleration and create fade effects.

        + +

        When using the CSS transform properties, the Tizen browser requires no prefix, the Firefox browser requires the -moz- prefix, the Chrome and Safari browsers require the -webkit- prefix, and the Opera browser requires the -o- prefix.

        + +

        Transform Properties

        + +

        You can define various properties to control the elements within the coordinate space:

        + +
          +
        • transform-origin +

          This property changes the location of the transformed element. It can only be used with elements for whom the transform property has been declared.

        • + +
        • transform-style +

          This property defines the rendering of the inherited element in the 3D space. Animation property has been added in the example for easier comprehension.

        • + +
        • perspective +

          This property changes the perspective of the element being expressed. A 3D transform element must be used together with this property to emphasize the expression of the X axis.

        • + +
        • perspective-origin +

          This property defines the location facing the element.

        • +
        • backface-visibility +

          This property defines whether the backface of the transformed element is expressed.

        • +
        + +
        +<head>
        +   <style type="text/css">
        +      .box 
        +      {
        +         transform: rotate(30deg);
        +         transform-origin: 30% 30%;
        +         perspective: 220;
        +         animation: trans-ani 10s infinite linear;
        +         backface-visibility: visible;
        +
        +         /* Chrome and Safari browsers */
        +         -webkit-transform: rotate(30deg);
        +         -webkit-transform-origin: 30% 30%;
        +         -webkit-perspective: 220;
        +         -webkit-animation: trans-ani 10s infinite linear;
        +         -webkit-backface-visibility: visible;
        +      }
        +      .box.case01 
        +      {
        +         transform-style: preserve-3d;
        +         perspective-origin: 30% 30%;
        +
        +         /* Chrome and Safari browsers */
        +         -webkit-transform-style: preserve-3d;
        +         -webkit-perspective-origin: 30% 30%;
        +      }
        +   </style>
        +</head>
        +<body>
        +   <h1>transform-origin</h1>
        +   <div class="boxarea">
        +      <div class="box">
        +         <p>transform</p>
        +         <p>transform-origin: 30% 30%;</p>
        +      </div>
        +      <div class="box case01">
        +         <p>box</p>
        +      </div>
        +   </div>
        +</body>
        +
        + +

        In addition to transform properties, you can also use various 2D and 3D transform functions.

        + +

        2D and 3D Transform Functions

        + +

        The CSS Transforms API supports various transform functions in 2D and 3D.

        + +

        In 2D transforms, all transform functions are expressed based on a matrix. The X and Y values of the translate(), scale(), and skew() functions can be expressed in individual functions. For example, the X and Y values of the translate() function can be expressed with the translateX(number) and translateY(number) functions.

        + +
        +<head>
        +   <style type="text/css">
        +      .box-translate 
        +      {
        +         transform: translate(30px, 30px);
        +         -webkit-transform: translate(30px, 30px);
        +      }
        +
        +      .box-scale 
        +      {
        +         transform: scale(1.2, 1.2);
        +         -webkit-transform: scale(1.2, 1.2);
        +      }
        +
        +      .box-rotate 
        +      {
        +         transform: rotate(45deg);
        +         -webkit-transform: rotate(45deg);
        +      }
        +
        +      .box-skew 
        +      {
        +         transform: skew(20deg, 20deg);
        +         -webkit-transform: skew(20deg, 20deg);
        +      }
        +
        +      .box-matrix 
        +      {
        +         transform: matrix(0.8, 0.5, 0.9, 0.9, 0, 0);
        +         -webkit-transform: matrix(0.8, 0.5, 0.9, 0.9, 0, 0);
        +      }
        +   </style>
        +</head>
        +<body>
        +   <h1>2d transform</h1>
        +   <h2>translate</h2>
        +   <div class="boxarea">
        +      <div class="box no-transform">
        +         <p>Original</p>
        +      </div>
        +      <div class="box transformed box-translate">
        +         <p>transform</p>
        +         <p>transform: translate(30px, 30px);</p>
        +      </div>
        +   </div>
        +</body>
        +
        + +

        In 3D transforms, the Z axis has been added (for example, translateZ(number) and scale3dZ(number)). When handling 3D transforms, pay attention to the following:

        +
          +
        • If a transform function is used together with the perspective property, the z axis is emphasized.
        • +
        • The X, Y, and Z values of the translate3d(), scale3d(), and rotate3d() functions can be expressed in individual functions.
        • +
        • In the rotate3d(number, number, number, angle) function, the element rotates according to the assigned parameter (angle) with the X, Y, and Z directional vectors as the center. Each vector can be expressed as an individual function: for example, the rotateX(<angle>) and rotate3d(1, 0, 0, <angle>) functions perform the same task.
        • +
        +

        The following code snippet demonstrates how to implement a 3D transform. For a complete source code, see 3d_transform.html.

        +
        +<head>
        +   <style type="text/css">
        +      .first-transform {opacity: .5; background: #3399cc;}
        +      .transformed {opacity: .8;}
        +      /* translate3d */
        +      .box-translate3d: hover .first-transform 
        +      {
        +         transform: translate3d(-5px, -5px, -60px) rotateY(70deg);
        +         -webkit-transform: translate3d(-5px, -5px, -60px) rotateY(70deg);
        +      }
        +      .box-translate3d: hover .transformed 
        +      {
        +         transform: translate3d(15px, 15px, 60px) rotateY(70deg);
        +         -webkit-transform: translate3d(15px, 15px, 60px) rotateY(70deg);
        +      }
        +      /* scale3d */
        +      .box-scale3d: hover .first-transform 
        +      {
        +         transform: scale3d(1, 1, 1) rotateY(70deg);
        +         -webkit-transform: scale3d(1, 1, 1) rotateY(70deg);
        +      }
        +      .box-scale3d: hover .transformed 
        +      {
        +         transform: scale3d(0.6, 0.6, 2) rotateY(70deg);
        +         -webkit-transform: scale3d(0.6, 0.6, 2) rotateY(70deg);
        +      }
        +      /* rotate3d */
        +      .box-rotate3d: hover .first-transform 
        +      {
        +         transform: rotate3d(-1, -1, -1, 110deg);
        +         -webkit-transform: rotate3d(-1, -1, -1, 110deg);
        +      }
        +      .box-rotate3d: hover .transformed 
        +      {
        +         transform: rotate3d(1, 1, 1, 110deg);
        +         -webkit-transform: rotate3d(1, 1, 1, 110deg);
        +      }
        +      /* matrix3d */
        +      .box-matrix3d: hover .first-transform 
        +      {
        +         transform: matrix3d(0.3, 0.2, -0.9, 0, 0.2, 0.8, 0.2, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 1);
        +         -webkit-transform: matrix3d(0.3, 0.2, -0.9, 0, 0.2, 0.8, 0.2, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 1);
        +      }
        +      .box-matrix3d: hover .transformed 
        +      {
        +         transform: matrix3d(0.4, -0.5, 0.8, 0, 0.2, 0.8, 0.2, 0, -0.6, 0, 0.4, 0, 0, 0, 0, 1);
        +         -webkit-transform: matrix3d(0.4, -0.5, 0.8, 0, 0.2, 0.8, 0.2, 0, -0.6, 0, 0.4, 0, 0, 0, 0, 1);
        +      }
        +   </style>
        +</head>
        +<body>
        +   <h1>3D transform</h1>
        +   <h2></h2>
        +   <p><strong>First box value:</strong> transform: translate3d(-5px, -5px, -60px) rotateY(70deg);</p>
        +   <p><strong>Second box value:</strong> transform: translate3d(15px, 15px, 60px) rotateY(70deg);</p>
        +   <div class="boxarea box-translate3d">
        +      <div class="box first-transform">
        +         First box
        +      </div>
        +      <div class="box transformed">
        +         <p>Second Box</p>
        +         Mouse over or tab here to animate
        +      </div>
        +   </div>
        +</body>
        +
        + + +

        Creating an Animation with Transforms

        + +

        To enhance the user experience of your application, you must learn to use transforms with animations. This example uses the animation from the Creating a Logo Animation use case as a basis, and adds a more diverse visual effect to it with the transform property. In the modified animation:

        + +
          +
        • As in the original animation, no elements are initially shown on the screen.
        • +
        • The Tizen logo gradually appears in the middle of the screen, and as it moves to the right, it becomes smaller. With the transform property, the logo is made to rotate.
        • +
        • Each letter in the word "TIZEN" consecutively comes in from the left of the screen and moves to the right to its correct location. With the transform property, the letters are translated in the 3D space and rotated around the Y axis.
        • +
        + +

        Figure: Tizen logo to be transformed

        +

        Tizen logo to be transformed

        + + +
          +
        1. Create the HTML layout to control the movement of each individual animation element: +
          +<div class="animation-holder">
          +   <span class="tizen-txt t"></span>
          +   <span class="tizen-txt i"></span>
          +   <span class="tizen-txt z"></span>
          +   <span class="tizen-txt e"></span>
          +   <span class="tizen-txt n"></span>
          +   <span class="tizen-txt tm"></span>
          +   <span class="tizen-logo"></span>
          +</div>
          +
          +
        2. +
        3. Define the basic style of the animation elements. Add the perspective property to increase the Z axis effect of the 3D transform. +
          +.animation-holder 
          +{
          +   -webkit-perspective: 1000px;
          +   height: 88px;
          +   left: 50%;
          +   margin: -54px 0px 0px -140px;
          +   position: absolute;
          +   top: 50%;
          +   width: 280px;
          +}
          +.tizen-txt,
          +.tizen-logo 
          +{
          +   background-position: 50% 50%;
          +   background-repeat: no-repeat;
          +   display: block;
          +   position: absolute;
          +}
          +.tizen-txt.t 
          +{
          +   background-image: url("images/txt_t.png");
          +   height: 56px;
          +   left: 0px;
          +   top: 31px;
          +   width: 48px;
          +}
          +
          +
        4. +
        5. Create the animation: +
            +
          1. +

            Assign keyframes for the logo element to transform it. In order to rotate the logo, use the -webkit-transform: rotate() function, which defines the angle of the rotation. +

            +
            +@-webkit-keyframes tizen-logo 
            +{
            +   0% 
            +   {
            +      -webkit-animation-timing-function: ease-in;
            +      height: 211px;
            +      left: 30px;
            +      opacity: 0;
            +      top: -61px;
            +      -webkit-transform: rotate(0deg);
            +      width: 220px;
            +   }
            +   30% 
            +   {
            +      -webkit-animation-timing-function: ease-out;
            +      height: 211px;
            +      left: 30px;
            +      opacity: 1;
            +      top: -61px;
            +      -webkit-transform: rotate(720deg);
            +      width: 220px;
            +   }
            +   50% 
            +   {
            +      height: 32px;
            +      left: 247px;
            +      opacity: 1;
            +      top: 0;
            +      -webkit-transform: rotate(1440deg);
            +      width: 33px;
            +   }
            +   100% 
            +   {
            +      height: 32px;
            +      left: 247px;
            +      opacity: 1;
            +      top: 0;
            +      -webkit-transform: rotate(1440deg);
            +      width: 33px;
            +   }
            +}
            +
            + + + + + + + + + +
            Note
            For a rotation, the image has to be carefully created to ensure the correct end result. The rotation occurs with the center of the element as the center. If the rotation center must be moved because the image center is not aligned, use the transform-origin property to adjust the rotation location.
          2. +
          3. Create the keyframes for the first letter in the word "TIZEN". In the animation, due to the translate3d() and rotateY() methods, each letter transforms slightly from the right to the left as it comes in. + +

            Animation

            + +
            +@-webkit-keyframes tizen-txt-t 
            +{
            +   0% 
            +   {
            +      opacity: 0;
            +      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
            +   }
            +   30% 
            +   {
            +      opacity: 0;
            +      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
            +   }
            +   35% 
            +   {
            +      opacity: 1;
            +      -webkit-transform: translate3d(0, 0, 0) rotateY(0deg);
            +   }
            +   100% {}
            +}
            +
          4. +
          5. To emphasize the fact that the letters are being created on the right, change the location of the transform. If the transform-origin property is declared for the entire animation element, the logo rotation changes. Consequently, you must only declared it for the letters. +
            +.tizen-txt 
            +{
            +   -webkit-transform-origin: 100% 50%;
            +}
            +
          6. + +
          7. Create the keyframes for the other letters similarly:

            +
            +@-webkit-keyframes tizen-txt-i 
            +{
            +   0% 
            +   {
            +      opacity: 0;
            +      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
            +   }
            +   32% 
            +   {
            +      opacity: 0;
            +      -webkit-transform: translate3d(20px, 0, -200px) rotateY(90deg);
            +   }
            +   37% 
            +   {
            +      opacity: 1;
            +      -webkit-transform: translateX(0) rotateY(0deg);
            +   }
            +    100% {}
            +}
            +
          + +
        6. +
        + +

        The following figure shows the full Tizen logo animation with the transform properties.

        +

        Figure: Full Tizen logo animation

        +

        Full Tizen logo animation

        + +

        Source Code

        +

        For the complete source code related to this use case, see the following files:

        + + +

        Creating Fade Animation Effects

        + + +

        To enhance the user experience of your application, you must learn to use fade animation effects.

        +

        The modal layer pop-up can be used to, for example, show enlarged thumbnail images or notice messages. The modal layer pop-up has the following basic properties:

        +
          +
        • If an event is fired, it gradually becomes visible. This is known as the Fade In effect.
        • +
        • The existing background is covered with a translucent layer to make the user focus on the pop-up.
        • +
        • When the pop-up is closed, it gradually becomes transparent. This is known as the Fade Out effect.
        • +
        + +

        Figure: Fade effect

        +

        Fade effect

        + +

        You can control UI events and change the DOM elements in the following ways:

        +
          +
        • Events can be controlled with JavaScript, and DOM elements can be devised with CSS.
        • +
        • You can use JavaScript frameworks, such as jQuery, Prototype, and Dojo.
        • +
        + +

        To create fade effects:

        + +
          +
        • Create a modal layer pop-up using jQuery: + +
          +(function($) 
          +{
          +   function showModalPopup(url) 
          +   {
          +      $('body').append('<div class="mask"></div>'); /* Mask in body appended */
          +      $('.mask').css({'height': $(window).height()}); /* Mask area set */
          +
          +      /* Target layer position set */
          +      $(url).css(
          +      {
          +         'top': ($(window).height()/2 + $(document).scrollTop() - $(url).height()/2) + 'px', 
          +         'left': ($(window).width()/2 + $(document).scrollLeft() - $(url).width()/2) + 'px'
          +      });
          +
          +      /* Fade effect */
          +      $('.mask').fadeTo('slow', 0.7);
          +      $(url).fadeTo('slow', 1);
          +   };
          +
          +   $('.layerpopupActive a').on('click', function()
          +   {
          +      var targetUrl = $(this).attr('href');
          +
          +      showModalPopup(targetUrl);
          +
          +      return false;
          +   });
          +  
          +   /* End processing - Fade Out effect */
          +    
          +   $('body').on('click', function(e) 
          +   {
          +      if (e.target.className === 'mask') 
          +      {
          +         $('.layerpop').fadeOut();
          +         $('.mask').fadeOut(400, function() 
          +         {
          +            $('.mask').remove();
          +         });
          +      };
          +   });
          +})(jQuery);
          + +

          If the animation effect is created by using JavaScript, the browser executes the following tasks:

          +
            +
          1. A structure layer is created and added to the document. This is a CPU task.
          2. +
          3. The added layer is painted as a default value. This is a GPU task.
          4. +
          5. The layer is painted once again according to the change of value. This is a CPU operation.
          6. +
          + +

          Steps a and c incur CPU tasks, which affect performance the most.

          +

          In case of step a, only 2 layers are created, but as the number of layers created increases, the efficiency of page rendering work drops. In case of step c as well, the more steps it undergoes, the slower the rendering becomes.

          +

          In certain browsers, even if the style of just 1 layer is changed, the entire document is repainted. As the repainting takes only a moment, any animation effects that are supposed to happen cannot be executed in such a short time. This issue occurs frequently in Android™ with severe fragmentation.

          + + + + + + + + + + +
          Note
          If a new layer is created in Android 4.0X version, and if the fade effect is used, it only shows the initial value and the result value of the layer style.
          + +

          To avoid such a situation to the maximum possible extent, CPU tasks must be reduced to the minimum, and it is better to use transition or animation that uses the internal timer of the browser.

          + + + + + + + + + + +
          Note
          In case of using 3D effects, -webkit-transform: translateZ(0); can be used to accelerate the hardware. However, since hardware acceleration support varies between the OS and devices, the actual resulting effects can vary too. Moreover, in the case of version Android™ 2.1, iOS™3.X and below, note that transition and animation may not be realized.
          +
        • +
        • Create a modal layer pop-up using CSS3: +
          +<!--CSS-->
          +.mask 
          +{
          +   opacity: 0;
          +   z-index: -1;
          +   -webkit-transition: all 400ms ease-in-out;
          +}
          +
          +.mask.active 
          +{
          +   opacity: .7;
          +   z-index: 498;
          +}
          +
          +<!--Layer pop-up public styles-->
          +.layerpop 
          +{
          +   opacity: 0;
          +   z-index: -1;
          +   -webkit-transition: all 300ms ease-in-out;
          +}
          +
          +.layerpop.active 
          +{
          +   opacity: 1;
          +   z-index: 499;
          +}
          +/* JavaScript */
          +function showModalPopup(url) 
          +{
          +   url.className += 'active';
          +}
          +
        • +
        +

        Performance Differences

        + +

        There can be a difference in performance depending on how the modal layer pop-up is used.

        +

        The following figures illustrate the difference in event performance, when using JavaScript and CSS3.

        +

        Figure: Event performance using JavaScript

        +

        Events using JavaScript

        + +

        Figure: Event performance using CSS3

        +

        Events using CSS3

        + +

        The following figures illustrate the difference in memory performance, when using JavaScript and CSS3.

        +

        Figure: Memory performance using JavaScript

        +

        Memory when using JavaScript

        + +

        Figure: Memory performance using CSS3

        +

        Memory when using CSS3

        + +

        When the styles are applied using JavaScript, the UI thread is used to create the pop-up. The UI thread increases the usage of CPU memory in proportion to the number of pop-ups used.

        + + + + + + + + + + +
        Note
        Tizen provides remote debugging through the JavaScript Debugger tool.
        + + + + + + + + + + +
        Note

        If CSS is used, the handling of JavaScript events and UI DOM operations becomes unnecessary, so the load of the UI thread decreases, and the usage of CPU memory decreases as well. However, CSS3 transitions cannot be applied to versions below Android™ 2.3 and for versions above iOS™ 4.3, which are still widely used, so attention is needed when distributing it to various devices.

        + +

        Using Hardware Acceleration

        + +

        The rendering performance of a Web application depends on both the Tizen platform and application design.

        +

        In hardware acceleration, GPU is used to perform a function faster than is possible if the application is running on the CPU. It enhances the rendering performance in the dynamic objects used in Web applications.

        + +

        Using CSS Transition and 3D Transform

        +

        To improve the rendering performance, separate moving elements to independent layers as much as possible. You can use CSS transition with the -webkit-transition CSS attribute, or 3D transform with the -webkit-transform attribute. For the best performance, set the -webkit-transform attribute to the 3D type.

        +

        In all the following examples, a blue box moves from top left to bottom right for a second.

        +

        Figure: Blue box

        +

        Blue box

        + +
          +
        • Use CPU painting: +

          JavaScript performs CPU painting for a moving element for each frame at 16 ms interval using the setTimeout() method over the changing top-left coordinate. This approach does not use hardware acceleration, but only running on the CPU.

          +
            +
          1. Construct the blue box and set its position on the screen: +
            <!DOCTYPE html>
            +<html xmlns="http://www.w3.org/1999/xhtml">
            +   <head>
            +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            +      <title>JavaScript transition sample</title>
            +      <style>
            +         #box 
            +         {
            +            position: absolute;
            +            width: 100px;
            +            height: 100px;
            +            background-color: blue;
            +            left: 0px;
            +            top: 50px;
            +         }
            +      </style>
            +
          2. +
          3. +

            Perform CPU painting for a moving element at a rate of 1 frame per 16 ms (62.5 frames per second) using the setTimeout() method:

            +
                  <script>
            +         var delta = 0;
            +         function startTransition() 
            +         {
            +            process();
            +         }
            +         function process ()
            +         {
            +            document.getElementById('box').style.left = delta + "px";
            +            document.getElementById('box').style.top = delta + 50 + "px";
            +            delta += 4;
            +            if (delta <= 200)
            +               setTimeout(function() {process();}, 16);
            +         }
            +      </script>
            +   </head>
            +   <body>
            +      <div id='box' onclick='startTransition()'>click me!</div>
            +   </body>
            +</html>
        • +
        • Use CSS transition: +

          Separate a moving element to an independent layer with the -webkit-transition CSS attribute. This approach uses hardware acceleration, and can enhance performance while an element is moving.

          +
          <!DOCTYPE html>
          +<html xmlns="http://www.w3.org/1999/xhtml">
          +   <head>
          +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          +      <title>-webkit-transition sample</title>
          +      <style>
          +         #box 
          +         {
          +            position: absolute;
          +            width: 100px;
          +            height: 100px;
          +            left: 0px;
          +            top: 50px;
          +            background-color: blue;
          +            -webkit-transition-duration: 1s;
          +            -webkit-transition-timing-function: linear;
          +         }
          +      </style>
          +      <script>
          +         function startTransition()
          +         {
          +            document.getElementById('box').style.webkitTransform = "translate(200px, 200px)";
          +         }
          +      </script>
          +   </head>
          +   <body>
          +      <div id='box' onclick='startTransition()'>click me!</div>
          +   </body>
          +</html>
          +
        • +
        • Use 3D transform: +

          Use the -webkit-transform: translate3d 3D transform attribute. The element is separated to an independent layer and uses hardware acceleration irrespective of its movement:

          +
          <!DOCTYPE html>
          +<html xmlns="http://www.w3.org/1999/xhtml">
          +   <head>
          +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          +      <title>-webkit-transition with translate3d sample</title>
          +      <style>
          +         #box 
          +         {
          +            position: absolute;
          +            width: 100px;
          +            height: 100px;
          +            left: 0px;
          +            top: 50px;
          +            background-color: blue;
          +            -webkit-transform: translate3d(0, 0, 0);
          +            -webkit-transition-duration: 1s;
          +            -webkit-transition-timing-function: linear;
          +         }
          +      </style>
          +      <script>
          +         function startTransition() 
          +         {
          +            document.getElementById('box').style.webkitTransform = "translate3d(200px, 200px, 0px)";
          +         }
          +      </script>
          +   </head>
          +   <body>
          +      <div id='box' onclick='startTransition()'>click me!<p></div>
          +   </body>
          +</html>
          +
        • +
        +

        Using Accelerated Overflow Scroll

        +

        If a page has an overflow scroll, use the -webkit-overflow-scrolling attribute. It separates overflow scroll to an independent layer and enhances rendering performance:

        +
        #scroll_area 
        +{
        +   overflow: scroll;
        +   -webkit-overflow-scrolling: touch;
        +}
        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/transition_w.htm b/org.tizen.ui.practices/html/web/w3c/transition_w.htm new file mode 100644 index 0000000..a8de2d7 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/transition_w.htm @@ -0,0 +1,382 @@ + + + + + + + + + + + + + CSS Transitions Module (Level 3): Changing Element Styles + + + + + + +
        +

        CSS Transitions Module (Level 3): Changing Element Styles

        + +

        Transitions allow you to enable implicit transitions, which describe how the CSS properties can be made to change smoothly from one value to another over a given duration. To enhance the rendering performance, you can use hardware acceleration.

        + +

        When using the CSS transition properties, the Tizen browser requires the -webkit- prefix.

        + +

        Transition Properties

        + +

        You can define various properties to control the element transitions:

        + +
          +
        • transition-property +

          This property defines the element property that is changed during the transition. In the following code snippet, both the width and height of the element change when the mouse hovers over it, but the transition effect is applied to the width property only.

        • + +
        • transition-duration +

          This property defines the duration of the transition. You must define as many instances of the property as you have elements in the transition-property property.

        • + +
        • transition-timing-function +

          This property defines the pace of the transition. The value of the property is defined as a stepping function or a cubic Bézier curve. The ease stepping function equals cubic-bezier(0.25, 0.1, 0.25, 1), and the linear stepping function equals cubic-bezier(0, 0, 1, 1).

        • + +
        • transition-delay +

          This property defines the delay time before the start of the transition.

        • + +
        + +

        The following code snippet demonstrates how to use transition properties. For a complete source code, see transition_property.html.

        + +
        +<head>
        +   <style type="text/css">
        +      body{font-size: 12px}
        +
        +      .box 
        +      {
        +         -webkit-transition-property: width;
        +         -webkit-transition-duration: 2s;
        +         -webkit-transition-timing-function: ease;
        +         -webkit-transition-delay: 0.5s;
        +      }
        +
        +      .box: hover 
        +      {
        +         width: 300px;
        +         height: 200px;
        +         background: CornflowerBlue;
        +      }
        +   </style>
        +</head>
        +<body>
        +   <h1>CSS transitions tutorial</h1>
        +   <div class="box">
        +      <p>Mouse over or tap here to animate</p>
        +      <p>transition-property: width, height, background</p>
        +   </div>
        +</body>
        +
        + + + + + + + + + +
        Note
        The hover pseudo class in Tizen maintains a mouseover state when an element is tapped, and becomes a mouseout state when another element is tapped.
        + +

        The transition property allows you to define all the transition properties in a shorthand mode in the order of transition-property | transition-duration | transition-timing-function | transition-delay. If you omit a property value, a default value is used instead.

        + +
        +<style type="text/css">
        +   .box 
        +   {
        +      -webkit-transition: width 1s ease 1s;
        +   }
        +</style>
        +
        + +

        The transition property connects movement more naturally than the more generally used the pseudo classes, such as :hover or :active. The smooth effect can be achieved more conveniently and easily with the transition property than with JavaScript or Flash, and the transition property also supports the browser side to provide excellent performance.

        + + +

        Modifying Element Properties

        + +

        To enhance the user experience of your application, you must learn to use transitions to change element property values naturally. This example uses a partial section of the http://tizen.org Web site, where the current "UPCOMING EVENTS" area only has the text-decoration: underline property in a mouseover state (the text gets underlined when the mouse hovers over it). To improve the effects, the example adds various transitions properties in this area.

        + + +

        Figure: Tizen site section to be transitioned

        +

        Tizen site section to be transitioned

        + + +
        1. Add a background color change to the "UPCOMING EVENTS" area during a mouseover state:

          + +
          1. Originally, the area on the site is defined as follows:

            + +
            +<h2 class="block-title">Upcoming Events</h2>
            +
            + + +

            Additionally, a transition property is declared in the block-title class:

            + +
            +.block-title 
            +{
            +   -webkit-transition: all 2s ease;
            +}
            +
            +

            The all value in the transition property means that the transition effect applies to all CSS properties of the element.

            +
          2. + +
          3. Define the mouseover state for the block-title class: + +
            +.block-title: hover {background: #eaeaea;}
            +
            + +

            Due to the CSS characteristics, adding a class through an event allows immediate rendering in the screen.

          + +

          When the mouse is moved over the "UPCOMING EVENTS" area, the background color changes.

          + +

          Background color change

        2. + +
        3. + +

          Apply the transition effect in other elements:

          + +
          1. To avoid unnecessary repetition, tie a list of transition elements together into groups a and span: + +
            +.location, .date, .location .anibg, h3 > a, .day > span 
            +{
            +   -webkit-transition: all 1s ease;
            +}
            +
          2. + +
          3. When the mouse hovers over the date element, change the background of the date and the font size of all the elements tied into the span group. When the mouse hovers over the title element, change the color of all elements tied into the a group.

            +
            +.date: hover {background: #d2ecff !important;}
            +.date: hover .day > span {font-size: 1.9em;}
            +
            +.event-info: hover h3 > a {color: #ec4986;}
            +
          + +

          Before mouseover +

        4. +
        5. + +

          Emphasize the location phrase by adding an empty element. The emphasis is made by filling the background with black from left to right, and changing the font color to an appropriate value for the black background.

          +
            +
          1. Add the empty element:

            + +
            +<div class="location">San Francisco, CA<span class="anibg"></span></div>
            +
          2. +
          3. Create the effect using the width value of the added element:

            +
            +.location {position: relative; z-index: 3; margin-top: 3px;}
            +.location .anibg 
            +{
            +   position: absolute; 
            +   left: -3px; top: 0; 
            +   display: block; 
            +   width: 0; height: 100%; 
            +   background: #000; 
            +   z-index: -1;
            +}
            +
            + +

            The effect is defined by using the position property. The location element position is declared relative, while the anibg child element position is declared as absolute. The width of the child element basic state is set as 0. Since the child element layer covers the location text, the child element has been defined to come out from the back of the text in the z-index value of the child.

          4. +
          5. Define the state to be changed:

            +
            +.location, .date, .location .anibg, h3 > a, .day > span 
            +{
            +   -webkit-transition: all 1s ease;
            +}
            +
            +.event-info: hover .location {color: #fff;}
            +.event-info: hover .location .anibg {width: 100%; color: #fff;}
            +
            + +

            The transition takes place when the property in question is at the front on the screen. The event-info class is used as the subject for the change, and it has been defined so that the transition occurs simultaneously in the .location and .anibg elements when the mouse hovers over any of the elements tied together as group a. +

          6. + +

          Location phrase emphasis

          +
        +

        Source Code

        +

        For the complete source code related to this use case, see the following file:

        + + +

        Using Hardware Acceleration

        + +

        The rendering performance of a Web application depends on both the Tizen platform and application design.

        +

        In hardware acceleration, GPU is used to perform a function faster than is possible if the application is running on the CPU. It enhances the rendering performance in the dynamic objects used in Web applications.

        + +

        Using CSS Transition and 3D Transform

        +

        To improve the rendering performance, separate moving elements to independent layers as much as possible. You can use CSS transition with the -webkit-transition CSS attribute, or 3D transform with the -webkit-transform attribute. For the best performance, set the -webkit-transform attribute to the 3D type.

        +

        In all the following examples, a blue box moves from top left to bottom right for a second.

        +

        Figure: Blue box

        +

        Blue box

        + +
          +
        • Use CPU painting: +

          JavaScript performs CPU painting for a moving element for each frame at 16 ms interval using the setTimeout() method over the changing top-left coordinate. This approach does not use hardware acceleration, but only running on the CPU.

          +
            +
          1. Construct the blue box and set its position on the screen: +
            <!DOCTYPE html>
            +<html xmlns="http://www.w3.org/1999/xhtml">
            +   <head>
            +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            +      <title>JavaScript transition sample</title>
            +      <style>
            +         #box 
            +         {
            +            position: absolute;
            +            width: 100px;
            +            height: 100px;
            +            background-color: blue;
            +            left: 0px;
            +            top: 50px;
            +         }
            +      </style>
            +
          2. +
          3. +

            Perform CPU painting for a moving element at a rate of 1 frame per 16 ms (62.5 frames per second) using the setTimeout() method:

            +
                  <script>
            +         var delta = 0;
            +         function startTransition() 
            +         {
            +            process();
            +         }
            +         function process ()
            +         {
            +            document.getElementById('box').style.left = delta + "px";
            +            document.getElementById('box').style.top = delta + 50 + "px";
            +            delta += 4;
            +            if (delta <= 200)
            +               setTimeout(function() {process();}, 16);
            +         }
            +      </script>
            +   </head>
            +   <body>
            +      <div id='box' onclick='startTransition()'>click me!</div>
            +   </body>
            +</html>
        • +
        • Use CSS transition: +

          Separate a moving element to an independent layer with the -webkit-transition CSS attribute. This approach uses hardware acceleration, and can enhance performance while an element is moving.

          +
          <!DOCTYPE html>
          +<html xmlns="http://www.w3.org/1999/xhtml">
          +   <head>
          +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          +      <title>-webkit-transition sample</title>
          +      <style>
          +         #box 
          +         {
          +            position: absolute;
          +            width: 100px;
          +            height: 100px;
          +            left: 0px;
          +            top: 50px;
          +            background-color: blue;
          +            -webkit-transition-duration: 1s;
          +            -webkit-transition-timing-function: linear;
          +         }
          +      </style>
          +      <script>
          +         function startTransition()
          +         {
          +            document.getElementById('box').style.webkitTransform = "translate(200px, 200px)";
          +         }
          +      </script>
          +   </head>
          +   <body>
          +      <div id='box' onclick='startTransition()'>click me!</div>
          +   </body>
          +</html>
          +
        • +
        • Use 3D transform: +

          Use the -webkit-transform: translate3d 3D transform attribute. The element is separated to an independent layer and uses hardware acceleration irrespective of its movement:

          +
          <!DOCTYPE html>
          +<html xmlns="http://www.w3.org/1999/xhtml">
          +   <head>
          +      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
          +      <title>-webkit-transition with translate3d sample</title>
          +      <style>
          +         #box 
          +         {
          +            position: absolute;
          +            width: 100px;
          +            height: 100px;
          +            left: 0px;
          +            top: 50px;
          +            background-color: blue;
          +            -webkit-transform: translate3d(0, 0, 0);
          +            -webkit-transition-duration: 1s;
          +            -webkit-transition-timing-function: linear;
          +         }
          +      </style>
          +      <script>
          +         function startTransition() 
          +         {
          +            document.getElementById('box').style.webkitTransform = "translate3d(200px, 200px, 0px)";
          +         }
          +      </script>
          +   </head>
          +   <body>
          +      <div id='box' onclick='startTransition()'>click me!<p></div>
          +   </body>
          +</html>
          +
        • +
        +

        Using Accelerated Overflow Scroll

        +

        If a page has an overflow scroll, use the -webkit-overflow-scrolling attribute. It separates overflow scroll to an independent layer and enhances rendering performance:

        +
        #scroll_area 
        +{
        +   overflow: scroll;
        +   -webkit-overflow-scrolling: touch;
        +}
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/ui_layout_ww.htm b/org.tizen.ui.practices/html/web/w3c/ui_layout_ww.htm new file mode 100644 index 0000000..7c1e098 --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/ui_layout_ww.htm @@ -0,0 +1,706 @@ + + + + + + + + + + + + + Multiple UI Layouts: Designing Applications for Multiple Devices + + + + + +
        +

        Multiple UI Layouts: Designing Applications for Multiple Devices

        + +

        To ensure the largest possible market for your application, you have to design your application layout so that your application can run on multiple Tizen devices.

        + +

        This feature is supported in wearable applications only.

        + +

        Although the Web was originally designed to structure documents for large-scaled Internet world, with CSS (Cascading Style Sheet), JavaScript, and various device APIs, it is quickly evolving to a complete runtime environment for applications. In addition, its W3C open development model and the flexibility of its CSS-based presentation make it every developer's choice as the next development platform. CSS is the key technology for flexible presentation, and it is used to describe the look and formatting of HTML documents. The role of CSS is to determine how the logical structure of the document is displayed to the user.

        + +

        The Tizen Web engine provides the basic mechanisms for fitting the application content to the target screen. However, to ensure that the application runs well on multiple devices, you must understand those mechanisms in detail. In general, select a relative layout rather than a fixed layout, because a relative layout helps to maintain usability even when the application runs on unexpected devices. To enhance usability even further, use different layouts for each device category.

        + +

        Using some CSS techniques and Tizen Web engine mechanisms, you can design your application UI layout so that it displays properly on multiple devices:

        +
        • You can use a single layout and take advantage of the auto-fitting mechanism of the Tizen Web engine to ensure that a single layout covers multiple devices.
        • +
        • You can use multiple layouts to define a separate optimal layout for each device category.
        + +

        Single Layout for Multiple Devices

        +

        A typical application developer designs an optimized UI for a target device with a fixed layout and high-quality resources. This approach usually results in a nice look for the end user, but can sometimes result in an ugly layout, which makes the application unusable. And this unfortunate result can occur merely due to a change in the device form factor.

        +

        Since the presentation and business logic are strictly separated in a Web application, it handles the device form factor change better than native applications. One single layout, taking advantage of Web technology, can ensure usability even on multiple devices with different form factors.

        + +

        To design applications with a single layout, you must consider the following issues:

        + + + +

        For a complete application layout that considers all the above issues, see Single Layout Example.

        + +

        Viewport and Other Meta Tags

        + +

        The viewport is a screen area that the Web engine displays in the UI and, in the Web world, the viewport meta tag is used to inform the Web engine that this content is written for a specific form factor, such as device width. The viewport meta tag was introduced by Apple to fill the screen resolution gap between initial Smartphone (for example, 320 px) and PC (for example, 980 px). Basically, the viewport meta tag helps the Web engine to determine the scale factor for the content on the current device.

        + +

        To use the tag in an HTML file, set its name and content:

        +
        +<meta name="viewport" content="XXX">
        +
        + +

        As shown in the following code snippet, use the viewport meta tag to tell the Web engine which device width is targeted by the application. The Web engine can estimate the scale factor based on the target content size and the real screen width. For example, usually almost all wearable applications have the following viewport meta tag, which sets the viewport width to the appropriate size based on each device:

        +
        +<meta name="viewport" content="width=device-width, user-scalable=no">
        +
        + +

        If you want to set your content layout to the target width of 320 px on every wearable device, use the following meta tag:

        +
        +<meta name="viewport" content="width=320">
        +
        + +

        The viewport meta tag has other properties, such as height, initial-scale, minimum-scale, maximum-scale, and user-scalable. However, do not use those properties unless you understand their exact meaning. Wrong values can cause the Web engine to incorrectly fit the application content to the current device.

        + +

        Relative Layout

        + +

        The relative layout concept means that the element size of all content is set as a relative unit (such as percentage), and not as absolute values (such as pixels or points). In responsive Web design, this concept is also known as fluid grid (for more information, search for responsive web design in your Web browser). To achieve a layout that works on multiple devices, you only need to know about relative layout, not all the other concepts of responsive Web design.

        +

        To implementing a relative layout, you only have to set the width and height of each element as a percentage, as shown in the following example and figure. In the example, the width and height of the number_pad element is set to 100% and 70%, not 320 px and 224 px.

        + +

        Figure: 320x320 calculator

        +

        number_pad {width: 100%; height: 70%;}

        +

        320x320 calculator

        + +

        An application with this relative layout is auto-fitted when it runs on an unexpected device, such as the device with a 360x480 resolution shown in the following figure. Even though this adjusted layout may not be as good as the original, it is good enough, since it shows a usable application UI.

        + + +

        Figure: 360x480 calculator with a relative layout

        +

        360x480 calculator with a relative layout

        + +

        The following figure shows what happens if you use an absolute 320x320 layout. The presentation is definitely ugly (with an empty white space at the bottom) and usability reduced, although the calculation logic itself still works.

        +

        Figure: 360x480 calculator with an absolute 320x320 layout

        +

        number_pad {width: 320px; height: 224px;}

        + + +

        360x480 calculator with an absolute 320x320 layout

        + + + +

        While the content layout itself becomes the application UI layout on a Web page, a typical wearable application layout consists of a header area, content area, and footer area. With this trend, many wearable Web applications are designed by separating the 3 areas explicitly.

        +

        Figure: Typical wearable Web application layout

        +

        Typical wearable Web application layout

        + +

        Not setting the place of the header and footer areas clearly can easily cause problems for your layout. In case of the header, the side-effect is relatively small. However, a wrongly defined footer area can be quite visible and lead to poor usability. The following figure shows the original layout of a pedometer application that consists of a header, content, and footer, with a Stop button set in the footer area.

        +

        Figure: 320x320 sample Web application

        +

        320x320 sample Web application

        + +

        In this case, if the position of the footer is not defined explicitly or if the position and bottom properties do not have proper values, an ugly layout can be displayed on an unexpected device, such as the 360x480 screen shown in the following figure.

        +

        Figure: Layout on 360x480

        +

        Layout on 360x480

        + +

        To make the layout correct, define the position property as fixed and set the bottom property explicitly as 0 px:

        + +
        +.footer {position: fixed; bottom: 0px;}
        +
        + +

        The following figure shows the same Web application running on the unexpected device after the footer properties are defined properly. With the correct values, the Web application is usable even on a new target, not planned during the development phase. Note that if a relative layout is also applied to the content area, the result is an even better layout and further improved usability.

        +

        Figure: Usable layout on 360x480

        +

        Usable layout on 360x480

        + +

        Flexible Media

        + +

        One of key elements used in the content area is a media element, including image and video. As all other elements, the media elements also must be placed within a relative layout to allow the application flexibly handle resolution changes. When such relative sizing is applied to a media element, it is called flexible media in responsive Web design.

        +

        The main issue when making a media element size relative is to ensure that the usable ratio does not change. The following figure shows a video element that works on both 320x320 and 360x480 resolutions, even though the aspect ratio of the screen is changed and scaled up. Basically, when handling media elements, you want to keep the size or ratio of the element the same as in the initially targeted device, even when displayed using a different resolution and aspect ratio. To achieve this, set the width and height properties of the media element with percentage and the auto keyword.

        + +

        Figure: Flexible media on 320x320 and 360x480

        +

        .video iframe {width: 100%; height: auto;}

        +

        Flexible media on 320x320 and 360x480

        + + +

        The following figure shows an example of wrong usage, where usability decreases as the video element is simply scaled up based on the aspect ratio change. If you set the video element size using a fixed size like this, you get no benefit from the increased resolution, and the layout on the whole screen becomes inharmonious, decreasing usability.

        + + +

        Figure: Fixed size media element

        +

        .video iframe {width: 320px; height: 240px;}

        +

        Fixed size media element

        + +

        Single Layout Example

        + +

        This section illustrates a complete application layout that takes advantage of the issues discussed in previous sections. In particular, it shows how to set the viewport properly to help the Web engine scaling mechanism and how to create a CSS-based layout.

        + + +

        First of all, set the targeted size of the content area as 320 px in the viewport meta tag, and disable the user-scalable property, as shown in the following code snippet.

        + +
        +<html>
        +   <head>
        +      <link href="css/style.css" rel="stylesheet" type="text/css">                                             
        +      <meta name="viewport" content="width=320px, user-scalable=no" />                                                 
        +   </head>                                                                                                           
        +   <body>
        +      <main>
        +         <div class="tile left">
        +            <div id="box1" class="box"></div>
        +         </div>            
        +         <div class="tile right">
        +            <div id="box2" class="box"></div>
        +         </div> 
        +         <div class="tile left">
        +            <div id="box3" class="box"></div>                                                                       
        +         </div>
        +         <div class="tile right">
        +            <div id="box4" class="box"></div>                                                                       
        +         </div> 
        +      </main>
        +   </body> 
        +</html>
        +
        + +

        In the above HTML code, the content area consists of 4 <div> box elements, and their UI layout is described in the style.css file. The following CSS code programs the layout and the specific box element styles that were defined in the HTML file.

        +

        The code snippet shows that the content size is set to be same as the viewport size. Each box is filled with a different color and placed so that it fills a quarter of the content area. Because each box size is defined with the width and height of 100%, the relative size of each box element remains the same even if the viewport size changes.

        + +
        +<!--Default, used for all-->
        +* {box-sizing: border-box;}
        +body, div, h1 {margin: 0px; padding: 0px;}
        +html, body {width: 100%; height: 100%; overflow-x: hidden;}
        +
        +#box1 {background-color: rgb(255, 255, 141);}
        +#box2 {background-color: rgb(165, 241, 238);}
        +#box3 {background-color: rgb(248, 179, 179);}
        +#box4 {background-color: rgb(192, 161, 246);}
        +.tile 
        +{
        +   width: 50%;
        +   height: 50%;
        +   float: left;
        +}
        +.left {padding: 10px 5px 5px 10px;}
        +.right {padding: 10px 10px 5px 5px;}
        +
        +.box 
        +{
        +   width: 100%;
        +   height: 100%;
        +}
        +
        + + +

        The following figure shows a final view when the 320 px is set as a target device in the HTML file. As defined in the CSS file, the content area fills the whole screen, 320x320 pixels, and the 4 box elements equally divide the area.

        + +

        Figure: Original layout on a target device

        +

        Original layout on a target device

        +

        The following figure shows that the relative layout and scaling are correctly applied even when the same application is run on a mobile device with the aspect ratio of 16:9.

        +

        Figure: Scaled layout on a 16:9 mobile device

        +

        Scaled layout on a 16:9 mobile device

        +

        The following code snippet shows an example where the background color is replaced with an image while the layout is exactly same as in the 4 box example. The following figures show how the layout including media elements (such as images) functions exactly like the basic box layout.

        + +
        +<!--Default, used for all-->
        +* {box-sizing: border-box;}
        +body, div, h1 {margin: 0px; padding: 0px;}
        +html, body {width: 100%; height: 100%; overflow-x: hidden;}
        +
        +#box1 {background-color: rgb(255, 255, 141);}
        +#box2 {background-color: rgb(165, 241, 238);}
        +#box3 {background-color: rgb(248, 179, 179);}
        +#box4 {background-color: rgb(192, 161, 246);}
        +.tile 
        +{
        +   width: 50%;
        +   height: 50%;
        +   float: left;
        +}
        +.left {padding: 10px 5px 5px 10px;}
        +.right {padding: 10px 10px 5px 5px;}
        +
        +.box 
        +{
        +   width: 100%;
        +   height: 100%;
        +   padding: 20px;
        +   background: no-repeat center;
        +   background-size: 100% 100%;
        +}
        +
        +#box1 {background-image: url('../a.png');}
        +#box2 {background-image: url('../b.png');}
        +#box3 {background-image: url('../c.png');}
        +#box4 {background-image: url('../d.png');}
        +
        + + + +

        Figure: Image-based layout on a target device

        +

        Image-based layout on a target device

        + +

        Figure: Image-based scaled layout on a 16:9 mobile device

        +

        Image-based scaled layout on a 16:9 mobile device

        + + +

        Multiple Layouts for Multiple Devices

        + +

        In many cases, the desired end result for your application can be achieved using scaling and a relative layout within a single layout. However, this approach does not always provide the best quality for the end user.

        +

        You can support the best possible layout and usability with some additional development efforts. For instance, you can create an application which, on a tablet, shows the main information (clock face) and also delivers more meaningful information (calendar), while on a watch device the same application only displays the main information (clock face). This kind of end result, as shown in the following figure, cannot be achieved by only scaling up the whole layout of the watch device.

        +

        Figure: Application for a watch and tablet

        +

        Application for a watch and tablet

        + +

        W3C CSS3 Media Queries already support the majority of techniques needed to provide category-based layouts. To support the optimal layout using CSS techniques and design applications with multiple layouts, you must consider the following issues:

        + + + + +

        Since the 2.3.1 version, Tizen also supports a special media query feature to provide device shape-based layouts. If you want to create an application for both square-shaped and circular-shaped devices, you can easily migrate your application to support both shapes.

        +

        Figure: Application for a square and circular device

        +

        Application for a square and circular device

        + + +

        Viewport Setting for Multiple Layouts

        +

        The difference between multiple and single layouts is that, in the multiple layouts, the content width of the viewport meta tag is set to "device-width". This sets the layout viewport width to the ideal viewport width and tells the Web engine that the application adapts to the device width. In short, the "device-width" setting is needed to create an adaptive and responsive Web application.

        + +

        To use the meta tag in an HTML file, set its name and content:

        +
        +<meta name="viewport" content="width=device-width, user-scalable=no">
        +
        + +

        Category Classification

        + +

        When creating multiple layouts, you must first configure the layout categories. In other words, a classifying category is needed to fit the layout on the current executable environment. Media queries are supported in CSS3 to give Web application information to the executable environment.

        + +

        W3C Media Queries

        +

        Media queries consist of a media type and expressions of media features.

        + +

        The media types indicate the media on which the current Web application is running. They are defined in HTML4. The following media types are supported:

        +
        • aural
        • +
        • braille
        • +
        • handheld
        • +
        • print
        • +
        • projection
        • +
        • screen
        • +
        • tty
        • +
        • tv
        • +
        + +

        You can declare that sections apply to certain media types inside a CSS style sheet. As in the following example, you can declare screen as a media type and describe its layout inside {...}. That code applies the layout inside {...} when the Web application is run on the screen type executable context.

        + +
        +@media screen {...}
        +
        + +

        Several media queries can be combined in a media query list to configure the executable environment and define the detailed layout configuration, as needed. The following example shows a case in which the Web application runs on the executable environment having a screen media type and a 500 pixel minimum width. Its final view shows the layout inside {...} to the end user.

        + +
        +@media screen and (min-width: 500px) {...}
        +
        + +

        The following table lists the CSS media features, which you can use to specify the layout utilizing the media queries.

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Table: Media features
        FeatureValueMin/MaxDescription
        colorintegeryesNumber of bits per a color component
        color-indexNumber of entries in the color lookup table
        device-aspect-ratiointeger/integerAspect ratio
        device-heightlengthOutput device height
        device-widthOutput device width
        gridintegernoSet to true for a grid-based device
        heightlengthyesRendering surface height
        monochromeintegerNumber of bits per pixel in a monochrome frame buffer
        resolutionresolution (dpi or dpcm)Resolution
        scanprogressive or interlacednoScanning process of the tv media types
        widthlengthyesRendering surface width
        + +

        Tizen Specialized Media Query

        +

        Tizen supports a special media query feature for a circular device shape. The following table lists the supported media features.

        + + + + + + + + + + +
        Note
        This feature is supported since 2.3.1.
        + + + + + + + + + + + + + + + + + + + +
        Table: Tizen specialized media feature
        FeatureValueMin/MaxDescription
        -tizen-geometric-shape"rectangle" | "circle"NoDevice shape
        + +

        You can combine this media query feature with the W3C type in your code. The final view shows the layout inside {...} to the end user:

        +
        +@media all and (-tizen-geometric-shape: circle) {...}
        +
        + + +

        Classification for Display Modes

        + +

        The display mode can be classified as portrait or landscape for a rectangle-shaped device, or circular for a circular device.

        + +

        Portrait and Landscape

        + +

        You can configure the device landscape and portrait mode using the device-aspect-ratio attribute in media queries. This approach is already commonly used in creating mobile Web applications. The following example shows how the max-device-aspect-ratio feature is used.

        +

        If you use the orientation:portrait/landscape feature, the layout can change unexpectedly when the virtual keypad is displayed. To avoid the problem, use the device-aspect-ratio to configure the portrait and landscape mode.

        +
        +@media screen and (max-width: 320px) and (max-device-aspect-ratio: 1/1) 
        +{
        +   <!--For portrait mode-->
        +}
        +@media screen and (max-width: 640px) and (min-device-aspect-ratio: 11/10) 
        +{
        +   <!--For landscape mode-->
        +}
        +
        + +

        Circular Device

        + +

        You can configure the device circular mode using the -tizen-geometric-shape attribute in the Tizen environment. The following example shows how to use the -tizen-geometric-shape feature.

        + + + + + + + + + + +
        Note
        This feature is supported since 2.3.1.
        + + +
        +@media all and (-tizen-geometric-shape: circle) 
        +{
        +   <!--For a circular device-->
        +}
        +
        + +

        Application Migration to a Circular Device

        + +

        This section illustrates an example for how you can migrate a basic application from a rectangular device (such as Gear 2 or Gear S) to a circular device. Use this example as the best practice to improve your layout.

        + +

        The example uses the following HTML and CSS code for the sample application and its layout.

        + +
        +<!--HTML code-->
        +<section id="main">
        +   <header>HEADER</header>
        +   <article id="content">
        +      lt;ul>
        +         <li>List Item 1</li>
        +         <li>List Item 2</li>
        +         <li>List Item 3</li>
        +         <li>List Item 4</li>
        +         <li>List Item 5</li>
        +         <li>List Item 6</li>
        +         <li>List Item 7</li>
        +         <li>List Item 8</li>
        +         <li>List Item 9</li>
        +         <li>List Item 10</li>
        +      </ul>
        +   </article>
        +   <footer>FOOTER</footer>
        +</section>
        +
        +<!--CSS code-->
        +html, body 
        +{
        +   height: 100%;
        +   width: 100%;
        +   padding: 0;
        +   margin: 0;
        +   font-size: 24px;
        +   overflow: hidden;
        +}
        +
        +section 
        +{
        +   width: 100%;
        +   height: 100%;
        +   overflow: auto;
        +   padding: 70px 0;
        +}
        +
        +header, footer 
        +{
        +   width: 100%;
        +   height: 70px;
        +   min-height: 70px;
        +   line-height: 70px;
        +   font-size: 30px;
        +   text-align: center;
        +   position: fixed;
        +}
        +
        +header 
        +{
        +   top: 0;
        +}
        +
        +footer 
        +{
        +   bottom: 0;
        +}
        +
        +article ul li 
        +{
        +   border-top: 1px solid rgba(52, 52, 52, 1);
        +   padding: 15px 20px;
        +   color: rgba(209, 209, 209, 1);
        +   font-size: 40px;
        +}
        +
        +article ul li:first 
        +{
        +   border-top: 0 none;
        +}
        + +

        To migrate the application, use the following steps:

        + +
          +
        1. Use a relative layout. + +

          To achieve a responsive layout for different devices, implement a relative layout. Simply set the width: 100% attribute to the layout elements in the CSS code:

          +
          +section 
          +{
          +   width: 100%;
          +   height: 100%;
          +   ...
          +}
          +
          +header, footer 
          +{
          +   width: 100%;
          +   ...
          +} 
          + + + + + + + + + +
          Note
          The relative layout concept is described in more detail in Relative Layout.
          +
        2. +
        3. Set extra spaces both at the top and bottom. + +

          During the migration, you can see how a certain portion of the rectangle view is covered over by the circular view, especially the header and the footer. To make them fully and consistently visible in the circular view, provide a "padding" space at the top and bottom of the page. In the following example migrating to a circular gear device from a rectangular Gear S, extra 77 px padding is used:

          +
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   section {padding: 77px 0;}
          +}
          +
          + +

          Figure: Top and bottom padding

          +

          Top and bottom padding

          +
        4. +
        5. Set the header and footer position. + +

          After setting the top and bottom padding, set the header and footer position for scrolling in the circular view.

          +

          For a rectangular device with a lengthwise screen, especially Gear S, the best option is to make only the content area scrollable.

          + +

          Figure: Scrolling with a rectangular screen

          +

          Scrolling with a rectangular screen

          +

          In a circular screen, it is better to make the whole page scrollable, including the top and bottom space.

          +

          Figure: Scrolling with a circular screen

          +

          Scrolling with a circular screen

          + +

          To implement the header and footer position, use the CSS position attribute:

          +
          +<!--Rectangular device-->
          +header, footer 
          +{
          +   position: fixed;
          +}
          +
          +<!--Circular device-->
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   header, footer 
          +   {
          +      position: static;
          +   }
          +}
          +
          + +
        6. +
        7. Move the display to the initial position. + +

          To provide a better user experience, show the entire display at the beginning, including the "top padding" space. A few seconds after the application launch, move the display back to its initial position, where the header is placed on the top without any space between itself and the edge of the screen. When the display moves like this, the users can perceive the existence of the top space.

          + +

          Figure: Moving to the initial position

          +

          Moving to the initial position

          + +

          The scroll move requires several lines of JavaScript code. In the following sample, the few (N) seconds is set to 1500 ms, but you can change the value as needed.

          +
          +(function initScrollPosition() 
          +{
          +   var SCROLL_DELAY_TIME = 1500,
          +       page = document.getElementById("main"),
          +       scrollPosition = window.parseInt(window.getComputedStyle(page)["padding-top"]),
          +       initScrollTimeoutId = null,
          +       mql = window.matchMedia("(-tizen-geometric-shape: circle)");;
          +
          +   /* The effect is applied to a circular device only, so use mediaquery */
          +   if (mql.matches) 
          +   {	
          +      page.addEventListener("scroll", function clearInitScrollCallback() 
          +      {
          +         window.clearTimeout(initScrollTimeoutId);
          +         page.removeEventListener("scroll", clearInitScrollCallback, false);
          +      }, false);
          +
          +      initScrollTimeoutId = window.setTimeout(function() 
          +      {
          +         page.scrollTop = scrollPosition;
          +      }, SCROLL_DELAY_TIME);
          +   }
          +}());
          +
          + +
        8. +
        9. Set extra attributes for a better view. + +

          Extra attributes are not mandatory in the migration process, but they can be helpful for a better application view.

          +

          Sometimes changing the layout of the basic elements is not enough to achieve a user-friendly view, and changes in other elements' layout are needed too. For example, consider setting the text-align: center attribute for the header and list items in the circular view (this attribute is already defined in the above circular screenshots). If the list is aligned to left in a circular view, the list items may not be all visible when placed out of the middle space.

          + +
          +<!--Common style for header and footer text-->
          +header, footer 
          +{
          +   text-align: center;
          +}
          +
          +<!--In a circular screen, list item has a center position-->
          +@media all and (-tizen-geometric-shape: circle) 
          +{
          +   article ul li 
          +   {
          +      text-align: center;
          +      line-height: 60px;
          +   }
          +}
          +
          +
        10. +
        + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/html/web/w3c/woff_w.htm b/org.tizen.ui.practices/html/web/w3c/woff_w.htm new file mode 100644 index 0000000..601a51c --- /dev/null +++ b/org.tizen.ui.practices/html/web/w3c/woff_w.htm @@ -0,0 +1,132 @@ + + + + + + + + + + + + + WOFF File Format (1.0): Changing Fonts Using WOFF + + + + + + +
        +

        WOFF File Format (1.0): Changing Fonts Using WOFF

        + +

        You can decode and restore font data easily.

        + +

        The new text features in WOFF File Format 1.0 include:

        +
          + +
        • WOFF file format 1.0 +

          WOFF (Web Open Font Format) is a packaging format used to decode and restore font data according to the @font-face rule to display it identically with the input font. The @font-face rule is a CSS rule that allows linking to fonts and finding a suitable font to display if the original font is not available. You can use WOFF within a Web page.

        • +
        + +

        Using the WOFF File Format

        + +

        To enhance the user experience of your application, you must learn to use the WOFF (Web Open Font Format) file format 1.0, which is a W3C standard font packaging format used in Web pages:

        + +
          +
        1. Download and use fonts installed on the Web server by creating @font-face rules. Within the rules, you can define the following properties: +
            +
          • font-family +

            Defines a name for the font. This property is mandatory.

          • +
          • src +

            Defines the URL of the font file on the server. This property is mandatory. If the local attribute is defined, the font resource is not downloaded from the server if it already exists in the local storage.

          • +
          • font-stretch +

            Defines the way the font is stretched. This property is optional.

          • +
          • font-style +

            Defines the font style. This property is optional.

          • +
          • font-weight +

            Defines the font weight. This property is optional.

          • +
          +

          Define the rules with in a <style> element in the <head> section of a Web page:

          +
          +<head>
          +   <style>
          +   @font-face
          +   {
          +      font-family: MuseoSans;
          +      src: local('MuseoSans'),
          +           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_1_0.woff') format('woff');
          +   }
          +
          +   @font-face
          +   {
          +      font-family: MuseoSans;
          +      font-weight: bold;
          +      src: local('MuseoSans'),
          +           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_0_0.woff') format('woff');
          +   }
          +
          +   @font-face
          +   {
          +      font-family: MuseoSans;
          +      font-weight: 900;
          +      src: local('MuseoSans'),
          +           url('https://www.tizen.org/sites/all/themes/tizen_theme/webfonts/244CBE_2_0.woff') format('woff');
          +   }
          +
          +   p:nth-child(2) {font-family: MuseoSans}
          +   p:nth-child(3) {font-family: MuseoSans; font-weight: bold;}
          +   p:nth-child(4) {font-family: MuseoSans; font-weight: 900;}
          +   </style>
          +</head>
          +
        2. +
        3. In the <body> section, create <p> elements containing text in which the font rules are implemented: +
          <body>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +   <p>The quick brown fox jumps over a lazy dog.</p>
          +</body>
          +</html>
          +
          +
        4. +
        +

        Figure: Implementing the @font-face rules (in mobile applications only)

        +

        Implementing the @font-face rules (in mobile applications only)

        + + + + +
        + +Go to top + + + + + + + \ No newline at end of file diff --git a/org.tizen.ui.practices/index.xml b/org.tizen.ui.practices/index.xml new file mode 100644 index 0000000..1590dab --- /dev/null +++ b/org.tizen.ui.practices/index.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.tizen.ui.practices/plugin.xml b/org.tizen.ui.practices/plugin.xml new file mode 100644 index 0000000..90140e5 --- /dev/null +++ b/org.tizen.ui.practices/plugin.xml @@ -0,0 +1,8 @@ + + + + + + + + -- 2.7.4