// 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_LIGHTWIDGET_TOOLTIPCTRL_H_
#define XFA_INCLUDE_FWL_LIGHTWIDGET_TOOLTIPCTRL_H_

#include "xfa/include/fwl/basewidget/fwl_tooltipctrl.h"
#include "xfa/include/fwl/lightwidget/widget.h"

class CFWL_ToolTip : public CFWL_Widget {
 public:
  static CFWL_ToolTip* Create();
  FWL_ERR Initialize(const CFWL_WidgetProperties* pProperties = NULL);
  FWL_ERR GetCaption(CFX_WideString& wsCaption);
  FWL_ERR SetCaption(const CFX_WideStringC& wsCaption);
  int32_t GetInitialDelay();
  int32_t SetInitialDelay(int32_t nDelayTime);
  int32_t GetAutoPopDelay();
  int32_t SetAutoPopDelay(int32_t nDelayTime);
  CFX_DIBitmap* GetToolTipIcon();
  FWL_ERR SetToolTipIcon(CFX_DIBitmap* pBitmap);
  CFX_SizeF GetToolTipIconSize();
  FWL_ERR SetToolTipIconSize(CFX_SizeF fSize);
  FWL_ERR SetAnchor(const CFX_RectF& rtAnchor);
  FWL_ERR Show();
  FWL_ERR Hide();
  CFWL_ToolTip();
  virtual ~CFWL_ToolTip();

 protected:
  class CFWL_ToolTipDP : public IFWL_ToolTipDP {
   public:
    CFWL_ToolTipDP();
    FWL_ERR GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
    int32_t GetInitialDelay(IFWL_Widget* pWidget);
    int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
    CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
    CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
    CFX_RectF GetAnchor();
    CFX_WideString m_wsCaption;
    int32_t m_nInitDelayTime;
    int32_t m_nAutoPopDelayTime;
    CFX_DIBitmap* m_pBitmap;
    CFX_SizeF m_fIconSize;
    CFX_RectF m_fAnchor;
  };
  CFWL_ToolTipDP m_tooltipData;
};

#endif  // XFA_INCLUDE_FWL_LIGHTWIDGET_TOOLTIPCTRL_H_
