// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FWL_IFWL_THEMEPROVIDER_H_
#define XFA_FWL_IFWL_THEMEPROVIDER_H_

#include "core/fxcrt/fx_coordinates.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxge/fx_dib.h"
#include "fxjs/gc/heap.h"
#include "v8/include/cppgc/garbage-collected.h"
#include "v8/include/cppgc/member.h"

class CFGAS_GEFont;
class CFWL_ThemeBackground;
class CFWL_ThemePart;
class CFWL_ThemeText;
class CFWL_Widget;
class CFWL_WidgetTP;

class IFWL_ThemeProvider : public cppgc::GarbageCollectedMixin {
 public:
  virtual ~IFWL_ThemeProvider();

  // GarbageCollectedMixin:
  void Trace(cppgc::Visitor* visitor) const override;

  virtual void DrawBackground(const CFWL_ThemeBackground& pParams) = 0;
  virtual void DrawText(const CFWL_ThemeText& pParams) = 0;
  virtual void CalcTextRect(const CFWL_ThemeText& pParams,
                            CFX_RectF* pRect) = 0;
  virtual float GetCXBorderSize() const = 0;
  virtual float GetCYBorderSize() const = 0;
  virtual CFX_RectF GetUIMargin(const CFWL_ThemePart& pThemePart) const = 0;
  virtual float GetFontSize(const CFWL_ThemePart& pThemePart) const = 0;
  virtual RetainPtr<CFGAS_GEFont> GetFont(
      const CFWL_ThemePart& pThemePart) const = 0;
  virtual float GetLineHeight(const CFWL_ThemePart& pThemePart) const = 0;
  virtual float GetScrollBarWidth() const = 0;
  virtual FX_COLORREF GetTextColor(const CFWL_ThemePart& pThemePart) const = 0;
  virtual CFX_SizeF GetSpaceAboveBelow(
      const CFWL_ThemePart& pThemePart) const = 0;

 protected:
  explicit IFWL_ThemeProvider(cppgc::Heap* pHeap);

  CFWL_WidgetTP* GetTheme(const CFWL_Widget* pWidget) const;

 private:
  cppgc::Member<CFWL_WidgetTP> m_pCheckBoxTP;
  cppgc::Member<CFWL_WidgetTP> m_pListBoxTP;
  cppgc::Member<CFWL_WidgetTP> m_pPictureBoxTP;
  cppgc::Member<CFWL_WidgetTP> m_pSrollBarTP;
  cppgc::Member<CFWL_WidgetTP> m_pEditTP;
  cppgc::Member<CFWL_WidgetTP> m_pComboBoxTP;
  cppgc::Member<CFWL_WidgetTP> m_pMonthCalendarTP;
  cppgc::Member<CFWL_WidgetTP> m_pDateTimePickerTP;
  cppgc::Member<CFWL_WidgetTP> m_pPushButtonTP;
  cppgc::Member<CFWL_WidgetTP> m_pCaretTP;
  cppgc::Member<CFWL_WidgetTP> m_pBarcodeTP;
};

#endif  // XFA_FWL_IFWL_THEMEPROVIDER_H_
