1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffnumericedit.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_edit.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_eventvalidate.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_localevalue.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/xfa_utils.h"
17*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFNumericEdit(CXFA_Node * pNode)18*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNumericEdit::CXFA_FFNumericEdit(CXFA_Node* pNode)
19*3ac0a46fSAndroid Build Coastguard Worker : CXFA_FFTextEdit(pNode) {}
20*3ac0a46fSAndroid Build Coastguard Worker
21*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFNumericEdit::~CXFA_FFNumericEdit() = default;
22*3ac0a46fSAndroid Build Coastguard Worker
LoadWidget()23*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFNumericEdit::LoadWidget() {
24*3ac0a46fSAndroid Build Coastguard Worker DCHECK(!IsLoaded());
25*3ac0a46fSAndroid Build Coastguard Worker
26*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit* pWidget = cppgc::MakeGarbageCollected<CFWL_Edit>(
27*3ac0a46fSAndroid Build Coastguard Worker GetFWLApp()->GetHeap()->GetAllocationHandle(), GetFWLApp(),
28*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget::Properties(), nullptr);
29*3ac0a46fSAndroid Build Coastguard Worker SetNormalWidget(pWidget);
30*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetAdapterIface(this);
31*3ac0a46fSAndroid Build Coastguard Worker
32*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver* pNoteDriver = pWidget->GetFWLApp()->GetNoteDriver();
33*3ac0a46fSAndroid Build Coastguard Worker pNoteDriver->RegisterEventTarget(pWidget, pWidget);
34*3ac0a46fSAndroid Build Coastguard Worker m_pOldDelegate = pWidget->GetDelegate();
35*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetDelegate(this);
36*3ac0a46fSAndroid Build Coastguard Worker
37*3ac0a46fSAndroid Build Coastguard Worker {
38*3ac0a46fSAndroid Build Coastguard Worker CFWL_Widget::ScopedUpdateLock update_lock(pWidget);
39*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetText(m_pNode->GetValue(XFA_ValuePicture::kDisplay));
40*3ac0a46fSAndroid Build Coastguard Worker UpdateWidgetProperty();
41*3ac0a46fSAndroid Build Coastguard Worker }
42*3ac0a46fSAndroid Build Coastguard Worker
43*3ac0a46fSAndroid Build Coastguard Worker return CXFA_FFField::LoadWidget();
44*3ac0a46fSAndroid Build Coastguard Worker }
45*3ac0a46fSAndroid Build Coastguard Worker
UpdateWidgetProperty()46*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNumericEdit::UpdateWidgetProperty() {
47*3ac0a46fSAndroid Build Coastguard Worker CFWL_Edit* pWidget = static_cast<CFWL_Edit*>(GetNormalWidget());
48*3ac0a46fSAndroid Build Coastguard Worker if (!pWidget)
49*3ac0a46fSAndroid Build Coastguard Worker return;
50*3ac0a46fSAndroid Build Coastguard Worker
51*3ac0a46fSAndroid Build Coastguard Worker uint32_t dwExtendedStyle =
52*3ac0a46fSAndroid Build Coastguard Worker FWL_STYLEEXT_EDT_ShowScrollbarFocus | FWL_STYLEEXT_EDT_OuterScrollbar |
53*3ac0a46fSAndroid Build Coastguard Worker FWL_STYLEEXT_EDT_Validate | FWL_STYLEEXT_EDT_Number;
54*3ac0a46fSAndroid Build Coastguard Worker dwExtendedStyle |= UpdateUIProperty();
55*3ac0a46fSAndroid Build Coastguard Worker if (!m_pNode->IsHorizontalScrollPolicyOff())
56*3ac0a46fSAndroid Build Coastguard Worker dwExtendedStyle |= FWL_STYLEEXT_EDT_AutoHScroll;
57*3ac0a46fSAndroid Build Coastguard Worker
58*3ac0a46fSAndroid Build Coastguard Worker absl::optional<int32_t> numCells = m_pNode->GetNumberOfCells();
59*3ac0a46fSAndroid Build Coastguard Worker if (numCells.has_value() && numCells.value() > 0) {
60*3ac0a46fSAndroid Build Coastguard Worker dwExtendedStyle |= FWL_STYLEEXT_EDT_CombText;
61*3ac0a46fSAndroid Build Coastguard Worker pWidget->SetLimit(numCells.value());
62*3ac0a46fSAndroid Build Coastguard Worker }
63*3ac0a46fSAndroid Build Coastguard Worker dwExtendedStyle |= GetAlignment();
64*3ac0a46fSAndroid Build Coastguard Worker if (!m_pNode->IsOpenAccess() || !GetDoc()->GetXFADoc()->IsInteractive())
65*3ac0a46fSAndroid Build Coastguard Worker dwExtendedStyle |= FWL_STYLEEXT_EDT_ReadOnly;
66*3ac0a46fSAndroid Build Coastguard Worker
67*3ac0a46fSAndroid Build Coastguard Worker GetNormalWidget()->ModifyStyleExts(dwExtendedStyle, 0xFFFFFFFF);
68*3ac0a46fSAndroid Build Coastguard Worker }
69*3ac0a46fSAndroid Build Coastguard Worker
OnProcessEvent(CFWL_Event * pEvent)70*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFNumericEdit::OnProcessEvent(CFWL_Event* pEvent) {
71*3ac0a46fSAndroid Build Coastguard Worker if (pEvent->GetType() == CFWL_Event::Type::Validate) {
72*3ac0a46fSAndroid Build Coastguard Worker CFWL_EventValidate* event = static_cast<CFWL_EventValidate*>(pEvent);
73*3ac0a46fSAndroid Build Coastguard Worker event->SetValidate(OnValidate(GetNormalWidget(), event->GetInsert()));
74*3ac0a46fSAndroid Build Coastguard Worker return;
75*3ac0a46fSAndroid Build Coastguard Worker }
76*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFTextEdit::OnProcessEvent(pEvent);
77*3ac0a46fSAndroid Build Coastguard Worker }
78*3ac0a46fSAndroid Build Coastguard Worker
OnValidate(CFWL_Widget * pWidget,const WideString & wsText)79*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFNumericEdit::OnValidate(CFWL_Widget* pWidget,
80*3ac0a46fSAndroid Build Coastguard Worker const WideString& wsText) {
81*3ac0a46fSAndroid Build Coastguard Worker WideString wsPattern = m_pNode->GetPictureContent(XFA_ValuePicture::kEdit);
82*3ac0a46fSAndroid Build Coastguard Worker if (!wsPattern.IsEmpty())
83*3ac0a46fSAndroid Build Coastguard Worker return true;
84*3ac0a46fSAndroid Build Coastguard Worker
85*3ac0a46fSAndroid Build Coastguard Worker WideString wsFormat;
86*3ac0a46fSAndroid Build Coastguard Worker CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(m_pNode.Get());
87*3ac0a46fSAndroid Build Coastguard Worker widgetValue.GetNumericFormat(wsFormat, m_pNode->GetLeadDigits(),
88*3ac0a46fSAndroid Build Coastguard Worker m_pNode->GetFracDigits());
89*3ac0a46fSAndroid Build Coastguard Worker return widgetValue.ValidateNumericTemp(wsText, wsFormat,
90*3ac0a46fSAndroid Build Coastguard Worker m_pNode->GetLocale());
91*3ac0a46fSAndroid Build Coastguard Worker }
92