// 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_FWL_SDADAPTERIMP_H_
#define XFA_FWL_CORE_FWL_SDADAPTERIMP_H_

#include "xfa/fwl/core/ifwl_adapterthreadmgr.h"
#include "xfa/fwl/core/ifwl_adapterwidgetmgr.h"

class CFWL_SDAdapterWidgetMgr : public IFWL_AdapterWidgetMgr {
 public:
  CFWL_SDAdapterWidgetMgr();
  ~CFWL_SDAdapterWidgetMgr();
  virtual FWL_ERR CreateWidget(IFWL_Widget* pWidget,
                               IFWL_Widget* pParent = NULL);
  virtual FWL_ERR DestroyWidget(IFWL_Widget* pWidget);
  virtual FWL_ERR SetWidgetRect(IFWL_Widget* pWidget, const CFX_RectF& rect);
  virtual FWL_ERR SetWidgetPosition(IFWL_Widget* pWidget,
                                    FX_FLOAT fx,
                                    FX_FLOAT fy);
  virtual FWL_ERR SetParentWidget(IFWL_Widget* pWidget, IFWL_Widget* pParent);
  virtual FWL_ERR ShowWidget(IFWL_Widget* pWidget);
  virtual FWL_ERR HideWidget(IFWL_Widget* pWidget);
  virtual FWL_ERR SetNormal(IFWL_Widget* pWidget);
  virtual FWL_ERR SetMaximize(IFWL_Widget* pWidget);
  virtual FWL_ERR SetMinimize(IFWL_Widget* pWidget);
  virtual FWL_ERR RunWidget(IFWL_Widget* pWidget);
  virtual FWL_ERR RepaintWidget(IFWL_Widget* pWidget, const CFX_RectF* pRect);
  virtual FWL_ERR Exit(int32_t iExitCode);
  virtual FWL_ERR CreateWidgetWithNativeId(IFWL_Widget* pWidget, void* vp);
  virtual FX_BOOL GetPopupPos(IFWL_Widget* pWidget,
                              FX_FLOAT fMinHeight,
                              FX_FLOAT fMaxHeight,
                              const CFX_RectF& rtAnchor,
                              CFX_RectF& rtPopup);

 public:
  virtual FWL_ERR GetWidgetRect(IFWL_Widget* pWidget, CFX_RectF& rect);
  virtual FWL_ERR SetWidgetIcon(IFWL_Widget* pWidget,
                                const CFX_DIBitmap* pIcon,
                                FX_BOOL bBig);
  virtual FWL_ERR SetWidgetCaption(IFWL_Widget* pWidget,
                                   const CFX_WideStringC& wsCaption);
  virtual FWL_ERR SetBorderRegion(IFWL_Widget* pWidget, CFX_Path* pPath);
  virtual FWL_ERR SetTransparent(IFWL_Widget* pWidget, uint32_t dwAlpha);
  virtual FX_BOOL CheckMessage();
  virtual FX_BOOL IsIdleMessage();
  virtual FWL_ERR DispatchMessage();
  virtual FWL_ERR GetWidgetDC(IFWL_Widget* pWidget, void*& pDC);
  virtual FWL_ERR ReleaseWidgetDC(IFWL_Widget* pWidget,
                                  void* pDC,
                                  CFX_RectF* pClip = 0);
  virtual void* GetWindow(IFWL_Widget* pWidget);
  virtual uint32_t GetKeyState(uint32_t dwVirtKey);
  virtual FWL_ERR RunLoop(IFWL_Widget* widget);
  virtual FWL_ERR EndLoop();
  virtual FWL_ERR InitMenu(IFWL_Menu* pMenu, IFWL_MenuDP* pMenuData);
  virtual FWL_ERR UpdateMenu(IFWL_Menu* pMenu,
                             const void* hItem,
                             int32_t iType);
  virtual int32_t TrackPopupMenu(IFWL_Menu* pMenu, IFWL_MenuDP* pMenuData);
  virtual FWL_ERR SetMessageHook(IFWL_AdapterMessageHook* hook);
  virtual FWL_ERR GetSystemBorder(FX_FLOAT& l,
                                  FX_FLOAT& t,
                                  FX_FLOAT& r,
                                  FX_FLOAT& b);
};

class CFWL_SDAdapterThreadMgr : public IFWL_AdapterThreadMgr {
 public:
  CFWL_SDAdapterThreadMgr();
  ~CFWL_SDAdapterThreadMgr();

 public:
  virtual IFWL_Thread* GetCurrentThread();
};

#endif  // XFA_FWL_CORE_FWL_SDADAPTERIMP_H_
