blob: 711d29abc24c3a9046829f51977d12429f24a13a [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
dsinclairdf4bc592016-03-31 20:34:43 -07007#include "xfa/include/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"
13#include "xfa/fxfa/app/xfa_ffwidget.h"
14#include "xfa/fxfa/app/xfa_fwladapter.h"
dsinclairdf4bc592016-03-31 20:34:43 -070015#include "xfa/fxfa/parser/xfa_document_layout_imp.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040016#include "xfa/fxfa/parser/xfa_parser.h"
dsinclairdf4bc592016-03-31 20:34:43 -070017#include "xfa/fxfa/parser/xfa_parser_imp.h"
18#include "xfa/include/fxfa/xfa_ffdoc.h"
19#include "xfa/include/fxfa/xfa_ffdocview.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
26CXFA_FFPageView* CXFA_FFWidgetHandler::GetPageView(CXFA_FFWidget* hWidget) {
27 return hWidget->GetPageView();
Dan Sinclair1770c022016-03-14 14:14:16 -040028}
dsinclairdf4bc592016-03-31 20:34:43 -070029void CXFA_FFWidgetHandler::GetRect(CXFA_FFWidget* hWidget, CFX_RectF& rt) {
30 hWidget->GetWidgetRect(rt);
Dan Sinclair1770c022016-03-14 14:14:16 -040031}
dsinclairdf4bc592016-03-31 20:34:43 -070032uint32_t CXFA_FFWidgetHandler::GetStatus(CXFA_FFWidget* hWidget) {
33 return hWidget->GetStatus();
Dan Sinclair1770c022016-03-14 14:14:16 -040034}
dsinclairdf4bc592016-03-31 20:34:43 -070035FX_BOOL CXFA_FFWidgetHandler::GetBBox(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -040036 CFX_RectF& rtBox,
tsepez736f28a2016-03-25 14:19:51 -070037 uint32_t dwStatus,
Dan Sinclair1770c022016-03-14 14:14:16 -040038 FX_BOOL bDrawFocus) {
dsinclairdf4bc592016-03-31 20:34:43 -070039 return hWidget->GetBBox(rtBox, dwStatus, bDrawFocus);
Dan Sinclair1770c022016-03-14 14:14:16 -040040}
dsinclairdf4bc592016-03-31 20:34:43 -070041CXFA_WidgetAcc* CXFA_FFWidgetHandler::GetDataAcc(CXFA_FFWidget* hWidget) {
42 return hWidget->GetDataAcc();
Dan Sinclair1770c022016-03-14 14:14:16 -040043}
dsinclairdf4bc592016-03-31 20:34:43 -070044void CXFA_FFWidgetHandler::GetName(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -040045 CFX_WideString& wsName,
46 int32_t iNameType) {
dsinclairdf4bc592016-03-31 20:34:43 -070047 hWidget->GetDataAcc()->GetName(wsName, iNameType);
Dan Sinclair1770c022016-03-14 14:14:16 -040048}
dsinclairdf4bc592016-03-31 20:34:43 -070049FX_BOOL CXFA_FFWidgetHandler::GetToolTip(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -040050 CFX_WideString& wsToolTip) {
dsinclairdf4bc592016-03-31 20:34:43 -070051 return hWidget->GetToolTip(wsToolTip);
Dan Sinclair1770c022016-03-14 14:14:16 -040052}
dsinclairdf4bc592016-03-31 20:34:43 -070053void CXFA_FFWidgetHandler::SetPrivateData(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -040054 void* module_id,
55 void* pData,
56 PD_CALLBACK_FREEDATA callback) {
dsinclairdf4bc592016-03-31 20:34:43 -070057 hWidget->SetPrivateData(module_id, pData, callback);
Dan Sinclair1770c022016-03-14 14:14:16 -040058}
dsinclairdf4bc592016-03-31 20:34:43 -070059void* CXFA_FFWidgetHandler::GetPrivateData(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -040060 void* module_id) {
dsinclairdf4bc592016-03-31 20:34:43 -070061 return hWidget->GetPrivateData(module_id);
Dan Sinclair1770c022016-03-14 14:14:16 -040062}
dsinclairdf4bc592016-03-31 20:34:43 -070063FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040064 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070065 FX_BOOL bRet = hWidget->OnMouseEnter();
Dan Sinclair1770c022016-03-14 14:14:16 -040066 m_pDocView->UnlockUpdate();
67 m_pDocView->UpdateDocView();
68 return bRet;
69}
dsinclairdf4bc592016-03-31 20:34:43 -070070FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(CXFA_FFWidget* hWidget) {
Dan Sinclair1770c022016-03-14 14:14:16 -040071 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070072 FX_BOOL bRet = hWidget->OnMouseExit();
Dan Sinclair1770c022016-03-14 14:14:16 -040073 m_pDocView->UnlockUpdate();
74 m_pDocView->UpdateDocView();
75 return bRet;
76}
dsinclairdf4bc592016-03-31 20:34:43 -070077FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070078 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040079 FX_FLOAT fx,
80 FX_FLOAT fy) {
81 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070082 hWidget->Rotate2Normal(fx, fy);
83 FX_BOOL bRet = hWidget->OnLButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040084 if (bRet && m_pDocView->SetFocus(hWidget)) {
85 ((CXFA_FFDoc*)m_pDocView->GetDoc())
86 ->GetDocProvider()
dsinclairdf4bc592016-03-31 20:34:43 -070087 ->SetFocusWidget(m_pDocView->GetDoc(), (CXFA_FFWidget*)hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -040088 }
89 m_pDocView->UnlockUpdate();
90 m_pDocView->UpdateDocView();
91 return bRet;
92}
dsinclairdf4bc592016-03-31 20:34:43 -070093FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -070094 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -040095 FX_FLOAT fx,
96 FX_FLOAT fy) {
97 m_pDocView->LockUpdate();
dsinclairdf4bc592016-03-31 20:34:43 -070098 hWidget->Rotate2Normal(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -040099 m_pDocView->m_bLayoutEvent = TRUE;
dsinclairdf4bc592016-03-31 20:34:43 -0700100 FX_BOOL bRet = hWidget->OnLButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400101 m_pDocView->UnlockUpdate();
102 m_pDocView->UpdateDocView();
103 return bRet;
104}
dsinclairdf4bc592016-03-31 20:34:43 -0700105FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700106 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400107 FX_FLOAT fx,
108 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700109 hWidget->Rotate2Normal(fx, fy);
110 FX_BOOL bRet = hWidget->OnLButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400111 m_pDocView->RunInvalidate();
112 return bRet;
113}
dsinclairdf4bc592016-03-31 20:34:43 -0700114FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700115 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400116 FX_FLOAT fx,
117 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700118 hWidget->Rotate2Normal(fx, fy);
119 FX_BOOL bRet = hWidget->OnMouseMove(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400120 m_pDocView->RunInvalidate();
121 return bRet;
122}
dsinclairdf4bc592016-03-31 20:34:43 -0700123FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700124 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400125 int16_t zDelta,
126 FX_FLOAT fx,
127 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700128 hWidget->Rotate2Normal(fx, fy);
129 FX_BOOL bRet = hWidget->OnMouseWheel(dwFlags, zDelta, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400130 m_pDocView->RunInvalidate();
131 return bRet;
132}
dsinclairdf4bc592016-03-31 20:34:43 -0700133FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700134 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400135 FX_FLOAT fx,
136 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700137 hWidget->Rotate2Normal(fx, fy);
138 FX_BOOL bRet = hWidget->OnRButtonDown(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400139 if (bRet && m_pDocView->SetFocus(hWidget)) {
140 ((CXFA_FFDoc*)m_pDocView->GetDoc())
141 ->GetDocProvider()
dsinclairdf4bc592016-03-31 20:34:43 -0700142 ->SetFocusWidget(m_pDocView->GetDoc(), (CXFA_FFWidget*)hWidget);
Dan Sinclair1770c022016-03-14 14:14:16 -0400143 }
144 m_pDocView->RunInvalidate();
145 return bRet;
146}
dsinclairdf4bc592016-03-31 20:34:43 -0700147FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700148 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400149 FX_FLOAT fx,
150 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700151 hWidget->Rotate2Normal(fx, fy);
152 FX_BOOL bRet = hWidget->OnRButtonUp(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400153 m_pDocView->RunInvalidate();
154 return bRet;
155}
dsinclairdf4bc592016-03-31 20:34:43 -0700156FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700157 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400158 FX_FLOAT fx,
159 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700160 hWidget->Rotate2Normal(fx, fy);
161 FX_BOOL bRet = hWidget->OnRButtonDblClk(dwFlags, fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400162 m_pDocView->RunInvalidate();
163 return bRet;
164}
dsinclairdf4bc592016-03-31 20:34:43 -0700165FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700166 uint32_t dwKeyCode,
167 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700168 FX_BOOL bRet = hWidget->OnKeyDown(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400169 m_pDocView->RunInvalidate();
170 m_pDocView->UpdateDocView();
171 return bRet;
172}
dsinclairdf4bc592016-03-31 20:34:43 -0700173FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700174 uint32_t dwKeyCode,
175 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700176 FX_BOOL bRet = hWidget->OnKeyUp(dwKeyCode, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400177 m_pDocView->RunInvalidate();
178 return bRet;
179}
dsinclairdf4bc592016-03-31 20:34:43 -0700180FX_BOOL CXFA_FFWidgetHandler::OnChar(CXFA_FFWidget* hWidget,
tsepez736f28a2016-03-25 14:19:51 -0700181 uint32_t dwChar,
182 uint32_t dwFlags) {
dsinclairdf4bc592016-03-31 20:34:43 -0700183 FX_BOOL bRet = hWidget->OnChar(dwChar, dwFlags);
Dan Sinclair1770c022016-03-14 14:14:16 -0400184 m_pDocView->RunInvalidate();
185 return bRet;
186}
dsinclairdf4bc592016-03-31 20:34:43 -0700187uint32_t CXFA_FFWidgetHandler::OnHitTest(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400188 FX_FLOAT fx,
189 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700190 if (!(hWidget->GetStatus() & XFA_WIDGETSTATUS_Visible))
Dan Sinclair1770c022016-03-14 14:14:16 -0400191 return FWL_WGTHITTEST_Unknown;
dsinclairdf4bc592016-03-31 20:34:43 -0700192
193 hWidget->Rotate2Normal(fx, fy);
194 return hWidget->OnHitTest(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400195}
dsinclairdf4bc592016-03-31 20:34:43 -0700196FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400197 FX_FLOAT fx,
198 FX_FLOAT fy) {
dsinclairdf4bc592016-03-31 20:34:43 -0700199 hWidget->Rotate2Normal(fx, fy);
200 return hWidget->OnSetCursor(fx, fy);
Dan Sinclair1770c022016-03-14 14:14:16 -0400201}
dsinclairdf4bc592016-03-31 20:34:43 -0700202void CXFA_FFWidgetHandler::RenderWidget(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400203 CFX_Graphics* pGS,
204 CFX_Matrix* pMatrix,
205 FX_BOOL bHighlight) {
dsinclairdf4bc592016-03-31 20:34:43 -0700206 hWidget->RenderWidget(pGS, pMatrix,
207 bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0);
Dan Sinclair1770c022016-03-14 14:14:16 -0400208}
209FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
210 XFA_EVENTTYPE eEventType) {
211 if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) {
212 return FALSE;
213 }
214 if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
215 return FALSE;
216 }
217 switch (eEventType) {
218 case XFA_EVENT_Calculate: {
219 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
220 if (!calc) {
221 return FALSE;
222 }
223 if (calc.GetScript()) {
224 return TRUE;
225 }
226 return FALSE;
227 }
228 case XFA_EVENT_Validate: {
229 CXFA_Validate val = pWidgetAcc->GetValidate();
230 if (!val) {
231 return FALSE;
232 }
233 if (val.GetScript()) {
234 return TRUE;
235 }
236 return FALSE;
237 }
238 default:
239 break;
240 }
241 CXFA_NodeArray eventArray;
242 return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType],
243 eventArray);
244}
245int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
246 CXFA_EventParam* pParam) {
247 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
248 return XFA_EVENTERROR_NotExist;
249 }
250 if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
251 return XFA_EVENTERROR_NotExist;
252 }
253 switch (pParam->m_eType) {
254 case XFA_EVENT_Calculate:
255 return pWidgetAcc->ProcessCalculate();
256 case XFA_EVENT_Validate:
257 if (((CXFA_FFDoc*)m_pDocView->GetDoc())
258 ->GetDocProvider()
259 ->IsValidationsEnabled(m_pDocView->GetDoc())) {
260 return pWidgetAcc->ProcessValidate();
261 }
262 return XFA_EVENTERROR_Disabled;
263 case XFA_EVENT_InitCalculate: {
264 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
265 if (!calc) {
266 return XFA_EVENTERROR_NotExist;
267 }
268 if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
269 return XFA_EVENTERROR_Disabled;
270 }
271 CXFA_Script script = calc.GetScript();
272 return pWidgetAcc->ExecuteScript(script, pParam);
273 }
274 default:
275 break;
276 }
277 int32_t iRet =
278 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
279 return iRet;
280}
dsinclairdf4bc592016-03-31 20:34:43 -0700281CXFA_FFWidget* CXFA_FFWidgetHandler::CreateWidget(CXFA_FFWidget* hParent,
282 XFA_WIDGETTYPE eType,
283 CXFA_FFWidget* hBefore) {
Dan Sinclair1770c022016-03-14 14:14:16 -0400284 CXFA_Node* pParentFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700285 hParent ? hParent->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400286 CXFA_Node* pBeforeFormItem =
dsinclairdf4bc592016-03-31 20:34:43 -0700287 hBefore ? hBefore->GetDataAcc()->GetNode() : nullptr;
Dan Sinclair1770c022016-03-14 14:14:16 -0400288 CXFA_Node* pNewFormItem =
289 CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);
290 if (pNewFormItem == NULL) {
291 return NULL;
292 }
293 pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized);
294 pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized);
295 m_pDocView->RunLayout();
296 CXFA_LayoutItem* pLayout =
297 m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);
dsinclairdf4bc592016-03-31 20:34:43 -0700298 return (CXFA_FFWidget*)pLayout;
Dan Sinclair1770c022016-03-14 14:14:16 -0400299}
300CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(
301 XFA_WIDGETTYPE eType,
302 CXFA_Node* pParent,
303 CXFA_Node* pBefore) const {
304 switch (eType) {
305 case XFA_WIDGETTYPE_Barcode:
306 return NULL;
307 case XFA_WIDGETTYPE_PushButton:
308 return CreatePushButton(pParent, pBefore);
309 case XFA_WIDGETTYPE_CheckButton:
310 return CreateCheckButton(pParent, pBefore);
311 case XFA_WIDGETTYPE_ExcludeGroup:
312 return CreateExclGroup(pParent, pBefore);
313 case XFA_WIDGETTYPE_RadioButton:
314 return CreateRadioButton(pParent, pBefore);
315 case XFA_WIDGETTYPE_Arc:
316 return CreateArc(pParent, pBefore);
317 case XFA_WIDGETTYPE_Rectangle:
318 return CreateRectangle(pParent, pBefore);
319 case XFA_WIDGETTYPE_Image:
320 return CreateImage(pParent, pBefore);
321 case XFA_WIDGETTYPE_Line:
322 return CreateLine(pParent, pBefore);
323 case XFA_WIDGETTYPE_Text:
324 return CreateText(pParent, pBefore);
325 case XFA_WIDGETTYPE_DatetimeEdit:
326 return CreateDatetimeEdit(pParent, pBefore);
327 case XFA_WIDGETTYPE_DecimalField:
328 return CreateDecimalField(pParent, pBefore);
329 case XFA_WIDGETTYPE_NumericField:
330 return CreateNumericField(pParent, pBefore);
331 case XFA_WIDGETTYPE_Signature:
332 return CreateSignature(pParent, pBefore);
333 case XFA_WIDGETTYPE_TextEdit:
334 return CreateTextEdit(pParent, pBefore);
335 case XFA_WIDGETTYPE_DropdownList:
336 return CreateDropdownList(pParent, pBefore);
337 case XFA_WIDGETTYPE_ListBox:
338 return CreateListBox(pParent, pBefore);
339 case XFA_WIDGETTYPE_ImageField:
340 return CreateImageField(pParent, pBefore);
341 case XFA_WIDGETTYPE_PasswordEdit:
342 return CreatePasswordEdit(pParent, pBefore);
343 case XFA_WIDGETTYPE_Subform:
344 return CreateSubform(pParent, pBefore);
345 default:
346 break;
347 }
348 return NULL;
349}
350CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent,
351 CXFA_Node* pBefore) const {
352 CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore);
353 CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField);
354 CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption);
355 CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue);
356 pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE);
357 CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption);
358 pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);
359 pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);
360 CreateFontNode(pCaption);
361 CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField);
362 pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);
363 CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder);
364 pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);
365 CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder);
366 CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill);
367 pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE);
368 CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
369 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);
370 return pField;
371}
372CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent,
373 CXFA_Node* pBefore) const {
374 CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
375 return pField;
376}
377CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent,
378 CXFA_Node* pBefore) const {
379 return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore);
380}
381CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent,
382 CXFA_Node* pBefore) const {
383 CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);
384 CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui);
385 CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton);
386 pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);
387 return pField;
388}
389CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent,
390 CXFA_Node* pBefore) const {
391 CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore);
392 CreateValueNode(XFA_ELEMENT_Date, pField);
393 return pField;
394}
395CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent,
396 CXFA_Node* pBefore) const {
397 CXFA_Node* pField = CreateNumericField(pParent, pBefore);
398 CreateValueNode(XFA_ELEMENT_Decimal, pField);
399 return pField;
400}
401CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent,
402 CXFA_Node* pBefore) const {
403 CXFA_Node* pField = CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore);
404 return pField;
405}
406CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent,
407 CXFA_Node* pBefore) const {
408 CXFA_Node* pField = CreateField(XFA_ELEMENT_Signature, pParent, pBefore);
409 return pField;
410}
411CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent,
412 CXFA_Node* pBefore) const {
413 CXFA_Node* pField = CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore);
414 return pField;
415}
416CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent,
417 CXFA_Node* pBefore) const {
418 CXFA_Node* pField = CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore);
419 return pField;
420}
421CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent,
422 CXFA_Node* pBefore) const {
423 CXFA_Node* pField = CreateDropdownList(pParent, pBefore);
424 CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);
425 CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);
426 pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);
427 pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);
428 return pField;
429}
430CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent,
431 CXFA_Node* pBefore) const {
432 CXFA_Node* pField = CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore);
433 return pField;
434}
435CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent,
436 CXFA_Node* pBefore) const {
437 CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore);
438 CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);
439 pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);
440 return pField;
441}
442CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement,
443 CXFA_Node* pParent,
444 CXFA_Node* pBefore) const {
445 CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore);
446 CreateCopyNode(eElement, CreateCopyNode(XFA_ELEMENT_Ui, pField));
447 CreateFontNode(pField);
448 return pField;
449}
450CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent,
451 CXFA_Node* pBefore) const {
452 return CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore);
453}
454CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent,
455 CXFA_Node* pBefore) const {
456 return CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore);
457}
458CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent,
459 CXFA_Node* pBefore) const {
460 CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore);
461 CreateCopyNode(XFA_ELEMENT_ImageEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
462 return pField;
463}
464CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent,
465 CXFA_Node* pBefore) const {
466 CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Line, pParent, pBefore);
467 return pField;
468}
469CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent,
470 CXFA_Node* pBefore) const {
471 CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore);
472 CreateCopyNode(XFA_ELEMENT_TextEdit, CreateCopyNode(XFA_ELEMENT_Ui, pField));
473 CreateFontNode(pField);
474 return pField;
475}
476CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement,
477 CXFA_Node* pParent,
478 CXFA_Node* pBefore) const {
479 CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore);
480 CreateValueNode(eElement, pDraw);
481 return pDraw;
482}
483CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent,
484 CXFA_Node* pBefore) const {
485 CXFA_Node* pSubform = CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore);
486 return pSubform;
487}
488CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement,
489 CXFA_Node* pParent,
490 CXFA_Node* pBefore) const {
491 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
492 CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);
493 if (pParent)
494 pParent->InsertChild(pNewFormItem, pBefore);
495 return pNewFormItem;
496}
497CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement,
498 CXFA_Node* pParent,
499 CXFA_Node* pBefore) const {
500 CXFA_Node* pTemplateParent = pParent ? pParent->GetTemplateNode() : NULL;
501 CXFA_Node* pNewNode =
502 CreateTemplateNode(eElement, pTemplateParent,
503 pBefore ? pBefore->GetTemplateNode() : NULL)
504 ->Clone(FALSE);
505 if (pParent)
506 pParent->InsertChild(pNewNode, pBefore);
507 return pNewNode;
508}
509CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement,
510 CXFA_Node* pParent,
511 CXFA_Node* pBefore) const {
512 CXFA_Document* pXFADoc = GetXFADoc();
513 CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(
514 XFA_XDPPACKET_Template, eElement);
515 if (pParent)
516 pParent->InsertChild(pNewTemplateNode, pBefore);
517 return pNewTemplateNode;
518}
519CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const {
520 CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent);
521 pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE);
522 return pFont;
523}
524CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent,
tsepez736f28a2016-03-25 14:19:51 -0700525 uint32_t dwFlags,
Dan Sinclair1770c022016-03-14 14:14:16 -0400526 FX_FLOAT fInsets[4]) const {
527 CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent);
528 if (dwFlags & 0x01) {
529 pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset,
530 CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);
531 }
532 if (dwFlags & 0x02) {
533 pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset,
534 CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);
535 }
536 if (dwFlags & 0x04) {
537 pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset,
538 CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);
539 }
540 if (dwFlags & 0x08) {
541 pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset,
542 CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);
543 }
544 return pMargin;
545}
546CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue,
547 CXFA_Node* pParent) const {
548 CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent);
549 CreateCopyNode(eValue, pValue);
550 return pValue;
551}
dsinclairdf4bc592016-03-31 20:34:43 -0700552CXFA_Document* CXFA_FFWidgetHandler::GetObjFactory() const {
Dan Sinclair1770c022016-03-14 14:14:16 -0400553 return GetXFADoc()->GetParser()->GetFactory();
554}
555CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const {
556 return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc();
557}
dsinclairdf4bc592016-03-31 20:34:43 -0700558
Dan Sinclair1770c022016-03-14 14:14:16 -0400559CXFA_FFMenuHandler::CXFA_FFMenuHandler() {}
dsinclairdf4bc592016-03-31 20:34:43 -0700560
Dan Sinclair1770c022016-03-14 14:14:16 -0400561CXFA_FFMenuHandler::~CXFA_FFMenuHandler() {}
dsinclairdf4bc592016-03-31 20:34:43 -0700562
563FX_BOOL CXFA_FFMenuHandler::CanCopy(CXFA_FFWidget* hWidget) {
564 return hWidget->CanCopy();
Dan Sinclair1770c022016-03-14 14:14:16 -0400565}
dsinclairdf4bc592016-03-31 20:34:43 -0700566FX_BOOL CXFA_FFMenuHandler::CanCut(CXFA_FFWidget* hWidget) {
567 return hWidget->CanCut();
Dan Sinclair1770c022016-03-14 14:14:16 -0400568}
dsinclairdf4bc592016-03-31 20:34:43 -0700569FX_BOOL CXFA_FFMenuHandler::CanPaste(CXFA_FFWidget* hWidget) {
570 return hWidget->CanPaste();
Dan Sinclair1770c022016-03-14 14:14:16 -0400571}
dsinclairdf4bc592016-03-31 20:34:43 -0700572FX_BOOL CXFA_FFMenuHandler::CanSelectAll(CXFA_FFWidget* hWidget) {
573 return hWidget->CanSelectAll();
Dan Sinclair1770c022016-03-14 14:14:16 -0400574}
dsinclairdf4bc592016-03-31 20:34:43 -0700575FX_BOOL CXFA_FFMenuHandler::CanDelete(CXFA_FFWidget* hWidget) {
576 return hWidget->CanDelete();
Dan Sinclair1770c022016-03-14 14:14:16 -0400577}
dsinclairdf4bc592016-03-31 20:34:43 -0700578FX_BOOL CXFA_FFMenuHandler::CanDeSelect(CXFA_FFWidget* hWidget) {
579 return hWidget->CanDeSelect();
Dan Sinclair1770c022016-03-14 14:14:16 -0400580}
dsinclairdf4bc592016-03-31 20:34:43 -0700581FX_BOOL CXFA_FFMenuHandler::Copy(CXFA_FFWidget* hWidget,
582 CFX_WideString& wsText) {
583 return hWidget->Copy(wsText);
Dan Sinclair1770c022016-03-14 14:14:16 -0400584}
dsinclairdf4bc592016-03-31 20:34:43 -0700585FX_BOOL CXFA_FFMenuHandler::Cut(CXFA_FFWidget* hWidget,
586 CFX_WideString& wsText) {
587 return hWidget->Cut(wsText);
Dan Sinclair1770c022016-03-14 14:14:16 -0400588}
dsinclairdf4bc592016-03-31 20:34:43 -0700589FX_BOOL CXFA_FFMenuHandler::Paste(CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400590 const CFX_WideString& wsText) {
dsinclairdf4bc592016-03-31 20:34:43 -0700591 return hWidget->Paste(wsText);
Dan Sinclair1770c022016-03-14 14:14:16 -0400592}
dsinclairdf4bc592016-03-31 20:34:43 -0700593FX_BOOL CXFA_FFMenuHandler::SelectAll(CXFA_FFWidget* hWidget) {
594 return hWidget->SelectAll();
Dan Sinclair1770c022016-03-14 14:14:16 -0400595}
dsinclairdf4bc592016-03-31 20:34:43 -0700596FX_BOOL CXFA_FFMenuHandler::Delete(CXFA_FFWidget* hWidget) {
597 return hWidget->Delete();
Dan Sinclair1770c022016-03-14 14:14:16 -0400598}
dsinclairdf4bc592016-03-31 20:34:43 -0700599FX_BOOL CXFA_FFMenuHandler::DeSelect(CXFA_FFWidget* hWidget) {
600 return hWidget->DeSelect();
Dan Sinclair1770c022016-03-14 14:14:16 -0400601}
dsinclairdf4bc592016-03-31 20:34:43 -0700602FX_BOOL CXFA_FFMenuHandler::CanUndo(CXFA_FFWidget* hWidget) {
603 return hWidget->CanUndo();
Dan Sinclair1770c022016-03-14 14:14:16 -0400604}
dsinclairdf4bc592016-03-31 20:34:43 -0700605FX_BOOL CXFA_FFMenuHandler::CanRedo(CXFA_FFWidget* hWidget) {
606 return hWidget->CanRedo();
Dan Sinclair1770c022016-03-14 14:14:16 -0400607}
dsinclairdf4bc592016-03-31 20:34:43 -0700608FX_BOOL CXFA_FFMenuHandler::Undo(CXFA_FFWidget* hWidget) {
609 return hWidget->Undo();
Dan Sinclair1770c022016-03-14 14:14:16 -0400610}
dsinclairdf4bc592016-03-31 20:34:43 -0700611FX_BOOL CXFA_FFMenuHandler::Redo(CXFA_FFWidget* hWidget) {
612 return hWidget->Redo();
Dan Sinclair1770c022016-03-14 14:14:16 -0400613}
614FX_BOOL CXFA_FFMenuHandler::GetSuggestWords(
dsinclairdf4bc592016-03-31 20:34:43 -0700615 CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400616 CFX_PointF pointf,
617 std::vector<CFX_ByteString>& sSuggest) {
dsinclairdf4bc592016-03-31 20:34:43 -0700618 return hWidget->GetSuggestWords(pointf, sSuggest);
Dan Sinclair1770c022016-03-14 14:14:16 -0400619}
620FX_BOOL CXFA_FFMenuHandler::ReplaceSpellCheckWord(
dsinclairdf4bc592016-03-31 20:34:43 -0700621 CXFA_FFWidget* hWidget,
Dan Sinclair1770c022016-03-14 14:14:16 -0400622 CFX_PointF pointf,
623 const CFX_ByteStringC& bsReplace) {
dsinclairdf4bc592016-03-31 20:34:43 -0700624 return hWidget->ReplaceSpellCheckWord(pointf, bsReplace);
Dan Sinclair1770c022016-03-14 14:14:16 -0400625}