diff options
author | Igor Olshevskyi <i.olshevskyi@samsung.com> | 2017-10-27 15:01:30 +0300 |
---|---|---|
committer | Igor Olshevskyi <i.olshevskyi@samsung.com> | 2017-10-27 15:02:14 +0300 |
commit | 07ca30998217ff2451b63fe6a6de622aef334715 (patch) | |
tree | d74768054e9e9d7b004f5dc974fa923af926c9de | |
parent | 4d4857ed811f1fa9cee16fdbcf39716bc160a96a (diff) | |
parent | bb07006afb68b262cd38e59656ef58436c887448 (diff) | |
download | call-setting-07ca30998217ff2451b63fe6a6de622aef334715.tar.gz call-setting-07ca30998217ff2451b63fe6a6de622aef334715.tar.bz2 call-setting-07ca30998217ff2451b63fe6a6de622aef334715.zip |
Merge branch 'tizen_dev' into tizen_4.0submit/tizen_4.0/20171030.141651
Change-Id: I08dabe158da6efb646abd9078948cb33a9114f0a
144 files changed, 4416 insertions, 484 deletions
diff --git a/call-setting/model/impl/misc/BlockListManager.h b/call-setting/model/impl/misc/BlockListManager.h index 2fc93f8..6e82a9b 100644 --- a/call-setting/model/impl/misc/BlockListManager.h +++ b/call-setting/model/impl/misc/BlockListManager.h @@ -126,7 +126,7 @@ namespace call_setting { ucl::Result getRules(Rules &rules) const; /** - * @brief Adds rule with exanct matching type + * @brief Adds rule with exact matching type * @param[in] number Number * @param[in] rule Rule * @return RES_OK on success, otherwise an error code on failure diff --git a/call-setting/presenters/Instance.h b/call-setting/presenters/Instance.h index bcd37f5..0a9811b 100644 --- a/call-setting/presenters/Instance.h +++ b/call-setting/presenters/Instance.h @@ -30,23 +30,55 @@ namespace call_setting { + /** + * @brief Implementation of IInstance class + */ class Instance final : public ucl::RefCountAware, public ucl::IInstance, public ucl::IInstanceAppControlExt { public: + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] sysEventProvider System event provider reference + */ Instance(ucl::IRefCountObj &rc, ucl::SysEventProvider &sysEventProvider); + + /** + * @brief Default destructor + */ ~Instance(); // IInstance // + /** + * @brief Called when instance is created. + * @param[in] context Pointer to the context of this instance + * @return RES_OK on success, otherwise an error code on failure + */ virtual ucl::Result onCreate( ucl::IInstanceContext *context) final override; + + /** + * @brief Called when instance is paused + * @details For UIApp function called in app's "pause" cb. + */ virtual void onPause() final override; + + /** + * @brief Called when instance is resumed + * @details For UIApp function called in app's "resume" cb. + */ virtual void onResume() final override; // IInstanceAppControlExt // + /** + * @brief Called to process an app control request. + * @details For UIApp function called in app's "app_control" cb. + * @param[in] appControl App control request to process + */ virtual void onAppControl(app_control_h appControl) final override; private: diff --git a/call-setting/presenters/InstanceManager.h b/call-setting/presenters/InstanceManager.h index 44df733..f442aa0 100644 --- a/call-setting/presenters/InstanceManager.h +++ b/call-setting/presenters/InstanceManager.h @@ -22,13 +22,23 @@ #include "types.h" namespace call_setting { - + /** + * @brief Implementation of InstanceManagerBase class + */ class InstanceManager final : public ucl::InstanceManagerBase { public: + + /** + * @brief Default constructor + */ InstanceManager(); // ucl::InstanceManagerBase // + /** + * @brief Creates new application instance object + * @return Shared reference to the new instance + */ virtual ucl::IInstanceSRef newInstance() const final override; }; } diff --git a/call-setting/presenters/dialogs/ListOptionDialog.cpp b/call-setting/presenters/dialogs/ListOptionDialog.cpp index 2dffbba..7253921 100644 --- a/call-setting/presenters/dialogs/ListOptionDialog.cpp +++ b/call-setting/presenters/dialogs/ListOptionDialog.cpp @@ -68,25 +68,29 @@ namespace call_setting { return *this; } - ListOptionDialog::Builder &ListOptionDialog::Builder::addOption(Option option) + ListOptionDialog::Builder &ListOptionDialog::Builder::addOption( + Option option) { m_options.emplace_back(std::move(option)); return *this; } - ListOptionDialog::Builder &ListOptionDialog::Builder::setTitle(TString title) + ListOptionDialog::Builder &ListOptionDialog::Builder::setTitle( + TString title) { m_title = std::move(title); return *this; } - ListOptionDialog::Builder &ListOptionDialog::Builder::setInitialOptionId(int id) + ListOptionDialog::Builder &ListOptionDialog::Builder::setInitialOptionId( + int id) { m_initialOptionId = id; return *this; } - ListOptionDialog::Builder &ListOptionDialog::Builder::setHandler(EventHandler handler) + ListOptionDialog::Builder &ListOptionDialog::Builder::setHandler( + EventHandler handler) { m_handler = std::move(handler); return *this; @@ -215,10 +219,10 @@ namespace call_setting { } m_popup->setContent(*layout, impl::PART_CIRCLE_SFC); - auto surface = eext_circle_surface_layout_add(*layout); + auto surface = eext_circle_surface_layout_add(as_eo(*layout)); - m_circleObject = eext_circle_object_genlist_add(m_list->getWidget(), - surface); + m_circleObject = eext_circle_object_genlist_add( + as_eo(m_list->getWidget()), surface); eext_circle_object_genlist_scroller_policy_set(m_circleObject, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO); @@ -232,8 +236,8 @@ namespace call_setting { { using ucl::show; - const auto button = makeShared<StyledWidget>(elm_button_add(*m_popup), - false); + const auto button = makeShared<StyledWidget>( + elm_button_add(as_eo(*m_popup)), false); button->setStyle(btnStyle); m_popup->setContent(*button, part); diff --git a/call-setting/presenters/dialogs/base/Dialog.cpp b/call-setting/presenters/dialogs/base/Dialog.cpp index 04fde3c..d757397 100644 --- a/call-setting/presenters/dialogs/base/Dialog.cpp +++ b/call-setting/presenters/dialogs/base/Dialog.cpp @@ -38,7 +38,7 @@ namespace call_setting { Result Dialog::createPopup(ElmWidget &parent, const PopupType popupType) { Evas_Object *const popupEo = ((popupType == PopupType::NORMAL) ? - elm_popup_add(parent) : elm_ctxpopup_add(parent)); + elm_popup_add(as_eo(parent)) : elm_ctxpopup_add(as_eo(parent))); if (!popupEo) { LOG_RETURN(RES_FAIL, "elm_popup_add() failed!"); } @@ -48,7 +48,7 @@ namespace call_setting { m_popup->addEventHandler( POPUP_DISMISSED, WEAK_DELEGATE_THIS(onPopupDismissed)); - eext_object_event_callback_add(*m_popup, EEXT_CALLBACK_BACK, + eext_object_event_callback_add(popupEo, EEXT_CALLBACK_BACK, CALLBACK_A(Dialog::onPopupHWBackKey), this); getWindow().addEventHandler( @@ -73,7 +73,7 @@ namespace call_setting { if (m_popup && !m_isDismissed && m_popup->isVisible()) { m_isDismissed = true; deactivateSelf(); - elm_popup_dismiss(*m_popup); + elm_popup_dismiss(as_eo(*m_popup)); onDismiss(); } } @@ -81,7 +81,7 @@ namespace call_setting { void Dialog::dispose() { if (m_popup) { - eext_object_event_callback_del(*m_popup, EEXT_CALLBACK_BACK, + eext_object_event_callback_del(as_eo(*m_popup), EEXT_CALLBACK_BACK, CALLBACK_A(Dialog::onPopupHWBackKey)); deactivateSelf(); diff --git a/call-setting/presenters/items/BlockUnknownCallersItem.h b/call-setting/presenters/items/BlockUnknownCallersItem.h index af0a238..0b59ba5 100644 --- a/call-setting/presenters/items/BlockUnknownCallersItem.h +++ b/call-setting/presenters/items/BlockUnknownCallersItem.h @@ -25,19 +25,57 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(BlockUnknownCallersItem); + /** + * @brief Represents checkable option item + */ class BlockUnknownCallersItem final : public CheckOptionItem { public: + + /** + * @brief Creates instance of BlockUnknownCallersItem + * @param[in] model Shared reference to model component + * @return Shared reference to BlockUnknownCallersItem + */ static BlockUnknownCallersItemSRef newInstance( BlockUnknownCallersSRef model); protected: // CheckOptionItem // + /** + * @brief Gets state + * @return Current state + */ virtual State getState() const final override; + + /** + * @brief Gets option value + * @return Current option value. @see TriState + */ virtual TriState getOptionValue() const final override; + + /** + * @brief Gets option title + * @return Title + */ virtual ucl::CString getOptionTitle() const final override; + + /** + * @brief Checks if there is secondary text + * @return true if option has secondary text, false - if not + */ virtual bool hasOptionSubText() const final override; + + /** + * @brief Gets option sub text + * @return Sub text + */ virtual ucl::CString getOptionSubText() const final override; + + /** + * @brief Requests option value change + * @param[in] value Value + */ virtual void requestOptionValueChange(bool value) final override; private: diff --git a/call-setting/presenters/items/CallWaitingItem.h b/call-setting/presenters/items/CallWaitingItem.h index bc8e81c..4e079f0 100644 --- a/call-setting/presenters/items/CallWaitingItem.h +++ b/call-setting/presenters/items/CallWaitingItem.h @@ -27,8 +27,18 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(CallWaitingItem); + /** + * @brief Represents call waiting option item + */ class CallWaitingItem final : public CheckOptionItem { public: + + /** + * @brief Creates instance of CallWaitingItem + * @param[in] cw Shared reference to model component + * @param[in] toastParent Shared reference to toast parent + * @return Shared reference to CallWaitingItem + */ static CallWaitingItemSRef newInstance( CallWaitingSRef cw, ucl::ElmWidgetSRef toastParent); @@ -36,9 +46,28 @@ namespace call_setting { // CheckOptionItem // + /** + * @brief Gets state + * @return Current state + */ virtual State getState() const final override; + + /** + * @brief Gets option value + * @return Current option value. @see TriState + */ virtual TriState getOptionValue() const final override; + + /** + * @brief Gets option title + * @return Title + */ virtual ucl::CString getOptionTitle() const final override; + + /** + * @brief Requests option value change + * @param[in] value Value + */ virtual void requestOptionValueChange( const bool value) final override; diff --git a/call-setting/presenters/items/CallerIdItem.h b/call-setting/presenters/items/CallerIdItem.h index da6a6b5..9b8b5c7 100644 --- a/call-setting/presenters/items/CallerIdItem.h +++ b/call-setting/presenters/items/CallerIdItem.h @@ -25,8 +25,18 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(CallerIdItem); + /** + * @brief Represents caller id option item + */ class CallerIdItem final : public ListOptionItem { public: + + /** + * @brief Creates instance of CallerIdItem + * @param[in] model Shared reference to model component + * @param[in] dailogParent Shared reference to dialog parent + * @return Shared reference to CallerIdItem + */ static CallerIdItemSRef newInstance(CallerIdSRef model, ucl::ElmWidgetSRef dialogParent); @@ -39,8 +49,22 @@ namespace call_setting { // ListOptionItem // + /** + * @brief Gets option value + * @return Current option value + */ virtual int getOptionValue() const final override; + + /** + * @brief Gets option title + * @return Title + */ virtual ucl::CString getOptionTitle() const final override; + + /** + * @brief Requests option value change + * @param[in] value Value + */ virtual void requestOptionValueChange(const int value) final override; private: diff --git a/call-setting/presenters/items/RadioOptionItem.cpp b/call-setting/presenters/items/RadioOptionItem.cpp index dbe94a9..f8afc55 100644 --- a/call-setting/presenters/items/RadioOptionItem.cpp +++ b/call-setting/presenters/items/RadioOptionItem.cpp @@ -16,6 +16,8 @@ #include "RadioOptionItem.h" +#include "call-setting/resources.h" + #include "call-setting/presenters/common.h" namespace call_setting { namespace { namespace impl { @@ -26,6 +28,8 @@ namespace call_setting { namespace { namespace impl { constexpr EdjeSignal SIGNAL_ENBALE_PASS_EVENTS {"elm,event,pass,enabled"}; constexpr EdjeSignalSrc SIGNAL_SRC_ELM {"elm"}; + + constexpr SmartEvent RADIO_CHANGED {"changed"}; }}} namespace call_setting { @@ -47,10 +51,6 @@ namespace call_setting { UCL_ASSERT(m_groupValue, "m_groupValue is NULL"); } - RadioOptionItem::~RadioOptionItem() - { - } - RadioOptionItem::ItemInsertionParams RadioOptionItem::getItemInsertionParams() { @@ -68,9 +68,31 @@ namespace call_setting { radio->addToGroup(*m_radioGroup); radio->emit(impl::SIGNAL_ENBALE_PASS_EVENTS, impl::SIGNAL_SRC_ELM); + radio->addEventHandler( + impl::RADIO_CHANGED, WEAK_DELEGATE_THIS(onRadioChanged)); + + setAtspiParams(*radio); + return radio; } + void RadioOptionItem::setAtspiParams(ElmWidget &widget) + { + auto &radioAtspi = widget.getAtspi(); + auto &itemAtspi = *getItemAtspi(); + + radioAtspi.setTDomain(TEXT_DOMAIN); + radioAtspi.setRole(ELM_ATSPI_ROLE_RADIO_BUTTON); + radioAtspi.setDescription(STR_SR_RADIO_BUTTON); + radioAtspi.addRelationship(ELM_ATSPI_RELATION_CONTROLLED_BY, + as_ao(itemAtspi)); + + itemAtspi.addRelationship(ELM_ATSPI_RELATION_CONTROLLER_FOR, + as_ao(radioAtspi)); + itemAtspi.addRelationship(ELM_ATSPI_RELATION_DESCRIBED_BY, + as_ao(radioAtspi)); + } + CString RadioOptionItem::getItemPartText(EdjePart part) { if (part != impl::ITEM_PART_TITLE) { @@ -80,6 +102,14 @@ namespace call_setting { return CString::dup(m_textPart.translate()); } + void RadioOptionItem::onRadioChanged(Widget &widget, void *eventInfo) + { + if (!isActive()) { + return; + } + *m_groupValue = m_itemValue; + } + void RadioOptionItem::onItemSelected() { if (!isActive()) { @@ -88,4 +118,5 @@ namespace call_setting { m_radioGroup->setGroupValue(m_itemValue); *m_groupValue = m_itemValue; } + } diff --git a/call-setting/presenters/items/RadioOptionItem.h b/call-setting/presenters/items/RadioOptionItem.h index e855e10..6d0c6a4 100644 --- a/call-setting/presenters/items/RadioOptionItem.h +++ b/call-setting/presenters/items/RadioOptionItem.h @@ -27,25 +27,77 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(RadioOptionItem); + /** + * @brief Represents radio option item + */ class RadioOptionItem final : public ucl::ListItemPresenter { public: + /** + * @brief Radio group value type + */ using GroupValue = ucl::MonoObservable<int>; UCL_DECLARE_REF_ALIASES_NOFW(GroupValue); public: + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] text Item text + * @param[in] value Item value + * @param[in] groupValue Group value + * @param[in] rGroup Shared reference to radio group + */ RadioOptionItem(ucl::IRefCountObj &rc, ucl::TString text, int value, GroupValueSRef groupValue, ucl::RadioBoxSRef rGroup); protected: - ~RadioOptionItem(); + /** + * @brief Default destructor + */ + ~RadioOptionItem() = default; + + /** + * @brief Radio changed callback + * @param[in] widget Widget + * @param[in] eventInfo Event info + */ + void onRadioChanged(ucl::Widget &widget, void *eventInfo); + + /** + * @brief Sets ATSPI parameters + * @param[in] widget Widget + */ + void setAtspiParams(ucl::ElmWidget &widget); // ListItemPresenter // + /** + * @brief Gets GUI item insertion parameters + * @details Called just before item is added to list + * @return Item insertion params structure + */ virtual ItemInsertionParams getItemInsertionParams() final override; + + /** + * @brief Gets the content widget for specific GUI item part + * @param[in] part Target GUI item part + * @param[in] parent Parent widget to use for the content widget + * @return Shared reference to the content widget or NULL + */ virtual ucl::WidgetSRef getItemPartContent(ucl::EdjePart part, ucl::ElmWidget &parent) final override; + + /** + * @brief Gets text for specific GUI item part + * @param[in] part Target GUI item part + * @return Text for specific part or NULL + */ virtual ucl::CString getItemPartText(ucl::EdjePart part) final override; + + /** + * @brief Occurs when GUI item is selected + */ virtual void onItemSelected() final override; private: diff --git a/call-setting/presenters/items/SimpleListItem.cpp b/call-setting/presenters/items/SimpleListItem.cpp index dd63a39..a0d6f51 100644 --- a/call-setting/presenters/items/SimpleListItem.cpp +++ b/call-setting/presenters/items/SimpleListItem.cpp @@ -26,19 +26,22 @@ namespace call_setting { namespace { namespace impl { namespace call_setting { - using ucl::HashMap; using ucl::ListItemPresenter; using ucl::IPicker; - SimpleListItem::SimpleListItem(IRefCountObj &rc, - ElmStyle style, PartTextMap parts) : + SimpleListItem::SimpleListItem(IRefCountObj &rc, ElmStyle style, + PartTextMap parts, bool useAtspiRedundant) : ListItemPresenter::ListItemPresenter(rc), m_listItemStyle(style), - m_listItemParts(std::move(parts)) + m_listItemParts(std::move(parts)), + m_useAtspiRedundant(useAtspiRedundant) { } - SimpleListItem::~SimpleListItem() + SimpleListItem::SimpleListItem(IRefCountObj &rc, ElmStyle style) : + ListItemPresenter::ListItemPresenter(rc), + m_listItemStyle(style), + m_useAtspiRedundant(true) { } @@ -57,7 +60,8 @@ namespace call_setting { return *this; } - ListItemPresenter::ItemInsertionParams SimpleListItem::getItemInsertionParams() + ListItemPresenter::ItemInsertionParams + SimpleListItem::getItemInsertionParams() { return m_listItemStyle; } @@ -75,7 +79,8 @@ namespace call_setting { EdjePart part, ElmWidget &parent) { return tryCreatePickModeItemPartContent(part, parent, - {impl::PICK_MODE_CHECK_PART, impl::PICK_MODE_CHECK_STYLE}); + {impl::PICK_MODE_CHECK_PART, impl::PICK_MODE_CHECK_STYLE, + true}); } void SimpleListItem::onItemSelected() @@ -95,4 +100,11 @@ namespace call_setting { } } } + + void SimpleListItem::onItemAttached() + { + if (m_useAtspiRedundant) { + getItemAtspi()->setRole(ELM_ATSPI_ROLE_REDUNDANT_OBJECT); + } + } } diff --git a/call-setting/presenters/items/SimpleListItem.h b/call-setting/presenters/items/SimpleListItem.h index b4a214b..f75c997 100644 --- a/call-setting/presenters/items/SimpleListItem.h +++ b/call-setting/presenters/items/SimpleListItem.h @@ -26,32 +26,94 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(SimpleListItem); + /** + * @brief Represents simple option item + */ class SimpleListItem final : public ucl::ListItemPresenter, public ucl::IPickable { public: + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] style Item style + * @param[in] parts Item parts + * @param[in] useAtspiRedundant ATSPI object redundancy flag. + * true if item is ATSPI-redundant, false - if not + */ SimpleListItem(ucl::IRefCountObj &rc, ucl::ElmStyle style, - PartTextMap parts = {}); - + PartTextMap parts, bool useAtspiRedundant = false); + + /** + * @brief Constructor + * @details Constructs item as ATSPI redundant object + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] style Item style + */ + SimpleListItem(ucl::IRefCountObj &rc, ucl::ElmStyle style); + + /** + * @brief Sets select handler + * @param[in] handler Handler + */ void setItemSelectHandler(NotiHandler handler); + + /** + * @brief Sets longpress handler + * @param[in] handler Handler + */ void setItemLongpressHandler(NotiHandler handler); // IPickable // + + /** + * @brief Gets picker + * @return Picker. @see ucl::IPicker + */ virtual ucl::IPicker &getPicker() final override; protected: // ListItemPresenter // + /** + * @brief Gets GUI item insertion parameters + * @details Called just before item is added to list + * @return Item insertion params structure + */ virtual ItemInsertionParams getItemInsertionParams() override; + /** + * @brief Gets text for specific GUI item part + * @param[in] part Target GUI item part + * @return Text for specific part or NULL + */ virtual ucl::CString getItemPartText(ucl::EdjePart part) override; + + /** + * @brief Gets the content widget for specific GUI item part + * @param[in] part Target GUI item part + * @param[in] parent Parent widget to use for the content widget + * @return Shared reference to the content widget or NULL + */ virtual ucl::WidgetSRef getItemPartContent( ucl::EdjePart part, ucl::ElmWidget &parent) override; + /** + * @brief Occurs when GUI item is selected + */ virtual void onItemSelected() override; + + /** + * @brief Occurs when GUI item is long pressed + */ virtual void onItemLongpressed() override; + /** + * @brief Occurs when GUI item is attached + */ + virtual void onItemAttached() override; + private: - ~SimpleListItem(); + ~SimpleListItem() = default; private: ucl::ElmStyle m_listItemStyle; @@ -59,6 +121,7 @@ namespace call_setting { NotiHandler m_onItemSelected; NotiHandler m_onItemLongpressed; + bool m_useAtspiRedundant; friend class ucl::ReffedObj<SimpleListItem>; }; diff --git a/call-setting/presenters/items/VoicemailNumberItem.h b/call-setting/presenters/items/VoicemailNumberItem.h index ed9957c..2070109 100644 --- a/call-setting/presenters/items/VoicemailNumberItem.h +++ b/call-setting/presenters/items/VoicemailNumberItem.h @@ -27,8 +27,17 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(VoicemailNumberItem); + /** + * @brief Represents voicemail number item + */ class VoicemailNumberItem final : public ucl::ListItemPresenter { public: + /** + * @brief Creates instance of VoicemailNumberItem + * @param[in] model Shared reference to model component + * @param[in] itemSelectHandler Item select handler + * @return Shared reference to VoicemailNumberItem + */ static VoicemailNumberItemSRef newInstance( VoicemailSRef model, NotiHandler itemSelectHandler); @@ -36,8 +45,23 @@ namespace call_setting { protected: // ListItemPresenter // + /** + * @brief Gets GUI item insertion parameters + * @details Called just before item is added to list + * @return Item insertion params structure + */ virtual ItemInsertionParams getItemInsertionParams() final override; + + /** + * @brief Gets text for specific GUI item part + * @param[in] part Target GUI item part + * @return Text for specific part or NULL + */ virtual ucl::CString getItemPartText(ucl::EdjePart part) final override; + + /** + * @brief Occurs when GUI item is selected + */ virtual void onItemSelected() final override; private: diff --git a/call-setting/presenters/items/base/CheckOptionItem.cpp b/call-setting/presenters/items/base/CheckOptionItem.cpp index 9450a3b..ff1d095 100644 --- a/call-setting/presenters/items/base/CheckOptionItem.cpp +++ b/call-setting/presenters/items/base/CheckOptionItem.cpp @@ -16,6 +16,8 @@ #include "CheckOptionItem.h" +#include "call-setting/resources.h" + #include "call-setting/presenters/common.h" namespace call_setting { namespace { namespace impl { @@ -64,20 +66,39 @@ namespace call_setting { return nullptr; } - auto check = makeShared<StyledWidget>(elm_check_add(parent)); + auto check = makeShared<StyledWidget>(elm_check_add(as_eo(parent))); check->bindToEo(); check->setStyle(impl::CHECK_STYLE); - elm_check_state_set(*check, toEina(m_checkValue)); - evas_object_repeat_events_set(*check, EINA_FALSE); - evas_object_propagate_events_set(*check, EINA_FALSE); + elm_check_state_set(as_eo(*check), toEina(m_checkValue)); + evas_object_repeat_events_set(as_eo(*check), EINA_FALSE); + evas_object_propagate_events_set(as_eo(*check), EINA_FALSE); + + check->addEventHandler(impl::CHECK_CHANGED, + WEAK_DELEGATE_THIS(onCheckChanged)); - check->addEventHandler( - impl::CHECK_CHANGED, WEAK_DELEGATE_THIS(onCheckChanged)); + setAtspiParams(*check); return check; } + void CheckOptionItem::setAtspiParams(ElmWidget &widget) + { + auto &checkAtspi = widget.getAtspi(); + auto &itemAtspi = *getItemAtspi(); + + checkAtspi.setTDomain(TEXT_DOMAIN); + checkAtspi.setRole(ELM_ATSPI_ROLE_TOGGLE_BUTTON); + checkAtspi.setDescription(STR_SR_SWITCH); + checkAtspi.addRelationship(ELM_ATSPI_RELATION_CONTROLLED_BY, + as_ao(itemAtspi)); + + itemAtspi.addRelationship(ELM_ATSPI_RELATION_CONTROLLER_FOR, + as_ao(checkAtspi)); + itemAtspi.addRelationship(ELM_ATSPI_RELATION_DESCRIBED_BY, + as_ao(checkAtspi)); + } + CString CheckOptionItem::getItemPartText(const EdjePart part) { if (part == impl::ITEM_PART_TITLE) { @@ -113,10 +134,10 @@ namespace call_setting { void CheckOptionItem::onCheckChanged(Widget &widget, void *eventInfo) { if (!isActive()) { - elm_check_state_set(widget, toEina(m_checkValue)); + elm_check_state_set(as_eo(widget), toEina(m_checkValue)); return; } - m_checkValue = elm_check_state_get(widget); + m_checkValue = elm_check_state_get(as_eo(widget)); syncOptionValue(); } @@ -179,7 +200,7 @@ namespace call_setting { if (const auto item = getItem()) { if (const auto check = dynamicWidgetCast<StyledWidget>( item.getContent(impl::ITEM_PART_CHECK))) { - elm_check_state_set(*check, toEina(m_checkValue)); + elm_check_state_set(as_eo(*check), toEina(m_checkValue)); } } } diff --git a/call-setting/presenters/items/base/CheckOptionItem.h b/call-setting/presenters/items/base/CheckOptionItem.h index 1bb5bf5..7e64168 100644 --- a/call-setting/presenters/items/base/CheckOptionItem.h +++ b/call-setting/presenters/items/base/CheckOptionItem.h @@ -25,37 +25,115 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(CheckOptionItem); + /** + * @brief Represents item with on/off indicator + */ class CheckOptionItem : public ucl::ListItemPresenter { protected: + + /** + * @brief Enumeration of item states + */ enum class State { - NORMAL, - PROCESSING + NORMAL, /**< Normal*/ + PROCESSING /**< Working*/ }; protected: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + */ CheckOptionItem(ucl::IRefCountObj &rc); + + /** + * @brief Default destructor + */ ~CheckOptionItem(); + + /** + * @brief Gets state + * @return Current state + */ virtual State getState() const = 0; + + /** + * @brief Gets option value + * @return Current option value. @see TriState + */ virtual TriState getOptionValue() const = 0; + + /** + * @brief Gets option title + * @return Title + */ virtual ucl::CString getOptionTitle() const = 0; + + /** + * @brief Checks if there is secondary text + * @return true if option has secondary text, false - if not + */ virtual bool hasOptionSubText() const; + + /** + * @brief Gets option sub text + * @return Sub text + */ virtual ucl::CString getOptionSubText() const; + + /** + * @brief Requests option value change + * @param[in] value Value + */ virtual void requestOptionValueChange(bool value) = 0; + /** + * @brief Prepares option data + */ void prepare(); + + /** + * @brief Updates option data + */ void update(); // ListItemPresenter // + /** + * @brief Gets GUI item insertion parameters + * @details Called just before item is added to list + * @return Item insertion params structure + */ virtual ItemInsertionParams getItemInsertionParams() final override; + /** + * @brief Occurs when GUI item is attached to this item presenter + * @details Called after getItemInsertionParams() at the end of + * item to list addition process. + */ virtual void onItemAttached() final override; + /** + * @brief Gets the content widget for specific GUI item part + * @param[in] part Target GUI item part + * @param[in] parent Parent widget to use for the content widget + * @return Shared reference to the content widget or NULL + */ virtual ucl::WidgetSRef getItemPartContent( ucl::EdjePart part, ucl::ElmWidget &parent) final override; + + /** + * @brief Gets text for specific GUI item part + * @param[in] part Target GUI item part + * @return Text for specific part or NULL + */ virtual ucl::CString getItemPartText(ucl::EdjePart part) final override; + /** + * @brief Occurs when GUI item is selected + */ virtual void onItemSelected() final override; private: @@ -68,6 +146,7 @@ namespace call_setting { void syncCheckValue(); void syncCheckValueForce(); void setCheckValue(bool value); + void setAtspiParams(ucl::ElmWidget &check); void syncItemEnabled(); diff --git a/call-setting/presenters/items/base/ListOptionItem.h b/call-setting/presenters/items/base/ListOptionItem.h index e59449a..322e28b 100644 --- a/call-setting/presenters/items/base/ListOptionItem.h +++ b/call-setting/presenters/items/base/ListOptionItem.h @@ -26,39 +26,102 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(ListOptionItem); + /** + * @brief Represents option item + */ class ListOptionItem : public ucl::ListItemPresenter { protected: + /** + * @brief Option entry + */ struct Option final { - int id; - ucl::TString text; + int id; /**< Option ID*/ + ucl::TString text; /**< Option name*/ + + /** + * @brief Constructor + * @param[in] optId Option ID + * @param[in] text Option name + */ Option(int optId, ucl::TString text) : id(optId), text(std::move(text)) { } }; + /** + * @brief List of options + */ using Options = std::list<Option>; protected: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + */ ListOptionItem(ucl::IRefCountObj &rc); + + /** + * @brief Default destructor + */ virtual ~ListOptionItem(); + /** + * @brief Gets option value + * @return Current option value + */ virtual int getOptionValue() const = 0; + + /** + * @brief Gets option title + * @return Title + */ virtual ucl::CString getOptionTitle() const = 0; + + /** + * @brief Requests option value change + * @param[in] value Value + */ virtual void requestOptionValueChange(int value) = 0; + /** + * @brief Updates option data + */ void update(); + + /** + * @brief Tries to dismiss dialog + */ void tryDismissDialog(); - void prepare(std::list<Option> options, + /** + * @brief Prepares option data + * @param[in] options List of options + * @param[in] dialogParent Shared reference to dialog parent + */ + void prepare(Options options, ucl::ElmWidgetSRef dialogParent); // ListItemPresenter // + /** + * @brief Gets GUI item insertion parameters + * @details Called just before item is added to list + * @return Item insertion params structure + */ virtual ItemInsertionParams getItemInsertionParams() final override; + /** + * @brief Gets text for specific GUI item part + * @param[in] part Target GUI item part + * @return Text for specific part or NULL + */ virtual ucl::CString getItemPartText(ucl::EdjePart part) final override; + /** + * @brief Occurs when GUI item is selected + */ virtual void onItemSelected() final override; private: diff --git a/call-setting/presenters/misc/AtspiHighlightHelper.cpp b/call-setting/presenters/misc/AtspiHighlightHelper.cpp new file mode 100644 index 0000000..f978dca --- /dev/null +++ b/call-setting/presenters/misc/AtspiHighlightHelper.cpp @@ -0,0 +1,148 @@ +/* + * Copyright 2017 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 "AtspiHighlightHelper.h" + +#include "call-setting/presenters/common.h" + +namespace call_setting { namespace { namespace impl { + + constexpr EoDataKey ATSPI_HELPER_DATA {"callui,atspi,highlight,helper"}; +}}} + +namespace call_setting { + + using ucl::AtspiGestureEventInfo; + using ucl::Atspi; + using ucl::ListItemPresenter; + + AtspiHighlightHelperSRef AtspiHighlightHelper::newInstance( + GuiPresenter &parent) + { + auto result = makeShared<AtspiHighlightHelper>(); + + FAIL_RETURN_VALUE(result->prepare(parent), {}, + "result->prepare() failed!"); + + return result; + } + + AtspiHighlightHelper::AtspiHighlightHelper(IRefCountObj &rc) : + GuiPresenter(rc) + { + } + + Result AtspiHighlightHelper::prepare(GuiPresenter &parent) + { + FAIL_RETURN(GuiPresenter::prepare(parent), + "GuiPresenter::prepare() failed!"); + + return RES_OK; + } + + void AtspiHighlightHelper::setEventHandler( + EventHandler handler) + { + m_eventHandler = handler; + } + + void AtspiHighlightHelper::registerObject(ElmWidget &widget) + { + widget.getAtspi().addGestureHandler( + WEAK_DELEGATE_THIS(onAtspiGesture)); + } + + void AtspiHighlightHelper::registerObject(ListItemPresenter &listItemPrs) + { + listItemPrs.setItemAtspiGestureHandler( + WEAK_DELEGATE_THIS(onAtspiGesture)); + } + + void AtspiHighlightHelper::handleAtspiGesture(Atspi &atspi, + AtspiGestureEventInfo &e) + { + Elm_Interface_Atspi_Accessible *currentAo = as_ao(atspi); + DLOG("Access object [%p]", currentAo); + + if (!isActive()) { + DLOG("Ignored. Presenter is not active"); + if ((e.gestureInfo.type != ELM_ATSPI_GESTURE_ONE_FINGER_SINGLE_TAP) + && (currentAo != as_ao(getWindow()))) { + DLOG("Prevent default handler"); + e.preventDefault = true; + } + return; + } + + e.stopPropagation = true; + e.preventDefault = false; + + const Elm_Atspi_Relation_Type relation = getFlowRelation(e.gestureInfo); + if (relation == ELM_ATSPI_RELATION_NULL) { + DLOG("Not supported gesture type for processing"); + return; + } + + const Elm_Interface_Atspi_Accessible *relationAo = nullptr; + if (const auto handler = m_eventHandler.lock()) { + relationAo = handler(currentAo, relation); + } + if (!relationAo) { + DLOG("Relation object is NULL"); + return; + } + DLOG("Relation object [%p]", relationAo); + + if (currentAo == as_ao(getWindow())) { + const auto fakeAtspi = getFakeAtspi(); + if (!fakeAtspi) { + LOG_RETURN_VOID(RES_FAIL, "fakeAtspi is NULL!"); + } + currentAo = as_ao(*fakeAtspi); + fakeAtspi->highlight(); + } + + Atspi currentAtspi {currentAo}; + currentAtspi.delRelationship(relation, nullptr); + currentAtspi.addRelationship(relation, relationAo); + } + + Atspi *AtspiHighlightHelper::getFakeAtspi() + { + auto &win = getWindow(); + auto widget = static_cast<ElmWidget *>(win.getData( + impl::ATSPI_HELPER_DATA)); + + if (!widget) { + const ElmWidgetSRef obj = util::createFakeAccessObject(win); + if (!obj) { + LOG_RETURN_VALUE(RES_FAIL, nullptr, + "createFakeAccessObject() failed!"); + } + obj->setIsOwner(false); + widget = obj.get(); + win.setData(impl::ATSPI_HELPER_DATA, widget); + } + + return &widget->getAtspi(); + } + + void AtspiHighlightHelper::onAtspiGesture(Atspi &atspi, + AtspiGestureEventInfo &eventInfo) + { + handleAtspiGesture(atspi, eventInfo); + } +} diff --git a/call-setting/presenters/misc/AtspiHighlightHelper.h b/call-setting/presenters/misc/AtspiHighlightHelper.h new file mode 100644 index 0000000..146c2ff --- /dev/null +++ b/call-setting/presenters/misc/AtspiHighlightHelper.h @@ -0,0 +1,93 @@ +/* + * Copyright 2017 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 __CALL_SETTING_PRESENTERS_MISC_ATSPI_HIGHLIGHT_HELPER_H__ +#define __CALL_SETTING_PRESENTERS_MISC_ATSPI_HIGHLIGHT_HELPER_H__ + +#include "ucl/mvp/GuiPresenter.h" +#include "ucl/mvp/ListItemPresenter.h" + +#include "call-setting/presenters/types.h" + +namespace call_setting { + + UCL_DECLARE_REF_ALIASES(AtspiHighlightHelper); + + /** + * @brief Represents helper presenter for Screen Reader feature + */ + class AtspiHighlightHelper final : public ucl::GuiPresenter { + public: + + /** + * @brief Event handler definition + */ + using EventHandler = ucl::WeakDelegate< + const Elm_Interface_Atspi_Accessible *( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation)>; + + public: + + /** + * @brief Creates new instance of AtspiHighlightHelper + * @param[in] parent Parent presenter + * @return Shared reference to AtspiHighlightHelper instance + * on success or NULL otherwise + */ + static AtspiHighlightHelperSRef newInstance(GuiPresenter &parent); + + /** + * @brief Sets event handler + * @param[in] handler Event handler + */ + void setEventHandler(EventHandler handler); + + /** + * @brief Registers widget for handling Atspi gesture events + * @param[in] widget Widget to register + */ + void registerObject(ucl::ElmWidget &widget); + + /** + * @brief Registers List Item presenter for handling Atspi + * gesture events + * @param[in] listItemPrs List item presenter to register + */ + void registerObject(ucl::ListItemPresenter &listItemPrs); + + private: + AtspiHighlightHelper(ucl::IRefCountObj &rc); + ~AtspiHighlightHelper() = default; + + ucl::Result prepare(GuiPresenter &parent); + + void handleAtspiGesture(ucl::Atspi &atspi, + ucl::AtspiGestureEventInfo &e); + + void onAtspiGesture(ucl::Atspi &atspi, + ucl::AtspiGestureEventInfo &eventInfo); + + ucl::Atspi *getFakeAtspi(); + + private: + EventHandler m_eventHandler; + + friend class ucl::ReffedObj<AtspiHighlightHelper>; + }; +} + +#endif // __CALL_SETTING_PRESENTERS_MISC_ATSPI_HIGHLIGHT_HELPER_H__ diff --git a/call-setting/presenters/misc/KeypadPresenter.cpp b/call-setting/presenters/misc/KeypadPresenter.cpp index ebca959..5d812de 100644 --- a/call-setting/presenters/misc/KeypadPresenter.cpp +++ b/call-setting/presenters/misc/KeypadPresenter.cpp @@ -18,7 +18,10 @@ #include <feedback.h> +#include "ucl/gui/helpers.h" + #include "call-setting/view/KeypadNumberBtn.h" +#include "call-setting/view/AoSequencer.h" #include "call-setting/resources.h" @@ -36,41 +39,65 @@ namespace call_setting { namespace { namespace impl { constexpr EdjePart PART_ENTRY {"swl.entry"}; constexpr EdjePart PART_GUIDE_TXT {"txt.guide"}; + constexpr EdjePart PART_AO_ENTRY {"ao.entry"}; + constexpr EoDataKey BTN_DATA_KEY {"__btn_data__"}; constexpr EdjeSignal SIGNAL_SHOW_GUIDE_TXT {"guide.txt.show"}; constexpr EdjeSignal SIGNAL_HIDE_GUIDE_TXT {"guide.txt.hide"}; constexpr EdjeSignalSrc SIGNAL_SRC_KEYPAD {"keypad"}; + const TString STR_EMPTY; + struct BtnInfo { - KeypadNumberBtn::Info info; + KeypadNumberBtn::Info baseInfo; EdjePart part; + const TString &srDesc; }; const BtnInfo BtnInfoList[] = { {{ElmStyle {"callsetting/keypad_00"}, "0", nullptr, nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.0"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.0"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_01"}, "1", nullptr, nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.1"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.1"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_02"}, "2", "ABC", nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.2"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.2"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_03"}, "3", "DFE", "#", - KeypadNumberBtn::SymbolState::BELOW}, EdjePart {"swl.btn.3"}}, + KeypadNumberBtn::SymbolState::BELOW}, EdjePart {"swl.btn.3"}, + STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL}, + {{ElmStyle {"callsetting/keypad_04"}, "4", "GHI", nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.4"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.4"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_05"}, "5", "JKL", "+", - KeypadNumberBtn::SymbolState::RIGHT}, EdjePart {"swl.btn.5"}}, + KeypadNumberBtn::SymbolState::RIGHT}, EdjePart {"swl.btn.5"}, + STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL}, + {{ElmStyle {"callsetting/keypad_06"}, "6", "MNO", nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.6"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.6"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_07"}, "7", "PQRS", "*", - KeypadNumberBtn::SymbolState::BELOW}, EdjePart {"swl.btn.7"}}, + KeypadNumberBtn::SymbolState::BELOW}, EdjePart {"swl.btn.7"}, + STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL}, + {{ElmStyle {"callsetting/keypad_08"}, "8", "TUV", nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.8"}}, + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.8"}, + STR_EMPTY}, + {{ElmStyle {"callsetting/keypad_09"}, "9", "WXYZ", nullptr, - KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.9"}} + KeypadNumberBtn::SymbolState::HIDDEN}, EdjePart {"swl.btn.9"}, + STR_EMPTY}, }; - constexpr int BTNS_COUNT = sizeof(BtnInfoList) / sizeof(BtnInfoList[0]); + constexpr auto ENTRY_ATSPI_TEXT_BUFFER_SIZE = 512; void *asData(const int index) { @@ -93,6 +120,7 @@ namespace call_setting { namespace { namespace impl { namespace call_setting { using ucl::Layout; + using ucl::Atspi; // KeypadPresenter::Builder // @@ -167,12 +195,18 @@ namespace call_setting { FAIL_RETURN(createEntry(number), "createEntry() failed!"); + FAIL_RETURN(createEntryAo(), + "createEntryAo() failed!"); + FAIL_RETURN(createBackspaceButton(), "createBackspaceButton() failed!"); FAIL_RETURN(createNumberButtons(), "createNumberButtons() failed!"); + FAIL_RETURN(createAtspiHighlightHelper(), + "createAtspiHighlightHelper() failed!"); + return RES_OK; } @@ -195,6 +229,8 @@ namespace call_setting { LOG_RETURN(RES_FAIL, "Layout::build() failed!"); } + setDeactivatorSink(m_widget); + m_widget->setText(STR_KEYPAD_GUIDE_TEXT, impl::PART_GUIDE_TXT); @@ -203,17 +239,21 @@ namespace call_setting { Result KeypadPresenter::createConfirmButton() { - auto eo = elm_button_add(*m_widget); + auto eo = elm_button_add(as_eo(*m_widget)); if (!eo) { LOG_RETURN(RES_FAIL, "eo is NULL"); } - auto confirmBtn = makeShared<StyledWidget>(eo, false); - m_widget->setContent(*confirmBtn, impl::PART_CONFIRM_BTN); + m_confirmBtn = makeShared<StyledWidget>(eo, false); + m_widget->setContent(*m_confirmBtn, impl::PART_CONFIRM_BTN); - confirmBtn->setStyle(impl::STYLE_BTN_CONFIRM); - confirmBtn->addEventHandler(BTN_CLICKED, + m_confirmBtn->setStyle(impl::STYLE_BTN_CONFIRM); + m_confirmBtn->addEventHandler(BTN_CLICKED, WEAK_DELEGATE_THIS(onConfirmBtnClicked)); + auto &atspi = m_confirmBtn->getAtspi(); + atspi.setTDomain(TEXT_DOMAIN); + atspi.setName(STR_SR_CONFIRM.getCStr()); + return RES_OK; } @@ -227,19 +267,23 @@ namespace call_setting { Result KeypadPresenter::createBackspaceButton() { - auto backspaceBtn = KeypadBackspaceBtn::newInstance(*m_widget); - if (!backspaceBtn) { + m_backspaceBtn = KeypadBackspaceBtn::newInstance(*m_widget); + if (!m_backspaceBtn) { LOG_RETURN(RES_FAIL, "m_backspaceBtn is NULL"); } - m_widget->setContent(*backspaceBtn, impl::PART_BACKSPACE_BTN); - backspaceBtn->setIsOwner(false); + m_widget->setContent(*m_backspaceBtn, impl::PART_BACKSPACE_BTN); + m_backspaceBtn->setIsOwner(false); - backspaceBtn->addEventHandler(BTN_CLICKED, + m_backspaceBtn->addEventHandler(BTN_CLICKED, WEAK_DELEGATE_THIS(onBackspaceBtnClicked)); - backspaceBtn->addEventHandler(CS_BTN_LONGPRESSED, + m_backspaceBtn->addEventHandler(CS_BTN_LONGPRESSED, WEAK_DELEGATE_THIS(onBackspaceLongPressed)); + auto &atspi = m_backspaceBtn->getAtspi(); + atspi.setTDomain(TEXT_DOMAIN); + atspi.setName(STR_SR_BACKSPACE.getCStr()); + return RES_OK; } @@ -270,6 +314,43 @@ namespace call_setting { if (!number.empty()) { m_entry->setNumber(number); } + m_entry->getAtspi().setHighlightable(false); + + return RES_OK; + } + + CString KeypadPresenter::onAtspiEntryNameCb(Atspi &atspi) + { + char buffer[impl::ENTRY_ATSPI_TEXT_BUFFER_SIZE] = { 0 }; + snprintf(buffer, sizeof(buffer), "%s, %s", + STR_SR_EDIT_BOX.translate(), + STR_SR_KEYPAD.translate()); + + return CString::dup(buffer); + } + + CString KeypadPresenter::onAtspiEntryDescriptionCb(Atspi &atspi) + { + auto number = m_entry->getNumber(); + char buffer[impl::ENTRY_ATSPI_TEXT_BUFFER_SIZE] = { 0 }; + snprintf(buffer, sizeof(buffer), "%s, %s", + (number.empty() ? STR_SR_EMPTY.translate() : number.c_str()), + STR_SR_EDITING.translate()); + + return CString::dup(buffer); + } + + Result KeypadPresenter::createEntryAo() + { + m_aoEntry = util::createAccessObject(*m_widget, impl::PART_AO_ENTRY); + + auto &atspi = m_aoEntry->getAtspi(); + + atspi.setReadingInfo(ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | + ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION); + + atspi.setNameCb(WEAK_DELEGATE_THIS(onAtspiEntryNameCb)); + atspi.setDescriptionCb(WEAK_DELEGATE_THIS(onAtspiEntryDescriptionCb)); return RES_OK; } @@ -287,21 +368,33 @@ namespace call_setting { Result KeypadPresenter::createNumberButtons() { - for (int i = 0; i < impl::BTNS_COUNT; i++) { + const auto btnsCount = sizeof(impl::BtnInfoList) / + sizeof(impl::BtnInfoList[0]); + for (int i = 0; i < btnsCount; i++) { + const auto &btnInfo = impl::BtnInfoList[i]; + auto btn = KeypadNumberBtn::newInstance(*m_widget, - impl::BtnInfoList[i].info); + btnInfo.baseInfo); if (!btn) { LOG_RETURN(RES_FAIL, "btn is NULL"); } - btn->setData(impl::BTN_DATA_KEY, impl::asData(i)); - m_widget->setContent(*btn, impl::BtnInfoList[i].part); + m_widget->setContent(*btn, btnInfo.part); btn->addEventHandler(BTN_CLICKED, WEAK_DELEGATE_THIS(onNumberBtnClicked)); btn->addEventHandler(CS_BTN_LONGPRESSED, WEAK_DELEGATE_THIS(onNumberBtnLongPressed)); + + auto &atspi = btn->getAtspi(); + atspi.setName(btnInfo.baseInfo.digit); + + if (isNotEmpty(btnInfo.srDesc)) { + atspi.setTDomain(TEXT_DOMAIN); + atspi.setDescription(btnInfo.srDesc.getCStr()); + } + m_numberBtns.emplace_back(std::move(btn)); } return RES_OK; @@ -310,13 +403,53 @@ namespace call_setting { void KeypadPresenter::onNumberBtnClicked(Widget &widget, void *eventInfo) { - m_entry->insert(impl::BtnInfoList[impl::getIndex(widget)].info.digit); + m_entry->insert(impl::BtnInfoList[impl::getIndex(widget)]. + baseInfo.digit); } void KeypadPresenter::onNumberBtnLongPressed(Widget &widget, void *eventInfo) { - m_entry->insert(impl::BtnInfoList[impl::getIndex(widget)].info.symbol); + m_entry->insert(impl::BtnInfoList[impl::getIndex(widget)]. + baseInfo.symbol); + } + + Elm_Interface_Atspi_Accessible *KeypadPresenter::getAccessObject( + bool isFlowsTo) + { + return (isFlowsTo ? as_ao(*m_numberBtns[0]) : as_ao(*m_backspaceBtn)); + } + + Result KeypadPresenter::createAtspiHighlightHelper() + { + m_atspiHelper = AtspiHighlightHelper::newInstance(*this); + if (!m_atspiHelper) { + LOG_RETURN(RES_FAIL, + "AtspiHighlightHelper::newInstance() failed!"); + } + + for (auto &btn: m_numberBtns) { + m_atspiHelper->registerObject(*btn); + } + m_atspiHelper->registerObject(*m_confirmBtn); + m_atspiHelper->registerObject(*m_backspaceBtn); + m_atspiHelper->registerObject(*m_aoEntry); + + m_atspiHelper->setEventHandler(WEAK_DELEGATE_THIS(onAtspiHighlight)); + + return RES_OK; + } + + const Elm_Interface_Atspi_Accessible *KeypadPresenter::onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation) + { + return AoSequencer(ao, flowRelation) + .processEach(m_numberBtns) + .process(*m_confirmBtn) + .process(*m_aoEntry) + .process(*m_backspaceBtn) + .getNext(); } } diff --git a/call-setting/presenters/misc/KeypadPresenter.h b/call-setting/presenters/misc/KeypadPresenter.h index 75aae7b..d293cdc 100644 --- a/call-setting/presenters/misc/KeypadPresenter.h +++ b/call-setting/presenters/misc/KeypadPresenter.h @@ -23,8 +23,11 @@ #include "ucl/gui/StyledWidget.h" #include "ucl/misc/Timeout.h" -#include "call-setting/view/KeypadEntry.h" #include "call-setting/view/KeypadBackspaceBtn.h" +#include "call-setting/view/KeypadEntry.h" +#include "call-setting/view/KeypadNumberBtn.h" + +#include "AtspiHighlightHelper.h" #include "call-setting/presenters/types.h" @@ -94,10 +97,22 @@ namespace call_setting { /** * @brief Gets widget - * @return Widget object. @see ucl::Widget + * @return Reference to Widget object */ ucl::Widget &getWidget(); + /** + * @brief Gets access object by accessibility flow direction to/from + * current object + * @remark This function can be used for external object request when + * external object handles Atspi event on change + * Screen Reader highlight on next/previous object. + * @param[in] isFlowsTo Defines whether external object handles + * flows to or from highlight change event + * @return Access object on success, otherwise NULL + */ + Elm_Interface_Atspi_Accessible *getAccessObject(bool isFlowsTo); + private: KeypadPresenter(ucl::IRefCountObj &rc, NotiHandler handler, @@ -113,6 +128,8 @@ namespace call_setting { ucl::Result createBackspaceButton(); ucl::Result createNumberButtons(); ucl::Result createEntry(const std::string &number); + ucl::Result createEntryAo(); + ucl::Result createAtspiHighlightHelper(); void onNumberBtnClicked(ucl::Widget &widget, void *eventInfo); void onNumberBtnLongPressed(ucl::Widget &widget, void *eventInfo); @@ -121,11 +138,23 @@ namespace call_setting { void onEntryChanged(ucl::Widget &widget, void *eventInfo); void onConfirmBtnClicked(ucl::Widget &widget, void *eventInfo); + ucl::CString onAtspiEntryNameCb(ucl::Atspi &atspi); + ucl::CString onAtspiEntryDescriptionCb(ucl::Atspi &atspi); + + const Elm_Interface_Atspi_Accessible *onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *current, + Elm_Atspi_Relation_Type flowRelation); + private: const NotiHandler m_completeHandler; ucl::LayoutSRef m_widget; + AtspiHighlightHelperSRef m_atspiHelper; + std::vector<KeypadNumberBtnSRef> m_numberBtns; + KeypadBackspaceBtnSRef m_backspaceBtn; + ucl::StyledWidgetSRef m_confirmBtn; KeypadEntrySRef m_entry; + ucl::ElmWidgetSRef m_aoEntry; friend class ucl::ReffedObj<KeypadPresenter>; }; diff --git a/call-setting/presenters/misc/MoreOptionsPresenter.cpp b/call-setting/presenters/misc/MoreOptionsPresenter.cpp index 7a5fe69..f04c304 100644 --- a/call-setting/presenters/misc/MoreOptionsPresenter.cpp +++ b/call-setting/presenters/misc/MoreOptionsPresenter.cpp @@ -123,7 +123,7 @@ namespace call_setting { FAIL_RETURN(GuiPresenter::prepare(parent, PF_DEACTIVATOR), "GuiPresenter::prepare() failed!"); - Evas_Object *const more = eext_more_option_add(parentWidget); + Evas_Object *const more = eext_more_option_add(as_eo(parentWidget)); if (!more) { LOG_RETURN(RES_FAIL, "eext_more_option_add() failed!"); } @@ -154,7 +154,7 @@ namespace call_setting { Result MoreOptionsPresenter::addItem(const Option &option) { - const auto item = eext_more_option_item_append(*m_widget); + const auto item = eext_more_option_item_append(as_eo(*m_widget)); if (!item) { LOG_RETURN(RES_FAIL, "eext_more_option_item_append() failed!"); } @@ -168,7 +168,7 @@ namespace call_setting { LOG_RETURN(RES_FAIL, "Layout::build() failed!"); } eext_more_option_item_part_content_set(item, - impl::PART_ICON.name, *icon); + impl::PART_ICON.name, as_eo(*icon)); } impl::setText(item, option.text, impl::PART_MAIN_TEXT); @@ -258,12 +258,12 @@ namespace call_setting { void MoreOptionsPresenter::setOpened(const bool isOpened) { m_timeout.reset(); - eext_more_option_opened_set(*m_widget, toEina(isOpened)); + eext_more_option_opened_set(as_eo(*m_widget), toEina(isOpened)); } bool MoreOptionsPresenter::isOpened() const { - return eext_more_option_opened_get(*m_widget); + return eext_more_option_opened_get(as_eo(*m_widget)); } void MoreOptionsPresenter::setOpenedDelayed( diff --git a/call-setting/presenters/misc/ProcessingPresenter.cpp b/call-setting/presenters/misc/ProcessingPresenter.cpp index 0dbe9e8..767ec1e 100644 --- a/call-setting/presenters/misc/ProcessingPresenter.cpp +++ b/call-setting/presenters/misc/ProcessingPresenter.cpp @@ -29,6 +29,7 @@ namespace call_setting { namespace { namespace impl { {"layout", "callsetting", "proccessing"}; constexpr EdjePart PART_PROGRESS {"callsetting.swallow.progress"}; + constexpr EdjePart PART_TEXT_AO {"elm.text"}; constexpr EdjeSignal SIGNAL_SHOW {"callsetting,show"}; constexpr EdjeSignal SIGNAL_SHOW_BG {"callsetting,show,bg"}; @@ -39,7 +40,7 @@ namespace call_setting { namespace { namespace impl { constexpr EdjeSignal SIGNAL_ANIMATE_CHECK {"callsetting,animate,check"}; - constexpr ElmStyle PROGRESS_STYLE {"process"}; + constexpr ElmStyle PROGRESS_STYLE {"process/small"}; }}} namespace call_setting { @@ -47,8 +48,6 @@ namespace call_setting { using ucl::Layout; using ucl::Timeout; - using ucl::PART_TEXT; - // ProcessingPresenter::Builder // ProcessingPresenter::Builder::Builder() : @@ -113,7 +112,7 @@ namespace call_setting { ProcessingPresenter::~ProcessingPresenter() { if (m_widget) { - eext_object_event_callback_del(*m_widget, EEXT_CALLBACK_BACK, + eext_object_event_callback_del(as_eo(*m_widget), EEXT_CALLBACK_BACK, CALLBACK_A(ProcessingPresenter::onHWBackKey)); } if (const auto window = getWindowRef()) { @@ -133,9 +132,12 @@ namespace call_setting { FAIL_RETURN(createWidget(parent, processingText), "createWidget() failed!"); FAIL_RETURN(moveWidget(), "moveWidget() failed!"); - FAIL_RETURN(createProgress(), "createProgress() failed!"); + FAIL_RETURN(createTextAo(processingText), "createTextAo() failed!"); + FAIL_RETURN(createAtspiHighlightHelper(), + "createAtspiHighlightHelper() failed!"); + if (forceProgress) { showProgress(); } else { @@ -146,7 +148,7 @@ namespace call_setting { LOG_RETURN(RES_FAIL, "resetTimer() failed!"); } } - eext_object_event_callback_add(*m_widget, EEXT_CALLBACK_BACK, + eext_object_event_callback_add(as_eo(*m_widget), EEXT_CALLBACK_BACK, CALLBACK_A(ProcessingPresenter::onHWBackKey), this); getWindow().addEventHandler( @@ -167,11 +169,29 @@ namespace call_setting { LOG_RETURN(RES_FAIL, "Layout::build() failed!"); } + setDeactivatorSink(m_widget); + m_widget->setText(processingText); return RES_OK; } + Result ProcessingPresenter::createTextAo(const TString &processingText) + { + m_textAo = util::createAccessObject(*m_widget.get(), + impl::PART_TEXT_AO); + if (!m_textAo) { + LOG_RETURN(RES_FAIL, "util::createAccessObject() failed!"); + } + + auto &atspi = m_textAo->getAtspi(); + atspi.setTDomain(TEXT_DOMAIN); + atspi.setName(processingText.getCStr()); + atspi.setReadingInfo(ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + + return RES_OK; + } + Result ProcessingPresenter::moveWidget() { const auto win = m_widget->getWindow(); @@ -190,17 +210,19 @@ namespace call_setting { Result ProcessingPresenter::createProgress() { - Evas_Object *const progressEo = elm_progressbar_add(*m_widget); + Evas_Object *const progressEo = elm_progressbar_add(as_eo(*m_widget)); if (!progressEo) { LOG_RETURN(RES_FAIL, "elm_progressbar_add() failed!"); } - StyledWidget progress{progressEo}; + StyledWidget progress{progressEo, false}; progress.setStyle(impl::PROGRESS_STYLE); m_widget->setContent(progress, impl::PART_PROGRESS); - elm_progressbar_pulse(progress, EINA_TRUE); + elm_progressbar_pulse(progressEo, EINA_TRUE); show(progress); + progress.getAtspi().setHighlightable(false); + return RES_OK; } @@ -218,6 +240,8 @@ namespace call_setting { { m_widget->emit(impl::SIGNAL_SHOW); + show(*m_textAo); + m_state = State::PROCESSING; m_mayFinish = false; @@ -234,6 +258,8 @@ namespace call_setting { m_widget->emit(impl::SIGNAL_HIDE_PROGRESS); + hide(*m_textAo); + ToastDialog::Builder builder; builder.setText(std::move(m_completeText)); if (m_iconType == IconType::CHECK) { @@ -303,8 +329,28 @@ namespace call_setting { m_iconType = iconType; m_selfRef = asShared(*this); + tryFinish(); + } + + Result ProcessingPresenter::createAtspiHighlightHelper() + { + m_atspiHelper = AtspiHighlightHelper::newInstance(*this); + if (!m_atspiHelper) { + LOG_RETURN(RES_FAIL, + "AtspiHighlightHelper::newInstance() failed!"); + } + m_atspiHelper->registerObject(getWindow()); + m_atspiHelper->registerObject(*m_textAo); + + m_atspiHelper->setEventHandler(WEAK_DELEGATE_THIS(onAtspiHighlight)); + return RES_OK; + } - tryFinish(); + const Elm_Interface_Atspi_Accessible *ProcessingPresenter::onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation) + { + return as_ao(m_textAo); } } diff --git a/call-setting/presenters/misc/ProcessingPresenter.h b/call-setting/presenters/misc/ProcessingPresenter.h index 1f1d3e1..27b769a 100644 --- a/call-setting/presenters/misc/ProcessingPresenter.h +++ b/call-setting/presenters/misc/ProcessingPresenter.h @@ -24,6 +24,8 @@ #include "ucl/mvp/GuiPresenter.h" +#include "call-setting/presenters/misc/AtspiHighlightHelper.h" + #include "call-setting/presenters/types.h" namespace call_setting { @@ -118,6 +120,7 @@ namespace call_setting { const ucl::TString &processingText); ucl::Result moveWidget(); ucl::Result createProgress(); + ucl::Result createTextAo(const ucl::TString &processingText); bool resetTimeout(double timeout); void showProgress(); @@ -128,6 +131,11 @@ namespace call_setting { void onTimeout(ucl::Timeout *sender); void onWindowDel(ucl::Widget &widget, void *eventInfo); + ucl::Result createAtspiHighlightHelper(); + const Elm_Interface_Atspi_Accessible *onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation); + private: enum class State { IDLING, @@ -142,6 +150,8 @@ namespace call_setting { ucl::TString m_completeText; IconType m_iconType; ProcessingPresenterSRef m_selfRef; + AtspiHighlightHelperSRef m_atspiHelper; + ucl::ElmWidgetSRef m_textAo; ucl::TimeoutSRef m_timeout; State m_state; diff --git a/call-setting/presenters/misc/SelectModePresenter.cpp b/call-setting/presenters/misc/SelectModePresenter.cpp index 00320a1..45a405f 100644 --- a/call-setting/presenters/misc/SelectModePresenter.cpp +++ b/call-setting/presenters/misc/SelectModePresenter.cpp @@ -103,7 +103,8 @@ namespace call_setting { FAIL_RETURN(GuiPresenter::prepare(parent, PF_DEACTIVATOR), "GuiPresenter::prepare() failed!"); - m_selectButton = makeShared<StyledWidget>(elm_button_add(*m_content)); + m_selectButton = makeShared<StyledWidget>( + elm_button_add(as_eo(*m_content))); m_selectButton->setStyle(impl::SELECT_BTN_STYLE); m_content->set(*m_selectButton, PageContent::Part::SELECT_BUTTON); m_content->setSelectButtonVisible(false); @@ -114,7 +115,7 @@ namespace call_setting { if ((m_flags & FLAG_NO_BOTTOM_BUTTON) == 0) { m_bottomButton = makeShared<StyledWidget>( - elm_button_add(*m_content)); + elm_button_add(as_eo(*m_content))); m_bottomButton->setStyle(impl::BOTTOM_BTN_STYLE); hide(*m_bottomButton); @@ -251,10 +252,10 @@ namespace call_setting { { m_isPopupDismissed = false; - m_popup = makeShared<StyledWidget>(elm_ctxpopup_add(*m_content)); + m_popup = makeShared<StyledWidget>(elm_ctxpopup_add(as_eo(*m_content))); m_popup->setStyle(impl::SELECT_POPUP_STYLE); - elm_ctxpopup_direction_priority_set(*m_popup, + elm_ctxpopup_direction_priority_set(as_eo(*m_popup), ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP); @@ -262,13 +263,13 @@ namespace call_setting { WidgetItem deselectItem; if (m_selectCount < m_totalCount) { - selectItem = WidgetItem{elm_ctxpopup_item_append(*m_popup, + selectItem = WidgetItem{elm_ctxpopup_item_append(as_eo(*m_popup), STR_SELECT_ALL.translate(), nullptr, CALLBACK_A( SelectModePresenter::onSelectAll), this)}; } if (m_selectCount > 0) { - deselectItem = WidgetItem{elm_ctxpopup_item_append(*m_popup, + deselectItem = WidgetItem{elm_ctxpopup_item_append(as_eo(*m_popup), STR_DESELECT_ALL.translate(), nullptr, CALLBACK_A( SelectModePresenter::onDeselectAll), this)}; } @@ -285,7 +286,7 @@ namespace call_setting { m_popup->addEventHandler( POPUP_DISMISSED, WEAK_DELEGATE_THIS(onPopupDismissed)); - eext_object_event_callback_add(*m_popup, EEXT_CALLBACK_BACK, + eext_object_event_callback_add(as_eo(*m_popup), EEXT_CALLBACK_BACK, CALLBACK_A(SelectModePresenter::onPopupHWBackKey), this); broadcastDeactivate(); @@ -309,14 +310,14 @@ namespace call_setting { { if (m_popup && !m_isPopupDismissed) { m_isPopupDismissed = true; - elm_ctxpopup_dismiss(*m_popup); + elm_ctxpopup_dismiss(as_eo(*m_popup)); } } void SelectModePresenter::deletePopup() { if (m_popup) { - eext_object_event_callback_del(*m_popup, EEXT_CALLBACK_BACK, + eext_object_event_callback_del(as_eo(*m_popup), EEXT_CALLBACK_BACK, CALLBACK_A(SelectModePresenter::onPopupHWBackKey)); m_popup.reset(); @@ -349,7 +350,7 @@ namespace call_setting { void SelectModePresenter::onSelectAll( Evas_Object *obj, void *eventInfo) { - if (m_popup && (m_popup->getEo() == obj)) { + if (as_eo(m_popup) == obj) { dismissPopup(); dispatchEvent(Event::SELECT_ALL); } @@ -358,7 +359,7 @@ namespace call_setting { void SelectModePresenter::onDeselectAll( Evas_Object *obj, void *eventInfo) { - if (m_popup && (m_popup->getEo() == obj)) { + if (as_eo(m_popup) == obj) { dismissPopup(); dispatchEvent(Event::DESELECT_ALL); } diff --git a/call-setting/presenters/pages/BlockListPage.cpp b/call-setting/presenters/pages/BlockListPage.cpp index 4e843da..d27744b 100644 --- a/call-setting/presenters/pages/BlockListPage.cpp +++ b/call-setting/presenters/pages/BlockListPage.cpp @@ -112,10 +112,11 @@ namespace call_setting { makeListItems(std::move(blockUnknown)); - item = getNaviframe().push(getContent()); + item = getNaviframe().push(STR_BLOCK_LIST_PAGE_TITLE, getContent()); if (!item) { LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } + item.setTitleEnabled(false); return RES_OK; } diff --git a/call-setting/presenters/pages/BlockListPage.h b/call-setting/presenters/pages/BlockListPage.h index f5a6d5c..08557b5 100644 --- a/call-setting/presenters/pages/BlockListPage.h +++ b/call-setting/presenters/pages/BlockListPage.h @@ -28,14 +28,50 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(BlockListPage); + /** + * @brief BlockList page + */ class BlockListPage final : public Page { public: + + /** + * @brief Provides set of instruments for creation of BlockListPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return BlockListPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets model object + * @param[in] model Shared reference to BlockUnknownCallers object + * @return BlockListPage::Builder object + */ Builder &setModel(BlockUnknownCallersSRef model); + + /** + * @brief Sets model object + * @param[in] model Shared reference to BlockedNumbers object + * @return BlockListPage::Builder object + */ Builder &setModel(BlockedNumbersSRef model); + + /** + * @brief Creates BlockListPage object + * @param[in] onExitRequest Exit request handler + * @return Weak reference to BlockListPage object + */ BlockListPageWRef build(ExitRequestHandler onExitRequest) const; private: diff --git a/call-setting/presenters/pages/BlockedNumbersPage.cpp b/call-setting/presenters/pages/BlockedNumbersPage.cpp index e7ed4ae..f7792b1 100644 --- a/call-setting/presenters/pages/BlockedNumbersPage.cpp +++ b/call-setting/presenters/pages/BlockedNumbersPage.cpp @@ -16,6 +16,8 @@ #include "BlockedNumbersPage.h" +#include "call-setting/view/AoSequencer.h" + #include "call-setting/presenters/misc/ProcessingPresenter.h" #include "call-setting/resources.h" @@ -32,6 +34,7 @@ namespace call_setting { namespace { namespace impl { namespace call_setting { using ucl::ListPresenter; + using ucl::ListItemPresenter; using ucl::NaviItem; using ucl::NaviframeSRef; using ucl::IPickerHost; @@ -58,6 +61,11 @@ namespace call_setting { return *m_item; } + const SimpleListItem &getItem() const + { + return *m_item; + } + private: ~Item() = default; @@ -71,7 +79,7 @@ namespace call_setting { BlockedNumbers::Item m_model; SimpleListItemSRef m_item; - friend class ucl::ReffedObj<Item>; + friend class ReffedObj<Item>; }; // BlockedNumbersPage::Builder // @@ -150,13 +158,19 @@ namespace call_setting { FAIL_RETURN(makeList(), "makeList() failed!"); FAIL_RETURN(makeMoreOptions(), "makeMoreOptions() failed!"); FAIL_RETURN(makeSelectMode(), "makeSelectMode() failed!"); + FAIL_RETURN(makeAtspiHighlightHelper(), + "makeAtspiHighlightHelper() failed!"); makeListItems(); - item = getNaviframe().push(getContent()); + registerAccessObjects(); + + item = getNaviframe().push(STR_BLOCKED_NUMBERS_PAGE_TITLE, + getContent()); if (!item) { LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } + item.setTitleEnabled(false); getWindow().addEventHandler( INSTANCE_RESUMED, WEAK_DELEGATE_THIS(onInstanceResumed)); @@ -189,6 +203,7 @@ namespace call_setting { STR_DELETE, nullptr, getImageTheme(ICON_MORE_OPT_DELETE)}). build(*this); + if (!m_more) { LOG_RETURN(RES_FAIL, "MoreOptionsPresenter::build() failed!"); } @@ -216,7 +231,8 @@ namespace call_setting { void BlockedNumbersPage::makeListItems() { - m_list->append(*makeTitleListItem(STR_BLOCKED_NUMBERS_PAGE_TITLE)); + m_titleItem = makeTitleListItem(STR_BLOCKED_NUMBERS_PAGE_TITLE); + m_list->append(*m_titleItem); m_model->forEachItem(DELEGATE_THIS(onEachItem)); @@ -232,6 +248,8 @@ namespace call_setting { void BlockedNumbersPage::remakeListItems() { + m_titleItem.reset(); + m_items.clear(); m_list->clear(); @@ -240,7 +258,7 @@ namespace call_setting { void BlockedNumbersPage::updateListItems() { - elm_genlist_realized_items_update(m_list->getWidget()); + m_list->getWidget().updateRealizedItems(); } void BlockedNumbersPage::switchToSelectMode() @@ -433,4 +451,55 @@ namespace call_setting { break; } } + + Result BlockedNumbersPage::makeAtspiHighlightHelper() + { + m_atspiHelper = AtspiHighlightHelper::newInstance(*this); + if (!m_atspiHelper) { + LOG_RETURN(RES_FAIL, + "AtspiHighlightHelper::newInstance() failed!"); + } + + m_atspiHelper->setEventHandler(WEAK_DELEGATE_THIS(onAtspiHighlight)); + + return RES_OK; + } + + const Elm_Interface_Atspi_Accessible *BlockedNumbersPage::onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation) + { + if (!m_isInSelectMode) { + return nullptr; + } + + return AoSequencer(ao, flowRelation) + .process(*m_titleItem) + .process(m_smp->getSelectButton()) + .process(*m_items.front()) + .processDefault() + .process(*m_items.back()) + .process(m_smp->getBottomButton()) + .getNext(); + } + + void BlockedNumbersPage::registerAccessObjects() + { + m_atspiHelper->registerObject(getWindow()); + + m_atspiHelper->registerObject(m_smp->getBottomButton()); + m_atspiHelper->registerObject(m_smp->getSelectButton()); + + m_atspiHelper->registerObject(*m_titleItem); + m_atspiHelper->registerObject(m_items.front()->getItem()); + m_atspiHelper->registerObject(m_items.back()->getItem()); + } + + // Non-member functions // + + const Elm_Interface_Atspi_Accessible *as_ao( + const BlockedNumbersPage::Item &item) + { + return as_ao(item.getItem()); + } } diff --git a/call-setting/presenters/pages/BlockedNumbersPage.h b/call-setting/presenters/pages/BlockedNumbersPage.h index bfccbef..73cf68e 100644 --- a/call-setting/presenters/pages/BlockedNumbersPage.h +++ b/call-setting/presenters/pages/BlockedNumbersPage.h @@ -23,6 +23,7 @@ #include "call-setting/model/BlockedNumbers.h" +#include "call-setting/presenters/misc/AtspiHighlightHelper.h" #include "call-setting/presenters/misc/MoreOptionsPresenter.h" #include "call-setting/presenters/misc/SelectModePresenter.h" @@ -30,16 +31,46 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(BlockedNumbersPage); + /** + * @brief Blocked numbers page + */ class BlockedNumbersPage final : public Page, private ucl::IPickerHost, private MoreOptionsPresenter::IListener, private SelectModePresenter::IListener { public: + + /** + * @brief Provides set of instruments for creation of BlockedNumbersPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return BlockedNumbersPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets model object + * @param[in] model Shared reference to voicemail object + * @return BlockedNumbersPage::Builder object + */ Builder &setModel(BlockedNumbersSRef model); + + /** + * @brief Creates BlockedNumbersPage object + * @param[in] handler Exit request handler + * @return Weak reference to BlockedNumbersPage object + */ BlockedNumbersPageWRef build(ExitRequestHandler handler) const; private: @@ -64,6 +95,7 @@ namespace call_setting { ucl::Result makeList(); ucl::Result makeMoreOptions(); ucl::Result makeSelectMode(); + ucl::Result makeAtspiHighlightHelper(); void makeListItems(); bool onEachItem(BlockedNumbers::Item modelItem); @@ -83,6 +115,11 @@ namespace call_setting { void onModelItemsChanged(); void onInstanceResumed(ucl::Widget &sender, void *eventInfo); + void registerAccessObjects(); + const Elm_Interface_Atspi_Accessible *onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation); + // GuiPresenter // virtual void onActivateBy(const DeactivatorInfo &info) final override; @@ -116,12 +153,17 @@ namespace call_setting { MoreOptionsPresenterSRef m_more; SelectModePresenterSRef m_smp; + AtspiHighlightHelperSRef m_atspiHelper; + + ucl::ListItemPresenterSRef m_titleItem; std::vector<ItemSRef> m_items; int m_selectCount; bool m_isInSelectMode; friend class ucl::ReffedObj<BlockedNumbersPage>; + + friend const Elm_Interface_Atspi_Accessible *as_ao(const Item &item); }; } diff --git a/call-setting/presenters/pages/KeypadPage.cpp b/call-setting/presenters/pages/KeypadPage.cpp index 459ece2..4c75b41 100644 --- a/call-setting/presenters/pages/KeypadPage.cpp +++ b/call-setting/presenters/pages/KeypadPage.cpp @@ -16,6 +16,8 @@ #include "KeypadPage.h" +#include "call-setting/resources.h" + #include "call-setting/presenters/common.h" namespace call_setting { @@ -81,6 +83,23 @@ namespace call_setting { Result KeypadPage::doPrepare(NaviItem &item) { + FAIL_RETURN(createKeypadPresenter(), + "createKeypadPresenter() failed!"); + + FAIL_RETURN(createAtspiHighlightHelper(), + "createAtspiHighlightHelper() failed!"); + + item = getNaviframe().push(STR_SR_KEYPAD, getContent()); + if (!item) { + LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); + } + item.setTitleEnabled(false); + + return RES_OK; + } + + Result KeypadPage::createKeypadPresenter() + { m_keypadPrs = KeypadPresenter::Builder(). setNumber(m_model->getNumber()). setCompleteHandler(WEAK_DELEGATE_THIS(onKeypadComplete)). @@ -92,11 +111,6 @@ namespace call_setting { } getContent().set(m_keypadPrs->getWidget()); - item = getNaviframe().push(getContent()); - if (!item) { - LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); - } - return RES_OK; } @@ -109,5 +123,25 @@ namespace call_setting { requestExit(); } + Result KeypadPage::createAtspiHighlightHelper() + { + m_atspiHelper = AtspiHighlightHelper::newInstance(*this); + if (!m_atspiHelper) { + LOG_RETURN(RES_FAIL, "AtspiHighlightHelper::newInstance() failed!"); + } + m_atspiHelper->registerObject(getWindow()); + + m_atspiHelper->setEventHandler(WEAK_DELEGATE_THIS(onAtspiHighlight)); + + return RES_OK; + } + + const Elm_Interface_Atspi_Accessible *KeypadPage::onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation) + { + return m_keypadPrs->getAccessObject(true); + } + } diff --git a/call-setting/presenters/pages/KeypadPage.h b/call-setting/presenters/pages/KeypadPage.h index 7c62581..25d8b60 100644 --- a/call-setting/presenters/pages/KeypadPage.h +++ b/call-setting/presenters/pages/KeypadPage.h @@ -19,6 +19,7 @@ #include "base/Page.h" +#include "call-setting/presenters/misc/AtspiHighlightHelper.h" #include "call-setting/presenters/misc/KeypadPresenter.h" #include "call-setting/model/Voicemail.h" @@ -27,14 +28,43 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(KeypadPage); + /** + * @brief Page with keypad + */ class KeypadPage final : public Page { public: + /** + * @brief Provides set of instruments for creation of KeypadPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return KeypadPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets model object + * @param[in] model Shared reference to voicemail object + * @return KeypadPage::Builder object + */ Builder &setModel(VoicemailSRef model); + + /** + * @brief Creates KeypadPage object + * @param[in] onExitRequest Exit request handler + * @return Weak reference to KeypadPage object + */ KeypadPageWRef build(ExitRequestHandler onExitRequest) const; private: @@ -51,11 +81,19 @@ namespace call_setting { ~KeypadPage() = default; ucl::Result doPrepare(ucl::NaviItem &item); + + ucl::Result createKeypadPresenter(); void onKeypadComplete(); + ucl::Result createAtspiHighlightHelper(); + const Elm_Interface_Atspi_Accessible *onAtspiHighlight( + const Elm_Interface_Atspi_Accessible *ao, + Elm_Atspi_Relation_Type flowRelation); + private: const VoicemailSRef m_model; KeypadPresenterSRef m_keypadPrs; + AtspiHighlightHelperSRef m_atspiHelper; friend class ucl::ReffedObj<KeypadPage>; }; diff --git a/call-setting/presenters/pages/MainPage.cpp b/call-setting/presenters/pages/MainPage.cpp index a861486..17c6a01 100644 --- a/call-setting/presenters/pages/MainPage.cpp +++ b/call-setting/presenters/pages/MainPage.cpp @@ -28,6 +28,7 @@ namespace call_setting { + using ucl::Atspi; using ucl::ListPresenter; using ucl::NaviItem; using ucl::NaviframeSRef; @@ -88,7 +89,8 @@ namespace call_setting { CallSettingSRef callSetting, Private) : Page(rc, std::move(navi), std::move(onExitRequest)), - m_callSetting(std::move(callSetting)) + m_callSetting(std::move(callSetting)), + m_isRefreshProcessing(false) { } @@ -108,6 +110,8 @@ namespace call_setting { LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } + getItemAtspi().setNameCb(WEAK_DELEGATE_THIS(onAtspiNameCb)); + tryRefreshCallWaiting(); return RES_OK; @@ -161,7 +165,17 @@ namespace call_setting { m_processing->complete( STR_NETWORK_OR_SIM_ERROR_TOAST_MESSAGE); m_processing.reset(); + return; } + + m_isRefreshProcessing = true; + } + + CString MainPage::onAtspiNameCb(Atspi &atspi) + { + return CString::dup(m_isRefreshProcessing ? + STR_OPENING_POPUP_MESSAGE.translate() : + STR_MAIN_PAGE_TITLE.translate()); } void MainPage::onVoicemailItemSelected() @@ -196,8 +210,11 @@ namespace call_setting { void MainPage::onCallWaitingResult(Result result) { + m_isRefreshProcessing = false; + if (isGood(result)) { m_processing->complete(); + util::resetAtspiHighlight(getWindow()); } else { RESLOG(result, "Setting update failed"); m_processing->complete( @@ -206,5 +223,4 @@ namespace call_setting { m_processing.reset(); } - } diff --git a/call-setting/presenters/pages/MainPage.h b/call-setting/presenters/pages/MainPage.h index 5c4e416..c907090 100644 --- a/call-setting/presenters/pages/MainPage.h +++ b/call-setting/presenters/pages/MainPage.h @@ -29,13 +29,43 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(MainPage); + /** + * @brief Main page + */ class MainPage final : public Page { public: + + /** + * @brief Provides set of instruments for creation of MainPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return NoContenMainPagetPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets CallSetting object + * @param[in] callSetting Shared reference to CallSetting object + * @return NoContenMainPagetPage::Builder object + */ Builder &setCallSetting(CallSettingSRef callSetting); + + /** + * @brief Creates MainPage object + * @param[in] onExitRequest Exit request handler + * @return Weak reference to MainPage object + */ MainPageWRef build(ExitRequestHandler onExitRequest) const; private: @@ -61,6 +91,7 @@ namespace call_setting { void onBlockListItemSelected(); void onPageExitRequest(Page &page); void onCallWaitingResult(ucl::Result result); + ucl::CString onAtspiNameCb(ucl::Atspi &atspi); private: CallSettingSRef m_callSetting; @@ -69,6 +100,8 @@ namespace call_setting { PageWRef m_page; + bool m_isRefreshProcessing; + friend class ucl::ReffedObj<MainPage>; }; } diff --git a/call-setting/presenters/pages/NoContentPage.cpp b/call-setting/presenters/pages/NoContentPage.cpp index be9f9da..dfda60b 100644 --- a/call-setting/presenters/pages/NoContentPage.cpp +++ b/call-setting/presenters/pages/NoContentPage.cpp @@ -124,10 +124,16 @@ namespace call_setting { layout->setText(title, PART_TITLE); layout->setText(text); - item = getNaviframe().push(getContent()); + auto &atspi = layout->getAtspi(); + atspi.setRole(ELM_ATSPI_ROLE_TEXT); + atspi.setReadingInfo(ELM_ACCESSIBLE_READING_INFO_TYPE_NAME); + + item = getNaviframe().push(STR_BLOCKED_NUMBERS_PAGE_TITLE, + getContent()); if (!item) { LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } + item.setTitleEnabled(false); return RES_OK; } diff --git a/call-setting/presenters/pages/NoContentPage.h b/call-setting/presenters/pages/NoContentPage.h index 28c8c8a..c2ce8af 100644 --- a/call-setting/presenters/pages/NoContentPage.h +++ b/call-setting/presenters/pages/NoContentPage.h @@ -23,15 +23,57 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(NoContentPage); + /** + * @brief Page with no content + */ class NoContentPage final : public Page { public: + + /** + * @brief Provides set of instruments for creation of NoContentPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return NoContentPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets page title + * @param[in] title Page title + * @return NoContentPage::Builder object + */ Builder &setTitle(ucl::TString title); + + /** + * @brief Sets page text + * @param[in] text Page text + * @return NoContentPage::Builder object + */ Builder &setText(ucl::TString text); + + /** + * @brief Sets page icon theme + * @param[in] theme Icon theme + * @return NoContentPage::Builder object + */ Builder &setIconTheme(ucl::LayoutTheme theme); + + /** + * @brief Creates NoContentPage object + * @param[in] onExitRequest Exit request handler + * @return Weak reference to NoContentPage object + */ NoContentPageWRef build(ExitRequestHandler onExitRequest) const; private: ucl::NaviframeSRef m_navi; diff --git a/call-setting/presenters/pages/VoicemailPage.cpp b/call-setting/presenters/pages/VoicemailPage.cpp index 1a5922e..4921fa1 100644 --- a/call-setting/presenters/pages/VoicemailPage.cpp +++ b/call-setting/presenters/pages/VoicemailPage.cpp @@ -138,10 +138,11 @@ namespace call_setting { makeListItems(); - item = getNaviframe().push(getContent()); + item = getNaviframe().push(STR_VOICEMAIL_PAGE_TITLE, getContent()); if (!item) { LOG_RETURN(RES_FAIL, "Naviframe::push() failed!"); } + item.setTitleEnabled(false); return RES_OK; } diff --git a/call-setting/presenters/pages/VoicemailPage.h b/call-setting/presenters/pages/VoicemailPage.h index d670b9c..3fce276 100644 --- a/call-setting/presenters/pages/VoicemailPage.h +++ b/call-setting/presenters/pages/VoicemailPage.h @@ -27,14 +27,43 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(VoicemailPage); + /** + * @brief Voicemail page + */ class VoicemailPage final : public Page { public: + /** + * @brief Provides set of instruments for creation of VoicemailPage + * object with set of options + */ class Builder final { public: + + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets naviframe object + * @param[in] navi Shared reference to naviframe object + * @return VoicemailPage::Builder object + */ Builder &setNaviframe(ucl::NaviframeSRef navi); + + /** + * @brief Sets model object + * @param[in] model Shared reference to voicemail object + * @return VoicemailPage::Builder object + */ Builder &setModel(VoicemailSRef model); + + /** + * @brief Creates VoicemailPage object + * @param[in] onExitRequest Exit request handler + * @return Weak reference to VoicemailPage object + */ VoicemailPageWRef build(ExitRequestHandler onExitRequest) const; private: diff --git a/call-setting/presenters/pages/base/Page.cpp b/call-setting/presenters/pages/base/Page.cpp index a914426..0455f30 100644 --- a/call-setting/presenters/pages/base/Page.cpp +++ b/call-setting/presenters/pages/base/Page.cpp @@ -27,6 +27,7 @@ namespace call_setting { namespace { namespace impl { namespace call_setting { + using ucl::Atspi; using ucl::Layout; using ucl::NaviItem; using ucl::NaviframeSRef; @@ -76,7 +77,7 @@ namespace call_setting { } Evas_Object *content = m_item.getContent(); - if (content != *m_content) { + if (content != as_eo(*m_content)) { dispose(); LOG_RETURN(RES_FAIL, "content is not m_content"); } @@ -172,7 +173,7 @@ namespace call_setting { } } - void Page::createCircleObject(Evas_Object *const owner, + void Page::createCircleObject(ElmWidget &owner, const Elm_Scroller_Policy hPolicy, const Elm_Scroller_Policy vPolicy) { @@ -184,12 +185,13 @@ namespace call_setting { } m_content->set(*layout, PageContent::Part::CIRCLE_OBJECT); - auto surface = eext_circle_surface_layout_add(*layout); + auto surface = eext_circle_surface_layout_add(as_eo(*layout)); - const auto type = evas_object_type_get(owner); + const auto type = evas_object_type_get(as_eo(owner)); if (ucl::strCmpSafe(type, impl::GENLIST_TYPE) == 0) { - m_circleObject = eext_circle_object_genlist_add(owner, surface); + m_circleObject = eext_circle_object_genlist_add(as_eo(owner), + surface); eext_circle_object_genlist_scroller_policy_set( m_circleObject, hPolicy, vPolicy); } else { @@ -272,4 +274,17 @@ namespace call_setting { { updateRotaryActiveState(); } + + Atspi &Page::getItemAtspi() + { + ensureItemAtspi(); + return *m_itemAtspi; + } + + void Page::ensureItemAtspi() + { + if (!m_itemAtspi) { + m_itemAtspi = makeShared<Atspi>(m_item); + } + } } diff --git a/call-setting/presenters/pages/base/Page.h b/call-setting/presenters/pages/base/Page.h index 521a86d..4ae926d 100644 --- a/call-setting/presenters/pages/base/Page.h +++ b/call-setting/presenters/pages/base/Page.h @@ -29,58 +29,162 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(Page); + /** + * @brief Base class for Pages + */ class Page : public ucl::GuiPresenter, public ucl::IDisposable { public: using ExitRequestHandler = ucl::WeakDelegate<void(Page &page)>; public: + /** + * @brief Gets naviframe. @see ucl::Naviframe + * @return Naviframe object + */ ucl::Naviframe &getNaviframe(); + /** + * @brief Checks if Page is at top of stack + * @return true if at top + */ bool isAtTop() const; + + /** + * @brief Checks if Page is at bottom of stack + * @return true if at bottom + */ bool isAtBottom() const; + /** + * @brief Closes current page + */ void exit(); + /** + * @brief Pops pages of the naviframe till this page + */ void popTo(); + + /** + * @brief Deletes pages of the naviframe till this page + */ void deleteTo(); + + /** + * @brief Set object higher in stack + */ void promote(); + /** + * @brief Inserts NaviItem after this page. @see Naviframe::insertAfter + */ template <class ...ARGS> ucl::NaviItem insertAfter(ARGS &&...args); + /** + * @brief Inserts NaviItem before this page. + * @see Naviframe::insertBefore + */ template <class ...ARGS> ucl::NaviItem insertBefore(ARGS &&...args); // ucl::IDisposable // + /** + * @brief Disposes object + */ virtual void dispose() override; + + /** + * @brief Checks if object disposed + */ virtual bool isDisposed() const final override; protected: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] navi Shared reference to Naviframe object + * @param[in] onExitRequest Exit request handler + */ Page(ucl::IRefCountObj &rc, ucl::NaviframeSRef navi, ExitRequestHandler onExitRequest); + + /** + * @brief Default destructor + */ ~Page(); + /** + * @brief Prepares content + * @param[in] onPrepare Prepare callback + * @param[in] contentFlags Content flags + * @return RES_OK on success, otherwise an error code on failure + */ template <class ON_PREPARE> ucl::Result prepare(ON_PREPARE &&onPrepare, int contentFlags = 0); + /** + * @brief Gets NaviItem + * @return NaviItem object + */ ucl::NaviItem getItem(); + + /** + * @brief Gets page content + * @return Page content + */ PageContent &getContent(); - void createCircleObject(Evas_Object *owner, + /** + * @brief Creates circler object + * @param[in] owner Owner widget + * @param[in] hPolicy Horizontal tracking policy + * @param[in] vPolicy Vertical tracking policy + */ + void createCircleObject(ucl::ElmWidget &owner, Elm_Scroller_Policy hPolicy = ELM_SCROLLER_POLICY_OFF, Elm_Scroller_Policy vPolicy = ELM_SCROLLER_POLICY_AUTO); + + /** + * @brief Updates rotary object state + */ void updateRotaryActiveState(); + /** + * @brief Requests application exit + */ void requestExit(); + /** + * @brief Back key callback + */ virtual void onBackKey(); + + /** + * @brief Checks if active rotary object needed + * @return true needed + */ virtual bool isNeedRotaryActivate() const; + /** + * @brief Gets Atspi of navi item of this page + * @return Reference to Atspi of navi item + */ + ucl::Atspi &getItemAtspi(); + // GuiPresenter // + /** + * @brief Activation callback + */ virtual void onActivate() override; + + /** + * @brief Deactivation callback + */ virtual void onDeactivate() override; private: @@ -91,6 +195,8 @@ namespace call_setting { void updateActiveState(); + void ensureItemAtspi(); + void onTransitionStarted(ucl::Widget &widget, void *eventInfo); void onTransitionFinished(ucl::Widget &widget, void *eventInfo); void onTopPageChanged(ucl::Widget &widget, void *eventInfo); @@ -102,6 +208,7 @@ namespace call_setting { const ucl::NaviframeSRef m_navi; const ExitRequestHandler m_onExitRequest; ucl::NaviItem m_item; + ucl::AtspiSRef m_itemAtspi; PageContentSRef m_content; PageSRef m_selfRef; Evas_Object *m_circleObject; diff --git a/call-setting/presenters/types.h b/call-setting/presenters/types.h index 851f117..234cb2d 100644 --- a/call-setting/presenters/types.h +++ b/call-setting/presenters/types.h @@ -23,6 +23,9 @@ namespace call_setting { + /** + * @brief Map of text-containing edje parts + */ using PartTextMap = ucl::HashMap<ucl::EdjePart, ucl::TString>; } diff --git a/call-setting/resources.cpp b/call-setting/resources.cpp index 76d5c85..5c1c774 100644 --- a/call-setting/resources.cpp +++ b/call-setting/resources.cpp @@ -78,4 +78,28 @@ namespace call_setting { const TString STR_KEYPAD_GUIDE_TEXT { "WDS_CST_BODY_VOICEMAIL_NUMBER", TEXT_DOMAIN}; + + const TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL { + "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL", TEXT_DOMAIN}; + const TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL { + "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL", TEXT_DOMAIN}; + const TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL { + "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL", TEXT_DOMAIN}; + const TString STR_SR_CONFIRM { + "IDS_ST_BODY_CONFIRM", TEXT_DOMAIN}; + const TString STR_SR_BACKSPACE { + "WDS_WMGR_TBOPT_BACKSPACE", TEXT_DOMAIN}; + const TString STR_SR_EDIT_BOX { + "WDS_WMGR_TBOPT_EDIT_BOX", TEXT_DOMAIN}; + const TString STR_SR_KEYPAD { + "WDS_WMGR_TBOPT_KEYPAD", TEXT_DOMAIN}; + const TString STR_SR_EMPTY { + "WDS_ACCS_TBOPT_EMPTY", TEXT_DOMAIN}; + const TString STR_SR_EDITING { + "WDS_WMGR_TBOPT_EDITING", TEXT_DOMAIN}; + + const TString STR_SR_SWITCH { + "WDS_ALM_TBOPT_SWITCH", TEXT_DOMAIN}; + const TString STR_SR_RADIO_BUTTON { + "IDS_ACCS_TBOPT_RADIO_BUTTON", TEXT_DOMAIN}; } diff --git a/call-setting/resources.h b/call-setting/resources.h index 359e7d9..44a7f80 100644 --- a/call-setting/resources.h +++ b/call-setting/resources.h @@ -60,6 +60,20 @@ namespace call_setting { extern const ucl::TString STR_NUMBER_SETTING_ITEM_SUB_TEXT; extern const ucl::TString STR_KEYPAD_GUIDE_TEXT; + + extern const ucl::TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL; + extern const ucl::TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL; + extern const ucl::TString STR_SR_DOUBLE_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL; + extern const ucl::TString STR_SR_CONFIRM; + extern const ucl::TString STR_SR_BACKSPACE; + extern const ucl::TString STR_SR_EDIT_BOX; + extern const ucl::TString STR_SR_KEYPAD; + extern const ucl::TString STR_SR_EMPTY; + extern const ucl::TString STR_SR_EDITING; + + extern const ucl::TString STR_SR_SWITCH; + extern const ucl::TString STR_SR_RADIO_BUTTON; + } #endif // __CALL_SETTING_RESOURCES_H__ diff --git a/call-setting/view/AoSequencer.cpp b/call-setting/view/AoSequencer.cpp new file mode 100644 index 0000000..dfdca2f --- /dev/null +++ b/call-setting/view/AoSequencer.cpp @@ -0,0 +1,82 @@ +/* + * Copyright 2017 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 "AoSequencer.h" + +#include "common.h" + +namespace call_setting { + + AoSequencer::AoSequencer( + const Elm_Interface_Atspi_Accessible *const current, + const Elm_Atspi_Relation_Type flowRelation) : + m_current(current), + m_flowRelation(flowRelation), + + m_last(nullptr), + m_next(nullptr), + + m_isNextSet(false), + m_isCurrentFound(false), + m_isComplete(false) + { + } + + void AoSequencer::doProcessAo( + const Elm_Interface_Atspi_Accessible *const itemAo) + { + switch (m_flowRelation) { + case ELM_ATSPI_RELATION_FLOWS_TO: + + if (itemAo == m_current) { + setNext(itemAo); + m_isCurrentFound = true; + return; + } + if (m_isCurrentFound) { + setNext(itemAo); + m_isComplete = true; + return; + } + break; + + case ELM_ATSPI_RELATION_FLOWS_FROM: + + if (itemAo == m_current) { + setNext(m_isNextSet ? m_last : itemAo); + m_isComplete = true; + return; + } + m_last = itemAo; + break; + + default: + WLOG("Unknown: %d;", m_flowRelation); + break; + } + + if (!m_isNextSet) { + setNext(itemAo); + } + } + + void AoSequencer::setNext( + const Elm_Interface_Atspi_Accessible *const itemAo) + { + m_next = itemAo; + m_isNextSet = true; + } +} diff --git a/call-setting/view/AoSequencer.h b/call-setting/view/AoSequencer.h new file mode 100644 index 0000000..149096f --- /dev/null +++ b/call-setting/view/AoSequencer.h @@ -0,0 +1,103 @@ +/* + * Copyright 2017 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 __CALL_SETTING_VIEW_AO_SEQUENCER_H__ +#define __CALL_SETTING_VIEW_AO_SEQUENCER_H__ + +#include "ucl/gui/Atspi.h" + +#include "types.h" + +namespace call_setting { + + UCL_DECLARE_REF_ALIASES(KeypadNumberBtn); + + /** + * @brief Finds next object in the Access objects highlight flow sequence + */ + class AoSequencer final : private ucl::NonCopyable { + public: + /** + * @brief Constructor + * @param[in] current Currently focused Access object + * @param[in] flowRelation Flow relation for finding next Access object + */ + AoSequencer(const Elm_Interface_Atspi_Accessible *current, + Elm_Atspi_Relation_Type flowRelation); + + /** + * @brief Denotes break in sequence for allowing system default flow + */ + AoSequencer &processDefault(); + + /** + * @brief Passes next object in flow sequence + * @param[in] item Item in highlight flow sequence. Any object for which + * as_ao() function may be called. NULL is ignored. + */ + template <class ITEM> + AoSequencer &process(const ITEM &item); + + /** + * @brief Passes next object list in flow sequence + * @param[in] items Item list in highlight flow sequence. + */ + template <class ITEMS> + AoSequencer &processEach(const ITEMS &items); + + /** + * @brief Passes next object range in flow sequence + * @param[in] begin Begin iterator of the range + * @param[in] end End iterator of the range + */ + template <class ITERATOR> + AoSequencer &processEach(ITERATOR begin, ITERATOR end); + + /** + * @brief Gets next Acces object in highlight flow sequence + * @details Result is base on constructor parameters and processed + * sequence. Result may change during processing. + * If current object was not found in the processed sequence + * first object from the sequence is returned. If it is not + * possible to get next object (current is already last) then + * current object is returned. NULL is returned for default + * processing. + * @return Next access object in highlight flow sequence + */ + const Elm_Interface_Atspi_Accessible *getNext(); + + private: + template <class ITEM> + void doProcess(const ITEM &item); + void doProcessAo(const Elm_Interface_Atspi_Accessible *itemAo); + void setNext(const Elm_Interface_Atspi_Accessible *itemAo); + + private: + const Elm_Interface_Atspi_Accessible *const m_current; + const Elm_Atspi_Relation_Type m_flowRelation; + + const Elm_Interface_Atspi_Accessible *m_last; + const Elm_Interface_Atspi_Accessible *m_next; + + bool m_isNextSet; + bool m_isCurrentFound; + bool m_isComplete; + }; +} + +#include "AoSequencer.hpp" + +#endif // __CALL_SETTING_VIEW_AO_SEQUENCER_H__ diff --git a/call-setting/view/AoSequencer.hpp b/call-setting/view/AoSequencer.hpp new file mode 100644 index 0000000..eb6c0e3 --- /dev/null +++ b/call-setting/view/AoSequencer.hpp @@ -0,0 +1,78 @@ +/* + * Copyright 2017 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. + */ + +namespace call_setting { + + inline AoSequencer &AoSequencer::processDefault() + { + if (!m_isComplete) { + doProcessAo(nullptr); + } + return *this; + } + + template <class ITEM> + inline AoSequencer &AoSequencer::process(const ITEM &item) + { + if (!m_isComplete) { + doProcess(item); + } + return *this; + } + + template <class ITEMS> + inline AoSequencer &AoSequencer::processEach(const ITEMS &items) + { + if (!m_isComplete) { + for (const auto &item: items) { + doProcess(item); + if (m_isComplete) { + break; + } + } + } + return *this; + } + + template <class ITERATOR> + inline AoSequencer &AoSequencer::processEach( + const ITERATOR begin, const ITERATOR end) + { + if (!m_isComplete) { + for (auto it = begin; it != end; ++it) { + doProcess(*it); + if (m_isComplete) { + break; + } + } + } + return *this; + } + + inline const Elm_Interface_Atspi_Accessible *AoSequencer::getNext() + { + return m_next; + } + + template <class ITEM> + inline void AoSequencer::doProcess(const ITEM &item) + { + using ucl::as_ao; + if (const auto itemAo = as_ao(item)) { + doProcessAo(itemAo); + } + } +} diff --git a/call-setting/view/KeypadBackspaceBtn.cpp b/call-setting/view/KeypadBackspaceBtn.cpp index 064a240..ade2747 100644 --- a/call-setting/view/KeypadBackspaceBtn.cpp +++ b/call-setting/view/KeypadBackspaceBtn.cpp @@ -31,7 +31,7 @@ namespace call_setting { KeypadBackspaceBtnSRef KeypadBackspaceBtn::newInstance(ElmWidget &parent) { - Evas_Object *eo = elm_button_add(parent); + Evas_Object *eo = elm_button_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "eo is NULL"); } diff --git a/call-setting/view/KeypadBackspaceBtn.h b/call-setting/view/KeypadBackspaceBtn.h index 7805420..263ea7f 100644 --- a/call-setting/view/KeypadBackspaceBtn.h +++ b/call-setting/view/KeypadBackspaceBtn.h @@ -25,18 +25,45 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(KeypadBackspaceBtn); - class KeypadBackspaceBtn final: public ucl::ElmWidget { + /** + * @brief Implements keypad backspace button + */ + class KeypadBackspaceBtn final : public ucl::ElmWidget { public: + + /** + * @brief Creates KeypadBackspaceBtn object + * @param[in] parent Parent widget + * @return KeypadBackspaceBtn object + */ static KeypadBackspaceBtnSRef newInstance(ucl::ElmWidget &parent); protected: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] eo Pointer to Evas object + */ KeypadBackspaceBtn(ucl::IRefCountObj &rc, Evas_Object *eo, Private); + + /** + * @brief Destructor + */ virtual ~KeypadBackspaceBtn() = default; + /** + * @brief Prepares data + */ void prepare(); + /** + * @brief Tap-n-hold callback + * @param[in] x X tap coordinate + * @param[in] y Y tap coordinate + */ void onTapAndHold(int x, int y); private: diff --git a/call-setting/view/KeypadEntry.cpp b/call-setting/view/KeypadEntry.cpp index 60acdb1..a425e1e 100644 --- a/call-setting/view/KeypadEntry.cpp +++ b/call-setting/view/KeypadEntry.cpp @@ -32,7 +32,7 @@ namespace call_setting { KeypadEntrySRef KeypadEntry::newInstance(ucl::ElmWidget &parent) { - auto eo = elm_entry_add(parent); + auto eo = elm_entry_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "eo is NULL"); } @@ -59,10 +59,10 @@ namespace call_setting { digitsFilterData.accepted = "0123456789*#+"; digitsFilterData.rejected = nullptr; - elm_entry_single_line_set(*m_entry, EINA_TRUE); - elm_entry_editable_set(*m_entry, EINA_FALSE); - elm_entry_scrollable_set(*m_entry, EINA_TRUE); - elm_entry_markup_filter_append(*m_entry, + elm_entry_single_line_set(as_eo(*m_entry), EINA_TRUE); + elm_entry_editable_set(as_eo(*m_entry), EINA_FALSE); + elm_entry_scrollable_set(as_eo(*m_entry), EINA_TRUE); + elm_entry_markup_filter_append(as_eo(*m_entry), elm_entry_filter_accept_set, &digitsFilterData); m_entry->addEventHandler(ENTRY_CHANGED, @@ -76,41 +76,41 @@ namespace call_setting { std::string KeypadEntry::getNumber() const { - return nz(elm_entry_entry_get(*m_entry)); + return nz(elm_entry_entry_get(as_eo(*m_entry))); } void KeypadEntry::setNumber(const std::string &number) { - elm_entry_entry_set(*m_entry, number.c_str()); - elm_entry_cursor_line_end_set(*m_entry); + elm_entry_entry_set(as_eo(*m_entry), number.c_str()); + elm_entry_cursor_line_end_set(as_eo(*m_entry)); } void KeypadEntry::insert(const char *c) { - elm_entry_entry_insert(*m_entry, c); + elm_entry_entry_insert(as_eo(*m_entry), c); } void KeypadEntry::erase() { - if (!elm_entry_selection_get(*m_entry)) { - int pos = elm_entry_cursor_pos_get(*m_entry); + if (!elm_entry_selection_get(as_eo(*m_entry))) { + int pos = elm_entry_cursor_pos_get(as_eo(*m_entry)); if (pos > 0) { - elm_entry_select_region_set(*m_entry, pos - 1, pos); + elm_entry_select_region_set(as_eo(*m_entry), pos - 1, pos); } } - elm_entry_entry_insert(*m_entry, ""); + elm_entry_entry_insert(as_eo(*m_entry), ""); } void KeypadEntry::clear() { - elm_entry_entry_set(*m_entry, ""); + elm_entry_entry_set(as_eo(*m_entry), ""); } int KeypadEntry::calcFontSize() const { int entryWidth = 0; int textWidth = 0; - auto textblock = elm_entry_textblock_get(*m_entry); + auto textblock = elm_entry_textblock_get(as_eo(*m_entry)); m_entry->getGeometry(nullptr, nullptr, &entryWidth, nullptr); evas_object_textblock_size_native_get(textblock, &textWidth, nullptr); @@ -133,13 +133,13 @@ namespace call_setting { snprintf(buffer, sizeof(buffer), "DEFAULT='font=Tizen:style=Regular" " font_size=%d color=#ffffff align=center'", m_fontSize); - elm_entry_text_style_user_pop(*m_entry); - elm_entry_text_style_user_push(*m_entry, buffer); + elm_entry_text_style_user_pop(as_eo(*m_entry)); + elm_entry_text_style_user_push(as_eo(*m_entry), buffer); } void KeypadEntry::onChanged(Widget &widget, void *eventInfo) { - std::string newText = nz(elm_entry_entry_get(*m_entry)); + std::string newText = nz(elm_entry_entry_get(as_eo(*m_entry))); // XXX This check is used to avoid recursive font // size recalculation when entry text does not changed diff --git a/call-setting/view/KeypadEntry.h b/call-setting/view/KeypadEntry.h index ce362af..1c2f488 100644 --- a/call-setting/view/KeypadEntry.h +++ b/call-setting/view/KeypadEntry.h @@ -25,14 +25,45 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(KeypadEntry); - class KeypadEntry final: public ucl::ElmWidget { + /** + * @brief Implements keypad entry + */ + class KeypadEntry final : public ucl::ElmWidget { public: + + /** + * @brief Creates KeypadEntry object + * @param[in] parent Parent widget + * @return KeypadEntry object + */ static KeypadEntrySRef newInstance(ucl::ElmWidget &parent); + /** + * @brief Gets number + * @return Number string + */ std::string getNumber() const; + + /** + * @brief Sets number + * @param[in] number Number string + */ void setNumber(const std::string &number); + + /** + * @brief Inserts a character + * @param[in] c Character + */ void insert(const char *c); + + /** + * @brief Erases character + */ void erase(); + + /** + * @brief Clears string + */ void clear(); private: diff --git a/call-setting/view/KeypadNumberBtn.cpp b/call-setting/view/KeypadNumberBtn.cpp index f82f6db..6b16314 100644 --- a/call-setting/view/KeypadNumberBtn.cpp +++ b/call-setting/view/KeypadNumberBtn.cpp @@ -35,7 +35,7 @@ namespace call_setting { KeypadNumberBtnSRef KeypadNumberBtn::newInstance(ucl::ElmWidget &parent, const Info &info) { - Evas_Object *eo = elm_button_add(parent); + Evas_Object *eo = elm_button_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "eo is NULL"); } diff --git a/call-setting/view/KeypadNumberBtn.h b/call-setting/view/KeypadNumberBtn.h index b585384..8d13cd3 100644 --- a/call-setting/view/KeypadNumberBtn.h +++ b/call-setting/view/KeypadNumberBtn.h @@ -25,34 +25,71 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(KeypadNumberBtn); - class KeypadNumberBtn final: public ucl::ElmWidget { + /** + * @brief Implements keypad number button + */ + class KeypadNumberBtn final : public ucl::ElmWidget { public: + + /** + * @brief Enumeration of locations of additional symbols + */ enum class SymbolState { - HIDDEN, - BELOW, - RIGHT + HIDDEN, /**< No symbols*/ + BELOW, /**< Below letters*/ + RIGHT /**< To the right of the letters*/ }; + /** + * @brief Button data structure + */ struct Info { - ucl::ElmStyle style; - const char *digit; - const char *letters; - const char *symbol; - SymbolState symbolState; + ucl::ElmStyle style; /**< Style*/ + const char *digit; /**< Digit symbol*/ + const char *letters; /**< Letters*/ + const char *symbol; /**< Special symbols*/ + SymbolState symbolState; /**< Symbol State*/ }; public: + + /** + * @brief Creates instance of KeypadNumberBtn + * @param[in] parent Pointer to parent widget + * @param[in] info Key info + * @return Shared reference to KeypadNumberBtn + */ static KeypadNumberBtnSRef newInstance(ucl::ElmWidget &parent, const Info &info); protected: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] eo Evas object pointer + * @param[in] info Key info + */ KeypadNumberBtn(ucl::IRefCountObj &rc, Evas_Object *eo, const Info &info, Private); + + /** + * @brief Default destructor + */ virtual ~KeypadNumberBtn() = default; + /** + * @brief Prepares key data + */ void prepare(const Info &info); + + /** + * @brief Tap-n-hold callback + * @param[in] x X tap coordinate + * @param[in] y Y tap coordinate + */ void onTapAndHold(int x, int y); private: diff --git a/call-setting/view/PageContent.cpp b/call-setting/view/PageContent.cpp index 19b90bb..92ffa43 100644 --- a/call-setting/view/PageContent.cpp +++ b/call-setting/view/PageContent.cpp @@ -92,7 +92,7 @@ namespace call_setting { PageContent::PageContent(IRefCountObj &rc, Layout *const layout, const int flags, Private) : - ElmWidget(&rc, *layout), + ElmWidget(&rc, as_eo(*layout)), m_mainLayout(layout) { prepare(flags); @@ -129,12 +129,12 @@ namespace call_setting { } } - Result PageContent::set(Evas_Object *const eo, const Part part) + Result PageContent::set(Widget &widget, const Part part) { return doWithPart(part, - [eo](Layout &layout, const EdjePart part) + [&widget](Layout &layout, const EdjePart part) { - layout.setContent(eo, part); + layout.setContent(widget, part); }); } diff --git a/call-setting/view/PageContent.h b/call-setting/view/PageContent.h index cf3b518..6c4b097 100644 --- a/call-setting/view/PageContent.h +++ b/call-setting/view/PageContent.h @@ -25,40 +25,98 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(PageContent); + /** + * @brief Provides set of instruments to manipulate page contents + */ class PageContent final : public ucl::ElmWidget { public: + /** + * @brief Provides set of instruments for creation of PageContent + * object with set of options + */ class Builder final { public: + /** + * @brief Default constructor + */ Builder(); + + /** + * @brief Sets flags + * @param[in] flags Flags + * @return SelectModePresenter::Builder object + */ Builder &setFlags(int flags); + + /** + * @brief Creates PageContent object + * @param[in] parent Parent presenter + * @return Shared reference to PageContent object + */ PageContentSRef build(ucl::ElmWidget &parent) const; private: int m_flags; }; + /** + * @brief Enumeration of flags + */ enum { - FLAG_SELECT_BUTTON = 1, - FLAG_BOTTOM_BUTTON = 2, + FLAG_SELECT_BUTTON = 1, /**< Select button flag*/ + FLAG_BOTTOM_BUTTON = 2, /**< Bottom button flag*/ - FLAGS_SELECT_MODE = (FLAG_SELECT_BUTTON | FLAG_BOTTOM_BUTTON), - FLAGS_ALL = FLAGS_SELECT_MODE + FLAGS_SELECT_MODE = + (FLAG_SELECT_BUTTON | FLAG_BOTTOM_BUTTON), /**< Select mode flag*/ + FLAGS_ALL = FLAGS_SELECT_MODE /**< All flags*/ }; + /** + * @brief Enumeration of parts + */ enum class Part { - DEFAULT, - CIRCLE_OBJECT, - MORE_OPTIONS, - SELECT_BUTTON, - BOTTOM_BUTTON + DEFAULT, /**< Default*/ + CIRCLE_OBJECT, /**< Circle object*/ + MORE_OPTIONS, /**< More option button*/ + SELECT_BUTTON, /**< Selector button*/ + BOTTOM_BUTTON /**< Bottom button*/ }; public: - ucl::Result set(Evas_Object *eo, Part part = Part::DEFAULT); + + /** + * @brief Sets Evas object to part + * @param[in] widget Widget. @see ucl::Widget + * @param[in] part Part + * @return ListOptionDialog::Builder object + */ + ucl::Result set(ucl::Widget &widget, Part part = Part::DEFAULT); + + /** + * @brief Clears part + * @param[in] part Part + * @return Evas object pointer + */ Evas_Object *unset(Part part = Part::DEFAULT); + /** + * @brief Gets part + * @param[in] part Part + * @return Evas object pointer + */ Evas_Object *get(Part part = Part::DEFAULT) const; + /** + * @brief Sets select button visible + * @param[in] visible Value + * @return RES_OK on success, otherwise an error code on failure + */ ucl::Result setSelectButtonVisible(bool visible); + + /** + * @brief Sets More options part visible + * @param[in] visible Value + * @return RES_OK on success, otherwise an error code on failure + */ ucl::Result setMoreOptionsVisible(bool visible); private: diff --git a/call-setting/view/TouchParser.cpp b/call-setting/view/TouchParser.cpp index 68b8aad..6501e3c 100644 --- a/call-setting/view/TouchParser.cpp +++ b/call-setting/view/TouchParser.cpp @@ -32,11 +32,12 @@ namespace call_setting { RefCountAware(&rc), m_holdTimer(nullptr), m_downTime(0), - m_downX(0), - m_downY(0), + m_baseX(0), + m_baseY(0), m_tapCounter(0), m_isMouseDown(false), - m_isTapPossible(false) + m_isTapPossible(false), + m_isBaseCoordinatesSet(false) { eventSource.addEventHandler(WidgetEvent::MOUSE_DOWN, WEAK_DELEGATE_THIS(onMouseDown)); @@ -82,16 +83,24 @@ namespace call_setting { restartHoldTimer(); } else if (m_tapCounter == 1) { if (const auto handler = m_doubleTapHandler.lock()) { - handler(m_downX, m_downY); + handler(m_baseX, m_baseY); } } m_downTime = e->timestamp; - m_downX = e->canvas.x; - m_downY = e->canvas.y; + m_isBaseCoordinatesSet = false; m_isTapPossible = true; } + void TouchParser::tryUpdateBaseCoordinates(int x, int y) + { + if (!m_isBaseCoordinatesSet) { + m_isBaseCoordinatesSet = true; + m_baseX = x; + m_baseY = y; + } + } + void TouchParser::onMouseUp(Widget &widget, void *eventInfo) { if (!m_isMouseDown) { @@ -99,9 +108,11 @@ namespace call_setting { } m_isMouseDown = false; + stopHoldTimer(); + const auto e = static_cast<Evas_Event_Mouse_Up *>(eventInfo); + tryUpdateBaseCoordinates(e->canvas.x, e->canvas.y); - stopHoldTimer(); updateIsTapPossible(e->event_flags, e->canvas.x, e->canvas.y); if (!m_isTapPossible) { @@ -123,6 +134,7 @@ namespace call_setting { } const auto e = static_cast<Evas_Event_Mouse_Move *>(eventInfo); + tryUpdateBaseCoordinates(e->cur.canvas.x, e->cur.canvas.y); updateIsTapPossible(e->event_flags, e->cur.canvas.x, e->cur.canvas.y); @@ -153,8 +165,8 @@ namespace call_setting { double TouchParser::calcDownDistance(int curX, int curY) const { - const auto dx = (curX - m_downX); - const auto dy = (curY - m_downY); + const auto dx = (curX - m_baseX); + const auto dy = (curY - m_baseY); return sqrt(1.0 * dx * dx + 1.0 * dy * dy); } @@ -178,7 +190,7 @@ namespace call_setting { { m_holdTimer = nullptr; if (const auto handler = m_tapAndHoldHandler.lock()) { - handler(m_downX, m_downY); + handler(m_baseX, m_baseY); } return ECORE_CALLBACK_CANCEL; } diff --git a/call-setting/view/TouchParser.h b/call-setting/view/TouchParser.h index 4904aeb..fd96a6b 100644 --- a/call-setting/view/TouchParser.h +++ b/call-setting/view/TouchParser.h @@ -25,15 +25,42 @@ namespace call_setting { UCL_DECLARE_REF_ALIASES(TouchParser); + /** + * @brief Provides set of instruments to handle Tap events on widgets + */ class TouchParser final : public ucl::RefCountAware { public: + + /** + * @brief Tap event handler + */ using TapHandler = ucl::WeakDelegate<void(int x, int y)>; public: + + /** + * @brief Constructor + * @param[in] rc Pointer to IRefCountObj (passed automatically) + * @param[in] eventSource Source widget for handling Tap events + */ TouchParser(ucl::IRefCountObj &rc, ucl::Widget &eventSource); + /** + * @brief Sets single Tap event handler + * @param[in] handler Tap event handler + */ void setTapHandler(TapHandler handler); + + /** + * @brief Sets double Tap event handler + * @param[in] handler Double Tap event handler + */ void setDoubleTapHandler(TapHandler handler); + + /** + * @brief Sets 'Tap and Hold' event handler + * @param[in] handler 'Tap and hold' event handler + */ void setTapAndHoldHandler(TapHandler handler); private: @@ -51,17 +78,20 @@ namespace call_setting { void stopHoldTimer(); Eina_Bool onHoldTimer(); + void tryUpdateBaseCoordinates(int x, int y); + private: TapHandler m_tapHandler; TapHandler m_doubleTapHandler; TapHandler m_tapAndHoldHandler; Ecore_Timer *m_holdTimer; ucl::UInt m_downTime; - int m_downX; - int m_downY; + int m_baseX; + int m_baseY; int m_tapCounter; bool m_isMouseDown; bool m_isTapPossible; + bool m_isBaseCoordinatesSet; friend class ucl::ReffedObj<TouchParser>; }; diff --git a/call-setting/view/helpers.cpp b/call-setting/view/helpers.cpp index 78a8d12..ce24600 100644 --- a/call-setting/view/helpers.cpp +++ b/call-setting/view/helpers.cpp @@ -25,14 +25,63 @@ namespace call_setting { namespace { namespace impl { + using ucl::Layout; + using ucl::Timeout; + constexpr EoDataKey CIRCLE_SURFACE {"callsetting,eext,circle,surface"}; constexpr LayoutTheme LAYOUT_FAKE_ACCESS_OBJECT {"layout", "callsetting", "fake_access_object"}; + + const auto ATSPI_HIGHLIGHT_RESET_TIMEOUT = 0.1; + + UCL_DECLARE_REF_ALIASES(AtspiHighlightResetter); + + static AtspiHighlightResetterSRef ATSPI_HIGHLIGHT_RESETTER; + + class AtspiHighlightResetter final : public ucl::RefCountAware { + public: + AtspiHighlightResetter(ucl::IRefCountObj &rc, ucl::Window &win) : + RefCountAware(&rc) + { + m_fakeObj = util::createFakeAccessObject(win); + + win.addEventHandler(WidgetEvent::DEL, + WEAK_DELEGATE_THIS(onWindowDel)); + + m_fakeObj->getAtspi().highlight(); + + resetTimeout(); + } + + void resetTimeout() + { + m_timeout = Timeout::create(ATSPI_HIGHLIGHT_RESET_TIMEOUT, + WEAK_DELEGATE_THIS(onResetTimeout)); + } + + private: + void onResetTimeout(Timeout *sender) + { + ATSPI_HIGHLIGHT_RESETTER.reset(); + } + + void onWindowDel(Widget &widget, void *eventInfo) + { + ATSPI_HIGHLIGHT_RESETTER.reset(); + } + + private: + ucl::ElmWidgetSRef m_fakeObj; + ucl::TimeoutSRef m_timeout; + + }; }}} namespace call_setting { namespace util { + using ucl::Atspi; + using ucl::AtspiGestureEventInfo; using ucl::Layout; using ucl::Naviframe; @@ -48,7 +97,7 @@ namespace call_setting { namespace util { "Circle Surface data already set!"); } - const auto sfc = eext_circle_surface_naviframe_add(navi); + const auto sfc = eext_circle_surface_naviframe_add(as_eo(navi)); if (!sfc) { LOG_RETURN(RES_FAIL, "eext_circle_surface_conformant_add() failed!"); @@ -90,17 +139,66 @@ namespace call_setting { namespace util { result->setGeometry(0, 0, 1, 1); show(*result); - elm_atspi_accessible_reading_info_type_set(*result, 0); + struct FakeHandler { + SharedRef<FakeHandler> selfRef; - elm_atspi_accessible_gesture_cb_set(*result, - [](void *, Elm_Atspi_Gesture_Info, Evas_Object *) -> Eina_Bool + void onGestureCb(Atspi &atspi, + AtspiGestureEventInfo &eventInfo) { - return EINA_TRUE; - }, - nullptr); + eventInfo.preventDefault = true; + } + }; + + auto fh = makeShared<FakeHandler>(); + fh->selfRef = fh; + + evas_object_event_callback_add(as_eo(*result), EVAS_CALLBACK_DEL, + [](void *data, Evas *e, Evas_Object *obj, void *event_info) + { + static_cast<FakeHandler *>(data)->selfRef.reset(); + }, fh.get()); + + auto &atspi = result->getAtspi(); + atspi.setReadingInfo(0); + atspi.addGestureHandler(WEAK_DELEGATE(FakeHandler::onGestureCb, fh)); return result; } + + ElmWidgetSRef createAccessObject(EdjeWidget &widget, EdjePart part) + { + auto edjeLy = elm_layout_edje_get(as_eo(widget)); + if (!edjeLy) { + LOG_RETURN_VALUE(RES_FAIL, {}, + "elm_layout_edje_get() failed!"); + } + + auto edjeObj = const_cast<Evas_Object *>( + edje_object_part_object_get(edjeLy, part.name)); + if (!edjeObj) { + LOG_RETURN_VALUE(RES_FAIL, {}, + "edje_object_part_object_get() failed!"); + } + + auto ao = elm_access_object_register(edjeObj, as_eo(widget)); + if (!ao) { + LOG_RETURN_VALUE(RES_FAIL, {}, + "elm_access_object_register() failed!"); + } + + return makeShared<ElmWidget>(ao); + } + + void resetAtspiHighlight(ucl::Window &window) + { + if (impl::ATSPI_HIGHLIGHT_RESETTER) { + impl::ATSPI_HIGHLIGHT_RESETTER->resetTimeout(); + return; + } + + impl::ATSPI_HIGHLIGHT_RESETTER = + makeShared<impl::AtspiHighlightResetter>(window); + } }} namespace call_setting { diff --git a/call-setting/view/helpers.h b/call-setting/view/helpers.h index 378abad..e43ef25 100644 --- a/call-setting/view/helpers.h +++ b/call-setting/view/helpers.h @@ -23,19 +23,71 @@ namespace call_setting { namespace util { + /** + * @brief Creates circle surface + * @param[in] navi Naviframe object. @see ucl::Naviframe + * @return RES_OK on success, otherwise an error code on failure + */ ucl::Result createCircleSurface(ucl::Naviframe &navi); + + /** + * @brief Gets circle surface + * @param[in] widget ElmWidget object. @see ucl::ElmWidget + * @return Pointer to circle surface + */ Eext_Circle_Surface *getCircleSurface(const ucl::ElmWidget &widget); + /** + * @brief Creates inert invisible object + * @param[in] parent Parent widget. @see ucl::ElmWidget + * @return Shared reference to ElmWidget object + */ ucl::ElmWidgetSRef createFakeAccessObject(ucl::ElmWidget &parent); + + /** + * @brief Creates access object based on widget edje part + * @param[in] widget Widget. @see ucl::EdjeWidget + * @param[in] part Edje part + * @return Shared reference to ElmWidget object + */ + ucl::ElmWidgetSRef createAccessObject(ucl::EdjeWidget &widget, + ucl::EdjePart part); + + /** + * @brief Resets ATSPI highlight from current highlighted object + * @param[in] window Application window instance + */ + void resetAtspiHighlight(ucl::Window &window); }} namespace call_setting { + /** + * @brief Adds rotary event handler + * @param[in] func Callback function + * @param[in] data Pointer to data + */ void addRotaryEventHandler(Eext_Rotary_Handler_Cb func, void *data); + + /** + * @brief Deletes rotary event handler + * @param[in] func Callback function + * @param[in] data Pointer to data + */ void delRotaryEventHandler(Eext_Rotary_Handler_Cb func, void *data); + /** + * @brief Gets image theme + * @param[in] fileName Input file + * @return Layout theme. @see ucl::LayoutTheme + */ ucl::LayoutTheme getImageTheme(const char *fileName); + /** + * @brief Gets relation type + * @param[in] gestureInfo Gesture info + * @return ATSPI objects relation type + */ Elm_Atspi_Relation_Type getFlowRelation(Elm_Atspi_Gesture_Info gestureInfo); } diff --git a/edc/buttons.edc b/edc/buttons.edc index 120c054..a7c31d6 100644 --- a/edc/buttons.edc +++ b/edc/buttons.edc @@ -339,7 +339,7 @@ group { "elm/button/base/callsetting/backspace"; } } -#define CS_BTN_KEYPAD_NUMBER_IMPL(_name, _icon, _digit_x, _digit_y, _effect_x, _effect_y) \ +#define CS_BTN_KEYPAD_NUMBER_IMPL(_name, _icon, _width, _height, _digit_x, _digit_y, _effect_x, _effect_y) \ group { "elm/button/base/callsetting/"_name; \ data.item: "access_highlight" "on"; \ images { \ @@ -353,8 +353,8 @@ group { "elm/button/base/callsetting/"_name; \ scale; \ desc { "default"; \ fixed: 1 1; \ - rel1.relative: CS_REL_X(_effect_x) CS_REL_Y(_effect_y); \ - rel2.relative: CS_REL_X(_effect_x) CS_REL_Y(_effect_y); \ + rel1.relative: (_effect_x/_width) (_effect_y/_height); \ + rel2.relative: (_effect_x/_width) (_effect_y/_height); \ } \ } \ image { "image.effect"; \ @@ -382,9 +382,9 @@ group { "elm/button/base/callsetting/"_name; \ scale; \ desc { "default"; \ fixed: 1 1; \ - rel1.relative: CS_REL_X(_digit_x) CS_REL_Y(_digit_y); \ - rel2.relative: CS_REL_X((_digit_x+CS_KEYPAD_NUMBER_BTN_DIGIT_W)) \ - CS_REL_Y((_digit_y+CS_KEYPAD_NUMBER_BTN_DIGIT_H)); \ + rel1.relative: (_digit_x/_width) (_digit_y/_height); \ + rel2.relative: ((_digit_x+CS_KEYPAD_NUMBER_BTN_DIGIT_W)/_width) \ + ((_digit_y+CS_KEYPAD_NUMBER_BTN_DIGIT_H)/_height); \ text.style: "keypad_btn_digit"; \ } \ } \ @@ -594,13 +594,13 @@ group { "elm/button/base/callsetting/"_name; \ } \ } -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_00", "keypad_0.png", 155, 12, 180, 35) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_01", "keypad_1.png", 240, 41, 265, 63) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_02", "keypad_2.png", 292, 106, 318, 135) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_03", "keypad_3.png", 292, 196, 318, 225) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_04", "keypad_4.png", 240, 265, 265, 297) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_05", "keypad_5.png", 155, 292, 180, 325) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_06", "keypad_6.png", 70, 264, 95, 297) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_07", "keypad_7.png", 18, 194, 42, 225) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_08", "keypad_8.png", 18, 104, 42, 135) -CS_BTN_KEYPAD_NUMBER_IMPL("keypad_09", "keypad_9.png", 70, 30, 95, 63) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_00", "keypad_0.png", 110, 102, 30, 12, 55, 35) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_01", "keypad_1.png", 119, 122, 34, 32, 59, 54) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_02", "keypad_2.png", 113, 104, 45, 31, 71, 60) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_03", "keypad_3.png", 113, 104, 45, 15, 71, 44) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_04", "keypad_4.png", 119, 122, 34, 36, 59, 68) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_05", "keypad_5.png", 110, 102, 30, 34, 55, 67) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_06", "keypad_6.png", 119, 122, 35, 35, 60, 68) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_07", "keypad_7.png", 113, 104, 18, 13, 42, 44) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_08", "keypad_8.png", 113, 104, 18, 29, 42, 60) +CS_BTN_KEYPAD_NUMBER_IMPL("keypad_09", "keypad_9.png", 119, 122, 35, 21, 60, 54) diff --git a/edc/images/keypad_0.png b/edc/images/keypad_0.png Binary files differindex 606ce7b..eba3ff1 100644 --- a/edc/images/keypad_0.png +++ b/edc/images/keypad_0.png diff --git a/edc/images/keypad_1.png b/edc/images/keypad_1.png Binary files differindex d1f352d..3e6ae74 100644 --- a/edc/images/keypad_1.png +++ b/edc/images/keypad_1.png diff --git a/edc/images/keypad_2.png b/edc/images/keypad_2.png Binary files differindex 9ab8699..a9f7b70 100644 --- a/edc/images/keypad_2.png +++ b/edc/images/keypad_2.png diff --git a/edc/images/keypad_3.png b/edc/images/keypad_3.png Binary files differindex 76116d8..4f7dd05 100644 --- a/edc/images/keypad_3.png +++ b/edc/images/keypad_3.png diff --git a/edc/images/keypad_4.png b/edc/images/keypad_4.png Binary files differindex c2f26a6..66183d2 100644 --- a/edc/images/keypad_4.png +++ b/edc/images/keypad_4.png diff --git a/edc/images/keypad_5.png b/edc/images/keypad_5.png Binary files differindex 2aa1b78..e832f0c 100644 --- a/edc/images/keypad_5.png +++ b/edc/images/keypad_5.png diff --git a/edc/images/keypad_6.png b/edc/images/keypad_6.png Binary files differindex 8afe43e..2046d27 100644 --- a/edc/images/keypad_6.png +++ b/edc/images/keypad_6.png diff --git a/edc/images/keypad_7.png b/edc/images/keypad_7.png Binary files differindex 7820b5e..4c2dd29 100644 --- a/edc/images/keypad_7.png +++ b/edc/images/keypad_7.png diff --git a/edc/images/keypad_8.png b/edc/images/keypad_8.png Binary files differindex d7edefe..b124bff 100644 --- a/edc/images/keypad_8.png +++ b/edc/images/keypad_8.png diff --git a/edc/images/keypad_9.png b/edc/images/keypad_9.png Binary files differindex 06e0c05..e6f8401 100644 --- a/edc/images/keypad_9.png +++ b/edc/images/keypad_9.png diff --git a/edc/layouts.edc b/edc/layouts.edc index dd0b47e..8550e59 100644 --- a/edc/layouts.edc +++ b/edc/layouts.edc @@ -14,10 +14,12 @@ * limitations under the License. */ -#define CS_SWL_NUMBER_BUTTON(_name) \ +#define CS_SWL_NUMBER_BUTTON(_name, _x1, _y1, _x2, _y2) \ swallow { _name; \ scale; \ desc { "default"; \ + rel1 { relative: CS_REL_X(_x1) CS_REL_Y(_y1); } \ + rel2 { relative: CS_REL_X(_x2) CS_REL_Y(_y2); } \ } \ } \ @@ -59,22 +61,46 @@ group { "elm/layout/callsetting/proccessing"; color: CS_COLOR_BLACK; } } - swallow { "callsetting.swallow.progress"; + spacer { "pad.bottom"; + scale; + desc { "default"; + align: 0.5 1.0; + min: 0 131; + rel1 { relative: 0.0 1.0; } + } + } + textblock { "elm.text"; + scale; desc { "default"; hid; + text.style: "popup_graphic_toast_style"; + text.min: 1 1; + max: 300 84; + rel1 { relative: 0.5 0.0; to_y: "pad.bottom"; } + rel2 { relative: 0.5 0.0; to_y: "pad.bottom"; } } desc { "visible"; inherit: "default"; vis; } } - textblock { name: "elm.text"; - scale: 1; + spacer { "elm.text.pad.top"; + scale; + desc { "default"; + min: 0 16; + align: 0.5 1.0; + rel1 { relative: 0.0 0.0; to: "elm.text"; } + rel2 { relative: 1.0 0.0; to: "elm.text"; } + } + } + swallow { "callsetting.swallow.progress"; desc { "default"; hid; - text.style: "popup_graphic_toast_style"; - text.min: 0 1; - text.max: 0 1; + min: 82 82; + max: 82 82; + align: 0.5 1.0; + rel1 { relative: 0.5 0.0; to_y: "elm.text.pad.top"; } + rel2 { relative: 0.5 0.0; to_y: "elm.text.pad.top"; } } desc { "visible"; inherit: "default"; @@ -87,9 +113,7 @@ group { "elm/layout/callsetting/proccessing"; signal: "callsetting,show"; source: ""; action: STATE_SET "visible"; - target: "bg"; - target: "callsetting.swallow.progress"; - target: "elm.text"; + targets: "bg" "callsetting.swallow.progress" "elm.text"; } program { "callsetting,show,bg"; signal: "callsetting,show,bg"; @@ -101,8 +125,7 @@ group { "elm/layout/callsetting/proccessing"; signal: "callsetting,hide,progress"; source: ""; action: STATE_SET "default"; - target: "callsetting.swallow.progress"; - target: "elm.text"; + targets: "callsetting.swallow.progress" "elm.text"; } } } @@ -231,9 +254,8 @@ group { "elm/layout/callsetting/keypad"; clip: "clipper.number"; desc { "default"; fixed: 0 1; - min: 0 66; - rel1 { relative: 1.0 0.5; to_x: "spacer.number.left"; } - rel2 { relative: 0.0 0.5; to_x: "spacer.number.right"; } + min: 208 39; + max: 208 39; hid; } desc { "visible"; @@ -270,32 +292,64 @@ group { "elm/layout/callsetting/keypad"; hid; } } - CS_SWL_NUMBER_BUTTON("swl.btn.0") - CS_SWL_NUMBER_BUTTON("swl.btn.1") - CS_SWL_NUMBER_BUTTON("swl.btn.2") - CS_SWL_NUMBER_BUTTON("swl.btn.3") - CS_SWL_NUMBER_BUTTON("swl.btn.4") - CS_SWL_NUMBER_BUTTON("swl.btn.5") - CS_SWL_NUMBER_BUTTON("swl.btn.6") - CS_SWL_NUMBER_BUTTON("swl.btn.7") - CS_SWL_NUMBER_BUTTON("swl.btn.8") - CS_SWL_NUMBER_BUTTON("swl.btn.9") + CS_SWL_NUMBER_BUTTON("swl.btn.0", 125, 0, 235, 102) + CS_SWL_NUMBER_BUTTON("swl.btn.1", 206, 9, 325, 131) + CS_SWL_NUMBER_BUTTON("swl.btn.2", 247, 75, 360, 179) + CS_SWL_NUMBER_BUTTON("swl.btn.3", 247, 181, 360, 285) + CS_SWL_NUMBER_BUTTON("swl.btn.4", 206, 229, 325, 351) + CS_SWL_NUMBER_BUTTON("swl.btn.5", 125, 258, 235, 360) + CS_SWL_NUMBER_BUTTON("swl.btn.6", 35, 229, 154, 351) + CS_SWL_NUMBER_BUTTON("swl.btn.7", 0, 181, 113, 285) + CS_SWL_NUMBER_BUTTON("swl.btn.8", 0, 75, 113, 179) + CS_SWL_NUMBER_BUTTON("swl.btn.9", 35, 9, 154, 131) + spacer { "swl.confirm.pad.top"; + scale; + desc { "default"; + fixed: 0 1; + align: 0.5 0.0; + rel2 { relative: 1.0 0.0; } + min: 0 82; + } + } swallow { "swl.confirm"; scale; desc { "default"; fixed: 1 1; + align: 0.5 0.0; + rel1 { relative: 0.5 1.0; to_y: "swl.confirm.pad.top"; } + rel2 { relative: 0.5 1.0; to_y: "swl.confirm.pad.top"; } + } + } + spacer { "swl.backspace.pad.bottom"; + scale; + desc { "default"; + fixed: 0 1; align: 0.5 1.0; - rel1 { relative: 0.5 0.0; to_y: "swl.entry"; } - rel2 { relative: 0.5 0.0; to_y: "swl.entry"; } + rel1 { relative: 0.0 1.0; } + min: 0 83; } } swallow { "swl.backspace"; scale; desc { "default"; fixed: 1 1; - align: 0.5 0.0; - rel1 { relative: 0.5 1.0; to_y: "swl.entry"; } - rel2 { relative: 0.5 1.0; to_y: "swl.entry"; } + align: 0.5 1.0; + rel1 { relative: 0.5 0.0; to_y: "swl.backspace.pad.bottom"; } + rel2 { relative: 0.5 0.0; to_y: "swl.backspace.pad.bottom"; } + } + } + rect { "ao.entry"; + scale; + mouse; + desc { "default"; + fixed: 1 1; + rel.to: "txt.guide"; + color: CS_COLOR_TRANSPARENT; + } + desc { "entry_size"; + inherit: "default"; + rel.to: "swl.entry"; + color: CS_COLOR_TRANSPARENT; } } } @@ -308,6 +362,8 @@ group { "elm/layout/callsetting/keypad"; target: "txt.guide"; action: STATE_SET "default"; targets: "swl.entry" "clipper.number"; + action: STATE_SET "default"; + target: "ao.entry"; } } program { @@ -318,6 +374,8 @@ group { "elm/layout/callsetting/keypad"; target: "txt.guide"; action: STATE_SET "visible"; targets: "swl.entry" "clipper.number"; + action: STATE_SET "entry_size"; + target: "ao.entry"; } } } diff --git a/project_def.prop b/project_def.prop index be59953..11c90ef 100644 --- a/project_def.prop +++ b/project_def.prop @@ -9,7 +9,7 @@ type = app profile = wearable-4.0 # C/CPP Sources -USER_SRCS = ucl/source/gui/Genlist.cpp call-setting/model/impl/BlockedNumbersImpl.cpp call-setting/presenters/misc/KeypadPresenter.cpp ucl/source/gui/Window.cpp call-setting/model/impl/BlockUnknownCallersImpl.cpp call-setting/view/TouchParser.cpp call-setting/model/impl/telephony/BaseTelRequestListener.cpp ucl/source/gui/Layout.cpp call-setting/resources.cpp call-setting/presenters/misc/ProcessingPresenter.cpp call-setting/presenters/misc/helpers.cpp ucl/source/appfw/UIApp.cpp call-setting/model/impl/CallWaitingImpl.cpp ucl/source/gui/WidgetItem.cpp call-setting/presenters/pages/NoContentPage.cpp call-setting/presenters/pages/VoicemailPage.cpp call-setting/presenters/pages/BlockedNumbersPage.cpp call-setting/model/BlockUnknownCallers.cpp ucl/source/util/types/Result.cpp call-setting/model/CallSetting.cpp call-setting/presenters/pages/KeypadPage.cpp call-setting/presenters/pages/MainPage.cpp call-setting/view/KeypadEntry.cpp call-setting/presenters/misc/SelectModePresenter.cpp call-setting/model/impl/misc/ContactNameProvider.cpp call-setting/presenters/items/BlockUnknownCallersItem.cpp ucl/source/appfw/InstanceManagerBase.cpp call-setting/model/BlockedNumbers.cpp call-setting/model/impl/misc/BlockListManager.cpp ucl/source/gui/NaviItem.cpp ucl/source/appfw/helpers.cpp call-setting/presenters/dialogs/ListOptionDialog.cpp call-setting/model/impl/settings/SettingsManager.cpp call-setting/presenters/items/CallWaitingItem.cpp call-setting/presenters/InstanceManager.cpp ucl/source/gui/Widget.cpp call-setting/model/impl/telephony/TelRequestListener.cpp call-setting/model/Voicemail.cpp call-setting/presenters/items/SimpleListItem.cpp ucl/source/misc/Timeout.cpp call-setting/presenters/pages/BlockListPage.cpp call-setting/presenters/items/base/ListOptionItem.cpp ucl/source/mvp/GuiPresenter.cpp call-setting/presenters/dialogs/base/Dialog.cpp call-setting/view/KeypadNumberBtn.cpp call-setting/view/helpers.cpp call-setting/model/StateManager.cpp ucl/source/util/logging.cpp ucl/source/gui/Naviframe.cpp ucl/source/gui/RadioBox.cpp ucl/source/util/types/classTypes.cpp call-setting/main.cpp call-setting/presenters/items/base/CheckOptionItem.cpp call-setting/model/CallWaiting.cpp call-setting/types.cpp ucl/source/appfw/SysEventProvider.cpp ucl/source/mvp/ListPresenter.cpp ucl/source/misc/Variant.cpp call-setting/presenters/items/RadioOptionItem.cpp call-setting/presenters/misc/MoreOptionsPresenter.cpp call-setting/model/impl/VoicemailImpl.cpp call-setting/presenters/items/CallerIdItem.cpp call-setting/model/CallerId.cpp call-setting/view/PageContent.cpp call-setting/model/impl/CallSettingImpl.cpp call-setting/presenters/pages/base/Page.cpp call-setting/model/impl/telephony/TelephonyManager.cpp call-setting/presenters/dialogs/ToastDialog.cpp ucl/source/mvp/ListItemPresenter.cpp ucl/source/gui/ElmWidget.cpp call-setting/model/impl/CallerIdImpl.cpp ucl/source/gui/EdjeWidget.cpp call-setting/view/KeypadBackspaceBtn.cpp call-setting/presenters/Instance.cpp call-setting/presenters/items/VoicemailNumberItem.cpp +USER_SRCS = ucl/source/gui/Genlist.cpp call-setting/model/impl/BlockedNumbersImpl.cpp call-setting/presenters/misc/KeypadPresenter.cpp ucl/source/gui/Window.cpp call-setting/model/impl/BlockUnknownCallersImpl.cpp call-setting/view/TouchParser.cpp call-setting/model/impl/telephony/BaseTelRequestListener.cpp ucl/source/gui/Layout.cpp call-setting/resources.cpp call-setting/presenters/misc/ProcessingPresenter.cpp call-setting/presenters/misc/helpers.cpp ucl/source/appfw/UIApp.cpp call-setting/model/impl/CallWaitingImpl.cpp ucl/source/gui/WidgetItem.cpp call-setting/presenters/pages/NoContentPage.cpp call-setting/presenters/pages/VoicemailPage.cpp call-setting/presenters/pages/BlockedNumbersPage.cpp call-setting/model/BlockUnknownCallers.cpp ucl/source/util/types/Result.cpp call-setting/model/CallSetting.cpp call-setting/presenters/pages/KeypadPage.cpp call-setting/presenters/pages/MainPage.cpp call-setting/view/KeypadEntry.cpp call-setting/presenters/misc/SelectModePresenter.cpp call-setting/model/impl/misc/ContactNameProvider.cpp call-setting/presenters/items/BlockUnknownCallersItem.cpp ucl/source/appfw/InstanceManagerBase.cpp call-setting/model/BlockedNumbers.cpp call-setting/model/impl/misc/BlockListManager.cpp ucl/source/gui/NaviItem.cpp ucl/source/appfw/helpers.cpp call-setting/presenters/dialogs/ListOptionDialog.cpp call-setting/model/impl/settings/SettingsManager.cpp call-setting/presenters/items/CallWaitingItem.cpp call-setting/presenters/InstanceManager.cpp ucl/source/gui/Widget.cpp call-setting/model/impl/telephony/TelRequestListener.cpp call-setting/model/Voicemail.cpp call-setting/presenters/items/SimpleListItem.cpp ucl/source/misc/Timeout.cpp call-setting/presenters/pages/BlockListPage.cpp call-setting/presenters/items/base/ListOptionItem.cpp ucl/source/mvp/GuiPresenter.cpp call-setting/presenters/dialogs/base/Dialog.cpp call-setting/view/KeypadNumberBtn.cpp call-setting/view/helpers.cpp call-setting/model/StateManager.cpp ucl/source/util/logging.cpp ucl/source/gui/Naviframe.cpp ucl/source/gui/RadioBox.cpp ucl/source/util/types/classTypes.cpp call-setting/main.cpp call-setting/presenters/items/base/CheckOptionItem.cpp call-setting/model/CallWaiting.cpp call-setting/types.cpp ucl/source/appfw/SysEventProvider.cpp ucl/source/mvp/ListPresenter.cpp ucl/source/misc/Variant.cpp call-setting/presenters/items/RadioOptionItem.cpp call-setting/presenters/misc/MoreOptionsPresenter.cpp call-setting/presenters/misc/AtspiHighlightHelper.cpp call-setting/model/impl/VoicemailImpl.cpp call-setting/presenters/items/CallerIdItem.cpp call-setting/model/CallerId.cpp call-setting/view/PageContent.cpp call-setting/model/impl/CallSettingImpl.cpp call-setting/presenters/pages/base/Page.cpp call-setting/model/impl/telephony/TelephonyManager.cpp call-setting/presenters/dialogs/ToastDialog.cpp ucl/source/mvp/ListItemPresenter.cpp ucl/source/gui/ElmWidget.cpp call-setting/model/impl/CallerIdImpl.cpp ucl/source/gui/EdjeWidget.cpp call-setting/view/KeypadBackspaceBtn.cpp call-setting/presenters/Instance.cpp call-setting/presenters/items/VoicemailNumberItem.cpp # EDC Sources USER_EDCS = diff --git a/res/po/ar.po b/res/po/ar.po index 2fd7bd1..8020ddc 100644 --- a/res/po/ar.po +++ b/res/po/ar.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "تأكيد" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "جاري تحديث الإعدادات..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "زر الراديو" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "فارغ" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "حذف" @@ -13,9 +22,33 @@ msgstr "إلغاء تحديد الكل" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "تحديد الكل" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "تبديل" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "تم الحذف." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "انقر مع الاستمرار لإدخال رمز الجمع." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "انقر مع الاستمرار لإدخال رمز #." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "انقر مع الاستمرار لإدخال رمز النجمة." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "تعديل المربع" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "لوحة المفاتيح" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "التعديل" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "مسافة للخلف" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "البريد الصوتي" diff --git a/res/po/az.po b/res/po/az.po index b2dd9a3..001e449 100644 --- a/res/po/az.po +++ b/res/po/az.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Təsdiq et" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Parametrlər yenilənir..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radio düyməsi" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Boş" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SİL" @@ -13,9 +22,33 @@ msgstr "Hamısını sil" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Hamısını seç" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Keçir" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Silindi." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Üstəgəl simvolunu daxil etmək üçün vurub saxlayın." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "# simvolunu daxil etmək üçün vurub saxlayın." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Ulduz simvolunu daxil etmək üçün vurub saxlayın." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redaktə xanası" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klaviatura" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redaktə" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Geri silmə" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Səsli poçt" diff --git a/res/po/bg.po b/res/po/bg.po index dea18ad..e6fdec4 100644 --- a/res/po/bg.po +++ b/res/po/bg.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Потвърждение" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Актуализиране на настройките..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Бутон за избор" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Празно" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ИЗТРИВ." @@ -13,9 +22,33 @@ msgstr "Размарк. вс." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Изб. всички" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Превключване" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Изтрито." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Докоснете и задръжте, за да въведете символа плюс." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Докоснете и задръжте, за да въведете символа диез." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Докоснете и задръжте, за да въведете символа звезда." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Поле за редактиране" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Клавиатура" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Редактиране" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Връщане" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Гласова поща" diff --git a/res/po/ca.po b/res/po/ca.po index 5e89fd3..c5f5bb4 100644 --- a/res/po/ca.po +++ b/res/po/ca.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "S'estan actualitzant els ajustaments..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botó de ràdio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Buit" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ESBORRAR" @@ -13,9 +22,33 @@ msgstr "Anul sel tot" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Selecc tot" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Canviar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Esborrat." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mantingui tocat per introduir el símbol més." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mantingui tocat per introduir el símbol coixinet." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mantingui tocat per introduir el símbol asterisc." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Quadre d'edició" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclat" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editant" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retrocés" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Bústia de veu" diff --git a/res/po/cs.po b/res/po/cs.po index 8e6bfb4..8e4bb34 100644 --- a/res/po/cs.po +++ b/res/po/cs.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potvrdit" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Probíhá aktualizace nastavení..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Přepínač" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vysypat koš" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ODSTRANIT" @@ -13,9 +22,33 @@ msgstr "Zrušit výběr" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Vybrat vše" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Přepnout" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Odstraněno." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Klepnutím a přidržením zadáte symbol plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Klepnutím a přidržením zadáte symbol #." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Klepnutím a přidržením zadáte symbol hvězdička." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Upravit pole" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klávesnice" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Úpravy" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Hlasová pošta" diff --git a/res/po/da.po b/res/po/da.po index f93b091..0bbe1f8 100644 --- a/res/po/da.po +++ b/res/po/da.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Bekræft" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Opdaterer indstillinger ..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Alternativknap" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tom" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SLET" @@ -13,9 +22,33 @@ msgstr "Fravælg alle" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Vælg alle" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Skift" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Slettet." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tryk og hold for at indtaste plustegn." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tryk og hold for at indtaste nummertegn." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tryk og hold for at indtaste stjernesymbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redigeringsboks" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastatur" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redigering" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Tilbagetast" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Telefonsvarer" diff --git a/res/po/de.po b/res/po/de.po index 9ef192b..8adcb55 100644 --- a/res/po/de.po +++ b/res/po/de.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Bestätigen" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Einstellungen werden aktualisiert..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Optionsfeld" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Leer" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "LÖSCHEN" @@ -13,9 +22,33 @@ msgstr "Alle abwählen" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Alle auswählen" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Wechseln" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Gelöscht." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tippen und halten, um ein Plussymbol einzugeben." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tippen und halten, um ein Rautensymbol einzugeben." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tippen und halten, um ein Asterisksymbol einzugeben." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Bearbeitungsfeld" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastatur" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Bearbeiten" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Zurück" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Mailbox" diff --git a/res/po/el_GR.po b/res/po/el_GR.po index 0b707bb..2f3ba60 100644 --- a/res/po/el_GR.po +++ b/res/po/el_GR.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Επιβεβαίωση" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Ενημέρωση ρυθμίσεων..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Κουμπί επιλογής" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Κενό" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ΔΙΑΓΡΑΦΗ" @@ -13,9 +22,33 @@ msgstr "Αποεπ. όλων" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Επιλογή όλων" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Εναλλαγή" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Διαγράφηκε." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Πατήστε παρατεταμένα για να εισαγάγετε το σύμβολο συν." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Πατήστε παρατεταμένα για να εισαγάγετε το σύμβολο δίεσης." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Πατήστε παρατεταμένα για να εισαγάγετε το σύμβολο αστεριού." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Πλαίσιο επεξεργασίας" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Πληκτρολόγιο" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Επεξεργασία" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Πλήκτρο backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Τηλεφωνητής" diff --git a/res/po/en.po b/res/po/en.po index 267dad6..87ccada 100644 --- a/res/po/en.po +++ b/res/po/en.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirm" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Updating settings..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radio button" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Empty" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "DELETE" @@ -13,9 +22,33 @@ msgstr "Deselect all" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Select all" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Switch" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Deleted." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tap and hold to enter plus symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tap and hold to enter # symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tap and hold to enter star symbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Edit box" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Keypad" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editing" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Voice Mail" diff --git a/res/po/en_PH.po b/res/po/en_PH.po index 0baa097..94292ea 100644 --- a/res/po/en_PH.po +++ b/res/po/en_PH.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirm" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Updating settings..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radio button" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Empty" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "DELETE" @@ -13,9 +22,33 @@ msgstr "Deselect all" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Select all" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Switch" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Deleted." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tap and hold to enter plus symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tap and hold to enter # symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tap and hold to enter star symbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Edit box" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Keypad" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editing" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Voicemail" diff --git a/res/po/en_US.po b/res/po/en_US.po index 0baa097..4ac63c4 100644 --- a/res/po/en_US.po +++ b/res/po/en_US.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirm" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Updating settings..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radio button" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Empty" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "DELETE" @@ -13,9 +22,33 @@ msgstr "Deselect all" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Select all" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Switch" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Deleted." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Touch and hold to enter plus symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Touch and hold to enter hash symbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Touch and hold to enter star symbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Edit box" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Keypad" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editing" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Voicemail" diff --git a/res/po/es_ES.po b/res/po/es_ES.po index 2b5e153..78430ad 100644 --- a/res/po/es_ES.po +++ b/res/po/es_ES.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Actualizando ajustes..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botón de radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vacío" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ELIMINAR" @@ -13,9 +22,33 @@ msgstr "Cancelar todo" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Todo" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Cambiar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eliminados." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mantén pulsado para introducir el símbolo más." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mantén pulsado para introducir el símbolo almohadilla." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mantén pulsado para introducir el símbolo asterisco." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Cuadro de edición" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclado" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Edición" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retroceso" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Buzón de voz" diff --git a/res/po/es_US.po b/res/po/es_US.po index f500974..bbf8eff 100644 --- a/res/po/es_US.po +++ b/res/po/es_US.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Actualizando configuración..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botón de opción" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vaciar" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ELIMINAR" @@ -13,9 +22,33 @@ msgstr "Cancelar todo" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Todo" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Cambiar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eliminados." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mantenga pulsado para introducir el símbolo más." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mantenga pulsado para introducir el símbolo numeral." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mantenga pulsado para introducir el símbolo asterisco." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Cuadro de edición" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclado" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Edición" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retroceso" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Correo de voz" diff --git a/res/po/et.po b/res/po/et.po index 608f5f4..eada5b7 100644 --- a/res/po/et.po +++ b/res/po/et.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Kinnita" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Seadete värskendamine..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Raadio nupp" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tühi" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "KUSTUTA" @@ -13,9 +22,33 @@ msgstr "Tühista kõik" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Vali kõik" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Lüliti" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Kustutatud." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Toksake ja hoidke, et sisestada plussi sümbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Toksake ja hoidke, et sisestada trellide sümbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Toksake ja hoidke, et sisestada tärni sümbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redigeerimiskast" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klahvistik" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redigeerimine" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Tagasilüke" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Kõnepost" diff --git a/res/po/eu.po b/res/po/eu.po index 6a76b17..dec7832 100644 --- a/res/po/eu.po +++ b/res/po/eu.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Baieztatu" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Ezarpenak egokitzen..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Irratiaren botoia" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Hutsik" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "EZABATU" @@ -13,9 +22,33 @@ msgstr "Desaut. denak" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Hautatu denak" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Aldatu" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Ezabatuta." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Ukitu eta eutsi gehi sinboloa idazteko." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Ukitu eta eutsi traola idazteko." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Ukitu eta eutsi izar sinboloa idazteko." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Editatzeko koadroa" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teklatua" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editatzen" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Atzera" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Ahots posta" diff --git a/res/po/fi.po b/res/po/fi.po index 083e7b0..76fe66e 100644 --- a/res/po/fi.po +++ b/res/po/fi.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Vahvista" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Päivitetään asetuksia..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Valintanappi" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tyhjä" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "POISTA" @@ -13,9 +22,33 @@ msgstr "Poista val." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Val. kaikki" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Vaihda" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Poistettu." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Kirjoita plusmerkki painamalla painiketta jonkin aikaa." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Kirjoita ristikkomerkki painamalla painiketta jonkin aikaa." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Kirjoita tähtimerkki painamalla painiketta jonkin aikaa." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Muokkausruutu" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Näppäimistö" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Muokkaus" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Askelpalautin" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Vastaajaviesti" diff --git a/res/po/fr.po b/res/po/fr.po index 2664cb6..577d007 100644 --- a/res/po/fr.po +++ b/res/po/fr.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmer" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Mise à jour des paramètres..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Bouton radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vide" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SUPPRIMER" @@ -13,9 +22,33 @@ msgstr "Tout désélect." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Tout sélect." +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Activer ou désactiver" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Supprimé(s)." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Maintenez un doigt appuyé pour entrer le symbole Plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Maintenez un doigt appuyé pour entrer le symbole Dièse." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Maintenez un doigt appuyé pour entrer le symbole Étoile." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Zone d'édition" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Clavier" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Modification" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retour arrière" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Messagerie" diff --git a/res/po/fr_CA.po b/res/po/fr_CA.po index 3e58c0f..28f8f1a 100644 --- a/res/po/fr_CA.po +++ b/res/po/fr_CA.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmer" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Mise à jour des paramètres..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Bouton radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vide" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SUPPRIMER" @@ -13,9 +22,33 @@ msgstr "Tout désélect." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Tout sélect." +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Activer ou désactiver" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Supprimé(s)." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Touchez longuement pour entrer le symbole Plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Touchez longuement pour entrer le symbole Dièse." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Touchez longuement pour entrer le symbole Étoile." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Zone d'édition" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Clavier" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Modification" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retour arrière" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Messagerie vocale" diff --git a/res/po/ga.po b/res/po/ga.po index be88538..a9c988b 100644 --- a/res/po/ga.po +++ b/res/po/ga.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Deimhnigh" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Socruithe á nuashonrú..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Cnaipe raidió" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Folamh" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SCRIOS" @@ -13,9 +22,33 @@ msgstr "Dírogh. gach" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Roghn. gach" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Lasc" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Scriosta." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tapáil agus coinnigh le siombail móide a iontráil." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tapáil agus coinnigh le siombail haise a iontráil." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tapáil agus coinnigh le siombail réalta a iontráil." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Bosca cur in eagar" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Eochaircheap" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Cur in eagar" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Cúlspás" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Glórphost" diff --git a/res/po/gl.po b/res/po/gl.po index ce0eb07..9f32523 100644 --- a/res/po/gl.po +++ b/res/po/gl.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Actualizando axustes..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botón de opción" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Baleiro" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ELIMINAR" @@ -13,9 +22,33 @@ msgstr "Cancelar todo" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Selecc. todo" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Cambiar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eliminado." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mantén tocado para introducir o símbolo máis." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mantén tocado para introducir o símbolo grade." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mantén tocado para introducir o símbolo da estrela." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Caixa de edición" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclado" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Edición" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retroceso" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Caixa de voz" diff --git a/res/po/hi.po b/res/po/hi.po index 612c95f..97a7445 100644 --- a/res/po/hi.po +++ b/res/po/hi.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "पुष्टि करें" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "सेटिंग्स अपडेट कर रहा है..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "रेडियो बटन" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "खाली करें" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "हटाएँ" @@ -13,9 +22,33 @@ msgstr "सभी चयन हटाएँ" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "सभी चुनें" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "स्विच करें" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "हटाया गया।" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "धन प्रतीक प्रविष्ट करने के लिए टैप और होल्ड करें।" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "# प्रतीक प्रविष्ट करने के लिए टैप और होल्ड करें।" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "तारा प्रतीक प्रविष्ट करने के लिए टैप और होल्ड करें।" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "संपादन बॉक्स" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "कीपैड" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "संपादन" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "बैकस्पेस" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "वॉइस मेल" diff --git a/res/po/hr.po b/res/po/hr.po index 4627ee6..3782ffa 100644 --- a/res/po/hr.po +++ b/res/po/hr.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potvrdi" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Aktualiziranje postavki..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Izborni gumb" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Isprazni" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "IZBRIŠI" @@ -13,9 +22,33 @@ msgstr "Odznači sve" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Odaberi sve" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Promijeni" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Izbrisano." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Dodirnite i držite za unos simbola plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Dodirnite i držite za unos simbola ljestvi." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Dodirnite i držite za unos simbola zvjezdice." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Okvir za uređivanje" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tipkovnica" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Uređivanje" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Tipka za brisanje ulijevo" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Govorna pošta" diff --git a/res/po/hu.po b/res/po/hu.po index 9d43d05..4557b02 100644 --- a/res/po/hu.po +++ b/res/po/hu.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Megerősít" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Beállítások frissítése..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Választógomb" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Üres" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "TÖRLÉS" @@ -13,9 +22,33 @@ msgstr "Kijel. törl." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Össz. kijel." +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Váltás" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Törölve." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tartsa pluszjel beviteléhez." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tartsa kettős kereszt beviteléhez." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tartsa csillag beviteléhez." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Szerkesztőmező" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Billentyűzet" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Szerkesztés" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Visszatörlés" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Hangposta" diff --git a/res/po/hy.po b/res/po/hy.po index 1dcaf64..2ee98b2 100644 --- a/res/po/hy.po +++ b/res/po/hy.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Հաստատել" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Կայվածքների նորացում..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Ռադիոկոճակ" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Դատարկ" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ՎԵՐԱՑՆԵԼ" @@ -13,9 +22,33 @@ msgstr "Ապընտ. բոլոր" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Ընտրել բոլոր" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Փոխել" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Վերացվեց:" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Թակեք և պահեք՝ պլյուս նշանը մուտքագրելու համար:" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Թակեք և պահեք՝ # նշանը մուտքագրելու համար:" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Թակեք և պահեք՝ աստղանիշը մուտքագրելու համար:" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Խմբագրման պատուհան" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Ստեղնախումբ" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Խմբագրում" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Ետշարժ" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Ձայնային փոստ" diff --git a/res/po/is.po b/res/po/is.po index 4286980..89dc61d 100644 --- a/res/po/is.po +++ b/res/po/is.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Staðfesta" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Uppfæri stillingar..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Valhnappur" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tómt" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "EYÐA" @@ -13,9 +22,33 @@ msgstr "Velja ekkert" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Velja allt" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Skipta" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eytt." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Haltu fingri á skjánum til að slá inn plústáknið." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Haltu fingri á skjánum til að slá inn myllumerki." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Haltu fingri á skjánum til að slá inn stjörnu." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Innsláttarreitur" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Takkaborð" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Innsláttur" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Bakktakki" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Talhólf" diff --git a/res/po/it_IT.po b/res/po/it_IT.po index 7518676..d322d5a 100644 --- a/res/po/it_IT.po +++ b/res/po/it_IT.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Conferma" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Aggiornamento impostazioni..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Pulsante di opzione" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vuota" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ELIMINA" @@ -13,9 +22,33 @@ msgstr "Desel. tutto" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Selez. tutto" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Attiva/disattiva" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eliminati." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tieni premuto per inserire il simbolo più." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tieni premuto per inserire il simbolo cancelletto." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tieni premuto per inserire il simbolo asterisco." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Casella di modifica" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastiera" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Modifica" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Segreteria" diff --git a/res/po/ja_JP.po b/res/po/ja_JP.po index e7ac515..9a00a07 100644 --- a/res/po/ja_JP.po +++ b/res/po/ja_JP.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "確認" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "設定を更新中..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "ラジオボタン" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "空にする" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "削除" @@ -13,9 +22,33 @@ msgstr "全て解除" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "全て選択" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "切替" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "削除しました。" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "プラス記号を入力するには、長押ししてください。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "ハッシュを入力するには、長押ししてください。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "アスタリスクを入力するには、長押ししてください。" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "エディットボックス" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "キーパッド" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "編集中" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "バックスペース" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "留守番電話" diff --git a/res/po/ka.po b/res/po/ka.po index 7a26654..46d8284 100644 --- a/res/po/ka.po +++ b/res/po/ka.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "დადასტურება" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "სრულდება პარამეტრების განახლება..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "მოსანიშნი წრე" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "დაცლა" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "წაშლა" @@ -13,9 +22,33 @@ msgstr "მონიშ. მოხს." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "აირჩიე ყველა" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "გადართვა" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "წაიშალა." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "ხანგრძლივად შეეხეთ, რომ შეიყვანოთ პლუსის სიმბოლო." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "ხანგრძლივად შეეხეთ, რომ შეიყვანოთ # სიმბოლო." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "ხანგრძლივად შეეხეთ, რომ შეიყვანოთ ვარსკვლავის სიმბოლო." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "რედაქტირების ველი" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "კლავიატურა" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "რედაქტირდება" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "უკუშლა" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "ხმოვანი ფოსტა" diff --git a/res/po/kk.po b/res/po/kk.po index 9dfd12d..11c12a8 100644 --- a/res/po/kk.po +++ b/res/po/kk.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Негіздеу" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Параметрлер жаңартылуда..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Радио түймесі" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Босату" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ЖОЮ" @@ -13,9 +22,33 @@ msgstr "Барлығын алу" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Бәрін таңдау" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Ауыстыру" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Жойылды." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Қосу белгісін енгізу үшін, түртіп ұстап тұрыңыз." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "# белгісін енгізу үшін, түртіп ұстап тұрыңыз." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Жұлдызша белгісін енгізу үшін, түртіп ұстап тұрыңыз." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Өңдеу терезесі" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Пернетақта" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Өңдеу" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Дауыс поштасы" diff --git a/res/po/ko_KR.po b/res/po/ko_KR.po index b1a3f1c..cb0f5d4 100644 --- a/res/po/ko_KR.po +++ b/res/po/ko_KR.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "확인" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "설정 업데이트 중..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "라디오 버튼" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "지정 안 됨" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "삭제" @@ -13,9 +22,33 @@ msgstr "모두 해제" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "모두 선택" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "스위치" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "삭제했습니다." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "더하기 기호를 입력하려면 길게 누르세요." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "우물 정자를 입력하려면 길게 누르세요." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "별표를 입력하려면 길게 누르세요." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "입력창" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "키패드" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "입력 중입니다" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "지우기" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "음성사서함" diff --git a/res/po/lt.po b/res/po/lt.po index 0a74b7a..ad78416 100644 --- a/res/po/lt.po +++ b/res/po/lt.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Patvirtinti" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Naujinami nustatymai..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Išrinkimo mygtukas" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tuščia" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "TRINTI" @@ -13,9 +22,33 @@ msgstr "Žymėti viską" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Rinkt. viską" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Perjungti" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Ištrinta." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Bakstelėję palaikykite, kad įvestumėte pliuso simbolį." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Bakstelėję palaikykite, kad įvestumėte # simbolį." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Bakstelėję palaikykite, kad įvestumėte žvaigždutės simbolį." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redagavimo laukelis" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klaviatūra" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redagavimas" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Grįžties klavišas" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Balso pranešimas" diff --git a/res/po/lv.po b/res/po/lv.po index 9497721..c1373d2 100644 --- a/res/po/lv.po +++ b/res/po/lv.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Apstiprināt" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Atjaunina iestatījumus..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radiopoga" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tukšs" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "DZĒST" @@ -13,9 +22,33 @@ msgstr "Atc. izvēli" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Izvēl. visu" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Pārslēgt" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Izdzēsts." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Pieskarieties un turiet, lai ievadītu pluszīmes simbolu." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Pieskarieties un turiet, lai ievadītu simbolu #." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Pieskarieties un turiet, lai ievadītu zvaigznītes simbolu." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Rediģēšanas lodziņš" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Cipartastatūra" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Rediģēšana" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Atpakaļatkāpe" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Balss pasts" diff --git a/res/po/mk.po b/res/po/mk.po index e9763b8..f99cc5a 100644 --- a/res/po/mk.po +++ b/res/po/mk.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Потврди" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Се ажурираат поставувањата..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Радио копче" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Празно" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ИЗБРИШИ" @@ -13,9 +22,33 @@ msgstr "Поништи сѐ" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Избери сѐ" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Префрли" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Избришано." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Допрете и држете за да го внесете симболот за плус." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Допрете и држете за да го внесете симболот хаш." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Допрете и држете за да го внесете симболот ѕвезда." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Поле за менување" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Тастатура" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Менување" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Бришење назад" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Говорна пошта" diff --git a/res/po/nb.po b/res/po/nb.po index 0bb177f..afb702b 100644 --- a/res/po/nb.po +++ b/res/po/nb.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Bekreft" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Oppdaterer innstillinger..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radioknapp" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tom" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SLETT" @@ -13,9 +22,33 @@ msgstr "Fj. alle mrk." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Velg alle" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Bytt" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Slettet." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Trykk på og hold for å angi plussymbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Trykk på og hold for å angi firkanttastsymbol." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Trykk på og hold for å angi stjernesymbol." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redigeringsboks" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastatur" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redigering" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Mobilsvar" diff --git a/res/po/nl.po b/res/po/nl.po index c3116d5..f29e069 100644 --- a/res/po/nl.po +++ b/res/po/nl.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Bevestigen" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Instellingen bijwerken..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Keuzerondje" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Leeg" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "VERWIJDEREN" @@ -13,9 +22,33 @@ msgstr "Alles desel." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Alles select." +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Overschakelen" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Verwijderd." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tik en houd vast om plussymbool in te voeren." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tik en houd vast om een hekjesymbool in te voeren." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tik en houd vast om stersymbool in te voeren." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Bewerkvak" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Toetsen" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Bewerken" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Voicemail" diff --git a/res/po/pl.po b/res/po/pl.po index 9e268de..268a258 100644 --- a/res/po/pl.po +++ b/res/po/pl.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potwierdź" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Aktualizacja ustawień..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Przycisk radiowy" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Opróżnij" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "USUŃ" @@ -13,9 +22,33 @@ msgstr "Odznacz wsz." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Zaznacz wsz." +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Przełącz" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Usunięto." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Dotknij i przytrzymaj, aby wprowadzić symbol plusa." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Dotknij i przytrzymaj, aby wprowadzić symbol krzyżyka." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Dotknij i przytrzymaj, aby wprowadzić symbol gwiazdki." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Pole edycji" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klawiatura" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Edytowanie" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Powrót" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Poczta głosowa" diff --git a/res/po/pt_BR.po b/res/po/pt_BR.po index cac98f8..82c054f 100644 --- a/res/po/pt_BR.po +++ b/res/po/pt_BR.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Atualizando configurações..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botão de opção" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vazio" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "EXCLUIR" @@ -13,9 +22,33 @@ msgstr "Desmar. tudo" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Selec. tudo" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Alternar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Excluído." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mantenha pressionado para inserir o símbolo de mais." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mantenha pressionado para inserir o símbolo de cerquilha." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mantenha pressionado para inserir o símbolo de estrela." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Caixa de edição" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclado" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editando" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Tecla de retorno" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Caixa Postal" diff --git a/res/po/pt_PT.po b/res/po/pt_PT.po index 7171a48..be801e3 100644 --- a/res/po/pt_PT.po +++ b/res/po/pt_PT.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmar" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "A actualizar definições..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Botão de opção" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Vazio" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ELIMINAR" @@ -13,9 +22,33 @@ msgstr "Desselec. tudo" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Selec. tudo" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Mudar" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Eliminados." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Toque sem soltar para introduzir o símbolo de mais." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Toque sem soltar para introduzir o símbolo de cardinal." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Toque sem soltar para introduzir o símbolo de estrela." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Caixa de edição" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Teclado" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Editar" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Retrocesso" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Correio de voz" diff --git a/res/po/ro.po b/res/po/ro.po index 4d590e9..c96d8d6 100644 --- a/res/po/ro.po +++ b/res/po/ro.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Confirmare" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Se actualizează setările..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Buton radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Gol" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ȘTERGERE" @@ -13,9 +22,33 @@ msgstr "Desel. tot." msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Select. totală" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Comutare" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Șterse." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Mențineți apăsat pentru a introduce simbolul plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Mențineți apăsat pentru a introduce simbolul diez." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Mențineți apăsat pentru a introduce simbolul steluță." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Casetă de editare" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastatură" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Se editează" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Mesagerie vocală" diff --git a/res/po/ru_RU.po b/res/po/ru_RU.po index 990fe56..1ede873 100644 --- a/res/po/ru_RU.po +++ b/res/po/ru_RU.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Подтвердить" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Обновление параметров..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Кнопка-переключатель" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Пусто" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "УДАЛИТЬ" @@ -13,9 +22,33 @@ msgstr "Отмен. выбор" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Выбрать все" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Переключить" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Удалено." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Коснитесь и удерживайте для ввода символа “+”." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Коснитесь и удерживайте для ввода символа “#”." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Коснитесь и удерживайте для ввода символа “*”." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Поле редактирования" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Клавиатура" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Редактирование" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Голосовая почта" diff --git a/res/po/sk.po b/res/po/sk.po index a124205..aedbeab 100644 --- a/res/po/sk.po +++ b/res/po/sk.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potvrdiť" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Aktualizujú sa nastavenia..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Prepínač" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Prázdne" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ODSTRÁNIŤ" @@ -13,9 +22,33 @@ msgstr "Zrušiť výber" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Vybrať všetko" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Prepnúť" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Odstránené." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Ťuknutím a podržaním zadáte symbol plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Ťuknutím a podržaním zadáte symbol mriežky." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Ťuknutím a podržaním zadáte symbol hviezdičky." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Textové pole" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Číselná klávesnica" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Úprava" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Hlasová pošta" diff --git a/res/po/sl.po b/res/po/sl.po index 266392e..9cc0c06 100644 --- a/res/po/sl.po +++ b/res/po/sl.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potrdi" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Posodabljam nastavitve ..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Gumb za radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Prazno" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "IZBRIŠI" @@ -13,9 +22,33 @@ msgstr "Opusti vse" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Izberi vse" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Stikalo" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Izbrisano." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Pritisnite in pridržite, da vstavite simbol plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Pritisnite in pridržite, da vstavite simbol lojtra." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Pritisnite in pridržite, da vstavite simbol zvezdica." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Polje za urejanje" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Številčnica" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Urejanje" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Vračalka" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Glasovno sporočilo" diff --git a/res/po/sr.po b/res/po/sr.po index ee6d857..3231763 100644 --- a/res/po/sr.po +++ b/res/po/sr.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Potvrdi" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Ažuriranje podešavanja..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Dugme Radio" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Prazno" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "IZBRIŠI" @@ -13,9 +22,33 @@ msgstr "Poništi sve" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Izaberi sve" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Prekidač" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Izbrisano." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Kucnite i zadržite da biste uneli simbol za znak plus." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Kucnite i zadržite da biste uneli simbol za heš." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Kucnite i zadržite da biste uneli simbol za zvezdicu." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Polje za uređivanje" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Tastatura" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Izmena" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Taster za brisanje" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Govorna pošta" diff --git a/res/po/sv.po b/res/po/sv.po index ea3c6a6..835ce25 100644 --- a/res/po/sv.po +++ b/res/po/sv.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Bekräfta" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Uppdaterar inställningar..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Alternativknapp" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Tomt" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "TA BORT" @@ -13,9 +22,33 @@ msgstr "Avmark. allt" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Välj allt" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Växla" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Raderat." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Tryck och håll ned för att infoga ett plustecken." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Tryck och håll ned för att infoga fyrkant." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Tryck och håll ned för att infoga en asterisk." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Redigeringsruta" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Knappsats" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Redigering" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backsteg" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Röstbrevlåda" diff --git a/res/po/tr_TR.po b/res/po/tr_TR.po index f7edb10..0038668 100644 --- a/res/po/tr_TR.po +++ b/res/po/tr_TR.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Onayla" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Ayarlar güncelleniyor..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radyo tuşu" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Boş" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "SİL" @@ -13,9 +22,33 @@ msgstr "Seçmlri kldr" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Tümünü seç" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Değiştir" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Silindi." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Artı simgesi girmek için dokunup basılı tutun." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "# simgesi girmek için dokunup basılı tutun." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Yıldız simgesi girmek için dokunup basılı tutun." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Düzenleme kutusu" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klavye" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Düzenleniyor" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Sil" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Telesekreter" @@ -74,5 +107,5 @@ msgid "WDS_CST_OPT_DELETE_ABB" msgstr "Sil" msgid "IDS_CST_BODY_NO_ITEMS" -msgstr "Öğe yok" +msgstr "Öge yok" diff --git a/res/po/uk.po b/res/po/uk.po index 39a8230..86b1cec 100644 --- a/res/po/uk.po +++ b/res/po/uk.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Підтвердження" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Оновлення установок..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Перемикач" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Пусто" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "ВИДАЛИТИ" @@ -13,9 +22,33 @@ msgstr "Скас. вибір" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Вибрати всі" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Перемкнути" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "Видалено." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Торкніться і утримуйте, щоб ввести символ «+»." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "Торкніться і утримуйте, щоб ввести символ «#»." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Торкніться і утримуйте, щоб ввести символ «*»." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Поле редагування" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Клавіатура" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Редагування" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Голосова пошта" diff --git a/res/po/uz.po b/res/po/uz.po index bdda14e..2764684 100644 --- a/res/po/uz.po +++ b/res/po/uz.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "Tasdiqlash" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "Parametrlarni yangilash..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "Radio tugmasi" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "Bo‘sh" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "O‘CHIRISH" @@ -13,9 +22,33 @@ msgstr "Bar. tan. ol" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "Bar. tanla" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "Almashtirish" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "O‘chirildi." +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "Plyus ishorasini kiritish uchun bosib turing." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "# belgisini kiritish uchun bosib turing." + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "Yulduzcha belgisini kiritish uchun bosib turing." + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "Tahrirlash maydoni" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "Klaviatura" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "Tahrirlash" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "Backspace" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "Ovozli pochta" diff --git a/res/po/zh_CN.po b/res/po/zh_CN.po index 24b12d9..c078cf3 100644 --- a/res/po/zh_CN.po +++ b/res/po/zh_CN.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "确认" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "正在更新设置..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "单选按钮" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "空白" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "删除" @@ -13,9 +22,33 @@ msgstr "取消全选" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "全选" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "切换" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "已删除" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "长按以输入加号。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "长按以输入 # 号。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "长按以输入星号。" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "编辑框" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "键盘" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "正在编辑" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "退格" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "语音邮件" diff --git a/res/po/zh_HK.po b/res/po/zh_HK.po index f75efeb..0d8ca8f 100644 --- a/res/po/zh_HK.po +++ b/res/po/zh_HK.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "確認" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "正在更新設定..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "選項按鈕" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "空白" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "刪除" @@ -13,9 +22,33 @@ msgstr "取消全選" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "全選" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "切換" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "已刪除。" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "輕觸並按住以輸入加號。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "輕觸並按住以輸入 # 號。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "輕觸並按住以輸入星號。" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "編輯方塊" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "鍵盤" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "正在編輯" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "退格鍵" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "留言信箱" diff --git a/res/po/zh_TW.po b/res/po/zh_TW.po index 6e157ba..296249d 100644 --- a/res/po/zh_TW.po +++ b/res/po/zh_TW.po @@ -1,6 +1,15 @@ +msgid "IDS_ST_BODY_CONFIRM" +msgstr "確認" + msgid "IDS_CST_POP_UPDATING_SETTINGS_ING" msgstr "正在更新設定..." +msgid "IDS_ACCS_TBOPT_RADIO_BUTTON" +msgstr "選項按鈕" + +msgid "WDS_ACCS_TBOPT_EMPTY" +msgstr "空白" + msgid "WDS_HS_ACBUTTON_DELETE" msgstr "刪除" @@ -13,9 +22,33 @@ msgstr "取消全選" msgid "WDS_HS_BUTTON_SELECT_ALL_ABB3" msgstr "全選" +msgid "WDS_ALM_TBOPT_SWITCH" +msgstr "切換" + msgid "WDS_PB_TPOP_DELETED_ABB3" msgstr "已刪除。" +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_PLUS_SYMBOL" +msgstr "輕觸並按住以輸入加號。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_SSHARP_SYMBOL" +msgstr "輕觸並按住以輸入 # 號。" + +msgid "WDS_WMGR_TBBODY_TAP_AND_HOLD_TO_ENTER_STAR_SYMBOL" +msgstr "輕觸並按住以輸入星號。" + +msgid "WDS_WMGR_TBOPT_EDIT_BOX" +msgstr "編輯方塊" + +msgid "WDS_WMGR_TBOPT_KEYPAD" +msgstr "鍵盤" + +msgid "WDS_WMGR_TBOPT_EDITING" +msgstr "正在編輯" + +msgid "WDS_WMGR_TBOPT_BACKSPACE" +msgstr "退格鍵" + msgid "IDS_COM_HEADER_VOICE_MAIL_ORANGE" msgstr "語音信箱" diff --git a/ucl/include/ucl/gui/Atspi.h b/ucl/include/ucl/gui/Atspi.h index 2657806..dcea2b1 100644 --- a/ucl/include/ucl/gui/Atspi.h +++ b/ucl/include/ucl/gui/Atspi.h @@ -31,41 +31,31 @@ namespace ucl { class Atspi final : private NonCopyable { public: /** - * @brief Constructor - * @param[in] eo Underlying Access object of the Atspi - */ - explicit Atspi(Elm_Interface_Atspi_Accessible *ao); - - /** - * @brief Destructor - * @details Unregisters all Access object callbacks - */ - ~Atspi(); - - /** - * @brief Gets Access object pointer - * @return Pointer to the Access object + * @brief Gets the underlying Access object + * @param[in] atspi Reference to target atspi + * @return Pointer to the underlying Access object */ - Elm_Interface_Atspi_Accessible *getAo(); + friend Elm_Interface_Atspi_Accessible *as_ao(Atspi &atspi); /** - * @brief Gets pointer to constant Access object - * @return Pointer to the constant Access object + * @brief Gets the underlying constant Access object + * @param[in] atspi Constant reference to target atspi + * @return Pointer to the underlying constant Access object */ - const Elm_Interface_Atspi_Accessible *getAo() const; + friend const Elm_Interface_Atspi_Accessible *as_ao(const Atspi &atspi); + public: /** - * @brief Implicitly casts to the underlying Access object - * @return Pointer to the underlying Access object + * @brief Constructor + * @param[in] eo Underlying Access object of the Atspi */ - operator Elm_Interface_Atspi_Accessible *(); + explicit Atspi(Elm_Interface_Atspi_Accessible *ao); /** - * @brief Implicitly casts to the underlying - * Access object (constant version) - * @return Pointer to the constant underlying Access object + * @brief Destructor + * @details Unregisters all Access object callbacks */ - operator const Elm_Interface_Atspi_Accessible *() const; + ~Atspi(); /** * @brief Sets name @@ -167,16 +157,16 @@ namespace ucl { * @param[in] relation Pointer to relation Access object */ void addRelationship(Elm_Atspi_Relation_Type type, - Elm_Interface_Atspi_Accessible *relation); + const Elm_Interface_Atspi_Accessible *relation); /** * @brief Deletes exiting relationship * @param[in] type Type of the exiting relationship * @param[in] relation Pointer to relation Access object, - * or NULL for all relations of the type + * or NULL for all relations of the type (optional) */ void delRelationship(Elm_Atspi_Relation_Type type, - Elm_Interface_Atspi_Accessible *relation); + const Elm_Interface_Atspi_Accessible *relation = nullptr); /** * @brief Deletes all exiting relationships @@ -196,6 +186,9 @@ namespace ucl { void delGestureHandler(const AtspiGestureHandler &handler); private: + Elm_Interface_Atspi_Accessible *getAo(); + const Elm_Interface_Atspi_Accessible *getAo() const; + void registerGestureCb(); void registerNameCb(); void registerDescriptionCb(); @@ -225,20 +218,43 @@ namespace ucl { // Non-member functions // /** - * @brief Compares equals underlying Access objects of target objects - * @param[in] lhs Left hand side operand - * @param[in] rhs Right hand side operand - * @return true - if equal, false - not equal + * @brief Gets Access object from pointed object + * @param[in] ptr Target object pointer + * @return Pointer to Access object or NULL + */ + template <class T> + inline auto as_ao(const T &ptr) -> typename std::enable_if< + std::is_convertible<T, bool>::value, decltype(as_ao(*ptr))>::type + { + return (ptr ? as_ao(*ptr) : nullptr); + } + + /** + * @brief Gets Access object from iterator + * @param[in] ptr Target object iterator + * @return Pointer to Access object or NULL + */ + template <class T> + inline auto as_ao(const T &iter) -> typename std::enable_if< + !std::is_convertible<T, bool>::value, decltype(as_ao(*iter))>::type + { + return as_ao(*iter); + } + + /** + * @brief Passes through original Access object pointer + * @param[in] ao Access object pointer + * @return Access object pointer */ - bool operator==(const Atspi &lhs, const Atspi &rhs); + Elm_Interface_Atspi_Accessible *as_ao(Elm_Interface_Atspi_Accessible *ao); /** - * @brief Compares unequals underlying Access objects of target objects - * @param[in] lhs Left hand side operand - * @param[in] rhs Right hand side operand - * @return true - if not equal, false - equal + * @brief Passes through original constant Access object pointer + * @param[in] ao Constant Access object pointer + * @return Constant Access object pointer */ - bool operator!=(const Atspi &lhs, const Atspi &rhs); + const Elm_Interface_Atspi_Accessible *as_ao( + const Elm_Interface_Atspi_Accessible *ao); } #include "Atspi.hpp" diff --git a/ucl/include/ucl/gui/Atspi.hpp b/ucl/include/ucl/gui/Atspi.hpp index fcf1004..e1c53f6 100644 --- a/ucl/include/ucl/gui/Atspi.hpp +++ b/ucl/include/ucl/gui/Atspi.hpp @@ -1,3 +1,19 @@ +/* + * Copyright 2017 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 "ucl/util/helpers.h" #include "ucl/util/logging.h" @@ -27,16 +43,6 @@ namespace ucl { return m_ao; } - inline Atspi::operator Elm_Interface_Atspi_Accessible *() - { - return m_ao; - } - - inline Atspi::operator const Elm_Interface_Atspi_Accessible *() const - { - return m_ao; - } - inline void Atspi::setName(const std::string &name) { elm_atspi_accessible_name_set(getAo(), name.c_str()); @@ -125,13 +131,13 @@ namespace ucl { } inline void Atspi::addRelationship(const Elm_Atspi_Relation_Type type, - Elm_Interface_Atspi_Accessible *const relation) + const Elm_Interface_Atspi_Accessible *const relation) { elm_atspi_accessible_relationship_append(getAo(), type, relation); } inline void Atspi::delRelationship(const Elm_Atspi_Relation_Type type, - Elm_Interface_Atspi_Accessible *const relation) + const Elm_Interface_Atspi_Accessible *const relation) { elm_atspi_accessible_relationship_remove(getAo(), type, relation); } @@ -159,7 +165,7 @@ namespace ucl { if (!m_isGestureCbRegistered) { m_isGestureCbRegistered = true; elm_atspi_accessible_gesture_cb_set(m_ao, - CALLBACK_A(Atspi::onAtspiGesture), this); + UCL_CALLBACK_A(Atspi::onAtspiGesture), this); } } @@ -168,7 +174,7 @@ namespace ucl { if (!m_isNameCbRegistered) { m_isNameCbRegistered = true; elm_atspi_accessible_name_cb_set(m_ao, - CALLBACK_A(Atspi::onAtspiNameCb), this); + UCL_CALLBACK_A(Atspi::onAtspiNameCb), this); } } @@ -177,7 +183,7 @@ namespace ucl { if (!m_isDescriptionCbRegistered) { m_isDescriptionCbRegistered = true; elm_atspi_accessible_description_cb_set(m_ao, - CALLBACK_A(Atspi::onAtspiDescriptionCb), this); + UCL_CALLBACK_A(Atspi::onAtspiDescriptionCb), this); } } @@ -240,13 +246,25 @@ namespace ucl { // Non-member functions // - inline bool operator==(const Atspi &lhs, const Atspi &rhs) + inline Elm_Interface_Atspi_Accessible *as_ao(Atspi &atspi) + { + return atspi.m_ao; + } + + inline const Elm_Interface_Atspi_Accessible *as_ao(const Atspi &atspi) + { + return atspi.m_ao; + } + + inline Elm_Interface_Atspi_Accessible *as_ao( + Elm_Interface_Atspi_Accessible *const ao) { - return (lhs.getAo() == rhs.getAo()); + return ao; } - inline bool operator!=(const Atspi &lhs, const Atspi &rhs) + inline const Elm_Interface_Atspi_Accessible *as_ao( + const Elm_Interface_Atspi_Accessible *const ao) { - return (lhs.getAo() != rhs.getAo()); + return ao; } } diff --git a/ucl/include/ucl/gui/EdjeWidget.h b/ucl/include/ucl/gui/EdjeWidget.h index d195a07..da32501 100644 --- a/ucl/include/ucl/gui/EdjeWidget.h +++ b/ucl/include/ucl/gui/EdjeWidget.h @@ -56,16 +56,16 @@ namespace ucl { /** * @brief Sets content to default part - * @param[in] content Content Evas object + * @param[in] content Content widget */ - void setContent(Evas_Object *content); + void setContent(Widget &content); /** * @brief Sets content to specific part - * @param[in] content Content Evas object + * @param[in] content Content widget * @param[in] part Destination Edje part */ - void setContent(Evas_Object *content, EdjePart part); + void setContent(Widget &content, EdjePart part); /** * @brief Unsets content from default part diff --git a/ucl/include/ucl/gui/EdjeWidget.hpp b/ucl/include/ucl/gui/EdjeWidget.hpp index e08841f..763808e 100644 --- a/ucl/include/ucl/gui/EdjeWidget.hpp +++ b/ucl/include/ucl/gui/EdjeWidget.hpp @@ -32,15 +32,15 @@ namespace ucl { return elm_object_part_text_get(getEo(), part.name); } - inline void EdjeWidget::setContent(Evas_Object *const content) + inline void EdjeWidget::setContent(Widget &content) { - elm_object_content_set(getEo(), content); + elm_object_content_set(getEo(), as_eo(content)); } - inline void EdjeWidget::setContent(Evas_Object *const content, + inline void EdjeWidget::setContent(Widget &content, const EdjePart part) { - elm_object_part_content_set(getEo(), part.name, content); + elm_object_part_content_set(getEo(), part.name, as_eo(content)); } inline Evas_Object *EdjeWidget::unsetContent() diff --git a/ucl/include/ucl/gui/ElmWidget.h b/ucl/include/ucl/gui/ElmWidget.h index 4c4b547..a0e2d60 100644 --- a/ucl/include/ucl/gui/ElmWidget.h +++ b/ucl/include/ucl/gui/ElmWidget.h @@ -115,6 +115,20 @@ namespace ucl { // Non-member functions // /** + * @brief Gets corresponding Access object + * @param[in] widget Reference to target widget + * @return Pointer to the corresponding Access object + */ + Elm_Interface_Atspi_Accessible *as_ao(ElmWidget &widget); + + /** + * @brief Gets corresponding constant Access object + * @param[in] widget Constant reference to target widget + * @return Pointer to the corresponding constant Access object + */ + const Elm_Interface_Atspi_Accessible *as_ao(const ElmWidget &widget); + + /** * @brief Sets widget to enabled state * @details This is equivalent to: widget.setEnabled(true); * @param[in] widget Reference to target widget diff --git a/ucl/include/ucl/gui/ElmWidget.hpp b/ucl/include/ucl/gui/ElmWidget.hpp index 2151cfd..6fe586d 100644 --- a/ucl/include/ucl/gui/ElmWidget.hpp +++ b/ucl/include/ucl/gui/ElmWidget.hpp @@ -73,6 +73,16 @@ namespace ucl { // Non-member functions // + inline Elm_Interface_Atspi_Accessible *as_ao(ElmWidget &widget) + { + return as_ao(widget.getAtspi()); + } + + inline const Elm_Interface_Atspi_Accessible *as_ao(const ElmWidget &widget) + { + return as_ao(widget.getAtspi()); + } + inline void enable(ElmWidget &widget) { widget.setEnabled(true); diff --git a/ucl/include/ucl/gui/NaviItem.h b/ucl/include/ucl/gui/NaviItem.h index 62a5e71..495d3d8 100644 --- a/ucl/include/ucl/gui/NaviItem.h +++ b/ucl/include/ucl/gui/NaviItem.h @@ -45,17 +45,17 @@ namespace ucl { void setPopHandler(PopHandler handler) const; /** - * Pops all items of the naviframe state to this item + * @brief Pops all items of the naviframe state to this item */ void popTo() const; /** - * Moves this naviframe item to the top of the naviframe stack + * @brief Moves this naviframe item to the top of the naviframe stack */ void promote() const; /** - * Sets naviframe item tile visibility state + * @brief Sets naviframe item tile visibility state * @param[in] value Visibility state. true - visible, false - invisible * @param[in] useTransition Title show/hide transition animation flag. * true - use transition animation, false - no transition. @@ -63,13 +63,13 @@ namespace ucl { void setTitleEnabled(bool value, bool useTransition = false) const; /** - * Gets naviframe item tile visibility state + * @brief Gets naviframe item tile visibility state * @retrun Visibility state. true - visible, false - invisible */ bool isTitleEnabled() const; /** - * Sets naviframe item tile text + * @brief Sets naviframe item tile text * @param[in] title Translatable text to use as a title */ void setTitle(const TString &title) const; diff --git a/ucl/include/ucl/gui/NaviItem.hpp b/ucl/include/ucl/gui/NaviItem.hpp index b4cba2b..8b4730d 100644 --- a/ucl/include/ucl/gui/NaviItem.hpp +++ b/ucl/include/ucl/gui/NaviItem.hpp @@ -36,11 +36,6 @@ namespace ucl { inline void NaviItem::setTitle(const TString &title) const { - if (isEmpty(title)) { - setTitleEnabled(false); - } else { - setText(title); - setTitleEnabled(true); - } + setText(title); } } diff --git a/ucl/include/ucl/gui/Naviframe.h b/ucl/include/ucl/gui/Naviframe.h index 4699474..cc7a94f 100644 --- a/ucl/include/ucl/gui/Naviframe.h +++ b/ucl/include/ucl/gui/Naviframe.h @@ -136,103 +136,126 @@ namespace ucl { /** * @brief Pushes new item to the naviframe stack * @param[in] title Translatable item title (may be empty) - * @param[in] backBtn Back button Evas object (may be NULL) - * @param[in] moreBtn More button Evas object (may be NULL) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item + * @param[in] backBtn Back button widget pointer (may be NULL) + * @param[in] moreBtn More button widget pointer (may be NULL) * @param[in] style Elm style of the item (optional) * @return New item */ - NaviItem push(const TString &title, - Evas_Object *backBtn, Evas_Object *moreBtn, - Evas_Object *content, ElmStyle style = nullptr); + NaviItem push(const TString &title, Widget &content, + Widget *backBtn, Widget *moreBtn, + ElmStyle style = nullptr); /** * @brief Pushes new item to the naviframe stack * @param[in] title Translatable item title (may be empty) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item * @param[in] style Elm style of the item (optional) * @return New item */ - NaviItem push(const TString &title, - Evas_Object *content, ElmStyle style = nullptr); + NaviItem push(const TString &title, Widget &content, + ElmStyle style = nullptr); + + /** + * @brief Pushes new item to the naviframe stack + * @param[in] content Content of the item + * @param[in] style Elm style of the item (optional) + * @return New item + */ + NaviItem push(Widget &content, ElmStyle style = nullptr); /** * @brief Pushes new item to the naviframe stack - * @param[in] content Content of the item (may be NULL) * @param[in] style Elm style of the item (optional) * @return New item */ - NaviItem push(Evas_Object *content, ElmStyle style = nullptr); + NaviItem push(ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack after specific item * @param[in] after Item after which future item will be inserted * @param[in] title Translatable item title (may be empty) - * @param[in] backBtn Back button Evas object (may be NULL) - * @param[in] moreBtn More button Evas object (may be NULL) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item + * @param[in] backBtn Back button widget pointer (may be NULL) + * @param[in] moreBtn More button widget pointer (may be NULL) * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertAfter(NaviItem after, const TString &title, - Evas_Object *backBtn, Evas_Object *moreBtn, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, Widget *backBtn, Widget *moreBtn, + ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack after specific item * @param[in] after Item after which future item will be inserted * @param[in] title Translatable item title (may be empty) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertAfter(NaviItem after, const TString &title, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack after specific item * @param[in] after Item after which future item will be inserted - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertAfter(NaviItem after, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, ElmStyle style = nullptr); + + /** + * @brief Inserts new item to the naviframe stack after specific item + * @param[in] after Item after which future item will be inserted + * @param[in] style Elm style of the item (optional) + * @return New item + */ + NaviItem insertAfter(NaviItem after, ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack before specific item * @param[in] before Item before which future item will be inserted * @param[in] title Translatable item title (may be empty) - * @param[in] backBtn Back button Evas object (may be NULL) - * @param[in] moreBtn More button Evas object (may be NULL) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item + * @param[in] backBtn Back button widget pointer (may be NULL) + * @param[in] moreBtn More button widget pointer (may be NULL) * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertBefore(NaviItem before, const TString &title, - Evas_Object *backBtn, Evas_Object *moreBtn, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, Widget *backBtn, Widget *moreBtn, + ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack before specific item * @param[in] before Item before which future item will be inserted * @param[in] title Translatable item title (may be empty) - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertBefore(NaviItem before, const TString &title, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, ElmStyle style = nullptr); /** * @brief Inserts new item to the naviframe stack before specific item * @param[in] before Item before which future item will be inserted - * @param[in] content Content of the item (may be NULL) + * @param[in] content Content of the item * @param[in] style Elm style of the item (optional) * @return New item */ NaviItem insertBefore(NaviItem before, - Evas_Object *content, ElmStyle style = nullptr); + Widget &content, ElmStyle style = nullptr); + + /** + * @brief Inserts new item to the naviframe stack before specific item + * @param[in] before Item before which future item will be inserted + * @param[in] style Elm style of the item (optional) + * @return New item + */ + NaviItem insertBefore(NaviItem before, ElmStyle style = nullptr); /** * @brief Gets top item of the naviframe stack @@ -255,6 +278,18 @@ namespace ucl { private: Naviframe(IRefCountObj &rc, Evas_Object *eo, Private); + NaviItem push(const TString &title, + Widget *content, Widget *backBtn, Widget *moreBtn, + ElmStyle style); + + NaviItem insertAfter(NaviItem after, const TString &title, + Widget *content, Widget *backBtn, Widget *moreBtn, + ElmStyle style); + + NaviItem insertBefore(NaviItem before, const TString &title, + Widget *content, Widget *backBtn, Widget *moreBtn, + ElmStyle style); + void onTransitionFinished(Widget &widget, void *eventInfo); private: diff --git a/ucl/include/ucl/gui/Naviframe.hpp b/ucl/include/ucl/gui/Naviframe.hpp index e8fdc19..c5dc4bf 100644 --- a/ucl/include/ucl/gui/Naviframe.hpp +++ b/ucl/include/ucl/gui/Naviframe.hpp @@ -14,6 +14,19 @@ * limitations under the License. */ +namespace ucl { namespace himpl { + + inline void initItemTitle(const NaviItem item, const TString &title) + { + if (isEmpty(title)) { + item.setTitleEnabled(false); + } else { + item.setTitle(title); + item.setTitleEnabled(true); + } + } +}} + namespace ucl { // Naviframe::Builder // @@ -83,77 +96,119 @@ namespace ucl { return result; } - inline NaviItem Naviframe::push(const TString &title, - Evas_Object *const backBtn, Evas_Object *const moreBtn, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::push(const TString &title, Widget *const content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) { auto result = NaviItem(elm_naviframe_item_push(getEo(), - nullptr, backBtn, moreBtn, content, style.name)); - result.setTitle(title); + nullptr, as_eo(backBtn), as_eo(moreBtn), + as_eo(content), style.name)); + himpl::initItemTitle(result, title); if (result != getBottomItem()) { setInTransition(true); } return result; } - inline NaviItem Naviframe::push(const TString &title, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::push(const TString &title, Widget &content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) + { + return push(title, &content, backBtn, moreBtn, style); + } + + inline NaviItem Naviframe::push(const TString &title, Widget &content, + const ElmStyle style) + { + return push(title, &content, nullptr, nullptr, style); + } + + inline NaviItem Naviframe::push(Widget &content, const ElmStyle style) { - return push(title, nullptr, nullptr, content, style); + return push(nullptr, &content, nullptr, nullptr, style); } - inline NaviItem Naviframe::push( - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::push(const ElmStyle style) { - return push(nullptr, nullptr, nullptr, content, style); + return push(nullptr, nullptr, nullptr, nullptr, style); } - inline NaviItem Naviframe::insertAfter(NaviItem after, - const TString &title, - Evas_Object *const backBtn, Evas_Object *const moreBtn, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertAfter(const NaviItem after, + const TString &title, Widget *const content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) { auto result = NaviItem(elm_naviframe_item_insert_after(getEo(), - after, nullptr, backBtn, moreBtn, content, style.name)); - result.setTitle(title); + after, nullptr, as_eo(backBtn), as_eo(moreBtn), + as_eo(content), style.name)); + himpl::initItemTitle(result, title); return result; } - inline NaviItem Naviframe::insertAfter(NaviItem after, - const TString &title, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertAfter(const NaviItem after, + const TString &title, Widget &content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) { - return insertAfter(after, title, nullptr, nullptr, content, style); + return insertAfter(after, title, &content, backBtn, moreBtn, style); } - inline NaviItem Naviframe::insertAfter(NaviItem after, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertAfter(const NaviItem after, + const TString &title, Widget &content, + const ElmStyle style) { - return insertAfter(after, nullptr, nullptr, nullptr, content, style); + return insertAfter(after, title, &content, nullptr, nullptr, style); } - inline NaviItem Naviframe::insertBefore(NaviItem before, - const TString &title, - Evas_Object *const backBtn, Evas_Object *const moreBtn, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertAfter(const NaviItem after, + Widget &content, const ElmStyle style) + { + return insertAfter(after, nullptr, &content, nullptr, nullptr, style); + } + + inline NaviItem Naviframe::insertAfter(const NaviItem after, + const ElmStyle style) + { + return insertAfter(after, nullptr, nullptr, nullptr, nullptr, style); + } + + inline NaviItem Naviframe::insertBefore(const NaviItem before, + const TString &title, Widget *const content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) { auto result = NaviItem(elm_naviframe_item_insert_before(getEo(), - before, nullptr, backBtn, moreBtn, content, style.name)); - result.setTitle(title); + before, nullptr, as_eo(backBtn), as_eo(moreBtn), + as_eo(content), style.name)); + himpl::initItemTitle(result, title); return result; } - inline NaviItem Naviframe::insertBefore(NaviItem before, - const TString &title, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertBefore(const NaviItem before, + const TString &title, Widget &content, + Widget *const backBtn, Widget *const moreBtn, + const ElmStyle style) + { + return insertAfter(before, title, &content, backBtn, moreBtn, style); + } + + inline NaviItem Naviframe::insertBefore(const NaviItem before, + const TString &title, Widget &content, + const ElmStyle style) + { + return insertAfter(before, title, &content, nullptr, nullptr, style); + } + + inline NaviItem Naviframe::insertBefore(const NaviItem before, + Widget &content, const ElmStyle style) { - return insertAfter(before, title, nullptr, nullptr, content, style); + return insertAfter(before, nullptr, &content, nullptr, nullptr, style); } - inline NaviItem Naviframe::insertBefore(NaviItem before, - Evas_Object *const content, const ElmStyle style) + inline NaviItem Naviframe::insertBefore(const NaviItem before, + const ElmStyle style) { - return insertAfter(before, nullptr, nullptr, nullptr, content, style); + return insertAfter(before, nullptr, nullptr, nullptr, nullptr, style); } inline NaviItem Naviframe::getTopItem()const diff --git a/ucl/include/ucl/gui/RadioBox.h b/ucl/include/ucl/gui/RadioBox.h index a0e4b83..715b0bd 100644 --- a/ucl/include/ucl/gui/RadioBox.h +++ b/ucl/include/ucl/gui/RadioBox.h @@ -92,7 +92,7 @@ namespace ucl { * @param[in] group Radio box to which group this radio box * should be added */ - void addToGroup(Elm_Radio *group); + void addToGroup(RadioBox &group); /** * @brief Sets a value of the group in which this radio box is member diff --git a/ucl/include/ucl/gui/RadioBox.hpp b/ucl/include/ucl/gui/RadioBox.hpp index 8943278..3efe0e0 100644 --- a/ucl/include/ucl/gui/RadioBox.hpp +++ b/ucl/include/ucl/gui/RadioBox.hpp @@ -55,9 +55,9 @@ namespace ucl { return elm_radio_state_value_get(getEo()); } - inline void RadioBox::addToGroup(Elm_Radio *const group) + inline void RadioBox::addToGroup(RadioBox &group) { - elm_radio_group_add(getEo(), group); + elm_radio_group_add(getEo(), as_eo(group)); } inline void RadioBox::setGroupValue(const int value) diff --git a/ucl/include/ucl/gui/Widget.h b/ucl/include/ucl/gui/Widget.h index 0232e36..e6506ab 100644 --- a/ucl/include/ucl/gui/Widget.h +++ b/ucl/include/ucl/gui/Widget.h @@ -47,6 +47,21 @@ namespace ucl { public: /** + * @brief Gets the underlying Evas object + * @param[in] widget Reference to target widget + * @return Pointer to the underlying Evas object + */ + friend Evas_Object *as_eo(Widget &widget); + + /** + * @brief Gets the underlying constant Evas object + * @param[in] widget Constant reference to target widget + * @return Pointer to the underlying constant Evas object + */ + friend const Evas_Object *as_eo(const Widget &widget); + + public: + /** * @brief Constructor * @param[in] eo Underlying Evas object of the widget * @param[in] isOwner Evas object ownership flag (optional: true) @@ -107,31 +122,6 @@ namespace ucl { void setIsOwner(bool value); /** - * @brief Gets the underlying Evas object - * @return Pointer to the underlying Evas object - */ - Evas_Object *getEo(); - - /** - * @brief Gets the underlying Evas object (constant version) - * @return Pointer to the constant underlying Evas object - */ - const Evas_Object *getEo() const; - - /** - * @brief Implicitly casts to the underlying Evas object - * @return Pointer to the underlying Evas object - */ - operator Evas_Object *(); - - /** - * @brief Implicitly casts to the underlying - * Evas object (constant version) - * @return Pointer to the constant underlying Evas object - */ - operator const Evas_Object *() const; - - /** * @brief Gets Evas canvas on which underlying Evas object resides * @return Pointer to the Evas canvas */ @@ -368,6 +358,18 @@ namespace ucl { protected: /** + * @brief Gets the underlying Evas object + * @return Pointer to the underlying Evas object + */ + Evas_Object *getEo(); + + /** + * @brief Gets the underlying Evas object (constant version) + * @return Pointer to the constant underlying Evas object + */ + const Evas_Object *getEo() const; + + /** * @brief Actually sets key-input focus state to the widget * @details May be overriden in subclasses to change behaviour * @param[in] value New state. true - to set focus, false - to unset @@ -433,6 +435,17 @@ namespace ucl { // Non-member functions // /** + * @brief Gets Evas object from pointed object + * @param[in] ptr Target object pointer + * @return Pointer to Evas object or NULL + */ + template <class T> + inline auto as_eo(const T &ptr) -> decltype(as_eo(*ptr)) + { + return (ptr ? as_eo(*ptr) : nullptr); + } + + /** * @brief Gets position of the widget * @param[in] widget Reference to target widget * @param[out] x Top-left X coordinate of the widget (may be NULL) @@ -512,22 +525,6 @@ namespace ucl { * @param[in] widget Reference to target widget */ void expandAndFill(Widget &widget); - - /** - * @brief Compares equals underlying Evas objects of target widgets - * @param[in] lhs Left hand side operand - * @param[in] rhs Right hand side operand - * @return true - if equal, false - not equal - */ - bool operator==(const Widget &lhs, const Widget &rhs); - - /** - * @brief Compares unequals underlying Evas objects of target widgets - * @param[in] lhs Left hand side operand - * @param[in] rhs Right hand side operand - * @return true - if not equal, false - equal - */ - bool operator!=(const Widget &lhs, const Widget &rhs); } #include "Widget.hpp" diff --git a/ucl/include/ucl/gui/Widget.hpp b/ucl/include/ucl/gui/Widget.hpp index d8c35c5..9e98bfd 100644 --- a/ucl/include/ucl/gui/Widget.hpp +++ b/ucl/include/ucl/gui/Widget.hpp @@ -44,16 +44,6 @@ namespace ucl { return m_eo; } - inline Widget::operator Evas_Object *() - { - return getEo(); - } - - inline Widget::operator const Evas_Object *() const - { - return getEo(); - } - inline Evas *Widget::getEvas() const { return evas_object_evas_get(getEo()); @@ -206,6 +196,16 @@ namespace ucl { // Non-member functions // + inline Evas_Object *as_eo(Widget &widget) + { + return widget.m_eo; + } + + inline const Evas_Object *as_eo(const Widget &widget) + { + return widget.m_eo; + } + inline void getPosition(const Widget &widget, int *x, int *y) { widget.getGeometry(x, y, nullptr, nullptr); @@ -261,14 +261,4 @@ namespace ucl { expand(widget); fill(widget); } - - inline bool operator==(const Widget &lhs, const Widget &rhs) - { - return (lhs.getEo() == rhs.getEo()); - } - - inline bool operator!=(const Widget &lhs, const Widget &rhs) - { - return (lhs.getEo() != rhs.getEo()); - } } diff --git a/ucl/include/ucl/gui/WidgetItem.h b/ucl/include/ucl/gui/WidgetItem.h index c272bc8..3ef57d4 100644 --- a/ucl/include/ucl/gui/WidgetItem.h +++ b/ucl/include/ucl/gui/WidgetItem.h @@ -145,16 +145,16 @@ namespace ucl { /** * @brief Sets content to default part of the widget item - * @param[in] content Content Evas object + * @param[in] content Content widget */ - void setContent(Evas_Object *content) const; + void setContent(Widget &content) const; /** * @brief Sets content to specific part of the widget item - * @param[in] content Content Evas object + * @param[in] content Content widget * @param[in] part Destination Edje part */ - void setContent(Evas_Object *content, EdjePart part) const; + void setContent(Widget &content, EdjePart part) const; /** * @brief Unsets content from default part of the widget item diff --git a/ucl/include/ucl/gui/WidgetItem.hpp b/ucl/include/ucl/gui/WidgetItem.hpp index 2d53577..b36cfa4 100644 --- a/ucl/include/ucl/gui/WidgetItem.hpp +++ b/ucl/include/ucl/gui/WidgetItem.hpp @@ -97,15 +97,15 @@ namespace ucl { return elm_object_item_part_text_get(getIt(), part.name); } - inline void WidgetItem::setContent(Evas_Object *const content) const + inline void WidgetItem::setContent(Widget &content) const { - elm_object_item_content_set(getIt(), content); + elm_object_item_content_set(getIt(), as_eo(content)); } - inline void WidgetItem::setContent(Evas_Object *const content, + inline void WidgetItem::setContent(Widget &content, const EdjePart part) const { - elm_object_item_part_content_set(getIt(), part.name, content); + elm_object_item_part_content_set(getIt(), part.name, as_eo(content)); } inline Evas_Object *WidgetItem::unsetContent() const diff --git a/ucl/include/ucl/mvp/ListItemPresenter.h b/ucl/include/ucl/mvp/ListItemPresenter.h index 37175bd..690623e 100644 --- a/ucl/include/ucl/mvp/ListItemPresenter.h +++ b/ucl/include/ucl/mvp/ListItemPresenter.h @@ -36,6 +36,15 @@ namespace ucl { protected IPicker { public: /** + * @brief Gets GUI item Access object of the item presenter + * @param[in] item List item presenter + * @return Pointer to Access object or NULL + */ + friend const Elm_Interface_Atspi_Accessible *as_ao( + const ListItemPresenter &item); + + public: + /** * @brief Updates GUI item of this item */ Result updateItem(); @@ -62,12 +71,6 @@ namespace ucl { */ void setItemAtspiGestureHandler(AtspiGestureHandler handler); - /** - * @brief Gets GUI item Access object of this item - * @return Pointer to Access object or NULL - */ - Elm_Interface_Atspi_Accessible *getItemAo(); - // IDisposable // virtual void dispose() final override; @@ -128,6 +131,22 @@ namespace ucl { ElmStyle checkStyle; /** + * @brief Enable/disable Atspi support state + */ + bool enableAtspi; + + /** + * @brief Constructor + * @param[in] checkPart Part in GUI item for check widget + * @param[in] checkStyle Style of the check widget + * @param[in] enableAtspi Enable/disable Atspi support state + */ + ItemPickModeParams(EdjePart checkPart, ElmStyle checkStyle, + bool enableAtspi = false) : + checkPart(checkPart), checkStyle(checkStyle), + enableAtspi(enableAtspi) {} + + /** * @brief Checks validity of data in this structure * @return true - if valid, false - if not valid */ @@ -268,7 +287,7 @@ namespace ucl { const ItemPickModeParams ¶ms); /** - * @brief Return GUI item insertion parameters + * @brief Gets GUI item insertion parameters * @details Called just before item is added to list * @return Item insertion params structure */ diff --git a/ucl/source/gui/Genlist.cpp b/ucl/source/gui/Genlist.cpp index 6195bde..2b20d48 100644 --- a/ucl/source/gui/Genlist.cpp +++ b/ucl/source/gui/Genlist.cpp @@ -24,7 +24,7 @@ namespace ucl { GenlistSRef Genlist::Builder::build(ElmWidget &parent) const { - Evas_Object *const eo = elm_genlist_add(parent); + Evas_Object *const eo = elm_genlist_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "elm_genlist_add() failed!"); } diff --git a/ucl/source/gui/Layout.cpp b/ucl/source/gui/Layout.cpp index 1509fc5..f5fb2fd 100644 --- a/ucl/source/gui/Layout.cpp +++ b/ucl/source/gui/Layout.cpp @@ -26,7 +26,7 @@ namespace ucl { LayoutSRef Layout::Builder::build(ElmWidget &parent) const { - Evas_Object *const eo = elm_layout_add(parent); + Evas_Object *const eo = elm_layout_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "elm_layout_add() failed!"); } diff --git a/ucl/source/gui/Naviframe.cpp b/ucl/source/gui/Naviframe.cpp index 4cee1f8..7943607 100644 --- a/ucl/source/gui/Naviframe.cpp +++ b/ucl/source/gui/Naviframe.cpp @@ -24,7 +24,7 @@ namespace ucl { NaviframeSRef Naviframe::Builder::build(ElmWidget &parent) const { - Evas_Object *const eo = elm_naviframe_add(parent); + Evas_Object *const eo = elm_naviframe_add(as_eo(parent)); if (!eo) { ELOG("elm_naviframe_add() failed!"); return {}; diff --git a/ucl/source/gui/RadioBox.cpp b/ucl/source/gui/RadioBox.cpp index 3065e0a..ce8ecc7 100644 --- a/ucl/source/gui/RadioBox.cpp +++ b/ucl/source/gui/RadioBox.cpp @@ -24,7 +24,7 @@ namespace ucl { RadioBoxSRef RadioBox::Builder::build(ElmWidget &parent) const { - Evas_Object *const eo = elm_radio_add(parent); + Evas_Object *const eo = elm_radio_add(as_eo(parent)); if (!eo) { LOG_RETURN_VALUE(RES_FAIL, {}, "elm_genlist_add() failed!"); } diff --git a/ucl/source/gui/Widget.cpp b/ucl/source/gui/Widget.cpp index bc7d6e8..7da5d29 100644 --- a/ucl/source/gui/Widget.cpp +++ b/ucl/source/gui/Widget.cpp @@ -35,7 +35,7 @@ namespace ucl { m_handler(std::move(handler)), m_type(static_cast<Evas_Callback_Type>(event)) { - evas_object_event_callback_add(m_widget.getEo(), + evas_object_event_callback_add(as_eo(m_widget), m_type, event_cb, this); } @@ -46,17 +46,17 @@ namespace ucl { m_handler(std::move(handler)), m_type(impl::WIDGET_EVENT_SMART) { - evas_object_smart_callback_add(m_widget.getEo(), + evas_object_smart_callback_add(as_eo(m_widget), m_smartEvent.c_str(), smart_cb, this); } ~EventProxy() { if (m_type == impl::WIDGET_EVENT_SMART) { - evas_object_smart_callback_del_full(m_widget.getEo(), + evas_object_smart_callback_del_full(as_eo(m_widget), m_smartEvent.c_str(), smart_cb, this); } else { - evas_object_event_callback_del_full(m_widget.getEo(), + evas_object_event_callback_del_full(as_eo(m_widget), m_type, event_cb, this); } } diff --git a/ucl/source/gui/Window.cpp b/ucl/source/gui/Window.cpp index 9235513..78addf3 100644 --- a/ucl/source/gui/Window.cpp +++ b/ucl/source/gui/Window.cpp @@ -45,21 +45,22 @@ namespace ucl { } } - StyledWidget bg(elm_bg_add(winEo)); + StyledWidget bg(elm_bg_add(winEo), false); expand(bg); show(bg); - StyledWidget conform(elm_conformant_add(winEo)); + StyledWidget conform(elm_conformant_add(winEo), false); expand(conform); show(conform); - elm_win_resize_object_add(winEo, bg); - elm_win_resize_object_add(winEo, conform); + elm_win_resize_object_add(winEo, as_eo(bg)); + elm_win_resize_object_add(winEo, as_eo(conform)); elm_win_indicator_opacity_set(winEo, ELM_WIN_INDICATOR_OPAQUE); elm_win_conformant_set(winEo, EINA_TRUE); - auto result = makeShared<Window>(winEo, isOwner, conform, PRIVATE); + auto result = makeShared<Window>(winEo, isOwner, + as_eo(conform), PRIVATE); if (m_needBindToEo) { result->bindToEo(); diff --git a/ucl/source/mvp/ListItemPresenter.cpp b/ucl/source/mvp/ListItemPresenter.cpp index a2087d7..bb8d719 100644 --- a/ucl/source/mvp/ListItemPresenter.cpp +++ b/ucl/source/mvp/ListItemPresenter.cpp @@ -69,7 +69,7 @@ namespace ucl { if (const auto widget = item.getItemPartContent( EdjePart(part), *item.m_parent)) { widget->setIsOwner(false); - return widget->getEo(); + return as_eo(*widget); } return nullptr; }; @@ -314,27 +314,41 @@ namespace ucl { return nullptr; } - auto check = makeShared<StyledWidget>(elm_check_add(parent)); + auto check = makeShared<StyledWidget>(elm_check_add(as_eo(parent))); check->setStyle(params.checkStyle); - elm_check_state_set(*check, toEina(m_isItemPicked)); - evas_object_repeat_events_set(*check, EINA_FALSE); - evas_object_propagate_events_set(*check, EINA_FALSE); + elm_check_state_set(as_eo(*check), toEina(m_isItemPicked)); + evas_object_repeat_events_set(as_eo(*check), EINA_FALSE); + evas_object_propagate_events_set(as_eo(*check), EINA_FALSE); check->addEventHandler( impl::CHECK_CHANGED, WEAK_DELEGATE_THIS(onPickCheckChanged)); + if (params.enableAtspi) { + auto itemAtspi = getItemAtspi(); + if (itemAtspi) { + auto &checkAtspi = check->getAtspi(); + + checkAtspi.addRelationship(ELM_ATSPI_RELATION_CONTROLLED_BY, + as_ao(*itemAtspi)); + itemAtspi->addRelationship(ELM_ATSPI_RELATION_CONTROLLER_FOR, + as_ao(checkAtspi)); + itemAtspi->addRelationship(ELM_ATSPI_RELATION_DESCRIBED_BY, + as_ao(checkAtspi)); + } + } + return check; } void ListItemPresenter::onPickCheckChanged(Widget &widget, void *eventInfo) { if (!isActive()) { - elm_check_state_set(widget, toEina(m_isItemPicked)); + elm_check_state_set(as_eo(widget), toEina(m_isItemPicked)); return; } - handleItemPick(elm_check_state_get(widget)); + handleItemPick(elm_check_state_get(as_eo(widget))); if (m_item) { elm_genlist_item_bring_in(m_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE); @@ -408,14 +422,6 @@ namespace ucl { m_itemAtspiGestureHandler = std::move(handler); } - Elm_Interface_Atspi_Accessible *ListItemPresenter::getItemAo() - { - if (const auto atspi = getItemAtspi()) { - return atspi->getAo(); - } - return nullptr; - } - Result ListItemPresenter::updateItemStyle(const ElmStyle newItemStyle) { if (!m_item) { @@ -503,4 +509,12 @@ namespace ucl { void ListItemPresenter::onItemLongpressed() { } + + // Non-member functions // + + const Elm_Interface_Atspi_Accessible *as_ao( + const ListItemPresenter &item) + { + return as_ao(item.getItemAtspi()); + } } diff --git a/ucl/source/mvp/ListPresenter.cpp b/ucl/source/mvp/ListPresenter.cpp index 407cb5c..242928e 100644 --- a/ucl/source/mvp/ListPresenter.cpp +++ b/ucl/source/mvp/ListPresenter.cpp @@ -123,7 +123,7 @@ namespace ucl { expandAndFill(*m_genlist); // TODO Add Scroller widget. - elm_scroller_content_min_limit(*m_genlist, + elm_scroller_content_min_limit(as_eo(*m_genlist), toEina((flags & FLAG_CALC_X_MIN) != 0), toEina((flags & FLAG_CALC_Y_MIN) != 0)); @@ -262,7 +262,7 @@ namespace ucl { if (!relItem) { LOG_RETURN(RES_FAIL, "relItem is NULL!"); } - if (relItem.getWidget() != m_genlist->getEo()) { + if (relItem.getWidget() != as_eo(*m_genlist)) { LOG_RETURN(RES_FAIL, "relItem has wrong genlist!"); } return insert(itemPresenter, parent, |