// 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 "PWL_Button.h"

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

  // CPWL_Button
  CFX_ByteString GetClassName() const override;
  CPDF_Rect 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 CPDF_Point& point, FX_DWORD nFlag) override;
  FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag) override;

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

 private:
  FX_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 CPDF_Point& point, FX_DWORD nFlag) override;
  FX_BOOL OnChar(FX_WORD nChar, FX_DWORD nFlag) override;

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

 private:
  FX_BOOL m_bChecked;
};

#endif  // FPDFSDK_INCLUDE_PDFWINDOW_PWL_SPECIALBUTTON_H_
