// 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_ADAPTER_FWL_SDADAPTERIMP_H_
#define XFA_INCLUDE_FWL_ADAPTER_FWL_SDADAPTERIMP_H_

#include "xfa/include/fwl/adapter/fwl_adapterthreadmgr.h"
#include "xfa/include/fwl/adapter/fwl_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, FX_DWORD dwAlpha);
  virtual FWL_ERR SetFullScreen(IFWL_Widget* pWidget, FX_BOOL bFullScreen);
  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 FX_DWORD GetKeyState(FX_DWORD 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 FWL_ERR Start(IFWL_Thread* pThread,
                        FWL_HTHREAD& hThread,
                        FX_BOOL bSuspended = FALSE);
  virtual FWL_ERR Resume(FWL_HTHREAD hThread);
  virtual FWL_ERR Suspend(FWL_HTHREAD hThread);
  virtual FWL_ERR Kill(FWL_HTHREAD hThread, int32_t iExitCode);
  virtual FWL_ERR Stop(FWL_HTHREAD hThread, int32_t iExitCode);
  virtual IFWL_Thread* GetCurrentThread();
};

#endif  // XFA_INCLUDE_FWL_ADAPTER_FWL_SDADAPTERIMP_H_
