/*
 * Copyright (C) 2014-2018 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef ControlStates_h
#define ControlStates_h

#include <wtf/RetainPtr.h>
#include <wtf/Seconds.h>

#if PLATFORM(COCOA)
#ifndef __OBJC__
typedef struct objc_object *id;
#endif
#endif

namespace WebCore {

#if PLATFORM(COCOA)
typedef id PlatformControlInstance;
#endif

class ControlStates {
    WTF_MAKE_FAST_ALLOCATED;
public:
    enum {
        HoverState = 1,
        PressedState = 1 << 1,
        FocusState = 1 << 2,
        EnabledState = 1 << 3,
        CheckedState = 1 << 4,
        DefaultState = 1 << 5,
        WindowInactiveState = 1 << 6,
        IndeterminateState = 1 << 7,
        SpinUpState = 1 << 8, // Sub-state for HoverState and PressedState.
        PresentingState = 1 << 9,
        AllStates = 0xffffffff
    };

    typedef unsigned States;

    ControlStates(States states)
        : m_states(states)
    {
    }

    ControlStates()
        : ControlStates(0)
    {
    }

    States states() const { return m_states; }
    void setStates(States newStates)
    {
        if (newStates == m_states)
            return;
        m_states = newStates;
        m_isDirty = m_initialized;
        m_initialized = true;
    }

    bool needsRepaint() const { return m_needsRepaint; }
    void setNeedsRepaint(bool r) { m_needsRepaint = r; }

    bool isDirty() const { return m_isDirty; }
    void setDirty(bool d) { m_isDirty = d; }

    Seconds timeSinceControlWasFocused() const { return m_timeSinceControlWasFocused; }
    void setTimeSinceControlWasFocused(Seconds time) { m_timeSinceControlWasFocused = time; }

#if PLATFORM(COCOA)
    PlatformControlInstance platformControl() const { return m_controlInstance.get(); }
    void setPlatformControl(PlatformControlInstance instance) { m_controlInstance = instance; }
#endif

private:
    States m_states;
    bool m_initialized { false };
    bool m_needsRepaint { false };
    bool m_isDirty { false };
    Seconds m_timeSinceControlWasFocused { 0_s };
#if PLATFORM(COCOA)
    RetainPtr<PlatformControlInstance> m_controlInstance;
#endif
};

}

#endif
