// 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_panelimp.h" #include "xfa/fwl/core/cfwl_widgetimpproperties.h" #include "xfa/fwl/core/fwl_noteimp.h" #include "xfa/fwl/core/fwl_targetimp.h" #include "xfa/fwl/core/fwl_widgetimp.h" #include "xfa/fwl/core/fwl_widgetmgrimp.h" #include "xfa/fwl/core/ifwl_content.h" #include "xfa/fwl/core/ifwl_custompanel.h" #include "xfa/fwl/core/ifwl_grid.h" #include "xfa/fwl/core/ifwl_panel.h" #include "xfa/fwl/core/ifwl_proxy.h" // static IFWL_Panel* IFWL_Panel::Create(CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter) { IFWL_Panel* pPanel = new IFWL_Panel; CFWL_PanelImp* pPanelImpl = new CFWL_PanelImp(properties, pOuter); pPanel->SetImpl(pPanelImpl); pPanelImpl->SetInterface(pPanel); return pPanel; } IFWL_Panel::IFWL_Panel() {} IFWL_Content* IFWL_Panel::GetContent() { return static_cast<CFWL_PanelImp*>(GetImpl())->GetContent(); } FWL_ERR IFWL_Panel::SetContent(IFWL_Content* pContent) { return static_cast<CFWL_PanelImp*>(GetImpl())->SetContent(pContent); } CFWL_PanelImp::CFWL_PanelImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter) : CFWL_WidgetImp(properties, pOuter), m_pContent(nullptr) {} CFWL_PanelImp::~CFWL_PanelImp() {} FWL_ERR CFWL_PanelImp::GetClassName(CFX_WideString& wsClass) const { wsClass = FWL_CLASS_Panel; return FWL_ERR_Succeeded; } uint32_t CFWL_PanelImp::GetClassID() const { return FWL_CLASSHASH_Panel; } FWL_ERR CFWL_PanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) { if (bAutoSize) { if (m_pContent) { m_pContent->GetWidgetRect(rect, TRUE); } } else { rect = m_pProperties->m_rtWidget; } return FWL_ERR_Succeeded; } FWL_ERR CFWL_PanelImp::Update() { if (m_pContent) { CFX_RectF rtClient; GetClientRect(rtClient); FWL_GRIDUNIT eWidth = FWL_GRIDUNIT_Fixed, eHeight = FWL_GRIDUNIT_Fixed; IFWL_WidgetMgr* pWidgetMgr = FWL_GetWidgetMgr(); if (!pWidgetMgr) return FWL_ERR_Indefinite; IFWL_Widget* pParent = pWidgetMgr->GetWidget(GetInterface(), FWL_WGTRELATION_Parent); if (pParent && pParent->GetClassID() == FWL_CLASSHASH_Grid) { IFWL_Grid* pGrid = static_cast<IFWL_Grid*>(pParent); pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Width, eWidth); pGrid->GetWidgetSize(GetInterface(), FWL_GRIDSIZE_Height, eHeight); } m_pContent->SetWidgetRect(rtClient); m_pContent->Update(); } return FWL_ERR_Succeeded; } IFWL_Content* CFWL_PanelImp::GetContent() { return m_pContent; } FWL_ERR CFWL_PanelImp::SetContent(IFWL_Content* pContent) { if (!pContent) return FWL_ERR_Indefinite; m_pContent = pContent; return pContent->SetParent(m_pInterface); } class CFWL_CustomPanelImp : public CFWL_WidgetImp { public: CFWL_CustomPanelImp(const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter); virtual ~CFWL_CustomPanelImp(); virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE); virtual FWL_ERR Update(); virtual IFWL_Content* GetContent(); virtual FWL_ERR SetContent(IFWL_Content* pContent); FWL_ERR SetProxy(IFWL_Proxy* pProxy); protected: IFWL_Content* m_pContent; IFWL_Proxy* m_pProxy; }; CFWL_CustomPanelImp::CFWL_CustomPanelImp( const CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter) : CFWL_WidgetImp(properties, pOuter), m_pContent(nullptr), m_pProxy(nullptr) {} CFWL_CustomPanelImp::~CFWL_CustomPanelImp() {} FWL_ERR CFWL_CustomPanelImp::GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize) { if (bAutoSize && m_pProxy && (m_pProxy->GetWidgetRect(rect, bAutoSize) == FWL_ERR_Succeeded)) { return FWL_ERR_Succeeded; } return CFWL_WidgetImp::GetWidgetRect(rect, bAutoSize); } FWL_ERR CFWL_CustomPanelImp::Update() { if (m_pProxy) { return m_pProxy->Update(); } return CFWL_WidgetImp::Update(); } IFWL_Content* CFWL_CustomPanelImp::GetContent() { return m_pContent; } FWL_ERR CFWL_CustomPanelImp::SetContent(IFWL_Content* pContent) { if (!pContent) return FWL_ERR_Indefinite; m_pContent = pContent; return pContent->SetParent(m_pInterface); } FWL_ERR CFWL_CustomPanelImp::SetProxy(IFWL_Proxy* pProxy) { m_pProxy = pProxy; return FWL_ERR_Succeeded; } // statuc IFWL_CustomPanel* IFWL_CustomPanel::Create(CFWL_WidgetImpProperties& properties, IFWL_Widget* pOuter) { IFWL_CustomPanel* pCustomPanel = new IFWL_CustomPanel; CFWL_CustomPanelImp* pCustomPanelImpl = new CFWL_CustomPanelImp(properties, pOuter); pCustomPanel->SetImpl(pCustomPanelImpl); pCustomPanelImpl->SetInterface(pCustomPanel); return pCustomPanel; } IFWL_CustomPanel::IFWL_CustomPanel() {} IFWL_Content* IFWL_CustomPanel::GetContent() { return static_cast<CFWL_CustomPanelImp*>(GetImpl())->GetContent(); } FWL_ERR IFWL_CustomPanel::SetContent(IFWL_Content* pContent) { return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetContent(pContent); } FWL_ERR IFWL_CustomPanel::SetProxy(IFWL_Proxy* pProxy) { return static_cast<CFWL_CustomPanelImp*>(GetImpl())->SetProxy(pProxy); }