#ifndef DateTimeEditElement_h
#define DateTimeEditElement_h
#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
#include "core/html/forms/StepRange.h"
#include "core/html/shadow/DateTimeFieldElement.h"
#include "platform/DateComponents.h"
namespace WebCore {
class DateTimeFieldsState;
class KeyboardEvent;
class Locale;
class MouseEvent;
class StepRange;
class DateTimeEditElement FINAL : public HTMLDivElement, public DateTimeFieldElement::FieldOwner {
WTF_MAKE_NONCOPYABLE(DateTimeEditElement);
public:
class EditControlOwner {
public:
virtual ~EditControlOwner();
virtual void didBlurFromControl() = 0;
virtual void didFocusOnControl() = 0;
virtual void editControlValueChanged() = 0;
virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const = 0;
virtual bool isEditControlOwnerDisabled() const = 0;
virtual bool isEditControlOwnerReadOnly() const = 0;
virtual AtomicString localeIdentifier() const = 0;
};
struct LayoutParameters {
String dateTimeFormat;
String fallbackDateTimeFormat;
Locale& locale;
const StepRange stepRange;
DateComponents minimum;
DateComponents maximum;
String placeholderForDay;
String placeholderForMonth;
String placeholderForYear;
LayoutParameters(Locale& locale, const StepRange& stepRange)
: locale(locale)
, stepRange(stepRange)
{
}
};
static PassRefPtr<DateTimeEditElement> create(Document&, EditControlOwner&);
virtual ~DateTimeEditElement();
void addField(PassRefPtr<DateTimeFieldElement>);
bool anyEditableFieldsHaveValues() const;
void blurByOwner();
virtual void defaultEventHandler(Event*) OVERRIDE;
void disabledStateChanged();
Element* fieldsWrapperElement() const;
void focusIfNoFocus();
void focusByOwner(Element* oldFocusedElement = 0);
bool hasFocusedField();
void readOnlyStateChanged();
void removeEditControlOwner() { m_editControlOwner = 0; }
void resetFields();
void setEmptyValue(const LayoutParameters&, const DateComponents& dateForReadOnlyField);
void setValueAsDate(const LayoutParameters&, const DateComponents&);
void setValueAsDateTimeFieldsState(const DateTimeFieldsState&);
void setOnlyYearMonthDay(const DateComponents&);
void stepDown();
void stepUp();
String value() const;
DateTimeFieldsState valueAsDateTimeFieldsState() const;
private:
static const size_t invalidFieldIndex = static_cast<size_t>(-1);
static const int maximumNumberOfFields = 8;
DateTimeEditElement(Document&, EditControlOwner&);
DateTimeFieldElement* fieldAt(size_t) const;
size_t fieldIndexOf(const DateTimeFieldElement&) const;
DateTimeFieldElement* focusedField() const;
size_t focusedFieldIndex() const;
bool focusOnNextFocusableField(size_t startIndex);
bool isDisabled() const;
bool isReadOnly() const;
void layout(const LayoutParameters&, const DateComponents&);
void updateUIState();
virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
virtual bool isDateTimeEditElement() const OVERRIDE;
virtual void didBlurFromField() OVERRIDE;
virtual void didFocusOnField() OVERRIDE;
virtual void fieldValueChanged() OVERRIDE;
virtual bool focusOnNextField(const DateTimeFieldElement&) OVERRIDE;
virtual bool focusOnPreviousField(const DateTimeFieldElement&) OVERRIDE;
virtual bool isFieldOwnerDisabled() const OVERRIDE;
virtual bool isFieldOwnerReadOnly() const OVERRIDE;
virtual AtomicString localeIdentifier() const OVERRIDE;
Vector<DateTimeFieldElement*, maximumNumberOfFields> m_fields;
EditControlOwner* m_editControlOwner;
};
DEFINE_TYPE_CASTS(DateTimeEditElement, Element, element, element->isDateTimeEditElement(), element.isDateTimeEditElement());
}
#endif
#endif