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; |
+} |