15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef DateTimeFieldElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DateTimeFieldElement_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDivElement.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLSpanElement.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DateComponents;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DateTimeFieldsState;
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class Font;
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DateTimeFieldElement is base class of date time field element.
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class DateTimeFieldElement : public HTMLSpanElement {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(DateTimeFieldElement);
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum EventBehavior {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DispatchNoEvent,
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DispatchEvent,
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FieldOwner implementer must call removeEventHandler when
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it doesn't handle event, e.g. at destruction.
51323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    class FieldOwner : public WillBeGarbageCollectedMixin {
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    public:
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual ~FieldOwner();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void didBlurFromField() = 0;
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void didFocusOnField() = 0;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual void fieldValueChanged() = 0;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual bool focusOnNextField(const DateTimeFieldElement&) = 0;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual bool focusOnPreviousField(const DateTimeFieldElement&) = 0;
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        virtual bool isFieldOwnerDisabled() const = 0;
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        virtual bool isFieldOwnerReadOnly() const = 0;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        virtual AtomicString localeIdentifier() const = 0;
626f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        virtual void fieldDidChangeValueByKeyboard() = 0;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void defaultEventHandler(Event*) OVERRIDE;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool hasValue() const = 0;
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isDisabled() const;
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual float maximumWidth(const Font&);
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void populateDateTimeFieldsState(DateTimeFieldsState&) = 0;
70323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void removeEventHandler() { m_fieldOwner = nullptr; }
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setDisabled();
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setEmptyValue(EventBehavior = DispatchNoEvent) = 0;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setValueAsDate(const DateComponents&) = 0;
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setValueAsDateTimeFieldsState(const DateTimeFieldsState&) = 0;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) = 0;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void stepDown() = 0;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void stepUp() = 0;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String value() const = 0;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String visibleValue() const = 0;
80323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
838abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    DateTimeFieldElement(Document&, FieldOwner&);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void focusOnNextField();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void handleKeyboardEvent(KeyboardEvent*) = 0;
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void initialize(const AtomicString& pseudo, const String& axHelpText, int axMinimum, int axMaximum);
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Locale& localeForOwner() const;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AtomicString localeIdentifier() const;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateVisibleValue(EventBehavior);
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual int valueAsInteger() const = 0;
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual int valueForARIAValueNow() const;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
93aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // Node functions.
94aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    virtual void setFocus(bool) OVERRIDE;
95aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void defaultKeyboardEventHandler(KeyboardEvent*);
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isDateTimeFieldElement() const OVERRIDE FINAL;
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isFieldOwnerDisabled() const;
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isFieldOwnerReadOnly() const;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool supportsFocus() const OVERRIDE FINAL;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
103323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RawPtrWillBeMember<FieldOwner> m_fieldOwner;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
110