text: // 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
  
  #include "xfa/fwl/core/fwl_appimp.h"
  
  #include "xfa/fwl/core/cfwl_widgetmgr.h"
  #include "xfa/fwl/core/fwl_noteimp.h"
  #include "xfa/fwl/core/ifwl_app.h"
  #include "xfa/fwl/core/ifwl_widget.h"
  #include "xfa/fxfa/app/xfa_fwladapter.h"
  
  IFWL_App* IFWL_App::Create(CXFA_FFApp* pAdapter) {
    IFWL_App* pApp = new IFWL_App;
    pApp->SetImpl(new CFWL_AppImp(pApp, pAdapter));
    return pApp;
  }
  
  IFWL_App::IFWL_App() {}
  
  IFWL_App::~IFWL_App() {}
  
  void IFWL_App::Release() {}
  
  FWL_Error IFWL_App::Initialize() {
    return static_cast<CFWL_AppImp*>(GetImpl())->Initialize();
  }
  
  FWL_Error IFWL_App::Finalize() {
    return static_cast<CFWL_AppImp*>(GetImpl())->Finalize();
  }
  
  CXFA_FFApp* IFWL_App::GetAdapterNative() {
    return static_cast<CFWL_AppImp*>(GetImpl())->GetAdapterNative();
  }
  
  CFWL_WidgetMgr* IFWL_App::GetWidgetMgr() {
    return static_cast<CFWL_AppImp*>(GetImpl())->GetWidgetMgr();
  }
  
  IFWL_ThemeProvider* IFWL_App::GetThemeProvider() {
    return static_cast<CFWL_AppImp*>(GetImpl())->GetThemeProvider();
  }
  
  void IFWL_App::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
    static_cast<CFWL_AppImp*>(GetImpl())->SetThemeProvider(pThemeProvider);
  }
  
  void IFWL_App::Exit(int32_t iExitCode) {
    static_cast<CFWL_AppImp*>(GetImpl())->Exit(iExitCode);
  }
  
  CFWL_NoteDriver* IFWL_App::GetNoteDriver() const {
    return static_cast<CFWL_AppImp*>(GetImpl())->GetNoteDriver();
  }
  
  CFWL_AppImp::CFWL_AppImp(IFWL_App* pIface, CXFA_FFApp* pAdapter)
      : m_pAdapterNative(pAdapter),
        m_pThemeProvider(nullptr),
        m_pNoteDriver(new CFWL_NoteDriver),
        m_pIface(pIface) {}
  
  CFWL_AppImp::~CFWL_AppImp() {
    CFWL_ToolTipContainer::DeleteInstance();
  }
  
  FWL_Error CFWL_AppImp::Initialize() {
    if (!m_pWidgetMgr) {
      m_pWidgetMgr.reset(new CFWL_WidgetMgr(m_pAdapterNative));
    }
    return FWL_Error::Succeeded;
  }
  FWL_Error CFWL_AppImp::Finalize() {
    m_pWidgetMgr.reset();
    return FWL_Error::Succeeded;
  }
  CXFA_FFApp* CFWL_AppImp::GetAdapterNative() const {
    return m_pAdapterNative;
  }
  CXFA_FWLAdapterWidgetMgr* FWL_GetAdapterWidgetMgr() {
    return CFWL_WidgetMgr::GetInstance()->GetAdapterWidgetMgr();
  }
  CFWL_WidgetMgr* CFWL_AppImp::GetWidgetMgr() const {
    return m_pWidgetMgr.get();
  }
  
  void CFWL_AppImp::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
    m_pThemeProvider = pThemeProvider;
  }
  
  void CFWL_AppImp::Exit(int32_t iExitCode) {
    while (m_pNoteDriver->PopNoteLoop()) {
      continue;
    }
  }
  
  IFWL_ThemeProvider* CFWL_AppImp::GetThemeProvider() const {
    return m_pThemeProvider;
  }
  
  CXFA_FFApp* FWL_GetAdapterNative() {
    IFWL_App* pApp = FWL_GetApp();
    if (!pApp)
      return nullptr;
    return pApp->GetAdapterNative();
  }
  
  static IFWL_App* g_theApp = nullptr;
  IFWL_App* FWL_GetApp() {
    return g_theApp;
  }
  
  void FWL_SetApp(IFWL_App* pApp) {
    g_theApp = pApp;
  }
  