// 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_INCLUDE_FWL_LIGHTWIDGET_THEME_H_
#define XFA_INCLUDE_FWL_LIGHTWIDGET_THEME_H_

#include <memory>
#include <vector>

#include "xfa/include/fwl/core/fwl_theme.h"

class CFWL_WidgetTP;
class IFWL_Widget;

class CFWL_Theme : public IFWL_ThemeProvider {
 public:
  CFWL_Theme();
  ~CFWL_Theme() override;

  // IFWL_ThemeProvider:
  FX_BOOL IsValidWidget(IFWL_Widget* pWidget) override;
  FX_DWORD GetThemeID(IFWL_Widget* pWidget) override;
  FX_DWORD SetThemeID(IFWL_Widget* pWidget,
                      FX_DWORD dwThemeID,
                      FX_BOOL bChildren = TRUE) override;
  FWL_ERR GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
  FWL_ERR SetThemeMatrix(IFWL_Widget* pWidget,
                         const CFX_Matrix& matrix) override;
  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
  FX_BOOL DrawText(CFWL_ThemeText* pParams) override;
  void* GetCapacity(CFWL_ThemePart* pThemePart, FX_DWORD dwCapacity) override;
  FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget) override;
  FWL_ERR GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) override;
  FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
                   FX_FLOAT fx,
                   FX_FLOAT fy) override;
  FX_BOOL CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) override;

  FWL_ERR Initialize();
  FWL_ERR Finalize();
  FWL_ERR SetFont(IFWL_Widget* pWidget,
                  const FX_WCHAR* strFont,
                  FX_FLOAT fFontSize,
                  FX_ARGB rgbFont);
  CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget);

 protected:
  std::vector<std::unique_ptr<CFWL_WidgetTP>> m_ThemesArray;
};

#endif  // XFA_INCLUDE_FWL_LIGHTWIDGET_THEME_H_
