Apply FINAL to the Node hierarchy.
[WebKit.git] / Source / WebCore / html / shadow / DateTimeEditElement.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 DateTimeEditElement_h
27 #define DateTimeEditElement_h
28
29 #if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
30 #include "DateComponents.h"
31 #include "DateTimeFieldElement.h"
32 #include "StepRange.h"
33
34 namespace WebCore {
35
36 class DateTimeFieldsState;
37 class KeyboardEvent;
38 class Locale;
39 class MouseEvent;
40 class 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
46 class DateTimeEditElement FINAL : public HTMLDivElement, public DateTimeFieldElement::FieldOwner {
47     WTF_MAKE_NONCOPYABLE(DateTimeEditElement);
48
49 public:
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.
94     void focusByOwner(Node* oldFocusedNode = 0);
95     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
108 private:
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;
136
137     // DateTimeFieldElement::FieldOwner functions.
138     virtual void didBlurFromField() OVERRIDE FINAL;
139     virtual void didFocusOnField() OVERRIDE FINAL;
140     virtual void fieldValueChanged() OVERRIDE FINAL;
141     virtual bool focusOnNextField(const DateTimeFieldElement&) OVERRIDE FINAL;
142     virtual bool focusOnPreviousField(const DateTimeFieldElement&) OVERRIDE FINAL;
143     virtual bool isFieldOwnerDisabled() const OVERRIDE FINAL;
144     virtual bool isFieldOwnerReadOnly() const OVERRIDE FINAL;
145     virtual AtomicString localeIdentifier() const OVERRIDE FINAL;
146
147     Vector<DateTimeFieldElement*, maximumNumberOfFields> m_fields;
148     EditControlOwner* m_editControlOwner;
149 };
150
151 } // namespace WebCore
152
153 #endif
154 #endif