INPUT_MULTIPLE_FIELDS_UI: Step-up/-down of hour field should respect min/max attributes
[WebKit-https.git] / Source / WebCore / html / shadow / DateTimeFieldElements.h
1 /*
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 DateTimeFieldElements_h
27 #define DateTimeFieldElements_h
28
29 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
30 #include "DateTimeNumericFieldElement.h"
31 #include "DateTimeSymbolicFieldElement.h"
32
33 namespace WebCore {
34
35 class DateTimeAMPMFieldElement : public DateTimeSymbolicFieldElement {
36     WTF_MAKE_NONCOPYABLE(DateTimeAMPMFieldElement);
37
38 public:
39     static PassRefPtr<DateTimeAMPMFieldElement> create(Document*, FieldOwner&, const Vector<String>&);
40
41 private:
42     DateTimeAMPMFieldElement(Document*, FieldOwner&, const Vector<String>&);
43
44     // DateTimeFieldElement functions.
45     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
46     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
47     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
48 };
49
50 class DateTimeDayFieldElement : public DateTimeNumericFieldElement {
51     WTF_MAKE_NONCOPYABLE(DateTimeDayFieldElement);
52
53 public:
54     static PassRefPtr<DateTimeDayFieldElement> create(Document*, FieldOwner&, const String& placeholder, int minimum, int maximum);
55
56 private:
57     DateTimeDayFieldElement(Document*, FieldOwner&, const String& placeholder, int minimum, int maximum);
58
59     // DateTimeFieldElement functions.
60     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
61     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
62     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
63
64     // DateTimeNumericFieldElement function.
65     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
66 };
67
68 class DateTimeHourFieldElementBase : public DateTimeNumericFieldElement {
69     WTF_MAKE_NONCOPYABLE(DateTimeHourFieldElementBase);
70
71 protected:
72     DateTimeHourFieldElementBase(Document*, FieldOwner&, int minimum, int maximum, const DateTimeNumericFieldElement::Parameters&);
73     void initialize();
74
75 private:
76     // DateTimeFieldElement functions.
77     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
78     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
79 };
80
81 class DateTimeHour11FieldElement : public DateTimeHourFieldElementBase {
82     WTF_MAKE_NONCOPYABLE(DateTimeHour11FieldElement);
83
84 public:
85     static PassRefPtr<DateTimeHour11FieldElement> create(Document*, FieldOwner&, int minimumHour23, int maximumHour23, const DateTimeNumericFieldElement::Parameters&);
86
87 private:
88     DateTimeHour11FieldElement(Document*, FieldOwner&, int minimum, int maximum, const DateTimeNumericFieldElement::Parameters&);
89
90     // DateTimeFieldElement functions.
91     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
92     virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL;
93
94     // DateTimeNumericFieldElement function.
95     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
96 };
97
98 class DateTimeHour12FieldElement : public DateTimeHourFieldElementBase {
99     WTF_MAKE_NONCOPYABLE(DateTimeHour12FieldElement);
100
101 public:
102     static PassRefPtr<DateTimeHour12FieldElement> create(Document*, FieldOwner&, int minimumHour23, int maximumHour23, const DateTimeNumericFieldElement::Parameters&);
103
104 private:
105     DateTimeHour12FieldElement(Document*, FieldOwner&, int minimum, int maximum, const DateTimeNumericFieldElement::Parameters&);
106
107     // DateTimeFieldElement functions.
108     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
109     virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL;
110
111     // DateTimeNumericFieldElement function.
112     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
113 };
114
115 class DateTimeHour23FieldElement : public DateTimeHourFieldElementBase {
116     WTF_MAKE_NONCOPYABLE(DateTimeHour23FieldElement);
117
118 public:
119     static PassRefPtr<DateTimeHour23FieldElement> create(Document*, FieldOwner&, int minimumHour23, int maximumHour23, const DateTimeNumericFieldElement::Parameters&);
120
121 private:
122     DateTimeHour23FieldElement(Document*, FieldOwner&, int minimum, int maximum, const DateTimeNumericFieldElement::Parameters&);
123
124     // DateTimeFieldElement functions.
125     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
126     virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL;
127
128     // DateTimeNumericFieldElement function.
129     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
130 };
131
132 class DateTimeHour24FieldElement : public DateTimeHourFieldElementBase {
133     WTF_MAKE_NONCOPYABLE(DateTimeHour24FieldElement);
134
135 public:
136     static PassRefPtr<DateTimeHour24FieldElement> create(Document*, FieldOwner&, int minimumHour23, int maximumHour23, const DateTimeNumericFieldElement::Parameters&);
137
138 private:
139     DateTimeHour24FieldElement(Document*, FieldOwner&, int minimum, int maximum, const DateTimeNumericFieldElement::Parameters&);
140
141     // DateTimeFieldElement functions.
142     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
143     virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE FINAL;
144
145     // DateTimeNumericFieldElement function.
146     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
147 };
148
149 class DateTimeMillisecondFieldElement : public DateTimeNumericFieldElement {
150     WTF_MAKE_NONCOPYABLE(DateTimeMillisecondFieldElement);
151
152 public:
153     static PassRefPtr<DateTimeMillisecondFieldElement> create(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
154
155 private:
156     DateTimeMillisecondFieldElement(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
157
158     // DateTimeFieldElement functions.
159     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
160     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
161     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
162 };
163
164 class DateTimeMinuteFieldElement : public DateTimeNumericFieldElement {
165     WTF_MAKE_NONCOPYABLE(DateTimeMinuteFieldElement);
166
167 public:
168     static PassRefPtr<DateTimeMinuteFieldElement> create(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
169
170 private:
171     DateTimeMinuteFieldElement(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
172
173     // DateTimeFieldElement functions.
174     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
175     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
176     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
177 };
178
179 class DateTimeMonthFieldElement : public DateTimeNumericFieldElement {
180     WTF_MAKE_NONCOPYABLE(DateTimeMonthFieldElement);
181
182 public:
183     static PassRefPtr<DateTimeMonthFieldElement> create(Document*, FieldOwner&, const String& placeholder, int minimum, int maximum);
184
185 private:
186     DateTimeMonthFieldElement(Document*, FieldOwner&, const String& placeholder, int minimum, int maximum);
187
188     // DateTimeFieldElement functions.
189     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
190     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
191     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
192
193     // DateTimeNumericFieldElement function.
194     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
195 };
196
197 class DateTimeSecondFieldElement : public DateTimeNumericFieldElement {
198     WTF_MAKE_NONCOPYABLE(DateTimeSecondFieldElement);
199
200 public:
201     static PassRefPtr<DateTimeSecondFieldElement> create(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
202
203 private:
204     DateTimeSecondFieldElement(Document*, FieldOwner&, const DateTimeNumericFieldElement::Parameters&);
205
206     // DateTimeFieldElement functions.
207     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
208     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
209     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
210 };
211
212 class DateTimeSymbolicMonthFieldElement : public DateTimeSymbolicFieldElement {
213     WTF_MAKE_NONCOPYABLE(DateTimeSymbolicMonthFieldElement);
214
215 public:
216     static PassRefPtr<DateTimeSymbolicMonthFieldElement> create(Document*, FieldOwner&, const Vector<String>&, int minimum, int maximum);
217
218 private:
219     DateTimeSymbolicMonthFieldElement(Document*, FieldOwner&, const Vector<String>&, int minimum, int maximum);
220
221     // DateTimeFieldElement functions.
222     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
223     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
224     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
225 };
226
227 class DateTimeWeekFieldElement : public DateTimeNumericFieldElement {
228     WTF_MAKE_NONCOPYABLE(DateTimeWeekFieldElement);
229
230 public:
231     static PassRefPtr<DateTimeWeekFieldElement> create(Document*, FieldOwner&, int minimum, int maximum);
232
233 private:
234     DateTimeWeekFieldElement(Document*, FieldOwner&, int minimum, int maximum);
235
236     // DateTimeFieldElement functions.
237     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
238     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
239     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
240
241     // DateTimeNumericFieldElement function.
242     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
243 };
244
245 class DateTimeYearFieldElement : public DateTimeNumericFieldElement {
246     WTF_MAKE_NONCOPYABLE(DateTimeYearFieldElement);
247
248 public:
249     struct Parameters {
250         int minimumYear;
251         int maximumYear;
252         bool minIsSpecified;
253         bool maxIsSpecified;
254         String placeholder;
255
256         Parameters()
257             : minimumYear(-1)
258             , maximumYear(-1)
259             , minIsSpecified(false)
260             , maxIsSpecified(false)
261         {
262         }
263     };
264
265     static PassRefPtr<DateTimeYearFieldElement> create(Document*, FieldOwner&, const Parameters&);
266
267 private:
268     DateTimeYearFieldElement(Document*, FieldOwner&, const Parameters&);
269
270     // DateTimeFieldElement functions.
271     virtual void populateDateTimeFieldsState(DateTimeFieldsState&) OVERRIDE FINAL;
272     virtual void setValueAsDate(const DateComponents&) OVERRIDE FINAL;
273     virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) OVERRIDE FINAL;
274
275     // DateTimeNumericFieldElement functions.
276     virtual int clampValueForHardLimits(int) const OVERRIDE FINAL;
277     virtual int defaultValueForStepDown() const OVERRIDE FINAL;
278     virtual int defaultValueForStepUp() const OVERRIDE FINAL;
279
280     bool m_minIsSpecified;
281     bool m_maxIsSpecified;
282 };
283
284 } // namespace WebCore
285
286 #endif
287 #endif