// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_LAYOUT_BOXES_H_
#define COBALT_DOM_LAYOUT_BOXES_H_

#include "base/memory/ref_counted.h"
#include "cobalt/dom/directionality.h"
#include "cobalt/dom/dom_rect_list.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/math/vector2d_f.h"

namespace cobalt {
namespace dom {

// This class gives the DOM an interface to the boxes generated from the element
// during layout. This allows incremental box generation by letting the DOM tree
// invalidate the boxes when an element changes.

class LayoutBoxes {
 public:
  virtual ~LayoutBoxes() {}

  // All classes implementing this interface have a unique Type value.
  enum Type {
    kLayoutLayoutBoxes,
  };

  // Returns the type of layout boxes.
  virtual Type type() const = 0;

  // Methods to support the CSSOM View Module extensions to the Element and
  // HTMLElement Interfaces. See
  // https://www.w3.org/TR/2013/WD-cssom-view-20131217/#extensions-to-the-element-interface
  // and
  // https://www.w3.org/TR/2013/WD-cssom-view-20131217/#extensions-to-the-htmlelement-interface.

  // Returns a DOMRectList object containing a list of DOMRect objects in
  // content order describing the bounding border boxes.
  virtual scoped_refptr<dom::DOMRectList> GetClientRects() const = 0;

  // Returns true if the container box level is inline.
  virtual bool IsInline() const = 0;

  // Returns border edge values.
  // See https://www.w3.org/TR/CSS21/box.html#box-dimensions
  virtual float GetBorderEdgeLeft() const = 0;
  virtual float GetBorderEdgeTop() const = 0;
  virtual float GetBorderEdgeWidth() const = 0;
  virtual float GetBorderEdgeHeight() const = 0;
  virtual math::Vector2dF GetBorderEdgeOffsetFromContainingBlock() const = 0;

  // Returns the border width (thickness) values.
  virtual float GetBorderLeftWidth() const = 0;
  virtual float GetBorderTopWidth() const = 0;

  // Returns margin edge values.
  // See https://www.w3.org/TR/CSS21/box.html#box-dimensions
  virtual float GetMarginEdgeWidth() const = 0;
  virtual float GetMarginEdgeHeight() const = 0;

  // Returns padding edge values.
  // See https://www.w3.org/TR/CSS21/box.html#box-dimensions
  virtual math::Vector2dF GetPaddingEdgeOffset() const = 0;
  virtual float GetPaddingEdgeWidth() const = 0;
  virtual float GetPaddingEdgeHeight() const = 0;
  virtual math::Vector2dF GetPaddingEdgeOffsetFromContainingBlock() const = 0;

  // Returns content edge values.
  // See https://www.w3.org/TR/CSS21/box.html#box-dimensions
  virtual math::Vector2dF GetContentEdgeOffset() const = 0;
  virtual float GetContentEdgeWidth() const = 0;
  virtual float GetContentEdgeHeight() const = 0;
  virtual math::Vector2dF GetContentEdgeOffsetFromContainingBlock() const = 0;

  // Return scrolling area.
  // See https://www.w3.org/TR/cssom-view-1/#scrolling-area
  virtual math::RectF GetScrollArea(Directionality dir) const = 0;

  // Invalidate the sizes of the layout boxes so that they'll be recalculated
  // during the next layout.
  virtual void InvalidateSizes() = 0;
  // Invalidate the cross references, which relates to both positioned children
  // of containing blocks and z-index children of stacking contexts.
  virtual void InvalidateCrossReferences() = 0;
  // Invalidate the layout box's render tree nodes.
  virtual void InvalidateRenderTreeNodes() = 0;

 protected:
  LayoutBoxes() {}
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_LAYOUT_BOXES_H_
