// 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_CORE_CFWL_WIDGET_H_
#define XFA_FWL_CORE_CFWL_WIDGET_H_

#include <memory>

#include "xfa/fwl/core/cfwl_event.h"
#include "xfa/fwl/core/ifwl_widget.h"

class CFWL_Event;
class CFWL_Message;
class CFWL_Widget;
class CFWL_WidgetDelegate;
class CFWL_WidgetMgr;

class CFWL_Widget {
 public:
  CFWL_Widget(const IFWL_App*);
  virtual ~CFWL_Widget();

  IFWL_Widget* GetWidget();
  const IFWL_Widget* GetWidget() const;

  void GetWidgetRect(CFX_RectF& rect, bool bAutoSize = false);
  void SetWidgetRect(const CFX_RectF& rect);
  void GetGlobalRect(CFX_RectF& rect);
  void GetClientRect(CFX_RectF& rtClient);

  void ModifyStyles(uint32_t dwStylesAdded, uint32_t dwStylesRemoved);
  uint32_t GetStylesEx();
  void ModifyStylesEx(uint32_t dwStylesExAdded, uint32_t dwStylesExRemoved);

  uint32_t GetStates();
  void SetStates(uint32_t dwStates, bool bSet = true);

  void SetLayoutItem(void* pItem);

  void Update();
  void LockUpdate();
  void UnlockUpdate();

  FWL_WidgetHit HitTest(FX_FLOAT fx, FX_FLOAT fy);

  void DrawWidget(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix = nullptr);

  IFWL_WidgetDelegate* GetDelegate() const;
  void SetDelegate(IFWL_WidgetDelegate*);

 protected:
  void Initialize();

  const IFWL_App* m_pApp;
  std::unique_ptr<IFWL_Widget> m_pIface;
  CFWL_WidgetMgr* const m_pWidgetMgr;
};

#endif  // XFA_FWL_CORE_CFWL_WIDGET_H_
