OLD | NEW |
| (Empty) |
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 #include "core/html/shadow/DateTimeFieldElements.h" | |
27 | |
28 #include "core/html/forms/DateTimeFieldsState.h" | |
29 #include "platform/DateComponents.h" | |
30 #include "platform/text/PlatformLocale.h" | |
31 #include "platform/wtf/CurrentTime.h" | |
32 #include "platform/wtf/DateMath.h" | |
33 | |
34 namespace blink { | |
35 | |
36 using blink::WebLocalizedString; | |
37 | |
38 static String QueryString(WebLocalizedString::Name name) { | |
39 return Locale::DefaultLocale().QueryString(name); | |
40 } | |
41 | |
42 DateTimeAMPMFieldElement::DateTimeAMPMFieldElement( | |
43 Document& document, | |
44 FieldOwner& field_owner, | |
45 const Vector<String>& ampm_labels) | |
46 : DateTimeSymbolicFieldElement(document, field_owner, ampm_labels, 0, 1) {} | |
47 | |
48 DateTimeAMPMFieldElement* DateTimeAMPMFieldElement::Create( | |
49 Document& document, | |
50 FieldOwner& field_owner, | |
51 const Vector<String>& ampm_labels) { | |
52 DEFINE_STATIC_LOCAL(AtomicString, ampm_pseudo_id, | |
53 ("-webkit-datetime-edit-ampm-field")); | |
54 DateTimeAMPMFieldElement* field = | |
55 new DateTimeAMPMFieldElement(document, field_owner, ampm_labels); | |
56 field->Initialize(ampm_pseudo_id, | |
57 QueryString(WebLocalizedString::kAXAMPMFieldText)); | |
58 return field; | |
59 } | |
60 | |
61 void DateTimeAMPMFieldElement::PopulateDateTimeFieldsState( | |
62 DateTimeFieldsState& date_time_fields_state) { | |
63 if (HasValue()) | |
64 date_time_fields_state.SetAMPM(ValueAsInteger() | |
65 ? DateTimeFieldsState::kAMPMValuePM | |
66 : DateTimeFieldsState::kAMPMValueAM); | |
67 else | |
68 date_time_fields_state.SetAMPM(DateTimeFieldsState::kAMPMValueEmpty); | |
69 } | |
70 | |
71 void DateTimeAMPMFieldElement::SetValueAsDate(const DateComponents& date) { | |
72 SetValueAsInteger(date.Hour() >= 12 ? 1 : 0); | |
73 } | |
74 | |
75 void DateTimeAMPMFieldElement::SetValueAsDateTimeFieldsState( | |
76 const DateTimeFieldsState& date_time_fields_state) { | |
77 if (date_time_fields_state.HasAMPM()) | |
78 SetValueAsInteger(date_time_fields_state.Ampm()); | |
79 else | |
80 SetEmptyValue(); | |
81 } | |
82 | |
83 // ---------------------------- | |
84 | |
85 DateTimeDayFieldElement::DateTimeDayFieldElement(Document& document, | |
86 FieldOwner& field_owner, | |
87 const String& placeholder, | |
88 const Range& range) | |
89 : DateTimeNumericFieldElement(document, | |
90 field_owner, | |
91 range, | |
92 Range(1, 31), | |
93 placeholder) {} | |
94 | |
95 DateTimeDayFieldElement* DateTimeDayFieldElement::Create( | |
96 Document& document, | |
97 FieldOwner& field_owner, | |
98 const String& placeholder, | |
99 const Range& range) { | |
100 DEFINE_STATIC_LOCAL(AtomicString, day_pseudo_id, | |
101 ("-webkit-datetime-edit-day-field")); | |
102 DateTimeDayFieldElement* field = new DateTimeDayFieldElement( | |
103 document, field_owner, placeholder.IsEmpty() ? "--" : placeholder, range); | |
104 field->Initialize(day_pseudo_id, | |
105 QueryString(WebLocalizedString::kAXDayOfMonthFieldText)); | |
106 return field; | |
107 } | |
108 | |
109 void DateTimeDayFieldElement::PopulateDateTimeFieldsState( | |
110 DateTimeFieldsState& date_time_fields_state) { | |
111 date_time_fields_state.SetDayOfMonth( | |
112 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
113 } | |
114 | |
115 void DateTimeDayFieldElement::SetValueAsDate(const DateComponents& date) { | |
116 SetValueAsInteger(date.MonthDay()); | |
117 } | |
118 | |
119 void DateTimeDayFieldElement::SetValueAsDateTimeFieldsState( | |
120 const DateTimeFieldsState& date_time_fields_state) { | |
121 if (!date_time_fields_state.HasDayOfMonth()) { | |
122 SetEmptyValue(); | |
123 return; | |
124 } | |
125 | |
126 const unsigned value = date_time_fields_state.DayOfMonth(); | |
127 if (GetRange().IsInRange(static_cast<int>(value))) { | |
128 SetValueAsInteger(value); | |
129 return; | |
130 } | |
131 | |
132 SetEmptyValue(); | |
133 } | |
134 | |
135 // ---------------------------- | |
136 | |
137 DateTimeHourFieldElementBase::DateTimeHourFieldElementBase( | |
138 Document& document, | |
139 FieldOwner& field_owner, | |
140 const Range& range, | |
141 const Range& hard_limits, | |
142 const Step& step) | |
143 : DateTimeNumericFieldElement(document, | |
144 field_owner, | |
145 range, | |
146 hard_limits, | |
147 "--", | |
148 step) {} | |
149 | |
150 void DateTimeHourFieldElementBase::Initialize() { | |
151 DEFINE_STATIC_LOCAL(AtomicString, hour_pseudo_id, | |
152 ("-webkit-datetime-edit-hour-field")); | |
153 DateTimeNumericFieldElement::Initialize( | |
154 hour_pseudo_id, QueryString(WebLocalizedString::kAXHourFieldText)); | |
155 } | |
156 | |
157 void DateTimeHourFieldElementBase::SetValueAsDate(const DateComponents& date) { | |
158 SetValueAsInteger(date.Hour()); | |
159 } | |
160 | |
161 void DateTimeHourFieldElementBase::SetValueAsDateTimeFieldsState( | |
162 const DateTimeFieldsState& date_time_fields_state) { | |
163 if (!date_time_fields_state.HasHour()) { | |
164 SetEmptyValue(); | |
165 return; | |
166 } | |
167 | |
168 const int hour12 = date_time_fields_state.Hour(); | |
169 if (hour12 < 1 || hour12 > 12) { | |
170 SetEmptyValue(); | |
171 return; | |
172 } | |
173 | |
174 const int hour11 = hour12 == 12 ? 0 : hour12; | |
175 const int hour23 = | |
176 date_time_fields_state.Ampm() == DateTimeFieldsState::kAMPMValuePM | |
177 ? hour11 + 12 | |
178 : hour11; | |
179 SetValueAsInteger(hour23); | |
180 } | |
181 // ---------------------------- | |
182 | |
183 DateTimeHour11FieldElement::DateTimeHour11FieldElement(Document& document, | |
184 FieldOwner& field_owner, | |
185 const Range& range, | |
186 const Step& step) | |
187 : DateTimeHourFieldElementBase(document, | |
188 field_owner, | |
189 range, | |
190 Range(0, 11), | |
191 step) {} | |
192 | |
193 DateTimeHour11FieldElement* DateTimeHour11FieldElement::Create( | |
194 Document& document, | |
195 FieldOwner& field_owner, | |
196 const Range& hour23_range, | |
197 const Step& step) { | |
198 DCHECK_GE(hour23_range.minimum, 0); | |
199 DCHECK_LE(hour23_range.maximum, 23); | |
200 DCHECK_LE(hour23_range.minimum, hour23_range.maximum); | |
201 Range range(0, 11); | |
202 if (hour23_range.maximum < 12) { | |
203 range = hour23_range; | |
204 } else if (hour23_range.minimum >= 12) { | |
205 range.minimum = hour23_range.minimum - 12; | |
206 range.maximum = hour23_range.maximum - 12; | |
207 } | |
208 | |
209 DateTimeHour11FieldElement* field = | |
210 new DateTimeHour11FieldElement(document, field_owner, range, step); | |
211 field->Initialize(); | |
212 return field; | |
213 } | |
214 | |
215 void DateTimeHour11FieldElement::PopulateDateTimeFieldsState( | |
216 DateTimeFieldsState& date_time_fields_state) { | |
217 if (!HasValue()) { | |
218 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue); | |
219 return; | |
220 } | |
221 const int value = ValueAsInteger(); | |
222 date_time_fields_state.SetHour(value ? value : 12); | |
223 } | |
224 | |
225 void DateTimeHour11FieldElement::SetValueAsInteger( | |
226 int value, | |
227 EventBehavior event_behavior) { | |
228 value = Range(0, 23).ClampValue(value) % 12; | |
229 DateTimeNumericFieldElement::SetValueAsInteger(value, event_behavior); | |
230 } | |
231 | |
232 // ---------------------------- | |
233 | |
234 DateTimeHour12FieldElement::DateTimeHour12FieldElement(Document& document, | |
235 FieldOwner& field_owner, | |
236 const Range& range, | |
237 const Step& step) | |
238 : DateTimeHourFieldElementBase(document, | |
239 field_owner, | |
240 range, | |
241 Range(1, 12), | |
242 step) {} | |
243 | |
244 DateTimeHour12FieldElement* DateTimeHour12FieldElement::Create( | |
245 Document& document, | |
246 FieldOwner& field_owner, | |
247 const Range& hour23_range, | |
248 const Step& step) { | |
249 DCHECK_GE(hour23_range.minimum, 0); | |
250 DCHECK_LE(hour23_range.maximum, 23); | |
251 DCHECK_LE(hour23_range.minimum, hour23_range.maximum); | |
252 Range range(1, 12); | |
253 if (hour23_range.maximum < 12) { | |
254 range = hour23_range; | |
255 } else if (hour23_range.minimum >= 12) { | |
256 range.minimum = hour23_range.minimum - 12; | |
257 range.maximum = hour23_range.maximum - 12; | |
258 } | |
259 if (!range.minimum) | |
260 range.minimum = 12; | |
261 if (!range.maximum) | |
262 range.maximum = 12; | |
263 if (range.minimum > range.maximum) { | |
264 range.minimum = 1; | |
265 range.maximum = 12; | |
266 } | |
267 DateTimeHour12FieldElement* field = | |
268 new DateTimeHour12FieldElement(document, field_owner, range, step); | |
269 field->Initialize(); | |
270 return field; | |
271 } | |
272 | |
273 void DateTimeHour12FieldElement::PopulateDateTimeFieldsState( | |
274 DateTimeFieldsState& date_time_fields_state) { | |
275 date_time_fields_state.SetHour(HasValue() ? ValueAsInteger() | |
276 : DateTimeFieldsState::kEmptyValue); | |
277 } | |
278 | |
279 void DateTimeHour12FieldElement::SetValueAsInteger( | |
280 int value, | |
281 EventBehavior event_behavior) { | |
282 value = Range(0, 24).ClampValue(value) % 12; | |
283 DateTimeNumericFieldElement::SetValueAsInteger(value ? value : 12, | |
284 event_behavior); | |
285 } | |
286 | |
287 // ---------------------------- | |
288 | |
289 DateTimeHour23FieldElement::DateTimeHour23FieldElement(Document& document, | |
290 FieldOwner& field_owner, | |
291 const Range& range, | |
292 const Step& step) | |
293 : DateTimeHourFieldElementBase(document, | |
294 field_owner, | |
295 range, | |
296 Range(0, 23), | |
297 step) {} | |
298 | |
299 DateTimeHour23FieldElement* DateTimeHour23FieldElement::Create( | |
300 Document& document, | |
301 FieldOwner& field_owner, | |
302 const Range& hour23_range, | |
303 const Step& step) { | |
304 DCHECK_GE(hour23_range.minimum, 0); | |
305 DCHECK_LE(hour23_range.maximum, 23); | |
306 DCHECK_LE(hour23_range.minimum, hour23_range.maximum); | |
307 DateTimeHour23FieldElement* field = | |
308 new DateTimeHour23FieldElement(document, field_owner, hour23_range, step); | |
309 field->Initialize(); | |
310 return field; | |
311 } | |
312 | |
313 void DateTimeHour23FieldElement::PopulateDateTimeFieldsState( | |
314 DateTimeFieldsState& date_time_fields_state) { | |
315 if (!HasValue()) { | |
316 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue); | |
317 return; | |
318 } | |
319 | |
320 const int value = ValueAsInteger(); | |
321 | |
322 date_time_fields_state.SetHour(value % 12 ? value % 12 : 12); | |
323 date_time_fields_state.SetAMPM(value >= 12 | |
324 ? DateTimeFieldsState::kAMPMValuePM | |
325 : DateTimeFieldsState::kAMPMValueAM); | |
326 } | |
327 | |
328 void DateTimeHour23FieldElement::SetValueAsInteger( | |
329 int value, | |
330 EventBehavior event_behavior) { | |
331 value = Range(0, 23).ClampValue(value); | |
332 DateTimeNumericFieldElement::SetValueAsInteger(value, event_behavior); | |
333 } | |
334 | |
335 // ---------------------------- | |
336 | |
337 DateTimeHour24FieldElement::DateTimeHour24FieldElement(Document& document, | |
338 FieldOwner& field_owner, | |
339 const Range& range, | |
340 const Step& step) | |
341 : DateTimeHourFieldElementBase(document, | |
342 field_owner, | |
343 range, | |
344 Range(1, 24), | |
345 step) {} | |
346 | |
347 DateTimeHour24FieldElement* DateTimeHour24FieldElement::Create( | |
348 Document& document, | |
349 FieldOwner& field_owner, | |
350 const Range& hour23_range, | |
351 const Step& step) { | |
352 DCHECK_GE(hour23_range.minimum, 0); | |
353 DCHECK_LE(hour23_range.maximum, 23); | |
354 DCHECK_LE(hour23_range.minimum, hour23_range.maximum); | |
355 Range range(hour23_range.minimum ? hour23_range.minimum : 24, | |
356 hour23_range.maximum ? hour23_range.maximum : 24); | |
357 if (range.minimum > range.maximum) { | |
358 range.minimum = 1; | |
359 range.maximum = 24; | |
360 } | |
361 | |
362 DateTimeHour24FieldElement* field = | |
363 new DateTimeHour24FieldElement(document, field_owner, range, step); | |
364 field->Initialize(); | |
365 return field; | |
366 } | |
367 | |
368 void DateTimeHour24FieldElement::PopulateDateTimeFieldsState( | |
369 DateTimeFieldsState& date_time_fields_state) { | |
370 if (!HasValue()) { | |
371 date_time_fields_state.SetHour(DateTimeFieldsState::kEmptyValue); | |
372 return; | |
373 } | |
374 | |
375 const int value = ValueAsInteger(); | |
376 | |
377 if (value == 24) { | |
378 date_time_fields_state.SetHour(12); | |
379 date_time_fields_state.SetAMPM(DateTimeFieldsState::kAMPMValueAM); | |
380 } else { | |
381 date_time_fields_state.SetHour(value == 12 ? 12 : value % 12); | |
382 date_time_fields_state.SetAMPM(value >= 12 | |
383 ? DateTimeFieldsState::kAMPMValuePM | |
384 : DateTimeFieldsState::kAMPMValueAM); | |
385 } | |
386 } | |
387 | |
388 void DateTimeHour24FieldElement::SetValueAsInteger( | |
389 int value, | |
390 EventBehavior event_behavior) { | |
391 value = Range(0, 24).ClampValue(value); | |
392 DateTimeNumericFieldElement::SetValueAsInteger(value ? value : 24, | |
393 event_behavior); | |
394 } | |
395 | |
396 // ---------------------------- | |
397 | |
398 DateTimeMillisecondFieldElement::DateTimeMillisecondFieldElement( | |
399 Document& document, | |
400 FieldOwner& field_owner, | |
401 const Range& range, | |
402 const Step& step) | |
403 : DateTimeNumericFieldElement(document, | |
404 field_owner, | |
405 range, | |
406 Range(0, 999), | |
407 "---", | |
408 step) {} | |
409 | |
410 DateTimeMillisecondFieldElement* DateTimeMillisecondFieldElement::Create( | |
411 Document& document, | |
412 FieldOwner& field_owner, | |
413 const Range& range, | |
414 const Step& step) { | |
415 DEFINE_STATIC_LOCAL(AtomicString, millisecond_pseudo_id, | |
416 ("-webkit-datetime-edit-millisecond-field")); | |
417 DateTimeMillisecondFieldElement* field = | |
418 new DateTimeMillisecondFieldElement(document, field_owner, range, step); | |
419 field->Initialize(millisecond_pseudo_id, | |
420 QueryString(WebLocalizedString::kAXMillisecondFieldText)); | |
421 return field; | |
422 } | |
423 | |
424 void DateTimeMillisecondFieldElement::PopulateDateTimeFieldsState( | |
425 DateTimeFieldsState& date_time_fields_state) { | |
426 date_time_fields_state.SetMillisecond( | |
427 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
428 } | |
429 | |
430 void DateTimeMillisecondFieldElement::SetValueAsDate( | |
431 const DateComponents& date) { | |
432 SetValueAsInteger(date.Millisecond()); | |
433 } | |
434 | |
435 void DateTimeMillisecondFieldElement::SetValueAsDateTimeFieldsState( | |
436 const DateTimeFieldsState& date_time_fields_state) { | |
437 if (!date_time_fields_state.HasMillisecond()) { | |
438 SetEmptyValue(); | |
439 return; | |
440 } | |
441 | |
442 const unsigned value = date_time_fields_state.Millisecond(); | |
443 if (value > static_cast<unsigned>(Maximum())) { | |
444 SetEmptyValue(); | |
445 return; | |
446 } | |
447 | |
448 SetValueAsInteger(value); | |
449 } | |
450 | |
451 // ---------------------------- | |
452 | |
453 DateTimeMinuteFieldElement::DateTimeMinuteFieldElement(Document& document, | |
454 FieldOwner& field_owner, | |
455 const Range& range, | |
456 const Step& step) | |
457 : DateTimeNumericFieldElement(document, | |
458 field_owner, | |
459 range, | |
460 Range(0, 59), | |
461 "--", | |
462 step) {} | |
463 | |
464 DateTimeMinuteFieldElement* DateTimeMinuteFieldElement::Create( | |
465 Document& document, | |
466 FieldOwner& field_owner, | |
467 const Range& range, | |
468 const Step& step) { | |
469 DEFINE_STATIC_LOCAL(AtomicString, minute_pseudo_id, | |
470 ("-webkit-datetime-edit-minute-field")); | |
471 DateTimeMinuteFieldElement* field = | |
472 new DateTimeMinuteFieldElement(document, field_owner, range, step); | |
473 field->Initialize(minute_pseudo_id, | |
474 QueryString(WebLocalizedString::kAXMinuteFieldText)); | |
475 return field; | |
476 } | |
477 | |
478 void DateTimeMinuteFieldElement::PopulateDateTimeFieldsState( | |
479 DateTimeFieldsState& date_time_fields_state) { | |
480 date_time_fields_state.SetMinute( | |
481 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
482 } | |
483 | |
484 void DateTimeMinuteFieldElement::SetValueAsDate(const DateComponents& date) { | |
485 SetValueAsInteger(date.Minute()); | |
486 } | |
487 | |
488 void DateTimeMinuteFieldElement::SetValueAsDateTimeFieldsState( | |
489 const DateTimeFieldsState& date_time_fields_state) { | |
490 if (!date_time_fields_state.HasMinute()) { | |
491 SetEmptyValue(); | |
492 return; | |
493 } | |
494 | |
495 const unsigned value = date_time_fields_state.Minute(); | |
496 if (value > static_cast<unsigned>(Maximum())) { | |
497 SetEmptyValue(); | |
498 return; | |
499 } | |
500 | |
501 SetValueAsInteger(value); | |
502 } | |
503 | |
504 // ---------------------------- | |
505 | |
506 DateTimeMonthFieldElement::DateTimeMonthFieldElement(Document& document, | |
507 FieldOwner& field_owner, | |
508 const String& placeholder, | |
509 const Range& range) | |
510 : DateTimeNumericFieldElement(document, | |
511 field_owner, | |
512 range, | |
513 Range(1, 12), | |
514 placeholder) {} | |
515 | |
516 DateTimeMonthFieldElement* DateTimeMonthFieldElement::Create( | |
517 Document& document, | |
518 FieldOwner& field_owner, | |
519 const String& placeholder, | |
520 const Range& range) { | |
521 DEFINE_STATIC_LOCAL(AtomicString, month_pseudo_id, | |
522 ("-webkit-datetime-edit-month-field")); | |
523 DateTimeMonthFieldElement* field = new DateTimeMonthFieldElement( | |
524 document, field_owner, placeholder.IsEmpty() ? "--" : placeholder, range); | |
525 field->Initialize(month_pseudo_id, | |
526 QueryString(WebLocalizedString::kAXMonthFieldText)); | |
527 return field; | |
528 } | |
529 | |
530 void DateTimeMonthFieldElement::PopulateDateTimeFieldsState( | |
531 DateTimeFieldsState& date_time_fields_state) { | |
532 date_time_fields_state.SetMonth( | |
533 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
534 } | |
535 | |
536 void DateTimeMonthFieldElement::SetValueAsDate(const DateComponents& date) { | |
537 SetValueAsInteger(date.Month() + 1); | |
538 } | |
539 | |
540 void DateTimeMonthFieldElement::SetValueAsDateTimeFieldsState( | |
541 const DateTimeFieldsState& date_time_fields_state) { | |
542 if (!date_time_fields_state.HasMonth()) { | |
543 SetEmptyValue(); | |
544 return; | |
545 } | |
546 | |
547 const unsigned value = date_time_fields_state.Month(); | |
548 if (GetRange().IsInRange(static_cast<int>(value))) { | |
549 SetValueAsInteger(value); | |
550 return; | |
551 } | |
552 | |
553 SetEmptyValue(); | |
554 } | |
555 | |
556 // ---------------------------- | |
557 | |
558 DateTimeSecondFieldElement::DateTimeSecondFieldElement(Document& document, | |
559 FieldOwner& field_owner, | |
560 const Range& range, | |
561 const Step& step) | |
562 : DateTimeNumericFieldElement(document, | |
563 field_owner, | |
564 range, | |
565 Range(0, 59), | |
566 "--", | |
567 step) {} | |
568 | |
569 DateTimeSecondFieldElement* DateTimeSecondFieldElement::Create( | |
570 Document& document, | |
571 FieldOwner& field_owner, | |
572 const Range& range, | |
573 const Step& step) { | |
574 DEFINE_STATIC_LOCAL(AtomicString, second_pseudo_id, | |
575 ("-webkit-datetime-edit-second-field")); | |
576 DateTimeSecondFieldElement* field = | |
577 new DateTimeSecondFieldElement(document, field_owner, range, step); | |
578 field->Initialize(second_pseudo_id, | |
579 QueryString(WebLocalizedString::kAXSecondFieldText)); | |
580 return field; | |
581 } | |
582 | |
583 void DateTimeSecondFieldElement::PopulateDateTimeFieldsState( | |
584 DateTimeFieldsState& date_time_fields_state) { | |
585 date_time_fields_state.SetSecond( | |
586 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
587 } | |
588 | |
589 void DateTimeSecondFieldElement::SetValueAsDate(const DateComponents& date) { | |
590 SetValueAsInteger(date.Second()); | |
591 } | |
592 | |
593 void DateTimeSecondFieldElement::SetValueAsDateTimeFieldsState( | |
594 const DateTimeFieldsState& date_time_fields_state) { | |
595 if (!date_time_fields_state.HasSecond()) { | |
596 SetEmptyValue(); | |
597 return; | |
598 } | |
599 | |
600 const unsigned value = date_time_fields_state.Second(); | |
601 if (value > static_cast<unsigned>(Maximum())) { | |
602 SetEmptyValue(); | |
603 return; | |
604 } | |
605 | |
606 SetValueAsInteger(value); | |
607 } | |
608 | |
609 // ---------------------------- | |
610 | |
611 DateTimeSymbolicMonthFieldElement::DateTimeSymbolicMonthFieldElement( | |
612 Document& document, | |
613 FieldOwner& field_owner, | |
614 const Vector<String>& labels, | |
615 int minimum, | |
616 int maximum) | |
617 : DateTimeSymbolicFieldElement(document, | |
618 field_owner, | |
619 labels, | |
620 minimum, | |
621 maximum) {} | |
622 | |
623 DateTimeSymbolicMonthFieldElement* DateTimeSymbolicMonthFieldElement::Create( | |
624 Document& document, | |
625 FieldOwner& field_owner, | |
626 const Vector<String>& labels, | |
627 int minimum, | |
628 int maximum) { | |
629 DEFINE_STATIC_LOCAL(AtomicString, month_pseudo_id, | |
630 ("-webkit-datetime-edit-month-field")); | |
631 DateTimeSymbolicMonthFieldElement* field = | |
632 new DateTimeSymbolicMonthFieldElement(document, field_owner, labels, | |
633 minimum, maximum); | |
634 field->Initialize(month_pseudo_id, | |
635 QueryString(WebLocalizedString::kAXMonthFieldText)); | |
636 return field; | |
637 } | |
638 | |
639 void DateTimeSymbolicMonthFieldElement::PopulateDateTimeFieldsState( | |
640 DateTimeFieldsState& date_time_fields_state) { | |
641 if (!HasValue()) | |
642 date_time_fields_state.SetMonth(DateTimeFieldsState::kEmptyValue); | |
643 DCHECK_LT(ValueAsInteger(), static_cast<int>(SymbolsSize())); | |
644 date_time_fields_state.SetMonth(ValueAsInteger() + 1); | |
645 } | |
646 | |
647 void DateTimeSymbolicMonthFieldElement::SetValueAsDate( | |
648 const DateComponents& date) { | |
649 SetValueAsInteger(date.Month()); | |
650 } | |
651 | |
652 void DateTimeSymbolicMonthFieldElement::SetValueAsDateTimeFieldsState( | |
653 const DateTimeFieldsState& date_time_fields_state) { | |
654 if (!date_time_fields_state.HasMonth()) { | |
655 SetEmptyValue(); | |
656 return; | |
657 } | |
658 | |
659 const unsigned value = date_time_fields_state.Month() - 1; | |
660 if (value >= SymbolsSize()) { | |
661 SetEmptyValue(); | |
662 return; | |
663 } | |
664 | |
665 SetValueAsInteger(value); | |
666 } | |
667 | |
668 // ---------------------------- | |
669 | |
670 DateTimeWeekFieldElement::DateTimeWeekFieldElement(Document& document, | |
671 FieldOwner& field_owner, | |
672 const Range& range) | |
673 : DateTimeNumericFieldElement(document, | |
674 field_owner, | |
675 range, | |
676 Range(DateComponents::kMinimumWeekNumber, | |
677 DateComponents::kMaximumWeekNumber), | |
678 "--") {} | |
679 | |
680 DateTimeWeekFieldElement* DateTimeWeekFieldElement::Create( | |
681 Document& document, | |
682 FieldOwner& field_owner, | |
683 const Range& range) { | |
684 DEFINE_STATIC_LOCAL(AtomicString, week_pseudo_id, | |
685 ("-webkit-datetime-edit-week-field")); | |
686 DateTimeWeekFieldElement* field = | |
687 new DateTimeWeekFieldElement(document, field_owner, range); | |
688 field->Initialize(week_pseudo_id, | |
689 QueryString(WebLocalizedString::kAXWeekOfYearFieldText)); | |
690 return field; | |
691 } | |
692 | |
693 void DateTimeWeekFieldElement::PopulateDateTimeFieldsState( | |
694 DateTimeFieldsState& date_time_fields_state) { | |
695 date_time_fields_state.SetWeekOfYear( | |
696 HasValue() ? ValueAsInteger() : DateTimeFieldsState::kEmptyValue); | |
697 } | |
698 | |
699 void DateTimeWeekFieldElement::SetValueAsDate(const DateComponents& date) { | |
700 SetValueAsInteger(date.Week()); | |
701 } | |
702 | |
703 void DateTimeWeekFieldElement::SetValueAsDateTimeFieldsState( | |
704 const DateTimeFieldsState& date_time_fields_state) { | |
705 if (!date_time_fields_state.HasWeekOfYear()) { | |
706 SetEmptyValue(); | |
707 return; | |
708 } | |
709 | |
710 const unsigned value = date_time_fields_state.WeekOfYear(); | |
711 if (GetRange().IsInRange(static_cast<int>(value))) { | |
712 SetValueAsInteger(value); | |
713 return; | |
714 } | |
715 | |
716 SetEmptyValue(); | |
717 } | |
718 | |
719 // ---------------------------- | |
720 | |
721 DateTimeYearFieldElement::DateTimeYearFieldElement( | |
722 Document& document, | |
723 FieldOwner& field_owner, | |
724 const DateTimeYearFieldElement::Parameters& parameters) | |
725 : DateTimeNumericFieldElement( | |
726 document, | |
727 field_owner, | |
728 Range(parameters.minimum_year, parameters.maximum_year), | |
729 Range(DateComponents::MinimumYear(), DateComponents::MaximumYear()), | |
730 parameters.placeholder.IsEmpty() ? "----" : parameters.placeholder), | |
731 min_is_specified_(parameters.min_is_specified), | |
732 max_is_specified_(parameters.max_is_specified) { | |
733 DCHECK_GE(parameters.minimum_year, DateComponents::MinimumYear()); | |
734 DCHECK_LE(parameters.maximum_year, DateComponents::MaximumYear()); | |
735 } | |
736 | |
737 DateTimeYearFieldElement* DateTimeYearFieldElement::Create( | |
738 Document& document, | |
739 FieldOwner& field_owner, | |
740 const DateTimeYearFieldElement::Parameters& parameters) { | |
741 DEFINE_STATIC_LOCAL(AtomicString, year_pseudo_id, | |
742 ("-webkit-datetime-edit-year-field")); | |
743 DateTimeYearFieldElement* field = | |
744 new DateTimeYearFieldElement(document, field_owner, parameters); | |
745 field->Initialize(year_pseudo_id, | |
746 QueryString(WebLocalizedString::kAXYearFieldText)); | |
747 return field; | |
748 } | |
749 | |
750 static int CurrentFullYear() { | |
751 DateComponents date; | |
752 date.SetMillisecondsSinceEpochForMonth(ConvertToLocalTime(CurrentTimeMS())); | |
753 return date.FullYear(); | |
754 } | |
755 | |
756 int DateTimeYearFieldElement::DefaultValueForStepDown() const { | |
757 return max_is_specified_ | |
758 ? DateTimeNumericFieldElement::DefaultValueForStepDown() | |
759 : CurrentFullYear(); | |
760 } | |
761 | |
762 int DateTimeYearFieldElement::DefaultValueForStepUp() const { | |
763 return min_is_specified_ | |
764 ? DateTimeNumericFieldElement::DefaultValueForStepUp() | |
765 : CurrentFullYear(); | |
766 } | |
767 | |
768 void DateTimeYearFieldElement::PopulateDateTimeFieldsState( | |
769 DateTimeFieldsState& date_time_fields_state) { | |
770 date_time_fields_state.SetYear(HasValue() ? ValueAsInteger() | |
771 : DateTimeFieldsState::kEmptyValue); | |
772 } | |
773 | |
774 void DateTimeYearFieldElement::SetValueAsDate(const DateComponents& date) { | |
775 SetValueAsInteger(date.FullYear()); | |
776 } | |
777 | |
778 void DateTimeYearFieldElement::SetValueAsDateTimeFieldsState( | |
779 const DateTimeFieldsState& date_time_fields_state) { | |
780 if (!date_time_fields_state.HasYear()) { | |
781 SetEmptyValue(); | |
782 return; | |
783 } | |
784 | |
785 const unsigned value = date_time_fields_state.Year(); | |
786 if (GetRange().IsInRange(static_cast<int>(value))) { | |
787 SetValueAsInteger(value); | |
788 return; | |
789 } | |
790 | |
791 SetEmptyValue(); | |
792 } | |
793 | |
794 } // namespace blink | |
OLD | NEW |