instead of occupying public callback.
Change-Id: I2a54f533ca40626d4b861a52044190a9814a3050
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
namespace Model
{
class ContactFieldMetadata;
+ class ContactFieldContainer;
/**
* @brief Polymorphic adapter for contacts_record_h property.
/**
* @brief Create contact field.
+ * @param[in] parent Parent field container
* @param[in] metadata Field metadata
*/
- ContactField(const ContactFieldMetadata &metadata);
+ ContactField(ContactFieldContainer *parent,
+ const ContactFieldMetadata &metadata);
virtual ~ContactField() { }
/**
*/
unsigned getPropertyId() const;
+ /**
+ * @return Parent container.
+ */
+ ContactFieldContainer *getParent() const;
+
protected:
/**
* @return Field metadata.
private:
contacts_record_h m_Record;
const ContactFieldMetadata &m_Metadata;
+ ContactFieldContainer *m_Parent;
FillCallback m_OnFilled;
};
void removeField(ContactField &field);
private:
- void onChildFilled(bool isChildFilled);
+ friend ContactField;
+ void onChildFilled(ContactField &field, bool isChildFilled);
ContactFields m_Fields;
size_t m_FilledCount = 0;
public:
/**
* @brief Create record property adaptor.
+ * @param[in] parent Parent field container
* @param[in] metadata Adaptor field metadata
* @return Adaptor field.
*/
- static ContactFieldPtr createField(const ContactFieldMetadata &metadata);
+ static ContactFieldPtr createField(ContactFieldContainer *parent,
+ const ContactFieldMetadata &metadata);
};
}
}
using namespace Contacts::Model;
Contact::Contact(ContactObjectType type)
- : ContactObject(*getContactMetadata(type)), m_IsNew(true)
+ : ContactObject(nullptr, *getContactMetadata(type)), m_IsNew(true)
{
}
using namespace Contacts::Model;
-ContactField::ContactField(const ContactFieldMetadata &metadata)
- : m_Record(nullptr), m_Metadata(metadata)
+ContactField::ContactField(ContactFieldContainer *parent,
+ const ContactFieldMetadata &metadata)
+ : m_Record(nullptr), m_Metadata(metadata), m_Parent(parent)
{
}
return m_Metadata.propId;
}
+ContactFieldContainer *ContactField::getParent() const
+{
+ return m_Parent;
+}
+
const ContactFieldMetadata &ContactField::getMetadata() const
{
return m_Metadata;
if (m_OnFilled) {
m_OnFilled(isFilled);
}
+
+ if (m_Parent) {
+ m_Parent->onChildFilled(*this, isFilled);
+ }
}
#include "Contacts/Model/ContactFieldContainer.h"
#include "Contacts/Model/ContactFieldFactory.h"
-
#include <algorithm>
using namespace Contacts::Model;
ContactField &ContactFieldContainer::addField(contacts_record_h record,
const ContactFieldMetadata &metadata)
{
- ContactFieldPtr field = ContactFieldFactory::createField(metadata);
+ ContactFieldPtr field = ContactFieldFactory::createField(this, metadata);
field->initialize(record);
- if (field->isRequired()) {
- if (field->isFilled()) {
- onChildFilled(true);
- }
-
- field->setFillCallback(std::bind(&ContactFieldContainer::onChildFilled,
- this, std::placeholders::_1));
- }
-
m_Fields.push_back(std::move(field));
return *m_Fields.back();
}
return ptr.get() == &field;
};
- if (field.isRequired() && field.isFilled()) {
- onChildFilled(false);
+ if (field.isFilled()) {
+ onChildFilled(field, false);
}
m_Fields.erase(std::remove_if(m_Fields.begin(), m_Fields.end(), comp), m_Fields.end());
}
-void ContactFieldContainer::onChildFilled(bool isChildFilled)
+void ContactFieldContainer::onChildFilled(ContactField &field, bool isChildFilled)
{
+ if (!field.isRequired()) {
+ return;
+ }
+
/* Equals zero if no fields were PREVIOUSLY filled or no fields are NOW filled */
size_t checkCount = isChildFilled ? m_FilledCount++ : --m_FilledCount;
using namespace Contacts::Model;
-ContactFieldPtr ContactFieldFactory::createField(const ContactFieldMetadata &metadata)
+ContactFieldPtr ContactFieldFactory::createField(ContactFieldContainer *parent,
+ const ContactFieldMetadata &metadata)
{
ContactField *field = nullptr;
switch(metadata.typeMetadata->type) {
case TypeBool:
- field = new ContactBoolField(metadata); break;
+ field = new ContactBoolField(parent, metadata); break;
case TypeEnum:
- field = new ContactEnumField(metadata); break;
+ field = new ContactEnumField(parent, metadata); break;
case TypeText:
- field = new ContactTextField(metadata); break;
+ field = new ContactTextField(parent, metadata); break;
case TypeDate:
- field = new ContactDateField(metadata); break;
+ field = new ContactDateField(parent, metadata); break;
case TypeArray:
- field = new ContactArray(metadata); break;
+ field = new ContactArray(parent, metadata); break;
case TypeObject:
{
unsigned subType = metadata.typeMetadata->subType;
if (subType & ObjectTyped) {
- field = new ContactTypedObject(metadata);
+ field = new ContactTypedObject(parent, metadata);
} else if (subType & ObjectCompound) {
switch (metadata.id) {
case FieldName:
- field = new ContactName(metadata);
+ field = new ContactName(parent, metadata);
break;
case FieldPhoneticName:
- field = new ContactPhoneticName(metadata);
+ field = new ContactPhoneticName(parent, metadata);
break;
}
} else {
- field = new ContactObject(metadata);
+ field = new ContactObject(parent, metadata);
}
}
break;
if (value) {
m_InitialValue = value;
}
+ if (!m_InitialValue.empty()) {
+ onFilled(true);
+ }
}
void ContactTypedObject::onInitialize(contacts_record_h record)
{
ContactObject::onInitialize(record);
- m_TypeField = ContactFieldFactory::createField(getTypedObjectMetadata().typeField);
- m_LabelField = ContactFieldFactory::createField(getTypedObjectMetadata().labelField);
+ m_TypeField = ContactFieldFactory::createField(this, getTypedObjectMetadata().typeField);
+ m_LabelField = ContactFieldFactory::createField(this, getTypedObjectMetadata().labelField);
m_TypeField->initialize(record);
m_LabelField->initialize(record);