--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.so.debug.119020880">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.so.debug.119020880" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.tizen.nativecore.NativeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="so" artifactName="apps-common" buildArtefactType="org.tizen.nativecore.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.sharedLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.so.debug.119020880" name="Debug" parent="org.tizen.nativecore.config.sbi.gcc45.so.debug">
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.so.debug.119020880." name="/" resourcePath="">
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.so.debug.2051485246" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.so.debug">
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.589094415" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+ <builder autoBuildTarget="all" buildPath="${workspace_loc:/lib-apps-common}/Debug" enableAutoBuild="true" id="org.tizen.nativecore.target.sbi.gnu.builder.1048697282" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.1819863057" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1237370598" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+ <option id="gnu.cpp.compiler.option.optimization.level.1692620041" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+ <option defaultValue="gnu.cpp.compiler.debugging.level.max" id="sbi.gnu.cpp.compiler.option.debugging.level.core.124537019" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level.core" valueType="enumerated"/>
+ <option defaultValue="true" id="sbi.gnu.cpp.compiler.option.misc.pic.core.1293188600" name="-fPIC option" superClass="sbi.gnu.cpp.compiler.option.misc.pic.core" value="true" valueType="boolean"/>
+ <option id="sbi.gnu.cpp.compiler.option.883965797" name="Tizen-Target" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-3.0-device.core_llvm37.armel.core.sharedLib"/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1221919882" name="Tizen-Frameworks-Include-Path" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/EGL""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES3""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/KHR""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/SDL2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cbhm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/chromium-ewk""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/csr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-buffer-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ector-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/emile-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/nsd/""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/service-adaptor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/tzsh""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui-viewmgr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/vulkan""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/yaca""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.1868946826" name="Tizen-Frameworks-Other-Cflags" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-mthumb"/>
+ <listOptionValue builtIn="false" value="-fvisibility=hidden"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.include.paths.769492000" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/lib-apps-common/inc}""/>
+ <listOptionValue builtIn="false" value=""${workspace_loc:/lib-apps-common/res/apps-common/edje}""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1624823287" name="Tizen-Frameworks" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.dialect.std.1155082077" name="Language standard" superClass="gnu.cpp.compiler.option.dialect.std" value="gnu.cpp.compiler.dialect.default" valueType="enumerated"/>
+ <option id="gnu.cpp.compiler.option.dialect.flags.1950104097" name="Other dialect flags" superClass="gnu.cpp.compiler.option.dialect.flags" value="-std=c++11" valueType="string"/>
+ <option id="gnu.cpp.compiler.option.other.other.1399230646" name="Other flags" superClass="gnu.cpp.compiler.option.other.other" value="-c -fmessage-length=0 -Wno-unused-function -Wno-extern-c-compat" valueType="string"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1940484793" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.949181195" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.823571777" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+ <option defaultValue="gnu.c.debugging.level.max" id="sbi.gnu.c.compiler.option.debugging.level.core.1300888938" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level.core" valueType="enumerated"/>
+ <option defaultValue="true" id="sbi.gnu.c.compiler.option.misc.pic.core.1090861130" name="-fPIC option" superClass="sbi.gnu.c.compiler.option.misc.pic.core" valueType="boolean"/>
+ <option id="sbi.gnu.c.compiler.option.1029738450" name="Tizen-Target" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-3.0-device.core_llvm37.armel.core.sharedLib"/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.553136690" name="Tizen-Frameworks-Include-Path" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/EGL""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES3""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/KHR""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/SDL2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cbhm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/chromium-ewk""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/csr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-buffer-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ector-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/emile-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/nsd/""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/service-adaptor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/tzsh""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui-viewmgr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/vulkan""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/yaca""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.273368038" name="Tizen-Frameworks-Other-Cflags" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-mthumb"/>
+ <listOptionValue builtIn="false" value="-fvisibility=hidden"/>
+ </option>
+ <option id="gnu.c.compiler.option.include.paths.1871191932" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.1848864191" name="Tizen-Frameworks" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.925122232" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.2079975459" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.279768150" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+ <option defaultValue="true" id="sbi.gnu.cpp.linker.option.shared_flag.core.1951653136" name="Linker.Shared" superClass="sbi.gnu.cpp.linker.option.shared_flag.core" valueType="boolean"/>
+ <option defaultValue="true" id="sbi.gnu.cpp.linker.option.noundefined.core.227464450" name="Report unresolved symbol references (-Wl,--no-undefined)" superClass="sbi.gnu.cpp.linker.option.noundefined.core" valueType="boolean"/>
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.694339525" name="Tizen-Frameworks-Other-Lflags" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="-lpthread "/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.1870774001" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1668238422" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool command="arm-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.633178501" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.170319493" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.1693957368" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.614590376" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+ <tool id="org.tizen.nativecore.tool.ast.1510343806" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+ <tool id="org.tizen.nativecore.tool.ast.cpp.658188695" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1643212896" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.800438767" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.910674138" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler">
+ <option id="sbi.gnu.edc.compiler.option.misc.id.89058249" name="Image Path (-id)" superClass="sbi.gnu.edc.compiler.option.misc.id" valueType="stringList">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}/edje""/>
+ </option>
+ <option id="sbi.gnu.edc.compiler.option.misc.sd.1694101033" superClass="sbi.gnu.edc.compiler.option.misc.sd" valueType="stringList">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}/edje""/>
+ </option>
+ <option id="sbi.gnu.edc.compiler.option.misc.fd.985179979" superClass="sbi.gnu.edc.compiler.option.misc.fd" valueType="stringList">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}/edje""/>
+ </option>
+ </tool>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.so.release.1726378043">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.so.release.1726378043" moduleId="org.eclipse.cdt.core.settings" name="Release">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.tizen.nativecore.NativeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactExtension="so" artifactName="org.tizen.apps-common" buildArtefactType="org.tizen.nativecore.buildArtefactType.sharedLib" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.sharedLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.so.release.1726378043" name="Release" parent="org.tizen.nativecore.config.sbi.gcc45.so.release">
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.so.release.1726378043." name="/" resourcePath="">
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.so.release.479052506" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.so.release">
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.1018798881" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+ <builder buildPath="${workspace_loc:/lib-apps-common}/Release" id="org.tizen.nativecore.target.sbi.gnu.builder.149016381" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.2093589563" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1354158935" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+ <option id="gnu.cpp.compiler.option.optimization.level.170350304" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+ <option defaultValue="gnu.cpp.compiler.debugging.level.default" id="sbi.gnu.cpp.compiler.option.debugging.level.core.596043701" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level.core" valueType="enumerated"/>
+ <option defaultValue="true" id="sbi.gnu.cpp.compiler.option.misc.pic.core.1024499531" name="-fPIC option" superClass="sbi.gnu.cpp.compiler.option.misc.pic.core" valueType="boolean"/>
+ <option id="sbi.gnu.cpp.compiler.option.1442464409" name="Tizen-Target" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-3.0-emulator.core_llvm37.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.76672609" name="Tizen-Frameworks-Include-Path" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/EGL""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES3""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/KHR""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/SDL2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cbhm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/chromium-ewk""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/csr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-buffer-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ector-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/emile-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/nsd/""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/service-adaptor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/tzsh""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui-viewmgr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/vulkan""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/yaca""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.2001342911" name="Tizen-Frameworks-Other-Cflags" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-fvisibility=hidden"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.include.paths.944805796" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.348478814" name="Tizen-Frameworks" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.925397267" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1143748085" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.1085259207" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+ <option defaultValue="gnu.c.debugging.level.default" id="sbi.gnu.c.compiler.option.debugging.level.core.913386253" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level.core" valueType="enumerated"/>
+ <option defaultValue="true" id="sbi.gnu.c.compiler.option.misc.pic.core.985782675" name="-fPIC option" superClass="sbi.gnu.c.compiler.option.misc.pic.core" valueType="boolean"/>
+ <option id="sbi.gnu.c.compiler.option.830715601" name="Tizen-Target" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-3.0-emulator.core_llvm37.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1107604994" name="Tizen-Frameworks-Include-Path" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/EGL""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/GLES3""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/KHR""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/SDL2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cbhm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/chromium-ewk""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/csr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-buffer-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ector-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/emile-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/iotcon""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/nsd/""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/service-adaptor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/tzsh""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui-viewmgr""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/vulkan""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/yaca""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.736334736" name="Tizen-Frameworks-Other-Cflags" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-fvisibility=hidden"/>
+ </option>
+ <option id="gnu.c.compiler.option.include.paths.1225514754" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.1948585633" name="Tizen-Frameworks" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1470546473" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.529786459" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.1060663793" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+ <option defaultValue="true" id="sbi.gnu.cpp.linker.option.shared_flag.core.173109100" name="Linker.Shared" superClass="sbi.gnu.cpp.linker.option.shared_flag.core" valueType="boolean"/>
+ <option defaultValue="true" id="sbi.gnu.cpp.linker.option.noundefined.core.1619438138" name="Report unresolved symbol references (-Wl,--no-undefined)" superClass="sbi.gnu.cpp.linker.option.noundefined.core" valueType="boolean"/>
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.1242270603" name="Tizen-Frameworks-Other-Lflags" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="-lpthread "/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.86201883" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.289818099" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.744980287" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.285718668" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.323033626" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.713374260" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+ <tool id="org.tizen.nativecore.tool.ast.1933211459" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+ <tool id="org.tizen.nativecore.tool.ast.cpp.790933542" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.190560800" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.1412563891" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.211510250" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="lib-apps-common.org.tizen.nativecore.target.sbi.gcc45.so.1096739394" name="Tizen Native Shared Library" projectType="org.tizen.nativecore.target.sbi.gcc45.so"/>
+ </storageModule>
+ <storageModule moduleId="scannerConfiguration">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ <scannerConfigBuildInfo instanceId="org.tizen.nativecore.config.sbi.gcc45.so.release.1726378043">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ <scannerConfigBuildInfo instanceId="org.tizen.nativecore.config.sbi.gcc45.so.debug.119020880">
+ <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+ </scannerConfigBuildInfo>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+ <storageModule moduleId="refreshScope" versionNumber="2">
+ <configuration configurationName="Debug">
+ <resource resourceType="PROJECT" workspacePath="/lib-apps-common"/>
+ </configuration>
+ <configuration configurationName="Release">
+ <resource resourceType="PROJECT" workspacePath="/lib-apps-common"/>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
+</cproject>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>lib-apps-common</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.tizen.nativecore.apichecker.apicheckerbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>org.tizen.nativecore.apichecker.apicheckernature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1456218244303</id>
+ <name></name>
+ <type>26</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-projectRelativePath-matches-false-false-*/.tpk</arguments>
+ </matcher>
+ </filter>
+ <filter>
+ <id>1456218244316</id>
+ <name></name>
+ <type>6</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-name-matches-false-false-project_def.prop</arguments>
+ </matcher>
+ </filter>
+ <filter>
+ <id>1456218244318</id>
+ <name></name>
+ <type>22</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-name-matches-false-false-CMakeLists.txt</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<tproject xmlns="http://www.tizen.org/tproject">
+ <platforms>
+ <platform>
+ <name>mobile-3.0</name>
+ </platform>
+ </platforms>
+ <package>
+ <blacklist/>
+ <resFallback autoGen="true"/>
+ </package>
+</tproject>
--- /dev/null
+# Appendix\r
--- /dev/null
+# Add inputs and outputs from these tool invocations to the build variables
+
+
+OS_NAME := $(shell $(UNAME))
+
+
+#ifeq ($(origin BUILD_CONFIG), undefined)
+BUILD_CONFIG ?= Debug
+#endif
+
+#ifeq ($(origin ARCH), undefined)
+ARCH ?= i386
+#endif
+
+#ifeq ($(origin PROJPATH), undefined)
+PROJPATH ?= .
+#endif
+
+
+#ifeq ($(origin PROJ_PATH), undefined)
+PROJ_PATH ?= $(PROJPATH)
+#endif
+
+#ifeq ($(strip $(OUTPUT_DIR)),)
+#OUTPUT_DIR ?= $(PROJ_PATH)/$(BUILD_CONFIG)
+#endif
+
+#ifeq ($(strip $(BUILD_ARCH)),)
+BUILD_ARCH ?= $(ARCH)
+#endif
+
+#ifeq ($(strip $(ENVENTOR_PATH)),)
+ENVENTOR_PATH ?= $(SDK_TOOLPATH)/enventor
+#endif
--- /dev/null
+# C/C++ build script
+
+
+_FUNC_EXT2O = $(patsubst %.$(3),$(1)/%.o,$(2))
+_FUNC_C2O = $(call _FUNC_EXT2O,$(1),$(2),c)
+_FUNC_CPP2O = $(call _FUNC_EXT2O,$(1),$(2),cpp)
+
+
+# parameter :
+# $(1) - C/C++ soruce file
+# $(2) - output path
+# $(3) - .ext
+CONVERT_ESC_EXT_TO_O = $(addprefix $(2)/,$(call CONVERT_4MAKE_TO_OUT,$(patsubst %.$(3),%.o,$(1))))
+
+CONVERT_ESC_C_TO_O = $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),c)
+CONVERT_ESC_CPP_TO_O = $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),cpp)
+
+
+# parameter :
+# $(1) - encoded one C/C++ soruce file
+# $(2) - output path
+# $(3) - ext title (C/C++)
+# $(4) - ext (c/cpp)
+# $(5) - compiler ($(CC)/$(CXX))
+# $(6) - build opt
+# $(7) - build opt file
+# output :
+# $(8) - output files list
+define C_BUILD_PROC_RAW
+$(call CONVERT_ESC_EXT_TO_O,$(1),$(2),$(4)) : $(call DECODE_4MAKE,$(1)) $(7)
+ @echo ' Building file: $$<'
+ @echo ' Invoking: $(3) Compiler'
+ $$(call MAKEDIRS,$$(@D))
+ $(5) -c "$$<" -o "$$@" $(6) -Wp,@$(7)
+ @echo ' Finished building: $$<'
+$(8) += $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),$(4))
+endef
+
+
+# parameter :
+# $(1) - output paths
+# $(2) - src paths
+# $(3) - inc paths
+# $(4) - inc files
+# $(5) - Defs
+# $(6) - UnDefs
+# $(7) - compiler opt
+# $(8) - compiler opt file
+# $(9) - ext title (C/C++)
+# $(10) - ext (c/cpp)
+# $(11) - compiler ($(CC)/$(CXX))
+# output :
+# $(12) - OBJS
+# return :
+# none
+define C_PROC_RAW
+
+_OUTPUT_DIR := $$(strip $(1))#
+_SRCS := $(2)#
+_INCS := $(3)#
+_INC_FILES := $(4)#
+_DEFS := $(5)#
+_UNDEFS := $(6)#
+
+_OPT := $(7)
+_OPT_FILE := $(8)
+
+_EXT_TITLE := $(9)
+_EXT := $(10)
+_COMPILER := $(11)
+
+#_OUTPUT_FILES := $(12)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS))
+_ENC_SRCS := $$(filter %.$$(_EXT),$$(_ENC_SRCS))
+
+ifneq ($$(strip $$(_SRCS)),)
+
+_NORMAL_SRCS := $$(filter-out %*.$$(_EXT),$$(_ENC_SRCS))
+_WIDLCARD_SRCS := $$(filter %*.$$(_EXT),$$(_ENC_SRCS))
+
+_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \
+ $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))
+
+ifneq ($$(strip $$(_ALL_SRCS)),)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS))
+
+_CDEFS := $$(CDEFS)
+_CDEFS += $$(addprefix -D,$$(_DEFS))
+_CDEFS += $$(addprefix -U,$$(_UNDEFS))
+
+_ENC_C_INCS := $$(call ENCODE_4MAKE,$$(_INCS))
+_ENC_C_INCS := $$(addprefix -I,$$(_ENC_C_INCS))
+
+_ENC_INC_FILES := $$(call ENCODE_4MAKE,$$(_INC_FILES))
+_ENC_INC_FILES += $$(addprefix -include,$$(_ENC_INC_FILES))
+
+_C_INCS := $$(call DECODE_4MAKE,$$(_ENC_C_INCS) $$(_ENC_C_INC_FILES))
+
+_DEFS := $$(_CDEFS) $$(_C_INCS) -I"pch" $$(_OPT)
+
+$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call C_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_EXT_TITLE),$$(_EXT),$$(_COMPILER),$$(_DEFS),$$(_OPT_FILE),$(12))))
+
+endif # (_(strip _(_ALL_SRCS)),)
+
+endif # (_(strip _(_SRCS)),)
+
+
+endef
--- /dev/null
+# EDC build script
+
+
+FUNC_EDC2EDJ = $(patsubst %.edc,%.edj,$(1))
+
+# parameter :
+# $(1) - C/C++ soruce file
+# $(2) - output path
+CONVERT_ESC_EDC_TO_EDJ = $(2)/$(call CONVERT_4MAKE_TO_OUT,$(call FUNC_EDC2EDJ,$(1)))
+
+
+# parameter :
+# $(1) - encoded one C/C++ soruce file
+# $(2) - output path
+# $(3) - build opt
+# output :
+# $(4) - output files list
+define EDJ_BUILD_PROC_RAW
+$(call CONVERT_ESC_EDC_TO_EDJ,$(1),$(2)) : $(call DECODE_4MAKE,$(1))
+ @echo ' Building file: $$<'
+ @echo ' Invoking: EDC Resource Compiler'
+ $$(call MAKEDIRS,$$(@D))
+ $$(EDJE_CC) $(3) "$$<" "$$@"
+ @echo ' Finished building: $$<'
+$(4) += $(call CONVERT_ESC_EDC_TO_EDJ,$(1),$(2))
+endef
+
+
+# parameter :
+# $(1) - output paths
+# $(2) - src paths
+# $(3) - image inc paths
+# $(4) - sound inc paths
+# $(5) - font inc paths
+# output :
+# $(6) - OBJS
+# return :
+# none
+define EDJ_PROC_RAW
+
+_OUTPUT_DIR := $$(strip $(1))#
+_SRCS := $(2)#
+_IMAGE_DIRS := $(3)#
+_SOUND_DIRS := $(4)#
+_FONT_DIRS := $(5)#
+
+ifneq ($$(strip $$(_SRCS)),)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS))
+
+_NORMAL_SRCS := $$(filter-out %*.edc,$$(_ENC_SRCS))
+_WIDLCARD_SRCS := $$(filter %*.edc,$$(_ENC_SRCS))
+
+_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \
+ $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))
+
+ifneq ($$(strip $$(_ALL_SRCS)),)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS))
+
+_COMPILER_FLAGS := -id "$$(ENVENTOR_SHARED_RES_PATH)/images"
+_COMPILER_FLAGS += -sd "$$(ENVENTOR_SHARED_RES_PATH)/sounds"
+_COMPILER_FLAGS += -fd "$$(ENVENTOR_SHARED_RES_PATH)/fonts"
+
+ifneq ($$(strip $$(_IMAGE_DIRS)),)
+_COMPILER_FLAGS += $$(addprefix -id ,$$(_IMAGE_DIRS))
+endif
+ifneq ($$(strip $$(_SOUND_DIRS)),)
+_COMPILER_FLAGS += $$(addprefix -sd ,$$(_SOUND_DIRS))
+endif
+ifneq ($$(strip $$(_FONT_DIRS)),)
+_COMPILER_FLAGS += $$(addprefix -fd ,$$(_FONT_DIRS))
+endif
+
+$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call EDJ_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_COMPILER_FLAGS),$(6))))
+
+endif # (_(strip _(_ALL_SRCS)),)
+
+endif # (_(strip _(_SRCS)),)
+
+endef
--- /dev/null
+# PO build script
+
+
+_FUNC_PO2MO = $(patsubst %.po,res/locale/%/LC_MESSAGES/$(2).mo,$(notdir $(1)))
+
+
+# parameter :
+# $(1) - C/C++ soruce file
+# $(2) - output path
+# $(3) - app name
+CONVERT_ESC_PO_TO_MO = $(2)/$(call CONVERT_4MAKE_TO_OUT,$(call _FUNC_PO2MO,$(1),$(3)))
+
+
+# parameter :
+# $(1) - encoded one C/C++ soruce file
+# $(2) - output path
+# $(3) - app name
+# output :
+# $(4) - output files list
+define MO_BUILD_PROC_RAW
+$(call CONVERT_ESC_PO_TO_MO,$(1),$(2),$(3)) : $(call DECODE_4MAKE,$(1))
+ @echo ' Building file: $$<'
+ @echo ' Invoking: msgfmt String Formatter'
+ $$(call MAKEDIRS,$$(@D))
+ $$(MSGFMT) -o "$$@" "$$<"
+ @echo ' Finished building: $$<'
+$(4) += $(call CONVERT_ESC_PO_TO_MO,$(1),$(2),$(3))
+endef
+
+
+# parameter :
+# $(1) - output dir
+# $(2) - src paths
+# $(3) - app name
+# output :
+# $(4) - OBJS
+
+define MO_PROC_RAW
+
+_OUTPUT_DIR := $(1)
+_SRCS := $(2)
+_APPNAME := $(3)
+
+ifneq ($$(strip $$(_SRCS)),)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS))
+
+_NORMAL_SRCS := $$(filter-out %*.po,$$(_ENC_SRCS))
+_WIDLCARD_SRCS := $$(filter %*.po,$$(_ENC_SRCS))
+
+_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \
+ $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))
+
+ifneq ($$(strip $$(_ALL_SRCS)),)
+
+_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS))
+
+$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call MO_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_APPNAME),$(4))))
+
+endif # (_(strip _(_ALL_SRCS)),)
+
+endif # (_(strip _(_SRCS)),)
+
+endef
--- /dev/null
+
+DEBUG_OP =
+CPP_DEBUG_OP = -g3
+
+OPTIMIZATION_OP =
+CPP_OPTIMIZATION_OP = -O0
+
+COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP)
+
+CPP_COMPILE_FLAGS = $(CPP_DEBUG_OP) $(CPP_OPTIMIZATION_OP) -std=c++11 -Wall -c -fmessage-length=0 -Wno-unused-function -Wno-extern-c-compat -fPIC
+
+LINK_FLAGS = -shared -Wl,--no-undefined
+
+AR_FLAGS =
+
+EDC_COMPILE_FLAGS =
\ No newline at end of file
--- /dev/null
+
+BSLASH := \\#
+NULL_CHAR := #
+SPACE := \ #
+COLON := :#
+DOTDOT := ..#
+SPACE_ESC := &sp;#
+COLON_ESC := &co;#
+SPACE_OUT := ~sp~#
+COLON_OUT := ~co~#
+DOTDOT_OUT := ~dtdt~#
+
+BSLASH2SLASH = $(subst $(BSLASH),/,$(1))
+
+REMOVE_TAIL = $(patsubst %/,%,$(1))
+
+#LOWER_CASE = $(shell echo translit($(1),[A-Z],[a-z])|$(M4))
+LOWER_CASE = $(shell echo $(1)|$(TR) [A-Z] [a-z])
+
+#ifneq ($(findstring Windows,$(OS)),)
+# ...
+#endif
+
+FIND_FILES = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///')
+FIND_FILES_ESC = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///' -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')
+FIND_FILES_4MAKE = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///')
+
+FIND_FILES_ABS = $(shell $(FIND) $(1))
+FIND_FILES_ABS_4MAKE = $(shell $(FIND) $(1) -e 's/$(BSLASH) /$(BSLASH)&sp;/g')
+FIND_FILES_ABS_ESC = $(shell $(FIND) $(1) -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')
+
+FIND_FILES_4MAKE = $(shell $(FIND) $(1) | $(SED) 's/ /\\\ /g')
+
+#ENCODE_ESC = $(shell echo $(1) | $(SED) -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')
+#DECODE_ESC = $(shell echo $(1) | $(SED) -e 's/$(BSLASH)&co;/:/g' -e 's/$(BSLASH)&sp;/$(BSLASH) / g')
+ENCODE_ESC = $(subst $(SPACE),$(SPACE_ESC),$(subst $(COLON),$(COLON_ESC),$(1)))
+DECODE_ESC = $(subst $(COLON_ESC),$(COLON),$(subst $(SPACE_ESC),$(SPACE),$(1)))
+ENCODE_4MAKE = $(subst $(SPACE),$(SPACE_ESC),$(1))
+DECODE_4MAKE = $(subst $(SPACE_ESC),$(SPACE),$(1))
+
+CONVERT_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON),$(COLON_OUT),$(subst $(SPACE),$(SPACE_OUT),$(1))))
+CONVERT_ESC_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON_ESC),$(COLON_OUT),$(subst $(SPACE_ESC),$(SPACE_OUT),$(1))))
+CONVERT_4MAKE_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON),$(COLON_OUT),$(subst $(SPACE_ESC),$(SPACE_OUT),$(1))))
+
+PROC_NO_EXIST = $(if $(wildcard $(1)),,$(call $(2),$(1)))
+define MAKEDIRS0
+ @echo ' Building directory: $(1)'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(1))
+endef
+MAKEDIRS = $(call PROC_NO_EXIST,$(1),MAKEDIRS0)
--- /dev/null
+#
+# Usege : make -f <proj_root>/Build/makefile -C <proj_root>
+#
+
+BUILD_SCRIPT_VERSION := 1.1.0
+
+.PHONY : app_version app_build app_clean build_version
+
+
+all : app_build
+
+clean : app_clean
+
+version : build_version
+
+#PROJ_ROOT = .
+PROJ_PATH ?= .#
+BUILD_ROOT ?= $(PROJ_PATH)/Build#
+
+ifeq ($(MAKE_NAME),mingw32-make)
+ifneq ($(SHELL),)
+OPTIONS += --eval="SHELL=$(SHELL)"
+endif
+endif
+
+app_build :
+ @echo $(MAKE) -f "$(BUILD_ROOT)/makefile.mk"
+ @$(MAKE) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS)
+
+app_clean :
+ @$(MAKE) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS) clean
+
+build_version :
+ @echo makefile : $(BUILD_SCRIPT_VERSION)
+ @$(MAKE) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS) version
--- /dev/null
+#
+# Usege : make -f <proj_root>/Build/makefile -C <proj_root>
+#
+
+BUILD_SCRIPT_VERSION := 1.2.3
+
+.PHONY : app_version app_clean build_version
+
+
+all : app_build
+
+clean : app_clean
+
+version : build_version
+
+
+#PROJ_ROOT := $(call BSLASH2SLASH,$(PROJ_PATH))
+PROJ_ROOT ?= .#
+BUILD_ROOT ?= $(PROJ_ROOT)/Build
+
+include $(BUILD_ROOT)/basedef.mk
+
+include $(PROJ_ROOT)/project_def.prop
+-include $(PROJ_ROOT)/build_def.prop
+
+include $(BUILD_ROOT)/funcs.mk
+
+-include $(BUILD_ROOT)/tooldef.mk
+-include $(BUILD_ROOT)/flags.mk
+-include $(BUILD_ROOT)/platform.mk
+
+
+APPTYPE := $(type)
+
+OUTPUT_BASE ?= $(PROJ_ROOT)
+#OUTPUT_DIR ?= $(OUTPUT_BASE)/$(BUILD_CONFIG)/$(BUILD_ARCH)
+OUTPUT_DIR ?= $(OUTPUT_BASE)/$(BUILD_CONFIG)
+OUTPUT_DIR := $(call BSLASH2SLASH,$(OUTPUT_DIR))
+OBJ_OUTPUT ?= $(OUTPUT_DIR)/objs
+
+LOWER_APPNAME := $(call LOWER_CASE,$(APPNAME))
+APPID2 := $(subst $(basename $(APPID)).,,$(APPID))
+
+ifeq ($(strip $(APPTYPE)),app)
+APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so
+endif
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc
+endif
+
+include $(BUILD_ROOT)/build_c.mk
+
+
+ifeq ($(strip $(APPTYPE)),app)
+EXT_OP := -fPIE
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+EXT_OP := -fPIE
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+EXT_OP := -fPIC
+endif
+
+C_OPT := $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) $(EXT_OP) --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) $(USER_C_OPTS)
+CPP_OPT := $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) $(EXT_OP) --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) $(USER_CPP_OPTS)
+C_OPT_FILE := $(PLATFORM_INCS_FILE)
+
+OBJS := #
+
+# Global C/C++
+ifeq ($(strip $(USER_ROOT)),)
+USER_ROOT := $(PROJ_ROOT)
+endif
+$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_SRCS),$(USER_INC_DIRS),$(USER_INC_FILES),$(USER_DEFS),$(USER_UNDEFS),$(C_OPT),$(C_OPT_FILE),C,c,$(CC),OBJS))
+$(foreach ext,cpp cxx cc c++ C,$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_SRCS),$(USER_INC_DIRS),$(USER_CPP_INC_FILES),$(USER_CPP_DEFS),$(USER_CPP_UNDEFS),$(CPP_OPT),$(C_OPT_FILE),C++,$(ext),$(CXX),OBJS)))
+
+# Individual C/C++
+ifneq ($(strip $(USER_EXT_C_KEYS)),)
+$(foreach var,$(USER_EXT_C_KEYS),$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_EXT_$(var)_SRCS),$(USER_EXT_$(var)_INC_DIRS),$(USER_EXT_$(var)_INC_FILES),$(USER_EXT_$(var)_DEFS),$(USER_EXT_$(var)_UNDEFS),$(C_OPT),$(C_OPT_FILE),C,c,$(CC),OBJS)))
+$(foreach ext,cpp cxx cc c++ C,$(foreach var,$(USER_EXT_C_KEYS),$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_EXT_$(var)_SRCS),$(USER_EXT_$(var)_INC_DIRS),$(USER_EXT_$(var)_CPP_INC_FILES),$(USER_EXT_$(var)_CPP_DEFS),$(USER_EXT_$(var)_CPP_UNDEFS),$(CPP_OPT),$(C_OPT_FILE),C++,$(ext),$(CXX),OBJS))))
+endif
+
+
+ifneq ($(strip $(USER_LIB_DIRS)),)
+_ENC_USER_LIB_DIRS := $(call ENCODE_4MAKE,$(USER_LIB_DIRS))
+_ENC_USER_LIB_DIRS := $(addprefix -L,$(_ENC_USER_LIB_DIRS))
+LIBPATHS := $(call DECODE_4MAKE,$(_ENC_USER_LIB_DIRS))
+endif
+
+LIBS += $(addprefix -l,$(USER_LIBS))
+
+UOBJS += $(USER_OBJS)
+
+M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"
+
+DEPS := $(OBJS:.o=.d)
+
+ifneq ($(strip $(DEPS)),)
+-include $(PROJ_ROOT)/Build/$(DEPS)
+endif
+
+
+ifeq ($(strip $(APPTYPE)),app)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: C/C++ Linker'
+ $(call MAKEDIRS,$(@D))
+ $(CXX) -o $(APPFILE) $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_ROOT)/.exportMap" $(RS_LIB_PATHS) $(RS_LIBRARIES) -Xlinker -rpath="/opt/usr/apps/$(APPID)/lib" -Werror-implicit-function-declaration $(USER_LINK_OPTS)
+ @echo ' Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: Archive utility'
+ $(call MAKEDIRS,$(@D))
+ $(AR) -r $(APPFILE) $(OBJS) $(UOBJS) $(AR_FLAGS) $(USER_LINK_OPTS)
+ @echo ' Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: C/C++ Linker'
+ $(call MAKEDIRS,$(@D))
+ $(CXX) -o $(APPFILE) $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" $(RS_LIB_PATHS) $(RS_LIBRARIES) $(USER_LINK_OPTS)
+ @echo ' Finished building target: $@'
+endif
+
+
+$(OBJ_OUTPUT) :
+ $(call MAKEDIRS,$@)
+
+$(OUTPUT_DIR) :
+ $(call MAKEDIRS,$@)
+
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+$(PLATFORM_INCS_FILE) : $(OBJ_OUTPUT)
+ @echo ' Building inc file: $@'
+ifneq ($(findstring Windows,$(OS)),)
+ifneq ($(findstring 3.82,$(MAKE_VERSION)),)
+ $(file > $@,$(PLATFORM_INCS))
+else
+ @echo $(PLATFORM_INCS) > "$@"
+endif
+else
+ @echo $(PLATFORM_INCS) > "$@"
+endif
+endif
+
+include $(BUILD_ROOT)/build_edc.mk
+
+#ifeq ($(strip $(ENVENTOR_SHARED_RES_PATH)),)
+ENVENTOR_SHARED_RES_PATH ?= $(ENVENTOR_PATH)/share/enventor
+#endif
+
+EDJ_FILES :=
+
+# Global EDCs
+ifneq ($(strip $(USER_EDCS)),)
+$(eval $(call EDJ_PROC_RAW,$(OUTPUT_DIR),$(USER_EDCS),$(USER_EDCS_IMAGE_DIRS),$(USER_EDCS_SOUND_DIRS),$(USER_EDCS_FONT_DIRS),EDJ_FILES))
+endif
+
+# Individual EDCs
+ifneq ($(strip $(USER_EXT_EDC_KEYS)),)
+$(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC_RAW,$(OUTPUT_DIR),$(USER_EXT_$(var)_EDCS),$(USER_EXT_$(var)_EDCS_IMAGE_DIRS),$(USER_EXT_$(var)_EDCS_SOUND_DIRS),$(USER_EXT_$(var)_EDCS_FONT_DIRS),EDJ_FILES)))
+endif
+
+
+include $(BUILD_ROOT)/build_po.mk
+
+MO_FILES :=
+
+# Global POs
+ifneq ($(strip $(USER_POS)),)
+$(eval $(call MO_PROC_RAW,$(OUTPUT_DIR),$(USER_POS),$(APPID2),MO_FILES))
+endif
+
+
+secondary-outputs : $(EDJ_FILES) $(MO_FILES)
+
+-include appendix.mk
+
+app_build : $(OUTPUT_DIR) $(APPFILE) secondary-outputs
+ @echo ========= done =========
+
+
+app_clean :
+ rm -f $(APPFILE)
+ rm -rf $(OUTPUT_DIR)
+
+build_version :
+ @echo makefile.mk : $(BUILD_SCRIPT_VERSION)
--- /dev/null
+# Add inputs and outputs from these tool invocations to the build variables
+
+SYSROOT = $(SBI_SYSROOT)
+
+USR_INCS := $(addprefix -I $(SYSROOT),$(PLATFORM_INCS_EX))
+
+ifeq ($(strip $(PLATFORM_LIB_PATHS)),)
+RS_LIB_PATHS := "$(SYSROOT)/usr/lib"
+else
+RS_LIB_PATHS := $(addprefix -L$(SYSROOT),$(PLATFORM_LIB_PATHS))
+endif
+
+RS_LIBRARIES := $(addprefix -l,$(RS_LIBRARIES_EX))
+
+PLATFORM_INCS = $(USR_INCS) -I"$(SDK_PATH)/library"
--- /dev/null
+# Add pre/post build process
+
+PREBUILD_COMMAND =
+PREBUILD_DESC =
+
+POSTBUILD_COMMAND =
+POSTBUILD_DESC =
--- /dev/null
+# Add inputs and outputs from these tool invocations to the build variables
+
+ifneq ($(strip $(SHELL_BIN)),)
+SHELL = $(SHELL_BIN)
+else
+SHELL = sh
+endif
+
+ifneq ($(strip $(MKDIR_BIN)),)
+MKDIR = $(MKDIR_BIN)
+MKDIR_OP = -p
+else
+MKDIR = mkdir
+MKDIR_OP = -p
+endif
+
+ifneq ($(strip $(UNAME_BIN)),)
+UNAME = $(UNAME_BIN)
+else
+UNAME = uname
+endif
+
+ifneq ($(strip $(M4_BIN)),)
+M4 = $(M4_BIN)
+else
+M4 = m4
+endif
+
+ifneq ($(strip $(TR_BIN)),)
+TR = $(TR_BIN)
+else
+TR = tr
+endif
+
+ifneq ($(strip $(FIND_BIN)),)
+FIND = $(FIND_BIN)
+else
+FIND = find
+endif
+
+ifneq ($(strip $(SED_BIN)),)
+SED = $(SED_BIN)
+else
+SED = sed
+endif
+
+ifneq ($(strip $(GREP_BIN)),)
+GREP = $(GREP_BIN)
+else
+GREP = grep
+endif
+
+ifneq ($(strip $(EDJE_CC_BIN)),)
+EDJE_CC = $(EDJE_CC_BIN)
+else
+EDJE_CC = edje_cc
+endif
+
+ifneq ($(strip $(MSGFMT_BIN)),)
+MSGFMT = $(MSGFMT_BIN)
+else
+MSGFMT = msgfmt
+endif
--- /dev/null
+cmake_minimum_required(VERSION 2.6)
+project(apps-common CXX)
+
+file(GLOB_RECURSE SOURCES src/*.cpp)
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}/inc
+ ${CMAKE_CURRENT_SOURCE_DIR}/res/apps-common/edje
+)
+
+add_library(${PROJECT_NAME} SHARED ${SOURCES})
+target_link_libraries(${PROJECT_NAME} ${LIBRARIES})
+
+install(TARGETS ${PROJECT_NAME} DESTINATION ${LIB_DIR})
+
+add_subdirectory(res/apps-common)
--- /dev/null
+
+# Add pre/post build process
+PREBUILD_DESC =
+PREBUILD_COMMAND =
+POSTBUILD_DESC =
+POSTBUILD_COMMAND =
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_APP_CONTROL_H
+#define APP_APP_CONTROL_H
+
+#include <app_control.h>
+
+namespace App
+{
+ class EXPORT_API AppControl
+ {
+ public:
+ /**
+ * @brief Create empty app control wrapper. The wrapper doesn't contain any
+ * value it can only be assigned to.
+ */
+ AppControl();
+
+ /**
+ * @brief Create a direct app control request
+ *
+ * @see app_control_set_app_id()
+ */
+ explicit AppControl(const char *appId);
+
+ /**
+ * @brief Create app control request
+ *
+ * @see app_control_set_operation()
+ * @see app_control_set_mime()
+ * @see app_control_set_uri()
+ */
+ AppControl(const char *operation,
+ const char *mime,
+ const char *uri = nullptr);
+
+ AppControl(const AppControl&) = delete;
+ AppControl(AppControl&&);
+ ~AppControl();
+
+ /**
+ * @return Stored app control handle
+ */
+ app_control_h getHandle() const;
+
+ /**
+ * @see app_control_add_extra_data()
+ */
+ void addExtra(const char *key, const char *value);
+
+ /**
+ * @see app_control_add_extra_data_array()
+ */
+ void addExtra(const char *key, const char **array, int length);
+
+ /**
+ * @brief Launch app control request
+ * @return App Control launch result
+ *
+ * @see app_control_set_launch_mode()
+ * @see app_control_send_launch_request()
+ */
+ int launch(app_control_reply_cb replyCallback = nullptr, void *userData = nullptr,
+ bool groupMode = true);
+
+ /**
+ * @see app_control_send_terminate_request()
+ */
+ void terminate();
+
+ /**
+ * @brief Prevent app control termination on destruction.
+ */
+ void detach();
+
+ AppControl &operator=(const AppControl&) = delete;
+ AppControl &operator=(AppControl&&);
+
+ private:
+ void reset();
+
+ app_control_h m_AppControl;
+ bool m_AutoTerminate;
+ };
+}
+
+#endif /* APP_APP_CONTROL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_APP_CONTROL_REQUEST_H
+#define APP_APP_CONTROL_REQUEST_H
+
+#include "App/AppControl.h"
+#include "App/AppControlUtils.h"
+#include "Utils/Range.h"
+
+#define APP_CONTROL_OPERATION_SETTING_CALL "http://tizen.org/appcontrol/operation/setting/call"
+
+#define APP_CONTROL_MIME_CONTACT "application/vnd.tizen.contact"
+#define APP_CONTROL_MIME_IMAGE "image/*"
+#define APP_CONTROL_MIME_VCARD "text/vcard"
+
+#define APP_CONTROL_URI_SCHEME_FILE "file://"
+
+#define APP_CONTROL_SELECT_SINGLE "single"
+#define APP_CONTROL_SELECT_MULTIPLE "multiple"
+
+#define APP_CONTROL_RESULT_ID "id"
+#define APP_CONTROL_RESULT_PHONE "phone"
+#define APP_CONTROL_RESULT_EMAIL "email"
+#define APP_CONTROL_RESULT_VCARD "vcf"
+#define APP_CONTROL_RESULT_ACTION "action"
+#define APP_CONTROL_RESULT_CALL "call"
+#define APP_CONTROL_RESULT_MESSAGE "message"
+
+#define APP_CONTROL_RINGTONE_IS_DEFAULT "is_default"
+#define APP_CONTROL_RINGTONE_TRUE "true"
+
+namespace App
+{
+ /**
+ * @brief Request contact creation operation
+ * @param[in] number Phone number to save to the new contact
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestContactCreate(const char *number);
+
+ /**
+ * @brief Request contact view operation
+ * @param[in] personId ID of person to view
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestContactDetails(int personId);
+
+ /**
+ * @brief Request contact edit operation
+ * @param[in] personId ID of person to edit or 0 to launch pick first
+ * @param[in] number Phone number to add to the edited contact
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestContactEdit(int personId, const char *number);
+
+ /**
+ * @brief Request contact pick operation
+ * @param[in] selectionMode One of APP_CONTROL_SELECT_* values
+ * @param[in] resultType One of APP_CONTROL_RESULT_* values
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestContactPick(const char *selectionMode, const char *resultType);
+
+ /**
+ * @brief Request telephony call
+ * @param[in] number Number to call
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestTelephonyCall(const char *number);
+
+ /**
+ * @brief Request launch call settings
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestCallSettings();
+
+ /**
+ * @brief Request message or email composer for single recipient.
+ * @param[in] scheme URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+ * @param[in] to Recipient
+ * @param[in] subject Subject
+ * @param[in] text Text
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestComposer(const char *scheme, const char *to,
+ const char *subject = nullptr, const char *text = nullptr);
+
+ /**
+ * @brief Request message or email composer for multiple recipients.
+ * @param[in] scheme URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+ * @param[in] recipients Multiple recipients
+ * @param[in] subject Subject
+ * @param[in] text Text
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestComposer(const char *scheme, Utils::Range<const char **> recipients,
+ const char *subject = nullptr, const char *text = nullptr);
+
+ /**
+ * @brief Request camera image capture
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestCameraImage();
+
+ /**
+ * @brief Request pick image from gallery
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestGalleryImage();
+
+ /**
+ * @brief Request view image
+ * @param[in] path Path to image file
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestViewImage(const char *path);
+
+ /**
+ * @brief Request share contact via other application
+ * @param[in] personId Contact's person ID
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestShareContact(int personId);
+
+ /**
+ * @brief Request share text to other application
+ * @param[in] text Information in text representation
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestShareText(const char *text);
+
+ /**
+ * @brief Request share "My Profile" via other application
+ * @param[in] recordId "My Profile" record ID
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestShareMyProfile(int recordId);
+
+ /**
+ * @brief Request share of multiple contacts via other application
+ * @param[in] personIds Contact's person IDs
+ * @param[in] count Person IDs count
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestMultiShareContacts(const char **personIds, int count);
+
+ /**
+ * @brief Request pick vcard(s) from filesystem
+ * @param[in] path Path of storage from where files should be picked
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestPickVcard(const char *path);
+
+ /**
+ * @brief Request pick ringtone from Settings
+ * @param[in] selectedPath Path of currently selected ringtone
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestPickRingtone(const char *selectedPath = nullptr);
+}
+
+#endif /* APP_APP_CONTROL_REQUEST_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_APP_CONTROL_UTILS_H
+#define APP_APP_CONTROL_UTILS_H
+
+#include <app_control.h>
+#include <string>
+#include <vector>
+
+namespace App
+{
+ /**
+ * @brief Get single first string from App Control array extra data.
+ * @param[in] appControl App Control handle
+ * @param[in] key Extra data array key
+ * @return First string from array on success, otherwise empty string.
+ */
+ std::string EXPORT_API getSingleExtraData(app_control_h appControl, const char *key);
+
+ /**
+ * @brief Get integer value from App Control extra data.
+ * @param[in] appControl App Control handle
+ * @param[in] key Extra data key
+ * @return Integer value.
+ */
+ int EXPORT_API getIntExtraData(app_control_h appControl, const char *key);
+
+ /**
+ * @brief Get string value from App Control extra data.
+ * @param[in] appControl App Control handle
+ * @param[in] key Extra data key
+ * @return String value.
+ */
+ std::string EXPORT_API getStringExtraData(app_control_h appControl, const char *key);
+
+ /**
+ * @brief Get vector of integer values from App Control array extra data.
+ * @param[in] appControl App Control handle
+ * @param[in] key Extra data array key
+ * @return Vector of integer values on success, otherwise empty vector.
+ */
+ std::vector<int> EXPORT_API getIntExtraDataArray(app_control_h appControl, const char *key);
+
+ /**
+ * @brief Create array of strings of equal size.
+ * @details Both array and strings are created in a contiguous memory
+ * so it can be released all at once.
+ * @param[in] dataSize Maximum size of array element
+ * @param[in] count Number of array elements
+ * @remark Array elements MUST NOT be released.
+ * @return Array of pointers to strings, MUST be released using free().
+ */
+ EXPORT_API char **createExtraDataArray(size_t dataSize, size_t count);
+}
+
+#endif /* APP_APP_CONTROL_UTILS_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_APPLICATION_H
+#define APP_APPLICATION_H
+
+#include <app.h>
+
+namespace Ui
+{
+ class Naviframe;
+ class Window;
+}
+
+namespace App
+{
+ class OperationController;
+
+ /**
+ * @brief UI Application lifecycle controller.
+ */
+ class EXPORT_API Application
+ {
+ public:
+ Application();
+ virtual ~Application() { }
+
+ /**
+ * @brief Run application main loop.
+ * @param[in] argc argc parameter received in main()
+ * @param[in] argv argv parameter received in main()
+ */
+ int run(int argc, char **argv);
+
+ protected:
+ /**
+ * @brief Create corresponding controller for requested operation.
+ * @param[in] operation Requested operation
+ * @return Controller to handle the operation.
+ */
+ virtual OperationController *createController(const char *operation) = 0;
+
+ /**
+ * @brief Called when application is created.
+ * @return true on success, otherwise false.
+ */
+ virtual bool onCreate();
+
+ /**
+ * @brief Called when application is terminated.
+ */
+ virtual void onTerminate();
+
+ /**
+ * @brief Called when application is paused.
+ */
+ virtual void onPause();
+
+ /**
+ * @brief Called when application is resumed.
+ */
+ virtual void onResume();
+
+ /**
+ * @brief Called when application receives App Control request.
+ * @param request App Control request
+ */
+ virtual void onAppControl(app_control_h request);
+
+ /**
+ * @return Main application Window.
+ */
+ Ui::Window *getWindow() const;
+
+ /**
+ * @return Main application Navigator.
+ */
+ Ui::Naviframe *getNavigator() const;
+
+ private:
+ static void onLanguageChanged(app_event_info_h event, void *data);
+ static void updateLanguage();
+
+ Ui::Window *m_Window;
+ Ui::Naviframe *m_Navigator;
+ OperationController *m_Controller;
+ };
+}
+
+#endif /* APP_APPLICATION_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_OPERATION_CONTROLLER_H
+#define APP_OPERATION_CONTROLLER_H
+
+#include <app.h>
+#include <string>
+
+namespace Ui
+{
+ class Navigator;
+ class Window;
+}
+
+namespace App
+{
+ /**
+ * @brief Handles operations requested through App Control.
+ */
+ class EXPORT_API OperationController
+ {
+ public:
+ /**
+ * @brief Create operation controller.
+ * @param[in] isMinimizable Whether application can be minimized
+ */
+ OperationController(bool isMinimizable = false);
+ virtual ~OperationController();
+
+ /**
+ * @brief Create operation controller.
+ * @param[in] window Main application Window
+ * @param[in] navigator Main application Navigator
+ */
+ void create(Ui::Window *window, Ui::Navigator *navigator);
+
+ /**
+ * @brief Request the controller to handle the operation.
+ * @param[in] operation Requested operation
+ * @param[in] request App Control request
+ */
+ void request(const char *operation, app_control_h request);
+
+ protected:
+ /**
+ * @brief Called after create() is called.
+ */
+ virtual void onCreate() { }
+
+ /**
+ * @brief Called when application receives pause event.
+ */
+ virtual void onPause() { }
+
+ /**
+ * @brief Called when application receives resume event.
+ */
+ virtual void onResume() { }
+
+ /**
+ * @brief Called after request() is called.
+ */
+ virtual void onRequest(const char *operation, app_control_h request) = 0;
+
+ /**
+ * @return Main application Window.
+ */
+ Ui::Window *getWindow() const;
+
+ /**
+ * @return Main application Navigator.
+ */
+ Ui::Navigator *getNavigator() const;
+
+ /**
+ * @return Last received request.
+ */
+ app_control_h getRequest() const;
+
+ /**
+ * @brief Get URI without prefix (if present).
+ * @param[in] scheme Scheme prefix to remove (e.g. tel: or file://)
+ * @return URI without scheme.
+ */
+ std::string getUrn(const char *scheme) const;
+
+ private:
+ friend class Application;
+
+ app_control_h m_Request;
+ bool m_IsMinimizable;
+
+ Ui::Window *m_Window;
+ Ui::Navigator *m_Navigator;
+ };
+}
+
+#endif /* APP_OPERATION_CONTROLLER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_PATH_H
+#define APP_PATH_H
+
+#include <string>
+#include <tizen.h>
+
+namespace App
+{
+ /**
+ * @return Localization files directory path.
+ */
+ EXPORT_API const std::string &getLocaleDir();
+
+ /**
+ * @return Data directory path.
+ */
+ EXPORT_API const std::string &getDataDir();
+
+ /**
+ * @return Resource directory path.
+ */
+ EXPORT_API const std::string &getResourceDir();
+
+ /**
+ * @brief Get resource file path.
+ * @param[in] relativePath File path relative to resource directory
+ * @return Absolute file path.
+ */
+ EXPORT_API std::string getResourcePath(const char *relativePath);
+}
+
+#endif /* APP_PATH_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_WIDGET_H
+#define APP_WIDGET_H
+
+#include <widget_app.h>
+#include <widget_service.h>
+
+namespace Ui
+{
+ class Window;
+}
+
+namespace App
+{
+ /**
+ * @brief Homescreen widget base class.
+ */
+ class EXPORT_API Widget
+ {
+ public:
+ Widget();
+ virtual ~Widget();
+
+ /**
+ * @brief Create widget.
+ * @param[in] context Widget context
+ * @param[in] content Widget content bundle
+ */
+ void create(widget_context_h context, bundle *content);
+
+ /**
+ * @brief Resize widget.
+ * @param[in] width Widget new width
+ * @param[in] height Widget new height
+ */
+ void resize(int width, int height);
+
+ /**
+ * @return Widget width.
+ */
+ int getWidth() const;
+
+ /**
+ * @return Widget height.
+ */
+ int getHeight() const;
+
+ /**
+ * @return Widget type.
+ * @see widget_size_type_e
+ */
+ widget_size_type_e getType() const;
+
+ /**
+ * @return Widget window.
+ */
+ Ui::Window *getWindow() const;
+
+ protected:
+ /**
+ * @brief Save widget content bundle.
+ * @param[in] content Content to save
+ */
+ void saveContent(bundle *content);
+
+ /**
+ * @brief Called when widget is created.
+ * @param[in] content Widget content bundle
+ */
+ virtual void onCreate(bundle *content) { }
+
+ /**
+ * @brief Called when widget is destroyed.
+ * @param[in] reason Reason for destruction
+ */
+ virtual void onDestroy(widget_app_destroy_type_e reason) { }
+
+ /**
+ * @brief Called when widget is paused.
+ */
+ virtual void onPause() { }
+
+ /**
+ * @brief Called when widget is resumed.
+ */
+ virtual void onResume() { }
+
+ /**
+ * @brief Called when widget is resized.
+ * @param[in] width Widget new width
+ * @param[in] height Widget new height
+ */
+ virtual void onResize(int width, int height) { }
+
+ /**
+ * @brief Called when widget is updated.
+ * @param[in] force Whether widget was forcefully updated
+ */
+ virtual void onUpdate(int force) { }
+
+ private:
+ friend class WidgetApplication;
+
+ widget_context_h m_Context;
+ int m_Width;
+ int m_Height;
+ Ui::Window *m_Window;
+ };
+}
+
+#endif /* APP_WIDGET_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_WIDGET_APPLICATION_H
+#define APP_WIDGET_APPLICATION_H
+
+#include <widget_app.h>
+
+namespace App
+{
+ class Widget;
+
+ /**
+ * @brief Widget application lifecycle controller.
+ */
+ class EXPORT_API WidgetApplication
+ {
+ public:
+ /**
+ * @brief Run application main loop.
+ * @param[in] argc argc parameter received in main()
+ * @param[in] argv argv parameter received in main()
+ */
+ int run(int argc, char **argv);
+
+ protected:
+ virtual ~WidgetApplication() { }
+
+ /**
+ * @brief Called when application is created.
+ * @return Whether application is created successfully.
+ */
+ virtual bool onCreate();
+
+ /**
+ * @brief Called when application is terminated.
+ */
+ virtual void onTerminate() { }
+
+ /**
+ * @return Create widget instance.
+ */
+ virtual Widget *createWidget() = 0;
+
+ private:
+ widget_class_h onWidgetClassCreate();
+
+ static Widget *getWidget(widget_context_h context);
+
+ static int onWidgetCreate(widget_context_h context,
+ bundle *content, int width, int height, void *data);
+ static int onWidgetDestroy(widget_context_h context,
+ widget_app_destroy_type_e reason, bundle *content, void *data);
+
+ static int onWidgetPause(widget_context_h context, void *data);
+ static int onWidgetResume(widget_context_h context, void *data);
+
+ static int onWidgetResize(widget_context_h context,
+ int width, int height, void *data);
+ static int onWidgetUpdate(widget_context_h context,
+ bundle *content, int force, void *data);
+
+ static void onLanguageChanged(app_event_info_h event, void *data);
+ static void updateLanguage();
+ };
+}
+
+#endif /* APP_WIDGET_APPLICATION_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APP_WIDGET_WINDOW_H
+#define APP_WIDGET_WINDOW_H
+
+#include "Ui/Window.h"
+#include <widget_app.h>
+
+namespace App
+{
+ class EXPORT_API WidgetWindow : public Ui::Window
+ {
+ public:
+ /**
+ * @brief Create WidgetWindow.
+ * @param[in] context Widget context
+ */
+ WidgetWindow(widget_context_h context);
+
+ protected:
+ /**
+ * @see Window::onWindowCreate()
+ */
+ virtual Evas_Object *onWindowCreate();
+
+ private:
+ widget_context_h m_Context;
+ };
+}
+
+#endif /* APP_WIDGET_WINDOW_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef I18N_COLLATOR_H
+#define I18N_COLLATOR_H
+
+#include "I18n/UniString.h"
+#include <utils_i18n_ucollator.h>
+
+namespace I18n
+{
+ /**
+ * @brief Provides locale-dependent string comparison.
+ */
+ class EXPORT_API Collator
+ {
+ public:
+ /**
+ * @brief Create collator.
+ * @param[in] strength Collation strength
+ * @see i18n_ucollator_strength_e
+ */
+ explicit Collator(i18n_ucollator_strength_e strength = I18N_UCOLLATOR_PRIMARY);
+ Collator(const Collator &that) = delete;
+ Collator(Collator &&that);
+ ~Collator();
+
+ Collator &operator=(const Collator &that) = delete;
+ Collator &operator=(Collator &&that);
+
+ /**
+ * @brief Initialize the collator with current locale.
+ * @remark Can be called several times.
+ */
+ void initialize();
+
+ /**
+ * @brief Compare two strings.
+ * @pre Should be initialized by calling initialize().
+ * @param[in] str1 First string
+ * @param[in] str2 Second string
+ * @return 0 if equal, -1 if str1 < str2, otherwise 1.
+ */
+ int compare(const UniString &str1, const UniString &str2);
+
+ private:
+ i18n_ucollator_strength_e m_Strength;
+ i18n_ucollator_h m_Handle;
+ };
+}
+
+#endif /* I18N_COLLATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef I18N_UNI_STRING_H
+#define I18N_UNI_STRING_H
+
+#include <utils_i18n.h>
+#include <string>
+
+namespace I18n
+{
+ /**
+ * @brief Class wrapper for convenient work with multibyte UTF8 unicode string
+ */
+ class EXPORT_API UniString
+ {
+ public:
+ /**
+ * @brief Instantiation of the basic_string class template,
+ * that uses i18n_uchar as its character type
+ */
+ typedef std::basic_string<i18n_uchar> I18nString;
+
+ UniString() = default;
+ /**
+ * @brief Create new object, based on @a utf8Str string
+ * @param[in] utf8Str UTF8 multibyte unicode string
+ */
+ UniString(const char *utf8Str);
+
+ bool operator<(const UniString &that) const;
+ bool operator>(const UniString &that) const;
+ bool operator==(const UniString &that) const;
+ bool operator!=(const UniString &that) const;
+ bool operator<=(const UniString &that) const;
+ bool operator>=(const UniString &that) const;
+
+ /**
+ * @return I18n string
+ */
+ const I18nString &getI18nStr() const;
+
+ /**
+ * @return UTF8 multibyte string
+ */
+ const std::string &getUtf8Str() const;
+
+ /**
+ * @brief Erases the contents of the string
+ */
+ void clear();
+
+ private:
+ static std::string toUtf8(const I18nString &ustring);
+ static I18nString fromUtf8(const std::string &utf8Str);
+
+ mutable std::string m_Utf8Str;
+ I18nString m_UniStr;
+ };
+}
+
+#endif /* I18N_UNI_STRING_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_DATA_ITEM_H
+#define MODEL_DATA_ITEM_H
+
+#include <functional>
+#include <tizen.h>
+
+namespace Model
+{
+ class EXPORT_API DataItem
+ {
+ public:
+ /**
+ * @brief Change callback
+ * @param[in] Changed info
+ */
+ typedef std::function<void(int)> UpdateCallback;
+
+ /**
+ * @brief Delete callback
+ */
+ typedef std::function<void()> DeleteCallback;
+
+ virtual ~DataItem() { }
+
+ /**
+ * @brief Set update callback
+ * @param[in] callback Update callback
+ */
+ void setUpdateCallback(UpdateCallback callback);
+
+ /**
+ * @brief Unset update callback
+ */
+ void unsetUpdateCallback();
+
+ /**
+ * @brief Set delete callback
+ * @param[in] callback Delete callback
+ */
+ void setDeleteCallback(DeleteCallback callback);
+
+ /**
+ * @brief Unset delete callback
+ */
+ void unsetDeleteCallback();
+
+ protected:
+ /**
+ * @brief ContactData updated callback
+ * @param[in] changes Changed info
+ */
+ void onUpdated(int changes);
+
+ /**
+ * @brief ContactData deleted callback
+ */
+ void onDeleted();
+
+ private:
+ UpdateCallback m_OnUpdated;
+ DeleteCallback m_OnDeleted;
+ };
+}
+
+
+
+#endif /* MODEL_DATA_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_DATA_PROVIDER_H
+#define MODEL_DATA_PROVIDER_H
+
+#include "Model/DataItem.h"
+
+#include <list>
+
+namespace Model
+{
+ class EXPORT_API DataProvider
+ {
+ public:
+ typedef std::list<DataItem *> DataList;
+
+ /**
+ * @brief Called once initialization is finished.
+ */
+ typedef std::function<void()> InitializeCallback;
+
+ /**
+ * @brief Insert callback
+ * @param[in] data
+ */
+ typedef std::function<void(DataItem &)> InsertCallback;
+
+ /**
+ * @brief Called when provider has finished updating its items.
+ */
+ typedef std::function<void()> UpdateFinishedCallback;
+
+ virtual ~DataProvider() { }
+
+ /**
+ * @brief Initialize provider data.
+ * @remark Should be called before retrieving the data.
+ * @param[in] callback Initialization finished callback
+ */
+ void initialize(InitializeCallback callback);
+
+ /**
+ * @return Data list
+ */
+ virtual const DataList &getDataList() = 0;
+
+ /**
+ * @brief Set insert callback
+ * @param[in] callback Create callback
+ */
+ void setInsertCallback(InsertCallback callback);
+
+ /**
+ * @brief Unset insert callback
+ */
+ void unsetInsertCallback();
+
+ /**
+ * @brief Set update finished callback
+ * @param[in] callback Update finished callback
+ */
+ void setUpdateFinishedCallback(UpdateFinishedCallback callback);
+
+ /**
+ * @brief Unset update finished callback
+ */
+ void unsetUpdateFinishedCallback();
+
+ protected:
+ /**
+ * @brief Called after initialize() to initialize provider data.
+ * @post onInitialized() should be called when initialization is finished.
+ */
+ virtual void onInitialize();
+
+ /**
+ * @brief Should be called to notify that initialization is finished.
+ */
+ void onInitialized();
+
+ /**
+ * @brief DataItem inserted callback
+ * @param[in] dataItem Data item
+ */
+ void onInserted(DataItem &dataItem);
+
+ /**
+ * @brief Should be called to notify that update is finished.
+ */
+ void onUpdateFinished();
+
+ private:
+ InitializeCallback m_OnInitialized;
+ InsertCallback m_OnInserted;
+ UpdateFinishedCallback m_OnUpdateFinished;
+ };
+}
+
+#endif /* MODEL_DATA_PROVIDER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL2_DATA_ITEM_H
+#define MODEL2_DATA_ITEM_H
+
+#include <tizen.h>
+#include "Utils/CallbackManager.h"
+
+/* FIXME: Rename once transition to new model is complete */
+namespace Model2
+{
+ /**
+ * @brief Change types.
+ */
+ enum ChangeType
+ {
+ ChangeNone,
+ ChangeInsert,
+ ChangeUpdate,
+ ChangeDelete
+ };
+
+ class EXPORT_API DataItem
+ {
+ public:
+ /**
+ * @brief Called after item was updated.
+ * @param[in] Which item data was updated (depends on the specific item).
+ */
+ typedef Utils::CallbackManager<int> UpdateCallback;
+
+ /**
+ * @brief Called before item is deleted.
+ */
+ typedef Utils::CallbackManager<> DeleteCallback;
+
+ DataItem();
+ DataItem(const DataItem &);
+ virtual ~DataItem() { }
+
+ /**
+ * @brief Update item with new data.
+ * @param[in] data New item data.
+ */
+ void update(void *data);
+
+ /**
+ * @return Whether is standalone (not managed by DataProvider).
+ */
+ bool isStandalone() const;
+
+ /**
+ * @brief Set whether item is standalone or managed by DataProvider.
+ * @param[in] isStandalone Whether item is standalone
+ */
+ void setStandalone(bool isStandalone);
+
+ /**
+ * @brief Add/remove update callback.
+ */
+ UpdateCallback &onUpdated();
+
+ /**
+ * @brief Add/remove delete callback.
+ */
+ DeleteCallback &onDeleted();
+
+ protected:
+ /**
+ * @brief Mark item as changed with specified change type.
+ * @param[in] changeType Item change type
+ * @param[in] changes Which item data was updated if type is ChangeUpdate
+ */
+ void setChanged(ChangeType changeType, int changes = 0);
+
+ /**
+ * @brief Called after setStandalone() to change item standalone state.
+ * @param[in] isStandalone Whether item is standalone
+ */
+ virtual void onStandalone(bool isStandalone) { }
+
+ /**
+ * @brief Called after update() to update item data.
+ * @param[in] data New item data
+ * @return Mask specifying which item data was updated.
+ */
+ virtual int onUpdate(void *data) { return 0; }
+
+ private:
+ friend class DataProvider;
+ void finishUpdate();
+
+ bool m_IsStandalone;
+ int m_Changes;
+ ChangeType m_ChangeType;
+
+ UpdateCallback m_OnUpdated;
+ DeleteCallback m_OnDeleted;
+ };
+}
+
+#endif /* MODEL2_DATA_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL2_DATA_PROVIDER_H
+#define MODEL2_DATA_PROVIDER_H
+
+#include "Model2/DataItem.h"
+
+#include <list>
+
+/* FIXME: Rename once transition to new model is complete */
+namespace Model2
+{
+ class EXPORT_API DataProvider
+ {
+ public:
+ typedef std::list<DataItem *> DataList;
+
+ /**
+ * @brief Called once initialization is finished.
+ */
+ typedef std::function<void()> InitializeCallback;
+
+ /**
+ * @brief Called when provider has started or finished updating its items.
+ */
+ typedef Utils::CallbackManager<> UpdateCallback;
+
+ /**
+ * @brief Called after item was inserted.
+ * @param[in] Inserted item
+ */
+ typedef Utils::CallbackManager<DataItem &> InsertCallback;
+
+ DataProvider();
+ virtual ~DataProvider();
+
+ /**
+ * @return Provider data list.
+ */
+ const DataList &getDataList();
+
+ /**
+ * @brief Initialize provider data.
+ * @remark Should be called before retrieving the data.
+ * @param[in] callback Initialization finished callback
+ */
+ void initialize(InitializeCallback callback);
+
+ /**
+ * @brief Update provider data.
+ * @details If update is disabled or is already in progress
+ * the update is postponed.
+ */
+ void update();
+
+ /**
+ * @brief Destroy dynamically allocated provider safely.
+ * @details If provider is currently busy the destruction is postponed.
+ * @remark No callbacks will be called after this method is called.
+ */
+ void destroy();
+
+ /**
+ * @brief Set whether to start update immediately when update() is called.
+ * @param[in] isEnabled Whether data update is enabled
+ */
+ void setUpdateEnabled(bool isEnabled);
+
+ /**
+ * @brief Add/remove insert callback.
+ */
+ InsertCallback &onInserted();
+
+ /**
+ * @brief Add/remove update start callback.
+ */
+ UpdateCallback &onUpdateStarted();
+
+ /**
+ * @brief Add/remove update finish callback.
+ */
+ UpdateCallback &onUpdateFinished();
+
+ protected:
+ /**
+ * @brief Called after initialize() to initialize provider data.
+ * @post finishInit() should be called when initialization is finished.
+ */
+ virtual void startInit() = 0;
+
+ /**
+ * @brief Called after update() to update provider data.
+ * @post finishUpdate() should be called when update is finished.
+ */
+ virtual void startUpdate() = 0;
+
+ /**
+ * @brief Insert new DataItem into the list.
+ * @param[in] dataItem New data item
+ */
+ void insertDataItem(DataItem *dataItem);
+
+ /**
+ * @brief Delete DataItem from the list.
+ * @param[in] dataItem Data item to be deleted
+ */
+ void deleteDataItem(DataItem &dataItem);
+
+ /**
+ * @brief Should be called when initialization is finished.
+ * @param[in] dataList Initialized data list
+ */
+ void finishInit(DataList dataList);
+
+ /**
+ * @brief Should be called when update is finished.
+ * @details Notifies clients about changes and removes deleted items from the list.
+ */
+ void finishUpdate();
+
+ private:
+ bool m_IsBusy;
+ bool m_IsInitialized;
+ bool m_IsUpdateEnabled;
+ bool m_IsUpdatePending;
+ bool m_IsDestroyPending;
+
+ InitializeCallback m_OnInitialized;
+ InsertCallback m_OnInserted;
+ UpdateCallback m_OnUpdateStarted;
+ UpdateCallback m_OnUpdateFinished;
+
+ DataList m_DataList;
+ };
+}
+
+#endif /* MODEL2_DATA_PROVIDER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_SEARCH_DATA_H
+#define MODEL_SEARCH_DATA_H
+
+#include "Model2/DataItem.h"
+#include "Model2/SearchResult.h"
+
+namespace Model2
+{
+ class EXPORT_API SearchData : public DataItem
+ {
+ public:
+ /**
+ * @brief Called when SearchResult is changed.
+ * @param[in] Search result
+ */
+ typedef std::function<void(const SearchResult *)> ChangeCallback;
+
+ /**
+ * @brief Create SearchData object.
+ * @param[in] dataItem Data item reference
+ */
+ explicit SearchData(DataItem &dataItem);
+
+ /**
+ * @return DataItem reference.
+ */
+ DataItem &getDataItem();
+
+ /**
+ * @return DataItem reference.
+ */
+ const DataItem &getDataItem() const;
+
+ /**
+ * @return Search result.
+ */
+ const SearchResult *getSearchResult() const;
+
+ /**
+ * @brief Set search result.
+ * @param[in] searchResult Search result
+ */
+ void setSearchResult(SearchResult *searchResult);
+
+ /**
+ * @brief Set change callback.
+ * @param[in] callback @see ChangeCallback
+ */
+ void setChangeCallback(ChangeCallback callback);
+
+ protected:
+ virtual int onUpdate(void *data) override;
+
+ private:
+ DataItem &m_DataItem;
+ SearchResult *m_SearchResult;
+ ChangeCallback m_OnChanged;
+ };
+}
+
+#endif /* MODEL_SEARCH_DATA_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_SEARCH_ENGINE_H
+#define MODEL_SEARCH_ENGINE_H
+
+#include "Model2/SearchResult.h"
+#include "Model2/DataProvider.h"
+
+#include <string>
+#include <vector>
+
+namespace Model2
+{
+ class SearchData;
+
+ /**
+ * @brief This is a callable object which provides match logic
+ * @param[in] Search data
+ * @param[in] Query
+ * @return Search result
+ */
+ typedef std::function<SearchResultPtr(const SearchData &, const std::string &)> SearchComparator;
+
+ /**
+ * @brief This class provides incremental search logic
+ */
+ class EXPORT_API SearchEngine
+ {
+ public:
+ typedef DataProvider::DataList DataList;
+
+ /**
+ * @brief Create search engine
+ * @param[in] dataList ContactData list
+ * @param[in] comparator Callable match comparator
+ */
+ explicit SearchEngine(const DataList &dataList, SearchComparator comparator);
+
+ /**
+ * @brief Perform incremental search
+ * @param[in] query Value to find
+ */
+ void search(std::string query);
+
+ /**
+ * @return true if there is no results, otherwise false
+ */
+ bool empty() const;
+
+ /**@{*/
+ /**
+ * @brief Notify engine that SearchData was Inserted/Updated/Deleted
+ * @param[in] searchData SearchData object
+ */
+ void insertSearchData(SearchData *searchData);
+ void updateSearchData(SearchData *searchData);
+ void deleteSearchData(SearchData *searchData);
+ /**@}*/
+
+ private:
+ typedef std::pair<SearchData *, SearchResultPtr> SearchResultItem;
+ typedef std::list<SearchResultItem> ResultList;
+ typedef std::vector<ResultList> SearchHistory;
+ typedef std::function<bool(const std::string &, ResultList &)> HistoryForFn;
+
+ bool needSearch(const std::string &query);
+ template <typename List>
+ void incrementalSearch(const List &list, const std::string &query);
+
+ SearchData *getSearchData(DataItem *data);
+ SearchData *getSearchData(const SearchResultItem &searchItem);
+
+ void updateSearchResult(ResultList &list);
+ void resetSearchResult();
+ void clear();
+
+ SearchHistory::iterator getMatch(const std::string &query);
+ SearchHistory::iterator skipEmptyResults(size_t offset);
+
+ void historyFor(HistoryForFn function);
+ static ResultList::iterator findSearchData(ResultList &list, SearchData *searchData);
+
+ std::string m_Query;
+ SearchHistory m_History;
+ int m_LastFoundIndex;
+
+ const DataList &m_DataList;
+
+ SearchComparator m_Comparator;
+ };
+}
+
+#endif /* MODEL_SEARCH_ENGINE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_SEARCH_PROVIDER_H
+#define MODEL_SEARCH_PROVIDER_H
+
+#include "Model2/SearchEngine.h"
+#include "Model2/DataProvider.h"
+
+namespace Model2
+{
+ class SearchData;
+
+ class EXPORT_API SearchProvider : public DataProvider
+ {
+ public:
+
+ /**
+ * @brief Create SearchProvider
+ * @param[in] provider DataProvider
+ * @param[in] comparator Callable match comparator
+ */
+ explicit SearchProvider(DataProvider &provider, SearchComparator comparator);
+ virtual ~SearchProvider() override;
+
+ /**
+ * @brief Invoke search
+ * @param[in] query Passed search string
+ */
+ void search(const char *query);
+
+ /**
+ * @return Whether there is no results for the current query.
+ */
+ bool empty() const;
+
+ private:
+ virtual void startInit() override;
+ virtual void startUpdate() override { }
+
+ SearchData *createSearchData(DataItem &dataItem);
+ void onItemInserted(DataItem &dataItem);
+ void onItemUpdated(SearchData &searchData, int changes);
+ void onItemDeleted(SearchData &searchData);
+
+ DataProvider &m_Provider;
+ SearchEngine m_SearchEngine;
+ };
+}
+
+#endif /* MODEL_SEARCH_PROVIDER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef MODEL_SEARCH_RESULT_H
+#define MODEL_SEARCH_RESULT_H
+
+#include <memory>
+#include <tizen.h>
+#include "Utils/Range.h"
+
+namespace Model2
+{
+ class EXPORT_API SearchResult
+ {
+ public:
+ /**
+ * @brief Represents substring of matched string.
+ */
+ typedef Utils::Range<const char *> Substring;
+
+ SearchResult();
+
+ /**
+ * @brief Create SearchResult object.
+ * @param[in] fieldId Field ID matched with query
+ * @param[in] str Matched string
+ * @param[in] substr Matched substring
+ */
+ SearchResult(int fieldId, const char *str, Substring substr);
+
+ /**
+ * @return Field ID matched with query.
+ */
+ int getMatchedField() const;
+
+ /**
+ * @return Matched string.
+ */
+ const char *getMatchedString() const;
+
+ /**
+ * @return Matched substring.
+ */
+ const Substring &getMatchedSubstring() const;
+
+ private:
+ int m_MatchedField;
+ const char *m_MatchedString;
+ Substring m_MatchedSubstring;
+ };
+
+ typedef std::unique_ptr<SearchResult> SearchResultPtr;
+}
+
+#endif /* MODEL_SEARCH_RESULT_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SYSTEM_SETTINGS_H
+#define SYSTEM_SETTINGS_H
+
+#include <system_settings.h>
+#include "Utils/CallbackManager.h"
+
+namespace System
+{
+ namespace Settings
+ {
+ typedef Utils::CallbackManager<system_settings_key_e> CallbackManager;
+
+ /**
+ * @see system_settings_set_changed_cb()
+ */
+ EXPORT_API void addCallback(system_settings_key_e key, CallbackManager::Callback callback);
+
+ /**
+ * @see system_settings_unset_changed_cb()
+ */
+ EXPORT_API void removeCallback(system_settings_key_e key, void *subscriber);
+ };
+}
+
+#endif /* SYSTEM_SETTINGS_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_BUTTON_H
+#define UI_BUTTON_H
+
+#include "Ui/Control.h"
+#include <functional>
+
+namespace Ui
+{
+ /**
+ * @brief Provides convenient press and longpress events handling.
+ */
+ class EXPORT_API Button : public Control
+ {
+ public:
+ Button();
+ virtual ~Button() override;
+
+ /**
+ * @brief Set press-event callback.
+ */
+ void setPressedCallback(std::function<void(Button &)> callback);
+
+ /**
+ * @brief Set longpress-event callback.
+ * @details Callback should return true if the event was handled.
+ * If callback returns false onPressed event will be delivered
+ * as well when the button is released.
+ */
+ void setLongpressedCallback(std::function<bool(Button &)> callback);
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual void onCreated() override;
+
+ void onMouseDown(Evas *evas, Evas_Object *obj, void *eventInfo);
+ void onMouseUp(Evas *evas, Evas_Object *obj, void *eventInfo);
+ void onMouseOut(Evas *evas, Evas_Object *obj, void *eventInfo);
+
+ void resetTimer();
+ Eina_Bool onTimeout();
+
+ Ecore_Timer *m_Timer;
+ bool m_IsLongpressed;
+
+ std::function<void(Button &)> m_OnPressed;
+ std::function<bool(Button &)> m_OnLongpressed;
+ };
+}
+
+#endif /* UI_BUTTON_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_CHECK_ITEM
+#define UI_CHECK_ITEM
+
+#include "Ui/GenItem.h"
+
+namespace Ui
+{
+ /**
+ * @brief GenContainer check item
+ */
+ class EXPORT_API CheckItem : public Ui::GenItem
+ {
+ public:
+ /**
+ * @brief Item check callback.
+ * @param[in] Whether item is checked
+ * @return Whether item's state should be changed.
+ */
+ typedef std::function<bool(bool)> CheckCallback;
+
+ CheckItem(GenContainer::Type type = GenContainer::TypeGenlist);
+ virtual ~CheckItem() override;
+
+ /**
+ * @return Whether the item is checked.
+ */
+ bool isChecked() const;
+
+ /**
+ * @brief Set item check state.
+ * @param[in] isChecked Whether item is checked
+ * @return Whether the state was changed successfully.
+ */
+ bool setChecked(bool isChecked);
+
+ /**
+ * @brief Set item check callback.
+ * @param[in] callback Callback to be called when item is checked/unchecked
+ */
+ void setCheckCallback(CheckCallback callback);
+
+ /**
+ * @brief Set item which "checked" state should be synchronized with this item.
+ * @param[in] item Item to link with
+ */
+ void setLinkedItem(CheckItem *item);
+
+ /**
+ * @brief Unset linked item.
+ */
+ void unsetLinkedItem();
+
+ protected:
+ /**
+ * @brief Update the part containing check component.
+ */
+ void updateCheckPart();
+
+ /**
+ * @see GenItem::getContent()
+ * @remark Use it in derived class to create check component
+ */
+ virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
+
+ /**
+ * @see GenItem::onSelected()
+ */
+ virtual void onSelected() override;
+
+ /**
+ * @brief Called when item's "checked" state changes.
+ * @param[in] isChecked Whether item is checked
+ * @return Whether item's state should be changed.
+ */
+ virtual bool onChecked(bool isChecked) { return true; }
+
+ private:
+ bool notifyCheck();
+
+ std::string m_CheckPart;
+ Eina_Bool m_IsChecked;
+ bool m_IsChecking;
+ CheckCallback m_OnChecked;
+ CheckItem *m_LinkedItem;
+ };
+}
+
+#endif /* UI_CHECK_ITEM */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_CONTROL_H
+#define UI_CONTROL_H
+
+#include <Elementary.h>
+#include <tizen.h>
+#include <typeinfo>
+
+/**
+ * @brief Define class type so it can be detected from a more derived class instance.
+ * @details Overrides hasType() method by checking against the given static type
+ * and all base types recursively.
+ */
+#define DEFINE_CLASS_TYPE(classType, baseClassType) \
+ virtual bool hasType(const std::type_info &type) const override \
+ { \
+ return typeid(classType) == type || baseClassType::hasType(type); \
+ }
+
+namespace Ui
+{
+ /**
+ * @brief Evas_Object wrapper.
+ * @details Ties the lifetime of this object to the underlying Evas_Object.
+ * @remark Should always be allocated with operator "new".
+ */
+ class EXPORT_API Control
+ {
+ public:
+ Control();
+ Control(const Control &that) = delete;
+ virtual ~Control();
+
+ Control &operator=(const Control &that) = delete;
+
+ /**
+ * @brief Create underlying Evas_Object by calling onCreate()
+ * @param[in] parent Parent Evas_Object
+ * @return Created Evas_Object on success, otherwise nullptr
+ */
+ Evas_Object *create(Evas_Object *parent);
+
+ /**
+ * @brief Set delay between onCreate() and onCreated().
+ * @param[in] time Delay time
+ */
+ void setCreateTimer(double time);
+
+ /**
+ * @brief Remove delay between onCreate() and onCreated().
+ * @remark If timer is currently running onCreated() will be called immediately.
+ */
+ void resetCreateTimer();
+
+ /**
+ * @return Underlying Evas_Object.
+ */
+ Evas_Object *getEvasObject() const;
+
+ /**@{*/
+ /**
+ * @brief Get Control object from Evas_Object by type.
+ * @remark The specified type should be either the most derived class or
+ * should be defined using DEFINE_CLASS_TYPE macro in the respective class.
+ * @param[in] object Evas_Object that belongs to some Control
+ * @return Control of the specified type tied to Evas_Object or nullptr if none.
+ */
+ template <typename ControlType = Control>
+ static ControlType *getControl(Evas_Object *object);
+ static Control *getControl(Evas_Object *object, const std::type_info &type);
+ /**@}*/
+
+ /**@{*/
+ /**
+ * @brief Find closest parent Control by type.
+ * @see Control::getControl()
+ */
+ static Control *findParent(Evas_Object *object, const std::type_info &type);
+ template <typename ControlType>
+ static ControlType *findParent(Evas_Object *object);
+ template <typename ControlType>
+ ControlType *findParent() const;
+ /**@}*/
+
+ /**
+ * @brief Check if the object has a specified type or is derived from it.
+ * @details A base class MUST override this method using DEFINE_CLASS_TYPE macro
+ * to allow detecting it from a more derived class instance.
+ * @param[in] type Type info to check against
+ * @return Whether the object has a specified type.
+ */
+ virtual bool hasType(const std::type_info &type) const { return typeid(Control) == type; }
+
+ protected:
+ /**
+ * @brief Called after create() is called
+ * @param[in] parent Parent Evas_Object
+ * @return Created Evas_Object on success, otherwise nullptr
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) = 0;
+
+ /**
+ * @brief Called after onCreate() has returned
+ */
+ virtual void onCreated() { }
+
+ /**
+ * @brief Called before Control is destroyed.
+ */
+ virtual void onDestroy() { }
+
+ private:
+ void setEvasObject(Evas_Object *object);
+ Evas_Object *resetEvasObject();
+ void destroyEvasObject();
+
+ void onTypeCheck(Evas_Object *obj, void *eventInfo);
+ void onDestroyed(Evas *e, Evas_Object *obj, void *eventInfo);
+
+ Evas_Object *m_Object;
+ Ecore_Timer *m_CreateTimer;
+ };
+
+ template <typename ControlType>
+ ControlType *Control::getControl(Evas_Object *object)
+ {
+ return static_cast<ControlType *>(getControl(object, typeid(ControlType)));
+ }
+
+ template <typename ControlType>
+ ControlType *Control::findParent(Evas_Object *object)
+ {
+ return static_cast<ControlType *>(findParent(object, typeid(ControlType)));
+ }
+
+ template <typename ControlType>
+ ControlType *Control::findParent() const
+ {
+ return findParent<ControlType>(m_Object);
+ }
+}
+
+#endif /* UI_CONTROL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_EDITFIELD_H
+#define UI_EDITFIELD_H
+
+#include "Ui/Control.h"
+
+namespace Ui
+{
+ /**
+ * @brief Editfield layout with entry and "clear" button
+ */
+ class EXPORT_API Editfield : public Control
+ {
+ public:
+ Editfield();
+
+ /**
+ * @brief Allows method overload instead of shadowing
+ */
+ using Control::create;
+
+ /**
+ * @brief Create editfield with guide text.
+ * @param[in] parent Editfield parent
+ * @param[in] guideText Text to be displayed when entry is empty
+ * @return Created editfield.
+ */
+ static Editfield *create(Evas_Object *parent, const char *guideText);
+
+ /**
+ * @brief Set entry multiline state.
+ * @param[in] isMultiline Whether entry is multiline
+ */
+ void setMultiline(bool isMultiline);
+
+ /**
+ * @brief Set entry guide text.
+ * @param[in] guideText Text to be displayed when entry is empty
+ */
+ void setGuideText(const char *guideText);
+
+ /**
+ * @return Contained entry.
+ */
+ Evas_Object *getEntry();
+
+ /**
+ * @return Clear button.
+ */
+ Evas_Object *getClearButton();
+
+ /**
+ * @brief Set whether entry is enabled or not.
+ * @param[in] isEnabled Whether input will be inserted in the entry
+ */
+ void setEnabled(bool isEnabled);
+
+ /**
+ * @brief Set Clear button visibility.
+ * @param[in] isVisible Whether Clear button is visible
+ */
+ void setClearButtonVisible(bool isVisible);
+
+ /**
+ * @brief Set limit of characters to be entered
+ * Relative toast popup will be shown on reach of the limit
+ * @param[in] limit The limit count of characters
+ */
+ void setTextLimit(int limit);
+
+ /**
+ * @brief Set the text of the limit toast popup
+ * @param[in] text The text
+ */
+ void setLimitToastText(const char *text);
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ static void onChanged(Editfield *editfield, Evas_Object *entry, void *eventInfo);
+ static void onFocused(Evas_Object *layout, Evas_Object *entry, void *eventInfo);
+ static void onUnfocused(Evas_Object *layout, Evas_Object *entry, void *eventInfo);
+ static void onClearPressed(Evas_Object *entry, Evas_Object *button, void *eventInfo);
+ static void onMaxLengthReached(Editfield *editfield, Evas_Object *button, void *eventInfo);
+
+ Elm_Entry_Filter_Limit_Size m_TextLimitFilter;
+ const char *m_LimitToastText;
+ };
+}
+
+#endif /* UI_EDITFIELD_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GEN_CONTAINER_H
+#define UI_GEN_CONTAINER_H
+
+#include "Ui/Control.h"
+#include "Ui/GenIterator.h"
+
+namespace Ui
+{
+ class EXPORT_API GenContainer : public Control
+ {
+ public:
+ DEFINE_CLASS_TYPE(GenContainer, Control)
+
+ enum Type
+ {
+ TypeGenlist,
+ TypeGengrid
+ };
+
+ enum Position
+ {
+ Before,
+ After
+ };
+
+ /**
+ * @brief Create GenContainer.
+ * @param[in] type Container type.
+ */
+ GenContainer(Type type);
+
+ /**
+ * @return First Item.
+ */
+ GenItem *getFirstItem() const;
+
+ /**
+ * @return Last Item.
+ */
+ GenItem *getLastItem() const;
+
+ /**
+ * @return Begin iterator.
+ */
+ GenIterator begin() const;
+
+ /**
+ * @return End iterator.
+ */
+ GenIterator end() const;
+
+ /**
+ * @brief Insert item at specified position.
+ * @param[in] item Item to insert
+ * @param[in] parent Parent item
+ * @param[in] sibling Sibling item
+ * @param[in] position Insert before/after @a sibling
+ * @remarks Inserting item BEFORE nullptr (@a sibling)
+ * actually means that there is no items after it (i.e. item is appended).
+ * Same goes for inserting AFTER nullptr (i.e. item is prepended).
+ * This might seem like a counter-intuitive behavior but it supports
+ * commonly used pattern.
+ */
+ void insert(GenItem *item, GenItem *parent = nullptr, GenItem *sibling = nullptr,
+ Position position = Before);
+
+ /**
+ * @brief Update specific parts of realized items.
+ * @param[in] parts The name of item parts
+ * @param[in] type The type of item parts
+ * @see Elm_Genlist_Item_Field_Type or Elm_Gengrid_Item_Field_Type
+ */
+ void update(const char *parts, int type);
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ static void onItemSelected(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+ static void onItemLongpressed(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+ static void onItemRealized(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+ static void onItemUnrealized(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+
+ const struct GenContainerApi *m_Api;
+ };
+}
+
+#endif /* UI_GEN_CONTAINER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GEN_GROUP_ITEM_H
+#define UI_GEN_GROUP_ITEM_H
+
+#include "Ui/GenContainer.h"
+#include "Ui/GenItem.h"
+
+#include <string>
+#include <vector>
+
+namespace Ui
+{
+ class EXPORT_API GenGroupItem : virtual public GenItem
+ {
+ public:
+ /**
+ * @brief Create group item.
+ * @param[in] title Item title (can be translatable)
+ */
+ explicit GenGroupItem(const char *title = nullptr);
+ virtual ~GenGroupItem() override;
+
+ /**
+ * @return Group first child Item.
+ */
+ GenItem *getFirstItem() const;
+
+ /**
+ * @return Group last child Item.
+ */
+ GenItem *getLastItem() const;
+
+ /**
+ * @return Group begin iterator.
+ */
+ GenIterator begin();
+
+ /**
+ * @return Group end iterator.
+ */
+ GenIterator end();
+
+ /**
+ * @return Child items count.
+ */
+ size_t getItemCount() const;
+
+ /**
+ * @return Whether the group has no items (i.e. GroupItem has no subitems).
+ */
+ bool isEmpty() const;
+
+ /**
+ * @return Whether subitems are shown.
+ */
+ bool isExpanded() const;
+
+ /**
+ * @return Group item of the next group or nullptr if none.
+ */
+ GenGroupItem *getNextGroupItem() const;
+
+ /**
+ * @return Group item of the previous group or nullptr if none.
+ */
+ GenGroupItem *getPrevGroupItem() const;
+
+ /**
+ * @brief Insert sub item to the group.
+ * @details If group item is not yet inserted itself, sub item is cached
+ * and inserted into container when it's parent is inserted.
+ * @see GenContainer::insert()
+ */
+ void insertSubItem(GenItem *item, GenItem *sibling = nullptr,
+ GenContainer::Position position = GenContainer::Before);
+
+ protected:
+ /**
+ * @see GenItem::isGroupItem()
+ */
+ virtual bool isGroupItem() const override { return true; }
+
+ /**
+ * @see GenItem::getType()
+ */
+ virtual Elm_Genlist_Item_Type getType() const override { return ELM_GENLIST_ITEM_GROUP; }
+
+ /**
+ * @see GenItem::getItemClass()
+ */
+ virtual Elm_Gen_Item_Class *getItemClass() const override;
+
+ /**
+ * @brief Sets item title into "elm.text" part.
+ * @see GenItem::getText()
+ */
+ virtual char *getText(Evas_Object *parent, const char *part) override;
+
+ /**
+ * @brief Inserts all subitems.
+ * @see GenItem::onInserted()
+ */
+ virtual void onInserted() override;
+
+ /**
+ * @brief Pops all subitems.
+ * @see GenItem::onPop()
+ */
+ virtual void onPop() override;
+
+ /**
+ * @brief Called when tree item is expanded or contracted.
+ */
+ virtual void onExpanded(bool isExpanded);
+
+ private:
+ friend class Genlist;
+
+ void insertSubItems();
+ void popSubItems();
+
+ std::string m_Title;
+ std::vector<GenItemPtr> m_ItemsCache;
+ };
+}
+
+#endif /* UI_GEN_GROUP_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GEN_ITEM_H
+#define UI_GEN_ITEM_H
+
+#include "Ui/GenContainer.h"
+#include "Utils/String.h"
+
+#include <functional>
+#include <memory>
+
+namespace Ui
+{
+ class GenItem;
+ class GenGroupItem;
+ typedef std::weak_ptr<GenItem> GenItemPtr;
+
+ class EXPORT_API GenItem
+ {
+ public:
+ /**
+ * @brief Called when item is selected.
+ */
+ typedef std::function<void()> SelectCallback;
+
+ /**
+ * @brief Called before item is destroyed.
+ */
+ typedef std::function<void()> DestroyCallback;
+
+ /**
+ * @brief Create generic container item.
+ * @param[in] type Parent container type
+ */
+ GenItem(GenContainer::Type type = GenContainer::TypeGenlist);
+ virtual ~GenItem();
+
+ /**
+ * @return Whether the item is realized.
+ */
+ bool isRealized() const;
+
+ /**
+ * @return Whether the item is inserted into container.
+ */
+ bool isInserted() const;
+
+ /**
+ * @return Whether the item is visible.
+ */
+ bool isVisible() const;
+
+ /**
+ * @return Whether the item is a group item.
+ */
+ virtual bool isGroupItem() const { return false; }
+
+ /**
+ * @return Whether the item can receive focus.
+ */
+ virtual bool isFocusable() const { return false; }
+
+ /**
+ * @return Item type.
+ */
+ virtual Elm_Genlist_Item_Type getType() const { return ELM_GENLIST_ITEM_NONE; }
+
+ /**
+ * @return Container object item.
+ */
+ Elm_Object_Item *getObjectItem() const;
+
+ /**
+ * @return Parent container.
+ */
+ GenContainer *getParent() const;
+
+ /**
+ * @return Parent group item or nullptr if none.
+ */
+ GenGroupItem *getParentItem() const;
+
+ /**
+ * @return Next item in container or nullptr if none.
+ */
+ GenItem *getNextItem() const;
+
+ /**
+ * @return Previous item in container or nullptr if none.
+ */
+ GenItem *getPrevItem() const;
+
+ /**
+ * @return GenItem weak pointer for safe referencing.
+ */
+ GenItemPtr getWeakPtr();
+
+ /**
+ * @brief Set item selection callback.
+ * @param[in] callback Callback to be called when item is selected
+ */
+ void setSelectCallback(SelectCallback callback);
+
+ /**
+ * @brief Set item destruction callback.
+ * @param[in] callback Callback to be called before item is destroyed
+ */
+ void setDestroyCallback(DestroyCallback callback);
+
+ /**
+ * @brief Scroll to the item.
+ * @param[in] position Item position on screen
+ * @param[in] isAnimated Whether scrolling is animated or immediate
+ * @see Elm_Genlist_Item_Scrollto_Type or Elm_Gengrid_Item_Scrollto_Type
+ */
+ void scrollTo(int position = ELM_GENLIST_ITEM_SCROLLTO_IN,
+ bool isAnimated = false);
+
+ /**
+ * @brief Scroll to the item and give it focus.
+ * @see GenItem::scrollTo()
+ */
+ void focus(Elm_Genlist_Item_Scrollto_Type position = ELM_GENLIST_ITEM_SCROLLTO_IN,
+ bool isAnimated = false);
+
+ /**
+ * @brief Update item part.
+ * @see elm_gelist_item_fields_update or elm_gengrid_item_fields_update
+ */
+ void update(const char *parts, int partType);
+
+ /**
+ * @brief Remove item from genlist without destroying it.
+ */
+ void pop();
+
+ protected:
+ /**
+ * @brief Create statically allocated item class
+ */
+ static Elm_Gen_Item_Class createItemClass(const char *style,
+ const char *decorateStyle = nullptr,
+ const char *editStyle = nullptr);
+
+ /**
+ * @return Generic item class of this item.
+ */
+ virtual Elm_Gen_Item_Class *getItemClass() const;
+
+ /**
+ * @brief Called whenever any item's text part needs to be updated.
+ * @param[in] parent Parent genlist
+ * @param[in] part Name of the part
+ * @return Allocated string with text for a specified part,
+ * it will be deallocated with free() by genlist.
+ */
+ virtual char *getText(Evas_Object *parent, const char *part) { return nullptr; }
+
+ /**
+ * @brief Called whenever any item's content part needs to be updated.
+ * @param[in] parent Parent genlist
+ * @param[in] part Name of the part
+ * @return Content for a specified part.
+ */
+ virtual Evas_Object *getContent(Evas_Object *parent, const char *part) { return nullptr; }
+
+ /**
+ * @brief Called whenever any item's state part needs to be updated
+ * @details Genlist will emit signal "elm,state,x,active" or "elm,state,x,passive"
+ * with part's name instead of 'x'.
+ * @param[in] parent Parent genlist
+ * @param[in] part Name of the part
+ * @return EINA_TRUE for active, EINA_FALSE for passive
+ */
+ virtual Eina_Bool getState(Evas_Object *parent, const char *part) { return EINA_FALSE; }
+
+ /**
+ * @brief Called when genlist filter is set using elm_genlist_filter_set().
+ * @param[in] filter Filter to compare with
+ * @return Whether the item satisfies the filter.
+ */
+ virtual bool compare(void *filter) { return true; }
+
+ /**
+ * @brief Called after item was inserted into genlist.
+ */
+ virtual void onInserted() { }
+
+ /**
+ * @brief Called before item is popped.
+ */
+ virtual void onPop() { }
+
+ /**
+ * @brief Called when item visibility changes via pop() or compare() or
+ * insertion into container.
+ */
+ virtual void onVisibilityChanged(bool isVisible) { }
+
+ /**
+ * @brief Called when item is selected.
+ */
+ virtual void onSelected() { }
+
+ /**
+ * @brief Called when item is longpressed.
+ * @return Whether event is handled and onSelected() shouldn't be called.
+ */
+ virtual bool onLongpressed() { return false; }
+
+ /**
+ * @brief Called when item is realized (its content is created).
+ */
+ virtual void onRealized() { }
+
+ /**
+ * @brief Called when item is unrealized and its text and content are
+ * deleted until it is realized again.
+ */
+ virtual void onUnrealized() { }
+
+ /**
+ * @brief Called when item is focused by calling focus().
+ */
+ virtual void onFocused() { }
+
+ private:
+ void updateVisibility();
+
+ friend class GenContainer;
+ void onInserted(Elm_Object_Item *item);
+ Eina_Bool onFiltered(Evas_Object *parent, void *filter);
+ void onDestroy(Evas_Object *genlist);
+
+ void onSelected(Elm_Object_Item *item);
+ void onLongpressed(Elm_Object_Item *item);
+ void onRealized(Elm_Object_Item *item);
+ void onUnrealized(Elm_Object_Item *item);
+
+ Elm_Object_Item *m_Item;
+ bool m_Preserve;
+ bool m_IsMatching;
+ bool m_IsRealized;
+ bool m_IsVisible;
+ bool m_IsFocusPending;
+ bool m_IsLongpressed;
+
+ std::shared_ptr<GenItem> m_SelfPtr;
+ SelectCallback m_OnSelected;
+ DestroyCallback m_OnDestroy;
+ const struct GenItemApi *m_Api;
+ };
+}
+
+#endif /* UI_GEN_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GEN_ITERATOR_H
+#define UI_GEN_ITERATOR_H
+
+#include <iterator>
+#include <tizen.h>
+
+namespace Ui
+{
+ class GenItem;
+
+ /**
+ * @brief GenContainer items iterator.
+ */
+ class EXPORT_API GenIterator :
+ public std::iterator<std::bidirectional_iterator_tag, GenItem *>
+ {
+ public:
+ /**
+ * @brief Create iterator
+ * @param[in] item Item pointed by iterator
+ */
+ GenIterator(GenItem *item = nullptr);
+
+ /**
+ * @brief Increment iterator.
+ */
+ GenIterator &operator++();
+ GenIterator operator++(int);
+
+ /**
+ * @brief Decrement iterator.
+ */
+ GenIterator &operator--();
+ GenIterator operator--(int);
+
+ /**
+ * @brief Dereference iterator.
+ */
+ GenItem *operator*() const;
+
+ /**
+ * @brief Compare iterators for inequality.
+ */
+ bool operator!=(const GenIterator &that) const;
+
+ private:
+ GenItem *m_Item;
+ };
+}
+
+#endif /* UI_GEN_ITERATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GENGRID_H
+#define UI_GENGRID_H
+
+#include "Ui/GenContainer.h"
+
+namespace Ui
+{
+ class EXPORT_API Gengrid : public GenContainer
+ {
+ public:
+ Gengrid();
+
+ /**
+ * @see GenContainer::insert()
+ */
+ void insert(GenItem *item, GenItem *sibling = nullptr, Position position = Before);
+ };
+}
+
+#endif /* UI_GENGRID_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_GENLIST_H
+#define UI_GENLIST_H
+
+#include "Ui/GenContainer.h"
+
+namespace Ui
+{
+ class EXPORT_API Genlist : public GenContainer
+ {
+ public:
+ Genlist();
+
+ protected:
+ virtual void onCreated() override;
+
+ private:
+ static void onItemExpanded(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+ static void onItemContracted(void *data, Evas_Object *obj, Elm_Object_Item *objectItem);
+ };
+}
+
+#endif /* UI_GENLIST_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_HOVERSEL_H
+#define UI_HOVERSEL_H
+
+#include "Ui/Selector.h"
+
+namespace Ui
+{
+ class View;
+
+ class EXPORT_API Hoversel : public Selector
+ {
+ public:
+ Hoversel();
+ virtual ~Hoversel() override;
+
+ /**
+ * @brief Add item with text.
+ * @param[in] text Item text
+ * @param[in] value Item data
+ * @return Added item on success, otherwise nullptr.
+ * @see Selector::addItem()
+ */
+ Elm_Object_Item *addItem(const char *text, void *data);
+
+ /**
+ * @see Selector::addItem()
+ */
+ virtual Elm_Object_Item *addItem(void *data) override;
+
+ /**
+ * @brief Set text of currently selected item.
+ * @param[in] text Text to be displayed in hoversel button
+ */
+ void setText(const char *text);
+
+ /**
+ * @see Selector::setSelectedItem()
+ */
+ virtual void setSelectedItem(Elm_Object_Item *item) override;
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ void onViewNavigation(Evas_Object *obj, void *eventInfo);
+ void onSelected(Evas_Object *hoversel, Elm_Object_Item *item);
+ static void onExpanded(void *data, Evas_Object *hoversel, void *eventInfo);
+ static void onDismissed(void *data, Evas_Object *hoversel, void *eventInfo);
+ static void onBackPressed(void *data, Evas_Object *hoversel, void *eventInfo);
+
+ View *m_View;
+ };
+}
+
+#endif /* UI_HOVERSEL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_LIST_POPUP_H
+#define UI_LIST_POPUP_H
+
+#include "Ui/Popup.h"
+
+namespace Ui
+{
+ class EXPORT_API ListPopup : public Popup
+ {
+ public:
+ /**
+ * @brief Specific item selection callback.
+ */
+ typedef std::function<void()> ItemSelectCallback;
+
+ /**
+ * @brief Any item selection callback.
+ * @param[in] Item data
+ */
+ typedef std::function<void(void *)> SelectCallback;
+
+ /**
+ * @brief Create list popup
+ * @param[in] itemStyle Genlist item style
+ */
+ ListPopup(const char *itemStyle = "type1");
+ virtual ~ListPopup() override;
+
+ /**
+ * @brief Add ListPopup item
+ * @param[in] text Main text of the item
+ * @param[in] data Data associated with the item
+ * @param[in] callback Callback to be called when item is selected
+ * @return Added item on success, otherwise nullptr
+ */
+ Elm_Object_Item *addItem(std::string text, void *data, ItemSelectCallback callback = nullptr);
+ Elm_Object_Item *addItem(std::string text, ItemSelectCallback callback = nullptr);
+ Elm_Object_Item *addItem(void *data, ItemSelectCallback callback = nullptr);
+
+ /**
+ * @brief Set item selection callback.
+ * @param[in] callback Callback to be called when any item is selected
+ */
+ void setSelectCallback(SelectCallback callback);
+
+ protected:
+ /**
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ /**
+ * @brief Create genlist
+ */
+ Evas_Object *createGenlist(Evas_Object *parent);
+
+ /**
+ * @brief Called when item's text part needs to be updated.
+ * @details If "elm.text" part is not handled in this function then it will
+ * contain the text specified in ListPopup::addItem().
+ * @see Elm_Gen_Item_Text_Get_Cb.
+ */
+ virtual char *getItemText(void *data, const char *part) { return nullptr; }
+
+ /**
+ * @brief Called when item's content part needs to be updated.
+ * @see Elm_Gen_Item_Content_Get_Cb.
+ */
+ virtual Evas_Object *getItemContent(void *data, const char *part) { return nullptr; }
+
+ /**
+ * @brief Called when any item is selected.
+ * @param[in] data Item data
+ */
+ virtual void onItemSelected(void *data) { }
+
+ private:
+ struct ItemData;
+
+ static char *getText(ItemData *itemData, Evas_Object *genlist, const char *part);
+ static Evas_Object *getContent(ItemData *itemData, Evas_Object *genlist, const char *part);
+ static void onSelected(ListPopup *popup, Evas_Object *genlist, Elm_Object_Item *item);
+
+ void updateGenlistHeight();
+ void updateMaxHeight();
+
+ void onGenlistResized(Evas *e, Evas_Object *genlist, void *eventInfo);
+ void onWindowResized(Evas *e, Evas_Object *window, void *eventInfo);
+
+ Evas_Coord_Size m_GenlistSize;
+ int m_MaxHeight;
+ bool m_IsResizing;
+
+ Evas_Object *m_Window;
+ Evas_Object *m_Genlist;
+ Elm_Genlist_Item_Class *m_ItemClass;
+ SelectCallback m_OnSelected;
+ };
+}
+
+#endif /* UI_LIST_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_MENU_H
+#define UI_MENU_H
+
+#include "Ui/Control.h"
+#include <functional>
+
+namespace Ui
+{
+ class View;
+ class Window;
+
+ class EXPORT_API Menu : public Control
+ {
+ public:
+ /**
+ * @brief Item selection callback
+ */
+ typedef std::function<void()> ItemCallback;
+
+ Menu();
+ virtual ~Menu() override;
+
+ /**
+ * @brief Add menu item
+ * @param[in] text Item text
+ * @param[in] callback Item selection callback
+ * @return Added item on success, otherwise nullptr
+ */
+ Elm_Object_Item *addItem(const char *text, ItemCallback callback);
+
+ /**
+ * @brief Show menu at the bottom of application window.
+ */
+ void show();
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ void onViewNavigation(Evas_Object *obj, void *eventInfo);
+ void onWindowResized(Evas *e, Evas_Object *obj, void *eventInfo);
+
+ static void onItemSelect(void *data, Evas_Object *obj, void *item);
+ static void onItemDestroy(void *data, Evas_Object *obj, void *item);
+ void onDismissed(Evas_Object *obj, void *eventInfo);
+
+ View *m_View;
+ Window *m_Window;
+ };
+}
+
+#endif /* UI_MENU_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_NAVIFRAME_H
+#define UI_NAVIFRAME_H
+
+#include "Ui/Navigator.h"
+#include "Ui/NaviframePage.h"
+#include <vector>
+
+namespace Ui
+{
+ /**
+ * @brief Naviframe wrapper
+ */
+ class EXPORT_API Naviframe : public Navigator
+ {
+ public:
+ DEFINE_CLASS_TYPE(Naviframe, Navigator)
+
+ Naviframe();
+
+ /**
+ * @brief Set visibility of Previous button in first page.
+ * @param[in] isVisible Whether Previous button is visible
+ */
+ void setFirstPagePrevButton(bool isVisible);
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual bool onBackPressed() override;
+
+ virtual NaviframePage *addPage(View *view) override;
+ virtual bool removePage(NavigatorPage *page) override;
+ virtual void navigateToPage(NavigatorPage *page) override;
+
+ private:
+ NaviframePage *getFirstPage() const;
+ NaviframePage *getLastPage() const;
+
+ Eina_Bool onItemPop(Elm_Object_Item *item);
+ void onTransition(Evas_Object *obj, void *eventInfo);
+ void onFirstPagePushed();
+ void updateCurrentPage();
+
+ Ecore_Job *m_Job;
+ bool m_IsFirstPagePrevButtonVisible;
+ std::vector<NavigatorPage *> m_PagesToRemove;
+ };
+}
+
+#endif /* UI_NAVIFRAME_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_NAVIFRAME_PAGE_H
+#define UI_NAVIFRAME_PAGE_H
+
+#include "Ui/NavigatorPage.h"
+
+namespace Ui
+{
+ class EXPORT_API NaviframePage : public NavigatorPage
+ {
+ public:
+ /**
+ * @brief Create naviframe page
+ * @param[in] naviItem Naviframe item
+ */
+ NaviframePage(Elm_Object_Item *naviItem);
+
+ /**
+ * @see NavigatorPage::setTitle()
+ */
+ virtual void setTitle(const char *title) override;
+
+ /**
+ * @see NavigatorPage::setSubtitle()
+ */
+ virtual void setSubtitle(const char *subtitle) override;
+
+ /**
+ * @see NavigatorPage::setTitleVisibility()
+ */
+ virtual void setTitleVisibility(bool isVisible) override;
+
+ /**
+ * @see NavigatorPage::setStyle()
+ */
+ virtual void setStyle(const char *style) override;
+
+ /**
+ * @see NavigatorPage::setContent()
+ */
+ virtual void setContent(const char *part, Evas_Object *content) override;
+
+ /**
+ * @brief Set visibility of Previous button.
+ * @param[in] isVisible Whether Previous button is visible
+ */
+ void setPrevButtonVisibility(bool isVisible);
+
+ private:
+ friend class Naviframe;
+
+ void onDestroy(Evas_Object *obj, void *eventInfo);
+ void onPrevPressed(Evas_Object *obj, void *eventInfo);
+
+ Elm_Object_Item *m_NaviItem;
+ };
+}
+
+#endif /* UI_NAVIFRAME_PAGE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_NAVIGATOR_H
+#define UI_NAVIGATOR_H
+
+#include "Ui/View.h"
+#include <functional>
+
+namespace Ui
+{
+ class NavigatorPage;
+
+ /**
+ * @brief Navigator base class.
+ */
+ class EXPORT_API Navigator : public View
+ {
+ public:
+ /**
+ * @brief Called when the navigator is about to navigate away
+ * from it's last remaining page.
+ * @return Whether to navigate from the last page.
+ */
+ typedef std::function<bool()> LastPageCallback;
+
+ Navigator();
+
+ /**
+ * @return Currently displayed page.
+ */
+ NavigatorPage *getCurrentPage() const;
+
+ /**
+ * @brief Add view to navigator.
+ * @details Adding a view may also result in navigating to it
+ * if it's a first view or this is a #StackNavigator.
+ * @param[in] view View to add
+ */
+ void addView(View *view);
+
+ /**
+ * @brief Remove the view from the navigator.
+ * @details If the removed view is a current view then the navigation
+ * will occur to the nearest view.
+ * @param[in] view View to remove
+ * @return Whether the view was removed.
+ */
+ bool removeView(View *view);
+
+ /**
+ * @brief Navigate to existing or new View.
+ * @param[in] view View to navigate to
+ */
+ void navigateTo(View *view);
+
+ /**
+ * @brief Set last page callback.
+ * @param[in] callback Last page navigation callback.
+ */
+ void setLastPageCallback(LastPageCallback callback);
+
+ /**
+ * @brief Unset last page callback.
+ */
+ void unsetLastPageCallback();
+
+ protected:
+ /**
+ * @brief Create new page for a view.
+ * @param[in] view View to add page for
+ * @return NavigatorPage for the view.
+ */
+ virtual NavigatorPage *addPage(View *view) = 0;
+
+ /**
+ * @brief Remove the page.
+ * @param[in] page Page to remove
+ * @return Whether the page was removed.
+ */
+ virtual bool removePage(NavigatorPage *page) = 0;
+
+ /**
+ * @brief Navigate to page.
+ * @param[in] page Page to navigate to
+ * @remark The page is guaranteed to be different from the current page.
+ */
+ virtual void navigateToPage(NavigatorPage *page) = 0;
+
+ /**
+ * @brief Set current page and notify pages about navigation.
+ * @param[in] page New current page
+ */
+ void setCurrentPage(NavigatorPage *page);
+
+ /**
+ * @see View::onNavigation()
+ */
+ virtual void onNavigation(bool isCurrent) override;
+
+ /**
+ * @see View::onRotationChanged()
+ */
+ virtual void onRotationChanged(int degree) override;
+
+ /**
+ * @see View::onBackPressed()
+ */
+ virtual bool onBackPressed() override;
+
+ /**
+ * @see View::onMenuPressed()
+ */
+ virtual void onMenuPressed() override;
+
+ private:
+ void notifyNavigation(NavigatorPage *page, bool isCurrent);
+
+ friend class NavigatorPage;
+ NavigatorPage *m_CurrentPage;
+ LastPageCallback m_OnLastPage;
+ };
+}
+
+#endif /* UI_NAVIGATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_NAVIGATOR_PAGE_H
+#define UI_NAVIGATOR_PAGE_H
+
+#include <Elementary.h>
+#include <tizen.h>
+
+namespace Ui
+{
+ class Navigator;
+ class View;
+
+ enum ButtonPosition
+ {
+ ButtonLeft,
+ ButtonRight
+ };
+
+ /**
+ * @brief Navigator page base class.
+ */
+ class EXPORT_API NavigatorPage
+ {
+ public:
+ NavigatorPage();
+ virtual ~NavigatorPage() { }
+
+ /**
+ * @return Parent navigator.
+ */
+ Navigator *getNavigator() const;
+
+ /**
+ * @return Contained view.
+ */
+ View *getView() const;
+
+ /**
+ * @brief Add button to page title.
+ * @param[in] position Button position
+ * @param[in] text Button translatable text
+ * @param[in] callback Button click callback
+ * @param[in] data Click callback data
+ * @return Added button.
+ */
+ Evas_Object *addTitleButton(ButtonPosition position, const char *text,
+ Evas_Smart_Cb callback, void *data);
+
+ /**
+ * @brief Set page title.
+ * @param[in] title Page title
+ */
+ virtual void setTitle(const char *title) = 0;
+
+ /**
+ * @brief Set page subtitle.
+ * @param[in] subtitle Page subtitle
+ */
+ virtual void setSubtitle(const char *subtitle) = 0;
+
+ /**
+ * @brief Set whether to show the page title.
+ * @param[in] isVisible Whether page title is visible
+ */
+ virtual void setTitleVisibility(bool isVisible) = 0;
+
+ /**
+ * @brief Set page style.
+ * @param[in] style Page style
+ */
+ virtual void setStyle(const char *style) = 0;
+
+ /**
+ * @brief Set page part content.
+ * @param[in] content Content to set to page part
+ */
+ virtual void setContent(const char *part, Evas_Object *content) = 0;
+
+ /**
+ * @brief Set whether to show page's title instead of navigator's.
+ */
+ virtual void setExpanded(bool isExpanded);
+
+ /**
+ * @brief Close the page and destroy its content.
+ */
+ void close();
+
+ private:
+ friend class Navigator;
+ void onNavigatorAttached(Navigator *navigator, View *view);
+
+ Navigator *m_Navigator;
+ View *m_View;
+ };
+}
+
+#endif /* UI_NAVIGATOR_PAGE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_POPUP_H
+#define UI_POPUP_H
+
+#include "Ui/Control.h"
+#include <functional>
+
+namespace Ui
+{
+ class View;
+ class Window;
+
+ class EXPORT_API Popup : public Control
+ {
+ public:
+ /**
+ * @brief Popup button press callback.
+ * @return Whether to close the popup.
+ */
+ typedef std::function<bool()> ButtonCallback;
+
+ Popup();
+ virtual ~Popup() override;
+
+ /**
+ * @brief Allows method overload instead of shadowing.
+ */
+ using Control::create;
+
+ /**
+ * @brief Create popup with title, text and close button.
+ * @param[in] parent Popup parent
+ * @param[in] title Popup title
+ * @param[in] text Popup text
+ * @param[in] buttonText Text for close button
+ * @return Created popup.
+ */
+ static Popup *create(Evas_Object *parent, const char *title,
+ const char *text, const char *buttonText);
+
+ /**
+ * @brief Set Popup title.
+ * @param[in] title Popup title
+ */
+ void setTitle(const char *title);
+
+ /**
+ * @brief Set Popup text.
+ * @param[in] text Popup text
+ */
+ void setText(const char *text);
+
+ /**
+ * @brief Set Popup content.
+ * @param[in] content Popup content
+ */
+ void setContent(Evas_Object *content);
+
+ /**
+ * @brief Set callback to be called when Popup is canceled.
+ * @param[in] callback Cancel callback
+ */
+ void setCancelCallback(ButtonCallback callback);
+
+ /**
+ * @brief Add Popup button.
+ * @param[in] text Button text
+ * @param[in] callback Button click callback
+ * @return Added button on success, otherwise nullptr.
+ */
+ Evas_Object *addButton(const char *text, ButtonCallback callback = nullptr);
+
+ /**
+ * @brief Show popup with animation.
+ */
+ void show();
+
+ /**
+ * @brief Close popup with animation.
+ */
+ void close();
+
+ protected:
+ /**
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ void onCanceled();
+
+ void onViewNavigation(Evas_Object *obj, void *eventInfo);
+ void onViewDestroy(Evas *e, Evas_Object *obj, void *eventInfo);
+
+ void onButtonPressed(Evas_Object *obj, void *eventInfo);
+ void onButtonDestroy(Evas *e, Evas_Object *obj, void *eventInfo);
+ void onBackPressed(Evas_Object *obj, void *eventInfo);
+ void onBlockPressed(Evas_Object *obj, void *eventInfo);
+ void onDismissed(Evas_Object *obj, void *eventInfo);
+
+ size_t m_ButtonCount;
+ ButtonCallback m_OnCanceled;
+
+ View *m_View;
+ Window *m_Window;
+ };
+}
+
+#endif /* UI_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_PROCESS_POPUP_H
+#define UI_PROCESS_POPUP_H
+
+#include "Ui/Popup.h"
+
+namespace Ui
+{
+ class EXPORT_API ProcessPopup : public Popup
+ {
+ public:
+ enum Size
+ {
+ SizeSmall,
+ SizeMedium
+ };
+
+ /**
+ * @brief Create popup.
+ * @param[in] size Popup size
+ * @param[in] showDelayTime Delay before showing popup
+ * @param[in] showMinTime Minimum time popup should be shown
+ */
+ explicit ProcessPopup(Size size = SizeMedium,
+ double showDelayTime = 0.2, double showMinTime = 1.0);
+ virtual ~ProcessPopup() override;
+
+ /**
+ * @brief Allows method overload instead of shadowing
+ */
+ using Control::create;
+
+ /**
+ * @brief Create process popup with text.
+ * @param[in] parent Popup parent
+ * @param[in] text Popup text
+ * @param[in] size Popup size
+ * @return Created popup
+ */
+ static ProcessPopup *create(Evas_Object *parent, const char *text, Size size = SizeMedium);
+
+ /**
+ * @brief Set Popup text.
+ * @param[in] text Popup text
+ */
+ void setText(const char *text);
+
+ /**
+ * @brief Close the popup once minimum show time has elapsed.
+ */
+ void close();
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ Eina_Bool onShowDelayElapsed();
+ Eina_Bool onShowMinElapsed();
+
+ Size m_Size;
+ Evas_Object *m_Layout;
+
+ Ecore_Timer *m_ShowDelayTimer;
+ Ecore_Timer *m_ShowMinTimer;
+ bool m_IsDestroyPending;
+ };
+}
+
+#endif /* UI_PROCESS_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef PROGRESS_CONTROLLER_H
+#define PROGRESS_CONTROLLER_H
+
+#include <Elementary.h>
+#include <condition_variable>
+#include <functional>
+#include <tizen.h>
+
+namespace Ui
+{
+ class ProgressPopup;
+
+ /**
+ * @brief Controller for ProgressPopup
+ */
+ class EXPORT_API ProgressController
+ {
+ public:
+ /**
+ * @brief Finish progress callback.
+ */
+ typedef std::function<void()> FinishCallback;
+
+ /**
+ * @brief Cancel progress callback.
+ */
+ typedef std::function<void()> CancelCallback;
+
+ /**
+ * @brief Create controller for ProgressPopup.
+ * @param[in] parent Parent object
+ * @param[in] title Progress popup title
+ * @param[in] maxValue max value of progress popup
+ */
+ ProgressController(Evas_Object *parent, const char *title, int maxValue);
+ ProgressController(const ProgressController &that) = delete;
+ virtual ~ProgressController();
+
+ ProgressController & operator=(const ProgressController &that) = delete;
+
+ /**
+ * @brief Run progress.
+ */
+ void run();
+
+ /**
+ * @brief Cancel the thread in which progress is running.
+ */
+ void cancel();
+
+ /**
+ * @brief Set finish function which is called when the progress is over.
+ * @param[in] callback Finish function
+ */
+ void setFinishCallback(FinishCallback callback);
+
+ /**
+ * @brief Set function which is called on progress cancellation
+ * @param[in] callback Cancel function
+ */
+ void setCancelCallback(CancelCallback callback);
+
+ /**
+ * @return Total count of progressed items
+ */
+ virtual size_t getTotalCount() const = 0;
+
+ protected:
+ /**
+ * @brief Called from another thread when progress starts.
+ */
+ virtual void onStart() = 0;
+
+ /**
+ * @brief Called from main loop if the running progress is canceled or failed to start.
+ */
+ virtual void onCanceled() { }
+
+ /**
+ * @brief Called when user cancels the progress.
+ * @return true for further cancellation of progress's thread, false - do nothing.
+ */
+ virtual bool onCancel();
+
+ /**
+ * @brief Set progress value.
+ * @remark Should be called from onStart().
+ * @param[in] value The value that will be set to progress.
+ * @return false if progress's thread is pending cancellation, otherwise - true.
+ */
+ bool onProgress(size_t value);
+
+ /**
+ * @brief Set max value for progress popup
+ * @param[in] value Progress total count value
+ */
+ void setTotalCount(size_t value);
+
+ private:
+ void createProgressPopup(Evas_Object *parent, const char *title, int maxValue);
+
+ static void onStart(void *data, Ecore_Thread *thread);
+ static void onNotify(void *data, Ecore_Thread *thread, void *msgData);
+ static void onFinish(void *data, Ecore_Thread *thread);
+ static void onCanceled(void *data, Ecore_Thread *thread);
+
+ private:
+ bool m_IsPopupUpdating;
+ FinishCallback m_OnFinish;
+ CancelCallback m_OnCancel;
+
+ std::condition_variable m_ContinueCondition;
+ Ecore_Thread *m_MainThread;
+ Ecore_Thread *m_Thread;
+
+ ProgressPopup *m_ProgressPopup;
+ Evas_Object *m_CancelButton;
+ };
+}
+
+#endif /* PROGRESS_CONTROLLER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_PROGRESS_POPUP_H
+#define UI_PROGRESS_POPUP_H
+
+#include "Ui/Popup.h"
+
+namespace Ui
+{
+ class EXPORT_API ProgressPopup : public Popup
+ {
+ public:
+ /**
+ * @brief Create progress popup.
+ * @param[in] maxValue Max value of progressbar
+ */
+ explicit ProgressPopup(size_t maxValue = 0);
+
+ /**
+ * @brief Set progress of the progressbar
+ * @param[in] value Progress value
+ */
+ void setProgress(size_t value);
+
+ /**
+ * @brief Set max value of progressbar
+ * @param[in] maxValue Max value of progressbar
+ */
+ void setMaxValue(size_t maxValue);
+
+ /**
+ * @return Max value of progressbar
+ */
+ size_t getMaxValue() const;
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ void updateTotalText();
+
+ size_t m_CurrentValue;
+ size_t m_MaxValue;
+ Evas_Object *m_Progressbar;
+ };
+}
+
+#endif /* UI_PROGRESS_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_RADIO_POPUP_H
+#define UI_RADIO_POPUP_H
+
+#include "Ui/ListPopup.h"
+#include <string>
+
+namespace Ui
+{
+ /**
+ * @brief Radio popup
+ */
+ class EXPORT_API RadioPopup : public ListPopup
+ {
+ public:
+ RadioPopup();
+
+ /**
+ * @brief Set selected item
+ * @param[in] value Selected item value
+ */
+ void setSelectedItem(int value);
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual Evas_Object *getItemContent(void *data, const char *part) override;
+ virtual void onItemSelected(void *data) override;
+
+ Evas_Object *m_RadioGroup;
+ };
+}
+#endif /* UI_RADIO_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_SCALE_H
+#define UI_SCALE_H
+
+#include <tizen.h>
+
+#define UI_BASE_SCALE 2.6
+
+namespace Ui
+{
+ /**
+ * @brief Scale the value using application base scale and device config scale
+ * @param[in] value Value to scale (usually pixels)
+ * @return Value multiplied by scale factor
+ */
+ EXPORT_API int getScaledValue(int value);
+}
+
+#endif /* UI_SCALE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_SCROLL_NAVIGATOR_H
+#define UI_SCROLL_NAVIGATOR_H
+
+#include "Ui/TabNavigator.h"
+#include "Ui/ScrollPage.h"
+#include <vector>
+
+namespace Ui
+{
+ /**
+ * @brief Scrollable page navigator.
+ */
+ class EXPORT_API ScrollNavigator : public TabNavigator
+ {
+ public:
+ /**
+ * @see TabNavigator::TabNavigator()
+ */
+ explicit ScrollNavigator(Selector *selector = nullptr);
+
+ /**
+ * @brief Set whether navigation is allowed either by user or by calling navigateTo().
+ * @param[in] isEnabled Whether navigation is enabled
+ */
+ void setNavigationEnabled(bool isEnabled);
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual ScrollPage *addPage(View *view) override;
+ virtual ScrollPage *createPage(View *view, Elm_Object_Item *item) override;
+ virtual void changePage(TabPage *page) override;
+
+ private:
+ size_t getPageIndex(TabPage *page) const;
+ TabPage *getPageByIndex(size_t index) const;
+
+ void onPageChanged(Evas_Object *obj, void *eventInfo);
+ void onResize(Evas *e, Evas_Object *obj, void *eventInfo);
+
+ Evas_Object *m_Scroller;
+ Evas_Object *m_Box;
+
+ Evas_Coord m_Width;
+ Evas_Coord m_Height;
+
+ bool m_IsNavigationEnabled;
+ };
+}
+
+#endif /* UI_SCROLL_NAVIGATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_SCROLL_PAGE_H
+#define UI_SCROLL_PAGE_H
+
+#include "Ui/TabPage.h"
+
+namespace Ui
+{
+ /**
+ * @brief ScrollNavigator page.
+ */
+ class EXPORT_API ScrollPage : public TabPage
+ {
+ public:
+ /**
+ * @brief Create page.
+ * @param[in] tabItem Selector control item
+ */
+ ScrollPage(Elm_Object_Item *tabItem);
+
+ /**
+ * @see NavigatorPage::setExpanded()
+ */
+ virtual void setExpanded(bool isExpanded) override;
+
+ private:
+ friend class ScrollNavigator;
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ Evas_Object *m_Sizer;
+ };
+}
+
+#endif /* UI_SCROLL_PAGE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_SELECTOR_H
+#define UI_SELECTOR_H
+
+#include "Ui/Control.h"
+#include <functional>
+
+namespace Ui
+{
+ /**
+ * @brief Interface for controls that provide item selection functionality.
+ */
+ class EXPORT_API Selector : public Control
+ {
+ public:
+ /**
+ * @brief Item selection callback.
+ * @param[in] Item data
+ * @return Whether to perform the default action if any.
+ */
+ typedef std::function<bool(void *)> SelectCallback;
+
+ /**
+ * @brief Add item.
+ * @param[in] value Item data which will be passed to SelectedCallback
+ * @return Added item on success, otherwise nullptr.
+ */
+ virtual Elm_Object_Item *addItem(void *data) = 0;
+
+ /**
+ * @brief Set whether selection is enabled.
+ * @param[in] isEnabled Whether selection is enabled
+ */
+ virtual void setSelectEnabled(bool isEnabled);
+
+ /**
+ * @brief Set which item is currently selected.
+ * @param[in] item Item to be selected
+ */
+ virtual void setSelectedItem(Elm_Object_Item *item) = 0;
+
+ /**
+ * @brief Set item selection callback.
+ * @param[in] callback Callback to be called after item was selected
+ */
+ void setSelectCallback(SelectCallback callback);
+
+ protected:
+ /**
+ * @brief Item selection callback.
+ * @param[in] item Selected item
+ */
+ bool onSelected(Elm_Object_Item *item);
+
+ SelectCallback m_OnSelected;
+ };
+}
+
+#endif /* UI_SELECTOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_TAB_NAVIGATOR_H
+#define UI_TAB_NAVIGATOR_H
+
+#include "Ui/Navigator.h"
+#include "Ui/TabPage.h"
+#include <vector>
+
+namespace Ui
+{
+ class Selector;
+
+ /**
+ * @brief Basic tab navigator with optional selector control.
+ */
+ class EXPORT_API TabNavigator : public Navigator
+ {
+ public:
+ /**
+ * @brief Create TabNavigator.
+ * @param[in] selector Selector control to use for navigation
+ */
+ explicit TabNavigator(Selector *selector = nullptr);
+
+ protected:
+ /**
+ * @brief Navigator's pages.
+ */
+ typedef std::vector<TabPage *> Pages;
+
+ /**
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ /**
+ * @brief Sets page style and inserts selector.
+ * @see View::onPageAttached()
+ */
+ virtual void onPageAttached(NavigatorPage *page) override;
+
+ /**
+ * @return Selector control used for navigation.
+ */
+ Selector *getSelector() const;
+
+ /**
+ * @return Navigator's pages.
+ */
+ const Pages &getPages() const;
+
+ /**
+ * @see Navigator::addPage()
+ */
+ virtual TabPage *addPage(View *view) override;
+
+ /**
+ * @see Navigator::removePage()
+ */
+ virtual bool removePage(NavigatorPage *page) override;
+
+ /**
+ * @see Navigator::navigateToPage()
+ */
+ virtual void navigateToPage(NavigatorPage *page) override;
+
+ /**
+ * @brief Create page specific to the navigator.
+ * @param[in] view View to create page for
+ * @param[in] item Selector item associated with the page
+ * @return New navigator page.
+ */
+ virtual TabPage *createPage(View *view, Elm_Object_Item *item);
+
+ /**
+ * @brief Switch from current page to another page.
+ * @param[in] page Page to show
+ */
+ virtual void changePage(TabPage *page);
+
+ private:
+ bool onSelected(void *data);
+
+ Selector *m_Selector;
+ Pages m_Pages;
+ };
+}
+
+#endif /* UI_TAB_NAVIGATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_TAB_PAGE_H
+#define UI_TAB_PAGE_H
+
+#include "Ui/Control.h"
+#include "Ui/NavigatorPage.h"
+
+namespace Ui
+{
+ /**
+ * @brief TabNavigator page.
+ */
+ class EXPORT_API TabPage : public Control, public NavigatorPage
+ {
+ public:
+ /**
+ * @brief Create page.
+ * @param[in] tabItem Selector control item associated with the page
+ */
+ TabPage(Elm_Object_Item *tabItem);
+ virtual ~TabPage() override;
+
+ /**
+ * @brief Set tab item title to be different from page title.
+ * @param[in] title Tab item title text
+ */
+ void setTabTitle(const char *title);
+
+ /**
+ * @brief Set tab item title to be the same as page title.
+ */
+ void unsetTabTitle();
+
+ /**
+ * @see NavigatorPage::setTitle()
+ */
+ virtual void setTitle(const char *title) override;
+
+ /**
+ * @see NavigatorPage::setSubtitle()
+ */
+ virtual void setSubtitle(const char *subtitle) override;
+
+ /**
+ * @see NavigatorPage::setTitleVisibility()
+ */
+ virtual void setTitleVisibility(bool isVisible) override;
+
+ /**
+ * @see NavigatorPage::setStyle()
+ */
+ virtual void setStyle(const char *style) override;
+
+ /**
+ * @see NavigatorPage::setContent()
+ */
+ virtual void setContent(const char *part, Evas_Object *content) override;
+
+ protected:
+ /**
+ * @return Selector control item associated with the page.
+ */
+ Elm_Object_Item *getTabItem() const;
+
+ /**
+ * @brief Creates page layout.
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ friend class TabNavigator;
+ void onTabItemDestroy(Evas_Object *obj, void *eventInfo);
+
+ Elm_Object_Item *m_TabItem;
+ Evas_Object *m_Page;
+ bool m_HasTabTitle;
+ };
+}
+
+#endif /* UI_TAB_PAGE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_TABBAR_H
+#define UI_TABBAR_H
+
+#include "Ui/Selector.h"
+
+namespace Ui
+{
+ /**
+ * @brief Selector control for switching between tabs.
+ */
+ class EXPORT_API Tabbar : public Selector
+ {
+ public:
+ /**
+ * @see Selector::addItem()
+ */
+ virtual Elm_Object_Item *addItem(void *data) override;
+
+ /**
+ * @see Selector::setSelectEnabled()
+ */
+ virtual void setSelectEnabled(bool isEnabled) override;
+
+ /**
+ * @see Selector::setSelectedItem()
+ */
+ virtual void setSelectedItem(Elm_Object_Item *item) override;
+
+ protected:
+ /**
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ void onSelected(Evas_Object *tabbar, Elm_Object_Item *item);
+ };
+}
+
+#endif /* UI_TABBAR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_THUMBNAIL_H
+#define UI_THUMBNAIL_H
+
+#include "Ui/Control.h"
+
+namespace Ui
+{
+ class EXPORT_API Thumbnail : public Control
+ {
+ public:
+ enum Size
+ {
+ SizeSmall,
+ SizeMedium,
+ SizeLarge
+ };
+
+ /**
+ * @brief Create thumbnail
+ * @param[in] size Thumbnail size
+ */
+ Thumbnail(Size size);
+
+ /**
+ * @brief Allows method overload instead of shadowing
+ */
+ using Control::create;
+
+ /**
+ * @brief Create thumbnail
+ * @param[in] parent Thumbnail parent
+ * @param[in] size Thumbnail size
+ * @param[in] path Thumbnail Image path or nullptr for default image
+ * @return Created thumbnail
+ */
+ static Thumbnail *create(Evas_Object *parent, Size size, const char *path = nullptr);
+
+ /**
+ * @return Thumbnail image object.
+ */
+ Evas_Object *getImage() const;
+
+ /**
+ * @brief Set thumbnail image path
+ * @param[in] path Image path or nullptr for default image
+ */
+ void setImagePath(const char *path);
+
+ /**
+ * @brief Set whether minimal size hint is set for image
+ * @param[in] isSet Whether to set image size hint
+ */
+ void setSizeHint(bool isSet);
+
+ protected:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ private:
+ Size m_Size;
+ Evas_Object *m_Image;
+ };
+}
+
+#endif /* UI_THUMBNAIL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_VIEW_H
+#define UI_VIEW_H
+
+#include "Ui/Control.h"
+#include "Ui/NavigatorPage.h"
+
+#define EVENT_VIEW_NAVIGATION "navigation"
+
+namespace Ui
+{
+ class Navigator;
+
+ /**
+ * @brief Represents content of a Window or Navigator page
+ */
+ class EXPORT_API View : public Control
+ {
+ public:
+ DEFINE_CLASS_TYPE(View, Control)
+
+ View();
+
+ /**
+ * @brief Get parent Navigator
+ * @param[in] type Navigator type
+ * @return Innermost parent Naviframe.
+ */
+ Navigator *getNavigator() const;
+
+ /**
+ * @return NavigatorPage of this View
+ */
+ NavigatorPage *getPage() const;
+
+ /**
+ * @return Whether the view is currently displayed in parent Navigator.
+ */
+ bool isCurrent() const;
+
+ /**
+ * @return Rotation degree.
+ */
+ int getRotation() const;
+
+ protected:
+ /**
+ * @brief Called after Navigator has navigated to or from this View
+ * @param[in] isCurrent Specifies the new state of this View
+ */
+ virtual void onNavigation(bool isCurrent) { }
+
+ /**
+ * @brief Called when device orientation is changed
+ * @param[in] degree Rotation angle
+ */
+ virtual void onRotationChanged(int degree) { }
+
+ /**
+ * @brief Called when NavigatorPage is attached to this View
+ */
+ virtual void onPageAttached(NavigatorPage *page) { }
+
+ /**
+ * @brief Called when "back" button is pressed
+ * @return true to navigate to the previous view, otherwise false
+ */
+ virtual bool onBackPressed() { return true; }
+
+ /**
+ * @brief Called when "menu" button is pressed
+ */
+ virtual void onMenuPressed() { }
+
+ private:
+ friend class Window;
+ friend class Navigator;
+ void onNavigatorAttached(NavigatorPage *page);
+ void onNavigation(bool isCurrent, int degree);
+ void onRotation(int degree);
+
+ NavigatorPage *m_Page;
+ bool m_IsCurrent;
+ int m_Rotation;
+ };
+}
+
+#endif /* UI_VIEW_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UI_WINDOW_H
+#define UI_WINDOW_H
+
+#include "Ui/Control.h"
+#include <functional>
+
+namespace Ui
+{
+ class View;
+
+ /**
+ * @brief Application main window
+ */
+ class EXPORT_API Window : public Control
+ {
+ public:
+ Window();
+
+ /**
+ * @return Conformant Evas_Object.
+ */
+ Evas_Object *getConformant() const;
+
+ /**
+ * @return Basic Window layout Evas_Object.
+ */
+ Evas_Object *getBaseLayout() const;
+
+ /**
+ * @brief Set whether windows supports rotation.
+ * @param[in] isEnabled Whether rotation is enabled
+ */
+ void setRotationEnabled(bool isEnabled);
+
+ /**
+ * @brief Attach main View to be displayed in the Window.
+ * @param[in] view Window main View
+ */
+ void attachView(View *view);
+
+ protected:
+ /**
+ * @see Control::onCreate()
+ */
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+
+ /**
+ * @brief Called to create window Evas_Object.
+ * @return Window Evas_Object.
+ */
+ virtual Evas_Object *onWindowCreate();
+
+ private:
+ void onFocused(Evas_Object *obj, void *eventInfo);
+ void onUnfocused(Evas_Object *obj, void *eventInfo);
+ void onRotationChanged(Evas_Object *obj, void *eventInfo);
+ void onBackPressed(Evas_Object *obj, void *eventInfo);
+ void onMenuPressed(Evas_Object *obj, void *eventInfo);
+
+ Evas_Object *m_Conform;
+ Evas_Object *m_Layout;
+ View *m_MainView;
+ };
+}
+
+#endif /* UI_WINDOW_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_CALLBACK_H
+#define UTILS_CALLBACK_H
+
+#include "Utils/CallbackImpl.h"
+
+/**
+ * @brief Make C-style callback from non-static class method with object as first parameter.
+ * @details Generates static member function by adding void* first parameter.
+ * Generated function forwards calls to specified method on object passed as first parameter.
+ * @par example
+ * @code
+ *
+ * class SomeView : public View
+ * {
+ * ...
+ * private:
+ * void onButtonPressed(Evas_Object *obj, void *eventInfo);
+ * }
+ *
+ * void SomeView::someMethod(Evas_Object *parent)
+ * {
+ * Evas_Object *button = elm_button_add(parent);
+ * evas_object_smart_callback_add(button, "clicked",
+ * makeCallback(&SomeView::onButtonPressed), this);
+ * ...
+ * }
+ *
+ * @endcode
+ */
+#define makeCallback(method) \
+ ::Utils::Callback<decltype(method)>::makeWithFirstParam<method>()
+
+/**
+ * @brief Make C-style callback from non-static class method with object as last parameter.
+ * @see makeCallback()
+ */
+#define makeCallbackWithLastParam(method) \
+ ::Utils::Callback<decltype(method)>::makeWithLastParam<method>()
+
+#endif /* UTILS_CALLBACK_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef CALLBACK_IMPL_H
+#define CALLBACK_IMPL_H
+
+namespace Utils
+{
+ template <typename F>
+ class Callback;
+
+ template <typename R, typename... A>
+ class Callback<R(A...)>
+ {
+ public:
+ template <class C, R(C::*Method)(A...)>
+ static R stubWithFirstParam(void *object, A... args)
+ {
+ return (static_cast<C*>(object)->*Method)(args...);
+ }
+
+ template <class C, R(C::*Method)(A...)>
+ static R stubWithLastParam(A... args, void *object)
+ {
+ return (static_cast<C*>(object)->*Method)(args...);
+ }
+ };
+
+ template <typename R, typename C, typename... A>
+ class Callback<R(C::*)(A...)>
+ {
+ public:
+ typedef R(*WithFirstParam)(void*, A...);
+ typedef R(*WithLastParam)(A..., void*);
+
+ template <R(C::*Method)(A...)>
+ static WithFirstParam makeWithFirstParam()
+ {
+ return &Callback<R(A...)>::template stubWithFirstParam<C, Method>;
+ }
+
+ template <R(C::*Method)(A...)>
+ static WithLastParam makeWithLastParam()
+ {
+ return &Callback<R(A...)>::template stubWithLastParam<C, Method>;
+ }
+ };
+}
+
+#endif /* CALLBACK_IMPL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_CALLBACK_MANAGER_H
+#define UTILS_CALLBACK_MANAGER_H
+
+#include <functional>
+#include <vector>
+
+namespace Utils
+{
+ /**
+ * @brief Provides possibility to store and invoke several callbacks at once.
+ * @param[in] Args Callback arguments types
+ */
+ template <typename... Args>
+ class CallbackManager
+ {
+ public:
+ /**
+ * @brief Callback prototype.
+ */
+ typedef std::function<void(Args...)> CallbackType;
+
+ /**
+ * @brief Callback and subscriber pair.
+ */
+ typedef std::pair<CallbackType, void *> Callback;
+
+ CallbackManager();
+
+ /**
+ * @return Whether there are any added callbacks.
+ */
+ explicit operator bool() const;
+
+ /**
+ * @brief Add new callback.
+ * @param[in] callback Callback and subscriber pair.
+ * @remark Subscriber can be any value by which the callback can be
+ * identified when removing it. However it is most convenient
+ * to identify it by the pointer to the object that receives it.
+ */
+ void operator+=(Callback callback);
+
+ /**
+ * @brief Remove added callback.
+ * @param[in] subscriber Callback subscriber.
+ */
+ void operator-=(void *subscriber);
+
+ /**
+ * @brief Invoke all added callbacks.
+ */
+ void operator()(Args... args);
+
+ private:
+ typedef std::vector<Callback> Callbacks;
+ Callbacks m_Callbacks;
+ int m_Index;
+ };
+}
+
+#include "Utils/CallbackManagerImpl.h"
+
+#endif /* UTILS_CALLBACK_MANAGER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_CALLBACK_MANAGER_IMPL_H
+#define UTILS_CALLBACK_MANAGER_IMPL_H
+
+#include "Utils/CallbackManager.h"
+
+/* -1 is a possible index if the first callback is removed during notification */
+#define INVALID_CALLBACK_INDEX -2
+
+namespace Utils
+{
+ template <typename... Args>
+ CallbackManager<Args...>::CallbackManager()
+ : m_Index(INVALID_CALLBACK_INDEX)
+ { }
+
+ template <typename... Args>
+ CallbackManager<Args...>::operator bool() const
+ {
+ return !m_Callbacks.empty();
+ }
+
+ template <typename... Args>
+ void CallbackManager<Args...>::operator+=(Callback callback)
+ {
+ m_Callbacks.push_back(std::move(callback));
+ }
+
+ template <typename... Args>
+ void CallbackManager<Args...>::operator-=(void *subscriber)
+ {
+ for (int i = 0; i < (int) m_Callbacks.size(); ++i) {
+ if (m_Callbacks[i].second == subscriber) {
+ if (i <= m_Index) {
+ --m_Index;
+ }
+ m_Callbacks.erase(m_Callbacks.begin() + i);
+ break;
+ }
+ }
+ }
+
+ template <typename... Args>
+ void CallbackManager<Args...>::operator()(Args... args)
+ {
+ if (m_Index > INVALID_CALLBACK_INDEX) {
+ return;
+ }
+
+ for (m_Index = 0; m_Index < (int) m_Callbacks.size(); ++m_Index) {
+ Callback &callback = m_Callbacks[m_Index];
+ if (callback.first) {
+ callback.first(args...);
+ }
+ }
+ m_Index = INVALID_CALLBACK_INDEX;
+ }
+}
+
+#endif /* UTILS_CALLBACK_MANAGER_IMPL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_CALLBACK_PAIR_H
+#define UTILS_CALLBACK_PAIR_H
+
+#include <functional>
+
+namespace Utils
+{
+ /**
+ * @brief Represents two callbacks to be called subsequently.
+ * @details Next callback is called each time when operator() is used.
+ */
+ class CallbackPair
+ {
+ public:
+ typedef std::function<void()> Callback;
+
+ /**
+ * @brief Create callback pair.
+ * @param[in] first First callback
+ * @param[in] second Second callback
+ */
+ CallbackPair(Callback first, Callback second)
+ : m_Callbacks{ std::move(first), std::move(second) }, m_IsFirst(true)
+ {
+ }
+
+ /**
+ * @brief Call next callback.
+ */
+ void operator()()
+ {
+ if (m_IsFirst) {
+ m_Callbacks.first();
+ } else {
+ m_Callbacks.second();
+ }
+ m_IsFirst = !m_IsFirst;
+ }
+
+ private:
+ std::pair<Callback, Callback> m_Callbacks;
+ bool m_IsFirst;
+ };
+
+ /**
+ * @brief Provides possibility to pass a result from first callback to the second.
+ * @see CallbackPair.
+ */
+ template <typename ResultType>
+ class CallbackPairWithResult
+ {
+ public:
+ /**
+ * @brief First callback.
+ * @return Result to pass to the second callback.
+ */
+ typedef std::function<ResultType()> FirstCallback;
+
+ /**
+ * @brief Second callback.
+ * @param[in] Result received from the first callback.
+ */
+ typedef std::function<void(ResultType)> SecondCallback;
+
+ /**
+ * @brief Create callback pair.
+ * @param[in] first First callback
+ * @param[in] second Second callback
+ */
+ CallbackPairWithResult(FirstCallback first, SecondCallback second)
+ : m_Callbacks{ std::move(first), std::move(second) }, m_IsFirst(true)
+ {
+ }
+
+ /**
+ * @brief Call next callback.
+ */
+ void operator()()
+ {
+ if (m_IsFirst) {
+ m_Result = m_Callbacks.first();
+ } else {
+ m_Callbacks.second(std::move(m_Result));
+ }
+ m_IsFirst = !m_IsFirst;
+ }
+
+ private:
+ std::pair<FirstCallback, SecondCallback> m_Callbacks;
+ ResultType m_Result;
+ bool m_IsFirst;
+ };
+}
+
+#endif /* UTILS_CALLBACK_PAIR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_ECORE_UTILS_H
+#define UTILS_ECORE_UTILS_H
+
+#include <Ecore.h>
+#include <functional>
+#include <tizen.h>
+
+namespace Utils
+{
+ /**
+ * @brief Job to be executed in main loop.
+ */
+ typedef std::function<void()> Job;
+
+ /**
+ * @brief Execute a functional object in main loop.
+ * @param[in] job Job to execute
+ * @return Ecore job handle.
+ */
+ EXPORT_API Ecore_Job *createJob(Job job);
+}
+
+#endif /* UTILS_ECORE_UTILS_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_ITERATOR_H
+#define UTILS_ITERATOR_H
+
+#include <iterator>
+#include <stddef.h>
+
+namespace Utils
+{
+ /**
+ * @brief Base class for index-based iterators.
+ * @details CRTP (Curiously Recurring Template Pattern) is used to generate
+ * operators that return or use derived type.
+ */
+ template <typename DerivedIterator,
+ typename ValueType,
+ typename Pointer = ValueType *,
+ typename Reference = ValueType &,
+ typename Distance = ptrdiff_t>
+ class IndexIterator :
+ public std::iterator<std::bidirectional_iterator_tag, ValueType, Distance, Pointer, Reference>
+ {
+ public:
+ /**
+ * @brief Create iterator from index.
+ * @param[in] index Current position of iterator
+ */
+ IndexIterator(size_t index = 0)
+ : m_Index(index) { }
+
+ /**
+ * @brief Dereference iterator.
+ */
+ Pointer operator->() const { return &*getDerived(); }
+
+ /**
+ * @brief Increment iterator.
+ */
+ DerivedIterator &operator++() { ++m_Index; return getDerived(); }
+ DerivedIterator operator++(int) { auto it(getDerived()); ++*this; return it; }
+
+ /**
+ * @brief Decrement iterator.
+ */
+ DerivedIterator &operator--() { --m_Index; return getDerived(); }
+ DerivedIterator operator--(int) { auto it(getDerived()); --*this; return it; }
+
+ /**
+ * @brief Compare iterators.
+ */
+ bool operator==(const IndexIterator &that) { return m_Index == that.m_Index; }
+ bool operator!=(const IndexIterator &that) { return m_Index != that.m_Index; }
+
+ protected:
+ /**
+ * @return Current index.
+ */
+ size_t getIndex() const { return m_Index; }
+
+ private:
+ DerivedIterator &getDerived() { return static_cast<DerivedIterator &>(*this); }
+ const DerivedIterator &getDerived() const { return static_cast<const DerivedIterator &>(*this); }
+
+ size_t m_Index;
+ };
+}
+
+#endif /* UTILS_ITERATOR_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_LOGGER_H
+#define UTILS_LOGGER_H
+
+#include <tizen.h>
+#include <dlog.h>
+
+namespace Utils
+{
+ /**
+ * @brief Sets the log tag
+ * @param[in] logTag The log tag
+ */
+ EXPORT_API void setLogTag(const char *logTag);
+
+ /**
+ * @brief Returns the log tag
+ * @return The log tag
+ */
+ EXPORT_API const char *getLogTag();
+}
+
+#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
+
+#include "Utils/Tracer.h"
+#define TRACE ::Utils::Tracer tracer(::Utils::getLogTag(), __MODULE__, __func__, __LINE__)
+
+#define DLOG(prio, fmt, arg...) dlog_print(prio, ::Utils::getLogTag(), "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg)
+#define DBG(fmt, arg...) DLOG(DLOG_DEBUG, fmt, ##arg)
+#define ERR(fmt, arg...) DLOG(DLOG_ERROR, fmt, ##arg)
+
+#define LOG_IF(expr, action, fmt, arg...) \
+if (expr) { \
+ ERR(fmt, ##arg); \
+ action; \
+}
+
+#define LOG_IF_ERR(code, action, fmt, arg...) \
+LOG_IF(code != TIZEN_ERROR_NONE, action, fmt " %s.", ##arg, get_error_message(code))
+
+#define WARN_IF(expr, fmt, arg...) \
+LOG_IF(expr, , fmt, ##arg)
+
+#define WARN_IF_ERR(code, fmt, arg...) \
+LOG_IF_ERR(code, , fmt, ##arg)
+
+#define RETM_IF(expr, fmt, arg...) \
+LOG_IF(expr, return, fmt, ##arg)
+
+#define RETM_IF_ERR(code, fmt, arg...) \
+LOG_IF_ERR(code, return, fmt, ##arg)
+
+#define RETVM_IF(expr, val, fmt, arg...) \
+LOG_IF(expr, return val, fmt, ##arg)
+
+#define RETVM_IF_ERR(code, val, fmt, arg...) \
+LOG_IF_ERR(code, return val, fmt, ##arg)
+
+#endif /* UTILS_LOGGER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_RANGE_H
+#define UTILS_RANGE_H
+
+#include <iterator>
+
+namespace Utils
+{
+ /**
+ * @brief Convenience wrapper around std::advance.
+ * @param[in] iterator Input iterator
+ * @param[in] distance Distance to advance iterator
+ * @return New iterator at @a distance from @a iterator.
+ */
+ template <typename Iter, typename Distance>
+ inline Iter advance(Iter iterator, Distance distance)
+ {
+ std::advance(iterator, distance);
+ return iterator;
+ }
+
+ /**
+ * @brief Convenience wrapper for iterator pair.
+ */
+ template <typename Iter>
+ class Range
+ {
+ public:
+ typedef typename std::iterator_traits<Iter>::reference reference;
+
+ Range() = default;
+
+ /**
+ * @brief Create iterator range from static array.
+ * @param[in] array Static array
+ */
+ template <typename T, size_t N>
+ Range(T(&array)[N])
+ : m_Begin(array), m_End(array + N) { }
+
+ /**
+ * @brief Create iterator range from begin iterator and element count
+ * @param[in] begin Begin iterator
+ * @param[in] count Count of elements until range's end
+ */
+ Range(Iter begin, size_t count)
+ : m_Begin(std::move(begin)), m_End(advance(m_Begin, count)) { }
+
+ /**
+ * @brief Create iterator range from pair of iterators
+ * @param[in] begin Begin iterator
+ * @param[in] end End iterator
+ */
+ Range(Iter begin, Iter end)
+ : m_Begin(std::move(begin)), m_End(std::move(end)) { }
+
+ /**
+ * @return Whether range is empty (i. e. begin() == end()).
+ */
+ bool empty() const { return !(m_Begin != m_End); }
+
+ /**
+ * @return Range element count.
+ */
+ size_t count() const { return std::distance(m_Begin, m_End); }
+
+ /**
+ * @return Range begin iterator.
+ */
+ Iter &begin() { return m_Begin; }
+
+ /**
+ * @return Range end iterator.
+ */
+ Iter &end() { return m_End; }
+
+ /**
+ * @return Range begin iterator.
+ */
+ const Iter &begin() const { return m_Begin; }
+
+ /**
+ * @return Range end iterator.
+ */
+ const Iter &end() const { return m_End; }
+
+ /**
+ * @see empty()
+ */
+ explicit operator bool() const { return !empty(); }
+
+ /**
+ * @brief Get range element by index.
+ * @param[in] index Element index
+ * @return Range element reference.
+ */
+ reference operator[](size_t index) const { return *advance(m_Begin, index); }
+
+ private:
+ Iter m_Begin;
+ Iter m_End;
+ };
+
+ /**
+ * @brief Create iterator range from static array.
+ */
+ template <typename T, size_t N>
+ inline Range<T*> makeRange(T(&array)[N])
+ {
+ return { array };
+ }
+
+ /**
+ * @brief Create iterator range from two iterators.
+ */
+ template <typename Iter1, typename Iter2,
+ typename Iter = typename std::common_type<Iter1, Iter2>::type>
+ inline Range<Iter> makeRange(Iter1 &&begin, Iter2 &&end)
+ {
+ return { std::forward<Iter1>(begin), std::forward<Iter2>(end) };
+ }
+
+ /**
+ * @brief Get static array element count.
+ * @param[in] array Static array
+ * @return Array element count.
+ */
+ template <typename T, size_t N>
+ inline size_t count(T(&array)[N])
+ {
+ return N;
+ }
+
+ /**
+ * @brief Get element by index from static array or a default value if out of bounds.
+ * @param[in] array Static array
+ * @param[in] index Element index
+ * @param[in] value Default value
+ * @return Array element or @a value. Array element is always copied.
+ */
+ template <typename T, size_t N>
+ inline T at(T(&array)[N], size_t index, T value = T())
+ {
+ return index < N ? array[index] : value;
+ }
+}
+
+#endif /* UTILS_RANGE_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_STRING_H
+#define UTILS_STRING_H
+
+#include <cctype>
+#include <cstring>
+
+namespace Utils
+{
+ /**
+ * @brief Compare strings for equality allowing null-pointers.
+ * @param[in] str1 First string
+ * @param[in] str2 Second string
+ * @return Whether strings are equal.
+ */
+ inline bool safeCmp(const char *str1, const char *str2)
+ {
+ return (str1 && str2) ? (strcmp(str1, str2) == 0) : (str1 == str2);
+ }
+
+ /**
+ * @brief Safely duplicate the string.
+ * @see strdup()
+ */
+ inline char *safeDup(const char *str)
+ {
+ return str ? strdup(str) : nullptr;
+ }
+
+ /**
+ * @brief Check whether string is empty or contains only whitespaces.
+ * @param[in] str String to check
+ * @return Whether string is empty.
+ */
+ inline bool isStrEmpty(const char *str)
+ {
+ if (str) {
+ for (; *str; ++str) {
+ if (!isspace(*str)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+}
+
+#endif /* UTILS_STRING_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_THREAD_H
+#define UTILS_THREAD_H
+
+#include <Ecore.h>
+#include <tizen.h>
+#include "Utils/CallbackPair.h"
+
+namespace Utils
+{
+ class EXPORT_API Thread
+ {
+ public:
+ typedef std::function<void()> Callback;
+
+ /**
+ * @brief Create and start a thread.
+ * @param[in] callbackPair Task and finish callbacks
+ * @see Utils::CallbackPair
+ */
+ explicit Thread(Callback callbackPair);
+
+ /**
+ * @brief Create and start a thread.
+ * @param[in] task Task to be executed in the thread
+ * @param[in] finishCallback Callback to be called when thread is finished
+ */
+ Thread(Callback task, Callback finishCallback);
+
+ private:
+ void onStart(Ecore_Thread *thread);
+ void onFinished(Ecore_Thread *thread);
+
+ Callback m_Callback;
+ };
+}
+
+#endif /* UTILS_THREAD_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_TRACER_H
+#define UTILS_TRACER_H
+
+#include <time.h>
+#include <tizen.h>
+
+namespace Utils
+{
+ /**
+ * @brief Code block logger. Writes logs when created and destroyed. Outputs elapsed time.
+ */
+ class EXPORT_API Tracer
+ {
+ public:
+ /**
+ * @brief Create tracer and write entry log.
+ * @param[in] tag Log tag
+ * @param[in] file Current source file
+ * @param[in] func Current function
+ * @param[in] line Current source line
+ */
+ Tracer(const char *tag, const char *file, const char *func, int line);
+ ~Tracer();
+
+ private:
+ const char *m_Tag;
+ const char *m_File;
+ const char *m_Func;
+ timespec m_startTime;
+ };
+}
+
+#endif /* UTILS_TRACER_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_DATE_POPUP_H
+#define UX_DATE_POPUP_H
+
+#include "Ui/Popup.h"
+#include <string>
+
+namespace Ux
+{
+ /**
+ * @brief Popup with date picker.
+ */
+ class EXPORT_API DatePopup : public Ui::Popup
+ {
+ public:
+ /**
+ * @brief Date input result callback.
+ * @param[in] Inputed date
+ */
+ typedef std::function<void(const tm &)> ResultCallback;
+
+ /**
+ * @brief Translatable strings table for popup elements.
+ */
+ struct Strings
+ {
+ const char *popupTitle; /**< Popup title */
+ const char *buttonDone; /**< "Done" button text */
+ const char *buttonCancel; /**< "Cancel" button text */
+ };
+
+ /**
+ * @brief Create date popup.
+ * @param[in] format Data format for elm_datetime_format_set()
+ * @param[in] date Initial date value
+ */
+ DatePopup(const char *format, tm date);
+
+ /**
+ * @brief Set translatable strings for popup.
+ * @remark Should be called before create().
+ * @param[in] strings Translatable strings table
+ */
+ void setStrings(Strings strings);
+
+ /**
+ * @brief Set date input result callback.
+ * @param[in] callback Callback to be called when user confirmed inputed date
+ */
+ void setResultCallback(ResultCallback callback);
+
+ /**
+ * @return Contained date picker.
+ */
+ Evas_Object *getDatePicker() const;
+
+ protected:
+ /**
+ * @brief Creates date picker and popup buttons.
+ * @see Control::onCreate()
+ */
+ virtual void onCreated() override;
+
+ private:
+ bool onDonePressed();
+
+ std::string m_Format;
+ tm m_Date;
+
+ Evas_Object *m_DatePicker;
+ ResultCallback m_OnResult;
+ Strings m_Strings;
+ };
+}
+
+#endif /* UX_DATE_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_EDITFIELD_POPUP_H
+#define UX_EDITFIELD_POPUP_H
+
+#include "Ui/Popup.h"
+
+namespace Ui
+{
+ class Editfield;
+}
+
+namespace Ux
+{
+ /**
+ * @brief Popup with editfield.
+ */
+ class EXPORT_API EditfieldPopup : public Ui::Popup
+ {
+ public:
+ /**
+ * @brief Called when user confirmation button is pressed.
+ * @param[in] Inputed text
+ * @return Whether to destroy the popup.
+ */
+ typedef std::function<bool(const char *)> ResultCallback;
+
+ /**
+ * @brief Translatable strings table for popup elements.
+ */
+ struct Strings
+ {
+ const char *popupTitle; /**< Popup title */
+ const char *guideText; /**< Entry guide text */
+ const char *buttonDone; /**< "Done" button text */
+ const char *buttonCancel; /**< "Cancel" button text */
+ const char *limitToastText; /**< Text of toast shown on reach of entry text limit */
+ };
+
+ EditfieldPopup();
+
+ /**
+ * @brief Set translatable strings for popup.
+ * @remark Should be called before create().
+ * @param[in] strings Translatable strings table
+ */
+ void setStrings(Strings strings);
+
+ /**
+ * @brief Set result callback.
+ * @param[in] callback Result callback
+ */
+ void setResultCallback(ResultCallback callback);
+
+ /**
+ * @return Contained editfield.
+ */
+ Ui::Editfield *getEditfield() const;
+
+ protected:
+ /**
+ * @brief Creates editfield and popup buttons.
+ * @see Control::onCreated()
+ */
+ virtual void onCreated() override;
+
+ private:
+ bool onDoneButtonPressed();
+ void onDoneKeyPressed(Evas_Object *entry, void *eventInfo);
+ static void onEntryChanged(Evas_Object *button, Evas_Object *entry, void *eventInfo);
+
+ Ui::Editfield *m_Editfield;
+ ResultCallback m_OnResult;
+ Strings m_Strings;
+ };
+}
+
+#endif /* UX_EDITFIELD_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_SELECT_ALL_ITEM_H
+#define UX_SELECT_ALL_ITEM_H
+
+#include "Ui/CheckItem.h"
+
+namespace Ux
+{
+ /**
+ * @brief "Select all" genlist item
+ */
+ class EXPORT_API SelectAllItem : public Ui::CheckItem
+ {
+ public:
+ /**
+ * @brief Create "Select all" item.
+ * @param[in] text Item text
+ */
+ SelectAllItem(const char *text);
+
+ protected:
+ /**
+ * @see GenItem::getItemClass()
+ */
+ virtual Elm_Gen_Item_Class *getItemClass() const override;
+
+ /**
+ * @see GenItem::getText()
+ */
+ virtual char *getText(Evas_Object *parent, const char *part) override;
+
+ /**
+ * @see GenItem::getContent()
+ */
+ virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
+
+ /**
+ * @see GenItem::onInserted()
+ */
+ virtual void onInserted() override;
+
+ private:
+ std::string m_Text;
+ };
+}
+
+#endif /* UX_SELECT_ALL_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_SELECT_ITEM_H
+#define UX_SELECT_ITEM_H
+
+#include "Ui/CheckItem.h"
+#include "Ux/SelectTypes.h"
+
+namespace Ux
+{
+ class SelectView;
+
+ /**
+ * @brief GenContainer item for SelectView that supports selection mode switching.
+ */
+ class EXPORT_API SelectItem : public Ui::CheckItem
+ {
+ public:
+ SelectItem(Ui::GenContainer::Type type = Ui::GenContainer::TypeGenlist);
+
+ /**
+ * @return Whether item is excluded from multiple selection.
+ */
+ bool isExcluded() const;
+
+ /**
+ * @brief Set item exclusion.
+ * @param[in] isExcluded Whether item is excluded from multiple selection
+ */
+ void setExcluded(bool isExcluded);
+
+ /**
+ * @return Item selection mode.
+ */
+ SelectMode getSelectMode() const;
+
+ /**
+ * @brief Set item selection mode.
+ */
+ void setSelectMode(SelectMode selectMode);
+
+ /**
+ * @return Selection result associated with the item.
+ */
+ SelectResult getSelectResult() const;
+
+ /**
+ * @return Whether item has custom selection result.
+ */
+ bool hasCustomResult() const;
+
+ /**
+ * @brief Set custom selection result to override the default result.
+ */
+ void setCustomResult(SelectResult result);
+
+ /**
+ * @brief Unset custom selection result to use default result.
+ */
+ void unsetCustomResult();
+
+ protected:
+ /**
+ * @return Default selection result associated with the item.
+ */
+ virtual SelectResult getDefaultResult() const = 0;
+
+ /**
+ * @see GenItem::getContent()
+ */
+ virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
+
+ /**
+ * @GenItem::onVisibilityChanged()
+ */
+ virtual void onVisibilityChanged(bool isVisible) override;
+
+ /**
+ * @see GenItem::onSelected()
+ */
+ virtual void onSelected() override;
+
+ /**
+ * @see CheckItem::onChecked()
+ */
+ virtual bool onChecked(bool isChecked) override;
+
+ /**
+ * @brief Called when selection mode was changed.
+ * @param[in] selectMode New selection mode
+ */
+ virtual void onSelectModeChanged(SelectMode selectMode) { }
+
+ private:
+ friend class SelectView;
+
+ SelectView *m_SelectView;
+ SelectMode m_SelectMode;
+ SelectResult m_CustomResult;
+ bool m_HasCustomResult;
+ bool m_IsExcluded;
+ };
+}
+
+#endif /* UX_SELECT_ITEM_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_SELECT_TYPES_H
+#define UX_SELECT_TYPES_H
+
+#include <functional>
+#include <vector>
+
+namespace Ux
+{
+ /**
+ * @brief Determines how items can be selected.
+ */
+ enum SelectMode
+ {
+ SelectNone, /**< Selection is disabled */
+ SelectSingle, /**< Only one item can be selected */
+ SelectMulti /**< Multiple items can be selected */
+ };
+
+ /**
+ * @brief Selection result.
+ */
+ struct SelectResult
+ {
+ unsigned type; /**< Result type (depends on result source) */
+ union Value
+ {
+ Value(void *data) : data(data) { }
+ Value(int id) : id(id) { }
+ void *data; /**< Result data */
+ int id; /**< Result data ID */
+ } value; /**< Result value (depends on type) */
+ };
+
+ /**
+ * @brief Range of consecutive selection results.
+ */
+ typedef std::vector<SelectResult> SelectResults;
+
+ /**
+ * @brief Callback to be called when selection is done.
+ * @param[in] Selection results
+ * @return Whether the component that provided the selection should be destroyed.
+ */
+ typedef std::function<bool(SelectResults)> SelectCallback;
+
+ /**
+ * @brief Callback to be called when cancel is pressed.
+ * @return Whether the component that provided the selection should be destroyed.
+ */
+ typedef std::function<bool()> CancelCallback;
+}
+
+#endif /* UX_SELECT_TYPES_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UX_SELECT_VIEW_H
+#define UX_SELECT_VIEW_H
+
+#include "Ui/View.h"
+#include "Ux/SelectAllItem.h"
+#include "Ux/SelectTypes.h"
+
+#include <vector>
+
+namespace Ui
+{
+ class GenItem;
+}
+
+namespace Ux
+{
+ class SelectItem;
+
+ /**
+ * @brief Base class for a view that support single and multiple selection modes.
+ */
+ class EXPORT_API SelectView : public Ui::View
+ {
+ public:
+ /**
+ * @brief Translatable strings table for view elements.
+ */
+ struct Strings
+ {
+ const char *selectAll; /**< "Select all" item text. */
+ const char *buttonDone; /**< "Done" button text. */
+ const char *buttonCancel; /**< "Cancel" button text. */
+ const char *titleDefault; /**< Title for #SelectNone mode. */
+ const char *titleSingle; /**< Title for #SelectSingle mode */
+ const char *titleMulti; /**< Title for #SelectMulti mode */
+ const char *titleWithCount; /**< Title for #SelectMulti mode with selection count.
+ Can contain one integer format specifier. */
+ const char *titleWithLimit; /**< Title for #SelectMulti mode with limit.
+ Can contain two integer format specifiers. */
+ const char *popupLimit; /**< Selection limit reached popup text.
+ Can contain one integer format specifiers. */
+ };
+
+ /**
+ * @brief Called when item's "checked" state changed in #SelectMulti mode.
+ * @param[in] item Changed item
+ * @param[in] isChecked Whether item is checked
+ * @param[in] isMultiChecked Whether item is being checked via "Select All"
+ * @return Whether item's state should be changed.
+ */
+ typedef std::function<bool(SelectItem *item, bool isChecked, bool isMultiChecked)> CheckCallback;
+
+ /**
+ * @brief Called when selection limit is reached.
+ * @return Whether limit popup should be shown.
+ */
+ typedef std::function<bool()> LimitCallback;
+
+ /**
+ * @brief Array of selectable items.
+ */
+ typedef std::vector<SelectItem *> SelectItems;
+
+ SelectView();
+ virtual ~SelectView() override;
+
+ /**
+ * @return View selection mode.
+ */
+ SelectMode getSelectMode() const;
+
+ /**
+ * @return Current selection limit.
+ */
+ size_t getSelectLimit() const;
+
+ /**
+ * @return Current selected items count.
+ */
+ size_t getSelectCount() const;
+
+ /**
+ * @return Selectable items managed by the view.
+ */
+ const SelectItems &getSelectItems() const;
+
+ /**
+ * @brief Set translatable strings for the view.
+ * @remark Should be called before create().
+ * @param[in] strings Translatable strings table
+ */
+ void setStrings(const Strings &strings);
+
+ /**
+ * @brief Set selection mode.
+ * @param[in] selectMode Selection mode
+ */
+ void setSelectMode(SelectMode selectMode);
+
+ /**
+ * @brief Set item selection limit.
+ * @param[in] selectLimit Maximum selectable items count
+ */
+ void setSelectLimit(size_t selectLimit);
+
+ /**
+ * @brief Enable active Done button despite number of selections.
+ * @param[in] isAllowed True - Done button should be enabled, otherwise false
+ */
+ void setEmptyResultAllowed(bool isAllowed);
+
+ /**
+ * @brief Set selection callback.
+ * @param[in] callback Selection callback
+ */
+ void setSelectCallback(SelectCallback callback);
+
+ /**
+ * @brief Set cancel callback.
+ * @param[in] callback Cancel callback
+ */
+ void setCancelCallback(CancelCallback callback);
+
+ /**
+ * @brief Set item check callback.
+ * @param[in] callback Check callback
+ */
+ void setCheckCallback(CheckCallback callback);
+
+ /**
+ * @brief Set limit callback.
+ * @param[in] callback Limit callback
+ */
+ void setLimitCallback(LimitCallback callback);
+
+ protected:
+ /**
+ * @brief Add selectable item to be managed by the view.
+ * @param[in] item Item to add
+ */
+ void addSelectItem(SelectItem *item);
+
+ /**
+ * @brief Remove selectable item.
+ * @param[in] item Item to remove
+ */
+ void removeSelectItem(SelectItem *item);
+
+ /**
+ * @brief Creates "Done" and "Cancel" buttons in #SelectMulti mode.
+ * @see View::onPageAttached()
+ */
+ virtual void onPageAttached(Ui::NavigatorPage *page) override;
+
+ /**
+ * @brief Calls cancel callback if it exists.
+ * @see View::onBackPressed()
+ */
+ virtual bool onBackPressed() override;
+
+ /**
+ * @brief Called when title was changed.
+ * @param[in] title Title
+ */
+ virtual void onTitleChanged(const char *title);
+
+ /**
+ * @brief Called when "Select All" item should be inserted.
+ * @param[in] item "Select All" genlist item
+ */
+ virtual void onSelectAllInsert(Ui::GenItem *item) { }
+
+ /**
+ * @brief Called when selection mode was changed.
+ * @param[in] selectMode New selection mode
+ */
+ virtual void onSelectModeChanged(SelectMode selectMode) { }
+
+ /**
+ * @brief Called when selection limit was changed.
+ * @param[in] selectLimit New selection limit
+ */
+ virtual void onSelectLimitChanged(size_t selectLimit) { }
+
+ /**
+ * @brief Called when selection count was changed.
+ * @param[in] selectCount New selection count
+ */
+ virtual void onSelectCountChanged(size_t selectCount) { }
+
+ private:
+ friend class SelectItem;
+
+ enum CountChange
+ {
+ CountIncrement,
+ CountDecrement
+ };
+
+ size_t getSelectMax() const;
+ bool isLimitReached() const;
+ bool isMaxSelected() const;
+
+ void updatePageTitle();
+ void updatePageButtons();
+ void updateSelectAllItem();
+
+ void updateDoneButtonState();
+ void updateSelectAllState();
+
+ void updateTotalCount(CountChange change, SelectItem *item);
+ void updateTotalSelectCount(CountChange change, SelectItem *item);
+
+ void updateVisibleCount(CountChange change, SelectItem *item);
+ void updateVisibleSelectCount(CountChange change, SelectItem *item);
+
+ void createPageButtons(Ui::NavigatorPage *page);
+ void destroyPageButtons();
+
+ void onItemExcluded(SelectItem *item, bool isExcluded);
+ void onItemVisibilityChanged(SelectItem *item, bool isVisible);
+ void onItemSelected(SelectItem *item);
+ bool onItemChecked(SelectItem *item, bool isChecked);
+ bool onSelectAllChecked(bool isChecked);
+
+ void onDonePressed(Evas_Object *button, void *eventInfo);
+ void onCancelPressed(Evas_Object *button, void *eventInfo);
+ void onLimitReached();
+
+ Ui::GenItemPtr m_SelectAllItem;
+ SelectItems m_Items;
+
+ Evas_Object *m_DoneButton;
+ Evas_Object *m_CancelButton;
+
+ bool m_IsMultiChecking;
+ size_t m_TotalCount;
+ size_t m_TotalSelectCount;
+ size_t m_VisibleCount;
+ size_t m_VisibleSelectCount;
+ size_t m_SelectLimit;
+ bool m_IsEmptyResultAllowed;
+
+ SelectMode m_SelectMode;
+ SelectCallback m_OnSelected;
+ CheckCallback m_OnChecked;
+ CancelCallback m_OnCanceled;
+ LimitCallback m_OnLimitReached;
+
+ Strings m_Strings;
+ };
+}
+
+#endif /* UX_SELECT_VIEW_H */
--- /dev/null
+
+# Project Name
+APPNAME = apps-common
+
+# Project Type
+type = sharedLib
+
+# Project Profile
+profile = mobile-3.0
+
+# C/CPP Sources
+USER_SRCS = src/*/*.cpp
+
+# EDC Sources
+USER_EDCS =
+
+# PO Sources
+USER_POS =
+
+# User Defines
+USER_DEFS =
+USER_CPP_DEFS =
+
+# User Undefines
+USER_UNDEFS =
+USER_CPP_UNDEFS =
+
+# User Libraries
+USER_LIBS =
+
+# User Objects
+USER_OBJS =
+
+# User Includes
+## C Compiler
+USER_C_INC_DIRS =
+USER_INC_FILES =
+## C++ Compiler
+USER_CPP_INC_DIRS = inc res/apps-common/edje
+USER_CPP_INC_FILES =
+
+USER_INC_DIRS = $(USER_C_INC_DIRS) $(USER_CPP_INC_DIRS)
+
+# User Library Path
+USER_LIB_DIRS =
+
+# EDC Resource Path
+USER_EDCS_IMAGE_DIRS = edje
+USER_EDCS_SOUND_DIRS = edje
+USER_EDCS_FONT_DIRS = edje
+
+# EDC Flags
+USER_EXT_EDC_KEYS = EDC0
+
+USER_EXT_EDC0_EDCS = res/*/edje/*.edc
+USER_EXT_EDC0_EDCS_IMAGE_DIRS = edje
+USER_EXT_EDC0_EDCS_SOUND_DIRS = edje
+USER_EXT_EDC0_EDCS_FONT_DIRS = edje
+
+# Resource Filter
+USER_RES_INCLUDE =
+USER_RES_EXCLUDE =
--- /dev/null
+set(EDCFILES apps-common-buttons.edc apps-common-popup.edc apps-common-thumbnail.edc apps-common-widget.edc)
+set(EDJDIR "${RES_DIR}/apps-common/edje")
+
+foreach(EDCFILE ${EDCFILES})
+ get_filename_component(EDJFILE ${EDCFILE} NAME_WE)
+ set(EDJFILE ${EDJFILE}.edj)
+
+ add_custom_target(${EDJFILE}
+ COMMAND edje_cc -id ${PROJECT_SOURCE_DIR}/edje edje/${EDCFILE} ${EDJFILE}
+ DEPENDS edje/${EDCFILE}
+ )
+
+ add_dependencies(${PROJECT_NAME} ${EDJFILE})
+ install(FILES ${EDJFILE} DESTINATION ${EDJDIR})
+endforeach(${EDCFILE})
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPS_COMMON_BUTTONS_H
+#define APPS_COMMON_BUTTONS_H
+
+#include "AppsCommonPath.h"
+
+#define APPS_COMMON_BUTTONS_EDJ APPS_COMMON_EDJ_DIR"apps-common-buttons.edj"
+
+#define STYLE_BUTTON_CUSTOM_DEFAULT "custom_default"
+#define STYLE_BUTTON_CUSTOM_SMALL "custom_small"
+#define STYLE_BUTTON_CUSTOM_CIRCLE "custom_circle"
+#define STYLE_BUTTON_CUSTOM_CIRCLE_NO_BG "custom_circle/no_bg"
+
+#define BUTTON_TEXT_CLASS "button_text"
+#define BUTTON_COLOR_CLASS_NORMAL "button_normal"
+#define BUTTON_COLOR_CLASS_PRESSED "button_pressed"
+#define BUTTON_COLOR_CLASS_UNPRESSED "button_unpressed"
+#define BUTTON_COLOR_CLASS_ICON_NORMAL "button_icon_normal"
+#define BUTTON_COLOR_CLASS_ICON_PRESSED "button_icon_pressed"
+
+#endif /* APPS_COMMON_BUTTONS_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPS_COMMON_PATH_H
+#define APPS_COMMON_PATH_H
+
+#define APPS_COMMON_IMG_DIR "apps-common/images/"
+#define APPS_COMMON_EDJ_DIR "apps-common/edje/"
+
+#endif /* APPS_COMMON_PATH_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPS_COMMON_POPUP_H
+#define APPS_COMMON_POPUP_H
+
+#include "AppsCommonPath.h"
+
+#define APPS_COMMON_POPUP_EDJ APPS_COMMON_EDJ_DIR"apps-common-popup.edj"
+
+#define LAYOUT_PROGRESS "progress"
+#define LAYOUT_PROCESS_SMALL "process_small"
+#define LAYOUT_PROCESS_MEDIUM "process_medium"
+
+#endif /* APPS_COMMON_POPUP_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPS_COMMON_THUMBNAIL_H
+#define APPS_COMMON_THUMBNAIL_H
+
+#include "AppsCommonPath.h"
+
+#define APPS_COMMON_THUMBNAIL_EDJ APPS_COMMON_EDJ_DIR"apps-common-thumbnail.edj"
+
+#define THUMBNAIL_DEFAULT_SMALL APPS_COMMON_IMG_DIR"contacts_caller_id_default_02.png"
+#define THUMBNAIL_DEFAULT_MEDIUM APPS_COMMON_IMG_DIR"contacts_caller_id_default_05.png"
+#define THUMBNAIL_DEFAULT_LARGE APPS_COMMON_IMG_DIR"contacts_caller_id_default_04.png"
+
+#define THUMBNAIL_BG_SMALL APPS_COMMON_IMG_DIR"contacts_caller_id_default_bg_02.png"
+#define THUMBNAIL_BG_MEDIUM APPS_COMMON_IMG_DIR"contacts_caller_id_default_bg_05.png"
+#define THUMBNAIL_BG_LARGE APPS_COMMON_IMG_DIR"contacts_caller_id_default_bg_04.png"
+
+#define THUMBNAIL_MASK_SMALL APPS_COMMON_IMG_DIR"contacts_caller_id_default_masking_02.png"
+#define THUMBNAIL_MASK_MEDIUM APPS_COMMON_IMG_DIR"contacts_caller_id_default_masking_05.png"
+#define THUMBNAIL_MASK_LARGE APPS_COMMON_IMG_DIR"contacts_caller_id_default_masking_04.png"
+
+#define LAYOUT_THUMBNAIL_SMALL "thumbnail_small"
+#define LAYOUT_THUMBNAIL_MEDIUM "thumbnail_medium"
+#define LAYOUT_THUMBNAIL_LARGE "thumbnail_large"
+
+#define LAYOUT_THUMBNAIL_DEFAULT_SMALL "default_thumbnail_small"
+#define LAYOUT_THUMBNAIL_DEFAULT_MEDIUM "default_thumbnail_medium"
+#define LAYOUT_THUMBNAIL_DEFAULT_LARGE "default_thumbnail_large"
+
+#define THUMBNAIL_SMALL_SIZE 98
+#define THUMBNAIL_MEDIUM_SIZE 180
+#define THUMBNAIL_LARGE_SIZE 270
+
+#endif /* APPS_COMMON_THUMBNAIL_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef APPS_COMMON_WIDGET_H
+#define APPS_COMMON_WIDGET_H
+
+#include "AppsCommonPath.h"
+
+#define APPS_COMMON_WIDGET_EDJ APPS_COMMON_EDJ_DIR"apps-common-widget.edj"
+
+#define NO_CONTENTS_BG APPS_COMMON_IMG_DIR"widget_no_contents_bg.#.png"
+#define NO_CONTENTS_BORDER APPS_COMMON_IMG_DIR"widget_no_contents_bg_stroke.#.png"
+
+#define LAYOUT_NO_CONTENTS "no_contents"
+#define LAYOUT_CONTENT "content"
+
+#define PART_BUTTON "swallow.button"
+#define PART_CONTENT "swallow.content"
+
+#endif /* APPS_COMMON_WIDGET_H */
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppsCommonButtons.h"
+#include "apps-common-utils.edc"
+
+#define BUTTON_CORNER_RADIUS "39"
+#define BUTTON_DEFAULT_H 78
+#define BUTTON_DEFAULT_TEXT_LR 32
+
+#define BUTTON_SMALL_CORNER_RADIUS "25"
+#define BUTTOM_SMALL_H 50
+#define BUTTON_SMALL_TEXT_LR 24
+
+#define BUTTON_CIRCLE_WH 98
+#define BUTTON_CIRCLE_CONTENT_WH 60
+#define BUTTON_CIRCLE_NO_BG_WH 80
+
+styles {
+ style {
+ name: "button_main";
+ base: "font=Tizen:style=Light font_size=40 align=center color=#fafafa text_class="BUTTON_TEXT_CLASS;
+ }
+}
+
+color_classes {
+ color_class {
+ name: BUTTON_COLOR_CLASS_NORMAL;
+ color: 82 198 216 255;
+ }
+ color_class {
+ name: BUTTON_COLOR_CLASS_PRESSED;
+ color: 0 0 0 77;
+ }
+ color_class {
+ name: BUTTON_COLOR_CLASS_UNPRESSED;
+ color: 0 0 0 0;
+ }
+ color_class {
+ name: BUTTON_COLOR_CLASS_ICON_NORMAL;
+ color: 250 250 250 255;
+ }
+ color_class {
+ name: BUTTON_COLOR_CLASS_ICON_PRESSED;
+ color: 250 250 250 255;
+ }
+}
+
+collections {
+ base_scale: 2.6;
+
+ plugins {
+ plugin {
+ name: "touch_sound";
+ source: "feedback";
+ param: "FEEDBACK_TYPE_SOUND FEEDBACK_PATTERN_TAP";
+ }
+ }
+
+ group { "elm/button/base/custom";
+ script {
+ FUNCTION_SCALE_PART
+ public effect_scale;
+ }
+ parts {
+ swallow { "tizen_vg_shape"; scale;
+ clip_to: "rect.bg";
+ }
+ rect { "rect.bg"; scale;
+ desc { "default";
+ rel1.to: "tizen_vg_shape";
+ rel2.to: "tizen_vg_shape";
+ color_class: BUTTON_COLOR_CLASS_NORMAL;
+ }
+ }
+ swallow { "tizen_vg_shape2"; scale;
+ clip_to: "rect.effect_bg";
+ }
+ rect { "rect.effect_bg"; scale;
+ desc { "default";
+ rel1.to: "tizen_vg_shape2";
+ rel2.to: "tizen_vg_shape2";
+ color_class: BUTTON_COLOR_CLASS_UNPRESSED;
+ }
+ desc { "pressed";
+ rel1.to: "tizen_vg_shape2";
+ rel2.to: "tizen_vg_shape2";
+ color_class: BUTTON_COLOR_CLASS_PRESSED;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "loaded";
+ signal: "load";
+ source: "*";
+ script {
+ set_float(effect_scale, 0.7);
+ }
+ }
+ program {
+ name: "pressed";
+ signal: "mouse,down,*";
+ source: "*";
+ script {
+ scale_part(PART:"tizen_vg_shape2", "default", get_float(effect_scale));
+ set_state(PART:"rect.effect_bg", "pressed", 0.0);
+ }
+ after: "pressed_effect";
+ }
+ program {
+ name: "unpressed";
+ signal: "mouse,up,*";
+ source: "*";
+ script {
+ new r, g, b, a;
+ get_color_class(BUTTON_COLOR_CLASS_PRESSED, r, g, b, a);
+ set_color_class(BUTTON_COLOR_CLASS_UNPRESSED, r, g, b, 0);
+ }
+ after: "unpressed_effect";
+ }
+ program {
+ name: "pressed_effect";
+ action: STATE_SET "default" 0.0;
+ target: "tizen_vg_shape2";
+ transition: TRANSITION_GLIDE(0.15);
+ }
+ program {
+ name: "unpressed_effect";
+ action: STATE_SET "default" 0.0;
+ target: "rect.effect_bg";
+ transition: TRANSITION_GLIDE(0.45);
+ }
+ program {
+ name: "touch_sound";
+ signal: "mouse,clicked,*";
+ source: "*";
+ action: RUN_PLUGIN "touch_sound";
+ }
+ program {
+ name: "clicked";
+ signal: "mouse,clicked,*";
+ source: "*";
+ action: SIGNAL_EMIT "elm,action,click" "";
+ }
+ }
+ }
+
+ group { "elm/button/base/"STYLE_BUTTON_CUSTOM_DEFAULT;
+ inherit: "elm/button/base/custom";
+ data.item: "vector_ux" "default";
+ data.item: "corner_radius" BUTTON_CORNER_RADIUS;
+
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: 0 BUTTON_DEFAULT_H;
+ }
+ }
+ spacer { "spacer.left"; scale;
+ desc { "default";
+ fixed: 1 0;
+ min: BUTTON_DEFAULT_TEXT_LR 0;
+ align: 0.0 0.5;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 0.0 1.0;
+ }
+ }
+ spacer { "spacer.right"; scale;
+ desc { "default";
+ fixed: 1 0;
+ min: BUTTON_DEFAULT_TEXT_LR 0;
+ align: 1.0 0.5;
+ rel1.relative: 1.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ textblock { "elm.text"; scale;
+ desc { "default";
+ align: 0.0 0.5;
+ rel1 { relative: 1.0 0.0; to_x: "spacer.left"; }
+ rel2 { relative: 0.0 1.0; to_x: "spacer.right"; }
+ text {
+ align: 0.5 0.5;
+ min: 1 0;
+ ellipsis: -1;
+ style: "button_main";
+ }
+ }
+ }
+ }
+ }
+
+ group { "elm/button/base/"STYLE_BUTTON_CUSTOM_SMALL;
+ inherit: "elm/button/base/"STYLE_BUTTON_CUSTOM_DEFAULT;
+ data.item: "vector_ux" "default";
+ data.item: "corner_radius" BUTTON_SMALL_CORNER_RADIUS;
+
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: 0 BUTTOM_SMALL_H;
+ }
+ }
+ spacer { "spacer.left"; scale;
+ desc { "default";
+ min: BUTTON_SMALL_TEXT_LR 0;
+ }
+ }
+ spacer { "spacer.right"; scale;
+ desc { "default";
+ min: BUTTON_SMALL_TEXT_LR 0;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "loaded";
+ signal: "load";
+ source: "*";
+ script {
+ set_float(effect_scale, 0.7);
+ set_color_class(BUTTON_COLOR_CLASS_NORMAL, 0, 0, 0, 90);
+ set_text_class(BUTTON_TEXT_CLASS, "font=Tizen:style=Regular", 32);
+ }
+ }
+ }
+ }
+
+ group { "elm/button/base/"STYLE_BUTTON_CUSTOM_CIRCLE;
+ inherit: "elm/button/base/custom";
+ data.item: "vector_ux" "circle";
+
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: BUTTON_CIRCLE_WH BUTTON_CIRCLE_WH;
+ }
+ }
+ swallow { "elm.swallow.content"; scale; nomouse;
+ clip_to: "rect.icon_bg";
+ desc { "default";
+ fixed: 1 1;
+ min: BUTTON_CIRCLE_CONTENT_WH BUTTON_CIRCLE_CONTENT_WH;
+ rel1.relative: 0.5 0.5;
+ rel2.relative: 0.5 0.5;
+ }
+ }
+ rect { "rect.icon_bg"; scale;
+ desc { "default";
+ color_class: BUTTON_COLOR_CLASS_ICON_NORMAL;
+ }
+ desc { "pressed";
+ color_class: BUTTON_COLOR_CLASS_ICON_PRESSED;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "icon_pressed";
+ signal: "mouse,down,*";
+ source: "*";
+ action: STATE_SET "pressed" 0.0;
+ target: "rect.icon_bg";
+ }
+ program {
+ name: "icon_unpressed";
+ signal: "mouse,up,*";
+ source: "*";
+ action: STATE_SET "default" 0.0;
+ target: "rect.icon_bg";
+ transition: TRANSITION_GLIDE(0.45);
+ }
+ }
+ }
+
+ group { "elm/button/base/"STYLE_BUTTON_CUSTOM_CIRCLE_NO_BG;
+ inherit: "elm/button/base/"STYLE_BUTTON_CUSTOM_CIRCLE;
+ data.item: "vector_ux" "circle";
+
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: BUTTON_CIRCLE_NO_BG_WH BUTTON_CIRCLE_NO_BG_WH;
+ }
+ }
+ swallow { "tizen_vg_shape2"; scale;
+ desc { "default";
+ rel1.relative: -0.15 -0.15;
+ rel2.relative: 1.15 1.15;
+ }
+ }
+ swallow { "elm.swallow.content"; scale;
+ desc { "default";
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "loaded";
+ signal: "load";
+ source: "*";
+ script {
+ set_float(effect_scale, 1.0);
+ set_color_class(BUTTON_COLOR_CLASS_NORMAL, 0, 0, 0, 0);
+ set_color_class(BUTTON_COLOR_CLASS_PRESSED, 61, 185, 204, 77);
+ set_color_class(BUTTON_COLOR_CLASS_ICON_NORMAL, 61, 185, 204, 255);
+ set_color_class(BUTTON_COLOR_CLASS_ICON_PRESSED, 34, 104, 115, 255);
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppsCommonPopup.h"
+
+#define PROGRESS_LR 32
+#define PROGRESS_TB 17
+
+#define PROCESS_SMALL_POPUP_H 78
+#define PROCESS_SMALL_PROGRESS_LR 32
+#define PROCESS_SMALL_PROGRESS_WH 44
+#define PROCESS_SMALL_TEXT_SIZE 40
+
+#define PROCESS_MEDIUM_POPUP_H 120
+#define PROCESS_MEDIUM_PROGRESS_LR 32
+#define PROCESS_MEDIUM_PROGRESS_W 56
+#define PROCESS_MEDIUM_TEXT_SIZE 40
+
+styles {
+ style {
+ name: "process_small";
+ base: "font=Tizen:style=Light font_size="PROCESS_SMALL_TEXT_SIZE" align=right color=#3db9ccff";
+ }
+ style {
+ name: "process_medium";
+ base: "font=Tizen:style=Light font_size="PROCESS_MEDIUM_TEXT_SIZE" align=left color=#000000ff";
+ }
+}
+
+collections {
+ base_scale: 2.6;
+
+ group { LAYOUT_PROGRESS;
+ parts {
+ spacer { "spacer.left_top"; scale;
+ desc { "default";
+ min: PROGRESS_LR PROGRESS_TB;
+ align: 0.0 0.0;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 0.0 0.0;
+ }
+ }
+ spacer { "spacer.right_bottom"; scale;
+ desc { "default";
+ min: PROGRESS_LR PROGRESS_TB;
+ align: 1.0 1.0;
+ rel1.relative: 1.0 1.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.content"; scale;
+ desc { "default";
+ rel1 { relative: 1.0 1.0; to: "spacer.left_top"; }
+ rel2 { relative: 0.0 0.0; to: "spacer.right_bottom"; }
+ }
+ }
+ }
+ }
+
+ group { LAYOUT_PROCESS_SMALL;
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: 0 PROCESS_SMALL_POPUP_H;
+ }
+ }
+ spacer { "spacer.progress_right"; scale;
+ desc { "default";
+ min: PROCESS_SMALL_PROGRESS_LR 0;
+ align: 1.0 0.5;
+ rel1.relative: 1.0 0.0;
+ rel2.relative: 1.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.content"; scale;
+ desc { "default";
+ min: PROCESS_SMALL_PROGRESS_WH PROCESS_SMALL_PROGRESS_WH;
+ align: 1.0 0.5;
+ rel1 { relative: 0.0 0.5; to_x: "spacer.progress_right"; }
+ rel2 { relative: 0.0 0.5; to_x: "spacer.progress_right"; }
+ }
+ }
+ spacer { "spacer.text_right"; scale;
+ desc { "default";
+ min: PROCESS_SMALL_PROGRESS_LR 0;
+ align: 1.0 0.5;
+ rel1 { relative: 0.0 0.0; to_x: "elm.swallow.content"; }
+ rel2 { relative: 0.0 1.0; to_x: "elm.swallow.content"; }
+ }
+ }
+ textblock { "elm.text"; scale;
+ desc { "default";
+ align: 0.0 0.5;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 0.0 1.0; to_x: "spacer.text_right"; }
+ text.style: "process_small";
+ }
+ }
+ }
+ }
+
+ group { LAYOUT_PROCESS_MEDIUM;
+ parts {
+ spacer { "spacer.base"; scale;
+ desc { "default";
+ min: 0 PROCESS_MEDIUM_POPUP_H;
+ }
+ }
+ spacer { "spacer.progress_left"; scale;
+ desc { "default";
+ min: PROCESS_MEDIUM_PROGRESS_LR 0;
+ align: 0.0 0.5;
+ rel1.relative: 0.0 0.0;
+ rel2.relative: 0.0 1.0;
+ }
+ }
+ swallow { "elm.swallow.content"; scale;
+ desc { "default";
+ min: PROCESS_MEDIUM_PROGRESS_W 0;
+ align: 0.0 0.5;
+ rel1 { relative: 1.0 0.5; to_x: "spacer.progress_left"; }
+ rel2 { relative: 1.0 0.5; to_x: "spacer.progress_left"; }
+ }
+ }
+ spacer { "spacer.text_left"; scale;
+ desc { "default";
+ min: PROCESS_MEDIUM_PROGRESS_LR 0;
+ align: 0.0 0.5;
+ rel1 { relative: 1.0 0.0; to_x: "elm.swallow.content"; }
+ rel2 { relative: 1.0 1.0; to_x: "elm.swallow.content"; }
+ }
+ }
+ textblock { "elm.text"; scale;
+ desc { "default";
+ align: 0.0 0.5;
+ rel1 { relative: 1.0 0.0; to_x: "spacer.text_left"; }
+ rel2 { relative: 1.0 1.0; }
+ text.style: "process_medium";
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppsCommonThumbnail.h"
+#include "apps-common-utils.edc"
+
+color_classes {
+ color_class { //A03O003
+ name: "thumbnail_bg";
+ color: 255 255 255 255;
+ }
+ color_class { //A03O003L1
+ name: "thumbnail_default";
+ color: 61 185 204 128;
+ }
+}
+
+collections {
+ IMAGE_WITH_MASK(LAYOUT_THUMBNAIL_SMALL, THUMBNAIL_MASK_SMALL)
+ IMAGE_WITH_MASK(LAYOUT_THUMBNAIL_MEDIUM, THUMBNAIL_MASK_MEDIUM)
+ IMAGE_WITH_MASK(LAYOUT_THUMBNAIL_LARGE, THUMBNAIL_MASK_LARGE)
+
+ IMAGE_WITH_COLOR_AND_BG(LAYOUT_THUMBNAIL_DEFAULT_SMALL, THUMBNAIL_DEFAULT_SMALL, "thumbnail_default", THUMBNAIL_BG_SMALL, "thumbnail_bg")
+ IMAGE_WITH_COLOR_AND_BG(LAYOUT_THUMBNAIL_DEFAULT_MEDIUM, THUMBNAIL_DEFAULT_MEDIUM, "thumbnail_default", THUMBNAIL_BG_MEDIUM, "thumbnail_bg")
+ IMAGE_WITH_COLOR_AND_BG(LAYOUT_THUMBNAIL_DEFAULT_LARGE, THUMBNAIL_DEFAULT_LARGE, "thumbnail_default", THUMBNAIL_BG_LARGE, "thumbnail_bg")
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define TRANSITION_GLIDE(duration) CUBIC_BEZIER (duration) 0.25 0.46 0.45 1.0
+#define FUNCTION_SCALE_PART \
+ public scale_part(part_id, state[], Float:ratio) { \
+ new x, y, w, h; \
+ get_geometry(part_id, x, y, w, h); \
+ new Float:offset = (w < h ? w : h) * (1.0 - ratio) / 2; \
+ new Float:rel_w = offset / w; \
+ new Float:rel_h = offset / h; \
+\
+ custom_state(part_id, state, 0.0); \
+ set_state_val(part_id, STATE_REL1, rel_w, rel_h); \
+ set_state_val(part_id, STATE_REL2, 1.0 - rel_w, 1.0 - rel_h); \
+ set_state(part_id, "custom", 0.0); \
+ }
+
+#define IMAGE_WITH_COLOR(GROUP_NAME, IMAGE_PATH, COLOR_CLASS) \
+ group { GROUP_NAME; \
+ images.image: IMAGE_PATH COMP; \
+ parts { \
+ image { "image"; \
+ desc { "default"; \
+ image.normal: IMAGE_PATH; \
+ color_class: COLOR_CLASS; \
+ aspect: 1 1; \
+ aspect_preference: SOURCE; \
+ } \
+ } \
+ } \
+ }
+
+#define IMAGE_WITH_COLOR_AND_BG(GROUP_NAME, IMAGE_PATH, COLOR_CLASS, BG_IMAGE_PATH, BG_COLOR_CLASS) \
+ group { GROUP_NAME; \
+ images { \
+ image: BG_IMAGE_PATH COMP; \
+ image: IMAGE_PATH COMP; \
+ } \
+ parts { \
+ image { "image.bg"; \
+ desc { "default"; \
+ image.normal: BG_IMAGE_PATH; \
+ color_class: BG_COLOR_CLASS; \
+ aspect: 1 1; \
+ aspect_preference: SOURCE; \
+ } \
+ } \
+ } \
+ parts { \
+ image { "image"; \
+ desc { "default"; \
+ image.normal: IMAGE_PATH; \
+ color_class: COLOR_CLASS; \
+ aspect: 1 1; \
+ aspect_preference: SOURCE; \
+ } \
+ } \
+ } \
+ }
+
+#define IMAGE_WITH_MASK(GROUP_NAME, MASK_PATH) \
+ group { GROUP_NAME; \
+ images.image: MASK_PATH COMP; \
+ parts { \
+ image { "image.mask"; \
+ precise_is_inside: 1; \
+ desc { "default"; \
+ image.normal: MASK_PATH; \
+ aspect: 1.0 1.0; \
+ aspect_preference: SOURCE; \
+ } \
+ } \
+ } \
+ parts { \
+ swallow { "elm.swallow.content"; \
+ clip_to: "image.mask"; \
+ } \
+ } \
+ }
+
+#define IMAGE_WITH_COLOR_AND_TOUCH(GROUP_NAME, IMAGE_PATH, COLOR_CLASS, PRESSED_COLOR_CLASS) \
+ group { GROUP_NAME; \
+ images.image: IMAGE_PATH COMP; \
+ parts { \
+ image { "image"; \
+ desc { "default"; \
+ image.normal: IMAGE_PATH; \
+ color_class: COLOR_CLASS; \
+ aspect: 1 1; \
+ aspect_preference: SOURCE; \
+ } \
+ desc { "pressed"; \
+ inherit: "default" 0.0; \
+ color_class: PRESSED_COLOR_CLASS; \
+ } \
+ } \
+ } \
+ programs { \
+ program { \
+ name: "pressed"; \
+ signal: "mouse,down,*"; \
+ source: "*"; \
+ action: STATE_SET "pressed" 0.0; \
+ target: "image"; \
+ } \
+ program { \
+ name: "unpressed"; \
+ signal: "mouse,up,*"; \
+ source: "*"; \
+ action: STATE_SET "default" 0.0; \
+ target: "image"; \
+ } \
+ } \
+ }
+
+#define IMAGE_WITH_TOUCH(GROUP_NAME, IMAGE_PATH, PRESSED_IMAGE_PATH) \
+ group { GROUP_NAME; \
+ images { \
+ image: IMAGE_PATH COMP; \
+ image: PRESSED_IMAGE_PATH COMP; \
+ } \
+ parts { \
+ image { "image"; \
+ desc { "default"; \
+ image.normal: IMAGE_PATH; \
+ aspect: 1 1; \
+ aspect_preference: SOURCE; \
+ } \
+ desc { "pressed"; \
+ inherit: "default" 0.0; \
+ image.normal: PRESSED_IMAGE_PATH; \
+ } \
+ } \
+ } \
+ programs { \
+ program { \
+ name: "pressed"; \
+ signal: "mouse,down,*"; \
+ source: "*"; \
+ action: STATE_SET "pressed" 0.0; \
+ target: "image"; \
+ } \
+ program { \
+ name: "unpressed"; \
+ signal: "mouse,up,*"; \
+ source: "*"; \
+ action: STATE_SET "default" 0.0; \
+ target: "image"; \
+ } \
+ } \
+ }
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "AppsCommonWidget.h"
+#include "apps-common-utils.edc"
+
+#define TEXT_H 107
+#define TEXT_T 72
+#define TEXT_SIZE 80
+
+#define HELP_H 52
+#define HELP_T 15
+#define HELP_TEXT_SIZE 38
+
+#define BUTTON_R 14
+#define CONTENT_T 10
+
+styles {
+ style {
+ name: "no_contents_text";
+ base: "font=Tizen:style=Condensed font_size="TEXT_SIZE" align=center color=#fafafa style=shadow,bottom_right shadow_color=#00000066";
+ }
+ style {
+ name: "no_contents_help";
+ base: "font=Tizen:style=Regular font_size="HELP_TEXT_SIZE" align=center color=#fafafa style=shadow,bottom_right shadow_color=#00000066";
+ }
+}
+
+color_classes {
+ color_class { //AO003
+ name: "no_contents_bg";
+ color: 0 0 0 13;
+ }
+ color_class {
+ name: "no_contents_bg_pressed";
+ color: 0 0 0 77;
+ }
+ color_class { //AO003L1
+ name: "no_contents_border";
+ color: 250 250 250 77;
+ }
+}
+
+collections {
+ base_scale: 2.6;
+
+ group { LAYOUT_NO_CONTENTS;
+ images {
+ image: NO_CONTENTS_BG COMP;
+ image: NO_CONTENTS_BORDER COMP;
+ }
+ parts {
+ image { "image.bg";
+ desc { "default";
+ image.normal: NO_CONTENTS_BG;
+ color_class: "no_contents_bg";
+ }
+ desc { "pressed";
+ image.normal: NO_CONTENTS_BG;
+ color_class: "no_contents_bg_pressed";
+ }
+ }
+ image { "image.border";
+ desc { "default";
+ color_class: "no_contents_border";
+ image.normal: NO_CONTENTS_BORDER;
+ }
+ }
+ spacer { "spacer.text.top"; scale;
+ desc { "default";
+ min: 0 TEXT_T;
+ align: 0.5 0.0;
+ rel2.relative: 1.0 0.0;
+ }
+ }
+ textblock { "elm.text"; scale;
+ desc { "default";
+ min: 0 TEXT_H;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "spacer.text.top"; }
+ rel2 { relative: 1.0 1.0; to_y: "spacer.text.top"; }
+ text.style: "no_contents_text";
+ }
+ }
+ spacer { "spacer.help.top"; scale;
+ desc { "default";
+ min: 0 HELP_T;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "elm.text"; }
+ rel2 { relative: 1.0 1.0; to_y: "elm.text"; }
+ }
+ }
+ textblock { "elm.help.text"; scale;
+ desc { "default";
+ min: 0 HELP_H;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "spacer.help.top"; }
+ rel2 { relative: 1.0 1.0; to_y: "spacer.help.top"; }
+ text.style: "no_contents_help";
+ }
+ }
+ programs {
+ program {
+ name: "pressed";
+ signal: "mouse,down,*";
+ source: "*";
+ action: STATE_SET "pressed" 0.0;
+ target: "image.bg";
+ transition: TRANSITION_GLIDE(0.15);
+ }
+ program {
+ name: "unpressed";
+ signal: "mouse,up,*";
+ source: "*";
+ action: STATE_SET "default" 0.0;
+ target: "image.bg";
+ transition: TRANSITION_GLIDE(0.45);
+ }
+ }
+ }
+ }
+
+ group { LAYOUT_CONTENT;
+ parts {
+ spacer { "spacer.button.right"; scale;
+ desc { "default";
+ min: BUTTON_R 0;
+ align: 1.0 0.5;
+ rel1.relative: 1.0 0.0;
+ }
+ }
+ swallow { PART_BUTTON;
+ desc { "default";
+ align: 1.0 0.0;
+ rel1 { relative: 0.0 0.0; to_x: "spacer.button.right"; }
+ rel2 { relative: 0.0 0.0; to_x: "spacer.button.right"; }
+ }
+ }
+ spacer { "spacer.content.top"; scale;
+ desc { "default";
+ min: 0 CONTENT_T;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: PART_BUTTON; }
+ rel2 { relative: 1.0 1.0; to_y: PART_BUTTON; }
+ }
+ }
+ swallow { PART_CONTENT;
+ desc { "default";
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "spacer.content.top"; }
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/AppControl.h"
+#include "Utils/Logger.h"
+
+using namespace App;
+
+AppControl::AppControl()
+ : m_AppControl(nullptr), m_AutoTerminate(true)
+{
+}
+
+AppControl::AppControl(const char *appId)
+ : AppControl()
+{
+ app_control_create(&m_AppControl);
+ app_control_set_app_id(m_AppControl, appId);
+}
+
+AppControl::AppControl(const char *operation, const char *mime, const char *uri)
+ : AppControl()
+{
+ app_control_create(&m_AppControl);
+ app_control_set_operation(m_AppControl, operation);
+ app_control_set_mime(m_AppControl, mime);
+ app_control_set_uri(m_AppControl, uri);
+}
+
+AppControl::AppControl(AppControl &&that)
+ : m_AppControl(that.m_AppControl), m_AutoTerminate(that.m_AutoTerminate)
+{
+ that.m_AppControl = nullptr;
+}
+
+AppControl::~AppControl()
+{
+ reset();
+}
+
+app_control_h AppControl::getHandle() const
+{
+ return m_AppControl;
+}
+
+void AppControl::addExtra(const char *key, const char *value)
+{
+ app_control_add_extra_data(m_AppControl, key, value);
+}
+
+void AppControl::addExtra(const char *key, const char **array, int length)
+{
+ app_control_add_extra_data_array(m_AppControl, key, array, length);
+}
+
+int AppControl::launch(app_control_reply_cb replyCallback, void *userData,
+ bool groupMode)
+{
+ if (groupMode) {
+ app_control_set_launch_mode(m_AppControl, APP_CONTROL_LAUNCH_MODE_GROUP);
+ }
+
+ int result = app_control_send_launch_request(m_AppControl, replyCallback, userData);
+ WARN_IF_ERR(result, "app_control_send_launch_request() failed.");
+
+ return result;
+}
+
+void AppControl::terminate()
+{
+ m_AutoTerminate = true;
+ reset();
+}
+
+void AppControl::detach()
+{
+ m_AutoTerminate = false;
+}
+
+AppControl &AppControl::operator=(AppControl &&that)
+{
+ reset();
+ m_AppControl = that.m_AppControl;
+ m_AutoTerminate = that.m_AutoTerminate;
+ that.m_AppControl = nullptr;
+
+ return *this;
+}
+
+void AppControl::reset()
+{
+ if (m_AppControl) {
+ if (m_AutoTerminate) {
+ app_control_send_terminate_request(m_AppControl);
+ }
+ app_control_destroy(m_AppControl);
+ m_AppControl = nullptr;
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/AppControlRequest.h"
+
+using namespace App;
+
+AppControl App::requestContactCreate(const char *number)
+{
+ AppControl request(APP_CONTROL_OPERATION_ADD, APP_CONTROL_MIME_CONTACT);
+ request.addExtra(APP_CONTROL_DATA_PHONE, number);
+ return request;
+}
+
+AppControl App::requestContactDetails(int personId)
+{
+ AppControl request(APP_CONTROL_OPERATION_VIEW, APP_CONTROL_MIME_CONTACT);
+ request.addExtra(APP_CONTROL_DATA_ID, std::to_string(personId).c_str());
+ return request;
+}
+
+AppControl App::requestContactEdit(int personId, const char *number)
+{
+ AppControl request(APP_CONTROL_OPERATION_EDIT, APP_CONTROL_MIME_CONTACT);
+ if (personId > 0) {
+ request.addExtra(APP_CONTROL_DATA_ID, std::to_string(personId).c_str());
+ }
+
+ request.addExtra(APP_CONTROL_DATA_PHONE, number);
+ return request;
+}
+
+AppControl App::requestContactPick(const char *selectionMode, const char *resultType)
+{
+ AppControl request(APP_CONTROL_OPERATION_PICK, APP_CONTROL_MIME_CONTACT);
+ request.addExtra(APP_CONTROL_DATA_SELECTION_MODE, selectionMode);
+ request.addExtra(APP_CONTROL_DATA_TYPE, resultType);
+ return request;
+}
+
+AppControl App::requestTelephonyCall(const char *number)
+{
+ return AppControl(APP_CONTROL_OPERATION_CALL, nullptr,
+ std::string("tel:").append(number).c_str());
+}
+
+AppControl App::requestCallSettings()
+{
+ return AppControl(APP_CONTROL_OPERATION_SETTING_CALL, nullptr);
+}
+
+AppControl App::requestComposer(const char *scheme, const char *to,
+ const char *subject, const char *text)
+{
+ std::string uri = scheme;
+ if (to) {
+ uri.append(to);
+ }
+ AppControl request(APP_CONTROL_OPERATION_COMPOSE, nullptr, uri.c_str());
+ request.addExtra(APP_CONTROL_DATA_TITLE, subject);
+ request.addExtra(APP_CONTROL_DATA_TEXT, text);
+ return request;
+}
+
+AppControl App::requestComposer(const char *scheme, Utils::Range<const char **> recipients,
+ const char *subject, const char *text)
+{
+ AppControl request = requestComposer(scheme, nullptr, subject, text);
+ request.addExtra(APP_CONTROL_DATA_TO, recipients.begin(), recipients.count());
+ return request;
+}
+
+AppControl App::requestCameraImage()
+{
+ return AppControl(APP_CONTROL_OPERATION_CREATE_CONTENT, APP_CONTROL_MIME_IMAGE);
+}
+
+AppControl App::requestGalleryImage()
+{
+ AppControl request(APP_CONTROL_OPERATION_PICK, APP_CONTROL_MIME_IMAGE);
+ app_control_set_app_id(request.getHandle(), "org.tizen.ug-gallery-efl");
+ return request;
+}
+
+AppControl App::requestViewImage(const char *path)
+{
+ return AppControl(APP_CONTROL_OPERATION_VIEW, APP_CONTROL_MIME_IMAGE,
+ std::string(APP_CONTROL_URI_SCHEME_FILE).append(path).c_str());
+}
+
+AppControl App::requestShareContact(int personId)
+{
+ AppControl request(APP_CONTROL_OPERATION_SHARE, APP_CONTROL_MIME_CONTACT);
+ request.addExtra(APP_CONTROL_DATA_ID, std::to_string(personId).c_str());
+ return request;
+}
+
+AppControl App::requestShareText(const char *text)
+{
+ AppControl request(APP_CONTROL_OPERATION_SHARE_TEXT, nullptr);
+ request.addExtra(APP_CONTROL_DATA_TEXT, text);
+ return request;
+}
+
+AppControl App::requestShareMyProfile(int recordId)
+{
+ AppControl request = requestShareContact(recordId);
+ request.addExtra(APP_CONTROL_DATA_TYPE, "my_profile");
+ return request;
+}
+
+AppControl App::requestMultiShareContacts(const char **personIds, int count)
+{
+ AppControl request(APP_CONTROL_OPERATION_MULTI_SHARE, APP_CONTROL_MIME_CONTACT);
+ request.addExtra(APP_CONTROL_DATA_ID, personIds, count);
+ return request;
+}
+
+AppControl App::requestPickVcard(const char *path)
+{
+ AppControl request(APP_CONTROL_OPERATION_PICK, APP_CONTROL_MIME_VCARD,
+ std::string(APP_CONTROL_URI_SCHEME_FILE).append(path).c_str());
+ request.addExtra(APP_CONTROL_DATA_SELECTION_MODE, APP_CONTROL_SELECT_MULTIPLE);
+ return request;
+}
+
+AppControl App::requestPickRingtone(const char *selectedPath)
+{
+ AppControl request("org.tizen.setting-ringtone");
+ if (selectedPath) {
+ request.addExtra(APP_CONTROL_DATA_SELECTED, &selectedPath, 1);
+ }
+ return request;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/AppControlUtils.h"
+#include "Utils/Logger.h"
+
+using namespace App;
+
+std::string App::getSingleExtraData(app_control_h appControl, const char *key)
+{
+ std::string result;
+ char **array = nullptr;
+ int count = 0;
+
+ int err = app_control_get_extra_data_array(appControl, key, &array, &count);
+ RETVM_IF_ERR(err, result, "app_control_get_extra_data_array() failed.");
+
+ if (array && array[0]) {
+ result = array[0];
+ }
+
+ for (int i = 0; i < count; ++i) {
+ free(array[i]);
+ }
+ free(array);
+
+ return result;
+}
+
+int App::getIntExtraData(app_control_h appControl, const char *key)
+{
+ int result = 0;
+ char *resultStr = nullptr;
+
+ int err = app_control_get_extra_data(appControl, key, &resultStr);
+ RETVM_IF_ERR(err, result, "app_control_get_extra_data() failed.");
+
+ if (resultStr) {
+ result = atoi(resultStr);
+ free(resultStr);
+ }
+
+ return result;
+}
+
+std::string App::getStringExtraData(app_control_h appControl, const char *key)
+{
+ std::string result;
+ char *resultStr = nullptr;
+
+ int err = app_control_get_extra_data(appControl, key, &resultStr);
+ RETVM_IF_ERR(err, result, "app_control_get_extra_data() failed.");
+
+ if (resultStr) {
+ result = resultStr;
+ free(resultStr);
+ }
+
+ return result;
+}
+
+std::vector<int> App::getIntExtraDataArray(app_control_h appControl, const char *key)
+{
+ std::vector<int> result;
+ char **array = nullptr;
+ int count = 0;
+
+ int err = app_control_get_extra_data_array(appControl, key, &array, &count);
+ RETVM_IF_ERR(err, result, "app_control_get_extra_data_array() failed.");
+ result.reserve(count);
+
+ for (int i = 0; i < count; ++i) {
+ int value = atoi(array[i]);
+ result.push_back(value);
+ free(array[i]);
+ }
+ free(array);
+
+ return result;
+}
+
+char **App::createExtraDataArray(size_t dataSize, size_t count)
+{
+ typedef char ExtraData[dataSize];
+
+ char **array = (char **) malloc((sizeof(char *) + dataSize) * count);
+ ExtraData *extraData = (ExtraData *) (array + count);
+
+ for (size_t i = 0; i < count; ++i) {
+ array[i] = extraData[i];
+ }
+
+ return array;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/Application.h"
+#include "App/OperationController.h"
+#include "Ui/Naviframe.h"
+#include "Ui/Scale.h"
+#include "Ui/Window.h"
+#include "Utils/Callback.h"
+
+#include <system_settings.h>
+#include <utils_i18n_ulocale.h>
+
+using namespace App;
+
+Application::Application()
+ : m_Window(nullptr), m_Navigator(nullptr), m_Controller(nullptr)
+{
+}
+
+int Application::run(int argc, char **argv)
+{
+ ui_app_lifecycle_callback_s cbs;
+ cbs.create = makeCallback(&Application::onCreate);
+ cbs.terminate = makeCallback(&Application::onTerminate);
+ cbs.pause = makeCallback(&Application::onPause);
+ cbs.resume = makeCallback(&Application::onResume);
+ cbs.app_control = makeCallbackWithLastParam(&Application::onAppControl);
+
+ return ui_app_main(argc, argv, &cbs, this);
+}
+
+bool Application::onCreate()
+{
+ updateLanguage();
+
+ app_event_handler_h handle = nullptr;
+ ui_app_add_event_handler(&handle, APP_EVENT_LANGUAGE_CHANGED,
+ &Application::onLanguageChanged, this);
+ elm_app_base_scale_set(UI_BASE_SCALE);
+
+ m_Window = new Ui::Window();
+ m_Window->create(nullptr);
+
+ m_Navigator = new Ui::Naviframe();
+ m_Window->attachView(m_Navigator);
+
+ return true;
+}
+
+void Application::onTerminate()
+{
+ delete m_Controller;
+ m_Controller = nullptr;
+}
+
+void Application::onPause()
+{
+ if (m_Controller) {
+ m_Controller->onPause();
+ }
+}
+
+void Application::onResume()
+{
+ if (m_Controller) {
+ m_Controller->onResume();
+ }
+}
+
+void Application::onAppControl(app_control_h request)
+{
+ char *operation = nullptr;
+ app_control_get_operation(request, &operation);
+
+ if (!m_Controller) {
+ m_Controller = createController(operation);
+ if (m_Controller) {
+ m_Controller->create(m_Window, m_Navigator);
+ }
+ }
+
+ if (m_Controller) {
+ m_Controller->request(operation, request);
+ }
+
+ free(operation);
+}
+
+Ui::Window *Application::getWindow() const
+{
+ return m_Window;
+}
+
+Ui::Naviframe *Application::getNavigator() const
+{
+ return m_Navigator;
+}
+
+void Application::onLanguageChanged(app_event_info_h event, void *data)
+{
+ updateLanguage();
+}
+
+void Application::updateLanguage()
+{
+ char *lang = nullptr;
+ system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang);
+
+ i18n_ulocale_layout_type_e layout = I18N_ULOCALE_LAYOUT_UNKNOWN;
+ i18n_ulocale_get_character_orientation(lang, &layout);
+
+ elm_language_set(lang);
+ elm_config_mirrored_set(layout == I18N_ULOCALE_LAYOUT_RTL);
+ free(lang);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/OperationController.h"
+#include "Ui/Navigator.h"
+#include "Ui/Window.h"
+
+using namespace App;
+
+OperationController::OperationController(bool isMinimizable)
+ : m_Request(nullptr), m_IsMinimizable(isMinimizable),
+ m_Window(nullptr), m_Navigator(nullptr)
+{
+}
+
+OperationController::~OperationController()
+{
+ app_control_destroy(m_Request);
+}
+
+void OperationController::create(Ui::Window *window, Ui::Navigator *navigator)
+{
+ m_Window = window;
+ m_Navigator = navigator;
+
+ if (!m_IsMinimizable) {
+ m_Navigator->setLastPageCallback([] {
+ ui_app_exit();
+ return false;
+ });
+ }
+
+ onCreate();
+}
+
+void OperationController::request(const char *operation, app_control_h request)
+{
+ app_control_destroy(m_Request);
+ app_control_clone(&m_Request, request);
+ onRequest(operation, m_Request);
+}
+
+Ui::Window *OperationController::getWindow() const
+{
+ return m_Window;
+}
+
+Ui::Navigator *OperationController::getNavigator() const
+{
+ return m_Navigator;
+}
+
+app_control_h OperationController::getRequest() const
+{
+ return m_Request;
+}
+
+std::string OperationController::getUrn(const char *scheme) const
+{
+ char *uri = nullptr;
+ app_control_get_uri(m_Request, &uri);
+ if (!uri) {
+ return { };
+ }
+
+ const char *urn = nullptr;
+ if (scheme) {
+ size_t length = strlen(scheme);
+ if (strncmp(uri, scheme, length) == 0) {
+ urn = uri + length;
+ }
+ }
+
+ std::string path = urn ? urn : uri;
+ free(uri);
+ return path;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/Path.h"
+
+#include <app.h>
+
+const std::string &App::getLocaleDir()
+{
+ static std::string localeDir;
+ if (localeDir.empty()) {
+ #ifdef LOCALE_DIR
+ localeDir = LOCALE_DIR;
+ #else
+ localeDir = getResourcePath("locale/");
+ #endif
+ }
+
+ return localeDir;
+}
+
+const std::string &App::getDataDir()
+{
+ static std::string dataDir;
+ if (dataDir.empty()) {
+ #ifdef DATA_DIR
+ dataDir = DATA_DIR;
+ #else
+ char *path = app_get_data_path();
+ if (path) {
+ dataDir = path;
+ free(path);
+ }
+ #endif
+ }
+
+ return dataDir;
+}
+
+const std::string &App::getResourceDir()
+{
+ static std::string resDir;
+ if (resDir.empty()) {
+ #ifdef RES_DIR
+ resDir = RES_DIR;
+ #else
+ char *path = app_get_resource_path();
+ if (path) {
+ resDir = path;
+ free(path);
+ }
+ #endif
+ }
+
+ return resDir;
+}
+
+std::string App::getResourcePath(const char *relativePath)
+{
+ std::string path = getResourceDir();
+ if (relativePath) {
+ path.append(relativePath);
+ }
+ return path;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/Widget.h"
+#include "App/WidgetWindow.h"
+
+using namespace App;
+
+Widget::Widget()
+ : m_Context(nullptr), m_Width(0), m_Height(0), m_Window(nullptr)
+{
+}
+
+Widget::~Widget()
+{
+ delete m_Window;
+}
+
+void Widget::create(widget_context_h context, bundle *content)
+{
+ m_Context = context;
+ m_Window = new WidgetWindow(m_Context);
+ m_Window->create(nullptr);
+ onCreate(content);
+}
+
+void Widget::resize(int width, int height)
+{
+ m_Width = width;
+ m_Height = height;
+
+ evas_object_resize(m_Window->getEvasObject(), m_Width, m_Height);
+ evas_object_resize(m_Window->getBaseLayout(), m_Width, m_Height);
+
+ onResize(m_Width, m_Height);
+}
+
+int Widget::getWidth() const
+{
+ return m_Width;
+}
+
+int Widget::getHeight() const
+{
+ return m_Height;
+}
+
+widget_size_type_e Widget::getType() const
+{
+ widget_size_type_e type = WIDGET_SIZE_TYPE_UNKNOWN;
+ widget_service_get_size_type(m_Width, m_Height, &type);
+ return type;
+}
+
+Ui::Window *Widget::getWindow() const
+{
+ return m_Window;
+}
+
+void Widget::saveContent(bundle *content)
+{
+ widget_app_context_set_content_info(m_Context, content);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/WidgetApplication.h"
+#include "App/Widget.h"
+#include "Ui/Scale.h"
+#include "Utils/Callback.h"
+
+#include <Elementary.h>
+#include <system_settings.h>
+#include <utils_i18n_ulocale.h>
+
+using namespace App;
+
+int WidgetApplication::run(int argc, char **argv)
+{
+ widget_app_lifecycle_callback_s cbs;
+ cbs.create = makeCallback(&WidgetApplication::onWidgetClassCreate);
+ cbs.terminate = makeCallback(&WidgetApplication::onTerminate);
+
+ return widget_app_main(argc, argv, &cbs, this);
+}
+
+bool WidgetApplication::onCreate()
+{
+ updateLanguage();
+
+ app_event_handler_h handle = nullptr;
+ widget_app_add_event_handler(&handle, APP_EVENT_LANGUAGE_CHANGED,
+ &WidgetApplication::onLanguageChanged, this);
+
+ elm_app_base_scale_set(UI_BASE_SCALE);
+ return true;
+}
+
+widget_class_h WidgetApplication::onWidgetClassCreate()
+{
+ widget_instance_lifecycle_callback_s cbs;
+ cbs.create = &WidgetApplication::onWidgetCreate;
+ cbs.destroy = &WidgetApplication::onWidgetDestroy;
+ cbs.pause = &WidgetApplication::onWidgetPause;
+ cbs.resume = &WidgetApplication::onWidgetResume;
+ cbs.resize = &WidgetApplication::onWidgetResize;
+ cbs.update = &WidgetApplication::onWidgetUpdate;
+
+ if (!onCreate()) {
+ return nullptr;
+ }
+ return widget_app_class_create(cbs, this);
+}
+
+Widget *App::WidgetApplication::getWidget(widget_context_h context)
+{
+ Widget *widget = nullptr;
+ widget_app_context_get_tag(context, (void **) &widget);
+ return widget;
+}
+
+int WidgetApplication::onWidgetCreate(widget_context_h context,
+ bundle *content, int width, int height, void *data)
+{
+ WidgetApplication *app = (WidgetApplication *) data;
+ Widget *widget = app->createWidget();
+ if (!widget) {
+ return WIDGET_ERROR_FAULT;
+ }
+
+ widget_app_context_set_tag(context, widget);
+ widget->create(context, content);
+ widget->resize(width, height);
+ return WIDGET_ERROR_NONE;
+}
+
+int WidgetApplication::onWidgetDestroy(widget_context_h context,
+ widget_app_destroy_type_e reason, bundle *content, void *data)
+{
+ Widget *widget = getWidget(context);
+ widget->onDestroy(reason);
+ delete widget;
+ return WIDGET_ERROR_NONE;
+}
+
+int WidgetApplication::onWidgetPause(widget_context_h context, void *data)
+{
+ getWidget(context)->onPause();
+ return WIDGET_ERROR_NONE;
+}
+
+int WidgetApplication::onWidgetResume(widget_context_h context, void *data)
+{
+ getWidget(context)->onResume();
+ return WIDGET_ERROR_NONE;
+}
+
+int WidgetApplication::onWidgetResize(widget_context_h context,
+ int width, int height, void *data)
+{
+ getWidget(context)->resize(width, height);
+ return WIDGET_ERROR_NONE;
+}
+
+int WidgetApplication::onWidgetUpdate(widget_context_h context,
+ bundle *content, int force, void *data)
+{
+ getWidget(context)->onUpdate(force);
+ return WIDGET_ERROR_NONE;
+}
+
+void WidgetApplication::onLanguageChanged(app_event_info_h event, void *data)
+{
+ updateLanguage();
+}
+
+void WidgetApplication::updateLanguage()
+{
+ char *lang = nullptr;
+ system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang);
+
+ i18n_ulocale_layout_type_e layout = I18N_ULOCALE_LAYOUT_UNKNOWN;
+ i18n_ulocale_get_character_orientation(lang, &layout);
+
+ elm_language_set(lang);
+ elm_config_mirrored_set(layout == I18N_ULOCALE_LAYOUT_RTL);
+ free(lang);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/WidgetWindow.h"
+#include <widget_app_efl.h>
+
+using namespace App;
+
+WidgetWindow::WidgetWindow(widget_context_h context)
+ : m_Context(context)
+{
+}
+
+Evas_Object *WidgetWindow::onWindowCreate()
+{
+ Evas_Object *window = nullptr;
+ widget_app_get_elm_win(m_Context, &window);
+ evas_object_show(window);
+ return window;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "I18n/Collator.h"
+#include <system_settings.h>
+
+using namespace I18n;
+
+Collator::Collator(i18n_ucollator_strength_e strength)
+ : m_Strength(strength), m_Handle(nullptr)
+{
+}
+
+Collator::Collator(Collator &&that)
+ : m_Strength(that.m_Strength), m_Handle(that.m_Handle)
+{
+ that.m_Handle = nullptr;
+}
+
+Collator::~Collator()
+{
+ i18n_ucollator_destroy(m_Handle);
+}
+
+Collator &Collator::operator=(Collator &&that)
+{
+ i18n_ucollator_destroy(m_Handle);
+ m_Strength = that.m_Strength;
+ m_Handle = that.m_Handle;
+ that.m_Handle = nullptr;
+ return *this;
+}
+
+void Collator::initialize()
+{
+ if (m_Handle) {
+ i18n_ucollator_destroy(m_Handle);
+ m_Handle = nullptr;
+ }
+
+ char *lang = nullptr;
+ system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &lang);
+ i18n_ucollator_create(lang, &m_Handle);
+ i18n_ucollator_set_strength(m_Handle, m_Strength);
+ free(lang);
+}
+
+int Collator::compare(const UniString& str1, const UniString &str2)
+{
+ int result = 0;
+ i18n_ucollator_str_collator(m_Handle,
+ str1.getI18nStr().c_str(), -1,
+ str2.getI18nStr().c_str(), -1,
+ (i18n_ucollator_result_e *) &result);
+ return result;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "I18n/UniString.h"
+
+using namespace I18n;
+
+UniString::UniString(const char *utf8Str)
+{
+ if (utf8Str) {
+ m_Utf8Str = utf8Str;
+ }
+ m_UniStr = fromUtf8(m_Utf8Str);
+}
+
+bool UniString::operator<(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) < 0;
+}
+
+bool UniString::operator>(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) > 0;
+}
+
+bool UniString::operator==(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) == 0;
+}
+
+bool UniString::operator!=(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) != 0;
+}
+
+bool UniString::operator<=(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) <= 0;
+}
+
+bool UniString::operator>=(const UniString &that) const
+{
+ return i18n_ustring_compare_code_point_order(m_UniStr.c_str(), that.m_UniStr.c_str()) >= 0;
+}
+
+const UniString::I18nString &UniString::getI18nStr() const
+{
+ return m_UniStr;
+}
+
+const std::string &UniString::getUtf8Str() const
+{
+ if (m_Utf8Str.empty() && !m_UniStr.empty()) {
+ m_Utf8Str = toUtf8(m_UniStr);
+ }
+
+ return m_Utf8Str;
+}
+
+void UniString::clear()
+{
+ m_Utf8Str.clear();
+ m_UniStr.clear();
+}
+
+std::string UniString::toUtf8(const I18nString &ustring)
+{
+ char fakeValue;
+ int length = 0;
+ i18n_error_code_e err = I18N_ERROR_NONE;
+ i18n_ustring_to_UTF8(&fakeValue, 1, &length, ustring.c_str(), -1, &err);
+
+ std::string retVal(length + 1, 0);
+ i18n_ustring_to_UTF8(&retVal[0], length + 1, &length, ustring.c_str(), -1, &err);
+
+ return retVal;
+}
+
+UniString::I18nString UniString::fromUtf8(const std::string &utf8Str)
+{
+ i18n_uchar fakeValue;
+ int length = 0;
+ i18n_error_code_e err = I18N_ERROR_NONE;
+ i18n_ustring_from_UTF8(&fakeValue, 1, &length, utf8Str.c_str(), -1, &err);
+
+ I18nString retVal(length + 1, 0);
+ i18n_ustring_from_UTF8(&retVal[0], length + 1, &length, utf8Str.c_str(), -1, &err);
+
+ return retVal;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model/DataItem.h"
+
+using namespace Model;
+
+void DataItem::setUpdateCallback(UpdateCallback callback)
+{
+ m_OnUpdated = std::move(callback);
+}
+
+void DataItem::unsetUpdateCallback()
+{
+ m_OnUpdated = nullptr;
+}
+
+void DataItem::setDeleteCallback(DeleteCallback callback)
+{
+ m_OnDeleted = std::move(callback);
+}
+
+void DataItem::unsetDeleteCallback()
+{
+ m_OnDeleted = nullptr;
+}
+
+void DataItem::onUpdated(int changes)
+{
+ if (m_OnUpdated) {
+ m_OnUpdated(changes);
+ }
+}
+
+void DataItem::onDeleted()
+{
+ if (m_OnDeleted) {
+ m_OnDeleted();
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model/DataProvider.h"
+
+using namespace Model;
+
+void DataProvider::initialize(InitializeCallback callback)
+{
+ m_OnInitialized = std::move(callback);
+ onInitialize();
+}
+
+void DataProvider::setInsertCallback(InsertCallback callback)
+{
+ m_OnInserted = std::move(callback);
+}
+
+void DataProvider::unsetInsertCallback()
+{
+ m_OnInserted = nullptr;
+}
+
+void DataProvider::setUpdateFinishedCallback(UpdateFinishedCallback callback)
+{
+ m_OnUpdateFinished = std::move(callback);
+}
+
+void DataProvider::unsetUpdateFinishedCallback()
+{
+ m_OnUpdateFinished = nullptr;
+}
+
+void DataProvider::onInitialize()
+{
+ onInitialized();
+}
+
+void DataProvider::onInitialized()
+{
+ if (m_OnInitialized) {
+ m_OnInitialized();
+ }
+}
+
+void DataProvider::onInserted(DataItem &dataItem)
+{
+ if (m_OnInserted) {
+ m_OnInserted(dataItem);
+ }
+}
+
+void DataProvider::onUpdateFinished()
+{
+ if (m_OnUpdateFinished) {
+ m_OnUpdateFinished();
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/DataItem.h"
+
+using namespace Model2;
+
+DataItem::DataItem()
+ : m_IsStandalone(false), m_Changes(0), m_ChangeType(ChangeNone)
+{
+}
+
+DataItem::DataItem(const DataItem &that)
+ : DataItem()
+{
+}
+
+void DataItem::update(void *data)
+{
+ m_Changes |= onUpdate(data);
+ m_ChangeType = ChangeUpdate;
+
+ if (m_IsStandalone) {
+ finishUpdate();
+ }
+}
+
+bool DataItem::isStandalone() const
+{
+ return m_IsStandalone;
+}
+
+void DataItem::setStandalone(bool isStandalone)
+{
+ if (m_IsStandalone != isStandalone) {
+ m_IsStandalone = isStandalone;
+ onStandalone(m_IsStandalone);
+ }
+}
+
+DataItem::UpdateCallback &DataItem::onUpdated()
+{
+ return m_OnUpdated;
+}
+
+DataItem::DeleteCallback &DataItem::onDeleted()
+{
+ return m_OnDeleted;
+}
+
+void DataItem::setChanged(ChangeType changeType, int changes)
+{
+ if (m_ChangeType == ChangeNone) {
+ m_ChangeType = changeType;
+ }
+ if (changeType == ChangeUpdate) {
+ m_Changes |= changes;
+ }
+
+ if (m_IsStandalone) {
+ finishUpdate();
+ }
+}
+
+void DataItem::finishUpdate()
+{
+ switch (m_ChangeType) {
+ case ChangeUpdate:
+ if (m_Changes) {
+ m_OnUpdated(m_Changes);
+ }
+ break;
+ case ChangeDelete:
+ m_OnDeleted();
+ break;
+ default:
+ break;
+ }
+
+ m_Changes = 0;
+ m_ChangeType = ChangeNone;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/DataProvider.h"
+
+using namespace Model2;
+
+DataProvider::DataProvider()
+ : m_IsBusy(false), m_IsInitialized(false),
+ m_IsUpdateEnabled(true), m_IsUpdatePending(false),
+ m_IsDestroyPending(false)
+{
+}
+
+DataProvider::~DataProvider()
+{
+ for (auto &&dataItem : m_DataList) {
+ delete dataItem;
+ }
+}
+
+const DataProvider::DataList &DataProvider::getDataList()
+{
+ return m_DataList;
+}
+
+void DataProvider::initialize(InitializeCallback callback)
+{
+ if (m_IsInitialized || m_IsBusy) {
+ return;
+ }
+
+ m_IsBusy = true;
+ m_OnInitialized = std::move(callback);
+
+ startInit();
+}
+
+void DataProvider::update()
+{
+ if (!m_IsInitialized) {
+ return;
+ }
+
+ if (!m_IsUpdateEnabled || m_IsBusy) {
+ m_IsUpdatePending = true;
+ return;
+ }
+
+ m_IsBusy = true;
+ m_IsUpdatePending = false;
+ m_OnUpdateStarted();
+
+ startUpdate();
+}
+
+void DataProvider::destroy()
+{
+ if (m_IsBusy) {
+ m_IsDestroyPending = true;
+ } else {
+ delete this;
+ }
+}
+
+void DataProvider::setUpdateEnabled(bool isEnabled)
+{
+ m_IsUpdateEnabled = isEnabled;
+ if (m_IsUpdateEnabled && m_IsUpdatePending) {
+ update();
+ }
+}
+
+DataProvider::InsertCallback &DataProvider::onInserted()
+{
+ return m_OnInserted;
+}
+
+DataProvider::UpdateCallback &DataProvider::onUpdateStarted()
+{
+ return m_OnUpdateStarted;
+}
+
+DataProvider::UpdateCallback &DataProvider::onUpdateFinished()
+{
+ return m_OnUpdateFinished;
+}
+
+void DataProvider::insertDataItem(DataItem *dataItem)
+{
+ dataItem->m_ChangeType = ChangeInsert;
+ m_DataList.push_back(dataItem);
+}
+
+void DataProvider::deleteDataItem(DataItem &dataItem)
+{
+ dataItem.m_ChangeType = ChangeDelete;
+}
+
+void DataProvider::finishInit(DataList dataList)
+{
+ if (m_IsDestroyPending) {
+ delete this;
+ return;
+ }
+
+ m_DataList = std::move(dataList);
+ m_IsInitialized = true;
+
+ if (m_OnInitialized) {
+ m_OnInitialized();
+ m_OnInitialized = nullptr;
+ }
+
+ m_IsBusy = false;
+}
+
+void DataProvider::finishUpdate()
+{
+ if (m_IsDestroyPending) {
+ delete this;
+ return;
+ }
+
+ for (auto it = m_DataList.begin(); it != m_DataList.end(); ) {
+ auto changeType = (*it)->m_ChangeType;
+ (*it)->finishUpdate();
+
+ if (changeType == ChangeInsert) {
+ if (m_OnInserted) {
+ m_OnInserted(**it);
+ }
+ } else if (changeType == ChangeDelete) {
+ delete *it;
+ it = m_DataList.erase(it);
+ continue;
+ }
+
+ ++it;
+ }
+ m_OnUpdateFinished();
+
+ m_IsBusy = false;
+ if (m_IsUpdatePending) {
+ update();
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/SearchData.h"
+
+using namespace Model2;
+
+SearchData::SearchData(DataItem &dataItem)
+ : m_DataItem(dataItem),
+ m_SearchResult(nullptr)
+{
+}
+
+DataItem &SearchData::getDataItem()
+{
+ return m_DataItem;
+}
+
+const DataItem &SearchData::getDataItem() const
+{
+ return m_DataItem;
+}
+
+const SearchResult *SearchData::getSearchResult() const
+{
+ return m_SearchResult;
+}
+
+void SearchData::setSearchResult(SearchResult *searchResult)
+{
+ m_SearchResult = searchResult;
+
+ if (m_OnChanged) {
+ m_OnChanged(m_SearchResult);
+ }
+}
+
+void SearchData::setChangeCallback(ChangeCallback callback)
+{
+ m_OnChanged = std::move(callback);
+}
+
+int SearchData::onUpdate(void *data)
+{
+ return (long) data;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/SearchEngine.h"
+#include "Model2/SearchData.h"
+
+#include <utility>
+#include <algorithm>
+
+using namespace Model2;
+using namespace std::placeholders;
+
+SearchEngine::SearchEngine(const DataList &dataList, SearchComparator comparator)
+ : m_LastFoundIndex(-1),
+ m_DataList(dataList),
+ m_Comparator(std::move(comparator))
+{
+}
+
+void SearchEngine::search(std::string query)
+{
+ if (query.empty()) {
+ clear();
+ if (!m_Query.empty()) {
+ resetSearchResult();
+ }
+ } else {
+ if (!needSearch(query)) {
+ return;
+ }
+
+ auto matchIt = getMatch(query);
+ size_t matchPos = matchIt - m_History.begin();
+ bool nothingFound = matchIt == m_History.end();
+
+ m_History.erase(nothingFound ? m_History.begin() : (matchIt + 1), m_History.end());
+ m_History.resize(query.size());
+
+ if (m_Query.empty() || nothingFound) {
+ incrementalSearch(m_DataList, query);
+ } else if (matchPos == m_History.size()) {
+ updateSearchResult(m_History.back());
+ } else {
+ incrementalSearch(m_History[matchPos], query);
+ }
+ }
+
+ m_Query = std::move(query);
+}
+
+bool SearchEngine::empty() const
+{
+ return m_History.empty() || m_History.back().empty();
+}
+
+void SearchEngine::insertSearchData(SearchData *searchData)
+{
+ SearchResult *lastResult = nullptr;
+
+ historyFor([searchData, &lastResult, this](const std::string &query, ResultList &list) {
+ SearchResultPtr searchResult = m_Comparator(*searchData, query);
+ lastResult = searchResult.get();
+
+ if (searchResult) {
+ list.emplace_back(searchData, std::move(searchResult));
+ return true;
+ }
+
+ return false;
+ });
+
+ searchData->setSearchResult(lastResult);
+}
+
+void SearchEngine::updateSearchData(SearchData *searchData)
+{
+ SearchResult *lastResult = nullptr;
+
+ historyFor([searchData, &lastResult, this](const std::string &query, ResultList &list) {
+ auto it = findSearchData(list, searchData);
+ if (it != list.end()) {
+ SearchResultPtr searchResult = m_Comparator(*searchData, query);
+ lastResult = searchResult.get();
+
+ if (searchResult) {
+ it->second = std::move(searchResult);
+ } else {
+ list.erase(it);
+ }
+ }
+
+ return true;
+ });
+
+ searchData->setSearchResult(lastResult);
+}
+
+void SearchEngine::deleteSearchData(SearchData *searchData)
+{
+ for (auto &&list : m_History) {
+ auto it = findSearchData(list, searchData);
+ if (it != list.end()) {
+ list.erase(it);
+ }
+ }
+}
+
+bool SearchEngine::needSearch(const std::string &query)
+{
+ if (query.size() >= m_Query.size()
+ &&(int)(m_History.size() - 1) > m_LastFoundIndex) {
+ return false;
+ }
+
+ return true;
+}
+
+template <typename List>
+void SearchEngine::incrementalSearch(const List &list, const std::string &query)
+{
+ ResultList resultList;
+ for (auto &&data : list) {
+ SearchData *searchData = getSearchData(data);
+ SearchResultPtr searchResult = m_Comparator(*searchData, query);
+ searchData->setSearchResult(searchResult.get());
+
+ if (searchResult) {
+ resultList.emplace_back(searchData, std::move(searchResult));
+ }
+ }
+
+ if (!resultList.empty()) {
+ m_LastFoundIndex = m_History.size() - 1;
+ m_History.back() = std::move(resultList);
+ }
+}
+
+SearchData *SearchEngine::getSearchData(DataItem *data)
+{
+ return static_cast<SearchData *>(data);
+}
+
+SearchData *SearchEngine::getSearchData(const SearchResultItem &resultItem)
+{
+ return resultItem.first;
+}
+
+void SearchEngine::updateSearchResult(ResultList &list)
+{
+ for (auto &&resultItem : list) {
+ resultItem.first->setSearchResult(resultItem.second.get());
+ }
+}
+
+void SearchEngine::resetSearchResult()
+{
+ for (auto &&data : m_DataList) {
+ SearchData *searchData = static_cast<SearchData *>(data);
+ searchData->setSearchResult(nullptr);
+ }
+}
+
+void SearchEngine::clear()
+{
+ m_History.clear();
+ m_LastFoundIndex = -1;
+}
+
+SearchEngine::SearchHistory::iterator SearchEngine::getMatch(const std::string &query)
+{
+ size_t minSize = std::min(m_Query.size(), query.size());
+ auto itPair = std::mismatch(m_Query.begin(), m_Query.begin() + minSize, query.begin());
+
+ return skipEmptyResults(itPair.first - m_Query.begin());
+}
+
+SearchEngine::SearchHistory::iterator SearchEngine::skipEmptyResults(size_t offset)
+{
+ auto rIt = std::reverse_iterator<SearchHistory::iterator>(m_History.begin() + offset);
+
+ while (rIt != m_History.rend() && rIt->empty()) {
+ ++rIt;
+ }
+
+ return rIt == m_History.rend() ? m_History.end() : rIt.base() - 1;
+}
+
+void SearchEngine::historyFor(HistoryForFn function)
+{
+ std::string query;
+ query.reserve(m_Query.size());
+
+ for (size_t i = 0; i < m_History.size(); ++i) {
+ auto &list = m_History[i];
+ query.append(1, m_Query[i]);
+
+ if ((int) i < m_LastFoundIndex && list.empty()) {
+ continue;
+ }
+
+ if (!function(query, list)) {
+ break;
+ }
+ }
+}
+
+SearchEngine::ResultList::iterator SearchEngine::findSearchData(ResultList &list, SearchData *searchData)
+{
+ return std::find_if(list.begin(), list.end(),
+ [searchData](const SearchResultItem &item) {
+ return item.first == searchData;
+ });
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/SearchProvider.h"
+#include "Model2/SearchData.h"
+
+using namespace Model2;
+using namespace std::placeholders;
+
+SearchProvider::SearchProvider(DataProvider &provider, SearchComparator comparator)
+ : m_Provider(provider), m_SearchEngine(getDataList(), std::move(comparator))
+{
+ m_Provider.onInserted() += { std::bind(&SearchProvider::onItemInserted, this, _1), this };
+ m_Provider.onUpdateStarted() += { std::bind(&SearchProvider::update, this), this };
+ m_Provider.onUpdateFinished() += { std::bind(&SearchProvider::finishUpdate, this), this };
+}
+
+SearchProvider::~SearchProvider()
+{
+ m_Provider.onInserted() -= this;
+ m_Provider.onUpdateStarted() -= this;
+ m_Provider.onUpdateFinished() -= this;
+}
+
+void SearchProvider::search(const char *query)
+{
+ m_SearchEngine.search(query ? query : "");
+}
+
+bool SearchProvider::empty() const
+{
+ return m_SearchEngine.empty();
+}
+
+void SearchProvider::startInit()
+{
+ m_Provider.initialize([this] {
+ DataList dataList;
+ for (auto &&dataItem : m_Provider.getDataList()) {
+ dataList.push_back(createSearchData(*dataItem));
+ }
+
+ finishInit(std::move(dataList));
+ });
+}
+
+SearchData *SearchProvider::createSearchData(DataItem &dataItem)
+{
+ auto searchData = new SearchData(dataItem);
+ dataItem.onUpdated() += { std::bind(&SearchProvider::onItemUpdated, this, std::ref(*searchData), _1), searchData };
+ dataItem.onDeleted() += { std::bind(&SearchProvider::onItemDeleted, this, std::ref(*searchData)), searchData };
+ return searchData;
+}
+
+void SearchProvider::onItemInserted(DataItem &dataItem)
+{
+ SearchData *searchData = createSearchData(dataItem);
+ insertDataItem(searchData);
+ m_SearchEngine.insertSearchData(searchData);
+}
+
+void SearchProvider::onItemUpdated(SearchData &searchData, int changes)
+{
+ searchData.update((void *)(long) changes);
+ m_SearchEngine.updateSearchData(&searchData);
+}
+
+void SearchProvider::onItemDeleted(SearchData &searchData)
+{
+ m_SearchEngine.deleteSearchData(&searchData);
+ deleteDataItem(searchData);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Model2/SearchResult.h"
+
+using namespace Model2;
+
+SearchResult::SearchResult()
+ : m_MatchedField(-1),
+ m_MatchedString(nullptr)
+{
+}
+
+SearchResult::SearchResult(int fieldId, const char *str, Substring substr)
+ : m_MatchedField(fieldId),
+ m_MatchedString(str),
+ m_MatchedSubstring(substr)
+{
+}
+
+int SearchResult::getMatchedField() const
+{
+ return m_MatchedField;
+}
+
+const char *SearchResult::getMatchedString() const
+{
+ return m_MatchedString;
+}
+
+const SearchResult::Substring &SearchResult::getMatchedSubstring() const
+{
+ return m_MatchedSubstring;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "System/Settings.h"
+#include "Utils/Callback.h"
+
+#include <algorithm>
+#include <list>
+
+using namespace System::Settings;
+
+namespace
+{
+ class KeyManager : public CallbackManager
+ {
+ public:
+ explicit KeyManager(system_settings_key_e key)
+ : m_Key(key)
+ {
+ system_settings_set_changed_cb(m_Key,
+ makeCallbackWithLastParam(&KeyManager::operator()), this);
+ }
+
+ ~KeyManager()
+ {
+ system_settings_unset_changed_cb(m_Key);
+ }
+
+ bool operator==(system_settings_key_e key) const
+ {
+ return m_Key == key;
+ }
+
+ private:
+ system_settings_key_e m_Key;
+ };
+
+ std::list<KeyManager> keyManagers;
+}
+
+void System::Settings::addCallback(system_settings_key_e key, KeyManager::Callback callback)
+{
+ auto manager = std::find(keyManagers.begin(), keyManagers.end(), key);
+ if (manager == keyManagers.end()) {
+ keyManagers.emplace_back(key);
+ manager = --keyManagers.end();
+ }
+
+ (*manager) += (callback);
+}
+
+void System::Settings::removeCallback(system_settings_key_e key, void *subscriber)
+{
+ auto manager = std::find(keyManagers.begin(), keyManagers.end(), key);
+ if (manager == keyManagers.end()) {
+ return;
+ }
+
+ (*manager) -= subscriber;
+ if (!*manager) {
+ keyManagers.erase(manager);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Button.h"
+#include "Utils/Callback.h"
+
+#include <Ecore.h>
+
+using namespace Ui;
+
+Button::Button()
+ : m_Timer(nullptr), m_IsLongpressed(false)
+{
+}
+
+Button::~Button()
+{
+ resetTimer();
+}
+
+void Button::setPressedCallback(std::function<void(Button&)> callback)
+{
+ m_OnPressed = std::move(callback);
+}
+
+void Button::setLongpressedCallback(std::function<bool(Button&)> callback)
+{
+ m_OnLongpressed = std::move(callback);
+}
+
+Evas_Object *Button::onCreate(Evas_Object *parent)
+{
+ Evas_Object *button = elm_button_add(parent);
+ return button;
+}
+
+void Button::onCreated()
+{
+ evas_object_event_callback_add(getEvasObject(), EVAS_CALLBACK_MOUSE_DOWN,
+ makeCallback(&Button::onMouseDown), this);
+ evas_object_event_callback_add(getEvasObject(), EVAS_CALLBACK_MOUSE_UP,
+ makeCallback(&Button::onMouseUp), this);
+ evas_object_event_callback_add(getEvasObject(), EVAS_CALLBACK_MOUSE_OUT,
+ makeCallback(&Button::onMouseOut), this);
+}
+
+void Button::onMouseDown(Evas *evas, Evas_Object *obj, void *eventInfo)
+{
+ m_IsLongpressed = false;
+ m_Timer = ecore_timer_add(elm_config_longpress_timeout_get(),
+ makeCallback(&Button::onTimeout), this);
+}
+
+void Button::onMouseUp(Evas *evas, Evas_Object *obj, void *eventInfo)
+{
+ Evas_Event_Mouse_Up *e = (Evas_Event_Mouse_Up *) eventInfo;
+
+ if (!m_IsLongpressed) {
+ int x = 0, y = 0, w = 0, h = 0;
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+ if (m_OnPressed) {
+ if (e->output.x >= x && e->output.x <= x + w
+ && e->output.y >= y && e->output.x <= y + h) {
+ m_OnPressed(*this);
+ }
+ }
+
+ resetTimer();
+ }
+}
+
+void Button::onMouseOut(Evas *evas, Evas_Object *obj, void *eventInfo)
+{
+ resetTimer();
+}
+
+void Button::resetTimer()
+{
+ ecore_timer_del(m_Timer);
+ m_Timer = nullptr;
+}
+
+Eina_Bool Button::onTimeout()
+{
+ if (m_OnLongpressed) {
+ m_IsLongpressed = m_OnLongpressed(*this);
+ }
+
+ resetTimer();
+ return ECORE_CALLBACK_CANCEL;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/CheckItem.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+CheckItem::CheckItem(GenContainer::Type type)
+ : GenItem(type),
+ m_CheckPart("*"), m_IsChecked(false), m_IsChecking(false),
+ m_LinkedItem(nullptr)
+{
+}
+
+CheckItem::~CheckItem()
+{
+ unsetLinkedItem();
+}
+
+bool CheckItem::isChecked() const
+{
+ return m_IsChecked;
+}
+
+bool CheckItem::setChecked(bool isChecked)
+{
+ if (isChecked == m_IsChecked) {
+ return true;
+ }
+
+ m_IsChecked = isChecked;
+ if (!notifyCheck()) {
+ m_IsChecked = !m_IsChecked;
+ return false;
+ }
+
+ Evas_Object *check = elm_object_item_part_content_get(getObjectItem(), m_CheckPart.c_str());
+ if (check) {
+ /* Enable animation */
+ elm_object_signal_emit(check, m_IsChecked
+ ? "elm,activate,check,on" : "elm,activate,check,off", "elm");
+ elm_check_state_set(check, m_IsChecked);
+ }
+
+ return true;
+}
+
+void CheckItem::setCheckCallback(CheckCallback callback)
+{
+ m_OnChecked = std::move(callback);
+}
+
+void CheckItem::setLinkedItem(CheckItem *item)
+{
+ if (!item) {
+ return;
+ }
+
+ unsetLinkedItem();
+ item->unsetLinkedItem();
+
+ item->setChecked(m_IsChecked);
+ item->m_LinkedItem = this;
+ m_LinkedItem = item;
+}
+
+void CheckItem::unsetLinkedItem()
+{
+ if (m_LinkedItem) {
+ m_LinkedItem->m_LinkedItem = nullptr;
+ m_LinkedItem = nullptr;
+ }
+}
+
+void CheckItem::updateCheckPart()
+{
+ update(m_CheckPart.c_str(), ELM_GENLIST_ITEM_FIELD_CONTENT);
+}
+
+Evas_Object *CheckItem::getContent(Evas_Object *parent, const char *part)
+{
+ m_CheckPart = part;
+
+ Elm_Check *check = elm_check_add(parent);
+ elm_check_state_set(check, m_IsChecked);
+ elm_check_state_pointer_set(check, &m_IsChecked);
+ elm_object_signal_emit(check, "elm,event,pass,enabled", "elm");
+
+ return check;
+}
+
+void CheckItem::onSelected()
+{
+ setChecked(!m_IsChecked);
+}
+
+bool CheckItem::notifyCheck()
+{
+ if (m_IsChecking) {
+ return false;
+ }
+
+ bool isAllowed = false;
+ m_IsChecking = true;
+
+ if (onChecked(m_IsChecked)) {
+ if (!m_OnChecked || m_OnChecked(m_IsChecked)) {
+ if (!m_LinkedItem || m_LinkedItem->setChecked(m_IsChecked)) {
+ isAllowed = true;
+ }
+ }
+ }
+
+ m_IsChecking = false;
+ return isAllowed;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Control.h"
+#include "Utils/Callback.h"
+
+#define EVENT_TYPE_CHECK "type_check"
+
+using namespace Ui;
+
+namespace
+{
+ struct TypeCheckInfo
+ {
+ const std::type_info &type;
+ Control *object;
+ };
+}
+
+Control::Control()
+ : m_Object(nullptr), m_CreateTimer(nullptr)
+{
+}
+
+Control::~Control()
+{
+ if (m_CreateTimer) {
+ ecore_timer_del(m_CreateTimer);
+ }
+
+ destroyEvasObject();
+}
+
+Evas_Object *Control::create(Evas_Object *parent)
+{
+ if (!m_Object) {
+ setEvasObject(onCreate(parent));
+ if (!m_CreateTimer) {
+ onCreated();
+ } else {
+ ecore_timer_thaw(m_CreateTimer);
+ }
+ }
+
+ return m_Object;
+}
+
+void Control::setCreateTimer(double time)
+{
+ if (m_CreateTimer) {
+ ecore_timer_del(m_CreateTimer);
+ }
+
+ m_CreateTimer = ecore_timer_add(time, [](void *data) {
+ Control *control = (Control *) data;
+ control->m_CreateTimer = nullptr;
+ control->onCreated();
+ return EINA_FALSE;
+ }, this);
+ ecore_timer_freeze(m_CreateTimer);
+}
+
+void Control::resetCreateTimer()
+{
+ if (m_CreateTimer) {
+ ecore_timer_del(m_CreateTimer);
+ m_CreateTimer = nullptr;
+
+ if (m_Object) {
+ onCreated();
+ }
+ }
+}
+
+Evas_Object *Control::getEvasObject() const
+{
+ return m_Object;
+}
+
+Control *Control::getControl(Evas_Object *object, const std::type_info &type)
+{
+ TypeCheckInfo checkInfo = { type, nullptr };
+ evas_object_smart_callback_call(object, EVENT_TYPE_CHECK, &checkInfo);
+ return checkInfo.object;
+}
+
+Control *Control::findParent(Evas_Object *object, const std::type_info &type)
+{
+ while (object) {
+ if (auto control = getControl(object, type)) {
+ return control;
+ }
+ object = elm_object_parent_widget_get(object);
+ }
+
+ return nullptr;
+}
+
+void Control::setEvasObject(Evas_Object *object)
+{
+ m_Object = object;
+ evas_object_smart_callback_add(m_Object, EVENT_TYPE_CHECK,
+ makeCallback(&Control::onTypeCheck), this);
+ evas_object_event_callback_add(m_Object, EVAS_CALLBACK_DEL,
+ (Evas_Object_Event_Cb) makeCallback(&Control::onDestroy), this);
+ evas_object_event_callback_add(m_Object, EVAS_CALLBACK_FREE,
+ makeCallback(&Control::onDestroyed), this);
+}
+
+Evas_Object *Control::resetEvasObject()
+{
+ Evas_Object *object = m_Object;
+ evas_object_smart_callback_del_full(m_Object, EVENT_TYPE_CHECK,
+ makeCallback(&Control::onTypeCheck), this);
+ evas_object_event_callback_del_full(m_Object, EVAS_CALLBACK_DEL,
+ (Evas_Object_Event_Cb) makeCallback(&Control::onDestroy), this);
+ evas_object_event_callback_del_full(m_Object, EVAS_CALLBACK_FREE,
+ makeCallback(&Control::onDestroyed), this);
+ m_Object = nullptr;
+ return object;
+}
+
+void Control::destroyEvasObject()
+{
+ if (m_Object) {
+ onDestroy();
+ evas_object_del(resetEvasObject());
+ }
+}
+
+void Control::onTypeCheck(Evas_Object *obj, void *eventInfo)
+{
+ auto checkInfo = (TypeCheckInfo *) eventInfo;
+ if (!checkInfo->object) {
+ if (typeid(*this) == checkInfo->type || hasType(checkInfo->type)) {
+ checkInfo->object = this;
+ }
+ }
+}
+
+void Control::onDestroyed(Evas *e, Evas_Object *obj, void *eventInfo)
+{
+ m_Object = nullptr;
+ delete this;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Editfield.h"
+
+#include <app_i18n.h>
+#include <Elementary.h>
+#include <notification.h>
+
+#define DEFAULT_TEXT_LIMIT 0
+#define BUFFER_SIZE 256
+
+using namespace Ui;
+
+
+Editfield::Editfield()
+ : m_TextLimitFilter{DEFAULT_TEXT_LIMIT, DEFAULT_TEXT_LIMIT},
+ m_LimitToastText(nullptr)
+{
+}
+
+Editfield *Editfield::create(Evas_Object *parent, const char *guideText)
+{
+ Editfield *editfield = new Editfield();
+ editfield->create(parent);
+ editfield->setGuideText(guideText);
+ return editfield;
+}
+
+Evas_Object *Editfield::onCreate(Evas_Object *parent)
+{
+ Evas_Object *layout = elm_layout_add(parent);
+ elm_layout_theme_set(layout, "layout", "editfield", "singleline");
+
+ Evas_Object *entry = elm_entry_add(parent);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_object_part_content_set(layout, "elm.swallow.content", entry);
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &m_TextLimitFilter);
+
+ evas_object_smart_callback_add(entry, "changed", (Evas_Smart_Cb) onChanged, this);
+ evas_object_smart_callback_add(entry, "focused", (Evas_Smart_Cb) onFocused, layout);
+ evas_object_smart_callback_add(entry, "unfocused", (Evas_Smart_Cb) onUnfocused, layout);
+ evas_object_smart_callback_add(entry, "maxlength,reached", (Evas_Smart_Cb) onMaxLengthReached, this);
+
+ Evas_Object *button = elm_button_add(parent);
+ elm_object_style_set(button, "editfield_clear");
+ elm_object_focus_allow_set(button, EINA_FALSE);
+ elm_object_part_content_set(layout, "elm.swallow.button", button);
+ evas_object_smart_callback_add(button, "clicked", (Evas_Smart_Cb) onClearPressed, entry);
+
+ return layout;
+}
+
+void Editfield::setMultiline(bool isMultiline)
+{
+ elm_entry_single_line_set(getEntry(), !isMultiline);
+ elm_entry_scrollable_set(getEntry(), !isMultiline);
+ elm_entry_line_wrap_set(getEntry(), isMultiline ? ELM_WRAP_MIXED : ELM_WRAP_NONE);
+}
+
+void Editfield::setGuideText(const char *guideText)
+{
+ elm_object_translatable_part_text_set(getEntry(), "elm.guide", guideText);
+}
+
+Evas_Object *Editfield::getEntry()
+{
+ return elm_object_part_content_get(getEvasObject(), "elm.swallow.content");
+}
+
+Evas_Object *Editfield::getClearButton()
+{
+ return elm_object_part_content_get(getEvasObject(), "elm.swallow.button");
+}
+
+void Editfield::setEnabled(bool isEnabled)
+{
+ elm_object_disabled_set(getEntry(), !isEnabled);
+ setClearButtonVisible(isEnabled);
+}
+
+void Editfield::setClearButtonVisible(bool isVisible)
+{
+ if (isVisible) {
+ elm_object_signal_emit(getEvasObject(), "elm,action,show,button", "");
+ } else {
+ elm_object_signal_emit(getEvasObject(), "elm,action,hide,button", "");
+ }
+}
+
+void Editfield::setTextLimit(int limit)
+{
+ if (m_TextLimitFilter.max_char_count == limit) {
+ return;
+ }
+
+ elm_entry_markup_filter_remove(getEntry(), elm_entry_filter_limit_size, &m_TextLimitFilter);
+ m_TextLimitFilter.max_char_count = limit;
+ elm_entry_markup_filter_append(getEntry(), elm_entry_filter_limit_size, &m_TextLimitFilter);
+}
+
+void Editfield::setLimitToastText(const char *text)
+{
+ m_LimitToastText = text;
+}
+
+void Editfield::onChanged(Editfield *editfield, Evas_Object *entry, void *eventInfo)
+{
+ if (!elm_object_disabled_get(entry)) {
+ editfield->setClearButtonVisible(!elm_entry_is_empty(entry));
+ }
+}
+
+void Editfield::onFocused(Evas_Object *layout, Evas_Object *entry, void *eventInfo)
+{
+ elm_object_signal_emit(layout, "elm,state,focused", "");
+}
+
+void Editfield::onUnfocused(Evas_Object *layout, Evas_Object *entry, void *eventInfo)
+{
+ elm_object_signal_emit(layout, "elm,state,unfocused", "");
+}
+
+void Editfield::onClearPressed(Evas_Object *entry, Evas_Object *button, void *eventInfo)
+{
+ elm_entry_entry_set(entry, "");
+ elm_object_focus_set(entry, EINA_TRUE);
+}
+
+void Editfield::onMaxLengthReached(Editfield *editfield, Evas_Object *button, void *eventInfo)
+{
+ if (editfield->m_LimitToastText) {
+ char buffer[BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer), _(editfield->m_LimitToastText), editfield->m_TextLimitFilter.max_char_count);
+ notification_status_message_post(buffer);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/GenContainer.h"
+#include "Ui/GenItem.h"
+
+using namespace Ui;
+
+#define INSERTER_PARAMS Evas_Object *obj, const Elm_Gen_Item_Class *itc, const void *data, \
+ Elm_Object_Item *parent, Elm_Object_Item *sibling, int type, \
+ Evas_Smart_Cb func, const void *func_data
+
+typedef Elm_Object_Item *(*Inserter)(INSERTER_PARAMS);
+typedef void (*Updater)(Elm_Genlist_Item *obj, const char *parts, int type);
+
+struct Ui::GenContainerApi
+{
+ Evas_Object *(*create)(Evas_Object *parent);
+ Elm_Object_Item *(*getFirstItem)(const Evas_Object *obj);
+ Elm_Object_Item *(*getLastItem)(const Evas_Object *obj);
+ Eina_List *(*getRealizedItems)(const Evas_Object *obj);
+ Updater updateItemFields;
+
+ Inserter appendItem;
+ Inserter prependItem;
+ Inserter insertAfter;
+ Inserter insertBefore;
+};
+
+namespace
+{
+ const GenContainerApi api[] = {
+ {
+ elm_genlist_add,
+ elm_genlist_first_item_get,
+ elm_genlist_last_item_get,
+ elm_genlist_realized_items_get,
+ (Updater) elm_genlist_item_fields_update,
+
+ [](INSERTER_PARAMS) { return elm_genlist_item_append(obj, itc, data, parent, Elm_Genlist_Item_Type(type), func, func_data); },
+ [](INSERTER_PARAMS) { return elm_genlist_item_prepend(obj, itc, data, parent, Elm_Genlist_Item_Type(type), func, func_data); },
+ (Inserter) elm_genlist_item_insert_after,
+ (Inserter) elm_genlist_item_insert_before
+ },
+ {
+ elm_gengrid_add,
+ elm_gengrid_first_item_get,
+ elm_gengrid_last_item_get,
+ elm_gengrid_realized_items_get,
+ (Updater) elm_gengrid_item_fields_update,
+
+ [](INSERTER_PARAMS) { return elm_gengrid_item_append(obj, itc, data, func, func_data); },
+ [](INSERTER_PARAMS) { return elm_gengrid_item_prepend(obj, itc, data, func, func_data); },
+ [](INSERTER_PARAMS) { return elm_gengrid_item_insert_after(obj, itc, data, sibling, func, func_data); },
+ [](INSERTER_PARAMS) { return elm_gengrid_item_insert_before(obj, itc, data, sibling, func, func_data); },
+ }
+ };
+}
+
+GenContainer::GenContainer(Type type)
+ : m_Api(&api[type])
+{
+}
+
+Evas_Object *GenContainer::onCreate(Evas_Object *parent)
+{
+ Evas_Object *obj = m_Api->create(parent);
+
+ evas_object_smart_callback_add(obj, "selected",
+ (Evas_Smart_Cb) &GenContainer::onItemSelected, this);
+ evas_object_smart_callback_add(obj, "longpressed",
+ (Evas_Smart_Cb) &GenContainer::onItemLongpressed, this);
+ evas_object_smart_callback_add(obj, "realized",
+ (Evas_Smart_Cb) &GenContainer::onItemRealized, this);
+ evas_object_smart_callback_add(obj, "unrealized",
+ (Evas_Smart_Cb) &GenContainer::onItemUnrealized, this);
+ return obj;
+}
+
+GenItem *GenContainer::getFirstItem() const
+{
+ Elm_Object_Item *item = m_Api->getFirstItem(getEvasObject());
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenItem *GenContainer::getLastItem() const
+{
+ Elm_Object_Item *item = m_Api->getLastItem(getEvasObject());
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenIterator GenContainer::begin() const
+{
+ return getFirstItem();
+}
+
+GenIterator GenContainer::end() const
+{
+ return nullptr;
+}
+
+void GenContainer::insert(GenItem *item, GenItem *parent, GenItem *sibling, Position position)
+{
+ if (!item) {
+ return;
+ }
+
+ if (item->isInserted()) {
+ item->pop();
+ }
+
+ Elm_Object_Item *parentItem = parent ? parent->getObjectItem() : nullptr;
+ Elm_Object_Item *siblingItem = sibling ? sibling->getObjectItem() : nullptr;
+
+ Inserter insert = nullptr;
+ if (siblingItem) {
+ insert = (position == Before) ? m_Api->insertBefore : m_Api->insertAfter;
+ } else {
+ insert = (position == Before) ? m_Api->appendItem : m_Api->prependItem;
+ }
+
+ item->onInserted(insert(getEvasObject(), item->getItemClass(), item,
+ parentItem, siblingItem, item->getType(), nullptr, nullptr));
+}
+
+void GenContainer::update(const char *parts, int type)
+{
+ Eina_List *list = m_Api->getRealizedItems(getEvasObject());
+ Eina_List *node = nullptr;
+ void *item = nullptr;
+ EINA_LIST_FOREACH(list, node, item) {
+ m_Api->updateItemFields((Elm_Object_Item *) item, parts, type);
+ }
+
+ eina_list_free(list);
+}
+
+void GenContainer::onItemSelected(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item) {
+ item->onSelected(objectItem);
+ }
+}
+
+void GenContainer::onItemLongpressed(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item) {
+ item->onLongpressed(objectItem);
+ }
+}
+
+void GenContainer::onItemRealized(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item) {
+ item->onRealized(objectItem);
+ }
+}
+
+void GenContainer::onItemUnrealized(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item) {
+ item->onUnrealized(objectItem);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/GenGroupItem.h"
+#include <algorithm>
+#include <app_i18n.h>
+
+using namespace Ui;
+
+GenGroupItem::GenGroupItem(const char *title)
+{
+ if (title) {
+ m_Title = title;
+ }
+}
+
+GenGroupItem::~GenGroupItem()
+{
+ for (auto &&itemPtr : m_ItemsCache) {
+ if (auto item = itemPtr.lock()) {
+ delete item.get();
+ }
+ }
+}
+
+GenItem *GenGroupItem::getFirstItem() const
+{
+ if (!m_ItemsCache.empty()) {
+ return m_ItemsCache.front().lock().get();
+ }
+
+ const Eina_List *subitems = elm_genlist_item_subitems_get(getObjectItem());
+ Elm_Object_Item *item = (Elm_Object_Item *) eina_list_data_get(subitems);
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenItem *GenGroupItem::getLastItem() const
+{
+ if (!m_ItemsCache.empty()) {
+ return m_ItemsCache.back().lock().get();
+ }
+
+ const Eina_List *subitems = elm_genlist_item_subitems_get(getObjectItem());
+ Elm_Object_Item *item = (Elm_Object_Item *) eina_list_last_data_get(subitems);
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenIterator GenGroupItem::begin()
+{
+ return getFirstItem();
+}
+
+GenIterator GenGroupItem::end()
+{
+ GenItem *lastItem = getLastItem();
+ return lastItem ? lastItem->getNextItem() : nullptr;
+}
+
+size_t GenGroupItem::getItemCount() const
+{
+ if (!m_ItemsCache.empty()) {
+ return std::count_if(m_ItemsCache.begin(), m_ItemsCache.end(),
+ [](const GenItemPtr &itemPtr) {
+ return !itemPtr.expired();
+ });
+ }
+
+ const Eina_List *subitems = elm_genlist_item_subitems_get(getObjectItem());
+ return eina_list_count(subitems);
+}
+
+bool GenGroupItem::isEmpty() const
+{
+ return getItemCount() == 0;
+}
+
+bool GenGroupItem::isExpanded() const
+{
+ Elm_Object_Item *item = getObjectItem();
+ if (!item) {
+ return false;
+ }
+
+ if (getType() == ELM_GENLIST_ITEM_TREE) {
+ return elm_genlist_item_expanded_get(item);
+ }
+
+ return true;
+}
+
+GenGroupItem *GenGroupItem::getNextGroupItem() const
+{
+ GenItem *lastItem = getLastItem();
+ GenItem *item = lastItem ? lastItem->getNextItem() : getNextItem();
+ if (item && item->isGroupItem()) {
+ return dynamic_cast<GenGroupItem *>(item);
+ }
+
+ return nullptr;
+}
+
+GenGroupItem *GenGroupItem::getPrevGroupItem() const
+{
+ GenItem *item = getPrevItem();
+ if (item) {
+ if (item->isGroupItem()) {
+ return dynamic_cast<GenGroupItem *>(item);
+ } else {
+ return item->getParentItem();
+ }
+ }
+
+ return nullptr;
+}
+
+void GenGroupItem::insertSubItem(GenItem *item, GenItem *sibling,
+ GenContainer::Position position)
+{
+ if (!item) {
+ return;
+ }
+
+ GenContainer *container = getParent();
+ if (container && isExpanded()) {
+ container->insert(item, this, sibling, position);
+ } else {
+ auto pos = m_ItemsCache.end();
+ if (sibling) {
+ pos = std::find_if(m_ItemsCache.begin(), m_ItemsCache.end(),
+ [sibling](GenItemPtr &itemPtr) {
+ if (auto item = itemPtr.lock()) {
+ return item.get() == sibling;
+ }
+ return false;
+ });
+ }
+
+ if (pos != m_ItemsCache.end()) {
+ if (position == GenContainer::After) {
+ ++pos;
+ }
+ } else {
+ if (position == GenContainer::After) {
+ pos = m_ItemsCache.begin();
+ }
+ }
+
+ m_ItemsCache.insert(pos, item->getWeakPtr());
+ }
+}
+
+Elm_Gen_Item_Class *GenGroupItem::getItemClass() const
+{
+ static Elm_Gen_Item_Class itc = createItemClass("group_index");
+ return &itc;
+}
+
+char *GenGroupItem::getText(Evas_Object *parent, const char *part)
+{
+ if (strcmp(part, "elm.text") == 0) {
+ return strdup(_(m_Title.c_str()));
+ }
+
+ return nullptr;
+}
+
+void GenGroupItem::onInserted()
+{
+ if (getType() == ELM_GENLIST_ITEM_GROUP) {
+ elm_genlist_item_select_mode_set(getObjectItem(), ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+ if (isExpanded()) {
+ insertSubItems();
+ }
+}
+
+void GenGroupItem::onPop()
+{
+ popSubItems();
+}
+
+void GenGroupItem::onExpanded(bool isExpanded)
+{
+ if (isExpanded) {
+ insertSubItems();
+ } else {
+ popSubItems();
+ }
+}
+
+void GenGroupItem::insertSubItems()
+{
+ GenContainer *container = getParent();
+ if (container) {
+ for (auto &&itemPtr : m_ItemsCache) {
+ if (auto item = itemPtr.lock()) {
+ container->insert(item.get(), this);
+ }
+ }
+ m_ItemsCache.clear();
+ }
+}
+
+void GenGroupItem::popSubItems()
+{
+ for (auto it = begin(), endIt = end(); it != endIt; ) {
+ GenItem *item = *it++;
+ item->pop();
+ m_ItemsCache.push_back(item->getWeakPtr());
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/GenItem.h"
+#include "Ui/GenContainer.h"
+#include "Ui/GenGroupItem.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+typedef void(*ScrollFunc)(Elm_Object_Item *item, int type);
+typedef void(*UpdateFieldsFunc)(Elm_Object_Item *item, const char *parts, int fieldType);
+
+struct Ui::GenItemApi
+{
+ Elm_Object_Item *(*getParent)(const Elm_Object_Item *item);
+ Elm_Object_Item *(*getNext)(const Elm_Object_Item *item);
+ Elm_Object_Item *(*getPrev)(const Elm_Object_Item *item);
+ ScrollFunc bringIn;
+ ScrollFunc show;
+ void(*setSelected)(Elm_Object_Item *item, Eina_Bool selected);
+ UpdateFieldsFunc updateFields;
+};
+
+namespace
+{
+ const GenItemApi api[] = {
+ { elm_genlist_item_parent_get,
+ elm_genlist_item_next_get,
+ elm_genlist_item_prev_get,
+ (ScrollFunc) elm_genlist_item_bring_in,
+ (ScrollFunc) elm_genlist_item_show,
+ elm_genlist_item_selected_set,
+ (UpdateFieldsFunc) elm_genlist_item_fields_update },
+
+ { [](const Elm_Object_Item *item) -> Elm_Object_Item * { return nullptr; },
+ elm_gengrid_item_next_get,
+ elm_gengrid_item_prev_get,
+ (ScrollFunc) elm_gengrid_item_bring_in,
+ (ScrollFunc) elm_gengrid_item_show,
+ elm_gengrid_item_selected_set,
+ (UpdateFieldsFunc) elm_gengrid_item_fields_update }
+ };
+}
+
+GenItem::GenItem(GenContainer::Type type)
+ : m_Item(nullptr), m_Preserve(false),
+ m_IsMatching(true), m_IsRealized(false), m_IsVisible(false),
+ m_IsFocusPending(false), m_IsLongpressed(false),
+ m_Api(&api[type])
+{
+}
+
+GenItem::~GenItem()
+{
+ if (m_OnDestroy) {
+ m_OnDestroy();
+ }
+
+ if (m_Item) {
+ pop();
+ }
+}
+
+bool GenItem::isRealized() const
+{
+ return m_IsRealized;
+}
+
+bool GenItem::isInserted() const
+{
+ return m_Item != nullptr;
+}
+
+bool GenItem::isVisible() const
+{
+ return m_IsVisible;
+}
+
+Elm_Object_Item *GenItem::getObjectItem() const
+{
+ return m_Item;
+}
+
+GenGroupItem *GenItem::getParentItem() const
+{
+ Elm_Object_Item *objectItem = m_Api->getParent(getObjectItem());
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ return dynamic_cast<GenGroupItem *>(item);
+}
+
+GenContainer *GenItem::getParent() const
+{
+ Evas_Object *genlist = elm_object_item_widget_get(getObjectItem());
+ return Control::getControl<GenContainer>(genlist);
+}
+
+GenItem *GenItem::getNextItem() const
+{
+ Elm_Object_Item *item = m_Api->getNext(getObjectItem());
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenItem *GenItem::getPrevItem() const
+{
+ Elm_Object_Item *item = m_Api->getPrev(getObjectItem());
+ return (GenItem *) elm_object_item_data_get(item);
+}
+
+GenItemPtr GenItem::getWeakPtr()
+{
+ if (!m_SelfPtr) {
+ m_SelfPtr.reset(this, [](GenItem *){ });
+ }
+
+ return m_SelfPtr;
+}
+
+void GenItem::setSelectCallback(SelectCallback callback)
+{
+ m_OnSelected = std::move(callback);
+}
+
+void GenItem::setDestroyCallback(DestroyCallback callback)
+{
+ m_OnDestroy = std::move(callback);
+}
+
+void GenItem::scrollTo(int position, bool isAnimated)
+{
+ auto scroll = isAnimated ? m_Api->bringIn : m_Api->show;
+ scroll(getObjectItem(), position);
+}
+
+void GenItem::focus(Elm_Genlist_Item_Scrollto_Type position, bool isAnimated)
+{
+ scrollTo(position, isAnimated);
+ if (isRealized()) {
+ onFocused();
+ } else {
+ m_IsFocusPending = true;
+ }
+}
+
+void GenItem::update(const char *parts, int partType)
+{
+ m_Api->updateFields(m_Item, parts, partType);
+}
+
+void GenItem::pop()
+{
+ onPop();
+
+ m_Preserve = true;
+ elm_object_item_del(m_Item);
+ m_Preserve = false;
+}
+
+Elm_Gen_Item_Class GenItem::createItemClass(const char *style,
+ const char *decorateStyle, const char *editStyle)
+{
+ Elm_Gen_Item_Class itc = { ELM_GEN_ITEM_CLASS_HEADER, 0 };
+ itc.item_style = style;
+ itc.decorate_item_style = decorateStyle;
+ itc.decorate_all_item_style = editStyle;
+ itc.func.text_get = makeCallback(&GenItem::getText);
+ itc.func.content_get = makeCallback(&GenItem::getContent);
+ itc.func.state_get = makeCallback(&GenItem::getState);
+ itc.func.filter_get = makeCallback(&GenItem::onFiltered);
+ itc.func.del = makeCallback(&GenItem::onDestroy);
+
+ return itc;
+}
+
+Elm_Gen_Item_Class *GenItem::getItemClass() const
+{
+ static Elm_Gen_Item_Class itc = createItemClass("type1");
+ return &itc;
+}
+
+void GenItem::updateVisibility()
+{
+ bool isVisible = isInserted() && m_IsMatching;
+ if (m_IsVisible != isVisible) {
+ m_IsVisible = isVisible;
+ onVisibilityChanged(m_IsVisible);
+ }
+}
+
+void GenItem::onInserted(Elm_Object_Item *item)
+{
+ m_Item = item;
+ onInserted();
+ updateVisibility();
+}
+
+Eina_Bool GenItem::onFiltered(Evas_Object *parent, void *filter)
+{
+ m_IsMatching = compare(filter);
+ updateVisibility();
+ return m_IsMatching;
+}
+
+void GenItem::onDestroy(Evas_Object *genlist)
+{
+ m_Item = nullptr;
+ if (!m_Preserve) {
+ delete this;
+ } else {
+ m_IsMatching = true;
+ updateVisibility();
+ }
+}
+
+void GenItem::onSelected(Elm_Object_Item *item)
+{
+ m_Api->setSelected(item, EINA_FALSE);
+ if (m_IsLongpressed) {
+ m_IsLongpressed = false;
+ return;
+ }
+
+ onSelected();
+
+ if (m_OnSelected) {
+ m_OnSelected();
+ }
+}
+
+void GenItem::onLongpressed(Elm_Object_Item *item)
+{
+ m_IsLongpressed = onLongpressed();
+}
+
+void GenItem::onRealized(Elm_Object_Item *item)
+{
+ if (!m_Item) {
+ m_Item = item;
+ }
+
+ m_IsRealized = true;
+ if (m_IsFocusPending) {
+ m_IsFocusPending = false;
+ onFocused();
+ }
+
+ onRealized();
+}
+
+void GenItem::onUnrealized(Elm_Object_Item *item)
+{
+ m_IsRealized = false;
+ onUnrealized();
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/GenIterator.h"
+#include "Ui/GenItem.h"
+
+using namespace Ui;
+
+GenIterator::GenIterator(GenItem *item)
+ : m_Item(item)
+{
+}
+
+GenIterator &GenIterator::operator++()
+{
+ if (m_Item) {
+ m_Item = m_Item->getNextItem();
+ }
+ return *this;
+}
+
+GenIterator GenIterator::operator++(int)
+{
+ auto it(*this);
+ ++*this;
+ return it;
+}
+
+GenIterator &GenIterator::operator--()
+{
+ if (m_Item) {
+ m_Item = m_Item->getPrevItem();
+ }
+ return *this;
+}
+
+GenIterator GenIterator::operator--(int)
+{
+ auto it(*this);
+ --*this;
+ return it;
+}
+
+GenItem *GenIterator::operator*() const
+{
+ return m_Item;
+}
+
+bool GenIterator::operator!=(const GenIterator &that) const
+{
+ return m_Item != that.m_Item;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Gengrid.h"
+
+using namespace Ui;
+
+Gengrid::Gengrid()
+ : GenContainer(TypeGengrid)
+{
+}
+
+void Gengrid::insert(GenItem *item, GenItem *sibling, Position position)
+{
+ GenContainer::insert(item, nullptr, sibling, position);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Genlist.h"
+#include "Ui/GenGroupItem.h"
+
+using namespace Ui;
+
+Genlist::Genlist()
+ : GenContainer(TypeGenlist)
+{
+}
+
+void Genlist::onCreated()
+{
+ Evas_Object *genlist = getEvasObject();
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+ elm_genlist_homogeneous_set(genlist, EINA_TRUE);
+
+ evas_object_smart_callback_add(genlist, "expanded",
+ (Evas_Smart_Cb) &Genlist::onItemExpanded, this);
+ evas_object_smart_callback_add(genlist, "contracted",
+ (Evas_Smart_Cb) &Genlist::onItemContracted, this);
+}
+
+void Genlist::onItemExpanded(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item && item->isGroupItem()) {
+ GenGroupItem *groupItem = dynamic_cast<GenGroupItem *>(item);
+ if (groupItem) {
+ groupItem->onExpanded(true);
+ }
+ }
+}
+
+void Genlist::onItemContracted(void *data, Evas_Object *obj, Elm_Object_Item *objectItem)
+{
+ GenItem *item = (GenItem *) elm_object_item_data_get(objectItem);
+ if (item && item->isGroupItem()) {
+ GenGroupItem *groupItem = dynamic_cast<GenGroupItem *>(item);
+ if (groupItem) {
+ groupItem->onExpanded(false);
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Hoversel.h"
+#include "Ui/View.h"
+#include "Ui/Window.h"
+#include "Utils/Callback.h"
+
+#include <efl_extension.h>
+
+using namespace Ui;
+
+Hoversel::Hoversel()
+ : m_View(nullptr)
+{
+}
+
+Hoversel::~Hoversel()
+{
+ if (m_View) {
+ evas_object_smart_callback_del_full(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Hoversel::onViewNavigation), this);
+ }
+}
+
+Elm_Object_Item *Hoversel::addItem(const char *text, void *data)
+{
+ Elm_Object_Item *item = elm_hoversel_item_add(getEvasObject(), text,
+ nullptr, ELM_ICON_NONE, nullptr, data);
+ elm_object_item_text_translatable_set(item, EINA_TRUE);
+ return item;
+}
+
+Elm_Object_Item *Hoversel::addItem(void *data)
+{
+ return addItem(nullptr, data);
+}
+
+void Hoversel::setText(const char *text)
+{
+ elm_object_translatable_text_set(getEvasObject(), text);
+}
+
+void Hoversel::setSelectedItem(Elm_Object_Item *item)
+{
+ setText(elm_object_item_translatable_text_get(item));
+}
+
+Evas_Object *Hoversel::onCreate(Evas_Object *parent)
+{
+ Evas_Object *hoversel = elm_hoversel_add(parent);
+ evas_object_smart_callback_add(hoversel, "selected",
+ (Evas_Smart_Cb) makeCallback(&Hoversel::onSelected), this);
+ evas_object_smart_callback_add(hoversel, "expanded",
+ &Hoversel::onExpanded, this);
+ evas_object_smart_callback_add(hoversel, "dismissed",
+ &Hoversel::onDismissed, this);
+
+ m_View = findParent<View>(parent);
+ if (m_View) {
+ evas_object_smart_callback_add(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Hoversel::onViewNavigation), this);
+ }
+
+ auto window = findParent<Window>(parent);
+ if (window) {
+ elm_hoversel_hover_parent_set(hoversel, window->getEvasObject());
+ }
+
+ return hoversel;
+}
+
+void Hoversel::onViewNavigation(Evas_Object *obj, void *eventInfo)
+{
+ if (!eventInfo) {
+ elm_hoversel_hover_end(getEvasObject());
+ }
+}
+
+void Hoversel::onSelected(Evas_Object *hoversel, Elm_Object_Item *item)
+{
+ if (Selector::onSelected(item)) {
+ setSelectedItem(item);
+ }
+}
+
+void Hoversel::onExpanded(void *data, Evas_Object *hoversel, void *eventInfo)
+{
+ eext_object_event_callback_add(hoversel, EEXT_CALLBACK_BACK,
+ &Hoversel::onBackPressed, nullptr);
+}
+
+void Hoversel::onDismissed(void *data, Evas_Object *hoversel, void *eventInfo)
+{
+ eext_object_event_callback_del(hoversel, EEXT_CALLBACK_BACK,
+ &Hoversel::onBackPressed);
+}
+
+void Hoversel::onBackPressed(void *data, Evas_Object *hoversel, void *eventInfo)
+{
+ elm_hoversel_hover_end(hoversel);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/ListPopup.h"
+#include "Utils/Callback.h"
+#include <app_i18n.h>
+
+#define POPUP_HEIGHT_RATIO 0.75
+
+using namespace Ui;
+
+struct ListPopup::ItemData
+{
+ std::string text;
+ void *userData;
+ ItemSelectCallback callback;
+};
+
+ListPopup::ListPopup(const char *itemStyle)
+ : m_GenlistSize{0}, m_MaxHeight(0), m_IsResizing(false),
+ m_Window(nullptr), m_Genlist(nullptr)
+{
+ m_ItemClass = elm_genlist_item_class_new();
+ m_ItemClass->item_style = itemStyle;
+ m_ItemClass->func.text_get = (Elm_Gen_Item_Text_Get_Cb) &ListPopup::getText;
+ m_ItemClass->func.content_get = (Elm_Gen_Item_Content_Get_Cb) &ListPopup::getContent;
+ m_ItemClass->func.del = [](void *data, Evas_Object *obj) {
+ delete (ItemData *) data;
+ };
+}
+
+ListPopup::~ListPopup()
+{
+ evas_object_event_callback_del_full(m_Window, EVAS_CALLBACK_RESIZE,
+ makeCallback(&ListPopup::onWindowResized), this);
+ elm_genlist_item_class_free(m_ItemClass);
+}
+
+Elm_Object_Item *ListPopup::addItem(std::string text, void *data, ItemSelectCallback callback)
+{
+ ItemData *itemData = new ItemData{ std::move(text), data, std::move(callback) };
+ return elm_genlist_item_append(m_Genlist, m_ItemClass, itemData,
+ nullptr, ELM_GENLIST_ITEM_NONE, nullptr, nullptr);
+}
+
+Elm_Object_Item *ListPopup::addItem(std::string text, ItemSelectCallback callback)
+{
+ return addItem(std::move(text), nullptr, std::move(callback));
+}
+
+Elm_Object_Item *ListPopup::addItem(void *data, ItemSelectCallback callback)
+{
+ return addItem("", data, std::move(callback));
+}
+
+void ListPopup::setSelectCallback(SelectCallback callback)
+{
+ m_OnSelected = std::move(callback);
+}
+
+Evas_Object *ListPopup::onCreate(Evas_Object *parent)
+{
+ Evas_Object *popup = Popup::onCreate(parent);
+ elm_object_style_set(popup, "theme_bg");
+ elm_object_part_content_set(popup, "elm.swallow.content", createGenlist(popup));
+
+ m_Window = elm_object_top_widget_get(popup);
+ evas_object_event_callback_add(m_Window, EVAS_CALLBACK_RESIZE,
+ makeCallback(&ListPopup::onWindowResized), this);
+ updateMaxHeight();
+
+ return popup;
+}
+
+Evas_Object *ListPopup::createGenlist(Evas_Object *parent)
+{
+ m_Genlist = elm_genlist_add(parent);
+ elm_genlist_homogeneous_set(m_Genlist, EINA_TRUE);
+ elm_genlist_mode_set(m_Genlist, ELM_LIST_EXPAND);
+ evas_object_event_callback_add(m_Genlist, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+ makeCallback(&ListPopup::onGenlistResized), this);
+
+ evas_object_smart_data_set(m_Genlist, this);
+ evas_object_smart_callback_add(m_Genlist, "selected",
+ (Evas_Smart_Cb) &ListPopup::onSelected, this);
+ return m_Genlist;
+}
+
+char *ListPopup::getText(ItemData *itemData, Evas_Object *genlist, const char *part)
+{
+ ListPopup *popup = (ListPopup *) evas_object_smart_data_get(genlist);
+ char *text = popup->getItemText(itemData->userData, part);
+ if (!text && strcmp(part, "elm.text") == 0) {
+ text = strdup(_(itemData->text.c_str()));
+ }
+
+ return text;
+}
+
+Evas_Object *ListPopup::getContent(ItemData *itemData, Evas_Object *genlist, const char *part)
+{
+ ListPopup *popup = (ListPopup *) evas_object_smart_data_get(genlist);
+ return popup->getItemContent(itemData->userData, part);
+}
+
+void ListPopup::onSelected(ListPopup *popup, Evas_Object *genlist, Elm_Object_Item *item)
+{
+ ItemData *itemData = (ItemData *) elm_object_item_data_get(item);
+ popup->onItemSelected(itemData->userData);
+
+ if (itemData->callback) {
+ itemData->callback();
+ }
+
+ if (popup->m_OnSelected) {
+ popup->m_OnSelected(itemData->userData);
+ }
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ popup->close();
+}
+
+void ListPopup::updateGenlistHeight()
+{
+ if (m_GenlistSize.h > m_MaxHeight) {
+ int itemHeight = 0;
+ int count = elm_genlist_items_count(m_Genlist);
+ if (count > 0) {
+ itemHeight = m_GenlistSize.h / count;
+ }
+
+ if (itemHeight) {
+ m_IsResizing = true;
+ int genlistHeight = m_MaxHeight - m_MaxHeight % itemHeight;
+ evas_object_size_hint_min_set(m_Genlist, m_GenlistSize.w, genlistHeight);
+ m_IsResizing = false;
+ }
+ }
+}
+
+void ListPopup::updateMaxHeight()
+{
+ evas_object_geometry_get(m_Window, nullptr, nullptr, nullptr, &m_MaxHeight);
+ m_MaxHeight *= POPUP_HEIGHT_RATIO;
+}
+
+void ListPopup::onGenlistResized(Evas *e, Evas_Object *genlist, void *eventInfo)
+{
+ if (!m_IsResizing) {
+ evas_object_size_hint_min_get(m_Genlist, &m_GenlistSize.w, &m_GenlistSize.h);
+ updateGenlistHeight();
+ }
+}
+
+void ListPopup::onWindowResized(Evas *e, Evas_Object *window, void *eventInfo)
+{
+ updateMaxHeight();
+ updateGenlistHeight();
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Menu.h"
+#include "Ui/View.h"
+#include "Ui/Window.h"
+#include "Utils/Callback.h"
+
+#include <efl_extension.h>
+
+using namespace Ui;
+
+Menu::Menu()
+ : m_View(nullptr), m_Window(nullptr)
+{
+}
+
+Menu::~Menu()
+{
+ if (m_View) {
+ evas_object_smart_callback_del_full(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Menu::onViewNavigation), this);
+ }
+ if (m_Window) {
+ evas_object_event_callback_del_full(m_Window->getEvasObject(), EVAS_CALLBACK_RESIZE,
+ makeCallback(&Menu::onWindowResized), this);
+ }
+}
+
+Elm_Object_Item *Menu::addItem(const char *text, ItemCallback callback)
+{
+ Elm_Object_Item *item = elm_ctxpopup_item_append(getEvasObject(), text, nullptr,
+ &Menu::onItemSelect, new ItemCallback(std::move(callback)));
+ elm_object_item_text_translatable_set(item, EINA_TRUE);
+ elm_object_item_del_cb_set(item, &Menu::onItemDestroy);
+ return item;
+}
+
+void Menu::show()
+{
+ Evas_Coord y = 0, w = 0, h = 0;
+ Evas_Object *parent = elm_ctxpopup_hover_parent_get(getEvasObject());
+ evas_object_geometry_get(parent, nullptr, &y, &w, &h);
+
+ Evas_Object *menu = getEvasObject();
+ int menuWidth = 0;
+ evas_object_geometry_get(menu, nullptr, nullptr, &menuWidth, nullptr);
+ evas_object_move(menu, w / 2 - menuWidth / 2, y + h);
+ evas_object_show(menu);
+}
+
+Evas_Object *Menu::onCreate(Evas_Object *parent)
+{
+ Evas_Object *menu = elm_ctxpopup_add(parent);
+ elm_object_style_set(menu, "more/default");
+
+ evas_object_smart_callback_add(menu, "dismissed",
+ makeCallback(&Menu::onDismissed), this);
+ eext_object_event_callback_add(menu, EEXT_CALLBACK_BACK,
+ eext_ctxpopup_back_cb, nullptr);
+ eext_object_event_callback_add(menu, EEXT_CALLBACK_MORE,
+ eext_ctxpopup_back_cb, nullptr);
+
+ m_View = findParent<View>(parent);
+ if (m_View) {
+ evas_object_smart_callback_add(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Menu::onViewNavigation), this);
+ }
+
+ m_Window = findParent<Window>(parent);
+ if (m_Window) {
+ elm_ctxpopup_hover_parent_set(menu, m_Window->getEvasObject());
+ evas_object_event_callback_add(m_Window->getEvasObject(), EVAS_CALLBACK_RESIZE,
+ makeCallback(&Menu::onWindowResized), this);
+ }
+
+ return menu;
+}
+
+void Menu::onViewNavigation(Evas_Object *obj, void *eventInfo)
+{
+ if (!eventInfo) {
+ elm_ctxpopup_dismiss(getEvasObject());
+ }
+}
+
+void Menu::onWindowResized(Evas *e, Evas_Object *obj, void *eventInfo)
+{
+ show();
+}
+
+void Menu::onItemSelect(void *data, Evas_Object *obj, void *item)
+{
+ ItemCallback &callback = *(ItemCallback *) data;
+ if (callback) {
+ callback();
+ }
+
+ elm_ctxpopup_dismiss(obj);
+}
+
+void Menu::onItemDestroy(void *data, Evas_Object *obj, void *item)
+{
+ delete (ItemCallback *) data;
+}
+
+void Menu::onDismissed(Evas_Object *obj, void *eventInfo)
+{
+ delete this;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Naviframe.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+namespace Ui
+{
+ template <>
+ Navigator *Control::findParent<Navigator>(Evas_Object *object)
+ {
+ return findParent<Naviframe>(object);
+ }
+}
+
+Naviframe::Naviframe()
+ : m_Job(nullptr),
+ m_IsFirstPagePrevButtonVisible(false)
+{
+}
+
+void Naviframe::setFirstPagePrevButton(bool isVisible)
+{
+ if (m_IsFirstPagePrevButtonVisible == isVisible) {
+ return;
+ }
+ m_IsFirstPagePrevButtonVisible = isVisible;
+
+ if (auto page = getFirstPage()) {
+ page->setPrevButtonVisibility(m_IsFirstPagePrevButtonVisible);
+ }
+}
+
+Evas_Object *Naviframe::onCreate(Evas_Object *parent)
+{
+ Evas_Object *naviframe = elm_naviframe_add(parent);
+ evas_object_smart_callback_add(naviframe, "transition,finished",
+ makeCallback(&Naviframe::onTransition), this);
+
+ return naviframe;
+}
+
+bool Naviframe::onBackPressed()
+{
+ if (!Navigator::onBackPressed()) {
+ return false;
+ }
+
+ auto page = getCurrentPage();
+ if (page && removeView(page->getView())) {
+ return false;
+ }
+
+ return true;
+}
+
+NaviframePage *Naviframe::addPage(View *view)
+{
+ Elm_Object_Item *naviItem = elm_naviframe_item_push(getEvasObject(), nullptr,
+ nullptr, nullptr, view->create(getEvasObject()), nullptr);
+ elm_naviframe_item_pop_cb_set(naviItem, makeCallback(&Naviframe::onItemPop), this);
+
+ NaviframePage *page = new NaviframePage(naviItem);
+
+ setCurrentPage(nullptr);
+ if (naviItem == elm_naviframe_bottom_item_get(getEvasObject())) {
+ page->setPrevButtonVisibility(m_IsFirstPagePrevButtonVisible);
+ m_Job = ecore_job_add(makeCallback(&Naviframe::onFirstPagePushed), this);
+ } else if (m_Job) {
+ ecore_job_del(m_Job);
+ m_Job = nullptr;
+ }
+
+ return page;
+}
+
+bool Naviframe::removePage(NavigatorPage *page)
+{
+ /* Postpone removal if transition in progress */
+ if (getCurrentPage() == nullptr) {
+ m_PagesToRemove.push_back(page);
+ return true;
+ }
+
+ Elm_Object_Item *naviItem = static_cast<NaviframePage *>(page)->m_NaviItem;
+ if (naviItem == elm_naviframe_top_item_get(getEvasObject())) {
+ if (naviItem == elm_naviframe_bottom_item_get(getEvasObject())) {
+ return false;
+ }
+ elm_naviframe_item_pop(getEvasObject());
+ } else {
+ elm_object_item_del(naviItem);
+ }
+
+ if (!m_IsFirstPagePrevButtonVisible) {
+ getFirstPage()->setPrevButtonVisibility(false);
+ }
+
+ return true;
+}
+
+void Naviframe::navigateToPage(NavigatorPage *page)
+{
+ Elm_Object_Item *naviItem = static_cast<NaviframePage *>(page)->m_NaviItem;
+ elm_naviframe_item_pop_to(naviItem);
+}
+
+NaviframePage *Naviframe::getFirstPage() const
+{
+ Elm_Object_Item *item = elm_naviframe_bottom_item_get(getEvasObject());
+ return (NaviframePage *) elm_object_item_data_get(item);
+}
+
+NaviframePage *Naviframe::getLastPage() const
+{
+ Elm_Object_Item *item = elm_naviframe_top_item_get(getEvasObject());
+ return (NaviframePage *) elm_object_item_data_get(item);
+}
+
+Eina_Bool Naviframe::onItemPop(Elm_Object_Item *item)
+{
+ setCurrentPage(nullptr);
+ return EINA_TRUE;
+}
+
+void Naviframe::onTransition(Evas_Object *obj, void *eventInfo)
+{
+ updateCurrentPage();
+ for (auto &&page : m_PagesToRemove) {
+ removeView(page->getView());
+ }
+ m_PagesToRemove.clear();
+}
+
+void Naviframe::onFirstPagePushed()
+{
+ updateCurrentPage();
+ m_Job = nullptr;
+}
+
+void Naviframe::updateCurrentPage()
+{
+ setCurrentPage(getLastPage());
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/NaviframePage.h"
+
+#include "Ui/Navigator.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+NaviframePage::NaviframePage(Elm_Object_Item *naviItem)
+ : m_NaviItem(naviItem)
+{
+ elm_object_item_data_set(m_NaviItem, this);
+ elm_object_item_del_cb_set(m_NaviItem, makeCallback(&NaviframePage::onDestroy));
+
+ Evas_Object *button = elm_button_add(elm_object_item_widget_get(naviItem));
+ elm_object_style_set(button, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(button, "clicked",
+ makeCallback(&NaviframePage::onPrevPressed), this);
+ elm_object_item_part_content_set(naviItem, "elm.swallow.prev_btn", button);
+}
+
+void NaviframePage::setTitle(const char *title)
+{
+ elm_object_item_translatable_part_text_set(m_NaviItem, "elm.text.title", title);
+}
+
+void NaviframePage::setSubtitle(const char *subtitle)
+{
+ elm_object_item_translatable_part_text_set(m_NaviItem, "elm.text.subtitle", subtitle);
+}
+
+void NaviframePage::setTitleVisibility(bool isVisible)
+{
+ elm_naviframe_item_title_enabled_set(m_NaviItem, isVisible, EINA_TRUE);
+}
+
+void NaviframePage::setStyle(const char *style)
+{
+ elm_naviframe_item_style_set(m_NaviItem, style);
+}
+
+void NaviframePage::setContent(const char *part, Evas_Object *content)
+{
+ elm_object_item_part_content_set(m_NaviItem, part, content);
+}
+
+void NaviframePage::setPrevButtonVisibility(bool isVisible)
+{
+ elm_object_item_signal_emit(m_NaviItem,
+ isVisible ? "elm,state,prev_btn,show" : "elm,state,prev_btn,hide", "elm");
+}
+
+void NaviframePage::onDestroy(Evas_Object *obj, void *eventInfo)
+{
+ delete this;
+}
+
+void NaviframePage::onPrevPressed(Evas_Object *obj, void *eventInfo)
+{
+ close();
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Navigator.h"
+#include "Ui/NavigatorPage.h"
+
+using namespace Ui;
+
+Navigator::Navigator()
+ : m_CurrentPage(nullptr)
+{
+}
+
+NavigatorPage *Navigator::getCurrentPage() const
+{
+ return m_CurrentPage;
+}
+
+void Navigator::addView(View *view)
+{
+ if (!view) {
+ return;
+ }
+
+ NavigatorPage *page = addPage(view);
+ page->onNavigatorAttached(this, view);
+ view->onNavigatorAttached(page);
+
+ if (!m_CurrentPage) {
+ navigateTo(view);
+ }
+}
+
+bool Navigator::removeView(View *view)
+{
+ if (!view) {
+ return false;
+ }
+
+ if (removePage(view->getPage())) {
+ return true;
+ }
+
+ if (!m_OnLastPage || m_OnLastPage()) {
+ if (NavigatorPage *page = getPage()) {
+ page->close();
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Navigator::navigateTo(View *view)
+{
+ if (!view) {
+ return;
+ }
+
+ NavigatorPage *page = view->getPage();
+ if (!page) {
+ addView(view);
+ page = view->getPage();
+ }
+
+ if (page != m_CurrentPage) {
+ navigateToPage(page);
+ }
+}
+
+void Navigator::setLastPageCallback(LastPageCallback callback)
+{
+ m_OnLastPage = std::move(callback);
+}
+
+void Navigator::unsetLastPageCallback()
+{
+ m_OnLastPage = nullptr;
+}
+
+void Navigator::setCurrentPage(NavigatorPage *page)
+{
+ if (page == m_CurrentPage) {
+ return;
+ }
+
+ std::swap(m_CurrentPage, page);
+ if (isCurrent()) {
+ notifyNavigation(page, false);
+ notifyNavigation(m_CurrentPage, true);
+ }
+}
+
+void Navigator::onNavigation(bool isCurrent)
+{
+ notifyNavigation(m_CurrentPage, isCurrent);
+}
+
+void Navigator::onRotationChanged(int degree)
+{
+ if (m_CurrentPage) {
+ m_CurrentPage->getView()->onRotation(degree);
+ }
+}
+
+bool Navigator::onBackPressed()
+{
+ return m_CurrentPage ? m_CurrentPage->getView()->onBackPressed() : true;
+}
+
+void Navigator::onMenuPressed()
+{
+ if (m_CurrentPage) {
+ m_CurrentPage->getView()->onMenuPressed();
+ }
+}
+
+void Navigator::notifyNavigation(NavigatorPage *page, bool isCurrent)
+{
+ if (page) {
+ page->getView()->onNavigation(isCurrent, getRotation());
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/NavigatorPage.h"
+#include "Ui/Navigator.h"
+
+using namespace Ui;
+
+NavigatorPage::NavigatorPage()
+ : m_Navigator(nullptr), m_View(nullptr)
+{
+}
+
+Navigator *NavigatorPage::getNavigator() const
+{
+ return m_Navigator;
+}
+
+View *NavigatorPage::getView() const
+{
+ return m_View;
+}
+
+Evas_Object *NavigatorPage::addTitleButton(ButtonPosition position, const char *text,
+ Evas_Smart_Cb callback, void *data)
+{
+ static const struct {
+ const char *style;
+ const char *part;
+ } buttons[] = {
+ /* ButtonLeft = */ { "naviframe/title_left", "title_left_btn" },
+ /* ButtonRight = */ { "naviframe/title_right", "title_right_btn" }
+ };
+
+ Evas_Object *button = elm_button_add(getView()->getEvasObject());
+ elm_object_style_set(button, buttons[position].style);
+ elm_object_translatable_text_set(button, text);
+ evas_object_smart_callback_add(button, "clicked",
+ callback, data);
+ setContent(buttons[position].part, button);
+
+ return button;
+}
+
+void NavigatorPage::setExpanded(bool isExpanded)
+{
+ setTitleVisibility(isExpanded);
+ if (m_Navigator && m_Navigator->getPage()) {
+ m_Navigator->getPage()->setTitleVisibility(!isExpanded);
+ }
+}
+
+void NavigatorPage::close()
+{
+ m_Navigator->removeView(m_View);
+}
+
+void NavigatorPage::onNavigatorAttached(Navigator *navigator, View *view)
+{
+ m_Navigator = navigator;
+ m_View = view;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Popup.h"
+#include "Ui/View.h"
+#include "Ui/Window.h"
+#include "Utils/Callback.h"
+#include "Utils/Range.h"
+
+#include <efl_extension.h>
+
+#define BUTTON_DATA_KEY "callback"
+
+using namespace Ui;
+
+Popup::Popup()
+ : m_ButtonCount(0), m_View(nullptr), m_Window(nullptr)
+{
+}
+
+Popup::~Popup()
+{
+ if (m_View) {
+ evas_object_smart_callback_del_full(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Popup::onViewNavigation), this);
+ evas_object_event_callback_del_full(m_View->getEvasObject(), EVAS_CALLBACK_DEL,
+ makeCallback(&Popup::onViewDestroy), this);
+ }
+}
+
+Popup *Popup::create(Evas_Object *parent, const char *title,
+ const char *text, const char *buttonText)
+{
+ Popup *popup = new Popup();
+ popup->create(parent);
+ popup->setTitle(title);
+ popup->setText(text);
+ popup->addButton(buttonText);
+ return popup;
+}
+
+void Popup::setTitle(const char *title)
+{
+ elm_object_translatable_part_text_set(getEvasObject(), "title,text", title);
+}
+
+void Popup::setText(const char *text)
+{
+ elm_object_translatable_text_set(getEvasObject(), text);
+}
+
+void Popup::setContent(Evas_Object *content)
+{
+ elm_object_part_content_set(getEvasObject(), "elm.swallow.content", content);
+}
+
+void Popup::setCancelCallback(ButtonCallback callback)
+{
+ m_OnCanceled = std::move(callback);
+}
+
+Evas_Object *Popup::addButton(const char *text, ButtonCallback callback)
+{
+ static const char *parts[] = { "button1", "button2", "button3" };
+ const char *part = Utils::at(parts, m_ButtonCount);
+ if (!part) {
+ return nullptr;
+ }
+
+ Evas_Object *button = elm_button_add(getEvasObject());
+ elm_object_style_set(button, "bottom");
+ elm_object_translatable_text_set(button, text);
+ elm_object_part_content_set(getEvasObject(), part, button);
+
+ evas_object_data_set(button, BUTTON_DATA_KEY, new ButtonCallback(std::move(callback)));
+ evas_object_event_callback_add(button, EVAS_CALLBACK_DEL,
+ makeCallback(&Popup::onButtonDestroy), this);
+ evas_object_smart_callback_add(button, "clicked",
+ makeCallback(&Popup::onButtonPressed), this);
+
+ ++m_ButtonCount;
+ return button;
+}
+
+void Popup::show()
+{
+ evas_object_show(getEvasObject());
+}
+
+void Popup::close()
+{
+ elm_popup_dismiss(getEvasObject());
+}
+
+Evas_Object *Popup::onCreate(Evas_Object *parent)
+{
+ m_View = findParent<View>(parent);
+ if (m_View) {
+ evas_object_smart_callback_add(m_View->getEvasObject(), EVENT_VIEW_NAVIGATION,
+ makeCallback(&Popup::onViewNavigation), this);
+ evas_object_event_callback_add(m_View->getEvasObject(), EVAS_CALLBACK_DEL,
+ makeCallback(&Popup::onViewDestroy), this);
+ }
+
+ m_Window = findParent<Window>(parent);
+ if (m_Window) {
+ parent = m_Window->getBaseLayout();
+ }
+
+ Evas_Object *popup = elm_popup_add(parent);
+ elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
+ evas_object_smart_callback_add(popup, "dismissed",
+ makeCallback(&Popup::onDismissed), this);
+ evas_object_smart_callback_add(popup, "block,clicked",
+ makeCallback(&Popup::onBlockPressed), this);
+ eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
+ makeCallback(&Popup::onBackPressed), this);
+
+ return popup;
+}
+
+void Popup::onCanceled()
+{
+ if (!m_OnCanceled || m_OnCanceled()) {
+ close();
+ }
+}
+
+void Popup::onViewNavigation(Evas_Object *obj, void *eventInfo)
+{
+ if (!eventInfo) {
+ /* Don't close the popup if navigation is caused by window losing focus */
+ if (!m_Window || elm_win_focus_get(m_Window->getEvasObject())) {
+ onCanceled();
+ }
+ }
+}
+
+void Popup::onViewDestroy(Evas *e, Evas_Object *obj, void *eventInfo)
+{
+ m_View = nullptr;
+}
+
+void Popup::onButtonPressed(Evas_Object *obj, void *eventInfo)
+{
+ ButtonCallback *callback = (ButtonCallback *) evas_object_data_get(obj, BUTTON_DATA_KEY);
+ if (!(*callback)) {
+ callback = &m_OnCanceled;
+ }
+ if (!(*callback) || (*callback)()) {
+ close();
+ }
+}
+
+void Popup::onButtonDestroy(Evas *e, Evas_Object *obj, void *eventInfo)
+{
+ ButtonCallback *callback = (ButtonCallback *) evas_object_data_get(obj, BUTTON_DATA_KEY);
+ delete callback;
+}
+
+void Popup::onBlockPressed(Evas_Object *obj, void *eventInfo)
+{
+ if (m_ButtonCount == 0) {
+ onCanceled();
+ }
+}
+
+void Popup::onBackPressed(Evas_Object *obj, void *eventInfo)
+{
+ onCanceled();
+}
+
+void Popup::onDismissed(Evas_Object *obj, void *eventInfo)
+{
+ delete this;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/ProcessPopup.h"
+#include "Ui/Window.h"
+
+#include "App/Path.h"
+#include "Utils/Callback.h"
+#include "AppsCommonPopup.h"
+
+using namespace Ui;
+
+ProcessPopup::ProcessPopup(Size size, double showDelayTime, double showMinTime)
+ : m_Size(size), m_Layout(nullptr),
+ m_ShowDelayTimer(nullptr), m_ShowMinTimer(nullptr),
+ m_IsDestroyPending(false)
+{
+ m_ShowDelayTimer = ecore_timer_add(showDelayTime,
+ makeCallback(&ProcessPopup::onShowDelayElapsed), this);
+ ecore_timer_freeze(m_ShowDelayTimer);
+ m_ShowMinTimer = ecore_timer_add(showMinTime,
+ makeCallback(&ProcessPopup::onShowMinElapsed), this);
+ ecore_timer_freeze(m_ShowMinTimer);
+
+ setCancelCallback([this] {
+ return false;
+ });
+}
+
+ProcessPopup::~ProcessPopup()
+{
+ ecore_timer_del(m_ShowDelayTimer);
+ ecore_timer_del(m_ShowMinTimer);
+}
+
+ProcessPopup *ProcessPopup::create(Evas_Object *parent, const char *text, Size size)
+{
+ ProcessPopup *popup = new ProcessPopup(size);
+ popup->create(parent);
+ popup->setText(text);
+ return popup;
+}
+
+void ProcessPopup::setText(const char *text)
+{
+ elm_object_translatable_part_text_set(m_Layout, "elm.text", text);
+}
+
+void ProcessPopup::close()
+{
+ if (m_ShowDelayTimer) {
+ delete this;
+ } else if (m_ShowMinTimer) {
+ m_IsDestroyPending = true;
+ } else {
+ Popup::close();
+ }
+}
+
+Evas_Object *ProcessPopup::onCreate(Evas_Object *parent)
+{
+ static struct {
+ const char *layout;
+ const char *progress;
+ } styles[] = {
+ /* SizeSmall = */ { LAYOUT_PROCESS_SMALL, "process_small" },
+ /* SizeMedium = */ { LAYOUT_PROCESS_MEDIUM, "process_medium" }
+ };
+
+ Evas_Object *popup = Popup::onCreate(parent);
+ auto &style = styles[m_Size];
+
+ m_Layout = elm_layout_add(popup);
+ elm_layout_file_set(m_Layout, App::getResourcePath(APPS_COMMON_POPUP_EDJ).c_str(), style.layout);
+ elm_object_content_set(popup, m_Layout);
+
+ Evas_Object *progressbar = elm_progressbar_add(m_Layout);
+ elm_object_style_set(progressbar, style.progress);
+ elm_progressbar_pulse_set(progressbar, EINA_TRUE);
+ elm_progressbar_pulse(progressbar, EINA_TRUE);
+ elm_object_content_set(m_Layout, progressbar);
+
+ ecore_timer_thaw(m_ShowDelayTimer);
+ return popup;
+}
+
+Eina_Bool ProcessPopup::onShowDelayElapsed()
+{
+ evas_object_show(getEvasObject());
+ ecore_timer_thaw(m_ShowMinTimer);
+
+ m_ShowDelayTimer = nullptr;
+ return EINA_FALSE;
+}
+
+Eina_Bool ProcessPopup::onShowMinElapsed()
+{
+ m_ShowMinTimer = nullptr;
+ if (m_IsDestroyPending) {
+ Popup::close();
+ }
+ return EINA_FALSE;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "Ui/ProgressController.h"
+#include "Ui/ProgressPopup.h"
+#include "Utils/Logger.h"
+
+#define PROGRESS_VALUE_LIMIT 10
+
+using namespace Ui;
+
+ProgressController::ProgressController(Evas_Object *parent, const char *title, int maxValue)
+ : m_IsPopupUpdating(false),
+ m_MainThread(nullptr), m_Thread(nullptr),
+ m_ProgressPopup(nullptr), m_CancelButton(nullptr)
+{
+ createProgressPopup(parent, title, maxValue);
+}
+
+ProgressController::~ProgressController()
+{
+ m_ProgressPopup->close();
+}
+
+void ProgressController::run()
+{
+ m_MainThread = ecore_thread_feedback_run(onStart, onNotify, onFinish, onCanceled, this, EINA_FALSE);
+
+ if (m_ProgressPopup->getMaxValue() > PROGRESS_VALUE_LIMIT) {
+ m_ProgressPopup->show();
+ }
+}
+
+void ProgressController::setFinishCallback(FinishCallback callback)
+{
+ m_OnFinish = std::move(callback);
+}
+
+void ProgressController::setCancelCallback(CancelCallback callback)
+{
+ m_OnCancel = std::move(callback);
+}
+
+bool ProgressController::onCancel()
+{
+ return true;
+}
+
+void ProgressController::cancel()
+{
+ ecore_thread_cancel(m_MainThread);
+ elm_object_disabled_set(m_CancelButton, EINA_TRUE);
+}
+
+bool ProgressController::onProgress(size_t value)
+{
+ ecore_thread_feedback(m_Thread, (void *)value);
+ m_IsPopupUpdating = true;
+
+ std::mutex condVariableMutex;
+ std::unique_lock<std::mutex> locker(condVariableMutex);
+ m_ContinueCondition.wait(locker, [this]{
+ return !m_IsPopupUpdating;
+ });
+
+ return !ecore_thread_check(m_Thread);
+}
+
+void ProgressController::setTotalCount(size_t value)
+{
+ m_ProgressPopup->setMaxValue(value);
+}
+
+void ProgressController::createProgressPopup(Evas_Object *parent, const char *title, int maxValue)
+{
+ m_ProgressPopup = new Ui::ProgressPopup(maxValue);
+ RETM_IF(!m_ProgressPopup, "m_ProgressPopup is NULL");
+
+ m_ProgressPopup->create(parent);
+ m_ProgressPopup->setTitle(title);
+
+ m_CancelButton = m_ProgressPopup->addButton("IDS_PB_BUTTON_CANCEL");
+ m_ProgressPopup->setCancelCallback([this] {
+ if (!ecore_thread_check(m_MainThread)) {
+ if (onCancel()) {
+ cancel();
+ }
+ }
+ return false;
+ });
+}
+
+void ProgressController::onStart(void *data, Ecore_Thread *thread)
+{
+ RETM_IF(!data, "invalid data");
+
+ ProgressController *controller = (ProgressController *)data;
+ controller->m_Thread = thread;
+ controller->onStart();
+}
+
+void ProgressController::onNotify(void *data, Ecore_Thread *thread, void *msgData)
+{
+ RETM_IF(!data || !msgData, "invalid data");
+ ProgressController *controller = (ProgressController *)data;
+
+ if (!ecore_thread_check(thread)) {
+ controller->m_ProgressPopup->setProgress((size_t)msgData);
+ }
+
+ controller->m_IsPopupUpdating = false;
+ controller->m_ContinueCondition.notify_one();
+}
+
+void ProgressController::onFinish(void *data, Ecore_Thread *thread)
+{
+ RETM_IF(!data, "invalid data");
+ ProgressController *controller = (ProgressController *)data;
+ if (controller->m_OnFinish) {
+ controller->m_OnFinish();
+ }
+
+ delete controller;
+}
+
+void ProgressController::onCanceled(void *data, Ecore_Thread *thread)
+{
+ RETM_IF(!data, "invalid data");
+ ProgressController *controller = (ProgressController *)data;
+ controller->onCanceled();
+
+ if (controller->m_OnCancel) {
+ controller->m_OnCancel();
+ }
+
+ delete controller;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "App/Path.h"
+#include "Ui/ProgressPopup.h"
+#include "Utils/Logger.h"
+
+#include "AppsCommonPopup.h"
+
+#define BUFFER_SIZE 64
+
+#define ZERO_PROGRESS "0%"
+
+using namespace Ui;
+
+namespace
+{
+ const std::string layoutFilePath = App::getResourcePath(APPS_COMMON_POPUP_EDJ);
+}
+
+ProgressPopup::ProgressPopup(size_t maxValue)
+ : m_CurrentValue(0), m_MaxValue(maxValue), m_Progressbar(nullptr)
+{
+}
+
+void ProgressPopup::setProgress(size_t value)
+{
+ RETM_IF(value > m_MaxValue, "value is bigger than max value");
+ m_CurrentValue = value;
+ double progressValue = (double)value / m_MaxValue;
+
+ char progress[BUFFER_SIZE] = { 0, };
+ snprintf(progress, sizeof(progress), "%d%%", (int)(100.0 * progressValue));
+
+ elm_progressbar_value_set(m_Progressbar, progressValue);
+ elm_object_part_text_set(m_Progressbar, "elm.text.bottom.left", progress);
+
+ updateTotalText();
+}
+
+void ProgressPopup::setMaxValue(size_t maxValue)
+{
+ m_MaxValue = maxValue;
+ updateTotalText();
+}
+
+size_t ProgressPopup::getMaxValue() const
+{
+ return m_MaxValue;
+}
+
+Evas_Object *ProgressPopup::onCreate(Evas_Object *parent)
+{
+ Evas_Object *popup = Popup::onCreate(parent);
+
+ Evas_Object *layout = elm_layout_add(popup);
+ elm_layout_file_set(layout, layoutFilePath.c_str(), LAYOUT_PROGRESS);
+
+ m_Progressbar = elm_progressbar_add(layout);
+ elm_progressbar_pulse(m_Progressbar, EINA_TRUE);
+
+ elm_object_part_text_set(m_Progressbar, "elm.text.bottom.left", ZERO_PROGRESS);
+ updateTotalText();
+
+ elm_object_content_set(layout, m_Progressbar);
+ elm_object_content_set(popup, layout);
+
+ return popup;
+}
+
+void ProgressPopup::updateTotalText()
+{
+ char total[BUFFER_SIZE] = { 0, };
+ snprintf(total, sizeof(total), "%zu/%zu", m_CurrentValue, m_MaxValue);
+ elm_object_part_text_set(m_Progressbar, "elm.text.bottom.right", total);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/RadioPopup.h"
+
+using namespace Ui;
+
+RadioPopup::RadioPopup()
+ : m_RadioGroup(nullptr)
+{
+}
+
+void RadioPopup::setSelectedItem(int value)
+{
+ elm_radio_value_set(m_RadioGroup, value);
+}
+
+Evas_Object *RadioPopup::onCreate(Evas_Object *parent)
+{
+ Evas_Object *popup = ListPopup::onCreate(parent);
+
+ m_RadioGroup = elm_radio_add(popup);
+ elm_radio_state_value_set(m_RadioGroup, -1);
+
+ return popup;
+}
+
+Evas_Object *RadioPopup::getItemContent(void *data, const char *part)
+{
+ if (strcmp(part, "elm.swallow.end") == 0) {
+ Evas_Object *radio = elm_radio_add(getEvasObject());
+ elm_radio_group_add(radio, m_RadioGroup);
+ elm_radio_state_value_set(radio, (long) data);
+ elm_object_signal_emit(radio, "elm,event,pass,enabled", "elm");
+ return radio;
+ }
+
+ return nullptr;
+}
+
+void RadioPopup::onItemSelected(void *data)
+{
+ setSelectedItem((long) data);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Scale.h"
+
+#include <Elementary.h>
+
+int Ui::getScaledValue(int value)
+{
+ static double factor = elm_config_scale_get() / elm_app_base_scale_get();
+ return round(value * factor);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/ScrollNavigator.h"
+#include "Ui/ScrollPage.h"
+#include "Ui/Selector.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+ScrollNavigator::ScrollNavigator(Selector *selector)
+ : TabNavigator(selector),
+ m_Scroller(nullptr), m_Box(nullptr),
+ m_Width(0), m_Height(0),
+ m_IsNavigationEnabled(true)
+{
+}
+
+void ScrollNavigator::setNavigationEnabled(bool isEnabled)
+{
+ m_IsNavigationEnabled = isEnabled;
+ getSelector()->setSelectEnabled(isEnabled);
+ elm_scroller_movement_block_set(getEvasObject(),
+ isEnabled ? ELM_SCROLLER_MOVEMENT_NO_BLOCK : ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL);
+}
+
+Evas_Object *ScrollNavigator::onCreate(Evas_Object *parent)
+{
+ m_Scroller = elm_scroller_add(parent);
+ elm_scroller_page_relative_set(m_Scroller, 1.0, 0.0);
+ elm_scroller_page_scroll_limit_set(m_Scroller, 1, 0);
+ elm_scroller_loop_set(m_Scroller, EINA_FALSE, EINA_FALSE);
+ elm_scroller_policy_set(m_Scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+ elm_object_scroll_lock_y_set(m_Scroller, EINA_TRUE);
+
+ evas_object_event_callback_add(m_Scroller, EVAS_CALLBACK_RESIZE,
+ makeCallback(&ScrollNavigator::onResize), this);
+ evas_object_smart_callback_add(m_Scroller, "scroll,page,changed",
+ makeCallback(&ScrollNavigator::onPageChanged), this);
+
+ m_Box = elm_box_add(m_Scroller);
+ elm_box_horizontal_set(m_Box, EINA_TRUE);
+ elm_object_content_set(m_Scroller, m_Box);
+
+ return m_Scroller;
+}
+
+ScrollPage *ScrollNavigator::addPage(View *view)
+{
+ auto page = static_cast<ScrollPage *>(TabNavigator::addPage(view));
+ evas_object_size_hint_min_set(page->m_Sizer, m_Width, m_Height);
+ elm_box_pack_end(m_Box, page->getEvasObject());
+ evas_object_show(page->getEvasObject());
+ return page;
+}
+
+ScrollPage *ScrollNavigator::createPage(View *view, Elm_Object_Item *item)
+{
+ return new ScrollPage(item);
+}
+
+void ScrollNavigator::changePage(TabPage *page)
+{
+ size_t pageIndex = getPageIndex(page);
+ size_t currentIndex = 0;
+ elm_scroller_current_page_get(m_Scroller, (int *) ¤tIndex, nullptr);
+
+ if (currentIndex != pageIndex) {
+ elm_scroller_page_show(m_Scroller, pageIndex, 0);
+ }
+}
+
+size_t ScrollNavigator::getPageIndex(TabPage *page) const
+{
+ Eina_List *list = elm_box_children_get(m_Box);
+ size_t index = eina_list_data_idx(list, page->getEvasObject());
+ eina_list_free(list);
+ return index;
+}
+
+TabPage *ScrollNavigator::getPageByIndex(size_t index) const
+{
+ Eina_List *list = elm_box_children_get(m_Box);
+
+ Evas_Object *obj = (Evas_Object *) eina_list_nth(list, index);
+ eina_list_free(list);
+ return static_cast<TabPage *>(Control::getControl(obj));
+}
+
+void ScrollNavigator::onPageChanged(Evas_Object *obj, void *eventInfo)
+{
+ /* Page count might be invalid until scroller is properly resized,
+ so we cannot reliably use page index at that point */
+ size_t count = 0;
+ elm_scroller_last_page_get(m_Scroller, (int *) &count, nullptr);
+ if (count + 1 != getPages().size()) {
+ return;
+ }
+
+ size_t index = 0;
+ elm_scroller_current_page_get(m_Scroller, (int *) &index, nullptr);
+ if (auto page = getPageByIndex(index)) {
+ navigateTo(page->getView());
+ }
+}
+
+void ScrollNavigator::onResize(Evas *e, Evas_Object *obj, void *eventInfo)
+{
+ evas_object_geometry_get(obj, nullptr, nullptr, &m_Width, &m_Height);
+ for (auto &&page : getPages()) {
+ auto scrollPage = static_cast<ScrollPage *>(page);
+ evas_object_size_hint_min_set(scrollPage->m_Sizer, m_Width, m_Height);
+ }
+
+ if (auto page = static_cast<ScrollPage *>(getCurrentPage())) {
+ elm_scroller_page_show(m_Scroller, getPageIndex(page), 0);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/ScrollPage.h"
+#include "Ui/ScrollNavigator.h"
+
+using namespace Ui;
+
+ScrollPage::ScrollPage(Elm_Object_Item *tabItem)
+ : TabPage(tabItem), m_Sizer(nullptr)
+{
+}
+
+Evas_Object *ScrollPage::onCreate(Evas_Object *parent)
+{
+ m_Sizer = evas_object_rectangle_add(evas_object_evas_get(parent));
+ evas_object_color_set(m_Sizer, 0, 0, 0, 0);
+
+ Evas_Object *layout = elm_layout_add(parent);
+ elm_layout_theme_set(layout, "layout", "application", "default");
+ elm_object_part_content_set(layout, "elm.swallow.bg", m_Sizer);
+ elm_object_part_content_set(layout, "elm.swallow.content", TabPage::onCreate(layout));
+
+ return layout;
+}
+
+void ScrollPage::setExpanded(bool isExpanded)
+{
+ auto navigator = static_cast<ScrollNavigator *>(getNavigator());
+ navigator->setNavigationEnabled(!isExpanded);
+ NavigatorPage::setExpanded(isExpanded);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Selector.h"
+
+using namespace Ui;
+
+void Selector::setSelectEnabled(bool isEnabled)
+{
+ elm_object_disabled_set(getEvasObject(), !isEnabled);
+}
+
+void Selector::setSelectCallback(SelectCallback callback)
+{
+ m_OnSelected = std::move(callback);
+}
+
+bool Selector::onSelected(Elm_Object_Item *item)
+{
+ void *data = elm_object_item_data_get(item);
+ return !m_OnSelected || m_OnSelected(data);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/TabNavigator.h"
+#include "Ui/TabPage.h"
+#include "Ui/Tabbar.h"
+#include "Utils/Logger.h"
+
+#include <algorithm>
+
+using namespace Ui;
+using namespace std::placeholders;
+
+TabNavigator::TabNavigator(Selector *selector)
+ : m_Selector(selector)
+{
+ if (m_Selector) {
+ m_Selector->setSelectCallback(std::bind(&TabNavigator::onSelected, this, _1));
+ }
+}
+
+Evas_Object *TabNavigator::onCreate(Evas_Object *parent)
+{
+ Evas_Object *layout = elm_layout_add(parent);
+ elm_layout_theme_set(layout, "layout", "application", "default");
+ return layout;
+}
+
+void TabNavigator::onPageAttached(NavigatorPage *page)
+{
+ page->setStyle("tabbar/notitle");
+ if (m_Selector) {
+ page->setContent("tabbar", m_Selector->create(getEvasObject()));
+ }
+}
+
+Selector *TabNavigator::getSelector() const
+{
+ return m_Selector;
+}
+
+const TabNavigator::Pages &TabNavigator::getPages() const
+{
+ return m_Pages;
+}
+
+TabPage *TabNavigator::addPage(View *view)
+{
+ TabPage *page = createPage(view, m_Selector ? m_Selector->addItem(nullptr) : nullptr);
+ m_Pages.push_back(page);
+
+ Evas_Object *layout = page->create(getEvasObject());
+ page->setContent("elm.swallow.content", view->create(layout));
+
+ return page;
+}
+
+bool TabNavigator::removePage(NavigatorPage *page)
+{
+ if (m_Pages.size() == 1) {
+ return false;
+ }
+
+ auto it = std::find(m_Pages.begin(), m_Pages.end(), page);
+ if (page == getCurrentPage()) {
+ if (page != m_Pages.back()) {
+ navigateTo((*++it)->getView());
+ } else if (page != m_Pages.front()) {
+ navigateTo((*--it)->getView());
+ }
+ }
+
+ m_Pages.erase(it);
+ delete page;
+ return true;
+}
+
+void TabNavigator::navigateToPage(NavigatorPage *page)
+{
+ TabPage *tabPage = static_cast<TabPage *>(page);
+ setCurrentPage(tabPage);
+ changePage(tabPage);
+
+ if (m_Selector) {
+ m_Selector->setSelectedItem(tabPage->getTabItem());
+ }
+}
+
+TabPage *TabNavigator::createPage(View *view, Elm_Object_Item *item)
+{
+ return new TabPage(item);
+}
+
+void TabNavigator::changePage(TabPage *page)
+{
+ evas_object_hide(elm_object_content_unset(getEvasObject()));
+ elm_object_content_set(getEvasObject(), page->getEvasObject());
+}
+
+bool TabNavigator::onSelected(void *data)
+{
+ TabPage *page = (TabPage *) data;
+ if (page) {
+ navigateTo(page->getView());
+ }
+
+ return true;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/TabPage.h"
+#include "Utils/Callback.h"
+
+#define BUFFER_SIZE 64
+
+using namespace Ui;
+
+TabPage::TabPage(Elm_Object_Item *tabItem)
+ : m_TabItem(tabItem), m_Page(nullptr), m_HasTabTitle(false)
+{
+ elm_object_item_data_set(tabItem, this);
+ elm_object_item_del_cb_set(tabItem, makeCallback(&TabPage::onTabItemDestroy));
+}
+
+TabPage::~TabPage()
+{
+ elm_object_item_del(m_TabItem);
+}
+
+void TabPage::setTabTitle(const char *title)
+{
+ elm_object_item_translatable_text_set(m_TabItem, title);
+ m_HasTabTitle = true;
+}
+
+void TabPage::unsetTabTitle()
+{
+ const char *title = elm_object_translatable_part_text_get(m_Page, "elm.text.title");
+ elm_object_item_translatable_text_set(m_TabItem, title);
+ m_HasTabTitle = false;
+}
+
+void TabPage::setTitle(const char *title)
+{
+ if (!m_HasTabTitle) {
+ elm_object_item_translatable_text_set(m_TabItem, title);
+ }
+ elm_object_translatable_part_text_set(m_Page, "elm.text.title", title);
+}
+
+void TabPage::setSubtitle(const char *subtitle)
+{
+ elm_object_translatable_part_text_set(m_Page, "elm.text.subtitle", subtitle);
+}
+
+void TabPage::setTitleVisibility(bool isVisible)
+{
+ elm_layout_signal_emit(m_Page, isVisible ? "elm,state,title,show" : "elm,state,title,hide", "elm");
+}
+
+void TabPage::setStyle(const char *style)
+{
+ char buffer[BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer), "%s/default", style);
+ elm_layout_theme_set(m_Page, "naviframe", "item", buffer);
+}
+
+void TabPage::setContent(const char *part, Evas_Object *content)
+{
+ char buffer[BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer), "elm,state,%s,%s", part, content ? "show" : "hide");
+ elm_layout_signal_emit(m_Page, buffer, "elm");
+ elm_object_part_content_set(m_Page, part, content);
+}
+
+Elm_Object_Item *TabPage::getTabItem() const
+{
+ return m_TabItem;
+}
+
+Evas_Object *TabPage::onCreate(Evas_Object *parent)
+{
+ m_Page = elm_layout_add(parent);
+ elm_layout_theme_set(m_Page, "naviframe", "item", "basic/default");
+ elm_layout_signal_emit(m_Page, "elm,state,title,hide", "elm");
+ elm_layout_signal_emit(m_Page, "elm,state,toolbar,hide", "elm");
+
+ return m_Page;
+}
+
+void TabPage::onTabItemDestroy(Evas_Object *obj, void *eventInfo)
+{
+ m_TabItem = nullptr;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Tabbar.h"
+#include "Utils/Callback.h"
+
+using namespace Ui;
+
+Elm_Object_Item *Tabbar::addItem(void *data)
+{
+ return elm_toolbar_item_append(getEvasObject(), nullptr, nullptr, nullptr, data);
+}
+
+void Tabbar::setSelectEnabled(bool isEnabled)
+{
+ elm_toolbar_select_mode_set(getEvasObject(),
+ isEnabled ? ELM_OBJECT_SELECT_MODE_ALWAYS : ELM_OBJECT_SELECT_MODE_NONE);
+}
+
+void Tabbar::setSelectedItem(Elm_Object_Item *item)
+{
+ elm_toolbar_item_selected_set(item, EINA_TRUE);
+}
+
+Evas_Object *Tabbar::onCreate(Evas_Object *parent)
+{
+ Evas_Object *tabbar = elm_toolbar_add(parent);
+ elm_toolbar_shrink_mode_set(tabbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_toolbar_select_mode_set(tabbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ elm_toolbar_transverse_expanded_set(tabbar, EINA_TRUE);
+ evas_object_smart_callback_add(tabbar, "selected",
+ (Evas_Smart_Cb) makeCallback(&Tabbar::onSelected), this);
+ return tabbar;
+}
+
+void Tabbar::onSelected(Evas_Object *tabbar, Elm_Object_Item *item)
+{
+ Selector::onSelected(item);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Thumbnail.h"
+#include "Ui/Scale.h"
+
+#include "App/Path.h"
+#include "AppsCommonThumbnail.h"
+
+using namespace Ui;
+
+namespace
+{
+ const struct
+ {
+ int size;
+ const char *groupMask;
+ const char *groupDefault;
+ } params[] = {
+ { THUMBNAIL_SMALL_SIZE, LAYOUT_THUMBNAIL_SMALL, LAYOUT_THUMBNAIL_DEFAULT_SMALL },
+ { THUMBNAIL_MEDIUM_SIZE, LAYOUT_THUMBNAIL_MEDIUM, LAYOUT_THUMBNAIL_DEFAULT_MEDIUM },
+ { THUMBNAIL_LARGE_SIZE, LAYOUT_THUMBNAIL_LARGE, LAYOUT_THUMBNAIL_DEFAULT_LARGE }
+ };
+
+ const std::string layoutPath = App::getResourcePath(APPS_COMMON_THUMBNAIL_EDJ);
+}
+
+Thumbnail::Thumbnail(Size size)
+ : m_Size(size), m_Image(nullptr)
+{
+}
+
+Thumbnail *Thumbnail::create(Evas_Object *parent, Size size, const char *path)
+{
+ Thumbnail *thumbnail = new Thumbnail(size);
+ thumbnail->create(parent);
+ thumbnail->setImagePath(path);
+ return thumbnail;
+}
+
+Evas_Object *Thumbnail::getImage() const
+{
+ return m_Image;
+}
+
+void Thumbnail::setImagePath(const char *path)
+{
+ if (path && *path) {
+ elm_image_file_set(m_Image, path, nullptr);
+ } else {
+ elm_image_file_set(m_Image, layoutPath.c_str(), params[m_Size].groupDefault);
+ }
+}
+
+void Thumbnail::setSizeHint(bool isSet)
+{
+ int size = 0;
+ if (isSet) {
+ size = getScaledValue(params[m_Size].size);
+ }
+
+ evas_object_size_hint_min_set(m_Image, size, size);
+}
+
+Evas_Object *Thumbnail::onCreate(Evas_Object *parent)
+{
+ Evas_Object *layout = elm_layout_add(parent);
+ elm_layout_file_set(layout, layoutPath.c_str(), params[m_Size].groupMask);
+
+ m_Image = elm_image_add(layout);
+ elm_image_prescale_set(m_Image, getScaledValue(params[m_Size].size) * 2);
+ elm_image_aspect_fixed_set(m_Image, EINA_TRUE);
+ elm_image_fill_outside_set(m_Image, EINA_TRUE);
+ elm_object_part_content_set(layout, "elm.swallow.content", m_Image);
+
+ return layout;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/View.h"
+#include "Ui/Navigator.h"
+
+using namespace Ui;
+
+View::View()
+ : m_Page(nullptr),
+ m_IsCurrent(false), m_Rotation(-1)
+{
+}
+
+Navigator *View::getNavigator() const
+{
+ Evas_Object *parent = elm_object_parent_widget_get(getEvasObject());
+ return findParent<Navigator>(parent);
+}
+
+NavigatorPage *View::getPage() const
+{
+ return m_Page;
+}
+
+bool View::isCurrent() const
+{
+ return m_IsCurrent;
+}
+
+int View::getRotation() const
+{
+ return m_Rotation;
+}
+
+void View::onNavigatorAttached(NavigatorPage *page)
+{
+ m_Page = page;
+ onPageAttached(m_Page);
+}
+
+void View::onNavigation(bool isCurrent, int degree)
+{
+ m_IsCurrent = isCurrent;
+ if (m_IsCurrent) {
+ resetCreateTimer();
+ onRotation(degree);
+ }
+
+ onNavigation(m_IsCurrent);
+ evas_object_smart_callback_call(getEvasObject(), EVENT_VIEW_NAVIGATION, (void *) (long) m_IsCurrent);
+}
+
+void View::onRotation(int degree)
+{
+ if (m_Rotation != degree) {
+ m_Rotation = degree;
+ onRotationChanged(degree);
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ui/Window.h"
+#include "Ui/View.h"
+#include "Utils/Callback.h"
+#include "Utils/Range.h"
+
+#include <efl_extension.h>
+
+using namespace Ui;
+
+namespace Ui
+{
+ template <>
+ Window *Control::findParent<Window>(Evas_Object *object)
+ {
+ return getControl<Window>(elm_object_top_widget_get(object));
+ }
+}
+
+Window::Window()
+ : m_Conform(nullptr), m_Layout(nullptr), m_MainView(nullptr)
+{
+}
+
+Evas_Object *Window::getConformant() const
+{
+ return m_Conform;
+}
+
+Evas_Object *Window::getBaseLayout() const
+{
+ return m_Layout;
+}
+
+void Window::setRotationEnabled(bool isEnabled)
+{
+ if (isEnabled) {
+ int rotations[] = { 0, 90, 180, 270 };
+ elm_win_wm_rotation_available_rotations_set(getEvasObject(), rotations, Utils::count(rotations));
+ } else {
+ int rotations[] = { 0 };
+ elm_win_wm_rotation_available_rotations_set(getEvasObject(), rotations, Utils::count(rotations));
+ }
+}
+
+void Window::attachView(View *view)
+{
+ m_MainView = view;
+ elm_object_part_content_set(m_Layout, "elm.swallow.content", m_MainView->create(m_Layout));
+ if (elm_win_focus_get(getEvasObject())) {
+ m_MainView->onNavigation(true, elm_win_rotation_get(getEvasObject()));
+ }
+}
+
+Evas_Object *Window::onCreate(Evas_Object *parent)
+{
+ Evas_Object *window = onWindowCreate();
+
+ m_Conform = elm_conformant_add(window);
+ evas_object_size_hint_weight_set(m_Conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(window, m_Conform);
+ evas_object_show(m_Conform);
+
+ m_Layout = elm_layout_add(m_Conform);
+ elm_layout_theme_set(m_Layout, "layout", "application", "default");
+ evas_object_size_hint_weight_set(m_Layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_content_set(m_Conform, m_Layout);
+ evas_object_show(m_Layout);
+
+ Evas_Object *bg = elm_bg_add(m_Layout);
+ evas_object_color_set(bg, 255, 255, 255, 0);
+ evas_object_show(bg);
+ elm_object_part_content_set(m_Layout, "elm.swallow.bg", bg);
+
+ evas_object_smart_callback_add(window, "focused",
+ makeCallback(&Window::onFocused), this);
+ evas_object_smart_callback_add(window, "unfocused",
+ makeCallback(&Window::onUnfocused), this);
+ evas_object_smart_callback_add(window, "rotation,changed",
+ makeCallback(&Window::onRotationChanged), this);
+
+ eext_object_event_callback_add(m_Layout, EEXT_CALLBACK_BACK,
+ makeCallback(&Window::onBackPressed), this);
+ eext_object_event_callback_add(m_Layout, EEXT_CALLBACK_MORE,
+ makeCallback(&Window::onMenuPressed), this);
+
+ return window;
+}
+
+Evas_Object *Window::onWindowCreate()
+{
+ Evas_Object *window = elm_win_add(nullptr, nullptr, ELM_WIN_BASIC);
+ elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
+ elm_win_indicator_opacity_set(window, ELM_WIN_INDICATOR_OPAQUE);
+ elm_win_conformant_set(window, EINA_TRUE);
+ evas_object_show(window);
+ return window;
+}
+
+void Window::onFocused(Evas_Object *obj, void *eventInfo)
+{
+ if (m_MainView) {
+ m_MainView->onNavigation(true, elm_win_rotation_get(getEvasObject()));
+ }
+}
+
+void Window::onUnfocused(Evas_Object *obj, void *eventInfo)
+{
+ if (m_MainView) {
+ m_MainView->onNavigation(false, elm_win_rotation_get(getEvasObject()));
+ }
+}
+
+void Window::onRotationChanged(Evas_Object *obj, void *eventInfo)
+{
+ m_MainView->onRotation(elm_win_rotation_get(obj));
+}
+
+void Window::onBackPressed(Evas_Object *obj, void *eventInfo)
+{
+ if (!m_MainView || m_MainView->onBackPressed()) {
+ elm_win_lower(getEvasObject());
+ }
+}
+
+void Window::onMenuPressed(Evas_Object *obj, void *eventInfo)
+{
+ if (m_MainView) {
+ m_MainView->onMenuPressed();
+ }
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils/EcoreUtils.h"
+
+using namespace Utils;
+
+Ecore_Job *Utils::createJob(Job job)
+{
+ return ecore_job_add([](void *data) {
+ Job *job = (Job *) data;
+ (*job)();
+ delete job;
+ }, new Job(std::move(job)));
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils/Logger.h"
+#include <stdio.h>
+
+static char appsCommonLogTag[64] = "DefaultLogTag";
+
+void Utils::setLogTag(const char *logTag)
+{
+ snprintf(appsCommonLogTag, sizeof(appsCommonLogTag), "%s", logTag);
+}
+
+const char *Utils::getLogTag()
+{
+ return appsCommonLogTag;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils/Thread.h"
+#include "Utils/Callback.h"
+
+using namespace Utils;
+
+
+Thread::Thread(Callback callbackPair)
+ : m_Callback(std::move(callbackPair))
+{
+ ecore_thread_run(makeCallback(&Thread::onStart), makeCallback(&Thread::onFinished),
+ nullptr, this);
+}
+
+Thread::Thread(Callback task, Callback finishCallback)
+ : Thread(CallbackPair(std::move(task), std::move(finishCallback)))
+{
+}
+
+void Thread::onStart(Ecore_Thread *thread)
+{
+ if (m_Callback) {
+ m_Callback();
+ }
+}
+
+void Thread::onFinished(Ecore_Thread *thread)
+{
+ if (m_Callback) {
+ m_Callback();
+ }
+
+ delete this;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils/Tracer.h"
+#include <dlog.h>
+
+using namespace Utils;
+
+void subtractTime(const timespec &a, const timespec &b, timespec &res)
+{
+ static const size_t ratio(1000000000);
+
+ res.tv_sec = b.tv_sec - a.tv_sec;
+ res.tv_nsec = b.tv_nsec - a.tv_nsec;
+ if (res.tv_nsec < 0)
+ {
+ --res.tv_sec;
+ res.tv_nsec += ratio;
+ }
+}
+
+Tracer::Tracer(const char *tag, const char *file, const char *func, int line)
+ : m_Tag(tag), m_File(file), m_Func(func)
+{
+ dlog_print(DLOG_DEBUG, m_Tag, "%s: %s(%d) <<< called", m_File, m_Func, line);
+ clock_gettime(CLOCK_REALTIME, &m_startTime);
+}
+
+Tracer::~Tracer()
+{
+ timespec endTime;
+ clock_gettime(CLOCK_REALTIME, &endTime);
+
+ timespec res;
+ subtractTime(m_startTime, endTime, res);
+
+ dlog_print(DLOG_DEBUG, m_Tag, "%s: %s >>> returned in %d.%03d seconds",
+ m_File, m_Func, res.tv_sec, res.tv_nsec / 1000000);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ux/DatePopup.h"
+
+using namespace Ux;
+
+DatePopup::DatePopup(const char *format, tm date)
+ : m_Format(format ? format : ""), m_Date(date),
+ m_DatePicker(nullptr), m_Strings{ nullptr }
+{
+}
+
+void DatePopup::setStrings(Strings strings)
+{
+ m_Strings = strings;
+}
+
+void DatePopup::setResultCallback(ResultCallback callback)
+{
+ m_OnResult = std::move(callback);
+}
+
+Evas_Object *DatePopup::getDatePicker() const
+{
+ return m_DatePicker;
+}
+
+void DatePopup::onCreated()
+{
+ setTitle(m_Strings.popupTitle);
+ addButton(m_Strings.buttonCancel);
+ addButton(m_Strings.buttonDone, std::bind(&DatePopup::onDonePressed, this));
+
+ m_DatePicker = elm_datetime_add(getEvasObject());
+ elm_datetime_format_set(m_DatePicker, m_Format.c_str());
+ elm_datetime_value_set(m_DatePicker, &m_Date);
+ setContent(m_DatePicker);
+}
+
+bool DatePopup::onDonePressed()
+{
+ if (m_OnResult) {
+ elm_datetime_value_get(m_DatePicker, &m_Date);
+ m_OnResult(m_Date);
+ }
+
+ return true;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ux/EditfieldPopup.h"
+#include "Ui/Editfield.h"
+#include "Utils/Callback.h"
+#include "Utils/String.h"
+
+using namespace Ui;
+using namespace Ux;
+
+EditfieldPopup::EditfieldPopup()
+ : m_Editfield(nullptr), m_Strings{ nullptr }
+{
+}
+
+void EditfieldPopup::setStrings(Strings strings)
+{
+ m_Strings = strings;
+}
+
+void EditfieldPopup::setResultCallback(ResultCallback callback)
+{
+ m_OnResult = std::move(callback);
+}
+
+Editfield *EditfieldPopup::getEditfield() const
+{
+ return m_Editfield;
+}
+
+void EditfieldPopup::onCreated()
+{
+ m_Editfield = Editfield::create(getEvasObject(), m_Strings.guideText);
+ m_Editfield->setLimitToastText(m_Strings.limitToastText);
+
+ setTitle(m_Strings.popupTitle);
+ setContent(m_Editfield->getEvasObject());
+ addButton(m_Strings.buttonCancel);
+
+ Evas_Object *button = addButton(m_Strings.buttonDone, std::bind(&EditfieldPopup::onDoneButtonPressed, this));
+ elm_object_focus_allow_set(button, EINA_FALSE);
+
+ Evas_Object *entry = m_Editfield->getEntry();
+ elm_entry_input_panel_return_key_type_set(entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE);
+ elm_entry_input_panel_return_key_disabled_set(entry, EINA_TRUE);
+
+ evas_object_smart_callback_add(entry, "changed",
+ (Evas_Smart_Cb) &EditfieldPopup::onEntryChanged, button);
+ evas_object_smart_callback_add(entry, "activated",
+ makeCallback(&EditfieldPopup::onDoneKeyPressed), this);
+
+ elm_object_disabled_set(button, EINA_TRUE);
+ elm_object_focus_set(entry, EINA_TRUE);
+}
+
+bool EditfieldPopup::onDoneButtonPressed()
+{
+ bool shouldClose = true;
+ if (m_OnResult) {
+ char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(m_Editfield->getEntry()));
+ shouldClose = m_OnResult(text);
+ free(text);
+ }
+
+ return shouldClose;
+}
+
+void EditfieldPopup::onDoneKeyPressed(Evas_Object *entry, void *eventInfo)
+{
+ if (onDoneButtonPressed()) {
+ close();
+ }
+}
+
+void EditfieldPopup::onEntryChanged(Evas_Object *button, Evas_Object *entry, void *eventInfo)
+{
+ bool isEmpty = Utils::isStrEmpty(elm_entry_entry_get(entry));
+ elm_object_disabled_set(button, isEmpty);
+ elm_entry_input_panel_return_key_disabled_set(entry, isEmpty);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ux/SelectAllItem.h"
+#include <app_i18n.h>
+
+#define TEXT_COLOR 61, 185, 204, 255
+
+using namespace Ux;
+
+SelectAllItem::SelectAllItem(const char *text)
+{
+ if (text) {
+ m_Text = text;
+ }
+}
+
+Elm_Gen_Item_Class *SelectAllItem::getItemClass() const
+{
+ static Elm_Gen_Item_Class itc = createItemClass("end_icon");
+ return &itc;
+}
+
+char *SelectAllItem::getText(Evas_Object *parent, const char *part)
+{
+ if (strcmp(part, "elm.text") == 0) {
+ return strdup(_(m_Text.c_str()));
+ }
+
+ return nullptr;
+}
+
+Evas_Object *SelectAllItem::getContent(Evas_Object *parent, const char *part)
+{
+ if (strcmp(part, "elm.swallow.end") == 0) {
+ return CheckItem::getContent(parent, part);
+ }
+
+ return nullptr;
+}
+
+void SelectAllItem::onInserted()
+{
+ elm_object_item_color_class_color_set(getObjectItem(), "text", TEXT_COLOR);
+ elm_object_item_color_class_color_set(getObjectItem(), "text_pressed", TEXT_COLOR);
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ux/SelectItem.h"
+#include "Ux/SelectView.h"
+
+using namespace Ux;
+using namespace Ui;
+
+SelectItem::SelectItem(GenContainer::Type type)
+ : CheckItem(type),
+ m_SelectView(nullptr), m_SelectMode(SelectNone),
+ m_CustomResult{ 0, 0 }, m_HasCustomResult(false),
+ m_IsExcluded(false)
+{
+}
+
+bool SelectItem::isExcluded() const
+{
+ return m_IsExcluded;
+}
+
+void SelectItem::setExcluded(bool isExcluded)
+{
+ if (m_IsExcluded == isExcluded) {
+ return;
+ }
+
+ m_IsExcluded = isExcluded;
+ if (m_SelectView) {
+ m_SelectView->onItemExcluded(this, m_IsExcluded);
+ }
+}
+
+SelectMode SelectItem::getSelectMode() const
+{
+ return m_SelectMode;
+}
+
+void SelectItem::setSelectMode(SelectMode selectMode)
+{
+ m_SelectMode = selectMode;
+
+ setChecked(false);
+ updateCheckPart();
+ onSelectModeChanged(m_SelectMode);
+}
+
+SelectResult SelectItem::getSelectResult() const
+{
+ return m_HasCustomResult ? m_CustomResult : getDefaultResult();
+}
+
+bool SelectItem::hasCustomResult() const
+{
+ return m_HasCustomResult;
+}
+
+void SelectItem::setCustomResult(SelectResult result)
+{
+ m_CustomResult = result;
+ m_HasCustomResult = true;
+}
+
+void SelectItem::unsetCustomResult()
+{
+ m_HasCustomResult = false;
+}
+
+Evas_Object *SelectItem::getContent(Evas_Object *parent, const char *part)
+{
+ if (m_SelectMode == SelectMulti) {
+ return CheckItem::getContent(parent, part);
+ }
+
+ return nullptr;
+}
+
+void SelectItem::onVisibilityChanged(bool isVisible)
+{
+ if (m_SelectView && !m_IsExcluded) {
+ return m_SelectView->onItemVisibilityChanged(this, isVisible);
+ }
+}
+
+void SelectItem::onSelected()
+{
+ if (m_SelectMode == SelectSingle) {
+ if (m_SelectView) {
+ m_SelectView->onItemSelected(this);
+ }
+ } else if (m_SelectMode == SelectMulti) {
+ CheckItem::onSelected();
+ }
+}
+
+bool SelectItem::onChecked(bool isChecked)
+{
+ if (m_SelectView && !m_IsExcluded) {
+ return m_SelectView->onItemChecked(this, isChecked);
+ }
+
+ return true;
+}
--- /dev/null
+/*
+ * Copyright 2016 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Ux/SelectView.h"
+#include "Ux/SelectItem.h"
+
+#include "Ui/Genlist.h"
+#include "Utils/Callback.h"
+
+#include <app_i18n.h>
+#include <algorithm>
+#include <notification.h>
+
+#define TITLE_BUFFER_SIZE 64
+#define POPUP_BUFFER_SIZE 256
+
+using namespace Ux;
+using namespace std::placeholders;
+
+SelectView::SelectView()
+ : m_DoneButton(nullptr), m_CancelButton(nullptr), m_IsMultiChecking(false),
+ m_TotalCount(0), m_TotalSelectCount(0),
+ m_VisibleCount(0), m_VisibleSelectCount(0),
+ m_SelectLimit(0), m_IsEmptyResultAllowed(false), m_SelectMode(SelectNone),
+ m_Strings{ nullptr }
+{
+}
+
+SelectView::~SelectView()
+{
+ if (auto item = m_SelectAllItem.lock()) {
+ delete item.get();
+ }
+}
+
+SelectMode SelectView::getSelectMode() const
+{
+ return m_SelectMode;
+}
+
+size_t SelectView::getSelectLimit() const
+{
+ return m_SelectLimit;
+}
+
+size_t SelectView::getSelectCount() const
+{
+ return m_TotalSelectCount;
+}
+
+const SelectView::SelectItems &SelectView::getSelectItems() const
+{
+ return m_Items;
+}
+
+void SelectView::setStrings(const Strings &strings)
+{
+ m_Strings = strings;
+}
+
+void SelectView::setSelectMode(SelectMode selectMode)
+{
+ if (m_SelectMode != selectMode) {
+ m_SelectMode = selectMode;
+
+ updatePageTitle();
+ updatePageButtons();
+ updateSelectAllItem();
+
+ for (auto &&item : m_Items) {
+ item->setSelectMode(m_SelectMode);
+ }
+
+ onSelectModeChanged(m_SelectMode);
+ }
+}
+
+void SelectView::setSelectLimit(size_t selectLimit)
+{
+ if (m_SelectLimit != selectLimit) {
+ m_SelectLimit = selectLimit;
+
+ if (m_SelectLimit) {
+ m_IsMultiChecking = true;
+ for (size_t i = m_Items.size() - 1; m_TotalSelectCount > m_SelectLimit; --i) {
+ if (!m_Items[i]->isExcluded()) {
+ m_Items[i]->setChecked(false);
+ }
+ }
+
+ m_IsMultiChecking = false;
+ }
+
+ updateSelectAllState();
+ updateDoneButtonState();
+ updatePageTitle();
+
+ onSelectLimitChanged(m_SelectLimit);
+ }
+}
+
+void SelectView::setEmptyResultAllowed(bool isAllowed)
+{
+ if (m_IsEmptyResultAllowed != isAllowed) {
+ m_IsEmptyResultAllowed = isAllowed;
+ updateDoneButtonState();
+ }
+}
+
+void SelectView::setSelectCallback(SelectCallback callback)
+{
+ m_OnSelected = std::move(callback);
+}
+
+void SelectView::setCancelCallback(CancelCallback callback)
+{
+ m_OnCanceled = std::move(callback);
+}
+
+void SelectView::setCheckCallback(CheckCallback callback)
+{
+ m_OnChecked = std::move(callback);
+}
+
+void SelectView::setLimitCallback(LimitCallback callback)
+{
+ m_OnLimitReached = std::move(callback);
+}
+
+void SelectView::addSelectItem(SelectItem *item)
+{
+ item->m_SelectView = this;
+ item->setSelectMode(m_SelectMode);
+ m_Items.push_back(item);
+
+ if (!item->isExcluded()) {
+ updateTotalCount(CountIncrement, item);
+ }
+}
+
+void SelectView::removeSelectItem(SelectItem *item)
+{
+ auto it = std::find(m_Items.begin(), m_Items.end(), item);
+ if (it == m_Items.end()) {
+ return;
+ }
+
+ m_Items.erase(it);
+ if (!item->isExcluded()) {
+ updateTotalCount(CountDecrement, item);
+ }
+ item->m_SelectView = nullptr;
+}
+
+void SelectView::onPageAttached(Ui::NavigatorPage *page)
+{
+ updatePageTitle();
+ updatePageButtons();
+
+ evas_object_smart_callback_add(getEvasObject(), "language,changed",
+ [](void *data, Evas_Object *, void *) {
+ ((SelectView *) data)->updatePageTitle();
+ }, this);
+}
+
+bool SelectView::onBackPressed()
+{
+ if (m_SelectMode != SelectNone) {
+ if (m_OnCanceled && !m_OnCanceled()) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void SelectView::onTitleChanged(const char *title)
+{
+ if (auto page = getPage()) {
+ page->setTitle(title);
+ }
+}
+
+size_t SelectView::getSelectMax() const
+{
+ if (m_SelectLimit && m_SelectLimit < m_VisibleCount) {
+ return m_SelectLimit;
+ }
+
+ return m_VisibleCount;
+}
+
+bool SelectView::isLimitReached() const
+{
+ return m_SelectLimit && m_TotalSelectCount == m_SelectLimit;
+}
+
+bool SelectView::isMaxSelected() const
+{
+ return m_VisibleSelectCount == getSelectMax();
+}
+
+void SelectView::updatePageTitle()
+{
+ char buffer[TITLE_BUFFER_SIZE];
+ const char *title = nullptr;
+
+ switch (m_SelectMode) {
+ case SelectNone:
+ title = m_Strings.titleDefault;
+ break;
+ case SelectSingle:
+ title = m_Strings.titleSingle;
+ break;
+ case SelectMulti:
+ if (m_SelectLimit) {
+ snprintf(buffer, sizeof(buffer), _(m_Strings.titleWithLimit), m_TotalSelectCount, m_SelectLimit);
+ title = buffer;
+ } else if (m_TotalSelectCount) {
+ snprintf(buffer, sizeof(buffer), _(m_Strings.titleWithCount), m_TotalSelectCount);
+ title = buffer;
+ } else {
+ title = m_Strings.titleMulti;
+ }
+ break;
+ }
+
+ onTitleChanged(title);
+}
+
+void SelectView::updatePageButtons()
+{
+ Ui::NavigatorPage *page = getPage();
+ if (!page) {
+ return;
+ }
+
+ switch (m_SelectMode) {
+ case SelectNone:
+ case SelectSingle:
+ if (m_DoneButton) {
+ destroyPageButtons();
+ }
+ break;
+
+ case SelectMulti:
+ if (!m_DoneButton) {
+ createPageButtons(page);
+ }
+ updateDoneButtonState();
+ break;
+ }
+}
+
+void SelectView::updateSelectAllItem()
+{
+ if (m_SelectMode == SelectMulti && m_VisibleCount) {
+ if (m_SelectAllItem.expired()) {
+ SelectAllItem *item = new SelectAllItem(m_Strings.selectAll);
+ item->setCheckCallback(std::bind(&SelectView::onSelectAllChecked, this, _1));
+
+ m_SelectAllItem = item->getWeakPtr();
+ onSelectAllInsert(item);
+ }
+
+ updateSelectAllState();
+ } else {
+ if (auto item = m_SelectAllItem.lock()) {
+ delete item.get();
+ }
+ }
+}
+
+void SelectView::updateDoneButtonState()
+{
+ elm_object_disabled_set(m_DoneButton,
+ m_IsEmptyResultAllowed ? m_TotalCount == 0 : m_TotalSelectCount == 0);
+}
+
+void SelectView::updateSelectAllState()
+{
+ if (auto item = m_SelectAllItem.lock()) {
+ auto selectAllItem = static_cast<SelectAllItem *>(item.get());
+ selectAllItem->setChecked(isMaxSelected());
+ }
+}
+
+void SelectView::updateTotalCount(CountChange change, SelectItem *item)
+{
+ (change == CountIncrement) ? ++m_TotalCount : --m_TotalCount;
+
+ updateDoneButtonState();
+ if (item->isChecked()) {
+ updateTotalSelectCount(change, item);
+ }
+ if (item->isVisible()) {
+ updateVisibleCount(change, item);
+ }
+}
+
+void SelectView::updateTotalSelectCount(CountChange change, SelectItem *item)
+{
+ (change == CountIncrement) ? ++m_TotalSelectCount : --m_TotalSelectCount;
+ onSelectCountChanged(m_TotalSelectCount);
+
+ if (m_SelectLimit && m_TotalSelectCount > m_SelectLimit) {
+ item->setChecked(false);
+ return;
+ }
+
+ updateDoneButtonState();
+ /* Prevent updating if multiple checking is in progress (performance optimization) */
+ if (!m_IsMultiChecking) {
+ updatePageTitle();
+ }
+}
+
+void SelectView::updateVisibleCount(CountChange change, SelectItem *item)
+{
+ (change == CountIncrement) ? ++m_VisibleCount : --m_VisibleCount;
+
+ if (item->isChecked()) {
+ updateVisibleSelectCount(change, item);
+ }
+
+ updateSelectAllItem();
+}
+
+void SelectView::updateVisibleSelectCount(CountChange change, SelectItem *item)
+{
+ (change == CountIncrement) ? ++m_VisibleSelectCount : --m_VisibleSelectCount;
+ updateSelectAllState();
+}
+
+void SelectView::createPageButtons(Ui::NavigatorPage *page)
+{
+ m_DoneButton = page->addTitleButton(Ui::ButtonRight, m_Strings.buttonDone,
+ makeCallback(&SelectView::onDonePressed), this);
+
+ m_CancelButton = page->addTitleButton(Ui::ButtonLeft, m_Strings.buttonCancel,
+ makeCallback(&SelectView::onCancelPressed), this);
+}
+
+void SelectView::destroyPageButtons()
+{
+ evas_object_del(m_DoneButton);
+ evas_object_del(m_CancelButton);
+
+ m_DoneButton = nullptr;
+ m_CancelButton = nullptr;
+}
+
+void SelectView::onItemExcluded(SelectItem *item, bool isExcluded)
+{
+ updateTotalCount(isExcluded ? CountDecrement : CountIncrement, item);
+}
+
+void SelectView::onItemVisibilityChanged(SelectItem *item, bool isVisible)
+{
+ updateVisibleCount(isVisible ? CountIncrement : CountDecrement, item);
+}
+
+void SelectView::onItemSelected(SelectItem *item)
+{
+ if (m_SelectMode == SelectSingle) {
+ SelectResult result = item->getSelectResult();
+ if (m_OnSelected && m_OnSelected({ result })) {
+ getPage()->close();
+ }
+ }
+}
+
+bool SelectView::onItemChecked(SelectItem *item, bool isChecked)
+{
+ if (isChecked && isLimitReached()) {
+ onLimitReached();
+ return false;
+ }
+
+ if (m_OnChecked && !m_OnChecked(item, isChecked, m_IsMultiChecking)) {
+ return false;
+ }
+
+ CountChange change = isChecked ? CountIncrement : CountDecrement;
+ updateTotalSelectCount(change, item);
+ if (item->isVisible()) {
+ updateVisibleSelectCount(change, item);
+ }
+ return true;
+}
+
+bool SelectView::onSelectAllChecked(bool isChecked)
+{
+ if (isChecked == isMaxSelected()) {
+ return true;
+ }
+
+ m_IsMultiChecking = true;
+ for (auto &&item : m_Items) {
+ if (!item->isExcluded() && item->isVisible()) {
+ if (!item->setChecked(isChecked)) {
+ break;
+ }
+ }
+ }
+
+ m_IsMultiChecking = false;
+ updatePageTitle();
+ return isChecked == isMaxSelected();
+}
+
+void SelectView::onDonePressed(Evas_Object *button, void *eventInfo)
+{
+ std::vector<SelectResult> results;
+ for (auto &&item : m_Items) {
+ if (!item->isExcluded() && item->isChecked()) {
+ results.push_back(item->getSelectResult());
+ }
+ }
+
+ if (m_OnSelected && m_OnSelected(std::move(results))) {
+ getPage()->close();
+ }
+}
+
+void SelectView::onCancelPressed(Evas_Object *button, void *eventInfo)
+{
+ if (!m_OnCanceled || m_OnCanceled()) {
+ getPage()->close();
+ }
+}
+
+void SelectView::onLimitReached()
+{
+ if (!m_OnLimitReached || m_OnLimitReached()) {
+ char buffer[POPUP_BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer), _(m_Strings.popupLimit), m_SelectLimit);
+ notification_status_message_post(buffer);
+ }
+}