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 DateTimeNumericFieldElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define DateTimeNumericFieldElement_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI)
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/DateTimeFieldElement.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
320019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/text/StringBuilder.h"
330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "wtf/text/WTFString.h"
340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DateTimeNumericFieldElement represents numeric field of date time format,
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// such as:
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  - hour
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  - minute
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  - millisecond
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  - second
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  - year
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class DateTimeNumericFieldElement : public DateTimeFieldElement {
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WTF_MAKE_NONCOPYABLE(DateTimeNumericFieldElement);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)public:
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    struct Step {
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Step(int step = 1, int stepBase = 0) : step(step), stepBase(stepBase) { }
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int step;
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int stepBase;
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct Range {
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        Range(int minimum, int maximum) : minimum(minimum), maximum(maximum) { }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int clampValue(int) const;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool isInRange(int) const;
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        bool isSingleton() const { return minimum == maximum; }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int minimum;
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        int maximum;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)protected:
658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    DateTimeNumericFieldElement(Document&, FieldOwner&, const Range&, const Range& hardLimits, const String& placeholder, const Step& = Step());
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int clampValue(int value) const { return m_range.clampValue(value); }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int defaultValueForStepDown() const;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual int defaultValueForStepUp() const;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Range& range() const { return m_range; }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DateTimeFieldElement functions.
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool hasValue() const OVERRIDE FINAL;
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void initialize(const AtomicString& pseudo, const String& axHelpText);
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int maximum() const;
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void setEmptyValue(EventBehavior = DispatchNoEvent) OVERRIDE FINAL;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void setValueAsInteger(int, EventBehavior = DispatchNoEvent) OVERRIDE;
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual int valueAsInteger() const OVERRIDE FINAL;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String visibleValue() const OVERRIDE FINAL;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // DateTimeFieldElement functions.
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void handleKeyboardEvent(KeyboardEvent*) OVERRIDE FINAL;
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual float maximumWidth(const Font&) OVERRIDE;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void stepDown() OVERRIDE FINAL;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void stepUp() OVERRIDE FINAL;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String value() const OVERRIDE FINAL;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    // Node functions.
90aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    virtual void setFocus(bool) OVERRIDE FINAL;
91aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String formatValue(int) const;
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int roundUp(int) const;
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int roundDown(int) const;
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int typeAheadValue() const;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const String m_placeholder;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Range m_range;
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const Range m_hardLimits;
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const Step m_step;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_value;
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasValue;
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    mutable StringBuilder m_typeAheadBuffer;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
110