Add CFWL_Widget::ScopedUpdateLock. Scoper to help call CFWL_Widget::LockUpdate() and UnlockUpdate(). With all calls going through ScopedUpdateLock, LockUpdate() and UnlockUpdate() can become private. Change-Id: I1477471d82384608691e8ae7727787870da0c2ad Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/62493 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fwl/cfwl_combobox.cpp b/xfa/fwl/cfwl_combobox.cpp index 7c77fc5..9c5edf4 100644 --- a/xfa/fwl/cfwl_combobox.cpp +++ b/xfa/fwl/cfwl_combobox.cpp
@@ -30,14 +30,12 @@ #include "xfa/fwl/ifwl_themeprovider.h" CFWL_ComboBox::CFWL_ComboBox(const CFWL_App* app) - : CFWL_Widget(app, pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr), - m_iCurSel(-1), - m_iBtnState(CFWL_PartState_Normal) { + : CFWL_Widget(app, pdfium::MakeUnique<CFWL_WidgetProperties>(), nullptr) { InitComboList(); InitComboEdit(); } -CFWL_ComboBox::~CFWL_ComboBox() {} +CFWL_ComboBox::~CFWL_ComboBox() = default; FWL_Type CFWL_ComboBox::GetClassID() const { return FWL_Type::ComboBox; @@ -309,9 +307,8 @@ if (m_iCurSel >= 0) { CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel); - m_pEdit->LockUpdate(); + ScopedUpdateLock update_lock(m_pEdit.get()); m_pEdit->SetText(hItem ? hItem->GetText() : WideString()); - m_pEdit->UnlockUpdate(); } m_pEdit->Update(); }
diff --git a/xfa/fwl/cfwl_combobox.h b/xfa/fwl/cfwl_combobox.h index ce3414b..39c952c 100644 --- a/xfa/fwl/cfwl_combobox.h +++ b/xfa/fwl/cfwl_combobox.h
@@ -123,8 +123,8 @@ CFX_RectF m_rtBtn; std::unique_ptr<CFWL_ComboEdit> m_pEdit; std::unique_ptr<CFWL_ComboList> m_pListBox; - int32_t m_iCurSel; - int32_t m_iBtnState; + int32_t m_iCurSel = -1; + int32_t m_iBtnState = CFWL_PartState_Normal; }; #endif // XFA_FWL_CFWL_COMBOBOX_H_
diff --git a/xfa/fwl/cfwl_edit.cpp b/xfa/fwl/cfwl_edit.cpp index 8b70f4d..2fc74c7 100644 --- a/xfa/fwl/cfwl_edit.cpp +++ b/xfa/fwl/cfwl_edit.cpp
@@ -665,24 +665,26 @@ if (bShowHorz) { CFX_RectF rtScroll = m_pHorzScrollBar->GetWidgetRect(); if (rtScroll.width < contents_bounds.width) { - m_pHorzScrollBar->LockUpdate(); - float fRange = contents_bounds.width - rtScroll.width; - m_pHorzScrollBar->SetRange(0.0f, fRange); + { + ScopedUpdateLock update_lock(m_pHorzScrollBar.get()); + float fRange = contents_bounds.width - rtScroll.width; + m_pHorzScrollBar->SetRange(0.0f, fRange); - float fPos = pdfium::clamp(m_fScrollOffsetX, 0.0f, fRange); - m_pHorzScrollBar->SetPos(fPos); - m_pHorzScrollBar->SetTrackPos(fPos); - m_pHorzScrollBar->SetPageSize(rtScroll.width); - m_pHorzScrollBar->SetStepSize(rtScroll.width / 10); - m_pHorzScrollBar->RemoveStates(FWL_WGTSTATE_Disabled); - m_pHorzScrollBar->UnlockUpdate(); + float fPos = pdfium::clamp(m_fScrollOffsetX, 0.0f, fRange); + m_pHorzScrollBar->SetPos(fPos); + m_pHorzScrollBar->SetTrackPos(fPos); + m_pHorzScrollBar->SetPageSize(rtScroll.width); + m_pHorzScrollBar->SetStepSize(rtScroll.width / 10); + m_pHorzScrollBar->RemoveStates(FWL_WGTSTATE_Disabled); + } m_pHorzScrollBar->Update(); pRepaint = m_pHorzScrollBar.get(); } else if ((m_pHorzScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) { - m_pHorzScrollBar->LockUpdate(); - m_pHorzScrollBar->SetRange(0, -1); - m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled); - m_pHorzScrollBar->UnlockUpdate(); + { + ScopedUpdateLock update_lock(m_pHorzScrollBar.get()); + m_pHorzScrollBar->SetRange(0, -1); + m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Disabled); + } m_pHorzScrollBar->Update(); pRepaint = m_pHorzScrollBar.get(); } @@ -691,26 +693,28 @@ if (bShowVert) { CFX_RectF rtScroll = m_pVertScrollBar->GetWidgetRect(); if (rtScroll.height < contents_bounds.height) { - m_pVertScrollBar->LockUpdate(); - float fStep = m_EdtEngine.GetLineSpace(); - float fRange = - std::max(contents_bounds.height - m_rtEngine.height, fStep); + { + ScopedUpdateLock update_lock(m_pHorzScrollBar.get()); + float fStep = m_EdtEngine.GetLineSpace(); + float fRange = + std::max(contents_bounds.height - m_rtEngine.height, fStep); - m_pVertScrollBar->SetRange(0.0f, fRange); - float fPos = pdfium::clamp(m_fScrollOffsetY, 0.0f, fRange); - m_pVertScrollBar->SetPos(fPos); - m_pVertScrollBar->SetTrackPos(fPos); - m_pVertScrollBar->SetPageSize(rtScroll.height); - m_pVertScrollBar->SetStepSize(fStep); - m_pVertScrollBar->RemoveStates(FWL_WGTSTATE_Disabled); - m_pVertScrollBar->UnlockUpdate(); + m_pVertScrollBar->SetRange(0.0f, fRange); + float fPos = pdfium::clamp(m_fScrollOffsetY, 0.0f, fRange); + m_pVertScrollBar->SetPos(fPos); + m_pVertScrollBar->SetTrackPos(fPos); + m_pVertScrollBar->SetPageSize(rtScroll.height); + m_pVertScrollBar->SetStepSize(fStep); + m_pVertScrollBar->RemoveStates(FWL_WGTSTATE_Disabled); + } m_pVertScrollBar->Update(); pRepaint = m_pVertScrollBar.get(); } else if ((m_pVertScrollBar->GetStates() & FWL_WGTSTATE_Disabled) == 0) { - m_pVertScrollBar->LockUpdate(); - m_pVertScrollBar->SetRange(0, -1); - m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled); - m_pVertScrollBar->UnlockUpdate(); + { + ScopedUpdateLock update_lock(m_pHorzScrollBar.get()); + m_pVertScrollBar->SetRange(0, -1); + m_pVertScrollBar->SetStates(FWL_WGTSTATE_Disabled); + } m_pVertScrollBar->Update(); pRepaint = m_pVertScrollBar.get(); }
diff --git a/xfa/fwl/cfwl_widget.cpp b/xfa/fwl/cfwl_widget.cpp index 0c3dee3..a252cd2 100644 --- a/xfa/fwl/cfwl_widget.cpp +++ b/xfa/fwl/cfwl_widget.cpp
@@ -390,3 +390,12 @@ void CFWL_Widget::OnDrawWidget(CXFA_Graphics* pGraphics, const CFX_Matrix& matrix) {} + +CFWL_Widget::ScopedUpdateLock::ScopedUpdateLock(CFWL_Widget* widget) + : widget_(widget) { + widget_->LockUpdate(); +} + +CFWL_Widget::ScopedUpdateLock::~ScopedUpdateLock() { + widget_->UnlockUpdate(); +}
diff --git a/xfa/fwl/cfwl_widget.h b/xfa/fwl/cfwl_widget.h index c36cd8f..cc6ee3b 100644 --- a/xfa/fwl/cfwl_widget.h +++ b/xfa/fwl/cfwl_widget.h
@@ -59,6 +59,15 @@ virtual void GetBorderColorAndThickness(FX_ARGB* cr, float* fWidth) = 0; }; + class ScopedUpdateLock { + public: + explicit ScopedUpdateLock(CFWL_Widget* widget); + ~ScopedUpdateLock(); + + private: + UnownedPtr<CFWL_Widget> const widget_; + }; + ~CFWL_Widget() override; virtual FWL_Type GetClassID() const = 0; @@ -100,12 +109,6 @@ uint32_t GetStylesEx() const; uint32_t GetStates() const; - void LockUpdate() { m_iLock++; } - void UnlockUpdate() { - if (IsLocked()) - m_iLock--; - } - CFX_PointF TransformTo(CFWL_Widget* pWidget, const CFX_PointF& point); CFX_Matrix GetMatrix() const; IFWL_ThemeProvider* GetThemeProvider() const { @@ -166,6 +169,12 @@ int32_t m_iLock = 0; private: + void LockUpdate() { m_iLock++; } + void UnlockUpdate() { + if (IsLocked()) + m_iLock--; + } + CFWL_Widget* GetParent() const { return m_pWidgetMgr->GetParentWidget(this); } CFX_SizeF GetOffsetFromParent(CFWL_Widget* pParent); void DrawBackground(CXFA_Graphics* pGraphics,
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp index 7663ee0..69646c2 100644 --- a/xfa/fxfa/cxfa_ffbarcode.cpp +++ b/xfa/fxfa/cxfa_ffbarcode.cpp
@@ -149,11 +149,13 @@ pNoteDriver->RegisterEventTarget(pFWLBarcode, pFWLBarcode); m_pOldDelegate = pFWLBarcode->GetDelegate(); pFWLBarcode->SetDelegate(this); - pFWLBarcode->LockUpdate(); - pFWLBarcode->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); - UpdateWidgetProperty(); - pFWLBarcode->UnlockUpdate(); + { + CFWL_Widget::ScopedUpdateLock update_lock(pFWLBarcode); + pFWLBarcode->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); + UpdateWidgetProperty(); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffcheckbutton.cpp b/xfa/fxfa/cxfa_ffcheckbutton.cpp index 9d1467d..2245177 100644 --- a/xfa/fxfa/cxfa_ffcheckbutton.cpp +++ b/xfa/fxfa/cxfa_ffcheckbutton.cpp
@@ -44,10 +44,12 @@ if (m_pNode->IsRadioButton()) pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF); - pCheckBox->LockUpdate(); - UpdateWidgetProperty(); - SetFWLCheckState(m_pNode->GetCheckState()); - pCheckBox->UnlockUpdate(); + { + CFWL_Widget::ScopedUpdateLock update_lock(pCheckBox); + UpdateWidgetProperty(); + SetFWLCheckState(m_pNode->GetCheckState()); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffcombobox.cpp b/xfa/fxfa/cxfa_ffcombobox.cpp index 38203b1..0336d28 100644 --- a/xfa/fxfa/cxfa_ffcombobox.cpp +++ b/xfa/fxfa/cxfa_ffcombobox.cpp
@@ -55,19 +55,21 @@ pNoteDriver->RegisterEventTarget(pComboBox, pComboBox); m_pOldDelegate = pComboBox->GetDelegate(); pComboBox->SetDelegate(this); - pComboBox->LockUpdate(); - for (const auto& label : m_pNode->GetChoiceListItems(false)) - pComboBox->AddString(label); + { + CFWL_Widget::ScopedUpdateLock update_lock(pComboBox); + for (const auto& label : m_pNode->GetChoiceListItems(false)) + pComboBox->AddString(label); - std::vector<int32_t> iSelArray = m_pNode->GetSelectedItems(); - if (iSelArray.empty()) - pComboBox->SetEditText(m_pNode->GetValue(XFA_VALUEPICTURE_Raw)); - else - pComboBox->SetCurSel(iSelArray.front()); + std::vector<int32_t> iSelArray = m_pNode->GetSelectedItems(); + if (iSelArray.empty()) + pComboBox->SetEditText(m_pNode->GetValue(XFA_VALUEPICTURE_Raw)); + else + pComboBox->SetCurSel(iSelArray.front()); - UpdateWidgetProperty(); - pComboBox->UnlockUpdate(); + UpdateWidgetProperty(); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp index 45f9b9f..ba05835 100644 --- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp +++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -51,28 +51,31 @@ pNoteDriver->RegisterEventTarget(pWidget, pWidget); m_pOldDelegate = pWidget->GetDelegate(); pWidget->SetDelegate(this); - pWidget->LockUpdate(); - WideString wsText = m_pNode->GetValue(XFA_VALUEPICTURE_Display); - pWidget->SetEditText(wsText); + { + CFWL_Widget::ScopedUpdateLock update_lock(pWidget); + WideString wsText = m_pNode->GetValue(XFA_VALUEPICTURE_Display); + pWidget->SetEditText(wsText); - CXFA_Value* value = m_pNode->GetFormValueIfExists(); - if (value) { - switch (value->GetChildValueClassID()) { - case XFA_Element::Date: { - if (!wsText.IsEmpty()) { - CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pNode.Get()); - CFX_DateTime date = lcValue.GetDate(); - if (date.IsSet()) - pWidget->SetCurSel(date.GetYear(), date.GetMonth(), date.GetDay()); - } - } break; - default: - break; + CXFA_Value* value = m_pNode->GetFormValueIfExists(); + if (value) { + switch (value->GetChildValueClassID()) { + case XFA_Element::Date: { + if (!wsText.IsEmpty()) { + CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pNode.Get()); + CFX_DateTime date = lcValue.GetDate(); + if (date.IsSet()) + pWidget->SetCurSel(date.GetYear(), date.GetMonth(), + date.GetDay()); + } + } break; + default: + break; + } } + UpdateWidgetProperty(); } - UpdateWidgetProperty(); - pWidget->UnlockUpdate(); + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_fflistbox.cpp b/xfa/fxfa/cxfa_fflistbox.cpp index a3e288e..38e6b1a 100644 --- a/xfa/fxfa/cxfa_fflistbox.cpp +++ b/xfa/fxfa/cxfa_fflistbox.cpp
@@ -51,21 +51,22 @@ pNoteDriver->RegisterEventTarget(pListBox, pListBox); m_pOldDelegate = pListBox->GetDelegate(); pListBox->SetDelegate(this); - pListBox->LockUpdate(); - for (const auto& label : m_pNode->GetChoiceListItems(false)) - pListBox->AddString(label); + { + CFWL_Widget::ScopedUpdateLock update_lock(pListBox); + for (const auto& label : m_pNode->GetChoiceListItems(false)) + pListBox->AddString(label); - uint32_t dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus; - if (m_pNode->IsChoiceListMultiSelect()) - dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection; + uint32_t dwExtendedStyle = FWL_STYLEEXT_LTB_ShowScrollBarFocus; + if (m_pNode->IsChoiceListMultiSelect()) + dwExtendedStyle |= FWL_STYLEEXT_LTB_MultiSelection; - dwExtendedStyle |= GetAlignment(); - pListBox->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); - for (int32_t selected : m_pNode->GetSelectedItems()) - pListBox->SetSelItem(pListBox->GetItem(nullptr, selected), true); + dwExtendedStyle |= GetAlignment(); + pListBox->ModifyStylesEx(dwExtendedStyle, 0xFFFFFFFF); + for (int32_t selected : m_pNode->GetSelectedItems()) + pListBox->SetSelItem(pListBox->GetItem(nullptr, selected), true); + } - pListBox->UnlockUpdate(); return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffnumericedit.cpp b/xfa/fxfa/cxfa_ffnumericedit.cpp index 7765e3f..86431fd 100644 --- a/xfa/fxfa/cxfa_ffnumericedit.cpp +++ b/xfa/fxfa/cxfa_ffnumericedit.cpp
@@ -34,11 +34,13 @@ pNoteDriver->RegisterEventTarget(pWidget, pWidget); m_pOldDelegate = pWidget->GetDelegate(); pWidget->SetDelegate(this); - pWidget->LockUpdate(); - pWidget->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); - UpdateWidgetProperty(); - pWidget->UnlockUpdate(); + { + CFWL_Widget::ScopedUpdateLock update_lock(pWidget); + pWidget->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); + UpdateWidgetProperty(); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffpasswordedit.cpp b/xfa/fxfa/cxfa_ffpasswordedit.cpp index 1724e7a..b70d1d3 100644 --- a/xfa/fxfa/cxfa_ffpasswordedit.cpp +++ b/xfa/fxfa/cxfa_ffpasswordedit.cpp
@@ -33,11 +33,13 @@ pNoteDriver->RegisterEventTarget(pWidget, pWidget); m_pOldDelegate = pWidget->GetDelegate(); pWidget->SetDelegate(this); - pWidget->LockUpdate(); - pWidget->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); - UpdateWidgetProperty(); - pWidget->UnlockUpdate(); + { + CFWL_Widget::ScopedUpdateLock update_lock(pWidget); + pWidget->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); + UpdateWidgetProperty(); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_ffpushbutton.cpp b/xfa/fxfa/cxfa_ffpushbutton.cpp index 6d8ed7e..daf1aaa 100644 --- a/xfa/fxfa/cxfa_ffpushbutton.cpp +++ b/xfa/fxfa/cxfa_ffpushbutton.cpp
@@ -60,10 +60,13 @@ CFWL_NoteDriver* pNoteDriver = pPushButton->GetOwnerApp()->GetNoteDriver(); pNoteDriver->RegisterEventTarget(pPushButton, pPushButton); - pPushButton->LockUpdate(); - UpdateWidgetProperty(); - LoadHighlightCaption(); - pPushButton->UnlockUpdate(); + + { + CFWL_Widget::ScopedUpdateLock update_lock(pPushButton); + UpdateWidgetProperty(); + LoadHighlightCaption(); + } + return CXFA_FFField::LoadWidget(); }
diff --git a/xfa/fxfa/cxfa_fftextedit.cpp b/xfa/fxfa/cxfa_fftextedit.cpp index d34e943..f5282ba 100644 --- a/xfa/fxfa/cxfa_fftextedit.cpp +++ b/xfa/fxfa/cxfa_fftextedit.cpp
@@ -53,11 +53,13 @@ pNoteDriver->RegisterEventTarget(pFWLEdit, pFWLEdit); m_pOldDelegate = pFWLEdit->GetDelegate(); pFWLEdit->SetDelegate(this); - pFWLEdit->LockUpdate(); - UpdateWidgetProperty(); - pFWLEdit->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); - pFWLEdit->UnlockUpdate(); + { + CFWL_Widget::ScopedUpdateLock update_lock(pFWLEdit); + UpdateWidgetProperty(); + pFWLEdit->SetText(m_pNode->GetValue(XFA_VALUEPICTURE_Display)); + } + return CXFA_FFField::LoadWidget(); }