package com.quemb.qmbform.descriptor; import com.quemb.qmbform.R; import com.quemb.qmbform.annotation.FormElement; import com.quemb.qmbform.annotation.FormValidator; import android.content.Context; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import static com.quemb.qmbform.annotation.FormDescriptorAnnotationFactory.convertFormOptionsAnnotation; /** * Created by tonimoeckel on 14.07.14. */ public class RowDescriptor<T> extends FormItemDescriptor { public static final String FormRowDescriptorTypeName = "name"; public static final String FormRowDescriptorTypeNameVertical = "nameVertical"; public static final String FormRowDescriptorTypeText = "text"; public static final String FormRowDescriptorTypeTextInline = "textInline"; public static final String FormRowDescriptorTypeHTMLText = "htmlText"; public static final String FormRowDescriptorTypeDetailInline = "detailInline"; public static final String FormRowDescriptorTypeDetail = "detail"; public static final String FormRowDescriptorTypeURL = "url"; public static final String FormRowDescriptorTypeEmail = "email"; public static final String FormRowDescriptorTypeEmailInline = "emailInline"; public static final String FormRowDescriptorTypePassword = "password"; public static final String FormRowDescriptorTypePasswordInline = "passwordInline"; public static final String FormRowDescriptorTypeNumber = "number"; public static final String FormRowDescriptorTypeNumberInline = "numberInline"; public static final String FormRowDescriptorTypeIntegerSlider = "integerSlider"; public static final String FormRowDescriptorTypeCurrency = "currency"; public static final String FormRowDescriptorTypePhone = "phone"; public static final String FormRowDescriptorTypeTwitter = "twitter"; public static final String FormRowDescriptorTypeAccount = "account"; public static final String FormRowDescriptorTypeInteger = "integer"; public static final String FormRowDescriptorTypeIntegerInline = "integerInline"; public static final String FormRowDescriptorTypeTextView = "textView"; public static final String FormRowDescriptorTypeTextViewInline = "textViewInline"; public static final String FormRowDescriptorTypeSelectorPush = "selectorPush"; public static final String FormRowDescriptorTypeSelectorActionSheet = "selectorActionSheet"; public static final String FormRowDescriptorTypeSelectorAlertView = "selectorAlertView"; public static final String FormRowDescriptorTypeSelectorPickerView = "selectorPickerView"; public static final String FormRowDescriptorTypeSelectorPickerViewInline = "selectorPickerViewInline"; public static final String FormRowDescriptorTypeSelectorSpinner = "selectorSpinner"; public static final String FormRowDescriptorTypeSelectorSpinnerInline = "selectorSpinnerInline"; public static final String FormRowDescriptorTypeTextPickerDialog = "textPickerDialog"; public static final String FormRowDescriptorTypeSelectorPickerDialog = "selectorPickerDialog"; public static final String FormRowDescriptorTypeSelectorPickerDialogVertical = "selectorPickerDialogVertical"; public static final String FormRowDescriptorTypeMultipleSelector = "multipleSelector"; public static final String FormRowDescriptorTypeSelectorLeftRight = "selectorLeftRight"; public static final String FormRowDescriptorTypeDateInline = "dateInline"; public static final String FormRowDescriptorTypeDateTimeInline = "datetimeInline"; public static final String FormRowDescriptorTypeTimeInline = "timeInline"; public static final String FormRowDescriptorTypeDate = "date"; public static final String FormRowDescriptorTypeDateTime = "datetime"; public static final String FormRowDescriptorTypeTime = "time"; public static final String FormRowDescriptorTypeDatePicker = "datePicker"; public static final String FormRowDescriptorTypePicker = "picker"; public static final String FormRowDescriptorTypeBooleanCheck = "booleanCheck"; public static final String FormRowDescriptorTypeBooleanSwitch = "booleanSwitch"; public static final String FormRowDescriptorTypeButton = "button"; public static final String FormRowDescriptorTypeButtonInline = "buttonInline"; public static final String FormRowDescriptorTypeImage = "image"; public static final String FormRowDescriptorTypeWeb = "web"; public static final String FormRowDescriptorTypeExternal = "external"; public static final String FormRowDescriptorTypeStepCounter = "stepCounter"; public static final String FormRowDescriptorTypeSectionSeperator = "sectionSeperator"; public static final String FormRowDescriptorTypeHtmlVertical = "htmlVertical"; public static final String FormRowDescriptorTypeSelectorMultipleDialog = "selectorMultipleDialog"; private String mRowType; private Value<T> mValue; /** * A list of valid values to pick from (e.g. used for spinners) */ private DataSource<T> mDataSource; private Boolean mRequired = false; private Boolean mDisabled = false; private List<FormValidator> mValidators; private List<FormOptionsObject> mSelectorOptions; private SectionDescriptor mSectionDescriptor; private int mHint = android.R.string.untitled; private boolean mLastRowInSection = false; public static RowDescriptor newInstance(String tag) { return RowDescriptor.newInstance(tag, FormRowDescriptorTypeDetailInline); } public static RowDescriptor newInstance(String tag, String rowType) { return RowDescriptor.newInstance(tag, rowType, null); } public static RowDescriptor newInstance(String tag, String rowType, String title) { return RowDescriptor.newInstance(tag, rowType, title, null); } public static RowDescriptor newInstance(String tag, String rowType, String title, Value<?> value) { RowDescriptor descriptor = new RowDescriptor(); descriptor.mTitle = title; descriptor.mTag = tag; descriptor.mRowType = rowType; descriptor.setValue(value); descriptor.mValidators = new ArrayList<FormValidator>(); return descriptor; } public static RowDescriptor newInstanceFromAnnotatedField(Field field, Value value, Context context) { FormElement annotation = field.getAnnotation(FormElement.class); RowDescriptor rowDescriptor = RowDescriptor.newInstance( annotation.tag().length() > 0 ? annotation.tag() : field.getName(), annotation.rowDescriptorType(), context.getString(annotation.label()), value); rowDescriptor.setHint(annotation.hint()); rowDescriptor.setRequired(annotation.required()); rowDescriptor.setDisabled(annotation.disabled()); rowDescriptor.setSelectorOptions(convertFormOptionsAnnotation( annotation.selectorOptions())); return rowDescriptor; } public SectionDescriptor getSectionDescriptor() { return mSectionDescriptor; } public void setSectionDescriptor(SectionDescriptor sectionDescriptor) { mSectionDescriptor = sectionDescriptor; } public Value<T> getValue() { return mValue; } public void setValue(@SuppressWarnings("unchecked") Value<T> value) { mValue = value; } public Object getValueData() { return mValue.getValue(); } public Boolean getRequired() { return mRequired; } public void setRequired(Boolean required) { mRequired = required; } public String getRowType() { return mRowType; } public boolean hasDataSource() { return mDataSource != null; } public DataSource<T> getDataSource() { return mDataSource; } public void setDataSource(DataSource<T> dataSource) { mDataSource = dataSource; } public Boolean getDisabled() { return mDisabled; } public void setDisabled(Boolean disabled) { mDisabled = disabled; } public void setHint(int hint) { mHint = hint; } public int getHint() { return mHint; } public String getHint(Context context) { if (mHint == android.R.string.untitled) { return null; } return context.getString(mHint); } public boolean isValid() { boolean valid = true; if (getRequired()) { valid = getValue() != null && getValue().getValue() != null; if (getSelectorOptions() != null && getSelectorOptions().size() > 0) { valid = valid && FormOptionsObject.formOptionsObjectFromArrayWithValue(getValue().getValue(), getSelectorOptions()) != null; } } if (getValidators() != null && valid) { for (FormValidator validator : getValidators()) { if (validator.validate(this) != null) { valid = false; break; } } } return valid; } public List<FormOptionsObject> getSelectorOptions() { return mSelectorOptions; } public void setSelectorOptions(List<FormOptionsObject> selectorOptions) { mSelectorOptions = selectorOptions; } public List<RowValidationError> getValidationErrors() { List<RowValidationError> rowValidationErrors = new ArrayList<RowValidationError>(); if (getRequired()) { if (!(getValue() != null && getValue().getValue() != null)) { rowValidationErrors.add(new RowValidationError(this, R.string.validation_is_required)); } else if (getSelectorOptions() != null && getSelectorOptions().size() > 0) { if (FormOptionsObject.formOptionsObjectFromArrayWithValue(getValue().getValue(), getSelectorOptions()) == null) { rowValidationErrors.add(new RowValidationError(this, R.string.validation_is_required)); } } } if (getValidators() != null) { for (FormValidator validator : getValidators()) { RowValidationError error = validator.validate(this); if (error != null) { rowValidationErrors.add(error); } } } return (rowValidationErrors.isEmpty()) ? null : rowValidationErrors; } public static RowDescriptor newInstance(RowDescriptor rowDescriptor) { Long tsLong = System.currentTimeMillis() / 1000; String ts = tsLong.toString(); RowDescriptor newInstance = RowDescriptor.newInstance(rowDescriptor.getTag() + "_" + ts, rowDescriptor.getRowType()); newInstance.setDataSource(rowDescriptor.getDataSource()); return newInstance; } public List<FormValidator> getValidators() { return mValidators; } public void addValidator(FormValidator validator) { mValidators.add(validator); } public void setLastRowInSection(boolean lastRow) { mLastRowInSection = lastRow; } public boolean isLastRowInSection() { return mLastRowInSection; } }