blob: c0ddde11eccc6bf6b10d315382ec946f77509acd [file] [log] [blame]
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +01001/*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 * SUCH DAMAGE.
24 */
25
26#ifndef DateTimeEditElement_h
27#define DateTimeEditElement_h
28
29#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
30#include "core/html/StepRange.h"
31#include "core/html/shadow/DateTimeFieldElement.h"
32#include "core/platform/DateComponents.h"
33
34namespace WebCore {
35
36class DateTimeFieldsState;
37class KeyboardEvent;
38class Locale;
39class MouseEvent;
40class StepRange;
41
42// DateTimeEditElement class contains numberic field and symbolc field for
43// representing date and time, such as
44// - Year, Month, Day Of Month
45// - Hour, Minute, Second, Millisecond, AM/PM
46class DateTimeEditElement FINAL : public HTMLDivElement, public DateTimeFieldElement::FieldOwner {
47 WTF_MAKE_NONCOPYABLE(DateTimeEditElement);
48
49public:
50 // EditControlOwner implementer must call removeEditControlOwner when
51 // it doesn't handle event, e.g. at destruction.
52 class EditControlOwner {
53 public:
54 virtual ~EditControlOwner();
55 virtual void didBlurFromControl() = 0;
56 virtual void didFocusOnControl() = 0;
57 virtual void editControlValueChanged() = 0;
58 virtual String formatDateTimeFieldsState(const DateTimeFieldsState&) const = 0;
59 virtual bool isEditControlOwnerDisabled() const = 0;
60 virtual bool isEditControlOwnerReadOnly() const = 0;
61 virtual AtomicString localeIdentifier() const = 0;
62 };
63
64 struct LayoutParameters {
65 String dateTimeFormat;
66 String fallbackDateTimeFormat;
67 Locale& locale;
68 const StepRange stepRange;
69 DateComponents minimum;
70 DateComponents maximum;
71 String placeholderForDay;
72 String placeholderForMonth;
73 String placeholderForYear;
74
75 LayoutParameters(Locale& locale, const StepRange& stepRange)
76 : locale(locale)
77 , stepRange(stepRange)
78 {
79 }
80 };
81
82 static PassRefPtr<DateTimeEditElement> create(Document*, EditControlOwner&);
83
84 virtual ~DateTimeEditElement();
85 void addField(PassRefPtr<DateTimeFieldElement>);
86 bool anyEditableFieldsHaveValues() const;
87 void blurByOwner();
88 virtual void defaultEventHandler(Event*) OVERRIDE;
89 void disabledStateChanged();
90 Element* fieldsWrapperElement() const;
91 void focusIfNoFocus();
92 // If oldFocusedNode is one of sub-fields, focus on it. Otherwise focus on
93 // the first sub-field.
Ben Murdoch02772c62013-07-26 10:21:05 +010094 void focusByOwner(Element* oldFocusedElement = 0);
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +010095 bool hasFocusedField();
96 void readOnlyStateChanged();
97 void removeEditControlOwner() { m_editControlOwner = 0; }
98 void resetFields();
99 void setEmptyValue(const LayoutParameters&, const DateComponents& dateForReadOnlyField);
100 void setValueAsDate(const LayoutParameters&, const DateComponents&);
101 void setValueAsDateTimeFieldsState(const DateTimeFieldsState&);
102 void setOnlyYearMonthDay(const DateComponents&);
103 void stepDown();
104 void stepUp();
105 String value() const;
106 DateTimeFieldsState valueAsDateTimeFieldsState() const;
107
108private:
109 static const size_t invalidFieldIndex = static_cast<size_t>(-1);
110
111 // Datetime can be represent at most five fields, such as
112 // 1. year
113 // 2. month
114 // 3. day-of-month
115 // 4. hour
116 // 5. minute
117 // 6. second
118 // 7. millisecond
119 // 8. AM/PM
120 static const int maximumNumberOfFields = 8;
121
122 DateTimeEditElement(Document*, EditControlOwner&);
123
124 DateTimeFieldElement* fieldAt(size_t) const;
125 size_t fieldIndexOf(const DateTimeFieldElement&) const;
126 DateTimeFieldElement* focusedField() const;
127 size_t focusedFieldIndex() const;
128 bool focusOnNextFocusableField(size_t startIndex);
129 bool isDisabled() const;
130 bool isReadOnly() const;
131 void layout(const LayoutParameters&, const DateComponents&);
132 void updateUIState();
133
134 // Element function.
135 virtual PassRefPtr<RenderStyle> customStyleForRenderer() OVERRIDE;
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100136 virtual bool isDateTimeEditElement() const OVERRIDE;
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100137
138 // DateTimeFieldElement::FieldOwner functions.
139 virtual void didBlurFromField() OVERRIDE FINAL;
140 virtual void didFocusOnField() OVERRIDE FINAL;
141 virtual void fieldValueChanged() OVERRIDE FINAL;
142 virtual bool focusOnNextField(const DateTimeFieldElement&) OVERRIDE FINAL;
143 virtual bool focusOnPreviousField(const DateTimeFieldElement&) OVERRIDE FINAL;
144 virtual bool isFieldOwnerDisabled() const OVERRIDE FINAL;
145 virtual bool isFieldOwnerReadOnly() const OVERRIDE FINAL;
146 virtual AtomicString localeIdentifier() const OVERRIDE FINAL;
147
148 Vector<DateTimeFieldElement*, maximumNumberOfFields> m_fields;
149 EditControlOwner* m_editControlOwner;
150};
151
Torne (Richard Coles)5267f702013-06-11 10:57:24 +0100152inline DateTimeEditElement* toDateTimeEditElement(Element* element)
153{
154 ASSERT_WITH_SECURITY_IMPLICATION(!element || element->isDateTimeEditElement());
155 return static_cast<DateTimeEditElement*>(element);
156}
157
Torne (Richard Coles)53e740f2013-05-09 18:38:43 +0100158} // namespace WebCore
159
160#endif
161#endif