// 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 FPDFSDK_INCLUDE_PDFWINDOW_PWL_SPECIALBUTTON_H_
#define FPDFSDK_INCLUDE_PDFWINDOW_PWL_SPECIALBUTTON_H_

#include "fpdfsdk/include/pdfwindow/PWL_Button.h"

class CPWL_PushButton : public CPWL_Button {
 public:
  CPWL_PushButton();
  ~CPWL_PushButton() override;

  // CPWL_Button
  CFX_ByteString GetClassName() const override;
  CFX_FloatRect GetFocusRect() const override;
};

class CPWL_CheckBox : public CPWL_Button {
 public:
  CPWL_CheckBox();
  ~CPWL_CheckBox() override;

  // CPWL_Button
  CFX_ByteString GetClassName() const override;
  FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) override;
  FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag) override;

  void SetCheck(bool bCheck);
  bool IsChecked() const;

 private:
  bool m_bChecked;
};

class CPWL_RadioButton : public CPWL_Button {
 public:
  CPWL_RadioButton();
  ~CPWL_RadioButton() override;

  // CPWL_Button
  CFX_ByteString GetClassName() const override;
  FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, FX_DWORD nFlag) override;
  FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag) override;

  void SetCheck(bool bCheck);
  bool IsChecked() const;

 private:
  bool m_bChecked;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_SPECIALBUTTON_H_
