blob: b4d268920cd6eee35da8fc94d26dc2457e413c2f [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)) {
50 ((CXFA_FFDoc*)m_pDocView->GetDoc())
51 ->GetDocProvider()
dsinclairdf4bc592016-03-31 20:34:43 -070052 ->SetFocusWidget(m_pDocView->GetDoc(), (CXFA_FFWidget*)hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040053 }
54 m_pDocView->UnlockUpdate();
55 m_pDocView->UpdateDocView();
56 return bRet;
57}
dsinclair221caf62016-04-04 12:08:40 -070058
dsinclairdf4bc592016-03-31 20:34:43 -070059FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070060 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040061 FX_FLOAT fx,
62 FX_FLOAT fy) {
63 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070064 hWidget->Rotate2Normal(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040065 m_pDocView->m_bLayoutEvent = TRUE;
dsinclairdf4bc592016-03-31 20:34:43 -070066 FX_BOOL bRet = hWidget->OnLButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040067 m_pDocView->UnlockUpdate();
68 m_pDocView->UpdateDocView();
69 return bRet;
70}
dsinclair221caf62016-04-04 12:08:40 -070071
dsinclairdf4bc592016-03-31 20:34:43 -070072FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070073 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040074 FX_FLOAT fx,
75 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070076 hWidget->Rotate2Normal(fx, fy);
77 FX_BOOL bRet = hWidget->OnLButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040078 m_pDocView->RunInvalidate();
79 return bRet;
80}
dsinclair221caf62016-04-04 12:08:40 -070081
dsinclairdf4bc592016-03-31 20:34:43 -070082FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070083 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040084 FX_FLOAT fx,
85 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070086 hWidget->Rotate2Normal(fx, fy);
87 FX_BOOL bRet = hWidget->OnMouseMove(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040088 m_pDocView->RunInvalidate();
89 return bRet;
90}
dsinclair221caf62016-04-04 12:08:40 -070091
dsinclairdf4bc592016-03-31 20:34:43 -070092FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070093 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040094 int16_t zDelta,
95 FX_FLOAT fx,
96 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070097 hWidget->Rotate2Normal(fx, fy);
98 FX_BOOL bRet = hWidget->OnMouseWheel(dwFlags, zDelta, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040099 m_pDocView->RunInvalidate();
100 return bRet;
101}
dsinclair221caf62016-04-04 12:08:40 -0700102
dsinclairdf4bc592016-03-31 20:34:43 -0700103FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700104 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400105 FX_FLOAT fx,
106 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700107 hWidget->Rotate2Normal(fx, fy);
108 FX_BOOL bRet = hWidget->OnRButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400109 if (bRet && m_pDocView->SetFocus(hWidget)) {
110 ((CXFA_FFDoc*)m_pDocView->GetDoc())
111 ->GetDocProvider()
dsinclairdf4bc592016-03-31 20:34:43 -0700112 ->SetFocusWidget(m_pDocView->GetDoc(), (CXFA_FFWidget*)hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -0400113 }
114 m_pDocView->RunInvalidate();
115 return bRet;
116}
dsinclair221caf62016-04-04 12:08:40 -0700117
dsinclairdf4bc592016-03-31 20:34:43 -0700118FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700119 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400120 FX_FLOAT fx,
121 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700122 hWidget->Rotate2Normal(fx, fy);
123 FX_BOOL bRet = hWidget->OnRButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400124 m_pDocView->RunInvalidate();
125 return bRet;
126}
dsinclair221caf62016-04-04 12:08:40 -0700127
dsinclairdf4bc592016-03-31 20:34:43 -0700128FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700129 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400130 FX_FLOAT fx,
131 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700132 hWidget->Rotate2Normal(fx, fy);
133 FX_BOOL bRet = hWidget->OnRButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400134 m_pDocView->RunInvalidate();
135 return bRet;
136}
dsinclair221caf62016-04-04 12:08:40 -0700137
dsinclairdf4bc592016-03-31 20:34:43 -0700138FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700139 uint32_t dwKeyCode,
140 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700141 FX_BOOL bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400142 m_pDocView->RunInvalidate();
143 m_pDocView->UpdateDocView();
144 return bRet;
145}
dsinclair221caf62016-04-04 12:08:40 -0700146
dsinclairdf4bc592016-03-31 20:34:43 -0700147FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700148 uint32_t dwKeyCode,
149 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700150 FX_BOOL bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400151 m_pDocView->RunInvalidate();
152 return bRet;
153}
dsinclair221caf62016-04-04 12:08:40 -0700154
dsinclairdf4bc592016-03-31 20:34:43 -0700155FX_BOOL CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700156 uint32_t dwChar,
157 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700158 FX_BOOL bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400159 m_pDocView->RunInvalidate();
160 return bRet;
161}
dsinclair221caf62016-04-04 12:08:40 -0700162
dsinclairdf4bc592016-03-31 20:34:43 -0700163uint32_t CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400164 FX_FLOAT fx,
165 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700166 if (!(hWidget->GetStatus() & XFA_WIDGETSTATUS_Visible))
Dan Sinclair1770c022016-03-14 14:14:16 -0400167 return FWL_WGTHITTEST_Unknown;
dsinclairdf4bc592016-03-31 20:34:43 -0700168
169 hWidget->Rotate2Normal(fx, fy);
170 return hWidget->OnHitTest(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400171}
dsinclair221caf62016-04-04 12:08:40 -0700172
dsinclairdf4bc592016-03-31 20:34:43 -0700173FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400174 FX_FLOAT fx,
175 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700176 hWidget->Rotate2Normal(fx, fy);
177 return hWidget->OnSetCursor(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400178}
dsinclair221caf62016-04-04 12:08:40 -0700179
dsinclairdf4bc592016-03-31 20:34:43 -0700180void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400181 CFX_Graphics* pGS,
182 CFX_Matrix* pMatrix,
183 FX_BOOL bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700184 hWidget->RenderWidget(pGS, pMatrix,
185 bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400186}
dsinclair221caf62016-04-04 12:08:40 -0700187
Dan Sinclair1770c022016-03-14 14:14:16 -0400188FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
189 XFA_EVENTTYPE eEventType) {
dsinclair221caf62016-04-04 12:08:40 -0700190 if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400191 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700192 if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400193 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700194
Dan Sinclair1770c022016-03-14 14:14:16 -0400195 switch (eEventType) {
196 case XFA_EVENT_Calculate: {
197 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700198 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400199 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700200 if (calc.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400201 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400202 return FALSE;
203 }
204 case XFA_EVENT_Validate: {
205 CXFA_Validate val = pWidgetAcc->GetValidate();
dsinclair221caf62016-04-04 12:08:40 -0700206 if (!val)
Dan Sinclair1770c022016-03-14 14:14:16 -0400207 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700208 if (val.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400209 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400210 return FALSE;
211 }
212 default:
213 break;
214 }
215 CXFA_NodeArray eventArray;
216 return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
217 eventArray);
218}
dsinclair221caf62016-04-04 12:08:40 -0700219
Dan Sinclair1770c022016-03-14 14:14:16 -0400220int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
221 CXFA_EventParam* pParam) {
dsinclair221caf62016-04-04 12:08:40 -0700222 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400223 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700224 if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400225 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700226
Dan Sinclair1770c022016-03-14 14:14:16 -0400227 switch (pParam->m_eType) {
228 case XFA_EVENT_Calculate:
229 return pWidgetAcc->ProcessCalculate();
230 case XFA_EVENT_Validate:
231 if (((CXFA_FFDoc*)m_pDocView->GetDoc())
232 ->GetDocProvider()
233 ->IsValidationsEnabled(m_pDocView->GetDoc())) {
234 return pWidgetAcc->ProcessValidate();
235 }
236 return XFA_EVENTERROR_Disabled;
237 case XFA_EVENT_InitCalculate: {
238 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700239 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400240 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700241 if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive))
Dan Sinclair1770c022016-03-14 14:14:16 -0400242 return XFA_EVENTERROR_Disabled;
dsinclair221caf62016-04-04 12:08:40 -0700243
Dan Sinclair1770c022016-03-14 14:14:16 -0400244 CXFA_Script script = calc.GetScript();
245 return pWidgetAcc->ExecuteScript(script, pParam);
246 }
247 default:
248 break;
249 }
250 int32_t iRet =
251 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
252 return iRet;
253}
dsinclair221caf62016-04-04 12:08:40 -0700254
dsinclairdf4bc592016-03-31 20:34:43 -0700255CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
256 XFA_WIDGETTYPE eType,
257 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400258 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700259 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400260 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700261 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400262 CXFA_Node* pNewFormItem =
263 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
dsinclair221caf62016-04-04 12:08:40 -0700264 if (!pNewFormItem)
265 return nullptr;
266
Dan Sinclair1770c022016-03-14 14:14:16 -0400267 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized);
268 pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized);
269 m_pDocView->RunLayout();
270 CXFA_LayoutItem* pLayout =
271 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
dsinclairdf4bc592016-03-31 20:34:43 -0700272 return (CXFA_FFWidget*)pLayout;
Dan Sinclair1770c022016-03-14 14:14:16 -0400273}
dsinclair221caf62016-04-04 12:08:40 -0700274
Dan Sinclair1770c022016-03-14 14:14:16 -0400275CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
276 XFA_WIDGETTYPE eType,
277 CXFA_Node* pParent,
278 CXFA_Node* pBefore) const {
279 switch (eType) {
280 case XFA_WIDGETTYPE_Barcode:
dsinclair221caf62016-04-04 12:08:40 -0700281 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400282 case XFA_WIDGETTYPE_PushButton:
283 return CreatePushButton(pParent, pBefore);
284 case XFA_WIDGETTYPE_CheckButton:
285 return CreateCheckButton(pParent, pBefore);
286 case XFA_WIDGETTYPE_ExcludeGroup:
287 return CreateExclGroup(pParent, pBefore);
288 case XFA_WIDGETTYPE_RadioButton:
289 return CreateRadioButton(pParent, pBefore);
290 case XFA_WIDGETTYPE_Arc:
291 return CreateArc(pParent, pBefore);
292 case XFA_WIDGETTYPE_Rectangle:
293 return CreateRectangle(pParent, pBefore);
294 case XFA_WIDGETTYPE_Image:
295 return CreateImage(pParent, pBefore);
296 case XFA_WIDGETTYPE_Line:
297 return CreateLine(pParent, pBefore);
298 case XFA_WIDGETTYPE_Text:
299 return CreateText(pParent, pBefore);
300 case XFA_WIDGETTYPE_DatetimeEdit:
301 return CreateDatetimeEdit(pParent, pBefore);
302 case XFA_WIDGETTYPE_DecimalField:
303 return CreateDecimalField(pParent, pBefore);
304 case XFA_WIDGETTYPE_NumericField:
305 return CreateNumericField(pParent, pBefore);
306 case XFA_WIDGETTYPE_Signature:
307 return CreateSignature(pParent, pBefore);
308 case XFA_WIDGETTYPE_TextEdit:
309 return CreateTextEdit(pParent, pBefore);
310 case XFA_WIDGETTYPE_DropdownList:
311 return CreateDropdownList(pParent, pBefore);
312 case XFA_WIDGETTYPE_ListBox:
313 return CreateListBox(pParent, pBefore);
314 case XFA_WIDGETTYPE_ImageField:
315 return CreateImageField(pParent, pBefore);
316 case XFA_WIDGETTYPE_PasswordEdit:
317 return CreatePasswordEdit(pParent, pBefore);
318 case XFA_WIDGETTYPE_Subform:
319 return CreateSubform(pParent, pBefore);
320 default:
dsinclair221caf62016-04-04 12:08:40 -0700321 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400322 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400323}
dsinclair221caf62016-04-04 12:08:40 -0700324
Dan Sinclair1770c022016-03-14 14:14:16 -0400325CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
326 CXFA_Node* pBefore) const {
327 CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore);
328 CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField);
329 CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption);
330 CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue);
331 pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700332
Dan Sinclair1770c022016-03-14 14:14:16 -0400333 CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption);
334 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
335 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
336 CreateFontNode(pCaption);
dsinclair221caf62016-04-04 12:08:40 -0700337
Dan Sinclair1770c022016-03-14 14:14:16 -0400338 CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField);
339 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700340
Dan Sinclair1770c022016-03-14 14:14:16 -0400341 CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder);
342 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700343
Dan Sinclair1770c022016-03-14 14:14:16 -0400344 CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder);
345 CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill);
346 pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700347
Dan Sinclair1770c022016-03-14 14:14:16 -0400348 CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
349 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
dsinclair221caf62016-04-04 12:08:40 -0700350
Dan Sinclair1770c022016-03-14 14:14:16 -0400351 return pField;
352}
dsinclair221caf62016-04-04 12:08:40 -0700353
Dan Sinclair1770c022016-03-14 14:14:16 -0400354CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
355 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700356 return CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400357}
dsinclair221caf62016-04-04 12:08:40 -0700358
Dan Sinclair1770c022016-03-14 14:14:16 -0400359CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
360 CXFA_Node* pBefore) const {
361 return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore);
362}
dsinclair221caf62016-04-04 12:08:40 -0700363
Dan Sinclair1770c022016-03-14 14:14:16 -0400364CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
365 CXFA_Node* pBefore) const {
366 CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
367 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui);
368 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton);
369 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
370 return pField;
371}
dsinclair221caf62016-04-04 12:08:40 -0700372
Dan Sinclair1770c022016-03-14 14:14:16 -0400373CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
374 CXFA_Node* pBefore) const {
375 CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore);
376 CreateValueNode(XFA_ELEMENT_Date, pField);
377 return pField;
378}
dsinclair221caf62016-04-04 12:08:40 -0700379
Dan Sinclair1770c022016-03-14 14:14:16 -0400380CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
381 CXFA_Node* pBefore) const {
382 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
383 CreateValueNode(XFA_ELEMENT_Decimal, pField);
384 return pField;
385}
dsinclair221caf62016-04-04 12:08:40 -0700386
Dan Sinclair1770c022016-03-14 14:14:16 -0400387CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
388 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700389 return CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400390}
dsinclair221caf62016-04-04 12:08:40 -0700391
Dan Sinclair1770c022016-03-14 14:14:16 -0400392CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
393 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700394 return CreateField(XFA_ELEMENT_Signature, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400395}
dsinclair221caf62016-04-04 12:08:40 -0700396
Dan Sinclair1770c022016-03-14 14:14:16 -0400397CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
398 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700399 return CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400400}
dsinclair221caf62016-04-04 12:08:40 -0700401
Dan Sinclair1770c022016-03-14 14:14:16 -0400402CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
403 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700404 return CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400405}
dsinclair221caf62016-04-04 12:08:40 -0700406
Dan Sinclair1770c022016-03-14 14:14:16 -0400407CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
408 CXFA_Node* pBefore) const {
409 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
410 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
411 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
412 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
413 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
414 return pField;
415}
dsinclair221caf62016-04-04 12:08:40 -0700416
Dan Sinclair1770c022016-03-14 14:14:16 -0400417CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
418 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700419 return CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400420}
dsinclair221caf62016-04-04 12:08:40 -0700421
Dan Sinclair1770c022016-03-14 14:14:16 -0400422CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
423 CXFA_Node* pBefore) const {
424 CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore);
425 CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
426 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
427 return pField;
428}
dsinclair221caf62016-04-04 12:08:40 -0700429
Dan Sinclair1770c022016-03-14 14:14:16 -0400430CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement,
431 CXFA_Node* pParent,
432 CXFA_Node* pBefore) const {
433 CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore);
434 CreateCopyNode(eElement, CreateCopyNode(XFA_ELEMENT_Ui, pField));
435 CreateFontNode(pField);
436 return pField;
437}
dsinclair221caf62016-04-04 12:08:40 -0700438
Dan Sinclair1770c022016-03-14 14:14:16 -0400439CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
440 CXFA_Node* pBefore) const {
441 return CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore);
442}
dsinclair221caf62016-04-04 12:08:40 -0700443
Dan Sinclair1770c022016-03-14 14:14:16 -0400444CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
445 CXFA_Node* pBefore) const {
446 return CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore);
447}
dsinclair221caf62016-04-04 12:08:40 -0700448
Dan Sinclair1770c022016-03-14 14:14:16 -0400449CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
450 CXFA_Node* pBefore) const {
451 CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore);
452 CreateCopyNode(XFA_ELEMENT_ImageEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
453 return pField;
454}
dsinclair221caf62016-04-04 12:08:40 -0700455
Dan Sinclair1770c022016-03-14 14:14:16 -0400456CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
457 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700458 return CreateDraw(XFA_ELEMENT_Line, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400459}
dsinclair221caf62016-04-04 12:08:40 -0700460
Dan Sinclair1770c022016-03-14 14:14:16 -0400461CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
462 CXFA_Node* pBefore) const {
463 CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore);
464 CreateCopyNode(XFA_ELEMENT_TextEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
465 CreateFontNode(pField);
466 return pField;
467}
dsinclair221caf62016-04-04 12:08:40 -0700468
Dan Sinclair1770c022016-03-14 14:14:16 -0400469CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement,
470 CXFA_Node* pParent,
471 CXFA_Node* pBefore) const {
472 CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore);
473 CreateValueNode(eElement, pDraw);
474 return pDraw;
475}
dsinclair221caf62016-04-04 12:08:40 -0700476
Dan Sinclair1770c022016-03-14 14:14:16 -0400477CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
478 CXFA_Node* pBefore) const {
dsinclair221caf62016-04-04 12:08:40 -0700479 return CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400480}
dsinclair221caf62016-04-04 12:08:40 -0700481
Dan Sinclair1770c022016-03-14 14:14:16 -0400482CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement,
483 CXFA_Node* pParent,
484 CXFA_Node* pBefore) const {
485 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
486 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
487 if (pParent)
488 pParent->InsertChild(pNewFormItem, pBefore);
489 return pNewFormItem;
490}
dsinclair221caf62016-04-04 12:08:40 -0700491
Dan Sinclair1770c022016-03-14 14:14:16 -0400492CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement,
493 CXFA_Node* pParent,
494 CXFA_Node* pBefore) const {
495 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
496 CXFA_Node* pNewNode =
497 CreateTemplateNode(eElement, pTemplateParent,
498 pBefore ? pBefore->GetTemplateNode() : NULL)
499 ->Clone(FALSE);
500 if (pParent)
501 pParent->InsertChild(pNewNode, pBefore);
502 return pNewNode;
503}
dsinclair221caf62016-04-04 12:08:40 -0700504
Dan Sinclair1770c022016-03-14 14:14:16 -0400505CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement,
506 CXFA_Node* pParent,
507 CXFA_Node* pBefore) const {
508 CXFA_Document* pXFADoc = GetXFADoc();
509 CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(
510 XFA_XDPPACKET_Template, eElement);
511 if (pParent)
512 pParent->InsertChild(pNewTemplateNode, pBefore);
513 return pNewTemplateNode;
514}
dsinclair221caf62016-04-04 12:08:40 -0700515
Dan Sinclair1770c022016-03-14 14:14:16 -0400516CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
517 CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent);
518 pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE);
519 return pFont;
520}
dsinclair221caf62016-04-04 12:08:40 -0700521
Dan Sinclair1770c022016-03-14 14:14:16 -0400522CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700523 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400524 FX_FLOAT fInsets[4]) const {
525 CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent);
dsinclair221caf62016-04-04 12:08:40 -0700526 if (dwFlags & 0x01)
Dan Sinclair1770c022016-03-14 14:14:16 -0400527 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
528 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700529 if (dwFlags & 0x02)
Dan Sinclair1770c022016-03-14 14:14:16 -0400530 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
531 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700532 if (dwFlags & 0x04)
Dan Sinclair1770c022016-03-14 14:14:16 -0400533 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
534 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700535 if (dwFlags & 0x08)
Dan Sinclair1770c022016-03-14 14:14:16 -0400536 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
537 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
Dan Sinclair1770c022016-03-14 14:14:16 -0400538 return pMargin;
539}
dsinclair221caf62016-04-04 12:08:40 -0700540
Dan Sinclair1770c022016-03-14 14:14:16 -0400541CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue,
542 CXFA_Node* pParent) const {
543 CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent);
544 CreateCopyNode(eValue, pValue);
545 return pValue;
546}
dsinclair221caf62016-04-04 12:08:40 -0700547
dsinclairdf4bc592016-03-31 20:34:43 -0700548CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
Dan Sinclair1770c022016-03-14 14:14:16 -0400549 return GetXFADoc()->GetParser()->GetFactory();
550}
dsinclair221caf62016-04-04 12:08:40 -0700551
Dan Sinclair1770c022016-03-14 14:14:16 -0400552CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
553 return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc();
554}
dsinclairdf4bc592016-03-31 20:34:43 -0700555