Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(726)

Unified Diff: xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp

Issue 1636873004: XFA: Fix DOS newlines (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: All of them Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « xfa/src/fwl/src/core/fwl_widgetimp.cpp ('k') | xfa/src/fwl/src/core/include/fwl_appimp.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp
diff --git a/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp b/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp
index b8a13e93991565a64c683ec123b0e246e6f880d2..610345f1d4335c3d9188b6e8031017499de9b7b8 100644
--- a/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp
+++ b/xfa/src/fwl/src/core/fwl_widgetmgrimp.cpp
@@ -1,1075 +1,1075 @@
-// 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/src/foxitlib.h"
-#include "xfa/src/fwl/src/core/include/fwl_targetimp.h"
-#include "xfa/src/fwl/src/core/include/fwl_noteimp.h"
-#include "xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h"
-#include "xfa/src/fwl/src/core/include/fwl_threadimp.h"
-#include "xfa/src/fwl/src/core/include/fwl_appimp.h"
-
-FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
-#if (_FX_OS_ == _FX_MACOSX_)
- return FALSE;
-#else
- return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen;
-#endif
-}
-IFWL_WidgetMgr* FWL_GetWidgetMgr() {
- IFWL_App* pApp = FWL_GetApp();
- if (!pApp)
- return NULL;
- return pApp->GetWidgetMgr();
-}
-CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
- : m_dwCapability(0) {
- m_pDelegate = new CFWL_WidgetMgrDelegate(this);
- m_pAdapter = pAdapterNative->GetWidgetMgr(m_pDelegate);
- FXSYS_assert(m_pAdapter);
- CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
- m_mapWidgetItem.SetAt(NULL, pRoot);
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
- m_rtScreen.Reset();
- IFWL_AdapterMonitorMgr* pMonitorMgr = pAdapterNative->GetMonitorMgr();
- if (pMonitorMgr) {
- FWL_HMONITOR monitor = pMonitorMgr->GetCurrentMonitor();
- if (monitor) {
- pMonitorMgr->GetMonitorSize(monitor, m_rtScreen.width, m_rtScreen.height);
- }
- }
-#endif
-}
-CFWL_WidgetMgr::~CFWL_WidgetMgr() {
- FX_POSITION ps = m_mapWidgetItem.GetStartPosition();
- while (ps) {
- void* pWidget;
- CFWL_WidgetMgrItem* pItem;
- m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem);
- delete pItem;
- }
- m_mapWidgetItem.RemoveAll();
- if (m_pDelegate) {
- delete m_pDelegate;
- m_pDelegate = NULL;
- }
-}
-int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
- return TravelWidgetMgr(pParentItem, NULL, NULL);
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidget(int32_t nIndex, IFWL_Widget* pParent) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
- IFWL_Widget* pWidget = NULL;
- TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget);
- return pWidget;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget* pWidget,
- FWL_WGTRELATION eRelation) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- if (!pItem) {
- return NULL;
- }
- IFWL_Widget* pRet = NULL;
- switch (eRelation) {
- case FWL_WGTRELATION_Parent: {
- pRet = pItem->pParent ? pItem->pParent->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_Owner: {
- pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_FirstSibling: {
- pItem = pItem->pPrevious;
- while (pItem && pItem->pPrevious) {
- pItem = pItem->pPrevious;
- }
- pRet = pItem ? pItem->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_PriorSibling: {
- pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_NextSibling: {
- pRet = pItem->pNext ? pItem->pNext->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_LastSibling: {
- pItem = pItem->pNext;
- while (pItem && pItem->pNext) {
- pItem = pItem->pNext;
- }
- pRet = pItem ? pItem->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_FirstChild: {
- pRet = pItem->pChild ? pItem->pChild->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_LastChild: {
- pItem = pItem->pChild;
- while (pItem && pItem->pNext) {
- pItem = pItem->pNext;
- }
- pRet = pItem ? pItem->pWidget : NULL;
- break;
- }
- case FWL_WGTRELATION_SystemForm: {
- while (pItem) {
- if (IsAbleNative(pItem->pWidget)) {
- pRet = pItem->pWidget;
- break;
- }
- pItem = pItem->pParent;
- }
- break;
- }
- default: {}
- }
- return pRet;
-}
-int32_t CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- if (!pItem)
- return -1;
- return TravelWidgetMgr(pItem->pParent, NULL, pItem);
-}
-FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- if (!pItem)
- return FALSE;
- if (!pItem->pParent)
- return FALSE;
- CFWL_WidgetMgrItem* pChild = pItem->pParent->pChild;
- int32_t i = 0;
- while (pChild) {
- if (pChild == pItem) {
- if (i == nIndex) {
- return TRUE;
- }
- if (pChild->pPrevious) {
- pChild->pPrevious->pNext = pChild->pNext;
- }
- if (pChild->pNext) {
- pChild->pNext->pPrevious = pChild->pPrevious;
- }
- if (pItem->pParent->pChild == pItem) {
- pItem->pParent->pChild = pItem->pNext;
- }
- pItem->pNext = NULL;
- pItem->pPrevious = NULL;
- break;
- }
- if (!pChild->pNext) {
- break;
- }
- pChild = pChild->pNext;
- ++i;
- }
- pChild = pItem->pParent->pChild;
- if (pChild) {
- if (nIndex < 0) {
- while (pChild->pNext) {
- pChild = pChild->pNext;
- }
- pChild->pNext = pItem;
- pItem->pPrevious = pChild;
- pItem->pNext = NULL;
- return TRUE;
- }
- i = 0;
- while (i < nIndex && pChild->pNext) {
- pChild = pChild->pNext;
- ++i;
- }
- if (!pChild->pNext) {
- pChild->pNext = pItem;
- pItem->pPrevious = pChild;
- pItem->pNext = NULL;
- return TRUE;
- }
- if (pChild->pPrevious) {
- pItem->pPrevious = pChild->pPrevious;
- pChild->pPrevious->pNext = pItem;
- }
- pChild->pPrevious = pItem;
- pItem->pNext = pChild;
- if (pItem->pParent->pChild == pChild) {
- pItem->pParent->pChild = pItem;
- }
- } else {
- pItem->pParent->pChild = pItem;
- pItem->pPrevious = NULL;
- pItem->pNext = NULL;
- }
- return TRUE;
-}
-FWL_ERR CFWL_WidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
- const CFX_RectF* pRect) {
- if (!m_pAdapter)
- return FWL_ERR_Indefinite;
- IFWL_Widget* pNative = pWidget;
- CFX_RectF rect(*pRect);
- if (IsFormDisabled()) {
- IFWL_Widget* pOuter = pWidget->GetOuter();
- while (pOuter) {
- CFX_RectF rtTemp;
- pNative->GetWidgetRect(rtTemp);
- rect.left += rtTemp.left;
- rect.top += rtTemp.top;
- pNative = pOuter;
- pOuter = pOuter->GetOuter();
- }
- } else if (!IsAbleNative(pWidget)) {
- pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
- if (!pNative)
- return FWL_ERR_Indefinite;
- pWidget->TransformTo(pNative, rect.left, rect.top);
- }
- AddRedrawCounts(pNative);
- return m_pAdapter->RepaintWidget(pNative, &rect);
-}
-void CFWL_WidgetMgr::AddWidget(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(NULL);
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- if (!pItem) {
- pItem = new CFWL_WidgetMgrItem;
- pItem->pWidget = pWidget;
- m_mapWidgetItem.SetAt(pWidget, pItem);
- }
- if (pItem->pParent && pItem->pParent != pParentItem) {
- if (pItem->pPrevious) {
- pItem->pPrevious->pNext = pItem->pNext;
- }
- if (pItem->pNext) {
- pItem->pNext->pPrevious = pItem->pPrevious;
- }
- if (pItem->pParent->pChild == pItem) {
- pItem->pParent->pChild = pItem->pNext;
- }
- }
- pItem->pParent = pParentItem;
- SetWidgetIndex(pWidget, -1);
-}
-void CFWL_WidgetMgr::InsertWidget(IFWL_Widget* pParent,
- IFWL_Widget* pChild,
- int32_t nIndex) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
- if (!pParentItem) {
- pParentItem = new CFWL_WidgetMgrItem;
- pParentItem->pWidget = pParent;
- m_mapWidgetItem.SetAt(pParent, pParentItem);
- CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
- pParentItem->pParent = pRoot;
- SetWidgetIndex(pParent, -1);
- }
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
- if (!pItem) {
- pItem = new CFWL_WidgetMgrItem;
- pItem->pWidget = pChild;
- m_mapWidgetItem.SetAt(pChild, pItem);
- }
- if (pItem->pParent && pItem->pParent != pParentItem) {
- if (pItem->pPrevious) {
- pItem->pPrevious->pNext = pItem->pNext;
- }
- if (pItem->pNext) {
- pItem->pNext->pPrevious = pItem->pPrevious;
- }
- if (pItem->pParent->pChild == pItem) {
- pItem->pParent->pChild = pItem->pNext;
- }
- }
- pItem->pParent = pParentItem;
- SetWidgetIndex(pChild, nIndex);
-}
-void CFWL_WidgetMgr::RemoveWidget(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- if (!pItem) {
- return;
- }
- if (pItem->pPrevious) {
- pItem->pPrevious->pNext = pItem->pNext;
- }
- if (pItem->pNext) {
- pItem->pNext->pPrevious = pItem->pPrevious;
- }
- if (pItem->pParent && pItem->pParent->pChild == pItem) {
- pItem->pParent->pChild = pItem->pNext;
- }
- CFWL_WidgetMgrItem* pChild = pItem->pChild;
- while (pChild) {
- CFWL_WidgetMgrItem* pNext = pChild->pNext;
- RemoveWidget(pChild->pWidget);
- pChild = pNext;
- }
- m_mapWidgetItem.RemoveKey(pWidget);
- delete pItem;
-}
-void CFWL_WidgetMgr::SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pOwner);
- if (!pParentItem) {
- pParentItem = new CFWL_WidgetMgrItem;
- pParentItem->pWidget = pOwner;
- m_mapWidgetItem.SetAt(pOwner, pParentItem);
- CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
- pParentItem->pParent = pRoot;
- SetWidgetIndex(pOwner, -1);
- }
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pOwned);
- if (!pItem) {
- pItem = new CFWL_WidgetMgrItem;
- pItem->pWidget = pOwned;
- m_mapWidgetItem.SetAt(pOwned, pItem);
- }
- pItem->pOwner = pParentItem;
-}
-void CFWL_WidgetMgr::SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild) {
- CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
- if (!pItem)
- return;
- if (pItem->pParent && pItem->pParent != pParentItem) {
- if (pItem->pPrevious) {
- pItem->pPrevious->pNext = pItem->pNext;
- }
- if (pItem->pNext) {
- pItem->pNext->pPrevious = pItem->pPrevious;
- }
- if (pItem->pParent->pChild == pItem) {
- pItem->pParent->pChild = pItem->pNext;
- }
- pItem->pNext = NULL;
- pItem->pPrevious = NULL;
- }
- pItem->pParent = pParentItem;
- SetWidgetIndex(pChild, -1);
- if (!m_pAdapter)
- return;
- m_pAdapter->SetParentWidget(pChild, pParent);
-}
-FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent) {
- IFWL_Widget* pTemp = pChild;
- do {
- if (pTemp == pParent) {
- return TRUE;
- }
- pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent);
- } while (pTemp);
- return FALSE;
-}
-FWL_ERR CFWL_WidgetMgr::CreateWidget_Native(IFWL_Widget* pWidget) {
- if (!IsAbleNative(pWidget)) {
- return FWL_ERR_Succeeded;
- }
- return m_pAdapter->CreateWidget(pWidget, pWidget->GetOwner());
-}
-FWL_ERR CFWL_WidgetMgr::DestroyWidget_Native(IFWL_Widget* pWidget) {
- if (!IsAbleNative(pWidget)) {
- return FWL_ERR_Succeeded;
- }
- return m_pAdapter->DestroyWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::GetWidgetRect_Native(IFWL_Widget* pWidget,
- CFX_RectF& rect) {
- if (!IsAbleNative(pWidget)) {
- return FWL_ERR_Succeeded;
- }
- return m_pAdapter->GetWidgetRect(pWidget, rect);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetRect_Native(IFWL_Widget* pWidget,
- const CFX_RectF& rect) {
- if (FWL_UseOffscreen(pWidget)) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- pItem->iRedrawCounter++;
- if (pItem->pOffscreen) {
- CFX_RenderDevice* pDevice = pItem->pOffscreen->GetRenderDevice();
- if (pDevice && pDevice->GetBitmap()) {
- CFX_DIBitmap* pBitmap = pDevice->GetBitmap();
- if (pBitmap->GetWidth() - rect.width > 1 ||
- pBitmap->GetHeight() - rect.height > 1) {
- delete pItem->pOffscreen;
- pItem->pOffscreen = NULL;
- }
- }
- }
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
- pItem->bOutsideChanged = !m_rtScreen.Contains(rect);
-#endif
- }
- return m_pAdapter->SetWidgetRect(pWidget, rect);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetPosition_Native(IFWL_Widget* pWidget,
- FX_FLOAT fx,
- FX_FLOAT fy) {
- return m_pAdapter->SetWidgetPosition(pWidget, fx, fy);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetIcon_Native(IFWL_Widget* pWidget,
- const CFX_DIBitmap* pIcon,
- FX_BOOL bBig) {
- return m_pAdapter->SetWidgetIcon(pWidget, pIcon, bBig);
-}
-FWL_ERR CFWL_WidgetMgr::SetWidgetCaption_Native(
- IFWL_Widget* pWidget,
- const CFX_WideStringC& wsCaption) {
- return m_pAdapter->SetWidgetCaption(pWidget, wsCaption);
-}
-FWL_ERR CFWL_WidgetMgr::SetBorderRegion_Native(IFWL_Widget* pWidget,
- CFX_Path* pPath) {
- return m_pAdapter->SetBorderRegion(pWidget, pPath);
-}
-FWL_ERR CFWL_WidgetMgr::ShowWidget_Native(IFWL_Widget* pWidget) {
- return m_pAdapter->ShowWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::HideWidget_Native(IFWL_Widget* pWidget) {
- return m_pAdapter->HideWidget(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetNormal_Native(IFWL_Widget* pWidget) {
- return m_pAdapter->SetNormal(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetMaximize_Native(IFWL_Widget* pWidget) {
- return m_pAdapter->SetMaximize(pWidget);
-}
-FWL_ERR CFWL_WidgetMgr::SetMinimize_Native(IFWL_Widget* pWidget) {
- return m_pAdapter->SetMinimize(pWidget);
-}
-FX_BOOL CFWL_WidgetMgr::CheckMessage_Native() {
- return m_pAdapter->CheckMessage();
-}
-FWL_ERR CFWL_WidgetMgr::DispatchMessage_Native() {
- return m_pAdapter->DispatchMessage();
-}
-FX_BOOL CFWL_WidgetMgr::IsIdleMessage_Native() {
- return m_pAdapter->IsIdleMessage();
-}
-FWL_ERR CFWL_WidgetMgr::Exit_Native(int32_t iExitCode) {
- return m_pAdapter->Exit(iExitCode);
-}
-FWL_ERR CFWL_WidgetMgr::CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget,
- void* vp) {
- return m_pAdapter->CreateWidgetWithNativeId(pWidget, vp);
-}
-IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
- FX_FLOAT x,
- FX_FLOAT y) {
- if (!parent)
- return NULL;
- FX_FLOAT x1;
- FX_FLOAT y1;
- IFWL_Widget* child = GetWidget(parent, FWL_WGTRELATION_LastChild);
- while (child) {
- if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
- x1 = x;
- y1 = y;
- CFX_Matrix matrixOnParent;
- child->GetMatrix(matrixOnParent);
- CFX_Matrix m;
- m.SetIdentity();
- m.SetReverse(matrixOnParent);
- m.TransformPoint(x1, y1);
- CFX_RectF bounds;
- child->GetWidgetRect(bounds);
- if (bounds.Contains(x1, y1)) {
- x1 -= bounds.left;
- y1 -= bounds.top;
- return GetWidgetAtPoint(child, x1, y1);
- }
- }
- child = GetWidget(child, FWL_WGTRELATION_PriorSibling);
- }
- return parent;
-}
-void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
- FX_FLOAT fx,
- FX_FLOAT fy) {
- if (!FWL_UseOffscreen(pForm)) {
- return;
- }
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pForm);
- if (pItem->pOffscreen) {
- delete pItem->pOffscreen;
- pItem->pOffscreen = NULL;
- }
-}
-IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
- IFWL_Widget* focus,
- FX_BOOL& bFind) {
- IFWL_Widget* child =
- FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
- while (child) {
- if (focus == child) {
- bFind = TRUE;
- }
- if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) &&
- (!focus || (focus != child && bFind))) {
- return child;
- }
- IFWL_Widget* bRet = nextTab(child, focus, bFind);
- if (bRet) {
- return bRet;
- }
- child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
- }
- return NULL;
-}
-int32_t CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget* pFirst) {
- int32_t iRet = 0;
- IFWL_Widget* pChild = pFirst;
- while (pChild) {
- if ((pChild->GetStyles() & FWL_WGTSTYLE_Group) &&
- pChild->GetClassID() == 3811304691) {
- iRet++;
- }
- pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling);
- }
- return iRet;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget* pWidget,
- FX_BOOL bNext) {
- while ((pWidget = GetWidget(pWidget, bNext ? FWL_WGTRELATION_NextSibling
- : FWL_WGTRELATION_PriorSibling)) !=
- NULL) {
- if (pWidget->GetClassID() == 3811304691) {
- return pWidget;
- }
- }
- return NULL;
-}
-IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(
- IFWL_Widget* pRadioButton) {
- if (pRadioButton->GetStyles() & FWL_WGTSTYLE_Group) {
- return pRadioButton;
- }
- IFWL_Widget* pNext = pRadioButton;
- while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != NULL) {
- if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
- return pNext;
- }
- }
- pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling);
- if ((pNext->GetStyles() & FWL_WGTSTYLE_Group) &&
- pNext->GetClassID() == 3811304691) {
- return pNext;
- }
- while ((pNext = GetSiblingRadioButton(pNext, FALSE)) && pNext &&
- pNext != pRadioButton) {
- if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
- return pNext;
- }
- }
- pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
- if (pNext && (pNext->GetStyles() == FWL_WGTSTYLE_Group) &&
- pNext->GetClassID() == 3811304691) {
- return pNext;
- }
- return GetSiblingRadioButton(pNext, TRUE);
-}
-void CFWL_WidgetMgr::GetSameGroupRadioButton(IFWL_Widget* pRadioButton,
- CFX_PtrArray& group) {
- IFWL_Widget* pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
- if (!pFirst) {
- pFirst = pRadioButton;
- }
- int32_t iGroup = CountRadioButtonGroup(pFirst);
- if (iGroup < 2) {
- if (pFirst->GetClassID() == 3811304691) {
- group.Add(pFirst);
- }
- IFWL_Widget* pNext = pFirst;
- while ((pNext = GetSiblingRadioButton(pNext, TRUE)) != NULL) {
- group.Add(pNext);
- }
- return;
- }
- IFWL_Widget* pNext = GetRadioButtonGroupHeader(pRadioButton);
- do {
- group.Add(pNext);
- pNext = GetSiblingRadioButton(pNext, TRUE);
- if (!pNext) {
- if (pFirst->GetClassID() == 3811304691) {
- pNext = pFirst;
- } else {
- pNext = GetSiblingRadioButton(pFirst, TRUE);
- }
- }
- } while (pNext && ((pNext->GetStyles() & FWL_WGTSTYLE_Group) == 0));
-}
-IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
- if ((pParent->GetClassID() == 3521614244) &&
- (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
- return pParent;
- }
- IFWL_Widget* child =
- FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
- while (child) {
- if ((child->GetClassID() == 3521614244) &&
- (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
- return child;
- }
- IFWL_Widget* find = GetDefaultButton(child);
- if (find) {
- return find;
- }
- child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
- }
- return NULL;
-}
-void CFWL_WidgetMgr::AddRedrawCounts(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- (pItem->iRedrawCounter)++;
-}
-void CFWL_WidgetMgr::ResetRedrawCounts(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
- pItem->iRedrawCounter = 0;
-}
-CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget* pWidget) {
- return static_cast<CFWL_WidgetMgrItem*>(m_mapWidgetItem.GetValueAt(pWidget));
-}
-int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
- int32_t* pIndex,
- CFWL_WidgetMgrItem* pItem,
- IFWL_Widget** pWidget) {
- if (!pParent) {
- return 0;
- }
- int32_t iCount = 0;
- CFWL_WidgetMgrItem* pChild = pParent->pChild;
- while (pChild) {
- iCount++;
- if (pIndex) {
- if (*pIndex == 0) {
- *pWidget = pChild->pWidget;
- return iCount;
- }
- pIndex--;
- }
- if (pItem && pItem == pChild) {
- return iCount - 1;
- }
- pChild = pChild->pNext;
- }
- if (pIndex) {
- return 0;
- } else if (pItem) {
- return -1;
- }
- return iCount - 1;
-}
-FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) {
- if (!pWidget)
- return FALSE;
- if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) {
- return FALSE;
- }
- FX_DWORD dwStyles = pWidget->GetStyles();
- return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
- FWL_WGTSTYLE_OverLapper) ||
- (dwStyles & FWL_WGTSTYLE_Popup);
-}
-FX_BOOL CFWL_WidgetMgr::IsThreadEnabled() {
- return !(m_dwCapability & FWL_WGTMGR_DisableThread);
-}
-FX_BOOL CFWL_WidgetMgr::IsFormDisabled() {
- return m_dwCapability & FWL_WGTMGR_DisableForm;
-}
-FX_BOOL CFWL_WidgetMgr::GetAdapterPopupPos(IFWL_Widget* pWidget,
- FX_FLOAT fMinHeight,
- FX_FLOAT fMaxHeight,
- const CFX_RectF& rtAnchor,
- CFX_RectF& rtPopup) {
- IFWL_AdapterWidgetMgr* pSDApapter = GetAdapterWidgetMgr();
- return pSDApapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor,
- rtPopup);
-}
-CFWL_WidgetMgrDelegate::CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr)
- : m_pWidgetMgr(pWidgetMgr) {}
-FWL_ERR CFWL_WidgetMgrDelegate::OnSetCapability(FX_DWORD dwCapability) {
- m_pWidgetMgr->m_dwCapability = dwCapability;
- return FWL_ERR_Succeeded;
-}
-int32_t CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message* pMessage) {
- if (!pMessage)
- return 0;
- if (!pMessage->m_pDstTarget)
- return 0;
- IFWL_Widget* pDstWidget = pMessage->m_pDstTarget;
- IFWL_NoteThread* pNoteThread = pDstWidget->GetOwnerThread();
- if (!pNoteThread)
- return 0;
- CFWL_NoteDriver* pNoteDriver =
- static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
- if (!pNoteDriver)
- return 0;
- if (m_pWidgetMgr->IsThreadEnabled()) {
- pMessage = static_cast<CFWL_Message*>(pMessage->Clone());
- }
- if (m_pWidgetMgr->IsFormDisabled()) {
- pNoteDriver->ProcessMessage(pMessage);
- } else {
- pNoteDriver->QueueMessage(pMessage);
- }
-#if (_FX_OS_ == _FX_MACOSX_)
- CFWL_NoteLoop* pTopLoop = pNoteDriver->GetTopLoop();
- if (pTopLoop) {
- pNoteDriver->UnqueueMessage(pTopLoop);
- }
-#endif
- if (m_pWidgetMgr->IsThreadEnabled()) {
- pMessage->Release();
- }
- return FWL_ERR_Succeeded;
-}
-FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
- CFX_Graphics* pGraphics,
- const CFX_Matrix* pMatrix) {
- if (!pWidget)
- return FWL_ERR_Indefinite;
- if (!pGraphics)
- return FWL_ERR_Indefinite;
- CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix);
- CFX_RectF clipCopy;
- pWidget->GetWidgetRect(clipCopy);
- clipCopy.left = clipCopy.top = 0;
- if (bUseOffscreenDirect(pWidget)) {
- DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
- return FWL_ERR_Succeeded;
- }
- CFX_RectF clipBounds;
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) || \
- (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_ANDROID_)
- IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
- pDelegate->OnDrawWidget(pTemp, pMatrix);
- pGraphics->GetClipRect(clipBounds);
- clipCopy = clipBounds;
-#elif(_FX_OS_ == _FX_MACOSX_)
- if (m_pWidgetMgr->IsFormDisabled()) {
- IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
- pDelegate->OnDrawWidget(pTemp, pMatrix);
- pGraphics->GetClipRect(clipBounds);
- clipCopy = clipBounds;
- } else {
- clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
- const_cast<CFX_Matrix*>(pMatrix)->SetIdentity(); // FIXME: const cast.
-#ifdef FWL_UseMacSystemBorder
-#else
-#endif
- {
- IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
- pDelegate->OnDrawWidget(pTemp, pMatrix);
- }
- }
-#endif
- if (!m_pWidgetMgr->IsFormDisabled()) {
- CFX_RectF rtClient;
- pWidget->GetClientRect(rtClient);
- clipBounds.Intersect(rtClient);
- }
- if (!clipBounds.IsEmpty()) {
- DrawChild(pWidget, clipBounds, pTemp, pMatrix);
- }
- DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
- m_pWidgetMgr->ResetRedrawCounts(pWidget);
- return FWL_ERR_Succeeded;
-}
-void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
- const CFX_RectF& rtClip,
- CFX_Graphics* pGraphics,
- const CFX_Matrix* pMatrix) {
- if (!parent)
- return;
- FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
- IFWL_Widget* pNextChild =
- m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
- while (pNextChild) {
- IFWL_Widget* child = pNextChild;
- pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
- if (child->GetStates() & FWL_WGTSTATE_Invisible) {
- continue;
- }
- CFX_RectF rtWidget;
- child->GetWidgetRect(rtWidget);
- if (rtWidget.IsEmpty()) {
- continue;
- }
- CFX_Matrix widgetMatrix;
- CFX_RectF clipBounds(rtWidget);
- if (!bFormDisable) {
- child->GetMatrix(widgetMatrix, TRUE);
- }
- if (pMatrix) {
- widgetMatrix.Concat(*pMatrix);
- }
- if (!bFormDisable) {
- widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top);
- clipBounds.Intersect(rtClip);
- if (clipBounds.IsEmpty()) {
- continue;
- }
- pGraphics->SaveGraphState();
- pGraphics->SetClipRect(clipBounds);
- }
- widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE);
- IFWL_WidgetDelegate* pDelegate = child->SetDelegate(NULL);
- if (pDelegate) {
- if (m_pWidgetMgr->IsFormDisabled() ||
- IsNeedRepaint(child, &widgetMatrix, rtClip)) {
- pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
- }
- }
- if (!bFormDisable) {
- pGraphics->RestoreGraphState();
- }
- DrawChild(child, clipBounds, pGraphics,
- bFormDisable ? &widgetMatrix : pMatrix);
- child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
- }
-}
-CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
- IFWL_Widget* pWidget,
- CFX_Graphics* pGraphics,
- const CFX_Matrix* pMatrix) {
- if (!FWL_UseOffscreen(pWidget)) {
- return pGraphics;
- }
- CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
- if (!pItem->pOffscreen) {
- pItem->pOffscreen = new CFX_Graphics;
- CFX_RectF rect;
- pWidget->GetWidgetRect(rect);
- pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height,
- FXDIB_Argb);
- }
- CFX_RectF rect;
- pGraphics->GetClipRect(rect);
- pItem->pOffscreen->SetClipRect(rect);
- return pItem->pOffscreen;
-}
-void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
- CFX_Graphics* pGraphics,
- CFX_RectF& rtClip,
- const CFX_Matrix* pMatrix) {
- if (FWL_UseOffscreen(pWidget)) {
- CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
- pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip,
- pMatrix);
-#ifdef _WIN32
- pItem->pOffscreen->ClearClip();
-#endif
- }
- CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
- pItem->iRedrawCounter = 0;
-}
-#define FWL_NEEDREPAINTHIT_Point 12
-#define FWL_NEEDREPAINTHIT_Piece 3
-typedef struct _FWL_NeedRepaintHitData {
- CFX_PointF hitPoint;
- FX_BOOL bNotNeedRepaint;
- FX_BOOL bNotContainByDirty;
-} FWL_NeedRepaintHitData;
-FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
- CFX_Matrix* pMatrix,
- const CFX_RectF& rtDirty) {
- CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
- if (pItem && pItem->iRedrawCounter > 0) {
- pItem->iRedrawCounter = 0;
- return TRUE;
- }
- CFX_RectF rtWidget;
- pWidget->GetWidgetRect(rtWidget);
- rtWidget.left = rtWidget.top = 0;
- pMatrix->TransformRect(rtWidget);
- if (!rtWidget.IntersectWith(rtDirty)) {
- return FALSE;
- }
- IFWL_Widget* pChild =
- FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
- if (!pChild) {
- return TRUE;
- }
- if (pChild->GetClassID() == 3150298670) {
- CFX_RectF rtTemp;
- pChild->GetWidgetRect(rtTemp);
- if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) {
- pChild =
- FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild);
- if (!pChild) {
- return TRUE;
- }
- }
- }
- CFX_RectF rtChilds;
- rtChilds.Empty();
- FX_BOOL bChildIntersectWithDirty = FALSE;
- FX_BOOL bOrginPtIntersectWidthChild = FALSE;
- FX_BOOL bOrginPtIntersectWidthDirty =
- rtDirty.Contains(rtWidget.left, rtWidget.top);
- static FWL_NeedRepaintHitData hitPoint[FWL_NEEDREPAINTHIT_Point];
- static int32_t iSize = sizeof(FWL_NeedRepaintHitData);
- FXSYS_memset(hitPoint, 0, iSize);
- FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece;
- FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece;
- hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left;
- hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x =
- hitPoint[10].hitPoint.x = fxPiece + rtWidget.left;
- hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x =
- hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left;
- hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x =
- rtWidget.width + rtWidget.left;
- hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top;
- hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y =
- hitPoint[5].hitPoint.y = fyPiece + rtWidget.top;
- hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y =
- hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top;
- hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y =
- rtWidget.height + rtWidget.top;
- do {
- CFX_RectF rect;
- pChild->GetWidgetRect(rect);
- CFX_RectF r = rect;
- r.left += rtWidget.left;
- r.top += rtWidget.top;
- if (r.IsEmpty()) {
- continue;
- }
- if (r.Contains(rtDirty)) {
- return FALSE;
- }
- if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) {
- bChildIntersectWithDirty = TRUE;
- }
- if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
- bOrginPtIntersectWidthChild = rect.Contains(0, 0);
- }
- if (rtChilds.IsEmpty()) {
- rtChilds = rect;
- } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) {
- rtChilds.Union(rect);
- }
- for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
- if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) {
- continue;
- }
- if (!rtDirty.Contains(hitPoint[i].hitPoint)) {
- hitPoint[i].bNotContainByDirty = TRUE;
- continue;
- }
- if (r.Contains(hitPoint[i].hitPoint)) {
- hitPoint[i].bNotNeedRepaint = TRUE;
- }
- }
- } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
- pChild, FWL_WGTRELATION_NextSibling)) != NULL);
- if (!bChildIntersectWithDirty) {
- return TRUE;
- }
- if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
- return TRUE;
- }
- if (rtChilds.IsEmpty()) {
- return TRUE;
- }
- int32_t repaintPoint = FWL_NEEDREPAINTHIT_Point;
- for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
- if (hitPoint[i].bNotNeedRepaint) {
- repaintPoint--;
- }
- }
- if (repaintPoint > 0) {
- return TRUE;
- }
- pMatrix->TransformRect(rtChilds);
- if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) {
- return FALSE;
- }
- return TRUE;
-}
-FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget* pWidget) {
- CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
- if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) {
- return FALSE;
- }
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
- if (pItem->bOutsideChanged) {
- CFX_RectF r;
- pWidget->GetWidgetRect(r);
- CFX_RectF temp(m_pWidgetMgr->m_rtScreen);
- temp.Deflate(50, 50);
- if (!temp.Contains(r)) {
- return FALSE;
- }
- pItem->bOutsideChanged = FALSE;
- }
-#endif
- return pItem->iRedrawCounter == 0;
-}
-static void FWL_WriteBMP(CFX_DIBitmap* pBitmap, const FX_CHAR* filename) {
- FILE* file = fopen(filename, "wb");
- if (file == NULL) {
- return;
- }
- int size = 14 + 40 + pBitmap->GetPitch() * pBitmap->GetHeight();
- unsigned char buffer[40];
- buffer[0] = 'B';
- buffer[1] = 'M';
- buffer[2] = (unsigned char)size;
- buffer[3] = (unsigned char)(size >> 8);
- buffer[4] = (unsigned char)(size >> 16);
- buffer[5] = (unsigned char)(size >> 24);
- buffer[6] = buffer[7] = buffer[8] = buffer[9] = 0;
- buffer[10] = 54;
- buffer[11] = buffer[12] = buffer[13] = 0;
- fwrite(buffer, 14, 1, file);
- memset(buffer, 0, 40);
- buffer[0] = 40;
- buffer[4] = (unsigned char)pBitmap->GetWidth();
- buffer[5] = (unsigned char)(pBitmap->GetWidth() >> 8);
- buffer[6] = (unsigned char)(pBitmap->GetWidth() >> 16);
- buffer[7] = (unsigned char)(pBitmap->GetWidth() >> 24);
- buffer[8] = (unsigned char)(-pBitmap->GetHeight());
- buffer[9] = (unsigned char)((-pBitmap->GetHeight()) >> 8);
- buffer[10] = (unsigned char)((-pBitmap->GetHeight()) >> 16);
- buffer[11] = (unsigned char)((-pBitmap->GetHeight()) >> 24);
- buffer[12] = 1;
- buffer[14] = pBitmap->GetBPP();
- fwrite(buffer, 40, 1, file);
- for (int row = 0; row < pBitmap->GetHeight(); row++) {
- uint8_t* scan_line = pBitmap->GetBuffer() + row * pBitmap->GetPitch();
- fwrite(scan_line, pBitmap->GetPitch(), 1, file);
- }
- fclose(file);
-}
-FWL_ERR FWL_WidgetMgrSnapshot(IFWL_Widget* pWidget,
- const CFX_WideString* saveFile,
- const CFX_Matrix* pMatrix) {
- CFX_RectF r;
- pWidget->GetWidgetRect(r);
- CFX_Graphics gs;
- gs.Create((int32_t)r.width, (int32_t)r.height, FXDIB_Argb);
- CFWL_WidgetMgr* widgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
- CFWL_WidgetMgrDelegate* delegate = widgetMgr->GetDelegate();
- delegate->OnDrawWidget(pWidget, &gs, pMatrix);
- CFX_DIBitmap* dib = gs.GetRenderDevice()->GetBitmap();
- FWL_WriteBMP(dib, saveFile->UTF8Encode());
- return FWL_ERR_Succeeded;
-}
-FX_BOOL FWL_WidgetIsChild(IFWL_Widget* parent, IFWL_Widget* find) {
- if (!find) {
- return FALSE;
- }
- IFWL_Widget* child =
- FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
- while (child) {
- if (child == find) {
- return TRUE;
- }
- if (FWL_WidgetIsChild(child, find)) {
- return TRUE;
- }
- child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
- }
- return FALSE;
-}
+// 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/src/foxitlib.h"
+#include "xfa/src/fwl/src/core/include/fwl_targetimp.h"
+#include "xfa/src/fwl/src/core/include/fwl_noteimp.h"
+#include "xfa/src/fwl/src/core/include/fwl_widgetmgrimp.h"
+#include "xfa/src/fwl/src/core/include/fwl_threadimp.h"
+#include "xfa/src/fwl/src/core/include/fwl_appimp.h"
+
+FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
+#if (_FX_OS_ == _FX_MACOSX_)
+ return FALSE;
+#else
+ return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen;
+#endif
+}
+IFWL_WidgetMgr* FWL_GetWidgetMgr() {
+ IFWL_App* pApp = FWL_GetApp();
+ if (!pApp)
+ return NULL;
+ return pApp->GetWidgetMgr();
+}
+CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
+ : m_dwCapability(0) {
+ m_pDelegate = new CFWL_WidgetMgrDelegate(this);
+ m_pAdapter = pAdapterNative->GetWidgetMgr(m_pDelegate);
+ FXSYS_assert(m_pAdapter);
+ CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
+ m_mapWidgetItem.SetAt(NULL, pRoot);
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+ m_rtScreen.Reset();
+ IFWL_AdapterMonitorMgr* pMonitorMgr = pAdapterNative->GetMonitorMgr();
+ if (pMonitorMgr) {
+ FWL_HMONITOR monitor = pMonitorMgr->GetCurrentMonitor();
+ if (monitor) {
+ pMonitorMgr->GetMonitorSize(monitor, m_rtScreen.width, m_rtScreen.height);
+ }
+ }
+#endif
+}
+CFWL_WidgetMgr::~CFWL_WidgetMgr() {
+ FX_POSITION ps = m_mapWidgetItem.GetStartPosition();
+ while (ps) {
+ void* pWidget;
+ CFWL_WidgetMgrItem* pItem;
+ m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem);
+ delete pItem;
+ }
+ m_mapWidgetItem.RemoveAll();
+ if (m_pDelegate) {
+ delete m_pDelegate;
+ m_pDelegate = NULL;
+ }
+}
+int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+ return TravelWidgetMgr(pParentItem, NULL, NULL);
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidget(int32_t nIndex, IFWL_Widget* pParent) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+ IFWL_Widget* pWidget = NULL;
+ TravelWidgetMgr(pParentItem, &nIndex, NULL, &pWidget);
+ return pWidget;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidget(IFWL_Widget* pWidget,
+ FWL_WGTRELATION eRelation) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ if (!pItem) {
+ return NULL;
+ }
+ IFWL_Widget* pRet = NULL;
+ switch (eRelation) {
+ case FWL_WGTRELATION_Parent: {
+ pRet = pItem->pParent ? pItem->pParent->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_Owner: {
+ pRet = pItem->pOwner ? pItem->pOwner->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_FirstSibling: {
+ pItem = pItem->pPrevious;
+ while (pItem && pItem->pPrevious) {
+ pItem = pItem->pPrevious;
+ }
+ pRet = pItem ? pItem->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_PriorSibling: {
+ pRet = pItem->pPrevious ? pItem->pPrevious->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_NextSibling: {
+ pRet = pItem->pNext ? pItem->pNext->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_LastSibling: {
+ pItem = pItem->pNext;
+ while (pItem && pItem->pNext) {
+ pItem = pItem->pNext;
+ }
+ pRet = pItem ? pItem->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_FirstChild: {
+ pRet = pItem->pChild ? pItem->pChild->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_LastChild: {
+ pItem = pItem->pChild;
+ while (pItem && pItem->pNext) {
+ pItem = pItem->pNext;
+ }
+ pRet = pItem ? pItem->pWidget : NULL;
+ break;
+ }
+ case FWL_WGTRELATION_SystemForm: {
+ while (pItem) {
+ if (IsAbleNative(pItem->pWidget)) {
+ pRet = pItem->pWidget;
+ break;
+ }
+ pItem = pItem->pParent;
+ }
+ break;
+ }
+ default: {}
+ }
+ return pRet;
+}
+int32_t CFWL_WidgetMgr::GetWidgetIndex(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ if (!pItem)
+ return -1;
+ return TravelWidgetMgr(pItem->pParent, NULL, pItem);
+}
+FX_BOOL CFWL_WidgetMgr::SetWidgetIndex(IFWL_Widget* pWidget, int32_t nIndex) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ if (!pItem)
+ return FALSE;
+ if (!pItem->pParent)
+ return FALSE;
+ CFWL_WidgetMgrItem* pChild = pItem->pParent->pChild;
+ int32_t i = 0;
+ while (pChild) {
+ if (pChild == pItem) {
+ if (i == nIndex) {
+ return TRUE;
+ }
+ if (pChild->pPrevious) {
+ pChild->pPrevious->pNext = pChild->pNext;
+ }
+ if (pChild->pNext) {
+ pChild->pNext->pPrevious = pChild->pPrevious;
+ }
+ if (pItem->pParent->pChild == pItem) {
+ pItem->pParent->pChild = pItem->pNext;
+ }
+ pItem->pNext = NULL;
+ pItem->pPrevious = NULL;
+ break;
+ }
+ if (!pChild->pNext) {
+ break;
+ }
+ pChild = pChild->pNext;
+ ++i;
+ }
+ pChild = pItem->pParent->pChild;
+ if (pChild) {
+ if (nIndex < 0) {
+ while (pChild->pNext) {
+ pChild = pChild->pNext;
+ }
+ pChild->pNext = pItem;
+ pItem->pPrevious = pChild;
+ pItem->pNext = NULL;
+ return TRUE;
+ }
+ i = 0;
+ while (i < nIndex && pChild->pNext) {
+ pChild = pChild->pNext;
+ ++i;
+ }
+ if (!pChild->pNext) {
+ pChild->pNext = pItem;
+ pItem->pPrevious = pChild;
+ pItem->pNext = NULL;
+ return TRUE;
+ }
+ if (pChild->pPrevious) {
+ pItem->pPrevious = pChild->pPrevious;
+ pChild->pPrevious->pNext = pItem;
+ }
+ pChild->pPrevious = pItem;
+ pItem->pNext = pChild;
+ if (pItem->pParent->pChild == pChild) {
+ pItem->pParent->pChild = pItem;
+ }
+ } else {
+ pItem->pParent->pChild = pItem;
+ pItem->pPrevious = NULL;
+ pItem->pNext = NULL;
+ }
+ return TRUE;
+}
+FWL_ERR CFWL_WidgetMgr::RepaintWidget(IFWL_Widget* pWidget,
+ const CFX_RectF* pRect) {
+ if (!m_pAdapter)
+ return FWL_ERR_Indefinite;
+ IFWL_Widget* pNative = pWidget;
+ CFX_RectF rect(*pRect);
+ if (IsFormDisabled()) {
+ IFWL_Widget* pOuter = pWidget->GetOuter();
+ while (pOuter) {
+ CFX_RectF rtTemp;
+ pNative->GetWidgetRect(rtTemp);
+ rect.left += rtTemp.left;
+ rect.top += rtTemp.top;
+ pNative = pOuter;
+ pOuter = pOuter->GetOuter();
+ }
+ } else if (!IsAbleNative(pWidget)) {
+ pNative = GetWidget(pWidget, FWL_WGTRELATION_SystemForm);
+ if (!pNative)
+ return FWL_ERR_Indefinite;
+ pWidget->TransformTo(pNative, rect.left, rect.top);
+ }
+ AddRedrawCounts(pNative);
+ return m_pAdapter->RepaintWidget(pNative, &rect);
+}
+void CFWL_WidgetMgr::AddWidget(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(NULL);
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ if (!pItem) {
+ pItem = new CFWL_WidgetMgrItem;
+ pItem->pWidget = pWidget;
+ m_mapWidgetItem.SetAt(pWidget, pItem);
+ }
+ if (pItem->pParent && pItem->pParent != pParentItem) {
+ if (pItem->pPrevious) {
+ pItem->pPrevious->pNext = pItem->pNext;
+ }
+ if (pItem->pNext) {
+ pItem->pNext->pPrevious = pItem->pPrevious;
+ }
+ if (pItem->pParent->pChild == pItem) {
+ pItem->pParent->pChild = pItem->pNext;
+ }
+ }
+ pItem->pParent = pParentItem;
+ SetWidgetIndex(pWidget, -1);
+}
+void CFWL_WidgetMgr::InsertWidget(IFWL_Widget* pParent,
+ IFWL_Widget* pChild,
+ int32_t nIndex) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+ if (!pParentItem) {
+ pParentItem = new CFWL_WidgetMgrItem;
+ pParentItem->pWidget = pParent;
+ m_mapWidgetItem.SetAt(pParent, pParentItem);
+ CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
+ pParentItem->pParent = pRoot;
+ SetWidgetIndex(pParent, -1);
+ }
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
+ if (!pItem) {
+ pItem = new CFWL_WidgetMgrItem;
+ pItem->pWidget = pChild;
+ m_mapWidgetItem.SetAt(pChild, pItem);
+ }
+ if (pItem->pParent && pItem->pParent != pParentItem) {
+ if (pItem->pPrevious) {
+ pItem->pPrevious->pNext = pItem->pNext;
+ }
+ if (pItem->pNext) {
+ pItem->pNext->pPrevious = pItem->pPrevious;
+ }
+ if (pItem->pParent->pChild == pItem) {
+ pItem->pParent->pChild = pItem->pNext;
+ }
+ }
+ pItem->pParent = pParentItem;
+ SetWidgetIndex(pChild, nIndex);
+}
+void CFWL_WidgetMgr::RemoveWidget(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ if (!pItem) {
+ return;
+ }
+ if (pItem->pPrevious) {
+ pItem->pPrevious->pNext = pItem->pNext;
+ }
+ if (pItem->pNext) {
+ pItem->pNext->pPrevious = pItem->pPrevious;
+ }
+ if (pItem->pParent && pItem->pParent->pChild == pItem) {
+ pItem->pParent->pChild = pItem->pNext;
+ }
+ CFWL_WidgetMgrItem* pChild = pItem->pChild;
+ while (pChild) {
+ CFWL_WidgetMgrItem* pNext = pChild->pNext;
+ RemoveWidget(pChild->pWidget);
+ pChild = pNext;
+ }
+ m_mapWidgetItem.RemoveKey(pWidget);
+ delete pItem;
+}
+void CFWL_WidgetMgr::SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pOwner);
+ if (!pParentItem) {
+ pParentItem = new CFWL_WidgetMgrItem;
+ pParentItem->pWidget = pOwner;
+ m_mapWidgetItem.SetAt(pOwner, pParentItem);
+ CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
+ pParentItem->pParent = pRoot;
+ SetWidgetIndex(pOwner, -1);
+ }
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pOwned);
+ if (!pItem) {
+ pItem = new CFWL_WidgetMgrItem;
+ pItem->pWidget = pOwned;
+ m_mapWidgetItem.SetAt(pOwned, pItem);
+ }
+ pItem->pOwner = pParentItem;
+}
+void CFWL_WidgetMgr::SetParent(IFWL_Widget* pParent, IFWL_Widget* pChild) {
+ CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
+ if (!pItem)
+ return;
+ if (pItem->pParent && pItem->pParent != pParentItem) {
+ if (pItem->pPrevious) {
+ pItem->pPrevious->pNext = pItem->pNext;
+ }
+ if (pItem->pNext) {
+ pItem->pNext->pPrevious = pItem->pPrevious;
+ }
+ if (pItem->pParent->pChild == pItem) {
+ pItem->pParent->pChild = pItem->pNext;
+ }
+ pItem->pNext = NULL;
+ pItem->pPrevious = NULL;
+ }
+ pItem->pParent = pParentItem;
+ SetWidgetIndex(pChild, -1);
+ if (!m_pAdapter)
+ return;
+ m_pAdapter->SetParentWidget(pChild, pParent);
+}
+FX_BOOL CFWL_WidgetMgr::IsChild(IFWL_Widget* pChild, IFWL_Widget* pParent) {
+ IFWL_Widget* pTemp = pChild;
+ do {
+ if (pTemp == pParent) {
+ return TRUE;
+ }
+ pTemp = GetWidget(pTemp, FWL_WGTRELATION_Parent);
+ } while (pTemp);
+ return FALSE;
+}
+FWL_ERR CFWL_WidgetMgr::CreateWidget_Native(IFWL_Widget* pWidget) {
+ if (!IsAbleNative(pWidget)) {
+ return FWL_ERR_Succeeded;
+ }
+ return m_pAdapter->CreateWidget(pWidget, pWidget->GetOwner());
+}
+FWL_ERR CFWL_WidgetMgr::DestroyWidget_Native(IFWL_Widget* pWidget) {
+ if (!IsAbleNative(pWidget)) {
+ return FWL_ERR_Succeeded;
+ }
+ return m_pAdapter->DestroyWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::GetWidgetRect_Native(IFWL_Widget* pWidget,
+ CFX_RectF& rect) {
+ if (!IsAbleNative(pWidget)) {
+ return FWL_ERR_Succeeded;
+ }
+ return m_pAdapter->GetWidgetRect(pWidget, rect);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetRect_Native(IFWL_Widget* pWidget,
+ const CFX_RectF& rect) {
+ if (FWL_UseOffscreen(pWidget)) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ pItem->iRedrawCounter++;
+ if (pItem->pOffscreen) {
+ CFX_RenderDevice* pDevice = pItem->pOffscreen->GetRenderDevice();
+ if (pDevice && pDevice->GetBitmap()) {
+ CFX_DIBitmap* pBitmap = pDevice->GetBitmap();
+ if (pBitmap->GetWidth() - rect.width > 1 ||
+ pBitmap->GetHeight() - rect.height > 1) {
+ delete pItem->pOffscreen;
+ pItem->pOffscreen = NULL;
+ }
+ }
+ }
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+ pItem->bOutsideChanged = !m_rtScreen.Contains(rect);
+#endif
+ }
+ return m_pAdapter->SetWidgetRect(pWidget, rect);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetPosition_Native(IFWL_Widget* pWidget,
+ FX_FLOAT fx,
+ FX_FLOAT fy) {
+ return m_pAdapter->SetWidgetPosition(pWidget, fx, fy);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetIcon_Native(IFWL_Widget* pWidget,
+ const CFX_DIBitmap* pIcon,
+ FX_BOOL bBig) {
+ return m_pAdapter->SetWidgetIcon(pWidget, pIcon, bBig);
+}
+FWL_ERR CFWL_WidgetMgr::SetWidgetCaption_Native(
+ IFWL_Widget* pWidget,
+ const CFX_WideStringC& wsCaption) {
+ return m_pAdapter->SetWidgetCaption(pWidget, wsCaption);
+}
+FWL_ERR CFWL_WidgetMgr::SetBorderRegion_Native(IFWL_Widget* pWidget,
+ CFX_Path* pPath) {
+ return m_pAdapter->SetBorderRegion(pWidget, pPath);
+}
+FWL_ERR CFWL_WidgetMgr::ShowWidget_Native(IFWL_Widget* pWidget) {
+ return m_pAdapter->ShowWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::HideWidget_Native(IFWL_Widget* pWidget) {
+ return m_pAdapter->HideWidget(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetNormal_Native(IFWL_Widget* pWidget) {
+ return m_pAdapter->SetNormal(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetMaximize_Native(IFWL_Widget* pWidget) {
+ return m_pAdapter->SetMaximize(pWidget);
+}
+FWL_ERR CFWL_WidgetMgr::SetMinimize_Native(IFWL_Widget* pWidget) {
+ return m_pAdapter->SetMinimize(pWidget);
+}
+FX_BOOL CFWL_WidgetMgr::CheckMessage_Native() {
+ return m_pAdapter->CheckMessage();
+}
+FWL_ERR CFWL_WidgetMgr::DispatchMessage_Native() {
+ return m_pAdapter->DispatchMessage();
+}
+FX_BOOL CFWL_WidgetMgr::IsIdleMessage_Native() {
+ return m_pAdapter->IsIdleMessage();
+}
+FWL_ERR CFWL_WidgetMgr::Exit_Native(int32_t iExitCode) {
+ return m_pAdapter->Exit(iExitCode);
+}
+FWL_ERR CFWL_WidgetMgr::CreateWidgetWithNativeId_Native(IFWL_Widget* pWidget,
+ void* vp) {
+ return m_pAdapter->CreateWidgetWithNativeId(pWidget, vp);
+}
+IFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(IFWL_Widget* parent,
+ FX_FLOAT x,
+ FX_FLOAT y) {
+ if (!parent)
+ return NULL;
+ FX_FLOAT x1;
+ FX_FLOAT y1;
+ IFWL_Widget* child = GetWidget(parent, FWL_WGTRELATION_LastChild);
+ while (child) {
+ if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) {
+ x1 = x;
+ y1 = y;
+ CFX_Matrix matrixOnParent;
+ child->GetMatrix(matrixOnParent);
+ CFX_Matrix m;
+ m.SetIdentity();
+ m.SetReverse(matrixOnParent);
+ m.TransformPoint(x1, y1);
+ CFX_RectF bounds;
+ child->GetWidgetRect(bounds);
+ if (bounds.Contains(x1, y1)) {
+ x1 -= bounds.left;
+ y1 -= bounds.top;
+ return GetWidgetAtPoint(child, x1, y1);
+ }
+ }
+ child = GetWidget(child, FWL_WGTRELATION_PriorSibling);
+ }
+ return parent;
+}
+void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
+ FX_FLOAT fx,
+ FX_FLOAT fy) {
+ if (!FWL_UseOffscreen(pForm)) {
+ return;
+ }
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pForm);
+ if (pItem->pOffscreen) {
+ delete pItem->pOffscreen;
+ pItem->pOffscreen = NULL;
+ }
+}
+IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
+ IFWL_Widget* focus,
+ FX_BOOL& bFind) {
+ IFWL_Widget* child =
+ FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+ while (child) {
+ if (focus == child) {
+ bFind = TRUE;
+ }
+ if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) &&
+ (!focus || (focus != child && bFind))) {
+ return child;
+ }
+ IFWL_Widget* bRet = nextTab(child, focus, bFind);
+ if (bRet) {
+ return bRet;
+ }
+ child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+ }
+ return NULL;
+}
+int32_t CFWL_WidgetMgr::CountRadioButtonGroup(IFWL_Widget* pFirst) {
+ int32_t iRet = 0;
+ IFWL_Widget* pChild = pFirst;
+ while (pChild) {
+ if ((pChild->GetStyles() & FWL_WGTSTYLE_Group) &&
+ pChild->GetClassID() == 3811304691) {
+ iRet++;
+ }
+ pChild = GetWidget(pChild, FWL_WGTRELATION_NextSibling);
+ }
+ return iRet;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetSiblingRadioButton(IFWL_Widget* pWidget,
+ FX_BOOL bNext) {
+ while ((pWidget = GetWidget(pWidget, bNext ? FWL_WGTRELATION_NextSibling
+ : FWL_WGTRELATION_PriorSibling)) !=
+ NULL) {
+ if (pWidget->GetClassID() == 3811304691) {
+ return pWidget;
+ }
+ }
+ return NULL;
+}
+IFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader(
+ IFWL_Widget* pRadioButton) {
+ if (pRadioButton->GetStyles() & FWL_WGTSTYLE_Group) {
+ return pRadioButton;
+ }
+ IFWL_Widget* pNext = pRadioButton;
+ while ((pNext = GetSiblingRadioButton(pNext, FALSE)) != NULL) {
+ if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
+ return pNext;
+ }
+ }
+ pNext = GetWidget(pRadioButton, FWL_WGTRELATION_LastSibling);
+ if ((pNext->GetStyles() & FWL_WGTSTYLE_Group) &&
+ pNext->GetClassID() == 3811304691) {
+ return pNext;
+ }
+ while ((pNext = GetSiblingRadioButton(pNext, FALSE)) && pNext &&
+ pNext != pRadioButton) {
+ if (pNext->GetStyles() & FWL_WGTSTYLE_Group) {
+ return pNext;
+ }
+ }
+ pNext = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
+ if (pNext && (pNext->GetStyles() == FWL_WGTSTYLE_Group) &&
+ pNext->GetClassID() == 3811304691) {
+ return pNext;
+ }
+ return GetSiblingRadioButton(pNext, TRUE);
+}
+void CFWL_WidgetMgr::GetSameGroupRadioButton(IFWL_Widget* pRadioButton,
+ CFX_PtrArray& group) {
+ IFWL_Widget* pFirst = GetWidget(pRadioButton, FWL_WGTRELATION_FirstSibling);
+ if (!pFirst) {
+ pFirst = pRadioButton;
+ }
+ int32_t iGroup = CountRadioButtonGroup(pFirst);
+ if (iGroup < 2) {
+ if (pFirst->GetClassID() == 3811304691) {
+ group.Add(pFirst);
+ }
+ IFWL_Widget* pNext = pFirst;
+ while ((pNext = GetSiblingRadioButton(pNext, TRUE)) != NULL) {
+ group.Add(pNext);
+ }
+ return;
+ }
+ IFWL_Widget* pNext = GetRadioButtonGroupHeader(pRadioButton);
+ do {
+ group.Add(pNext);
+ pNext = GetSiblingRadioButton(pNext, TRUE);
+ if (!pNext) {
+ if (pFirst->GetClassID() == 3811304691) {
+ pNext = pFirst;
+ } else {
+ pNext = GetSiblingRadioButton(pFirst, TRUE);
+ }
+ }
+ } while (pNext && ((pNext->GetStyles() & FWL_WGTSTYLE_Group) == 0));
+}
+IFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(IFWL_Widget* pParent) {
+ if ((pParent->GetClassID() == 3521614244) &&
+ (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
+ return pParent;
+ }
+ IFWL_Widget* child =
+ FWL_GetWidgetMgr()->GetWidget(pParent, FWL_WGTRELATION_FirstChild);
+ while (child) {
+ if ((child->GetClassID() == 3521614244) &&
+ (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) {
+ return child;
+ }
+ IFWL_Widget* find = GetDefaultButton(child);
+ if (find) {
+ return find;
+ }
+ child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+ }
+ return NULL;
+}
+void CFWL_WidgetMgr::AddRedrawCounts(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ (pItem->iRedrawCounter)++;
+}
+void CFWL_WidgetMgr::ResetRedrawCounts(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
+ pItem->iRedrawCounter = 0;
+}
+CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget* pWidget) {
+ return static_cast<CFWL_WidgetMgrItem*>(m_mapWidgetItem.GetValueAt(pWidget));
+}
+int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
+ int32_t* pIndex,
+ CFWL_WidgetMgrItem* pItem,
+ IFWL_Widget** pWidget) {
+ if (!pParent) {
+ return 0;
+ }
+ int32_t iCount = 0;
+ CFWL_WidgetMgrItem* pChild = pParent->pChild;
+ while (pChild) {
+ iCount++;
+ if (pIndex) {
+ if (*pIndex == 0) {
+ *pWidget = pChild->pWidget;
+ return iCount;
+ }
+ pIndex--;
+ }
+ if (pItem && pItem == pChild) {
+ return iCount - 1;
+ }
+ pChild = pChild->pNext;
+ }
+ if (pIndex) {
+ return 0;
+ } else if (pItem) {
+ return -1;
+ }
+ return iCount - 1;
+}
+FX_BOOL CFWL_WidgetMgr::IsAbleNative(IFWL_Widget* pWidget) {
+ if (!pWidget)
+ return FALSE;
+ if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) {
+ return FALSE;
+ }
+ FX_DWORD dwStyles = pWidget->GetStyles();
+ return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) ==
+ FWL_WGTSTYLE_OverLapper) ||
+ (dwStyles & FWL_WGTSTYLE_Popup);
+}
+FX_BOOL CFWL_WidgetMgr::IsThreadEnabled() {
+ return !(m_dwCapability & FWL_WGTMGR_DisableThread);
+}
+FX_BOOL CFWL_WidgetMgr::IsFormDisabled() {
+ return m_dwCapability & FWL_WGTMGR_DisableForm;
+}
+FX_BOOL CFWL_WidgetMgr::GetAdapterPopupPos(IFWL_Widget* pWidget,
+ FX_FLOAT fMinHeight,
+ FX_FLOAT fMaxHeight,
+ const CFX_RectF& rtAnchor,
+ CFX_RectF& rtPopup) {
+ IFWL_AdapterWidgetMgr* pSDApapter = GetAdapterWidgetMgr();
+ return pSDApapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor,
+ rtPopup);
+}
+CFWL_WidgetMgrDelegate::CFWL_WidgetMgrDelegate(CFWL_WidgetMgr* pWidgetMgr)
+ : m_pWidgetMgr(pWidgetMgr) {}
+FWL_ERR CFWL_WidgetMgrDelegate::OnSetCapability(FX_DWORD dwCapability) {
+ m_pWidgetMgr->m_dwCapability = dwCapability;
+ return FWL_ERR_Succeeded;
+}
+int32_t CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message* pMessage) {
+ if (!pMessage)
+ return 0;
+ if (!pMessage->m_pDstTarget)
+ return 0;
+ IFWL_Widget* pDstWidget = pMessage->m_pDstTarget;
+ IFWL_NoteThread* pNoteThread = pDstWidget->GetOwnerThread();
+ if (!pNoteThread)
+ return 0;
+ CFWL_NoteDriver* pNoteDriver =
+ static_cast<CFWL_NoteDriver*>(pNoteThread->GetNoteDriver());
+ if (!pNoteDriver)
+ return 0;
+ if (m_pWidgetMgr->IsThreadEnabled()) {
+ pMessage = static_cast<CFWL_Message*>(pMessage->Clone());
+ }
+ if (m_pWidgetMgr->IsFormDisabled()) {
+ pNoteDriver->ProcessMessage(pMessage);
+ } else {
+ pNoteDriver->QueueMessage(pMessage);
+ }
+#if (_FX_OS_ == _FX_MACOSX_)
+ CFWL_NoteLoop* pTopLoop = pNoteDriver->GetTopLoop();
+ if (pTopLoop) {
+ pNoteDriver->UnqueueMessage(pTopLoop);
+ }
+#endif
+ if (m_pWidgetMgr->IsThreadEnabled()) {
+ pMessage->Release();
+ }
+ return FWL_ERR_Succeeded;
+}
+FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
+ CFX_Graphics* pGraphics,
+ const CFX_Matrix* pMatrix) {
+ if (!pWidget)
+ return FWL_ERR_Indefinite;
+ if (!pGraphics)
+ return FWL_ERR_Indefinite;
+ CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix);
+ CFX_RectF clipCopy;
+ pWidget->GetWidgetRect(clipCopy);
+ clipCopy.left = clipCopy.top = 0;
+ if (bUseOffscreenDirect(pWidget)) {
+ DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
+ return FWL_ERR_Succeeded;
+ }
+ CFX_RectF clipBounds;
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) || \
+ (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_ANDROID_)
+ IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+ pDelegate->OnDrawWidget(pTemp, pMatrix);
+ pGraphics->GetClipRect(clipBounds);
+ clipCopy = clipBounds;
+#elif(_FX_OS_ == _FX_MACOSX_)
+ if (m_pWidgetMgr->IsFormDisabled()) {
+ IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+ pDelegate->OnDrawWidget(pTemp, pMatrix);
+ pGraphics->GetClipRect(clipBounds);
+ clipCopy = clipBounds;
+ } else {
+ clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
+ const_cast<CFX_Matrix*>(pMatrix)->SetIdentity(); // FIXME: const cast.
+#ifdef FWL_UseMacSystemBorder
+#else
+#endif
+ {
+ IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
+ pDelegate->OnDrawWidget(pTemp, pMatrix);
+ }
+ }
+#endif
+ if (!m_pWidgetMgr->IsFormDisabled()) {
+ CFX_RectF rtClient;
+ pWidget->GetClientRect(rtClient);
+ clipBounds.Intersect(rtClient);
+ }
+ if (!clipBounds.IsEmpty()) {
+ DrawChild(pWidget, clipBounds, pTemp, pMatrix);
+ }
+ DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
+ m_pWidgetMgr->ResetRedrawCounts(pWidget);
+ return FWL_ERR_Succeeded;
+}
+void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
+ const CFX_RectF& rtClip,
+ CFX_Graphics* pGraphics,
+ const CFX_Matrix* pMatrix) {
+ if (!parent)
+ return;
+ FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
+ IFWL_Widget* pNextChild =
+ m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+ while (pNextChild) {
+ IFWL_Widget* child = pNextChild;
+ pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+ if (child->GetStates() & FWL_WGTSTATE_Invisible) {
+ continue;
+ }
+ CFX_RectF rtWidget;
+ child->GetWidgetRect(rtWidget);
+ if (rtWidget.IsEmpty()) {
+ continue;
+ }
+ CFX_Matrix widgetMatrix;
+ CFX_RectF clipBounds(rtWidget);
+ if (!bFormDisable) {
+ child->GetMatrix(widgetMatrix, TRUE);
+ }
+ if (pMatrix) {
+ widgetMatrix.Concat(*pMatrix);
+ }
+ if (!bFormDisable) {
+ widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top);
+ clipBounds.Intersect(rtClip);
+ if (clipBounds.IsEmpty()) {
+ continue;
+ }
+ pGraphics->SaveGraphState();
+ pGraphics->SetClipRect(clipBounds);
+ }
+ widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE);
+ IFWL_WidgetDelegate* pDelegate = child->SetDelegate(NULL);
+ if (pDelegate) {
+ if (m_pWidgetMgr->IsFormDisabled() ||
+ IsNeedRepaint(child, &widgetMatrix, rtClip)) {
+ pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
+ }
+ }
+ if (!bFormDisable) {
+ pGraphics->RestoreGraphState();
+ }
+ DrawChild(child, clipBounds, pGraphics,
+ bFormDisable ? &widgetMatrix : pMatrix);
+ child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
+ }
+}
+CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
+ IFWL_Widget* pWidget,
+ CFX_Graphics* pGraphics,
+ const CFX_Matrix* pMatrix) {
+ if (!FWL_UseOffscreen(pWidget)) {
+ return pGraphics;
+ }
+ CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+ if (!pItem->pOffscreen) {
+ pItem->pOffscreen = new CFX_Graphics;
+ CFX_RectF rect;
+ pWidget->GetWidgetRect(rect);
+ pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height,
+ FXDIB_Argb);
+ }
+ CFX_RectF rect;
+ pGraphics->GetClipRect(rect);
+ pItem->pOffscreen->SetClipRect(rect);
+ return pItem->pOffscreen;
+}
+void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
+ CFX_Graphics* pGraphics,
+ CFX_RectF& rtClip,
+ const CFX_Matrix* pMatrix) {
+ if (FWL_UseOffscreen(pWidget)) {
+ CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+ pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip,
+ pMatrix);
+#ifdef _WIN32
+ pItem->pOffscreen->ClearClip();
+#endif
+ }
+ CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+ pItem->iRedrawCounter = 0;
+}
+#define FWL_NEEDREPAINTHIT_Point 12
+#define FWL_NEEDREPAINTHIT_Piece 3
+typedef struct _FWL_NeedRepaintHitData {
+ CFX_PointF hitPoint;
+ FX_BOOL bNotNeedRepaint;
+ FX_BOOL bNotContainByDirty;
+} FWL_NeedRepaintHitData;
+FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
+ CFX_Matrix* pMatrix,
+ const CFX_RectF& rtDirty) {
+ CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+ if (pItem && pItem->iRedrawCounter > 0) {
+ pItem->iRedrawCounter = 0;
+ return TRUE;
+ }
+ CFX_RectF rtWidget;
+ pWidget->GetWidgetRect(rtWidget);
+ rtWidget.left = rtWidget.top = 0;
+ pMatrix->TransformRect(rtWidget);
+ if (!rtWidget.IntersectWith(rtDirty)) {
+ return FALSE;
+ }
+ IFWL_Widget* pChild =
+ FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
+ if (!pChild) {
+ return TRUE;
+ }
+ if (pChild->GetClassID() == 3150298670) {
+ CFX_RectF rtTemp;
+ pChild->GetWidgetRect(rtTemp);
+ if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) {
+ pChild =
+ FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild);
+ if (!pChild) {
+ return TRUE;
+ }
+ }
+ }
+ CFX_RectF rtChilds;
+ rtChilds.Empty();
+ FX_BOOL bChildIntersectWithDirty = FALSE;
+ FX_BOOL bOrginPtIntersectWidthChild = FALSE;
+ FX_BOOL bOrginPtIntersectWidthDirty =
+ rtDirty.Contains(rtWidget.left, rtWidget.top);
+ static FWL_NeedRepaintHitData hitPoint[FWL_NEEDREPAINTHIT_Point];
+ static int32_t iSize = sizeof(FWL_NeedRepaintHitData);
+ FXSYS_memset(hitPoint, 0, iSize);
+ FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece;
+ FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece;
+ hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left;
+ hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x =
+ hitPoint[10].hitPoint.x = fxPiece + rtWidget.left;
+ hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x =
+ hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left;
+ hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x =
+ rtWidget.width + rtWidget.left;
+ hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top;
+ hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y =
+ hitPoint[5].hitPoint.y = fyPiece + rtWidget.top;
+ hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y =
+ hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top;
+ hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y =
+ rtWidget.height + rtWidget.top;
+ do {
+ CFX_RectF rect;
+ pChild->GetWidgetRect(rect);
+ CFX_RectF r = rect;
+ r.left += rtWidget.left;
+ r.top += rtWidget.top;
+ if (r.IsEmpty()) {
+ continue;
+ }
+ if (r.Contains(rtDirty)) {
+ return FALSE;
+ }
+ if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) {
+ bChildIntersectWithDirty = TRUE;
+ }
+ if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
+ bOrginPtIntersectWidthChild = rect.Contains(0, 0);
+ }
+ if (rtChilds.IsEmpty()) {
+ rtChilds = rect;
+ } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) {
+ rtChilds.Union(rect);
+ }
+ for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
+ if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) {
+ continue;
+ }
+ if (!rtDirty.Contains(hitPoint[i].hitPoint)) {
+ hitPoint[i].bNotContainByDirty = TRUE;
+ continue;
+ }
+ if (r.Contains(hitPoint[i].hitPoint)) {
+ hitPoint[i].bNotNeedRepaint = TRUE;
+ }
+ }
+ } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
+ pChild, FWL_WGTRELATION_NextSibling)) != NULL);
+ if (!bChildIntersectWithDirty) {
+ return TRUE;
+ }
+ if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
+ return TRUE;
+ }
+ if (rtChilds.IsEmpty()) {
+ return TRUE;
+ }
+ int32_t repaintPoint = FWL_NEEDREPAINTHIT_Point;
+ for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
+ if (hitPoint[i].bNotNeedRepaint) {
+ repaintPoint--;
+ }
+ }
+ if (repaintPoint > 0) {
+ return TRUE;
+ }
+ pMatrix->TransformRect(rtChilds);
+ if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget* pWidget) {
+ CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
+ if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) {
+ return FALSE;
+ }
+#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
+ if (pItem->bOutsideChanged) {
+ CFX_RectF r;
+ pWidget->GetWidgetRect(r);
+ CFX_RectF temp(m_pWidgetMgr->m_rtScreen);
+ temp.Deflate(50, 50);
+ if (!temp.Contains(r)) {
+ return FALSE;
+ }
+ pItem->bOutsideChanged = FALSE;
+ }
+#endif
+ return pItem->iRedrawCounter == 0;
+}
+static void FWL_WriteBMP(CFX_DIBitmap* pBitmap, const FX_CHAR* filename) {
+ FILE* file = fopen(filename, "wb");
+ if (file == NULL) {
+ return;
+ }
+ int size = 14 + 40 + pBitmap->GetPitch() * pBitmap->GetHeight();
+ unsigned char buffer[40];
+ buffer[0] = 'B';
+ buffer[1] = 'M';
+ buffer[2] = (unsigned char)size;
+ buffer[3] = (unsigned char)(size >> 8);
+ buffer[4] = (unsigned char)(size >> 16);
+ buffer[5] = (unsigned char)(size >> 24);
+ buffer[6] = buffer[7] = buffer[8] = buffer[9] = 0;
+ buffer[10] = 54;
+ buffer[11] = buffer[12] = buffer[13] = 0;
+ fwrite(buffer, 14, 1, file);
+ memset(buffer, 0, 40);
+ buffer[0] = 40;
+ buffer[4] = (unsigned char)pBitmap->GetWidth();
+ buffer[5] = (unsigned char)(pBitmap->GetWidth() >> 8);
+ buffer[6] = (unsigned char)(pBitmap->GetWidth() >> 16);
+ buffer[7] = (unsigned char)(pBitmap->GetWidth() >> 24);
+ buffer[8] = (unsigned char)(-pBitmap->GetHeight());
+ buffer[9] = (unsigned char)((-pBitmap->GetHeight()) >> 8);
+ buffer[10] = (unsigned char)((-pBitmap->GetHeight()) >> 16);
+ buffer[11] = (unsigned char)((-pBitmap->GetHeight()) >> 24);
+ buffer[12] = 1;
+ buffer[14] = pBitmap->GetBPP();
+ fwrite(buffer, 40, 1, file);
+ for (int row = 0; row < pBitmap->GetHeight(); row++) {
+ uint8_t* scan_line = pBitmap->GetBuffer() + row * pBitmap->GetPitch();
+ fwrite(scan_line, pBitmap->GetPitch(), 1, file);
+ }
+ fclose(file);
+}
+FWL_ERR FWL_WidgetMgrSnapshot(IFWL_Widget* pWidget,
+ const CFX_WideString* saveFile,
+ const CFX_Matrix* pMatrix) {
+ CFX_RectF r;
+ pWidget->GetWidgetRect(r);
+ CFX_Graphics gs;
+ gs.Create((int32_t)r.width, (int32_t)r.height, FXDIB_Argb);
+ CFWL_WidgetMgr* widgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr());
+ CFWL_WidgetMgrDelegate* delegate = widgetMgr->GetDelegate();
+ delegate->OnDrawWidget(pWidget, &gs, pMatrix);
+ CFX_DIBitmap* dib = gs.GetRenderDevice()->GetBitmap();
+ FWL_WriteBMP(dib, saveFile->UTF8Encode());
+ return FWL_ERR_Succeeded;
+}
+FX_BOOL FWL_WidgetIsChild(IFWL_Widget* parent, IFWL_Widget* find) {
+ if (!find) {
+ return FALSE;
+ }
+ IFWL_Widget* child =
+ FWL_GetWidgetMgr()->GetWidget(parent, FWL_WGTRELATION_FirstChild);
+ while (child) {
+ if (child == find) {
+ return TRUE;
+ }
+ if (FWL_WidgetIsChild(child, find)) {
+ return TRUE;
+ }
+ child = FWL_GetWidgetMgr()->GetWidget(child, FWL_WGTRELATION_NextSibling);
+ }
+ return FALSE;
+}
« no previous file with comments | « xfa/src/fwl/src/core/fwl_widgetimp.cpp ('k') | xfa/src/fwl/src/core/include/fwl_appimp.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698