blob: 854b1ac384d424cbb15f90b0b23fc14959434158 [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
dsinclair5b493092016-09-29 20:20:24 -07007#include "xfa/fxfa/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"
dsinclair0b851ff2016-07-21 12:03:01 -070014#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
dsinclair9eb0db12016-07-21 12:01:39 -070015#include "xfa/fxfa/parser/cxfa_measurement.h"
dsinclair5b493092016-09-29 20:20:24 -070016#include "xfa/fxfa/xfa_ffdoc.h"
17#include "xfa/fxfa/xfa_ffdocview.h"
18#include "xfa/fxfa/xfa_ffwidget.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
dsinclairdf4bc592016-03-31 20:34:43 -070025FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040026 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070027 FX_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
dsinclairdf4bc592016-03-31 20:34:43 -070033FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040034 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070035 FX_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
dsinclairdf4bc592016-03-31 20:34:43 -070041FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070042 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040043 FX_FLOAT fx,
44 FX_FLOAT fy) {
45 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070046 hWidget->Rotate2Normal(fx, fy);
47 FX_BOOL bRet = hWidget->OnLButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040048 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -070049 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
50 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040051 }
52 m_pDocView->UnlockUpdate();
53 m_pDocView->UpdateDocView();
54 return bRet;
55}
dsinclair221caf62016-04-04 12:08:40 -070056
dsinclairdf4bc592016-03-31 20:34:43 -070057FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070058 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040059 FX_FLOAT fx,
60 FX_FLOAT fy) {
61 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070062 hWidget->Rotate2Normal(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040063 m_pDocView->m_bLayoutEvent = TRUE;
dsinclairdf4bc592016-03-31 20:34:43 -070064 FX_BOOL bRet = hWidget->OnLButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040065 m_pDocView->UnlockUpdate();
66 m_pDocView->UpdateDocView();
67 return bRet;
68}
dsinclair221caf62016-04-04 12:08:40 -070069
dsinclairdf4bc592016-03-31 20:34:43 -070070FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070071 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040072 FX_FLOAT fx,
73 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070074 hWidget->Rotate2Normal(fx, fy);
75 FX_BOOL bRet = hWidget->OnLButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040076 m_pDocView->RunInvalidate();
77 return bRet;
78}
dsinclair221caf62016-04-04 12:08:40 -070079
dsinclairdf4bc592016-03-31 20:34:43 -070080FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070081 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040082 FX_FLOAT fx,
83 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070084 hWidget->Rotate2Normal(fx, fy);
85 FX_BOOL bRet = hWidget->OnMouseMove(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040086 m_pDocView->RunInvalidate();
87 return bRet;
88}
dsinclair221caf62016-04-04 12:08:40 -070089
dsinclairdf4bc592016-03-31 20:34:43 -070090FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070091 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040092 int16_t zDelta,
93 FX_FLOAT fx,
94 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -070095 hWidget->Rotate2Normal(fx, fy);
96 FX_BOOL bRet = hWidget->OnMouseWheel(dwFlags, zDelta, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040097 m_pDocView->RunInvalidate();
98 return bRet;
99}
dsinclair221caf62016-04-04 12:08:40 -0700100
dsinclairdf4bc592016-03-31 20:34:43 -0700101FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700102 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400103 FX_FLOAT fx,
104 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700105 hWidget->Rotate2Normal(fx, fy);
106 FX_BOOL bRet = hWidget->OnRButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400107 if (bRet && m_pDocView->SetFocus(hWidget)) {
dsinclaira440bb32016-09-14 07:01:54 -0700108 m_pDocView->GetDoc()->GetDocEnvironment()->SetFocusWidget(
109 m_pDocView->GetDoc(), hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -0400110 }
111 m_pDocView->RunInvalidate();
112 return bRet;
113}
dsinclair221caf62016-04-04 12:08:40 -0700114
dsinclairdf4bc592016-03-31 20:34:43 -0700115FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700116 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400117 FX_FLOAT fx,
118 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700119 hWidget->Rotate2Normal(fx, fy);
120 FX_BOOL bRet = hWidget->OnRButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400121 m_pDocView->RunInvalidate();
122 return bRet;
123}
dsinclair221caf62016-04-04 12:08:40 -0700124
dsinclairdf4bc592016-03-31 20:34:43 -0700125FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700126 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400127 FX_FLOAT fx,
128 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700129 hWidget->Rotate2Normal(fx, fy);
130 FX_BOOL bRet = hWidget->OnRButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400131 m_pDocView->RunInvalidate();
132 return bRet;
133}
dsinclair221caf62016-04-04 12:08:40 -0700134
dsinclairdf4bc592016-03-31 20:34:43 -0700135FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700136 uint32_t dwKeyCode,
137 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700138 FX_BOOL bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400139 m_pDocView->RunInvalidate();
140 m_pDocView->UpdateDocView();
141 return bRet;
142}
dsinclair221caf62016-04-04 12:08:40 -0700143
dsinclairdf4bc592016-03-31 20:34:43 -0700144FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700145 uint32_t dwKeyCode,
146 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700147 FX_BOOL bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400148 m_pDocView->RunInvalidate();
149 return bRet;
150}
dsinclair221caf62016-04-04 12:08:40 -0700151
dsinclairdf4bc592016-03-31 20:34:43 -0700152FX_BOOL CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700153 uint32_t dwChar,
154 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700155 FX_BOOL bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400156 m_pDocView->RunInvalidate();
157 return bRet;
158}
dsinclair221caf62016-04-04 12:08:40 -0700159
dsinclair89fcde82016-05-03 13:00:25 -0700160FWL_WidgetHit CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
161 FX_FLOAT fx,
162 FX_FLOAT fy) {
dsinclair935d8d52016-05-17 10:32:18 -0700163 if (!(hWidget->GetStatus() & XFA_WidgetStatus_Visible))
dsinclair89fcde82016-05-03 13:00:25 -0700164 return FWL_WidgetHit::Unknown;
dsinclairdf4bc592016-03-31 20:34:43 -0700165
166 hWidget->Rotate2Normal(fx, fy);
167 return hWidget->OnHitTest(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400168}
dsinclair221caf62016-04-04 12:08:40 -0700169
dsinclairdf4bc592016-03-31 20:34:43 -0700170FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400171 FX_FLOAT fx,
172 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700173 hWidget->Rotate2Normal(fx, fy);
174 return hWidget->OnSetCursor(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400175}
dsinclair221caf62016-04-04 12:08:40 -0700176
dsinclairdf4bc592016-03-31 20:34:43 -0700177void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400178 CFX_Graphics* pGS,
179 CFX_Matrix* pMatrix,
180 FX_BOOL bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700181 hWidget->RenderWidget(pGS, pMatrix,
dsinclair9d6ca992016-06-16 10:51:56 -0700182 bHighlight ? XFA_WidgetStatus_Highlight : 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400183}
dsinclair221caf62016-04-04 12:08:40 -0700184
Dan Sinclair1770c022016-03-14 14:14:16 -0400185FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
186 XFA_EVENTTYPE eEventType) {
dsinclair221caf62016-04-04 12:08:40 -0700187 if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400188 return FALSE;
dsinclair070fcdf2016-06-22 22:04:54 -0700189 if (pWidgetAcc->GetElementType() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400190 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700191
Dan Sinclair1770c022016-03-14 14:14:16 -0400192 switch (eEventType) {
193 case XFA_EVENT_Calculate: {
194 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700195 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400196 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700197 if (calc.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400198 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400199 return FALSE;
200 }
201 case XFA_EVENT_Validate: {
202 CXFA_Validate val = pWidgetAcc->GetValidate();
dsinclair221caf62016-04-04 12:08:40 -0700203 if (!val)
Dan Sinclair1770c022016-03-14 14:14:16 -0400204 return FALSE;
dsinclair221caf62016-04-04 12:08:40 -0700205 if (val.GetScript())
Dan Sinclair1770c022016-03-14 14:14:16 -0400206 return TRUE;
Dan Sinclair1770c022016-03-14 14:14:16 -0400207 return FALSE;
208 }
209 default:
210 break;
211 }
212 CXFA_NodeArray eventArray;
213 return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
tsepez478ed622016-10-27 14:32:33 -0700214 eventArray) > 0;
Dan Sinclair1770c022016-03-14 14:14:16 -0400215}
dsinclair221caf62016-04-04 12:08:40 -0700216
Dan Sinclair1770c022016-03-14 14:14:16 -0400217int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
218 CXFA_EventParam* pParam) {
dsinclair221caf62016-04-04 12:08:40 -0700219 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
Dan Sinclair1770c022016-03-14 14:14:16 -0400220 return XFA_EVENTERROR_NotExist;
dsinclair070fcdf2016-06-22 22:04:54 -0700221 if (!pWidgetAcc || pWidgetAcc->GetElementType() == XFA_Element::Draw)
Dan Sinclair1770c022016-03-14 14:14:16 -0400222 return XFA_EVENTERROR_NotExist;
dsinclair221caf62016-04-04 12:08:40 -0700223
Dan Sinclair1770c022016-03-14 14:14:16 -0400224 switch (pParam->m_eType) {
225 case XFA_EVENT_Calculate:
226 return pWidgetAcc->ProcessCalculate();
227 case XFA_EVENT_Validate:
dsinclaira440bb32016-09-14 07:01:54 -0700228 if (m_pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled(
tsepez20d6b762016-06-09 11:46:16 -0700229 m_pDocView->GetDoc())) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400230 return pWidgetAcc->ProcessValidate();
231 }
232 return XFA_EVENTERROR_Disabled;
233 case XFA_EVENT_InitCalculate: {
234 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
dsinclair221caf62016-04-04 12:08:40 -0700235 if (!calc)
Dan Sinclair1770c022016-03-14 14:14:16 -0400236 return XFA_EVENTERROR_NotExist;
dsinclairc5a8f212016-06-20 11:11:12 -0700237 if (pWidgetAcc->GetNode()->IsUserInteractive())
Dan Sinclair1770c022016-03-14 14:14:16 -0400238 return XFA_EVENTERROR_Disabled;
dsinclair221caf62016-04-04 12:08:40 -0700239
Dan Sinclair1770c022016-03-14 14:14:16 -0400240 CXFA_Script script = calc.GetScript();
241 return pWidgetAcc->ExecuteScript(script, pParam);
242 }
243 default:
244 break;
245 }
246 int32_t iRet =
247 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
248 return iRet;
249}
dsinclair221caf62016-04-04 12:08:40 -0700250
dsinclairdf4bc592016-03-31 20:34:43 -0700251CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
252 XFA_WIDGETTYPE eType,
253 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400254 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700255 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400256 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700257 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400258 CXFA_Node* pNewFormItem =
259 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
dsinclair221caf62016-04-04 12:08:40 -0700260 if (!pNewFormItem)
261 return nullptr;
262
dsinclairc5a8f212016-06-20 11:11:12 -0700263 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NodeFlag_Initialized, true);
264 pNewFormItem->SetFlag(XFA_NodeFlag_Initialized, true);
Dan Sinclair1770c022016-03-14 14:14:16 -0400265 m_pDocView->RunLayout();
266 CXFA_LayoutItem* pLayout =
267 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
tsepez20d6b762016-06-09 11:46:16 -0700268 return static_cast<CXFA_FFWidget*>(pLayout);
Dan Sinclair1770c022016-03-14 14:14:16 -0400269}
dsinclair221caf62016-04-04 12:08:40 -0700270
Dan Sinclair1770c022016-03-14 14:14:16 -0400271CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
272 XFA_WIDGETTYPE eType,
273 CXFA_Node* pParent,
274 CXFA_Node* pBefore) const {
275 switch (eType) {
276 case XFA_WIDGETTYPE_Barcode:
dsinclair221caf62016-04-04 12:08:40 -0700277 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400278 case XFA_WIDGETTYPE_PushButton:
279 return CreatePushButton(pParent, pBefore);
280 case XFA_WIDGETTYPE_CheckButton:
281 return CreateCheckButton(pParent, pBefore);
282 case XFA_WIDGETTYPE_ExcludeGroup:
283 return CreateExclGroup(pParent, pBefore);
284 case XFA_WIDGETTYPE_RadioButton:
285 return CreateRadioButton(pParent, pBefore);
286 case XFA_WIDGETTYPE_Arc:
287 return CreateArc(pParent, pBefore);
288 case XFA_WIDGETTYPE_Rectangle:
289 return CreateRectangle(pParent, pBefore);
290 case XFA_WIDGETTYPE_Image:
291 return CreateImage(pParent, pBefore);
292 case XFA_WIDGETTYPE_Line:
293 return CreateLine(pParent, pBefore);
294 case XFA_WIDGETTYPE_Text:
295 return CreateText(pParent, pBefore);
296 case XFA_WIDGETTYPE_DatetimeEdit:
297 return CreateDatetimeEdit(pParent, pBefore);
298 case XFA_WIDGETTYPE_DecimalField:
299 return CreateDecimalField(pParent, pBefore);
300 case XFA_WIDGETTYPE_NumericField:
301 return CreateNumericField(pParent, pBefore);
302 case XFA_WIDGETTYPE_Signature:
303 return CreateSignature(pParent, pBefore);
304 case XFA_WIDGETTYPE_TextEdit:
305 return CreateTextEdit(pParent, pBefore);
306 case XFA_WIDGETTYPE_DropdownList:
307 return CreateDropdownList(pParent, pBefore);
308 case XFA_WIDGETTYPE_ListBox:
309 return CreateListBox(pParent, pBefore);
310 case XFA_WIDGETTYPE_ImageField:
311 return CreateImageField(pParent, pBefore);
312 case XFA_WIDGETTYPE_PasswordEdit:
313 return CreatePasswordEdit(pParent, pBefore);
314 case XFA_WIDGETTYPE_Subform:
315 return CreateSubform(pParent, pBefore);
316 default:
dsinclair221caf62016-04-04 12:08:40 -0700317 return nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400318 }
Dan Sinclair1770c022016-03-14 14:14:16 -0400319}
dsinclair221caf62016-04-04 12:08:40 -0700320
Dan Sinclair1770c022016-03-14 14:14:16 -0400321CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
322 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700323 CXFA_Node* pField = CreateField(XFA_Element::Button, pParent, pBefore);
324 CXFA_Node* pCaption = CreateCopyNode(XFA_Element::Caption, pField);
325 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pCaption);
326 CXFA_Node* pText = CreateCopyNode(XFA_Element::Text, pValue);
tsepezafe94302016-05-13 17:21:31 -0700327 pText->SetContent(L"Button", L"Button", FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700328
dsinclair56a8b192016-06-21 14:15:25 -0700329 CXFA_Node* pPara = CreateCopyNode(XFA_Element::Para, pCaption);
Dan Sinclair1770c022016-03-14 14:14:16 -0400330 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
331 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
332 CreateFontNode(pCaption);
dsinclair221caf62016-04-04 12:08:40 -0700333
dsinclair56a8b192016-06-21 14:15:25 -0700334 CXFA_Node* pBorder = CreateCopyNode(XFA_Element::Border, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400335 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700336
dsinclair56a8b192016-06-21 14:15:25 -0700337 CXFA_Node* pEdge = CreateCopyNode(XFA_Element::Edge, pBorder);
Dan Sinclair1770c022016-03-14 14:14:16 -0400338 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700339
dsinclair56a8b192016-06-21 14:15:25 -0700340 CXFA_Node* pFill = CreateCopyNode(XFA_Element::Fill, pBorder);
341 CXFA_Node* pColor = CreateCopyNode(XFA_Element::Color, pFill);
tsepezafe94302016-05-13 17:21:31 -0700342 pColor->SetCData(XFA_ATTRIBUTE_Value, L"212, 208, 200", FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700343
dsinclair56a8b192016-06-21 14:15:25 -0700344 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400345 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
dsinclair221caf62016-04-04 12:08:40 -0700346
Dan Sinclair1770c022016-03-14 14:14:16 -0400347 return pField;
348}
dsinclair221caf62016-04-04 12:08:40 -0700349
Dan Sinclair1770c022016-03-14 14:14:16 -0400350CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
351 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700352 return CreateField(XFA_Element::CheckButton, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400353}
dsinclair221caf62016-04-04 12:08:40 -0700354
Dan Sinclair1770c022016-03-14 14:14:16 -0400355CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
356 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700357 return CreateFormItem(XFA_Element::ExclGroup, 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::CreateRadioButton(CXFA_Node* pParent,
361 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700362 CXFA_Node* pField = CreateField(XFA_Element::CheckButton, pParent, pBefore);
363 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_Element::Ui);
364 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_Element::CheckButton);
Dan Sinclair1770c022016-03-14 14:14:16 -0400365 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
366 return pField;
367}
dsinclair221caf62016-04-04 12:08:40 -0700368
Dan Sinclair1770c022016-03-14 14:14:16 -0400369CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
370 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700371 CXFA_Node* pField = CreateField(XFA_Element::DateTimeEdit, pParent, pBefore);
372 CreateValueNode(XFA_Element::Date, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400373 return pField;
374}
dsinclair221caf62016-04-04 12:08:40 -0700375
Dan Sinclair1770c022016-03-14 14:14:16 -0400376CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
377 CXFA_Node* pBefore) const {
378 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
dsinclair56a8b192016-06-21 14:15:25 -0700379 CreateValueNode(XFA_Element::Decimal, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400380 return pField;
381}
dsinclair221caf62016-04-04 12:08:40 -0700382
Dan Sinclair1770c022016-03-14 14:14:16 -0400383CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
384 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700385 return CreateField(XFA_Element::NumericEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400386}
dsinclair221caf62016-04-04 12:08:40 -0700387
Dan Sinclair1770c022016-03-14 14:14:16 -0400388CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
389 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700390 return CreateField(XFA_Element::Signature, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400391}
dsinclair221caf62016-04-04 12:08:40 -0700392
Dan Sinclair1770c022016-03-14 14:14:16 -0400393CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
394 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700395 return CreateField(XFA_Element::TextEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400396}
dsinclair221caf62016-04-04 12:08:40 -0700397
Dan Sinclair1770c022016-03-14 14:14:16 -0400398CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
399 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700400 return CreateField(XFA_Element::ChoiceList, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400401}
dsinclair221caf62016-04-04 12:08:40 -0700402
Dan Sinclair1770c022016-03-14 14:14:16 -0400403CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
404 CXFA_Node* pBefore) const {
405 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
406 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
407 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
408 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
409 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
410 return pField;
411}
dsinclair221caf62016-04-04 12:08:40 -0700412
Dan Sinclair1770c022016-03-14 14:14:16 -0400413CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
414 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700415 return CreateField(XFA_Element::ImageEdit, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400416}
dsinclair221caf62016-04-04 12:08:40 -0700417
Dan Sinclair1770c022016-03-14 14:14:16 -0400418CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
419 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700420 CXFA_Node* pField = CreateField(XFA_Element::PasswordEdit, pParent, pBefore);
421 CXFA_Node* pBind = CreateCopyNode(XFA_Element::Bind, pField);
Dan Sinclair1770c022016-03-14 14:14:16 -0400422 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
423 return pField;
424}
dsinclair221caf62016-04-04 12:08:40 -0700425
dsinclair56a8b192016-06-21 14:15:25 -0700426CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400427 CXFA_Node* pParent,
428 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700429 CXFA_Node* pField = CreateFormItem(XFA_Element::Field, pParent, pBefore);
430 CreateCopyNode(eElement, CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400431 CreateFontNode(pField);
432 return pField;
433}
dsinclair221caf62016-04-04 12:08:40 -0700434
Dan Sinclair1770c022016-03-14 14:14:16 -0400435CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
436 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700437 return CreateDraw(XFA_Element::Arc, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400438}
dsinclair221caf62016-04-04 12:08:40 -0700439
Dan Sinclair1770c022016-03-14 14:14:16 -0400440CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
441 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700442 return CreateDraw(XFA_Element::Rectangle, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400443}
dsinclair221caf62016-04-04 12:08:40 -0700444
Dan Sinclair1770c022016-03-14 14:14:16 -0400445CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
446 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700447 CXFA_Node* pField = CreateDraw(XFA_Element::Image, pParent, pBefore);
448 CreateCopyNode(XFA_Element::ImageEdit,
449 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400450 return pField;
451}
dsinclair221caf62016-04-04 12:08:40 -0700452
Dan Sinclair1770c022016-03-14 14:14:16 -0400453CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
454 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700455 return CreateDraw(XFA_Element::Line, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400456}
dsinclair221caf62016-04-04 12:08:40 -0700457
Dan Sinclair1770c022016-03-14 14:14:16 -0400458CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
459 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700460 CXFA_Node* pField = CreateDraw(XFA_Element::Text, pParent, pBefore);
461 CreateCopyNode(XFA_Element::TextEdit,
462 CreateCopyNode(XFA_Element::Ui, pField));
Dan Sinclair1770c022016-03-14 14:14:16 -0400463 CreateFontNode(pField);
464 return pField;
465}
dsinclair221caf62016-04-04 12:08:40 -0700466
dsinclair56a8b192016-06-21 14:15:25 -0700467CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400468 CXFA_Node* pParent,
469 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700470 CXFA_Node* pDraw = CreateFormItem(XFA_Element::Draw, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400471 CreateValueNode(eElement, pDraw);
472 return pDraw;
473}
dsinclair221caf62016-04-04 12:08:40 -0700474
Dan Sinclair1770c022016-03-14 14:14:16 -0400475CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
476 CXFA_Node* pBefore) const {
dsinclair56a8b192016-06-21 14:15:25 -0700477 return CreateFormItem(XFA_Element::Subform, pParent, pBefore);
Dan Sinclair1770c022016-03-14 14:14:16 -0400478}
dsinclair221caf62016-04-04 12:08:40 -0700479
dsinclair56a8b192016-06-21 14:15:25 -0700480CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400481 CXFA_Node* pParent,
482 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700483 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400484 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
485 if (pParent)
486 pParent->InsertChild(pNewFormItem, pBefore);
487 return pNewFormItem;
488}
dsinclair221caf62016-04-04 12:08:40 -0700489
dsinclair56a8b192016-06-21 14:15:25 -0700490CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400491 CXFA_Node* pParent,
492 CXFA_Node* pBefore) const {
dsinclair85d1f2c2016-06-23 12:40:16 -0700493 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400494 CXFA_Node* pNewNode =
495 CreateTemplateNode(eElement, pTemplateParent,
dsinclair85d1f2c2016-06-23 12:40:16 -0700496 pBefore ? pBefore->GetTemplateNode() : nullptr)
Dan Sinclair1770c022016-03-14 14:14:16 -0400497 ->Clone(FALSE);
498 if (pParent)
499 pParent->InsertChild(pNewNode, pBefore);
500 return pNewNode;
501}
dsinclair221caf62016-04-04 12:08:40 -0700502
dsinclair56a8b192016-06-21 14:15:25 -0700503CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_Element eElement,
Dan Sinclair1770c022016-03-14 14:14:16 -0400504 CXFA_Node* pParent,
505 CXFA_Node* pBefore) const {
506 CXFA_Document* pXFADoc = GetXFADoc();
dsinclaira1b07722016-07-11 08:20:58 -0700507 CXFA_Node* pNewTemplateNode =
508 pXFADoc->CreateNode(XFA_XDPPACKET_Template, eElement);
Dan Sinclair1770c022016-03-14 14:14:16 -0400509 if (pParent)
510 pParent->InsertChild(pNewTemplateNode, pBefore);
511 return pNewTemplateNode;
512}
dsinclair221caf62016-04-04 12:08:40 -0700513
Dan Sinclair1770c022016-03-14 14:14:16 -0400514CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700515 CXFA_Node* pFont = CreateCopyNode(XFA_Element::Font, pParent);
tsepezafe94302016-05-13 17:21:31 -0700516 pFont->SetCData(XFA_ATTRIBUTE_Typeface, L"Myriad Pro", FALSE);
Dan Sinclair1770c022016-03-14 14:14:16 -0400517 return pFont;
518}
dsinclair221caf62016-04-04 12:08:40 -0700519
Dan Sinclair1770c022016-03-14 14:14:16 -0400520CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700521 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400522 FX_FLOAT fInsets[4]) const {
dsinclair56a8b192016-06-21 14:15:25 -0700523 CXFA_Node* pMargin = CreateCopyNode(XFA_Element::Margin, pParent);
dsinclair221caf62016-04-04 12:08:40 -0700524 if (dwFlags & 0x01)
Dan Sinclair1770c022016-03-14 14:14:16 -0400525 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
526 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700527 if (dwFlags & 0x02)
Dan Sinclair1770c022016-03-14 14:14:16 -0400528 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
529 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700530 if (dwFlags & 0x04)
Dan Sinclair1770c022016-03-14 14:14:16 -0400531 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
532 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
dsinclair221caf62016-04-04 12:08:40 -0700533 if (dwFlags & 0x08)
Dan Sinclair1770c022016-03-14 14:14:16 -0400534 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
535 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
Dan Sinclair1770c022016-03-14 14:14:16 -0400536 return pMargin;
537}
dsinclair221caf62016-04-04 12:08:40 -0700538
dsinclair56a8b192016-06-21 14:15:25 -0700539CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_Element eValue,
Dan Sinclair1770c022016-03-14 14:14:16 -0400540 CXFA_Node* pParent) const {
dsinclair56a8b192016-06-21 14:15:25 -0700541 CXFA_Node* pValue = CreateCopyNode(XFA_Element::Value, pParent);
Dan Sinclair1770c022016-03-14 14:14:16 -0400542 CreateCopyNode(eValue, pValue);
543 return pValue;
544}
dsinclair221caf62016-04-04 12:08:40 -0700545
dsinclairdf4bc592016-03-31 20:34:43 -0700546CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
dsinclaira1b07722016-07-11 08:20:58 -0700547 return GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400548}
dsinclair221caf62016-04-04 12:08:40 -0700549
Dan Sinclair1770c022016-03-14 14:14:16 -0400550CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
tsepez20d6b762016-06-09 11:46:16 -0700551 return m_pDocView->GetDoc()->GetXFADoc();
Dan Sinclair1770c022016-03-14 14:14:16 -0400552}
dsinclairdf4bc592016-03-31 20:34:43 -0700553