Index: xfa/fwl/core/cfwl_edit.cpp |
diff --git a/xfa/fwl/core/cfwl_edit.cpp b/xfa/fwl/core/cfwl_edit.cpp |
index 751bf4336a8e7fcd4911bc774d2025ac510993fb..0844da3713ad116d4299af8800f435413ba013f7 100644 |
--- a/xfa/fwl/core/cfwl_edit.cpp |
+++ b/xfa/fwl/core/cfwl_edit.cpp |
@@ -81,7 +81,7 @@ CFWL_Edit::CFWL_Edit(const CFWL_App* app, |
CFWL_Edit::~CFWL_Edit() { |
if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) |
- ShowCaret(false); |
+ HideCaret(nullptr); |
ClearRecord(); |
} |
@@ -125,7 +125,7 @@ void CFWL_Edit::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) { |
void CFWL_Edit::SetStates(uint32_t dwStates, bool bSet) { |
if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Invisible) || |
(m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) { |
- ShowCaret(false); |
+ HideCaret(nullptr); |
} |
CFWL_Widget::SetStates(dwStates, bSet); |
} |
@@ -890,9 +890,10 @@ void CFWL_Edit::UpdateCaret() { |
rtCaret.width = right - rtCaret.left; |
} |
- bool bShow = |
- m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && !rtCaret.IsEmpty(); |
- ShowCaret(bShow, &rtCaret); |
+ if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && !rtCaret.IsEmpty()) |
+ ShowCaret(&rtCaret); |
+ else |
+ HideCaret(&rtCaret); |
} |
CFWL_ScrollBar* CFWL_Edit::UpdateScroll() { |
@@ -1166,55 +1167,65 @@ void CFWL_Edit::InitScrollBar(bool bVert) { |
m_pHorzScrollBar.reset(sb); |
} |
-bool FWL_ShowCaret(CFWL_Widget* pWidget, |
- bool bVisible, |
- const CFX_RectF* pRtAnchor) { |
+void CFWL_Edit::ShowCaret(CFX_RectF* pRect) { |
+ if (m_pCaret) { |
+ m_pCaret->ShowCaret(); |
+ if (!pRect->IsEmpty()) |
+ m_pCaret->SetWidgetRect(*pRect); |
+ Repaint(&m_rtEngine); |
+ return; |
+ } |
+ |
+ CFWL_Widget* pOuter = this; |
+ pRect->Offset(m_pProperties->m_rtWidget.left, m_pProperties->m_rtWidget.top); |
+ while (pOuter->GetOuter()) { |
+ pOuter = pOuter->GetOuter(); |
+ |
+ CFX_RectF rtOuter; |
+ pOuter->GetWidgetRect(rtOuter); |
+ pRect->Offset(rtOuter.left, rtOuter.top); |
+ } |
+ |
CXFA_FFWidget* pXFAWidget = |
- static_cast<CXFA_FFWidget*>(pWidget->GetLayoutItem()); |
+ static_cast<CXFA_FFWidget*>(pOuter->GetLayoutItem()); |
if (!pXFAWidget) |
- return false; |
+ return; |
IXFA_DocEnvironment* pDocEnvironment = |
pXFAWidget->GetDoc()->GetDocEnvironment(); |
if (!pDocEnvironment) |
- return false; |
+ return; |
- if (bVisible) { |
- CFX_Matrix mt; |
- pXFAWidget->GetRotateMatrix(mt); |
- CFX_RectF rt(*pRtAnchor); |
- mt.TransformRect(rt); |
- pDocEnvironment->DisplayCaret(pXFAWidget, bVisible, &rt); |
- return true; |
- } |
+ CFX_Matrix mt; |
+ pXFAWidget->GetRotateMatrix(mt); |
- pDocEnvironment->DisplayCaret(pXFAWidget, bVisible, pRtAnchor); |
- return true; |
+ CFX_RectF rt(*pRect); |
+ mt.TransformRect(rt); |
+ pDocEnvironment->DisplayCaret(pXFAWidget, true, &rt); |
} |
-void CFWL_Edit::ShowCaret(bool bVisible, CFX_RectF* pRect) { |
+void CFWL_Edit::HideCaret(CFX_RectF* pRect) { |
if (m_pCaret) { |
- m_pCaret->ShowCaret(bVisible); |
- if (bVisible && !pRect->IsEmpty()) |
- m_pCaret->SetWidgetRect(*pRect); |
+ m_pCaret->HideCaret(); |
Repaint(&m_rtEngine); |
return; |
} |
CFWL_Widget* pOuter = this; |
- if (bVisible) { |
- pRect->Offset(m_pProperties->m_rtWidget.left, |
- m_pProperties->m_rtWidget.top); |
- } |
- while (pOuter->GetOuter()) { |
+ while (pOuter->GetOuter()) |
pOuter = pOuter->GetOuter(); |
- if (bVisible) { |
- CFX_RectF rtOuter; |
- pOuter->GetWidgetRect(rtOuter); |
- pRect->Offset(rtOuter.left, rtOuter.top); |
- } |
- } |
- FWL_ShowCaret(pOuter, bVisible, pRect); |
+ |
+ CXFA_FFWidget* pXFAWidget = |
+ static_cast<CXFA_FFWidget*>(pOuter->GetLayoutItem()); |
+ if (!pXFAWidget) |
+ return; |
+ |
+ IXFA_DocEnvironment* pDocEnvironment = |
+ pXFAWidget->GetDoc()->GetDocEnvironment(); |
+ if (!pDocEnvironment) |
+ return; |
+ |
+ pDocEnvironment->DisplayCaret(pXFAWidget, false, pRect); |
} |
bool CFWL_Edit::ValidateNumberChar(FX_WCHAR cNum) { |
@@ -1250,8 +1261,8 @@ bool CFWL_Edit::ValidateNumberChar(FX_WCHAR cNum) { |
void CFWL_Edit::InitCaret() { |
if (!m_pCaret) { |
if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_InnerCaret)) { |
- m_pCaret.reset(new CFWL_Caret( |
- m_pOwnerApp, pdfium::MakeUnique<CFWL_WidgetProperties>(), this)); |
+ m_pCaret = pdfium::MakeUnique<CFWL_Caret>( |
+ m_pOwnerApp, pdfium::MakeUnique<CFWL_WidgetProperties>(), this); |
m_pCaret->SetParent(this); |
m_pCaret->SetStates(m_pProperties->m_dwStates); |
} |
@@ -1371,7 +1382,7 @@ void CFWL_Edit::OnFocusChanged(CFWL_Message* pMsg, bool bSet) { |
UpdateCaret(); |
} else if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) { |
m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused; |
- ShowCaret(false); |
+ HideCaret(nullptr); |
if ((dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) { |
int32_t nSel = CountSelRanges(); |
if (nSel > 0) { |