FX_BOOL CFWL_NoteDriver::SetFocus(IFWL_Widget* pFocus, FX_BOOL bNotify) { if (m_pFocus == pFocus) { return TRUE; } IFWL_Widget* pPrev = m_pFocus; m_pFocus = pFocus; if (pPrev) { CFWL_MsgKillFocus ms; ms.m_pDstTarget = pPrev; ms.m_pSrcTarget = pPrev; if (bNotify) { ms.m_dwExtend = 1; } IFWL_WidgetDelegate* pDelegate = pPrev->SetDelegate(NULL); if (pDelegate) { pDelegate->OnProcessMessage(&ms); } } if (pFocus) { IFWL_Widget* pWidget = FWL_GetWidgetMgr()->GetWidget(pFocus, FWL_WGTRELATION_SystemForm); CFWL_FormImp* pForm = pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr; if (pForm) { CFWL_WidgetImp* pNewFocus = static_cast<CFWL_WidgetImp*>(pFocus->GetImpl()); pForm->SetSubFocus(pNewFocus); } CFWL_MsgSetFocus ms; ms.m_pDstTarget = pFocus; if (bNotify) { ms.m_dwExtend = 1; } IFWL_WidgetDelegate* pDelegate = pFocus->SetDelegate(NULL); if (pDelegate) { pDelegate->OnProcessMessage(&ms); } } return TRUE; }
FX_BOOL CFWL_NoteDriver::DoSetFocus(CFWL_MsgSetFocus* pMsg, IFWL_Widget* pMessageForm) { CFWL_WidgetMgr* pWidgetMgr = static_cast<CFWL_WidgetMgr*>(FWL_GetWidgetMgr()); if (pWidgetMgr->IsFormDisabled()) { m_pFocus = pMsg->m_pDstTarget; return TRUE; } else { IFWL_Widget* pWidget = pMsg->m_pDstTarget; CFWL_FormImp* pForm = pWidget ? static_cast<CFWL_FormImp*>(pWidget->GetImpl()) : nullptr; if (pForm) { CFWL_WidgetImp* pSubFocus = pForm->GetSubFocus(); if (pSubFocus && ((pSubFocus->GetStates() & FWL_WGTSTATE_Focused) == 0)) { pMsg->m_pDstTarget = pSubFocus->GetInterface(); if (m_pFocus != pMsg->m_pDstTarget) { m_pFocus = pMsg->m_pDstTarget; return TRUE; } } } } return FALSE; }