blob: 6ad03d1b73f874f7160fa4c1557bcc3eef58b769 [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
dsinclair7222ea62016-04-06 14:33:07 -07007#include "xfa/fxfa/include/xfa_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"
dsinclair7222ea62016-04-06 14:33:07 -070014#include "xfa/fxfa/include/xfa_ffdoc.h"
15#include "xfa/fxfa/include/xfa_ffdocview.h"
16#include "xfa/fxfa/include/xfa_ffwidget.h"
dsinclairdf4bc592016-03-31 20:34:43 -070017#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040018#include "xfa/fxfa/parser/xfa_parser.h"
dsinclairdf4bc592016-03-31 20:34:43 -070019#include "xfa/fxfa/parser/xfa_parser_imp.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
dsinclairdf4bc592016-03-31 20:34:43 -070026FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040027 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070028 FX_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
dsinclairdf4bc592016-03-31 20:34:43 -070034FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040035 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070036 FX_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
dsinclairdf4bc592016-03-31 20:34:43 -070042FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070043 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040044 FX_FLOAT fx,
45 FX_FLOAT fy) {
46 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070047 hWidget->Rotate2Normal(fx, fy);
48 FX_BOOL bRet = hWidget->OnLButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040049 if (bRet && m_pDocView->SetFocus(hWidget)) {
tsepez20d6b762016-06-09 11:46:16 -070050 m_pDocView->GetDoc()->GetDocProvider()->SetFocusWidget(m_pDocView->GetDoc(),
51 hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040052 }
53 m_pDocView->UnlockUpdate();
54 m_pDocView->UpdateDocView();
55 return bRet;
56}
dsinclair221caf62016-04-04 12:08:40 -070057
dsinclairdf4bc592016-03-31 20:34:43 -070058FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070059 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040060 FX_FLOAT fx,
61 FX_FLOAT fy) {
62 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070063 hWidget->Rotate2Normal(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040064 m_pDocView->m_bLayoutEvent = TRUE;
dsinclairdf4bc592016-03-31 20:34:43 -070065 FX_BOOL bRet = hWidget->OnLButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040066 m_pDocView->UnlockUpdate();
67 m_pDocView->UpdateDocView();
68 return bRet;
69}
dsinclair221caf62016-04-04 12:08:40 -070070
dsinclairdf4bc592016-03-31 20:34:43 -070071FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070072 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040073 FX_FLOAT fx,
74 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070075 hWidget->Rotate2Normal(fx, fy);
76 FX_BOOL bRet = hWidget->OnLButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040077 m_pDocView->RunInvalidate();
78 return bRet;
79}
dsinclair221caf62016-04-04 12:08:40 -070080
dsinclairdf4bc592016-03-31 20:34:43 -070081FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070082 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040083 FX_FLOAT fx,
84 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070085 hWidget->Rotate2Normal(fx, fy);
86 FX_BOOL bRet = hWidget->OnMouseMove(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040087 m_pDocView->RunInvalidate();
88 return bRet;
89}
dsinclair221caf62016-04-04 12:08:40 -070090
dsinclairdf4bc592016-03-31 20:34:43 -070091FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070092 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040093 int16_t zDelta,
94 FX_FLOAT fx,
95 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070096 hWidget->Rotate2Normal(fx, fy);
97 FX_BOOL bRet = hWidget->OnMouseWheel(dwFlags, zDelta, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040098 m_pDocView->RunInvalidate();
99 return bRet;
100}
dsinclair221caf62016-04-04 12:08:40 -0700101
dsinclairdf4bc592016-03-31 20:34:43 -0700102FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700103 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400104 FX_FLOAT fx,
105 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700106 hWidget->Rotate2Normal(fx, fy);
107 FX_BOOL bRet = hWidget->OnRButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400108 if (bRet && m_pDocView->SetFocus(hWidget)) {
tsepez20d6b762016-06-09 11:46:16 -0700109 m_pDocView->GetDoc()->GetDocProvider()->SetFocusWidget(m_pDocView->GetDoc(),
110 hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -0400111 }
112 m_pDocView->RunInvalidate();
113 return bRet;
114}
dsinclair221caf62016-04-04 12:08:40 -0700115
dsinclairdf4bc592016-03-31 20:34:43 -0700116FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700117 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400118 FX_FLOAT fx,
119 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700120 hWidget->Rotate2Normal(fx, fy);
121 FX_BOOL bRet = hWidget->OnRButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400122 m_pDocView->RunInvalidate();
123 return bRet;
124}
dsinclair221caf62016-04-04 12:08:40 -0700125
dsinclairdf4bc592016-03-31 20:34:43 -0700126FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700127 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400128 FX_FLOAT fx,
129 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700130 hWidget->Rotate2Normal(fx, fy);
131 FX_BOOL bRet = hWidget->OnRButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400132 m_pDocView->RunInvalidate();
133 return bRet;
134}
dsinclair221caf62016-04-04 12:08:40 -0700135
dsinclairdf4bc592016-03-31 20:34:43 -0700136FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700137 uint32_t dwKeyCode,
138 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700139 FX_BOOL bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400140 m_pDocView->RunInvalidate();
141 m_pDocView->UpdateDocView();
142 return bRet;
143}
dsinclair221caf62016-04-04 12:08:40 -0700144
dsinclairdf4bc592016-03-31 20:34:43 -0700145FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700146 uint32_t dwKeyCode,
147 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700148 FX_BOOL bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400149 m_pDocView->RunInvalidate();
150 return bRet;
151}
dsinclair221caf62016-04-04 12:08:40 -0700152
dsinclairdf4bc592016-03-31 20:34:43 -0700153FX_BOOL CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700154 uint32_t dwChar,
155 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700156 FX_BOOL bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400157 m_pDocView->RunInvalidate();
158 return bRet;
159}
dsinclair221caf62016-04-04 12:08:40 -0700160
dsinclair89fcde82016-05-03 13:00:25 -0700161FWL_WidgetHit CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
162 FX_FLOAT fx,
163 FX_FLOAT fy) {
dsinclair935d8d52016-05-17 10:32:18 -0700164 if (!(hWidget->GetStatus() & XFA_WidgetStatus_Visible))
dsinclair89fcde82016-05-03 13:00:25 -0700165 return FWL_WidgetHit::Unknown;
dsinclairdf4bc592016-03-31 20:34:43 -0700166
167 hWidget->Rotate2Normal(fx, fy);
168 return hWidget->OnHitTest(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400169}
dsinclair221caf62016-04-04 12:08:40 -0700170
dsinclairdf4bc592016-03-31 20:34:43 -0700171FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400172 FX_FLOAT fx,
173 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700174 hWidget->Rotate2Normal(fx, fy);
175 return hWidget->OnSetCursor(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400176}
dsinclair221caf62016-04-04 12:08:40 -0700177
dsinclairdf4bc592016-03-31 20:34:43 -0700178void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400179 CFX_Graphics* pGS,
180 CFX_Matrix* pMatrix,
181 FX_BOOL bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700182 hWidget->RenderWidget(pGS, pMatrix,
dsinclair9d6ca992016-06-16 10:51:56 -0700183 bHighlight ? XFA_WidgetStatus_Highlight : 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400184}
dsinclair221caf62016-04-04 12:08:40 -0700185
Dan Sinclair1770c022016-03-14 14:14:16 -0400186FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
187 XFA_EVENTTYPE eEventType) {
dsinclair221caf62016-04-04 12:08:40 -0700188 if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400189 return FALSE;
dsinclair56a8b192016-06-21 14:15:25 -0700190 if (pWidgetAcc->GetClassID() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400191 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700192
Dan Sinclair1770c022016-03-14 14:14:16 -0400193 switch (eEventType) {
194 case XFA_EVENT_Calculate: {
195 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700196 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400197 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700198 if (calc.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400199 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400200 return FALSE;
201 }
202 case XFA_EVENT_Validate: {
203 CXFA_Validate val = pWidgetAcc->GetValidate();
dsinclair221caf62016-04-04 12:08:40 -0700204 if (!val)
Dan Sinclair1770c022016-03-14 14:14:16 -0400205 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700206 if (val.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400207 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400208 return FALSE;
209 }
210 default:
211 break;
212 }
213 CXFA_NodeArray eventArray;
214 return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
215 eventArray);
216}
dsinclair221caf62016-04-04 12:08:40 -0700217
Dan Sinclair1770c022016-03-14 14:14:16 -0400218int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
219 CXFA_EventParam* pParam) {
dsinclair221caf62016-04-04 12:08:40 -0700220 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400221 return XFA_EVENTERROR_NotExist;
dsinclair56a8b192016-06-21 14:15:25 -0700222 if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400223 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700224
Dan Sinclair1770c022016-03-14 14:14:16 -0400225 switch (pParam->m_eType) {
226 case XFA_EVENT_Calculate:
227 return pWidgetAcc->ProcessCalculate();
228 case XFA_EVENT_Validate:
tsepez20d6b762016-06-09 11:46:16 -0700229 if (m_pDocView->GetDoc()->GetDocProvider()->IsValidationsEnabled(
230 m_pDocView->GetDoc())) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400231 return pWidgetAcc->ProcessValidate();
232 }
233 return XFA_EVENTERROR_Disabled;
234 case XFA_EVENT_InitCalculate: {
235 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700236 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400237 return XFA_EVENTERROR_NotExist;
dsinclairc5a8f212016-06-20 11:11:12 -0700238 if (pWidgetAcc->GetNode()->IsUserInteractive())
Dan Sinclair1770c022016-03-14 14:14:16 -0400239 return XFA_EVENTERROR_Disabled;
dsinclair221caf62016-04-04 12:08:40 -0700240
Dan Sinclair1770c022016-03-14 14:14:16 -0400241 CXFA_Script script = calc.GetScript();
242 return pWidgetAcc->ExecuteScript(script, pParam);
243 }
244 default:
245 break;
246 }
247 int32_t iRet =
248 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
249 return iRet;
250}
dsinclair221caf62016-04-04 12:08:40 -0700251
dsinclairdf4bc592016-03-31 20:34:43 -0700252CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
253 XFA_WIDGETTYPE eType,
254 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400255 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700256 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400257 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700258 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400259 CXFA_Node* pNewFormItem =
260 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
dsinclair221caf62016-04-04 12:08:40 -0700261 if (!pNewFormItem)
262 return nullptr;
263
dsinclairc5a8f212016-06-20 11:11:12 -0700264 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NodeFlag_Initialized, true);
265 pNewFormItem->SetFlag(XFA_NodeFlag_Initialized, true);
Dan Sinclair1770c022016-03-14 14:14:16 -0400266 m_pDocView->RunLayout();
267 CXFA_LayoutItem* pLayout =
268 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
tsepez20d6b762016-06-09 11:46:16 -0700269 return static_cast<CXFA_FFWidget*>(pLayout);
Dan Sinclair1770c022016-03-14 14:14:16 -0400270}
dsinclair221caf62016-04-04 12:08:40 -0700271
Dan Sinclair1770c022016-03-14 14:14:16 -0400272CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
273 XFA_WIDGETTYPE eType,
274 CXFA_Node* pParent,
275 CXFA_Node* pBefore) const {
276 switch (eType) {
277 case XFA_WIDGETTYPE_Barcode:
dsinclair221caf62016-04-04 12:08:40 -0700278 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400279 case XFA_WIDGETTYPE_PushButton:
280 return CreatePushButton(pParent, pBefore);
281 case XFA_WIDGETTYPE_CheckButton:
282 return CreateCheckButton(pParent, pBefore);
283 case XFA_WIDGETTYPE_ExcludeGroup:
284 return CreateExclGroup(pParent, pBefore);
285 case XFA_WIDGETTYPE_RadioButton:
286 return CreateRadioButton(pParent, pBefore);
287 case XFA_WIDGETTYPE_Arc:
288 return CreateArc(pParent, pBefore);
289 case XFA_WIDGETTYPE_Rectangle:
290 return CreateRectangle(pParent, pBefore);
291 case XFA_WIDGETTYPE_Image:
292 return CreateImage(pParent, pBefore);
293 case XFA_WIDGETTYPE_Line:
294 return CreateLine(pParent, pBefore);
295 case XFA_WIDGETTYPE_Text:
296 return CreateText(pParent, pBefore);
297 case XFA_WIDGETTYPE_DatetimeEdit:
298 return CreateDatetimeEdit(pParent, pBefore);
299 case XFA_WIDGETTYPE_DecimalField:
300 return CreateDecimalField(pParent, pBefore);
301 case XFA_WIDGETTYPE_NumericField:
302 return CreateNumericField(pParent, pBefore);
303 case XFA_WIDGETTYPE_Signature:
304 return CreateSignature(pParent, pBefore);
305 case XFA_WIDGETTYPE_TextEdit:
306 return CreateTextEdit(pParent, pBefore);
307 case XFA_WIDGETTYPE_DropdownList:
308 return CreateDropdownList(pParent, pBefore);
309 case XFA_WIDGETTYPE_ListBox:
310 return CreateListBox(pParent, pBefore);
311 case XFA_WIDGETTYPE_ImageField:
312 return CreateImageField(pParent, pBefore);
313 case XFA_WIDGETTYPE_PasswordEdit:
314 return CreatePasswordEdit(pParent, pBefore);
315 case XFA_WIDGETTYPE_Subform:
316 return CreateSubform(pParent, pBefore);
317 default:
dsinclair221caf62016-04-04 12:08:40 -0700318 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400319 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400320}
dsinclair221caf62016-04-04 12:08:40 -0700321
Dan Sinclair1770c022016-03-14 14:14:16 -0400322CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
323 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700324 CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore);
325 CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField);
326 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption);
327 CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue);
tsepezafe94302016-05-13 17:21:31 -0700328 pText->SetContent(L"Button", L"Button", FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700329
dsinclair56a8b192016-06-21 14:15:25 -0700330 CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption);
Dan Sinclair1770c022016-03-14 14:14:16 -0400331 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
332 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
333 CreateFontNode(pCaption);
dsinclair221caf62016-04-04 12:08:40 -0700334
dsinclair56a8b192016-06-21 14:15:25 -0700335 CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400336 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700337
dsinclair56a8b192016-06-21 14:15:25 -0700338 CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder);
Dan Sinclair1770c022016-03-14 14:14:16 -0400339 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700340
dsinclair56a8b192016-06-21 14:15:25 -0700341 CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder);
342 CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill);
tsepezafe94302016-05-13 17:21:31 -0700343 pColor->SetCData(XFA_ATTRIBUTE_Value, L"212, 208, 200", FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700344
dsinclair56a8b192016-06-21 14:15:25 -0700345 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400346 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
dsinclair221caf62016-04-04 12:08:40 -0700347
Dan Sinclair1770c022016-03-14 14:14:16 -0400348 return pField;
349}
dsinclair221caf62016-04-04 12:08:40 -0700350
Dan Sinclair1770c022016-03-14 14:14:16 -0400351CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
352 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700353 return CreateField(XFA_Element::CheckButton, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400354}
dsinclair221caf62016-04-04 12:08:40 -0700355
Dan Sinclair1770c022016-03-14 14:14:16 -0400356CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
357 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700358 return CreateFormItem(XFA_Element::ExclGroup, 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::CreateRadioButton(CXFA_Node* pParent,
362 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700363 CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore);
364 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_Element::Ui);
365 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_Element::CheckButton);
Dan Sinclair1770c022016-03-14 14:14:16 -0400366 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
367 return pField;
368}
dsinclair221caf62016-04-04 12:08:40 -0700369
Dan Sinclair1770c022016-03-14 14:14:16 -0400370CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
371 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700372 CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore);
373 CreateValueNode(XFA_Element::Date, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400374 return pField;
375}
dsinclair221caf62016-04-04 12:08:40 -0700376
Dan Sinclair1770c022016-03-14 14:14:16 -0400377CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
378 CXFA_Node* pBefore) const {
379 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
dsinclair56a8b192016-06-21 14:15:25 -0700380 CreateValueNode(XFA_Element::Decimal, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400381 return pField;
382}
dsinclair221caf62016-04-04 12:08:40 -0700383
Dan Sinclair1770c022016-03-14 14:14:16 -0400384CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
385 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700386 return CreateField(XFA_Element::NumericEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400387}
dsinclair221caf62016-04-04 12:08:40 -0700388
Dan Sinclair1770c022016-03-14 14:14:16 -0400389CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
390 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700391 return CreateField(XFA_Element::Signature, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400392}
dsinclair221caf62016-04-04 12:08:40 -0700393
Dan Sinclair1770c022016-03-14 14:14:16 -0400394CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
395 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700396 return CreateField(XFA_Element::TextEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400397}
dsinclair221caf62016-04-04 12:08:40 -0700398
Dan Sinclair1770c022016-03-14 14:14:16 -0400399CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
400 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700401 return CreateField(XFA_Element::ChoiceList, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400402}
dsinclair221caf62016-04-04 12:08:40 -0700403
Dan Sinclair1770c022016-03-14 14:14:16 -0400404CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
405 CXFA_Node* pBefore) const {
406 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
407 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
408 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
409 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
410 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
411 return pField;
412}
dsinclair221caf62016-04-04 12:08:40 -0700413
Dan Sinclair1770c022016-03-14 14:14:16 -0400414CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
415 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700416 return CreateField(XFA_Element::ImageEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400417}
dsinclair221caf62016-04-04 12:08:40 -0700418
Dan Sinclair1770c022016-03-14 14:14:16 -0400419CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
420 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700421 CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore);
422 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400423 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
424 return pField;
425}
dsinclair221caf62016-04-04 12:08:40 -0700426
dsinclair56a8b192016-06-21 14:15:25 -0700427CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400428 CXFA_Node* pParent,
429 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700430 CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore);
431 CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400432 CreateFontNode(pField);
433 return pField;
434}
dsinclair221caf62016-04-04 12:08:40 -0700435
Dan Sinclair1770c022016-03-14 14:14:16 -0400436CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
437 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700438 return CreateDraw(XFA_Element::Arc, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400439}
dsinclair221caf62016-04-04 12:08:40 -0700440
Dan Sinclair1770c022016-03-14 14:14:16 -0400441CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
442 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700443 return CreateDraw(XFA_Element::Rectangle, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400444}
dsinclair221caf62016-04-04 12:08:40 -0700445
Dan Sinclair1770c022016-03-14 14:14:16 -0400446CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
447 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700448 CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore);
449 CreateCopyNode(XFA_Element::ImageEdit,
450 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400451 return pField;
452}
dsinclair221caf62016-04-04 12:08:40 -0700453
Dan Sinclair1770c022016-03-14 14:14:16 -0400454CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
455 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700456 return CreateDraw(XFA_Element::Line, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400457}
dsinclair221caf62016-04-04 12:08:40 -0700458
Dan Sinclair1770c022016-03-14 14:14:16 -0400459CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
460 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700461 CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore);
462 CreateCopyNode(XFA_Element::TextEdit,
463 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400464 CreateFontNode(pField);
465 return pField;
466}
dsinclair221caf62016-04-04 12:08:40 -0700467
dsinclair56a8b192016-06-21 14:15:25 -0700468CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400469 CXFA_Node* pParent,
470 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700471 CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400472 CreateValueNode(eElement, pDraw);
473 return pDraw;
474}
dsinclair221caf62016-04-04 12:08:40 -0700475
Dan Sinclair1770c022016-03-14 14:14:16 -0400476CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
477 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700478 return CreateFormItem(XFA_Element::Subform, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400479}
dsinclair221caf62016-04-04 12:08:40 -0700480
dsinclair56a8b192016-06-21 14:15:25 -0700481CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400482 CXFA_Node* pParent,
483 CXFA_Node* pBefore) const {
484 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
485 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
486 if (pParent)
487 pParent->InsertChild(pNewFormItem, pBefore);
488 return pNewFormItem;
489}
dsinclair221caf62016-04-04 12:08:40 -0700490
dsinclair56a8b192016-06-21 14:15:25 -0700491CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400492 CXFA_Node* pParent,
493 CXFA_Node* pBefore) const {
494 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
495 CXFA_Node* pNewNode =
496 CreateTemplateNode(eElement, pTemplateParent,
497 pBefore ? pBefore->GetTemplateNode() : NULL)
498 ->Clone(FALSE);
499 if (pParent)
500 pParent->InsertChild(pNewNode, pBefore);
501 return pNewNode;
502}
dsinclair221caf62016-04-04 12:08:40 -0700503
dsinclair56a8b192016-06-21 14:15:25 -0700504CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400505 CXFA_Node* pParent,
506 CXFA_Node* pBefore) const {
507 CXFA_Document* pXFADoc = GetXFADoc();
508 CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(
509 XFA_XDPPACKET_Template, eElement);
510 if (pParent)
511 pParent->InsertChild(pNewTemplateNode, pBefore);
512 return pNewTemplateNode;
513}
dsinclair221caf62016-04-04 12:08:40 -0700514
Dan Sinclair1770c022016-03-14 14:14:16 -0400515CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700516 CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent);
tsepezafe94302016-05-13 17:21:31 -0700517 pFont->SetCData(XFA_ATTRIBUTE_Typeface, L"Myriad Pro", FALSE);
Dan Sinclair1770c022016-03-14 14:14:16 -0400518 return pFont;
519}
dsinclair221caf62016-04-04 12:08:40 -0700520
Dan Sinclair1770c022016-03-14 14:14:16 -0400521CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700522 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400523 FX_FLOAT fInsets[4]) const {
dsinclair56a8b192016-06-21 14:15:25 -0700524 CXFA_Node* pMargin = CreateCopyNode(XFA_Element::Margin, pParent);
dsinclair221caf62016-04-04 12:08:40 -0700525 if (dwFlags & 0x01)
Dan Sinclair1770c022016-03-14 14:14:16 -0400526 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
527 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700528 if (dwFlags & 0x02)
Dan Sinclair1770c022016-03-14 14:14:16 -0400529 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
530 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700531 if (dwFlags & 0x04)
Dan Sinclair1770c022016-03-14 14:14:16 -0400532 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
533 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700534 if (dwFlags & 0x08)
Dan Sinclair1770c022016-03-14 14:14:16 -0400535 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
536 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
Dan Sinclair1770c022016-03-14 14:14:16 -0400537 return pMargin;
538}
dsinclair221caf62016-04-04 12:08:40 -0700539
dsinclair56a8b192016-06-21 14:15:25 -0700540CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue,
Dan Sinclair1770c022016-03-14 14:14:16 -0400541 CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700542 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent);
Dan Sinclair1770c022016-03-14 14:14:16 -0400543 CreateCopyNode(eValue, pValue);
544 return pValue;
545}
dsinclair221caf62016-04-04 12:08:40 -0700546
dsinclairdf4bc592016-03-31 20:34:43 -0700547CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
Dan Sinclair1770c022016-03-14 14:14:16 -0400548 return GetXFADoc()->GetParser()->GetFactory();
549}
dsinclair221caf62016-04-04 12:08:40 -0700550
Dan Sinclair1770c022016-03-14 14:14:16 -0400551CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
tsepez20d6b762016-06-09 11:46:16 -0700552 return m_pDocView->GetDoc()->GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400553}
dsinclairdf4bc592016-03-31 20:34:43 -0700554