blob: c78b5e883717a8333b9292c294633dfdf50201a1 [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
Dan Sinclair80c48782017-03-23 12:11:20 -040011#include "xfa/fxfa/cxfa_ffdoc.h"
12#include "xfa/fxfa/cxfa_ffdocview.h"
Dan Sinclair24ef6332017-07-24 10:52:57 -040013#include "xfa/fxfa/cxfa_fffield.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040014#include "xfa/fxfa/cxfa_ffwidget.h"
Dan Sinclair24ef6332017-07-24 10:52:57 -040015#include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h"
dsinclair0b851ff2016-07-21 12:03:01 -070016#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
dsinclair9eb0db12016-07-21 12:01:39 -070017#include "xfa/fxfa/parser/cxfa_measurement.h"
Dan Sinclairefcae5d2017-03-29 14:47:46 -040018#include "xfa/fxfa/parser/cxfa_node.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040019
20CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView)
21 : m_pDocView(pDocView) {}
dsinclairdf4bc592016-03-31 20:34:43 -070022
Dan Sinclair1770c022016-03-14 14:14:16 -040023CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler() {}
dsinclairdf4bc592016-03-31 20:34:43 -070024
tsepezd19e9122016-11-02 15:43:18 -070025bool CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040026 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070027 bool bRet = hWidget->OnMouseEnter();
Dan Sinclair1770c022016-03-14 14:14:16 -040028 m_pDocView->UnlockUpdate();
29 m_pDocView->UpdateDocView();
30 return bRet;
31}
dsinclair221caf62016-04-04 12:08:40 -070032
tsepezd19e9122016-11-02 15:43:18 -070033bool CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040034 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070035 bool bRet = hWidget->OnMouseExit();
Dan Sinclair1770c022016-03-14 14:14:16 -040036 m_pDocView->UnlockUpdate();
37 m_pDocView->UpdateDocView();
38 return bRet;
39}
dsinclair221caf62016-04-04 12:08:40 -070040
tsepezd19e9122016-11-02 15:43:18 -070041bool CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget,
42 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050043 const CFX_PointF& point) {
Dan Sinclair1770c022016-03-14 14:14:16 -040044 m_pDocView->LockUpdate();
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050045 bool bRet = hWidget->OnLButtonDown(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040046 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -070047 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
48 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040049 }
50 m_pDocView->UnlockUpdate();
51 m_pDocView->UpdateDocView();
52 return bRet;
53}
dsinclair221caf62016-04-04 12:08:40 -070054
tsepezd19e9122016-11-02 15:43:18 -070055bool CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
56 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050057 const CFX_PointF& point) {
Dan Sinclair1770c022016-03-14 14:14:16 -040058 m_pDocView->LockUpdate();
tsepezd19e9122016-11-02 15:43:18 -070059 m_pDocView->m_bLayoutEvent = true;
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050060 bool bRet = hWidget->OnLButtonUp(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040061 m_pDocView->UnlockUpdate();
62 m_pDocView->UpdateDocView();
63 return bRet;
64}
dsinclair221caf62016-04-04 12:08:40 -070065
tsepezd19e9122016-11-02 15:43:18 -070066bool CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070067 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050068 const CFX_PointF& point) {
69 bool bRet = hWidget->OnLButtonDblClk(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040070 m_pDocView->RunInvalidate();
71 return bRet;
72}
dsinclair221caf62016-04-04 12:08:40 -070073
tsepezd19e9122016-11-02 15:43:18 -070074bool CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
75 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050076 const CFX_PointF& point) {
77 bool bRet = hWidget->OnMouseMove(dwFlags, hWidget->Rotate2Normal(point));
tsepezd19e9122016-11-02 15:43:18 -070078 m_pDocView->RunInvalidate();
79 return bRet;
80}
81
82bool CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
83 uint32_t dwFlags,
84 int16_t zDelta,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050085 const CFX_PointF& point) {
86 bool bRet =
87 hWidget->OnMouseWheel(dwFlags, zDelta, hWidget->Rotate2Normal(point));
tsepezd19e9122016-11-02 15:43:18 -070088 m_pDocView->RunInvalidate();
89 return bRet;
90}
91
92bool CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
93 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -050094 const CFX_PointF& point) {
95 bool bRet = hWidget->OnRButtonDown(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -040096 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -070097 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
98 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040099 }
100 m_pDocView->RunInvalidate();
101 return bRet;
102}
dsinclair221caf62016-04-04 12:08:40 -0700103
tsepezd19e9122016-11-02 15:43:18 -0700104bool CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
105 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500106 const CFX_PointF& point) {
107 bool bRet = hWidget->OnRButtonUp(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400108 m_pDocView->RunInvalidate();
109 return bRet;
110}
dsinclair221caf62016-04-04 12:08:40 -0700111
tsepezd19e9122016-11-02 15:43:18 -0700112bool CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
113 uint32_t dwFlags,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500114 const CFX_PointF& point) {
115 bool bRet = hWidget->OnRButtonDblClk(dwFlags, hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400116 m_pDocView->RunInvalidate();
117 return bRet;
118}
dsinclair221caf62016-04-04 12:08:40 -0700119
tsepezd19e9122016-11-02 15:43:18 -0700120bool CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
121 uint32_t dwKeyCode,
122 uint32_t dwFlags) {
123 bool bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400124 m_pDocView->RunInvalidate();
125 m_pDocView->UpdateDocView();
126 return bRet;
127}
dsinclair221caf62016-04-04 12:08:40 -0700128
tsepezd19e9122016-11-02 15:43:18 -0700129bool CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
130 uint32_t dwKeyCode,
131 uint32_t dwFlags) {
132 bool bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400133 m_pDocView->RunInvalidate();
134 return bRet;
135}
dsinclair221caf62016-04-04 12:08:40 -0700136
tsepezd19e9122016-11-02 15:43:18 -0700137bool CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
138 uint32_t dwChar,
139 uint32_t dwFlags) {
140 bool bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400141 m_pDocView->RunInvalidate();
142 return bRet;
143}
dsinclair221caf62016-04-04 12:08:40 -0700144
dsinclair89fcde82016-05-03 13:00:25 -0700145FWL_WidgetHit CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500146 const CFX_PointF& point) {
dsinclair935d8d52016-05-17 10:32:18 -0700147 if (!(hWidget->GetStatus() & XFA_WidgetStatus_Visible))
dsinclair89fcde82016-05-03 13:00:25 -0700148 return FWL_WidgetHit::Unknown;
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500149 return hWidget->OnHitTest(hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400150}
dsinclair221caf62016-04-04 12:08:40 -0700151
tsepezd19e9122016-11-02 15:43:18 -0700152bool CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500153 const CFX_PointF& point) {
154 return hWidget->OnSetCursor(hWidget->Rotate2Normal(point));
Dan Sinclair1770c022016-03-14 14:14:16 -0400155}
dsinclair221caf62016-04-04 12:08:40 -0700156
dsinclairdf4bc592016-03-31 20:34:43 -0700157void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair2b918c82017-07-13 14:47:10 -0400158 CXFA_Graphics* pGS,
Dan Sinclair1770c022016-03-14 14:14:16 -0400159 CFX_Matrix* pMatrix,
tsepezd19e9122016-11-02 15:43:18 -0700160 bool bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700161 hWidget->RenderWidget(pGS, pMatrix,
dsinclair9d6ca992016-06-16 10:51:56 -0700162 bHighlight ? XFA_WidgetStatus_Highlight : 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400163}
dsinclair221caf62016-04-04 12:08:40 -0700164
tsepezd19e9122016-11-02 15:43:18 -0700165bool CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
166 XFA_EVENTTYPE eEventType) {
Tom Sepezf8a94392017-03-14 12:13:22 -0700167 if (eEventType == XFA_EVENT_Unknown)
tsepezd19e9122016-11-02 15:43:18 -0700168 return false;
Tom Sepezf8a94392017-03-14 12:13:22 -0700169
170 if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw)
tsepezd19e9122016-11-02 15:43:18 -0700171 return false;
dsinclair221caf62016-04-04 12:08:40 -0700172
Dan Sinclair1770c022016-03-14 14:14:16 -0400173 switch (eEventType) {
174 case XFA_EVENT_Calculate: {
175 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
Tom Sepezf8a94392017-03-14 12:13:22 -0700176 return calc && calc.GetScript();
Dan Sinclair1770c022016-03-14 14:14:16 -0400177 }
178 case XFA_EVENT_Validate: {
Dan Sinclairc4ecd7b2017-05-23 10:21:54 -0400179 CXFA_Validate val = pWidgetAcc->GetValidate(false);
Tom Sepezf8a94392017-03-14 12:13:22 -0700180 return val && val.GetScript();
Dan Sinclair1770c022016-03-14 14:14:16 -0400181 }
182 default:
183 break;
184 }
Dan Sinclairc4ecd7b2017-05-23 10:21:54 -0400185 return !pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], false)
186 .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}