/*
 * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public License
 * along with this library; see the file COPYING.LIB.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 *
 */

#ifndef RenderBR_h
#define RenderBR_h

#include "core/rendering/RenderText.h"

/*
 * The whole class here is a hack to get <br> working, as long as we don't have support for
 * CSS2 :before and :after pseudo elements
 */
namespace blink {

class RenderBR final : public RenderText {
public:
    explicit RenderBR(Node*);
    virtual ~RenderBR();

    virtual const char* renderName() const override { return "RenderBR"; }

    virtual LayoutRect selectionRectForPaintInvalidation(const RenderLayerModelObject* /*paintInvalidationContainer*/) const override { return LayoutRect(); }

    virtual float width(unsigned /*from*/, unsigned /*len*/, const Font&, float /*xPos*/, TextDirection, HashSet<const SimpleFontData*>* = 0 /*fallbackFonts*/ , GlyphOverflow* = 0) const override { return 0; }
    virtual float width(unsigned /*from*/, unsigned /*len*/, float /*xpos*/, TextDirection, bool = false /*firstLine*/, HashSet<const SimpleFontData*>* = 0 /*fallbackFonts*/, GlyphOverflow* = 0) const override { return 0; }

    int lineHeight(bool firstLine) const;

    // overrides
    virtual bool isOfType(RenderObjectType type) const override { return type == RenderObjectBr || RenderText::isOfType(type); }

    virtual int caretMinOffset() const override;
    virtual int caretMaxOffset() const override;

    virtual PositionWithAffinity positionForPoint(const LayoutPoint&) override final;

protected:
    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle) override;
};

DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderBR, isBR());

} // namespace blink

#endif // RenderBR_h
