/*
 * Copyright (C) 2015, 2020 Igalia S.L.
 *
 * 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. AND ITS CONTRIBUTORS ``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 ITS 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.
 */

#pragma once

#include "Color.h"
#include "Theme.h"

namespace WebCore {

class Path;

class ThemeAdwaita : public Theme {
public:
    static Color focusColor();
    static void paintFocus(GraphicsContext&, const FloatRect&, int offset);
    static void paintFocus(GraphicsContext&, const Path&, const Color&);
    static void paintFocus(GraphicsContext&, const Vector<FloatRect>&, const Color&);
    enum class ArrowDirection { Up, Down };
    static void paintArrow(GraphicsContext&, ArrowDirection);

    virtual Color activeSelectionForegroundColor() const;
    virtual Color activeSelectionBackgroundColor() const;
    virtual Color inactiveSelectionForegroundColor() const;
    virtual Color inactiveSelectionBackgroundColor() const;
    virtual void platformColorsDidChange() { };

private:
    LengthSize controlSize(ControlPart, const FontCascade&, const LengthSize&, float) const final;
    LengthSize minimumControlSize(ControlPart, const FontCascade&, const LengthSize&, float) const final;
    LengthBox controlBorder(ControlPart, const FontCascade&, const LengthBox&, float) const final;
    void paint(ControlPart, ControlStates&, GraphicsContext&, const FloatRect&, float, ScrollView*, float, float, bool, bool) final;

    void paintCheckbox(ControlStates&, GraphicsContext&, const FloatRect&, float);
    void paintRadio(ControlStates&, GraphicsContext&, const FloatRect&, float);
    void paintButton(ControlStates&, GraphicsContext&, const FloatRect&, float);
    void paintSpinButton(ControlStates&, GraphicsContext&, const FloatRect&, float);
};

} // namespace WebCore
