// 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_CORE_FWL_TARGET_H_
#define XFA_INCLUDE_FWL_CORE_FWL_TARGET_H_

#include "core/include/fxcrt/fx_basic.h"
#include "xfa/include/fwl/core/fwl_error.h"

// FWL contains three parallel inheritance hierarchies, which reference each
// other via pointers as follows:
//
//                                           m_pImpl
//      (nonesuch)              IFWL_Target ----------> CFWL_TargetImp
//                                   |                       |
//                                   A                       A
//                   m_pIface        |                       |
//      CFWL_Widget ----------> IFWL_Widget             CFWL_WidgetImp
//           |                       |                       |
//           A                       A                       A
//           |                       |                       |
//      CFWL_...                IFWL_...                CFWL_...Imp
//

class CFWL_TargetImp;

class IFWL_Target {
 public:
  IFWL_Target() : m_pImpl(nullptr) {}
  virtual ~IFWL_Target();

  // These call into equivalent polymorphic methods of m_pImpl. There
  // should be no need to override these in subclasses.
  FWL_ERR GetClassName(CFX_WideString& wsClass) const;
  FX_DWORD GetClassID() const;
  FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
  FWL_ERR Initialize();
  FWL_ERR Finalize();

  CFWL_TargetImp* GetImpl() const { return m_pImpl; }

 protected:
  void SetImpl(CFWL_TargetImp* pImpl) { m_pImpl = pImpl; }

 private:
  CFWL_TargetImp* m_pImpl;
};

#endif  // XFA_INCLUDE_FWL_CORE_FWL_TARGET_H_
