Modified: trunk/Source/WebCore/html/TimeInputType.cpp (129205 => 129206)
--- trunk/Source/WebCore/html/TimeInputType.cpp 2012-09-21 09:44:19 UTC (rev 129205)
+++ trunk/Source/WebCore/html/TimeInputType.cpp 2012-09-21 10:06:10 UTC (rev 129206)
@@ -46,6 +46,7 @@
#include "ElementShadow.h"
#include "FormController.h"
#include "KeyboardEvent.h"
+#include "Localizer.h"
#include "ShadowRoot.h"
#endif
@@ -304,14 +305,25 @@
return;
Localizer& localizer = element()->document()->getLocalizer(element()->computeInheritedLanguage());
- const StepRange stepRange(createStepRange(AnyIsDefaultStep));
+ DateTimeEditElement::LayoutParameters layoutParameters(localizer, createStepRange(AnyIsDefaultStep));
+
DateComponents date;
- if (parseToDateComponents(element()->value(), &date))
- m_dateTimeEditElement->setValueAsDate(stepRange, date, localizer);
- else {
- setMillisecondToDateComponents(stepRange.minimum().toDouble(), &date);
- m_dateTimeEditElement->setEmptyValue(stepRange, date, localizer);
+ const bool hasValue = parseToDateComponents(element()->value(), &date);
+ if (!hasValue)
+ setMillisecondToDateComponents(layoutParameters.stepRange.minimum().toDouble(), &date);
+
+ if (date.second() || layoutParameters.shouldHaveSecondField()) {
+ layoutParameters.dateTimeFormat = localizer.timeFormat();
+ layoutParameters.fallbackDateTimeFormat = "HH:mm:ss";
+ } else {
+ layoutParameters.dateTimeFormat = localizer.shortTimeFormat();
+ layoutParameters.fallbackDateTimeFormat = "HH:mm";
}
+
+ if (hasValue)
+ m_dateTimeEditElement->setValueAsDate(layoutParameters, date);
+ else
+ m_dateTimeEditElement->setEmptyValue(layoutParameters, date);
}
#else
TimeInputType::TimeInputType(HTMLInputElement* element)
Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp (129205 => 129206)
--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp 2012-09-21 09:44:19 UTC (rev 129205)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.cpp 2012-09-21 10:06:10 UTC (rev 129206)
@@ -35,11 +35,8 @@
#include "EventHandler.h"
#include "HTMLNames.h"
#include "KeyboardEvent.h"
-#include "LocalizedDate.h"
-#include "LocalizedNumber.h"
#include "Localizer.h"
#include "MouseEvent.h"
-#include "StepRange.h"
#include "Text.h"
#include <wtf/DateMath.h>
#include <wtf/text/StringBuilder.h>
@@ -52,14 +49,12 @@
WTF_MAKE_NONCOPYABLE(DateTimeEditBuilder);
public:
- DateTimeEditBuilder(DateTimeEditElement&, const StepRange&, const DateComponents&, Localizer&);
+ DateTimeEditBuilder(DateTimeEditElement&, const DateTimeEditElement::LayoutParameters&, const DateComponents&);
bool build(const String&);
- bool needSecondField() const;
private:
bool needMillisecondField() const;
- bool needMinuteField() const;
bool shouldMillisecondFieldReadOnly() const;
bool shouldMinuteFieldReadOnly() const;
bool shouldSecondFieldReadOnly() const;
@@ -74,11 +69,11 @@
Localizer& m_localizer;
};
-DateTimeEditBuilder::DateTimeEditBuilder(DateTimeEditElement& elemnt, const StepRange& stepRange, const DateComponents& dateValue, Localizer& localizer)
+DateTimeEditBuilder::DateTimeEditBuilder(DateTimeEditElement& elemnt, const DateTimeEditElement::LayoutParameters& layoutParameters, const DateComponents& dateValue)
: m_editElement(elemnt)
, m_dateValue(dateValue)
- , m_stepRange(stepRange)
- , m_localizer(localizer)
+ , m_stepRange(layoutParameters.stepRange)
+ , m_localizer(layoutParameters.localizer)
{
}
@@ -95,20 +90,6 @@
|| !m_stepRange.step().remainder(static_cast<int>(msPerSecond)).isZero();
}
-bool DateTimeEditBuilder::needMinuteField() const
-{
- return m_dateValue.minute()
- || !m_stepRange.minimum().remainder(static_cast<int>(msPerHour)).isZero()
- || !m_stepRange.step().remainder(static_cast<int>(msPerHour)).isZero();
-}
-
-bool DateTimeEditBuilder::needSecondField() const
-{
- return m_dateValue.second()
- || !m_stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
- || !m_stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
-}
-
void DateTimeEditBuilder::visitField(DateTimeFormat::FieldType fieldType, int)
{
Document* const document = m_editElement.document();
@@ -191,6 +172,15 @@
// ----------------------------
+
+bool DateTimeEditElement::LayoutParameters::shouldHaveSecondField() const
+{
+ return !stepRange.minimum().remainder(static_cast<int>(msPerMinute)).isZero()
+ || !stepRange.step().remainder(static_cast<int>(msPerMinute)).isZero();
+}
+
+// ----------------------------
+
DateTimeEditElement::EditControlOwner::~EditControlOwner()
{
}
@@ -340,18 +330,17 @@
return m_editControlOwner && m_editControlOwner->isEditControlOwnerReadOnly();
}
-void DateTimeEditElement::layout(const StepRange& stepRange, const DateComponents& dateValue, Localizer& localizer)
+void DateTimeEditElement::layout(const LayoutParameters& layoutParameters, const DateComponents& dateValue)
{
size_t focusedFieldIndex = this->focusedFieldIndex();
DateTimeFieldElement* const focusedField = fieldAt(focusedFieldIndex);
const AtomicString focusedFieldId = focusedField ? focusedField->shadowPseudoId() : nullAtom;
- DateTimeEditBuilder builder(*this, stepRange, dateValue, localizer);
- const String dateTimeFormat = builder.needSecondField() ? localizer.timeFormat() : localizer.shortTimeFormat();
+ DateTimeEditBuilder builder(*this, layoutParameters, dateValue);
Node* lastChildToBeRemoved = lastChild();
- if (!builder.build(dateTimeFormat) || m_fields.isEmpty()) {
+ if (!builder.build(layoutParameters.dateTimeFormat) || m_fields.isEmpty()) {
lastChildToBeRemoved = lastChild();
- builder.build(builder.needSecondField() ? "HH:mm:ss" : "HH:mm");
+ builder.build(layoutParameters.fallbackDateTimeFormat);
}
if (focusedFieldIndex != invalidFieldIndex) {
@@ -407,9 +396,9 @@
HTMLDivElement::defaultEventHandler(event);
}
-void DateTimeEditElement::setValueAsDate(const StepRange& stepRange, const DateComponents& date, Localizer& localizer)
+void DateTimeEditElement::setValueAsDate(const LayoutParameters& layoutParameters, const DateComponents& date)
{
- layout(stepRange, date, localizer);
+ layout(layoutParameters, date);
for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
m_fields[fieldIndex]->setValueAsDate(date);
}
@@ -420,9 +409,9 @@
m_fields[fieldIndex]->setValueAsDateTimeFieldsState(dateTimeFieldsState, dateForReadOnlyField);
}
-void DateTimeEditElement::setEmptyValue(const StepRange& stepRange, const DateComponents& dateForReadOnlyField, Localizer& localizer)
+void DateTimeEditElement::setEmptyValue(const LayoutParameters& layoutParameters, const DateComponents& dateForReadOnlyField)
{
- layout(stepRange, dateForReadOnlyField, localizer);
+ layout(layoutParameters, dateForReadOnlyField);
for (size_t fieldIndex = 0; fieldIndex < m_fields.size(); ++fieldIndex)
m_fields[fieldIndex]->setEmptyValue(dateForReadOnlyField, DateTimeFieldElement::DispatchNoEvent);
}
Modified: trunk/Source/WebCore/html/shadow/DateTimeEditElement.h (129205 => 129206)
--- trunk/Source/WebCore/html/shadow/DateTimeEditElement.h 2012-09-21 09:44:19 UTC (rev 129205)
+++ trunk/Source/WebCore/html/shadow/DateTimeEditElement.h 2012-09-21 10:06:10 UTC (rev 129206)
@@ -29,11 +29,10 @@
#if ENABLE(INPUT_TYPE_TIME_MULTIPLE_FIELDS)
#include "DateTimeFieldElement.h"
#include "SpinButtonElement.h"
+#include "StepRange.h"
namespace WebCore {
-class DateComponents;
-class DateTimeEditLayouter;
class DateTimeFieldsState;
class KeyboardEvent;
class Localizer;
@@ -60,6 +59,21 @@
virtual bool isEditControlOwnerReadOnly() const = 0;
};
+ struct LayoutParameters {
+ String dateTimeFormat;
+ String fallbackDateTimeFormat;
+ Localizer& localizer;
+ const StepRange& stepRange;
+
+ LayoutParameters(Localizer& localizer, const StepRange& stepRange)
+ : localizer(localizer)
+ , stepRange(stepRange)
+ {
+ }
+
+ bool shouldHaveSecondField() const;
+ };
+
static PassRefPtr<DateTimeEditElement> create(Document*, EditControlOwner&);
virtual ~DateTimeEditElement();
@@ -71,8 +85,8 @@
void readOnlyStateChanged();
void removeEditControlOwner() { m_editControlOwner = 0; }
void resetFields();
- void setEmptyValue(const StepRange&, const DateComponents& dateForReadOnlyField, Localizer&);
- void setValueAsDate(const StepRange&, const DateComponents&, Localizer&);
+ void setEmptyValue(const LayoutParameters&, const DateComponents& dateForReadOnlyField);
+ void setValueAsDate(const LayoutParameters&, const DateComponents&);
void setValueAsDateTimeFieldsState(const DateTimeFieldsState&, const DateComponents& dateForReadOnlyField);
DateTimeFieldsState valueAsDateTimeFieldsState() const;
double valueAsDouble() const;
@@ -99,7 +113,7 @@
size_t focusedFieldIndex() const;
bool isDisabled() const;
bool isReadOnly() const;
- void layout(const StepRange&, const DateComponents&, Localizer&);
+ void layout(const LayoutParameters&, const DateComponents&);
void updateUIState();
// DateTimeFieldElement::FieldOwner functions.