blob: 6fe24fee2927a79ca07e1fac573fa500131b66af [file] [log] [blame]
Dan Sinclair1770c022016-03-14 14:14:16 -04001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclair80c48782017-03-23 12:11:20 -04007#include "xfa/fxfa/cxfa_ffwidgethandler.h"
Dan Sinclair1770c022016-03-14 14:14:16 -04008
9#include <vector>
10
11#include "xfa/fxfa/app/xfa_ffchoicelist.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040012#include "xfa/fxfa/app/xfa_fffield.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040013#include "xfa/fxfa/app/xfa_fwladapter.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040014#include "xfa/fxfa/cxfa_ffdoc.h"
15#include "xfa/fxfa/cxfa_ffdocview.h"
16#include "xfa/fxfa/cxfa_ffwidget.h"
dsinclair0b851ff2016-07-21 12:03:01 -070017#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
dsinclair9eb0db12016-07-21 12:01:39 -070018#include "xfa/fxfa/parser/cxfa_measurement.h"
Dan Sinclairefcae5d2017-03-29 14:47:46 -040019#include "xfa/fxfa/parser/cxfa_node.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040020
21CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView)
22 : m_pDocView(pDocView) {}
dsinclairdf4bc592016-03-31 20:34:43 -070023
Dan Sinclair1770c022016-03-14 14:14:16 -040024CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() {}
dsinclairdf4bc592016-03-31 20:34:43 -070025
tsepezd19e9122016-11-02 15:43:18 -070026bool CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040027 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070028 bool bRet = hWidget->OnMouseEnter();
Dan Sinclair1770c022016-03-14 14:14:16 -040029 m_pDocView->UnlockUpdate();
30 m_pDocView->UpdateDocView();
31 return bRet;
32}
dsinclair221caf62016-04-04 12:08:40 -070033
tsepezd19e9122016-11-02 15:43:18 -070034bool CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040035 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070036 bool bRet = hWidget->OnMouseExit();
Dan Sinclair1770c022016-03-14 14:14:16 -040037 m_pDocView->UnlockUpdate();
38 m_pDocView->UpdateDocView();
39 return bRet;
40}
dsinclair221caf62016-04-04 12:08:40 -070041
tsepezd19e9122016-11-02 15:43:18 -070042bool CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget,
43 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050044 const CFX_PointF& point) {
Dan Sinclair1770c022016-03-14 14:14:16 -040045 m_pDocView->LockUpdate();
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050046 bool bRet = hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040047 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -070048 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
49 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040050 }
51 m_pDocView->UnlockUpdate();
52 m_pDocView->UpdateDocView();
53 return bRet;
54}
dsinclair221caf62016-04-04 12:08:40 -070055
tsepezd19e9122016-11-02 15:43:18 -070056bool CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
57 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050058 const CFX_PointF& point) {
Dan Sinclair1770c022016-03-14 14:14:16 -040059 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070060 m_pDocView->m_bLayoutEvent = true;
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050061 bool bRet = hWidget->OnLButtonUp(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040062 m_pDocView->UnlockUpdate();
63 m_pDocView->UpdateDocView();
64 return bRet;
65}
dsinclair221caf62016-04-04 12:08:40 -070066
tsepezd19e9122016-11-02 15:43:18 -070067bool CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070068 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050069 const CFX_PointF& point) {
70 bool bRet = hWidget->OnLButtonDblClk(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040071 m_pDocView->RunInvalidate();
72 return bRet;
73}
dsinclair221caf62016-04-04 12:08:40 -070074
tsepezd19e9122016-11-02 15:43:18 -070075bool CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
76 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050077 const CFX_PointF& point) {
78 bool bRet = hWidget->OnMouseMove(dwFlags, hWidget->Rotate2Normal(point));
tsepezd19e9122016-11-02 15:43:18 -070079 m_pDocView->RunInvalidate();
80 return bRet;
81}
82
83bool CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
84 uint32_t dwFlags,
85 int16_t zDelta,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050086 const CFX_PointF& point) {
87 bool bRet =
88 hWidget->OnMouseWheel(dwFlags, zDelta, hWidget->Rotate2Normal(point));
tsepezd19e9122016-11-02 15:43:18 -070089 m_pDocView->RunInvalidate();
90 return bRet;
91}
92
93bool CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
94 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050095 const CFX_PointF& point) {
96 bool bRet = hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040097 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -070098 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
99 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -0400100 }
101 m_pDocView->RunInvalidate();
102 return bRet;
103}
dsinclair221caf62016-04-04 12:08:40 -0700104
tsepezd19e9122016-11-02 15:43:18 -0700105bool CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
106 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500107 const CFX_PointF& point) {
108 bool bRet = hWidget->OnRButtonUp(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400109 m_pDocView->RunInvalidate();
110 return bRet;
111}
dsinclair221caf62016-04-04 12:08:40 -0700112
tsepezd19e9122016-11-02 15:43:18 -0700113bool CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
114 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500115 const CFX_PointF& point) {
116 bool bRet = hWidget->OnRButtonDblClk(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400117 m_pDocView->RunInvalidate();
118 return bRet;
119}
dsinclair221caf62016-04-04 12:08:40 -0700120
tsepezd19e9122016-11-02 15:43:18 -0700121bool CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
122 uint32_t dwKeyCode,
123 uint32_t dwFlags) {
124 bool bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400125 m_pDocView->RunInvalidate();
126 m_pDocView->UpdateDocView();
127 return bRet;
128}
dsinclair221caf62016-04-04 12:08:40 -0700129
tsepezd19e9122016-11-02 15:43:18 -0700130bool CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
131 uint32_t dwKeyCode,
132 uint32_t dwFlags) {
133 bool bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400134 m_pDocView->RunInvalidate();
135 return bRet;
136}
dsinclair221caf62016-04-04 12:08:40 -0700137
tsepezd19e9122016-11-02 15:43:18 -0700138bool CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
139 uint32_t dwChar,
140 uint32_t dwFlags) {
141 bool bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400142 m_pDocView->RunInvalidate();
143 return bRet;
144}
dsinclair221caf62016-04-04 12:08:40 -0700145
dsinclair89fcde82016-05-03 13:00:25 -0700146FWL_WidgetHit CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500147 const CFX_PointF& point) {
dsinclair935d8d52016-05-17 10:32:18 -0700148 if (!(hWidget->GetStatus() & XFA_WidgetStatus_Visible))
dsinclair89fcde82016-05-03 13:00:25 -0700149 return FWL_WidgetHit::Unknown;
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500150 return hWidget->OnHitTest(hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400151}
dsinclair221caf62016-04-04 12:08:40 -0700152
tsepezd19e9122016-11-02 15:43:18 -0700153bool CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500154 const CFX_PointF& point) {
155 return hWidget->OnSetCursor(hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400156}
dsinclair221caf62016-04-04 12:08:40 -0700157
dsinclairdf4bc592016-03-31 20:34:43 -0700158void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400159 CFX_Graphics* pGS,
160 CFX_Matrix* pMatrix,
tsepezd19e9122016-11-02 15:43:18 -0700161 bool bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700162 hWidget->RenderWidget(pGS, pMatrix,
dsinclair9d6ca992016-06-16 10:51:56 -0700163 bHighlight ? XFA_WidgetStatus_Highlight : 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400164}
dsinclair221caf62016-04-04 12:08:40 -0700165
tsepezd19e9122016-11-02 15:43:18 -0700166bool CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
167 XFA_EVENTTYPE eEventType) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700168 if (eEventType == XFA_EVENT_Unknown)
tsepezd19e9122016-11-02 15:43:18 -0700169 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700170
171 if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw)
tsepezd19e9122016-11-02 15:43:18 -0700172 return false;
dsinclair221caf62016-04-04 12:08:40 -0700173
Dan Sinclair1770c022016-03-14 14:14:16 -0400174 switch (eEventType) {
175 case XFA_EVENT_Calculate: {
176 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
Tom Sepezf8a94392017-03-14 12:13:22 -0700177 return calc && calc.GetScript();
Dan Sinclair1770c022016-03-14 14:14:16 -0400178 }
179 case XFA_EVENT_Validate: {
Dan Sinclairc4ecd7b2017-05-23 10:21:54 -0400180 CXFA_Validate val = pWidgetAcc->GetValidate(false);
Tom Sepezf8a94392017-03-14 12:13:22 -0700181 return val && val.GetScript();
Dan Sinclair1770c022016-03-14 14:14:16 -0400182 }
183 default:
184 break;
185 }
Dan Sinclairc4ecd7b2017-05-23 10:21:54 -0400186 return !pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], false)
187 .empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400188}
dsinclair221caf62016-04-04 12:08:40 -0700189
Dan Sinclair1770c022016-03-14 14:14:16 -0400190int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
191 CXFA_EventParam* pParam) {
dsinclair221caf62016-04-04 12:08:40 -0700192 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400193 return XFA_EVENTERROR_NotExist;
dsinclair070fcdf2016-06-22 22:04:54 -0700194 if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400195 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700196
Dan Sinclair1770c022016-03-14 14:14:16 -0400197 switch (pParam->m_eType) {
198 case XFA_EVENT_Calculate:
199 return pWidgetAcc->ProcessCalculate();
200 case XFA_EVENT_Validate:
dsinclaira440bb32016-09-14 07:01:54 -0700201 if (m_pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled(
tsepez20d6b762016-06-09 11:46:16 -0700202 m_pDocView->GetDoc())) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400203 return pWidgetAcc->ProcessValidate();
204 }
205 return XFA_EVENTERROR_Disabled;
206 case XFA_EVENT_InitCalculate: {
207 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700208 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400209 return XFA_EVENTERROR_NotExist;
dsinclairc5a8f212016-06-20 11:11:12 -0700210 if (pWidgetAcc->GetNode()->IsUserInteractive())
Dan Sinclair1770c022016-03-14 14:14:16 -0400211 return XFA_EVENTERROR_Disabled;
dsinclair221caf62016-04-04 12:08:40 -0700212
Dan Sinclair1770c022016-03-14 14:14:16 -0400213 CXFA_Script script = calc.GetScript();
214 return pWidgetAcc->ExecuteScript(script, pParam);
215 }
216 default:
217 break;
218 }
219 int32_t iRet =
220 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
221 return iRet;
222}
dsinclair221caf62016-04-04 12:08:40 -0700223
dsinclairdf4bc592016-03-31 20:34:43 -0700224CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
225 XFA_WIDGETTYPE eType,
226 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400227 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700228 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400229 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700230 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400231 CXFA_Node* pNewFormItem =
232 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
dsinclair221caf62016-04-04 12:08:40 -0700233 if (!pNewFormItem)
234 return nullptr;
235
dsinclairc5a8f212016-06-20 11:11:12 -0700236 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NodeFlag_Initialized, true);
237 pNewFormItem->SetFlag(XFA_NodeFlag_Initialized, true);
Dan Sinclair1770c022016-03-14 14:14:16 -0400238 m_pDocView->RunLayout();
239 CXFA_LayoutItem* pLayout =
240 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
tsepez20d6b762016-06-09 11:46:16 -0700241 return static_cast<CXFA_FFWidget*>(pLayout);
Dan Sinclair1770c022016-03-14 14:14:16 -0400242}
dsinclair221caf62016-04-04 12:08:40 -0700243
Dan Sinclair1770c022016-03-14 14:14:16 -0400244CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
245 XFA_WIDGETTYPE eType,
246 CXFA_Node* pParent,
247 CXFA_Node* pBefore) const {
248 switch (eType) {
249 case XFA_WIDGETTYPE_Barcode:
dsinclair221caf62016-04-04 12:08:40 -0700250 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400251 case XFA_WIDGETTYPE_PushButton:
252 return CreatePushButton(pParent, pBefore);
253 case XFA_WIDGETTYPE_CheckButton:
254 return CreateCheckButton(pParent, pBefore);
255 case XFA_WIDGETTYPE_ExcludeGroup:
256 return CreateExclGroup(pParent, pBefore);
257 case XFA_WIDGETTYPE_RadioButton:
258 return CreateRadioButton(pParent, pBefore);
259 case XFA_WIDGETTYPE_Arc:
260 return CreateArc(pParent, pBefore);
261 case XFA_WIDGETTYPE_Rectangle:
262 return CreateRectangle(pParent, pBefore);
263 case XFA_WIDGETTYPE_Image:
264 return CreateImage(pParent, pBefore);
265 case XFA_WIDGETTYPE_Line:
266 return CreateLine(pParent, pBefore);
267 case XFA_WIDGETTYPE_Text:
268 return CreateText(pParent, pBefore);
269 case XFA_WIDGETTYPE_DatetimeEdit:
270 return CreateDatetimeEdit(pParent, pBefore);
271 case XFA_WIDGETTYPE_DecimalField:
272 return CreateDecimalField(pParent, pBefore);
273 case XFA_WIDGETTYPE_NumericField:
274 return CreateNumericField(pParent, pBefore);
275 case XFA_WIDGETTYPE_Signature:
276 return CreateSignature(pParent, pBefore);
277 case XFA_WIDGETTYPE_TextEdit:
278 return CreateTextEdit(pParent, pBefore);
279 case XFA_WIDGETTYPE_DropdownList:
280 return CreateDropdownList(pParent, pBefore);
281 case XFA_WIDGETTYPE_ListBox:
282 return CreateListBox(pParent, pBefore);
283 case XFA_WIDGETTYPE_ImageField:
284 return CreateImageField(pParent, pBefore);
285 case XFA_WIDGETTYPE_PasswordEdit:
286 return CreatePasswordEdit(pParent, pBefore);
287 case XFA_WIDGETTYPE_Subform:
288 return CreateSubform(pParent, pBefore);
289 default:
dsinclair221caf62016-04-04 12:08:40 -0700290 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400291 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400292}
dsinclair221caf62016-04-04 12:08:40 -0700293
Dan Sinclair1770c022016-03-14 14:14:16 -0400294CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
295 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700296 CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore);
297 CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField);
298 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption);
299 CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue);
tsepezd19e9122016-11-02 15:43:18 -0700300 pText->SetContent(L"Button", L"Button", false);
dsinclair221caf62016-04-04 12:08:40 -0700301
dsinclair56a8b192016-06-21 14:15:25 -0700302 CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption);
tsepezd19e9122016-11-02 15:43:18 -0700303 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, false);
304 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400305 CreateFontNode(pCaption);
dsinclair221caf62016-04-04 12:08:40 -0700306
dsinclair56a8b192016-06-21 14:15:25 -0700307 CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField);
tsepezd19e9122016-11-02 15:43:18 -0700308 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, false);
dsinclair221caf62016-04-04 12:08:40 -0700309
dsinclair56a8b192016-06-21 14:15:25 -0700310 CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder);
tsepezd19e9122016-11-02 15:43:18 -0700311 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, false);
dsinclair221caf62016-04-04 12:08:40 -0700312
dsinclair56a8b192016-06-21 14:15:25 -0700313 CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder);
314 CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill);
tsepezd19e9122016-11-02 15:43:18 -0700315 pColor->SetCData(XFA_ATTRIBUTE_Value, L"212, 208, 200", false);
dsinclair221caf62016-04-04 12:08:40 -0700316
dsinclair56a8b192016-06-21 14:15:25 -0700317 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400318 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
dsinclair221caf62016-04-04 12:08:40 -0700319
Dan Sinclair1770c022016-03-14 14:14:16 -0400320 return pField;
321}
dsinclair221caf62016-04-04 12:08:40 -0700322
Dan Sinclair1770c022016-03-14 14:14:16 -0400323CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
324 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700325 return CreateField(XFA_Element::CheckButton, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400326}
dsinclair221caf62016-04-04 12:08:40 -0700327
Dan Sinclair1770c022016-03-14 14:14:16 -0400328CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
329 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700330 return CreateFormItem(XFA_Element::ExclGroup, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400331}
dsinclair221caf62016-04-04 12:08:40 -0700332
Dan Sinclair1770c022016-03-14 14:14:16 -0400333CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
334 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700335 CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore);
336 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_Element::Ui);
337 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_Element::CheckButton);
Dan Sinclair1770c022016-03-14 14:14:16 -0400338 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
339 return pField;
340}
dsinclair221caf62016-04-04 12:08:40 -0700341
Dan Sinclair1770c022016-03-14 14:14:16 -0400342CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
343 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700344 CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore);
345 CreateValueNode(XFA_Element::Date, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400346 return pField;
347}
dsinclair221caf62016-04-04 12:08:40 -0700348
Dan Sinclair1770c022016-03-14 14:14:16 -0400349CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
350 CXFA_Node* pBefore) const {
351 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
dsinclair56a8b192016-06-21 14:15:25 -0700352 CreateValueNode(XFA_Element::Decimal, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400353 return pField;
354}
dsinclair221caf62016-04-04 12:08:40 -0700355
Dan Sinclair1770c022016-03-14 14:14:16 -0400356CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
357 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700358 return CreateField(XFA_Element::NumericEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400359}
dsinclair221caf62016-04-04 12:08:40 -0700360
Dan Sinclair1770c022016-03-14 14:14:16 -0400361CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
362 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700363 return CreateField(XFA_Element::Signature, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400364}
dsinclair221caf62016-04-04 12:08:40 -0700365
Dan Sinclair1770c022016-03-14 14:14:16 -0400366CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
367 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700368 return CreateField(XFA_Element::TextEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400369}
dsinclair221caf62016-04-04 12:08:40 -0700370
Dan Sinclair1770c022016-03-14 14:14:16 -0400371CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
372 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700373 return CreateField(XFA_Element::ChoiceList, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400374}
dsinclair221caf62016-04-04 12:08:40 -0700375
Dan Sinclair1770c022016-03-14 14:14:16 -0400376CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
377 CXFA_Node* pBefore) const {
378 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
379 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
380 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
381 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
382 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
383 return pField;
384}
dsinclair221caf62016-04-04 12:08:40 -0700385
Dan Sinclair1770c022016-03-14 14:14:16 -0400386CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
387 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700388 return CreateField(XFA_Element::ImageEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400389}
dsinclair221caf62016-04-04 12:08:40 -0700390
Dan Sinclair1770c022016-03-14 14:14:16 -0400391CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
392 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700393 CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore);
394 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
tsepezd19e9122016-11-02 15:43:18 -0700395 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400396 return pField;
397}
dsinclair221caf62016-04-04 12:08:40 -0700398
dsinclair56a8b192016-06-21 14:15:25 -0700399CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400400 CXFA_Node* pParent,
401 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700402 CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore);
403 CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400404 CreateFontNode(pField);
405 return pField;
406}
dsinclair221caf62016-04-04 12:08:40 -0700407
Dan Sinclair1770c022016-03-14 14:14:16 -0400408CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
409 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700410 return CreateDraw(XFA_Element::Arc, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400411}
dsinclair221caf62016-04-04 12:08:40 -0700412
Dan Sinclair1770c022016-03-14 14:14:16 -0400413CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
414 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700415 return CreateDraw(XFA_Element::Rectangle, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400416}
dsinclair221caf62016-04-04 12:08:40 -0700417
Dan Sinclair1770c022016-03-14 14:14:16 -0400418CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
419 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700420 CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore);
421 CreateCopyNode(XFA_Element::ImageEdit,
422 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400423 return pField;
424}
dsinclair221caf62016-04-04 12:08:40 -0700425
Dan Sinclair1770c022016-03-14 14:14:16 -0400426CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
427 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700428 return CreateDraw(XFA_Element::Line, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400429}
dsinclair221caf62016-04-04 12:08:40 -0700430
Dan Sinclair1770c022016-03-14 14:14:16 -0400431CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
432 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700433 CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore);
434 CreateCopyNode(XFA_Element::TextEdit,
435 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400436 CreateFontNode(pField);
437 return pField;
438}
dsinclair221caf62016-04-04 12:08:40 -0700439
dsinclair56a8b192016-06-21 14:15:25 -0700440CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400441 CXFA_Node* pParent,
442 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700443 CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400444 CreateValueNode(eElement, pDraw);
445 return pDraw;
446}
dsinclair221caf62016-04-04 12:08:40 -0700447
Dan Sinclair1770c022016-03-14 14:14:16 -0400448CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
449 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700450 return CreateFormItem(XFA_Element::Subform, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400451}
dsinclair221caf62016-04-04 12:08:40 -0700452
dsinclair56a8b192016-06-21 14:15:25 -0700453CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400454 CXFA_Node* pParent,
455 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700456 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
tsepezd19e9122016-11-02 15:43:18 -0700457 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400458 if (pParent)
459 pParent->InsertChild(pNewFormItem, pBefore);
460 return pNewFormItem;
461}
dsinclair221caf62016-04-04 12:08:40 -0700462
dsinclair56a8b192016-06-21 14:15:25 -0700463CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400464 CXFA_Node* pParent,
465 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700466 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400467 CXFA_Node* pNewNode =
468 CreateTemplateNode(eElement, pTemplateParent,
dsinclair85d1f2c2016-06-23 12:40:16 -0700469 pBefore ? pBefore->GetTemplateNode() : nullptr)
tsepezd19e9122016-11-02 15:43:18 -0700470 ->Clone(false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400471 if (pParent)
472 pParent->InsertChild(pNewNode, pBefore);
473 return pNewNode;
474}
dsinclair221caf62016-04-04 12:08:40 -0700475
dsinclair56a8b192016-06-21 14:15:25 -0700476CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400477 CXFA_Node* pParent,
478 CXFA_Node* pBefore) const {
479 CXFA_Document* pXFADoc = GetXFADoc();
dsinclaira1b07722016-07-11 08:20:58 -0700480 CXFA_Node* pNewTemplateNode =
481 pXFADoc->CreateNode(XFA_XDPPACKET_Template, eElement);
Dan Sinclair1770c022016-03-14 14:14:16 -0400482 if (pParent)
483 pParent->InsertChild(pNewTemplateNode, pBefore);
484 return pNewTemplateNode;
485}
dsinclair221caf62016-04-04 12:08:40 -0700486
Dan Sinclair1770c022016-03-14 14:14:16 -0400487CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700488 CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent);
tsepezd19e9122016-11-02 15:43:18 -0700489 pFont->SetCData(XFA_ATTRIBUTE_Typeface, L"Myriad Pro", false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400490 return pFont;
491}
dsinclair221caf62016-04-04 12:08:40 -0700492
Dan Sinclair1770c022016-03-14 14:14:16 -0400493CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700494 uint32_t dwFlags,
Dan Sinclair05df0752017-03-14 14:43:42 -0400495 float fInsets[4]) const {
dsinclair56a8b192016-06-21 14:15:25 -0700496 CXFA_Node* pMargin = CreateCopyNode(XFA_Element::Margin, pParent);
dsinclair221caf62016-04-04 12:08:40 -0700497 if (dwFlags & 0x01)
Dan Sinclair1770c022016-03-14 14:14:16 -0400498 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
tsepezd19e9122016-11-02 15:43:18 -0700499 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700500 if (dwFlags & 0x02)
Dan Sinclair1770c022016-03-14 14:14:16 -0400501 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
tsepezd19e9122016-11-02 15:43:18 -0700502 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700503 if (dwFlags & 0x04)
Dan Sinclair1770c022016-03-14 14:14:16 -0400504 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
tsepezd19e9122016-11-02 15:43:18 -0700505 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700506 if (dwFlags & 0x08)
Dan Sinclair1770c022016-03-14 14:14:16 -0400507 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
tsepezd19e9122016-11-02 15:43:18 -0700508 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400509 return pMargin;
510}
dsinclair221caf62016-04-04 12:08:40 -0700511
dsinclair56a8b192016-06-21 14:15:25 -0700512CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue,
Dan Sinclair1770c022016-03-14 14:14:16 -0400513 CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700514 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent);
Dan Sinclair1770c022016-03-14 14:14:16 -0400515 CreateCopyNode(eValue, pValue);
516 return pValue;
517}
dsinclair221caf62016-04-04 12:08:40 -0700518
dsinclairdf4bc592016-03-31 20:34:43 -0700519CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
dsinclaira1b07722016-07-11 08:20:58 -0700520 return GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400521}
dsinclair221caf62016-04-04 12:08:40 -0700522
Dan Sinclair1770c022016-03-14 14:14:16 -0400523CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
tsepez20d6b762016-06-09 11:46:16 -0700524 return m_pDocView->GetDoc()->GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400525}