Merge XFA to PDFium master at 4dc95e7 on 10/28/2014
[pdfium.git] / xfa / src / fxfa / src / app / xfa_ffwidgethandler.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.\r
2 // Use of this source code is governed by a BSD-style license that can be\r
3 // found in the LICENSE file.\r
4 \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #include "../../../foxitlib.h"\r
8 #include "../common/xfa_common.h"\r
9 #include "xfa_fwladapter.h"\r
10 #include "xfa_ffwidgethandler.h"\r
11 #include "xfa_ffwidget.h"\r
12 #include "xfa_fffield.h"\r
13 #include "xfa_ffchoicelist.h"\r
14 #include "xfa_ffdoc.h"\r
15 #include "xfa_ffdocview.h"\r
16 CXFA_FFWidgetHandler::CXFA_FFWidgetHandler(CXFA_FFDocView* pDocView)\r
17     : m_pDocView(pDocView)\r
18 {\r
19 }\r
20 CXFA_FFWidgetHandler::~CXFA_FFWidgetHandler()\r
21 {\r
22 }\r
23 IXFA_PageView* CXFA_FFWidgetHandler::GetPageView(XFA_HWIDGET hWidget)\r
24 {\r
25     return ((CXFA_FFWidget*)hWidget)->GetPageView();\r
26 }\r
27 void CXFA_FFWidgetHandler::GetRect(XFA_HWIDGET hWidget, CFX_RectF &rt)\r
28 {\r
29     ((CXFA_FFWidget*)hWidget)->GetWidgetRect(rt);\r
30 }\r
31 FX_DWORD CXFA_FFWidgetHandler::GetStatus(XFA_HWIDGET hWidget)\r
32 {\r
33     return ((CXFA_FFWidget*)hWidget)->GetStatus();\r
34 }\r
35 FX_BOOL CXFA_FFWidgetHandler::GetBBox(XFA_HWIDGET hWidget, CFX_RectF &rtBox, FX_DWORD dwStatus, FX_BOOL bDrawFocus)\r
36 {\r
37     return ((CXFA_FFWidget*)hWidget)->GetBBox(rtBox, dwStatus, bDrawFocus);\r
38 }\r
39 CXFA_WidgetAcc* CXFA_FFWidgetHandler::GetDataAcc(XFA_HWIDGET hWidget)\r
40 {\r
41     return ((CXFA_FFWidget*)hWidget)->GetDataAcc();\r
42 }\r
43 void CXFA_FFWidgetHandler::GetName(XFA_HWIDGET hWidget, CFX_WideString &wsName, FX_INT32 iNameType )\r
44 {\r
45     ((CXFA_FFWidget*)hWidget)->GetDataAcc()->GetName(wsName, iNameType);\r
46 }\r
47 FX_BOOL CXFA_FFWidgetHandler::GetToolTip(XFA_HWIDGET hWidget, CFX_WideString &wsToolTip)\r
48 {\r
49     return ((CXFA_FFWidget*)hWidget)->GetToolTip(wsToolTip);\r
50 }\r
51 void CXFA_FFWidgetHandler::SetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback)\r
52 {\r
53     ((CXFA_FFWidget*)hWidget)->SetPrivateData(module_id, pData, callback);\r
54 }\r
55 FX_LPVOID CXFA_FFWidgetHandler::GetPrivateData(XFA_HWIDGET hWidget, FX_LPVOID module_id)\r
56 {\r
57     return ((CXFA_FFWidget*)hWidget)->GetPrivateData(module_id);\r
58 }\r
59 FX_BOOL CXFA_FFWidgetHandler::OnMouseEnter(XFA_HWIDGET hWidget)\r
60 {\r
61     m_pDocView->LockUpdate();\r
62     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseEnter();\r
63     m_pDocView->UnlockUpdate();\r
64     m_pDocView->UpdateDocView();\r
65     return bRet;\r
66 }\r
67 FX_BOOL CXFA_FFWidgetHandler::OnMouseExit(XFA_HWIDGET hWidget)\r
68 {\r
69     m_pDocView->LockUpdate();\r
70     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseExit();\r
71     m_pDocView->UnlockUpdate();\r
72     m_pDocView->UpdateDocView();\r
73     return bRet;\r
74 }\r
75 FX_BOOL CXFA_FFWidgetHandler::OnLButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
76 {\r
77     m_pDocView->LockUpdate();\r
78     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
79     FX_BOOL bRet =  ((CXFA_FFWidget*)hWidget)->OnLButtonDown(dwFlags, fx, fy);\r
80     if (bRet && m_pDocView->SetFocus(hWidget)) {\r
81         ((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->SetFocusWidget((XFA_HDOC)m_pDocView->GetDoc(), (XFA_HWIDGET)hWidget);\r
82     }\r
83     m_pDocView->UnlockUpdate();\r
84     m_pDocView->UpdateDocView();\r
85     return bRet;\r
86 }\r
87 FX_BOOL CXFA_FFWidgetHandler::OnLButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
88 {\r
89     m_pDocView->LockUpdate();\r
90     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
91     m_pDocView->m_bLayoutEvent = TRUE;\r
92     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnLButtonUp(dwFlags, fx, fy);\r
93     m_pDocView->UnlockUpdate();\r
94     m_pDocView->UpdateDocView();\r
95     return bRet;\r
96 }\r
97 FX_BOOL CXFA_FFWidgetHandler::OnLButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
98 {\r
99     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
100     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnLButtonDblClk(dwFlags, fx, fy);\r
101     m_pDocView->RunInvalidate();\r
102     return bRet;\r
103 }\r
104 FX_BOOL CXFA_FFWidgetHandler::OnMouseMove(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
105 {\r
106     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
107     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseMove(dwFlags, fx, fy);\r
108     m_pDocView->RunInvalidate();\r
109     return bRet;\r
110 }\r
111 FX_BOOL CXFA_FFWidgetHandler::OnMouseWheel(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_SHORT zDelta, FX_FLOAT fx, FX_FLOAT fy)\r
112 {\r
113     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
114     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnMouseWheel(dwFlags, zDelta, fx, fy);\r
115     m_pDocView->RunInvalidate();\r
116     return bRet;\r
117 }\r
118 FX_BOOL CXFA_FFWidgetHandler::OnRButtonDown(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
119 {\r
120     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
121     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonDown(dwFlags, fx, fy);\r
122     if (bRet && m_pDocView->SetFocus(hWidget)) {\r
123         ((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->SetFocusWidget((XFA_HDOC)m_pDocView->GetDoc(), (XFA_HWIDGET)hWidget);\r
124     }\r
125     m_pDocView->RunInvalidate();\r
126     return bRet;\r
127 }\r
128 FX_BOOL CXFA_FFWidgetHandler::OnRButtonUp(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
129 {\r
130     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
131     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonUp(dwFlags, fx, fy);\r
132     m_pDocView->RunInvalidate();\r
133     return bRet;\r
134 }\r
135 FX_BOOL CXFA_FFWidgetHandler::OnRButtonDblClk(XFA_HWIDGET hWidget, FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy)\r
136 {\r
137     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
138     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnRButtonDblClk(dwFlags, fx, fy);\r
139     m_pDocView->RunInvalidate();\r
140     return bRet;\r
141 }\r
142 FX_BOOL CXFA_FFWidgetHandler::OnKeyDown(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags)\r
143 {\r
144     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnKeyDown(dwKeyCode, dwFlags);\r
145     m_pDocView->RunInvalidate();\r
146     m_pDocView->UpdateDocView();\r
147     return bRet;\r
148 }\r
149 FX_BOOL CXFA_FFWidgetHandler::OnKeyUp(XFA_HWIDGET hWidget, FX_DWORD dwKeyCode, FX_DWORD dwFlags)\r
150 {\r
151     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnKeyUp(dwKeyCode, dwFlags);\r
152     m_pDocView->RunInvalidate();\r
153     return bRet;\r
154 }\r
155 FX_BOOL CXFA_FFWidgetHandler::OnChar(XFA_HWIDGET hWidget, FX_DWORD dwChar, FX_DWORD dwFlags)\r
156 {\r
157     FX_BOOL bRet = ((CXFA_FFWidget*)hWidget)->OnChar(dwChar, dwFlags);\r
158     m_pDocView->RunInvalidate();\r
159     return bRet;\r
160 }\r
161 FX_DWORD CXFA_FFWidgetHandler::OnHitTest(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy)\r
162 {\r
163     if (!(((CXFA_FFWidget*)hWidget)->GetStatus() & XFA_WIDGETSTATUS_Visible)) {\r
164         return FWL_WGTHITTEST_Unknown;\r
165     }\r
166     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
167     return ((CXFA_FFWidget*)hWidget)->OnHitTest(fx, fy);\r
168 }\r
169 FX_BOOL CXFA_FFWidgetHandler::OnSetCursor(XFA_HWIDGET hWidget, FX_FLOAT fx, FX_FLOAT fy)\r
170 {\r
171     ((CXFA_FFWidget*)hWidget)->Rotate2Normal(fx, fy);\r
172     return ((CXFA_FFWidget*)hWidget)->OnSetCursor(fx, fy);\r
173 }\r
174 void CXFA_FFWidgetHandler::RenderWidget(XFA_HWIDGET hWidget, CFX_Graphics* pGS, CFX_Matrix* pMatrix , FX_BOOL bHighlight)\r
175 {\r
176     ((CXFA_FFWidget*)hWidget)->RenderWidget(pGS, pMatrix, bHighlight ? XFA_WIDGETSTATUS_Highlight : 0, 0);\r
177 }\r
178 FX_BOOL CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType)\r
179 {\r
180     if (!pWidgetAcc || eEventType == XFA_EVENT_Unknown) {\r
181         return FALSE;\r
182     }\r
183     if (pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {\r
184         return FALSE;\r
185     }\r
186     switch (eEventType) {\r
187         case XFA_EVENT_Calculate: {\r
188                 CXFA_Calculate calc = pWidgetAcc->GetCalculate();\r
189                 if (!calc) {\r
190                     return FALSE;\r
191                 }\r
192                 if (CXFA_Script script = calc.GetScript()) {\r
193                     return TRUE;\r
194                 }\r
195                 return FALSE;\r
196             }\r
197         case XFA_EVENT_Validate: {\r
198                 CXFA_Validate val = pWidgetAcc->GetValidate();\r
199                 if (!val) {\r
200                     return FALSE;\r
201                 }\r
202                 if (val.GetScript()) {\r
203                     return TRUE;\r
204                 }\r
205                 return FALSE;\r
206             }\r
207         default:\r
208             break;\r
209     }\r
210     CXFA_NodeArray eventArray;\r
211     return pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], eventArray);\r
212 }\r
213 FX_INT32 CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam)\r
214 {\r
215     if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {\r
216         return XFA_EVENTERROR_NotExist;\r
217     }\r
218     if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {\r
219         return XFA_EVENTERROR_NotExist;\r
220     }\r
221     switch (pParam->m_eType) {\r
222         case XFA_EVENT_Calculate:\r
223             return pWidgetAcc->ProcessCalculate();\r
224         case XFA_EVENT_Validate:\r
225             if (((CXFA_FFDoc*)m_pDocView->GetDoc())->GetDocProvider()->IsValidationsEnabled(m_pDocView->GetDoc())) {\r
226                 return pWidgetAcc->ProcessValidate();\r
227             }\r
228             return XFA_EVENTERROR_Disabled;\r
229         case XFA_EVENT_InitCalculate: {\r
230                 CXFA_Calculate calc = pWidgetAcc->GetCalculate();\r
231                 if (!calc) {\r
232                     return XFA_EVENTERROR_NotExist;\r
233                 }\r
234                 if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {\r
235                     return XFA_EVENTERROR_Disabled;\r
236                 }\r
237                 CXFA_Script script = calc.GetScript();\r
238                 return pWidgetAcc->ExecuteScript(script, pParam);\r
239             }\r
240         default:\r
241             break;\r
242     }\r
243     FX_INT32 iRet = pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);\r
244     return iRet;\r
245 }\r
246 XFA_HWIDGET CXFA_FFWidgetHandler::CreateWidget(XFA_HWIDGET hParent, XFA_WIDGETTYPE eType, XFA_HWIDGET hBefore )\r
247 {\r
248     CXFA_Node* pParentFormItem = hParent ? ((CXFA_FFWidget*)hParent)->GetDataAcc()->GetNode() : NULL;\r
249     CXFA_Node* pBeforeFormItem = hBefore ? ((CXFA_FFWidget*)hBefore)->GetDataAcc()->GetNode() : NULL;\r
250     CXFA_Node* pNewFormItem = CreateWidgetFormItem(eType, pParentFormItem, pBeforeFormItem);\r
251     if (pNewFormItem == NULL)   {\r
252         return NULL;\r
253     }\r
254     pNewFormItem->GetTemplateNode()->SetFlag(XFA_NODEFLAG_Initialized);\r
255     pNewFormItem->SetFlag(XFA_NODEFLAG_Initialized);\r
256     m_pDocView->RunLayout();\r
257     CXFA_LayoutItem* pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(pNewFormItem);\r
258     return (XFA_HWIDGET)pLayout;\r
259 }\r
260 CXFA_Node* CXFA_FFWidgetHandler::CreateWidgetFormItem(XFA_WIDGETTYPE eType, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
261 {\r
262     switch (eType) {\r
263         case XFA_WIDGETTYPE_Barcode:\r
264             return NULL;\r
265         case XFA_WIDGETTYPE_PushButton:\r
266             return CreatePushButton(pParent, pBefore);\r
267         case XFA_WIDGETTYPE_CheckButton:\r
268             return CreateCheckButton(pParent, pBefore);\r
269         case XFA_WIDGETTYPE_ExcludeGroup:\r
270             return CreateExclGroup(pParent, pBefore);\r
271         case XFA_WIDGETTYPE_RadioButton:\r
272             return CreateRadioButton(pParent, pBefore);\r
273         case XFA_WIDGETTYPE_Arc:\r
274             return CreateArc(pParent, pBefore);\r
275         case XFA_WIDGETTYPE_Rectangle:\r
276             return CreateRectangle(pParent, pBefore);\r
277         case XFA_WIDGETTYPE_Image:\r
278             return CreateImage(pParent, pBefore);\r
279         case XFA_WIDGETTYPE_Line:\r
280             return CreateLine(pParent, pBefore);\r
281         case XFA_WIDGETTYPE_Text:\r
282             return CreateText(pParent, pBefore);\r
283         case XFA_WIDGETTYPE_DatetimeEdit:\r
284             return CreateDatetimeEdit(pParent, pBefore);\r
285         case XFA_WIDGETTYPE_DecimalField:\r
286             return CreateDecimalField(pParent, pBefore);\r
287         case XFA_WIDGETTYPE_NumericField:\r
288             return CreateNumericField(pParent, pBefore);\r
289         case XFA_WIDGETTYPE_Signature:\r
290             return CreateSignature(pParent, pBefore);\r
291         case XFA_WIDGETTYPE_TextEdit:\r
292             return CreateTextEdit(pParent, pBefore);\r
293         case XFA_WIDGETTYPE_DropdownList:\r
294             return CreateDropdownList(pParent, pBefore);\r
295         case XFA_WIDGETTYPE_ListBox:\r
296             return CreateListBox(pParent, pBefore);\r
297         case XFA_WIDGETTYPE_ImageField:\r
298             return CreateImageField(pParent, pBefore);\r
299         case XFA_WIDGETTYPE_PasswordEdit:\r
300             return CreatePasswordEdit(pParent, pBefore);\r
301         case XFA_WIDGETTYPE_Subform:\r
302             return CreateSubform(pParent, pBefore);\r
303         default:\r
304             break;\r
305     }\r
306     return NULL;\r
307 }\r
308 CXFA_Node* CXFA_FFWidgetHandler::CreatePushButton(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
309 {\r
310     CXFA_Node* pField = CreateField(XFA_ELEMENT_Button, pParent, pBefore);\r
311     CXFA_Node* pCaption = CreateCopyNode(XFA_ELEMENT_Caption, pField);\r
312     CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pCaption);\r
313     CXFA_Node* pText = CreateCopyNode(XFA_ELEMENT_Text, pValue);\r
314     pText->SetContent(FX_WSTRC(L"Button"), FX_WSTRC(L"Button"), FALSE);\r
315     CXFA_Node* pPara = CreateCopyNode(XFA_ELEMENT_Para, pCaption);\r
316     pPara->SetEnum(XFA_ATTRIBUTE_VAlign, XFA_ATTRIBUTEENUM_Middle, FALSE);\r
317     pPara->SetEnum(XFA_ATTRIBUTE_HAlign, XFA_ATTRIBUTEENUM_Center, FALSE);\r
318     CreateFontNode(pCaption);\r
319     CXFA_Node* pBorder = CreateCopyNode(XFA_ELEMENT_Border, pField);\r
320     pBorder->SetEnum(XFA_ATTRIBUTE_Hand, XFA_ATTRIBUTEENUM_Right, FALSE);\r
321     CXFA_Node* pEdge = CreateCopyNode(XFA_ELEMENT_Edge, pBorder);\r
322     pEdge->SetEnum(XFA_ATTRIBUTE_Stroke, XFA_ATTRIBUTEENUM_Raised, FALSE);\r
323     CXFA_Node* pFill = CreateCopyNode(XFA_ELEMENT_Fill, pBorder);\r
324     CXFA_Node* pColor = CreateCopyNode(XFA_ELEMENT_Color, pFill);\r
325     pColor->SetCData(XFA_ATTRIBUTE_Value, FX_WSTRC(L"212, 208, 200"), FALSE);\r
326     CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);\r
327     pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None);\r
328     return pField;\r
329 }\r
330 CXFA_Node* CXFA_FFWidgetHandler::CreateCheckButton(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
331 {\r
332     CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);\r
333     return pField;\r
334 }\r
335 CXFA_Node* CXFA_FFWidgetHandler::CreateExclGroup(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
336 {\r
337     return CreateFormItem(XFA_ELEMENT_ExclGroup, pParent, pBefore);\r
338 }\r
339 CXFA_Node* CXFA_FFWidgetHandler::CreateRadioButton(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
340 {\r
341     CXFA_Node* pField = CreateField(XFA_ELEMENT_CheckButton, pParent, pBefore);\r
342     CXFA_Node* pUi = pField->GetFirstChildByClass(XFA_ELEMENT_Ui);\r
343     CXFA_Node* pWidget = pUi->GetFirstChildByClass(XFA_ELEMENT_CheckButton);\r
344     pWidget->SetEnum(XFA_ATTRIBUTE_Shape, XFA_ATTRIBUTEENUM_Round);\r
345     return pField;\r
346 }\r
347 CXFA_Node* CXFA_FFWidgetHandler::CreateDatetimeEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
348 {\r
349     CXFA_Node* pField = CreateField(XFA_ELEMENT_DateTimeEdit, pParent, pBefore);\r
350     CreateValueNode(XFA_ELEMENT_Date, pField);\r
351     return pField;\r
352 }\r
353 CXFA_Node* CXFA_FFWidgetHandler::CreateDecimalField(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
354 {\r
355     CXFA_Node* pField = CreateNumericField(pParent, pBefore);\r
356     CreateValueNode(XFA_ELEMENT_Decimal, pField);\r
357     return pField;\r
358 }\r
359 CXFA_Node* CXFA_FFWidgetHandler::CreateNumericField(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
360 {\r
361     CXFA_Node* pField = CreateField(XFA_ELEMENT_NumericEdit, pParent, pBefore);\r
362     return pField;\r
363 }\r
364 CXFA_Node* CXFA_FFWidgetHandler::CreateSignature(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
365 {\r
366     CXFA_Node* pField = CreateField(XFA_ELEMENT_Signature, pParent, pBefore);\r
367     return pField;\r
368 }\r
369 CXFA_Node* CXFA_FFWidgetHandler::CreateTextEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
370 {\r
371     CXFA_Node* pField = CreateField(XFA_ELEMENT_TextEdit, pParent, pBefore);\r
372     return pField;\r
373 }\r
374 CXFA_Node* CXFA_FFWidgetHandler::CreateDropdownList(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
375 {\r
376     CXFA_Node* pField = CreateField(XFA_ELEMENT_ChoiceList, pParent, pBefore);\r
377     return pField;\r
378 }\r
379 CXFA_Node* CXFA_FFWidgetHandler::CreateListBox(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
380 {\r
381     CXFA_Node* pField = CreateDropdownList(pParent, pBefore);\r
382     CXFA_Node* pUi = pField->GetNodeItem(XFA_NODEITEM_FirstChild);\r
383     CXFA_Node* pListBox = pUi->GetNodeItem(XFA_NODEITEM_FirstChild);\r
384     pListBox->SetEnum(XFA_ATTRIBUTE_Open, XFA_ATTRIBUTEENUM_Always);\r
385     pListBox->SetEnum(XFA_ATTRIBUTE_CommitOn, XFA_ATTRIBUTEENUM_Exit);\r
386     return pField;\r
387 }\r
388 CXFA_Node* CXFA_FFWidgetHandler::CreateImageField(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
389 {\r
390     CXFA_Node* pField = CreateField(XFA_ELEMENT_ImageEdit, pParent, pBefore);\r
391     return pField;\r
392 }\r
393 CXFA_Node* CXFA_FFWidgetHandler::CreatePasswordEdit(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
394 {\r
395     CXFA_Node* pField = CreateField(XFA_ELEMENT_PasswordEdit, pParent, pBefore);\r
396     CXFA_Node* pBind = CreateCopyNode(XFA_ELEMENT_Bind, pField);\r
397     pBind->SetEnum(XFA_ATTRIBUTE_Match, XFA_ATTRIBUTEENUM_None, FALSE);\r
398     return pField;\r
399 }\r
400 CXFA_Node* CXFA_FFWidgetHandler::CreateField(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
401 {\r
402     CXFA_Node* pField = CreateFormItem(XFA_ELEMENT_Field, pParent, pBefore);\r
403     CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField);\r
404     CXFA_Node* pCheckButton = CreateCopyNode(eElement, pUi);\r
405     CreateFontNode(pField);\r
406     return pField;\r
407 }\r
408 CXFA_Node* CXFA_FFWidgetHandler::CreateArc(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
409 {\r
410     CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Arc, pParent, pBefore);\r
411     return pField;\r
412 }\r
413 CXFA_Node* CXFA_FFWidgetHandler::CreateRectangle(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
414 {\r
415     CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Rectangle, pParent, pBefore);\r
416     return pField;\r
417 }\r
418 CXFA_Node* CXFA_FFWidgetHandler::CreateImage(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
419 {\r
420     CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Image, pParent, pBefore);\r
421     CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField);\r
422     CXFA_Node* pImage = CreateCopyNode(XFA_ELEMENT_ImageEdit, pUi);\r
423     return pField;\r
424 }\r
425 CXFA_Node* CXFA_FFWidgetHandler::CreateLine(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
426 {\r
427     CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Line, pParent, pBefore);\r
428     return pField;\r
429 }\r
430 CXFA_Node* CXFA_FFWidgetHandler::CreateText(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
431 {\r
432     CXFA_Node* pField = CreateDraw(XFA_ELEMENT_Text, pParent, pBefore);\r
433     CXFA_Node* pUi = CreateCopyNode(XFA_ELEMENT_Ui, pField);\r
434     CXFA_Node* pTextEdit = CreateCopyNode(XFA_ELEMENT_TextEdit, pUi);\r
435     CreateFontNode(pField);\r
436     return pField;\r
437 }\r
438 CXFA_Node* CXFA_FFWidgetHandler::CreateDraw(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
439 {\r
440     CXFA_Node* pDraw = CreateFormItem(XFA_ELEMENT_Draw, pParent, pBefore);\r
441     CreateValueNode(eElement, pDraw);\r
442     return pDraw;\r
443 }\r
444 CXFA_Node* CXFA_FFWidgetHandler::CreateSubform(CXFA_Node* pParent, CXFA_Node* pBefore) const\r
445 {\r
446     CXFA_Node* pSubform = CreateFormItem(XFA_ELEMENT_Subform, pParent, pBefore);\r
447     return pSubform;\r
448 }\r
449 CXFA_Node* CXFA_FFWidgetHandler::CreateFormItem(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
450 {\r
451     CXFA_Node* pTemplateParent = pParent != NULL ? pParent->GetTemplateNode() : NULL;\r
452     CXFA_Node* pNewFormItem = pTemplateParent->CloneTemplateToForm(FALSE);\r
453     if (pParent != NULL) {\r
454         pParent->InsertChild(pNewFormItem, pBefore);\r
455     }\r
456     return      pNewFormItem;\r
457 }\r
458 CXFA_Node* CXFA_FFWidgetHandler::CreateCopyNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
459 {\r
460     CXFA_Node* pTemplateParent = pParent != NULL ? pParent->GetTemplateNode() : NULL;\r
461     CXFA_Node* pNewNode = CreateTemplateNode(eElement, pTemplateParent, pBefore ? pBefore->GetTemplateNode() : NULL)->Clone(FALSE);\r
462     if (pParent != NULL) {\r
463         pParent->InsertChild(pNewNode, pBefore);\r
464     }\r
465     return      pNewNode;\r
466 }\r
467 CXFA_Node* CXFA_FFWidgetHandler::CreateTemplateNode(XFA_ELEMENT eElement, CXFA_Node* pParent, CXFA_Node* pBefore) const\r
468 {\r
469     CXFA_Document* pXFADoc = GetXFADoc();\r
470     CXFA_Node* pNewTemplateNode = pXFADoc->GetParser()->GetFactory()->CreateNode(XFA_XDPPACKET_Template, eElement);\r
471     if (pParent != NULL) {\r
472         pParent->InsertChild(pNewTemplateNode, pBefore);\r
473     }\r
474     return pNewTemplateNode;\r
475 }\r
476 CXFA_Node* CXFA_FFWidgetHandler::CreateFontNode(CXFA_Node* pParent) const\r
477 {\r
478     CXFA_Node* pFont = CreateCopyNode(XFA_ELEMENT_Font, pParent);\r
479     pFont->SetCData(XFA_ATTRIBUTE_Typeface, FX_WSTRC(L"Myriad Pro"), FALSE);\r
480     return pFont;\r
481 }\r
482 CXFA_Node* CXFA_FFWidgetHandler::CreateMarginNode(CXFA_Node* pParent, FX_DWORD dwFlags, FX_FLOAT fInsets[4]) const\r
483 {\r
484     CXFA_Node* pMargin = CreateCopyNode(XFA_ELEMENT_Margin, pParent);\r
485     if (dwFlags & 0x01) {\r
486         pMargin->SetMeasure(XFA_ATTRIBUTE_LeftInset, CXFA_Measurement(fInsets[0], XFA_UNIT_Pt), FALSE);\r
487     }\r
488     if (dwFlags & 0x02) {\r
489         pMargin->SetMeasure(XFA_ATTRIBUTE_TopInset, CXFA_Measurement(fInsets[1], XFA_UNIT_Pt), FALSE);\r
490     }\r
491     if (dwFlags & 0x04) {\r
492         pMargin->SetMeasure(XFA_ATTRIBUTE_RightInset, CXFA_Measurement(fInsets[2], XFA_UNIT_Pt), FALSE);\r
493     }\r
494     if (dwFlags & 0x08) {\r
495         pMargin->SetMeasure(XFA_ATTRIBUTE_BottomInset, CXFA_Measurement(fInsets[3], XFA_UNIT_Pt), FALSE);\r
496     }\r
497     return pMargin;\r
498 }\r
499 CXFA_Node* CXFA_FFWidgetHandler::CreateValueNode(XFA_ELEMENT eValue, CXFA_Node* pParent) const\r
500 {\r
501     CXFA_Node* pValue = CreateCopyNode(XFA_ELEMENT_Value, pParent);\r
502     CXFA_Node* pDate = CreateCopyNode(eValue, pValue);\r
503     return pValue;\r
504 }\r
505 IXFA_ObjFactory* CXFA_FFWidgetHandler::GetObjFactory() const\r
506 {\r
507     return GetXFADoc()->GetParser()->GetFactory();\r
508 }\r
509 CXFA_Document* CXFA_FFWidgetHandler::GetXFADoc() const\r
510 {\r
511     return ((CXFA_FFDoc*)(m_pDocView->GetDoc()))->GetXFADoc();\r
512 }\r
513 CXFA_FFMenuHandler::CXFA_FFMenuHandler()\r
514 {\r
515 }\r
516 CXFA_FFMenuHandler::~CXFA_FFMenuHandler()\r
517 {\r
518 }\r
519 FX_BOOL CXFA_FFMenuHandler::CanCopy(XFA_HWIDGET hWidget)\r
520 {\r
521     return ((CXFA_FFWidget*)hWidget)->CanCopy();\r
522 }\r
523 FX_BOOL CXFA_FFMenuHandler::CanCut(XFA_HWIDGET hWidget)\r
524 {\r
525     return ((CXFA_FFWidget*)hWidget)->CanCut();\r
526 }\r
527 FX_BOOL CXFA_FFMenuHandler::CanPaste(XFA_HWIDGET hWidget)\r
528 {\r
529     return ((CXFA_FFWidget*)hWidget)->CanPaste();\r
530 }\r
531 FX_BOOL CXFA_FFMenuHandler::CanSelectAll(XFA_HWIDGET hWidget)\r
532 {\r
533     return ((CXFA_FFWidget*)hWidget)->CanSelectAll();\r
534 }\r
535 FX_BOOL CXFA_FFMenuHandler::CanDelete(XFA_HWIDGET hWidget)\r
536 {\r
537     return ((CXFA_FFWidget*)hWidget)->CanDelete();\r
538 }\r
539 FX_BOOL CXFA_FFMenuHandler::CanDeSelect(XFA_HWIDGET hWidget)\r
540 {\r
541     return ((CXFA_FFWidget*)hWidget)->CanDeSelect();\r
542 }\r
543 FX_BOOL CXFA_FFMenuHandler::Copy(XFA_HWIDGET hWidget, CFX_WideString &wsText)\r
544 {\r
545     return ((CXFA_FFWidget*)hWidget)->Copy(wsText);\r
546 }\r
547 FX_BOOL CXFA_FFMenuHandler::Cut(XFA_HWIDGET hWidget, CFX_WideString &wsText)\r
548 {\r
549     return ((CXFA_FFWidget*)hWidget)->Cut(wsText);\r
550 }\r
551 FX_BOOL CXFA_FFMenuHandler::Paste(XFA_HWIDGET hWidget, const CFX_WideString &wsText)\r
552 {\r
553     return ((CXFA_FFWidget*)hWidget)->Paste(wsText);\r
554 }\r
555 FX_BOOL CXFA_FFMenuHandler::SelectAll(XFA_HWIDGET hWidget)\r
556 {\r
557     return ((CXFA_FFWidget*)hWidget)->SelectAll();\r
558 }\r
559 FX_BOOL CXFA_FFMenuHandler::Delete(XFA_HWIDGET hWidget)\r
560 {\r
561     return ((CXFA_FFWidget*)hWidget)->Delete();\r
562 }\r
563 FX_BOOL CXFA_FFMenuHandler::DeSelect(XFA_HWIDGET hWidget)\r
564 {\r
565     return ((CXFA_FFWidget*)hWidget)->DeSelect();\r
566 }\r
567 FX_BOOL CXFA_FFMenuHandler::CanUndo(XFA_HWIDGET hWidget)\r
568 {\r
569     return ((CXFA_FFWidget*)hWidget)->CanUndo();\r
570 }\r
571 FX_BOOL CXFA_FFMenuHandler::CanRedo(XFA_HWIDGET hWidget)\r
572 {\r
573     return ((CXFA_FFWidget*)hWidget)->CanRedo();\r
574 }\r
575 FX_BOOL CXFA_FFMenuHandler::Undo(XFA_HWIDGET hWidget)\r
576 {\r
577     return ((CXFA_FFWidget*)hWidget)->Undo();\r
578 }\r
579 FX_BOOL CXFA_FFMenuHandler::Redo(XFA_HWIDGET hWidget)\r
580 {\r
581     return ((CXFA_FFWidget*)hWidget)->Redo();\r
582 }\r
583 #define FX_EDIT_ISLATINWORD(u)  (u == 0x2D || (u <= 0x005A && u >= 0x0041) || (u <= 0x007A && u >= 0x0061) || (u <= 0x02AF && u >= 0x00C0) || u == 0x0027)\r
584 FX_BOOL CXFA_FFMenuHandler::GetSuggestWords(XFA_HWIDGET hWidget, CFX_PointF pointf, CFX_ByteStringArray &sSuggest)\r
585 {\r
586     return ((CXFA_FFWidget*)hWidget)->GetSuggestWords(pointf, sSuggest);\r
587 }\r
588 FX_BOOL CXFA_FFMenuHandler::ReplaceSpellCheckWord(XFA_HWIDGET hWidget, CFX_PointF pointf, FX_BSTR bsReplace)\r
589 {\r
590     return ((CXFA_FFWidget*)hWidget)->ReplaceSpellCheckWord(pointf, bsReplace);\r
591 }\r