// 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_THEME_PUSHBUTTONTP_H_
#define XFA_INCLUDE_FWL_THEME_PUSHBUTTONTP_H_

#include "xfa/include/fwl/theme/widgettp.h"

class CFWL_PushButtonTP : public CFWL_WidgetTP {
 public:
  CFWL_PushButtonTP();
  virtual ~CFWL_PushButtonTP();
  virtual FX_BOOL IsValidWidget(IFWL_Widget* pWidget);
  virtual FX_DWORD SetThemeID(IFWL_Widget* pWidget,
                              FX_DWORD dwThemeID,
                              FX_BOOL bChildren = TRUE);
  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
  virtual void* GetCapacity(CFWL_ThemePart* pThemePart, FX_DWORD dwCapacity);
  virtual FWL_ERR Initialize();
  virtual FWL_ERR Finalize();

 protected:
  void SetThemeData(FX_DWORD dwID);
  void SetTopLineColor(FX_DWORD* pData);
  void SetLeftLineColor(FX_DWORD* pData);
  void SetRightLineColor(FX_DWORD* pData);
  void SetBottomLineColor(FX_DWORD* pData);
  void SetBackgroudColor(FX_DWORD* pData);
  void SetCaptionColor(FX_DWORD* pData);
  void SetCornerColor(FX_DWORD* pData);
  int32_t GetColorID(FX_DWORD dwStates);

  struct PBThemeData {
    FX_ARGB clrBorder[5];
    FX_ARGB clrStart[5];
    FX_ARGB clrEnd[5];
    FX_ARGB clrFill[5];
  } * m_pThemeData;
};

#endif  // XFA_INCLUDE_FWL_THEME_PUSHBUTTONTP_H_
