blob: ffc1c27070b67b7b802e4005c95095d5b42da713 [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: {
180 CXFA_Validate val = pWidgetAcc->GetValidate();
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 }
Tom Sepezf8a94392017-03-14 12:13:22 -0700186 return !pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType]).empty();
Dan Sinclair1770c022016-03-14 14:14:16 -0400187}
dsinclair221caf62016-04-04 12:08:40 -0700188
Dan Sinclair1770c022016-03-14 14:14:16 -0400189int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
190 CXFA_EventParam* pParam) {
dsinclair221caf62016-04-04 12:08:40 -0700191 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400192 return XFA_EVENTERROR_NotExist;
dsinclair070fcdf2016-06-22 22:04:54 -0700193 if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400194 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700195
Dan Sinclair1770c022016-03-14 14:14:16 -0400196 switch (pParam->m_eType) {
197 case XFA_EVENT_Calculate:
198 return pWidgetAcc->ProcessCalculate();
199 case XFA_EVENT_Validate:
dsinclaira440bb32016-09-14 07:01:54 -0700200 if (m_pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled(
tsepez20d6b762016-06-09 11:46:16 -0700201 m_pDocView->GetDoc())) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400202 return pWidgetAcc->ProcessValidate();
203 }
204 return XFA_EVENTERROR_Disabled;
205 case XFA_EVENT_InitCalculate: {
206 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700207 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400208 return XFA_EVENTERROR_NotExist;
dsinclairc5a8f212016-06-20 11:11:12 -0700209 if (pWidgetAcc->GetNode()->IsUserInteractive())
Dan Sinclair1770c022016-03-14 14:14:16 -0400210 return XFA_EVENTERROR_Disabled;
dsinclair221caf62016-04-04 12:08:40 -0700211
Dan Sinclair1770c022016-03-14 14:14:16 -0400212 CXFA_Script script = calc.GetScript();
213 return pWidgetAcc->ExecuteScript(script, pParam);
214 }
215 default:
216 break;
217 }
218 int32_t iRet =
219 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
220 return iRet;
221}
dsinclair221caf62016-04-04 12:08:40 -0700222
dsinclairdf4bc592016-03-31 20:34:43 -0700223CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
224 XFA_WIDGETTYPE eType,
225 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400226 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700227 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400228 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700229 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400230 CXFA_Node* pNewFormItem =
231 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
dsinclair221caf62016-04-04 12:08:40 -0700232 if (!pNewFormItem)
233 return nullptr;
234
dsinclairc5a8f212016-06-20 11:11:12 -0700235 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NodeFlag_Initialized, true);
236 pNewFormItem->SetFlag(XFA_NodeFlag_Initialized, true);
Dan Sinclair1770c022016-03-14 14:14:16 -0400237 m_pDocView->RunLayout();
238 CXFA_LayoutItem* pLayout =
239 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
tsepez20d6b762016-06-09 11:46:16 -0700240 return static_cast<CXFA_FFWidget*>(pLayout);
Dan Sinclair1770c022016-03-14 14:14:16 -0400241}
dsinclair221caf62016-04-04 12:08:40 -0700242
Dan Sinclair1770c022016-03-14 14:14:16 -0400243CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
244 XFA_WIDGETTYPE eType,
245 CXFA_Node* pParent,
246 CXFA_Node* pBefore) const {
247 switch (eType) {
248 case XFA_WIDGETTYPE_Barcode:
dsinclair221caf62016-04-04 12:08:40 -0700249 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400250 case XFA_WIDGETTYPE_PushButton:
251 return CreatePushButton(pParent, pBefore);
252 case XFA_WIDGETTYPE_CheckButton:
253 return CreateCheckButton(pParent, pBefore);
254 case XFA_WIDGETTYPE_ExcludeGroup:
255 return CreateExclGroup(pParent, pBefore);
256 case XFA_WIDGETTYPE_RadioButton:
257 return CreateRadioButton(pParent, pBefore);
258 case XFA_WIDGETTYPE_Arc:
259 return CreateArc(pParent, pBefore);
260 case XFA_WIDGETTYPE_Rectangle:
261 return CreateRectangle(pParent, pBefore);
262 case XFA_WIDGETTYPE_Image:
263 return CreateImage(pParent, pBefore);
264 case XFA_WIDGETTYPE_Line:
265 return CreateLine(pParent, pBefore);
266 case XFA_WIDGETTYPE_Text:
267 return CreateText(pParent, pBefore);
268 case XFA_WIDGETTYPE_DatetimeEdit:
269 return CreateDatetimeEdit(pParent, pBefore);
270 case XFA_WIDGETTYPE_DecimalField:
271 return CreateDecimalField(pParent, pBefore);
272 case XFA_WIDGETTYPE_NumericField:
273 return CreateNumericField(pParent, pBefore);
274 case XFA_WIDGETTYPE_Signature:
275 return CreateSignature(pParent, pBefore);
276 case XFA_WIDGETTYPE_TextEdit:
277 return CreateTextEdit(pParent, pBefore);
278 case XFA_WIDGETTYPE_DropdownList:
279 return CreateDropdownList(pParent, pBefore);
280 case XFA_WIDGETTYPE_ListBox:
281 return CreateListBox(pParent, pBefore);
282 case XFA_WIDGETTYPE_ImageField:
283 return CreateImageField(pParent, pBefore);
284 case XFA_WIDGETTYPE_PasswordEdit:
285 return CreatePasswordEdit(pParent, pBefore);
286 case XFA_WIDGETTYPE_Subform:
287 return CreateSubform(pParent, pBefore);
288 default:
dsinclair221caf62016-04-04 12:08:40 -0700289 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400290 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400291}
dsinclair221caf62016-04-04 12:08:40 -0700292
Dan Sinclair1770c022016-03-14 14:14:16 -0400293CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
294 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700295 CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore);
296 CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField);
297 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption);
298 CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue);
tsepezd19e9122016-11-02 15:43:18 -0700299 pText->SetContent(L"Button", L"Button", false);
dsinclair221caf62016-04-04 12:08:40 -0700300
dsinclair56a8b192016-06-21 14:15:25 -0700301 CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption);
tsepezd19e9122016-11-02 15:43:18 -0700302 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, false);
303 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400304 CreateFontNode(pCaption);
dsinclair221caf62016-04-04 12:08:40 -0700305
dsinclair56a8b192016-06-21 14:15:25 -0700306 CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField);
tsepezd19e9122016-11-02 15:43:18 -0700307 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, false);
dsinclair221caf62016-04-04 12:08:40 -0700308
dsinclair56a8b192016-06-21 14:15:25 -0700309 CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder);
tsepezd19e9122016-11-02 15:43:18 -0700310 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, false);
dsinclair221caf62016-04-04 12:08:40 -0700311
dsinclair56a8b192016-06-21 14:15:25 -0700312 CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder);
313 CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill);
tsepezd19e9122016-11-02 15:43:18 -0700314 pColor->SetCData(XFA_ATTRIBUTE_Value, L"212, 208, 200", false);
dsinclair221caf62016-04-04 12:08:40 -0700315
dsinclair56a8b192016-06-21 14:15:25 -0700316 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400317 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
dsinclair221caf62016-04-04 12:08:40 -0700318
Dan Sinclair1770c022016-03-14 14:14:16 -0400319 return pField;
320}
dsinclair221caf62016-04-04 12:08:40 -0700321
Dan Sinclair1770c022016-03-14 14:14:16 -0400322CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
323 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700324 return CreateField(XFA_Element::CheckButton, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400325}
dsinclair221caf62016-04-04 12:08:40 -0700326
Dan Sinclair1770c022016-03-14 14:14:16 -0400327CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
328 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700329 return CreateFormItem(XFA_Element::ExclGroup, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400330}
dsinclair221caf62016-04-04 12:08:40 -0700331
Dan Sinclair1770c022016-03-14 14:14:16 -0400332CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
333 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700334 CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore);
335 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_Element::Ui);
336 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_Element::CheckButton);
Dan Sinclair1770c022016-03-14 14:14:16 -0400337 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
338 return pField;
339}
dsinclair221caf62016-04-04 12:08:40 -0700340
Dan Sinclair1770c022016-03-14 14:14:16 -0400341CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
342 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700343 CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore);
344 CreateValueNode(XFA_Element::Date, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400345 return pField;
346}
dsinclair221caf62016-04-04 12:08:40 -0700347
Dan Sinclair1770c022016-03-14 14:14:16 -0400348CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
349 CXFA_Node* pBefore) const {
350 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
dsinclair56a8b192016-06-21 14:15:25 -0700351 CreateValueNode(XFA_Element::Decimal, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400352 return pField;
353}
dsinclair221caf62016-04-04 12:08:40 -0700354
Dan Sinclair1770c022016-03-14 14:14:16 -0400355CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
356 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700357 return CreateField(XFA_Element::NumericEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400358}
dsinclair221caf62016-04-04 12:08:40 -0700359
Dan Sinclair1770c022016-03-14 14:14:16 -0400360CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
361 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700362 return CreateField(XFA_Element::Signature, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400363}
dsinclair221caf62016-04-04 12:08:40 -0700364
Dan Sinclair1770c022016-03-14 14:14:16 -0400365CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
366 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700367 return CreateField(XFA_Element::TextEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400368}
dsinclair221caf62016-04-04 12:08:40 -0700369
Dan Sinclair1770c022016-03-14 14:14:16 -0400370CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
371 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700372 return CreateField(XFA_Element::ChoiceList, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400373}
dsinclair221caf62016-04-04 12:08:40 -0700374
Dan Sinclair1770c022016-03-14 14:14:16 -0400375CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
376 CXFA_Node* pBefore) const {
377 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
378 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
379 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
380 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
381 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
382 return pField;
383}
dsinclair221caf62016-04-04 12:08:40 -0700384
Dan Sinclair1770c022016-03-14 14:14:16 -0400385CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
386 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700387 return CreateField(XFA_Element::ImageEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400388}
dsinclair221caf62016-04-04 12:08:40 -0700389
Dan Sinclair1770c022016-03-14 14:14:16 -0400390CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
391 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700392 CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore);
393 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
tsepezd19e9122016-11-02 15:43:18 -0700394 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400395 return pField;
396}
dsinclair221caf62016-04-04 12:08:40 -0700397
dsinclair56a8b192016-06-21 14:15:25 -0700398CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400399 CXFA_Node* pParent,
400 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700401 CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore);
402 CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400403 CreateFontNode(pField);
404 return pField;
405}
dsinclair221caf62016-04-04 12:08:40 -0700406
Dan Sinclair1770c022016-03-14 14:14:16 -0400407CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
408 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700409 return CreateDraw(XFA_Element::Arc, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400410}
dsinclair221caf62016-04-04 12:08:40 -0700411
Dan Sinclair1770c022016-03-14 14:14:16 -0400412CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
413 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700414 return CreateDraw(XFA_Element::Rectangle, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400415}
dsinclair221caf62016-04-04 12:08:40 -0700416
Dan Sinclair1770c022016-03-14 14:14:16 -0400417CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
418 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700419 CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore);
420 CreateCopyNode(XFA_Element::ImageEdit,
421 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400422 return pField;
423}
dsinclair221caf62016-04-04 12:08:40 -0700424
Dan Sinclair1770c022016-03-14 14:14:16 -0400425CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
426 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700427 return CreateDraw(XFA_Element::Line, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400428}
dsinclair221caf62016-04-04 12:08:40 -0700429
Dan Sinclair1770c022016-03-14 14:14:16 -0400430CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
431 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700432 CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore);
433 CreateCopyNode(XFA_Element::TextEdit,
434 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400435 CreateFontNode(pField);
436 return pField;
437}
dsinclair221caf62016-04-04 12:08:40 -0700438
dsinclair56a8b192016-06-21 14:15:25 -0700439CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400440 CXFA_Node* pParent,
441 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700442 CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400443 CreateValueNode(eElement, pDraw);
444 return pDraw;
445}
dsinclair221caf62016-04-04 12:08:40 -0700446
Dan Sinclair1770c022016-03-14 14:14:16 -0400447CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
448 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700449 return CreateFormItem(XFA_Element::Subform, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400450}
dsinclair221caf62016-04-04 12:08:40 -0700451
dsinclair56a8b192016-06-21 14:15:25 -0700452CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400453 CXFA_Node* pParent,
454 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700455 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
tsepezd19e9122016-11-02 15:43:18 -0700456 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400457 if (pParent)
458 pParent->InsertChild(pNewFormItem, pBefore);
459 return pNewFormItem;
460}
dsinclair221caf62016-04-04 12:08:40 -0700461
dsinclair56a8b192016-06-21 14:15:25 -0700462CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400463 CXFA_Node* pParent,
464 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700465 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400466 CXFA_Node* pNewNode =
467 CreateTemplateNode(eElement, pTemplateParent,
dsinclair85d1f2c2016-06-23 12:40:16 -0700468 pBefore ? pBefore->GetTemplateNode() : nullptr)
tsepezd19e9122016-11-02 15:43:18 -0700469 ->Clone(false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400470 if (pParent)
471 pParent->InsertChild(pNewNode, pBefore);
472 return pNewNode;
473}
dsinclair221caf62016-04-04 12:08:40 -0700474
dsinclair56a8b192016-06-21 14:15:25 -0700475CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400476 CXFA_Node* pParent,
477 CXFA_Node* pBefore) const {
478 CXFA_Document* pXFADoc = GetXFADoc();
dsinclaira1b07722016-07-11 08:20:58 -0700479 CXFA_Node* pNewTemplateNode =
480 pXFADoc->CreateNode(XFA_XDPPACKET_Template, eElement);
Dan Sinclair1770c022016-03-14 14:14:16 -0400481 if (pParent)
482 pParent->InsertChild(pNewTemplateNode, pBefore);
483 return pNewTemplateNode;
484}
dsinclair221caf62016-04-04 12:08:40 -0700485
Dan Sinclair1770c022016-03-14 14:14:16 -0400486CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700487 CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent);
tsepezd19e9122016-11-02 15:43:18 -0700488 pFont->SetCData(XFA_ATTRIBUTE_Typeface, L"Myriad Pro", false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400489 return pFont;
490}
dsinclair221caf62016-04-04 12:08:40 -0700491
Dan Sinclair1770c022016-03-14 14:14:16 -0400492CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700493 uint32_t dwFlags,
Dan Sinclair05df0752017-03-14 14:43:42 -0400494 float fInsets[4]) const {
dsinclair56a8b192016-06-21 14:15:25 -0700495 CXFA_Node* pMargin = CreateCopyNode(XFA_Element::Margin, pParent);
dsinclair221caf62016-04-04 12:08:40 -0700496 if (dwFlags & 0x01)
Dan Sinclair1770c022016-03-14 14:14:16 -0400497 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
tsepezd19e9122016-11-02 15:43:18 -0700498 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700499 if (dwFlags & 0x02)
Dan Sinclair1770c022016-03-14 14:14:16 -0400500 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
tsepezd19e9122016-11-02 15:43:18 -0700501 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700502 if (dwFlags & 0x04)
Dan Sinclair1770c022016-03-14 14:14:16 -0400503 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
tsepezd19e9122016-11-02 15:43:18 -0700504 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), false);
dsinclair221caf62016-04-04 12:08:40 -0700505 if (dwFlags & 0x08)
Dan Sinclair1770c022016-03-14 14:14:16 -0400506 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
tsepezd19e9122016-11-02 15:43:18 -0700507 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), false);
Dan Sinclair1770c022016-03-14 14:14:16 -0400508 return pMargin;
509}
dsinclair221caf62016-04-04 12:08:40 -0700510
dsinclair56a8b192016-06-21 14:15:25 -0700511CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue,
Dan Sinclair1770c022016-03-14 14:14:16 -0400512 CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700513 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent);
Dan Sinclair1770c022016-03-14 14:14:16 -0400514 CreateCopyNode(eValue, pValue);
515 return pValue;
516}
dsinclair221caf62016-04-04 12:08:40 -0700517
dsinclairdf4bc592016-03-31 20:34:43 -0700518CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
dsinclaira1b07722016-07-11 08:20:58 -0700519 return GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400520}
dsinclair221caf62016-04-04 12:08:40 -0700521
Dan Sinclair1770c022016-03-14 14:14:16 -0400522CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
tsepez20d6b762016-06-09 11:46:16 -0700523 return m_pDocView->GetDoc()->GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400524}