#include "config.h"
#include "DateInputType.h"
#include "CalendarPickerElement.h"
#include "DateComponents.h"
#include "HTMLInputElement.h"
#include "HTMLNames.h"
#include "KeyboardEvent.h"
#include "LocalizedDate.h"
#include <wtf/PassOwnPtr.h>
#if ENABLE(INPUT_TYPE_DATE)
namespace WebCore {
using namespace HTMLNames;
static const double dateDefaultStep = 1.0;
static const double dateStepScaleFactor = 86400000.0;
inline DateInputType::DateInputType(HTMLInputElement* element)
: BaseDateAndTimeInputType(element)
{
}
PassOwnPtr<InputType> DateInputType::create(HTMLInputElement* element)
{
return adoptPtr(new DateInputType(element));
}
const AtomicString& DateInputType::formControlType() const
{
return InputTypeNames::date();
}
DateComponents::Type DateInputType::dateType() const
{
return DateComponents::Date;
}
double DateInputType::minimum() const
{
return parseToDouble(element()->fastGetAttribute(minAttr), DateComponents::minimumDate());
}
double DateInputType::maximum() const
{
return parseToDouble(element()->fastGetAttribute(maxAttr), DateComponents::maximumDate());
}
double DateInputType::defaultStep() const
{
return dateDefaultStep;
}
double DateInputType::stepScaleFactor() const
{
return dateStepScaleFactor;
}
bool DateInputType::parsedStepValueShouldBeInteger() const
{
return true;
}
bool DateInputType::parseToDateComponentsInternal(const UChar* characters, unsigned length, DateComponents* out) const
{
ASSERT(out);
unsigned end;
return out->parseDate(characters, length, 0, end) && end == length;
}
bool DateInputType::setMillisecondToDateComponents(double value, DateComponents* date) const
{
ASSERT(date);
return date->setMillisecondsSinceEpochForDate(value);
}
#if ENABLE(CALENDAR_PICKER)
void DateInputType::createShadowSubtree()
{
BaseDateAndTimeInputType::createShadowSubtree();
m_pickerElement = CalendarPickerElement::create(element()->document());
containerElement()->insertBefore(m_pickerElement.get(), innerBlockElement()->nextSibling(), ASSERT_NO_EXCEPTION);
}
void DateInputType::destroyShadowSubtree()
{
TextFieldInputType::destroyShadowSubtree();
m_pickerElement.clear();
}
bool DateInputType::needsContainer() const
{
return true;
}
bool DateInputType::shouldHaveSpinButton() const
{
return false;
}
void DateInputType::handleKeydownEvent(KeyboardEvent* event)
{
if (element()->disabled() || element()->readOnly())
return;
if (event->keyIdentifier() == "Down") {
if (m_pickerElement)
m_pickerElement->openPopup();
event->setDefaultHandled();
return;
}
BaseDateAndTimeInputType::handleKeydownEvent(event);
}
void DateInputType::handleBlurEvent()
{
if (m_pickerElement)
m_pickerElement->closePopup();
element()->setFormControlValueMatchesRenderer(false);
element()->updateInnerTextValue();
}
bool DateInputType::supportsPlaceholder() const
{
return true;
}
bool DateInputType::usesFixedPlaceholder() const
{
return true;
}
String DateInputType::fixedPlaceholder()
{
return localizedDateFormatText();
}
#endif // ENABLE(CALENDAR_PICKER)
} #endif