Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(612)

Side by Side Diff: xfa/src/fxfa/app/xfa_ffdocview.cpp

Issue 1803723002: Move xfa/src up to xfa/. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Rebase to master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/src/fxfa/app/xfa_ffdocview.h ('k') | xfa/src/fxfa/app/xfa_ffdraw.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // 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
7 #include "xfa/src/fxfa/app/xfa_ffdocview.h"
8
9 #include "core/include/fxcrt/fx_ext.h"
10 #include "xfa/src/fxfa/app/xfa_ffapp.h"
11 #include "xfa/src/fxfa/app/xfa_ffbarcode.h"
12 #include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
13 #include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
14 #include "xfa/src/fxfa/app/xfa_ffdoc.h"
15 #include "xfa/src/fxfa/app/xfa_ffdraw.h"
16 #include "xfa/src/fxfa/app/xfa_ffexclgroup.h"
17 #include "xfa/src/fxfa/app/xfa_fffield.h"
18 #include "xfa/src/fxfa/app/xfa_ffimage.h"
19 #include "xfa/src/fxfa/app/xfa_ffimageedit.h"
20 #include "xfa/src/fxfa/app/xfa_ffpageview.h"
21 #include "xfa/src/fxfa/app/xfa_ffpath.h"
22 #include "xfa/src/fxfa/app/xfa_ffpushbutton.h"
23 #include "xfa/src/fxfa/app/xfa_ffsignature.h"
24 #include "xfa/src/fxfa/app/xfa_ffsubform.h"
25 #include "xfa/src/fxfa/app/xfa_fftext.h"
26 #include "xfa/src/fxfa/app/xfa_fftextedit.h"
27 #include "xfa/src/fxfa/app/xfa_ffwidget.h"
28 #include "xfa/src/fxfa/app/xfa_ffwidgetacc.h"
29 #include "xfa/src/fxfa/app/xfa_ffwidgethandler.h"
30 #include "xfa/src/fxfa/app/xfa_fwladapter.h"
31 #include "xfa/src/fxfa/app/xfa_textlayout.h"
32 #include "xfa/src/fxfa/parser/xfa_script.h"
33
34 extern const XFA_ATTRIBUTEENUM gs_EventActivity[] = {
35 XFA_ATTRIBUTEENUM_Click, XFA_ATTRIBUTEENUM_Change,
36 XFA_ATTRIBUTEENUM_DocClose, XFA_ATTRIBUTEENUM_DocReady,
37 XFA_ATTRIBUTEENUM_Enter, XFA_ATTRIBUTEENUM_Exit,
38 XFA_ATTRIBUTEENUM_Full, XFA_ATTRIBUTEENUM_IndexChange,
39 XFA_ATTRIBUTEENUM_Initialize, XFA_ATTRIBUTEENUM_MouseDown,
40 XFA_ATTRIBUTEENUM_MouseEnter, XFA_ATTRIBUTEENUM_MouseExit,
41 XFA_ATTRIBUTEENUM_MouseUp, XFA_ATTRIBUTEENUM_PostExecute,
42 XFA_ATTRIBUTEENUM_PostOpen, XFA_ATTRIBUTEENUM_PostPrint,
43 XFA_ATTRIBUTEENUM_PostSave, XFA_ATTRIBUTEENUM_PostSign,
44 XFA_ATTRIBUTEENUM_PostSubmit, XFA_ATTRIBUTEENUM_PreExecute,
45 XFA_ATTRIBUTEENUM_PreOpen, XFA_ATTRIBUTEENUM_PrePrint,
46 XFA_ATTRIBUTEENUM_PreSave, XFA_ATTRIBUTEENUM_PreSign,
47 XFA_ATTRIBUTEENUM_PreSubmit, XFA_ATTRIBUTEENUM_Ready,
48 XFA_ATTRIBUTEENUM_Unknown,
49 };
50 CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc)
51 : m_bLayoutEvent(FALSE),
52 m_pListFocusWidget(nullptr),
53 m_bInLayoutStatus(FALSE),
54 m_pDoc(pDoc),
55 m_pWidgetHandler(nullptr),
56 m_pXFADocLayout(nullptr),
57 m_pFocusAcc(nullptr),
58 m_pFocusWidget(nullptr),
59 m_pOldFocusWidget(nullptr),
60 m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None),
61 m_iLock(0) {}
62 CXFA_FFDocView::~CXFA_FFDocView() {
63 DestroyDocView();
64 if (m_pWidgetHandler) {
65 delete m_pWidgetHandler;
66 }
67 m_pWidgetHandler = NULL;
68 }
69 void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
70 RunBindItems();
71 ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Initialize);
72 ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange);
73 }
74 int32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) {
75 m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
76 m_pDoc->GetXFADoc()->DoProtoMerge();
77 m_pDoc->GetXFADoc()->DoDataMerge();
78 m_pXFADocLayout = GetXFALayout();
79 int32_t iStatus = m_pXFADocLayout->StartLayout();
80 if (iStatus < 0) {
81 return iStatus;
82 }
83 CXFA_Node* pRootItem =
84 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
85 if (!pRootItem) {
86 return iStatus;
87 }
88 InitLayout(pRootItem);
89 InitCalculate(pRootItem);
90 InitValidate(pRootItem);
91 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready, TRUE);
92 m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
93 return iStatus;
94 }
95 int32_t CXFA_FFDocView::DoLayout(IFX_Pause* pPause) {
96 int32_t iStatus = 100;
97 iStatus = m_pXFADocLayout->DoLayout(pPause);
98 if (iStatus != 100) {
99 return iStatus;
100 }
101 m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Doing;
102 return iStatus;
103 }
104 void CXFA_FFDocView::StopLayout() {
105 CXFA_Node* pRootItem =
106 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
107 if (!pRootItem) {
108 return;
109 }
110 CXFA_Node* pSubformNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
111 if (!pSubformNode) {
112 return;
113 }
114 CXFA_Node* pPageSetNode =
115 pSubformNode->GetFirstChildByClass(XFA_ELEMENT_PageSet);
116 if (!pPageSetNode) {
117 return;
118 }
119 RunCalculateWidgets();
120 RunValidate();
121 InitLayout(pPageSetNode);
122 InitCalculate(pPageSetNode);
123 InitValidate(pPageSetNode);
124 ExecEventActivityByDeepFirst(pPageSetNode, XFA_EVENT_Ready, TRUE);
125 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
126 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocReady);
127 RunCalculateWidgets();
128 RunValidate();
129 if (RunLayout()) {
130 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
131 }
132 m_CalculateAccs.RemoveAll();
133 if (m_pFocusAcc && !m_pFocusWidget) {
134 SetFocusWidgetAcc(m_pFocusAcc);
135 }
136 m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_End;
137 }
138 int32_t CXFA_FFDocView::GetLayoutStatus() {
139 return m_iStatus;
140 }
141 void CXFA_FFDocView::ShowNullTestMsg() {
142 int32_t iCount = m_arrNullTestMsg.GetSize();
143 CXFA_FFApp* pApp = m_pDoc->GetApp();
144 IXFA_AppProvider* pAppProvider = pApp->GetAppProvider();
145 if (pAppProvider && iCount) {
146 int32_t iRemain = iCount > 7 ? iCount - 7 : 0;
147 iCount -= iRemain;
148 CFX_WideString wsMsg;
149 for (int32_t i = 0; i < iCount; i++) {
150 wsMsg += m_arrNullTestMsg[i] + FX_WSTRC(L"\n");
151 }
152 if (iRemain > 0) {
153 CFX_WideString wsLimit;
154 pAppProvider->LoadString(XFA_IDS_ValidateLimit, wsLimit);
155 if (!wsLimit.IsEmpty()) {
156 CFX_WideString wsTemp;
157 wsTemp.Format((const FX_WCHAR*)wsLimit, iRemain);
158 wsMsg += FX_WSTRC(L"\n") + wsTemp;
159 }
160 }
161 CFX_WideString wsTitle;
162 pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
163 pAppProvider->MsgBox(wsMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
164 }
165 m_arrNullTestMsg.RemoveAll();
166 }
167 void CXFA_FFDocView::UpdateDocView() {
168 if (IsUpdateLocked()) {
169 return;
170 }
171 LockUpdate();
172 int32_t iNewAdds = m_NewAddedNodes.GetSize();
173 for (int32_t i = 0; i < iNewAdds; i++) {
174 CXFA_Node* pNode = reinterpret_cast<CXFA_Node*>(m_NewAddedNodes[i]);
175 InitCalculate(pNode);
176 InitValidate(pNode);
177 ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Ready, TRUE);
178 }
179 m_NewAddedNodes.RemoveAll();
180 RunSubformIndexChange();
181 RunCalculateWidgets();
182 RunValidate();
183 ShowNullTestMsg();
184 if (RunLayout() && m_bLayoutEvent) {
185 RunEventLayoutReady();
186 }
187 m_bLayoutEvent = FALSE;
188 m_CalculateAccs.RemoveAll();
189 RunInvalidate();
190 UnlockUpdate();
191 }
192 int32_t CXFA_FFDocView::CountPageViews() {
193 if (!m_pXFADocLayout) {
194 return 0;
195 }
196 return m_pXFADocLayout->CountPages();
197 }
198 IXFA_PageView* CXFA_FFDocView::GetPageView(int32_t nIndex) {
199 if (!m_pXFADocLayout) {
200 return NULL;
201 }
202 return static_cast<CXFA_FFPageView*>(m_pXFADocLayout->GetPage(nIndex));
203 }
204 IXFA_Widget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName) {
205 return GetWidgetByName(wsName, NULL);
206 }
207 CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
208 const CFX_WideStringC& wsName) {
209 return GetWidgetAccByName(wsName, NULL);
210 }
211 IXFA_DocLayout* CXFA_FFDocView::GetXFALayout() const {
212 return m_pDoc->GetXFADoc()->GetDocLayout();
213 }
214 FX_BOOL CXFA_FFDocView::ResetSingleWidgetAccData(CXFA_WidgetAcc* pWidgetAcc) {
215 CXFA_Node* pNode = pWidgetAcc->GetNode();
216 XFA_ELEMENT eType = pNode->GetClassID();
217 if (eType != XFA_ELEMENT_Field && eType != XFA_ELEMENT_ExclGroup) {
218 return FALSE;
219 }
220 FX_BOOL bNotify = IsStaticNotify();
221 pWidgetAcc->ResetData();
222 pWidgetAcc->UpdateUIDisplay();
223 if (bNotify) {
224 pWidgetAcc->NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL,
225 NULL);
226 }
227 if (CXFA_Validate validate = pWidgetAcc->GetValidate()) {
228 AddValidateWidget(pWidgetAcc);
229 validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, TRUE, FALSE);
230 }
231 return TRUE;
232 }
233 void CXFA_FFDocView::ResetWidgetData(CXFA_WidgetAcc* pWidgetAcc) {
234 m_bLayoutEvent = TRUE;
235 FX_BOOL bChanged = FALSE;
236 CXFA_Node* pFormNode = NULL;
237 if (pWidgetAcc) {
238 bChanged = ResetSingleWidgetAccData(pWidgetAcc);
239 pFormNode = pWidgetAcc->GetNode();
240 } else {
241 pFormNode = GetRootSubform();
242 }
243 if (!pFormNode) {
244 return;
245 }
246 if (pFormNode->GetClassID() != XFA_ELEMENT_Field &&
247 pFormNode->GetClassID() != XFA_ELEMENT_ExclGroup) {
248 CXFA_WidgetAccIterator Iterator(this, pFormNode);
249 while (CXFA_WidgetAcc* pAcc = Iterator.MoveToNext()) {
250 bChanged |= ResetSingleWidgetAccData(pAcc);
251 if (pAcc->GetNode()->GetClassID() == XFA_ELEMENT_ExclGroup) {
252 Iterator.SkipTree();
253 }
254 }
255 }
256 if (bChanged) {
257 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
258 }
259 }
260 int32_t CXFA_FFDocView::ProcessWidgetEvent(CXFA_EventParam* pParam,
261 CXFA_WidgetAcc* pWidgetAcc) {
262 if (pParam == NULL) {
263 return XFA_EVENTERROR_Error;
264 }
265 if (pParam->m_eType == XFA_EVENT_Validate) {
266 CFX_WideString wsValidateStr = FX_WSTRC(L"preSubmit");
267 CXFA_Node* pConfigItem =
268 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Config));
269 if (pConfigItem) {
270 CXFA_Node* pValidateNode = NULL;
271 CXFA_Node* pAcrobatNode = pConfigItem->GetChild(0, XFA_ELEMENT_Acrobat);
272 pValidateNode =
273 pAcrobatNode ? pAcrobatNode->GetChild(0, XFA_ELEMENT_Validate) : NULL;
274 if (!pValidateNode) {
275 CXFA_Node* pPresentNode = pConfigItem->GetChild(0, XFA_ELEMENT_Present);
276 pValidateNode = pPresentNode
277 ? pPresentNode->GetChild(0, XFA_ELEMENT_Validate)
278 : NULL;
279 }
280 if (pValidateNode) {
281 wsValidateStr = pValidateNode->GetContent();
282 }
283 }
284 FX_BOOL bValidate = FALSE;
285 switch (pParam->m_iValidateActivities) {
286 case XFA_VALIDATE_preSubmit:
287 bValidate = wsValidateStr.Find(L"preSubmit") != -1;
288 break;
289 case XFA_VALIDATE_prePrint:
290 bValidate = wsValidateStr.Find(L"prePrint") != -1;
291 break;
292 case XFA_VALIDATE_preExecute:
293 bValidate = wsValidateStr.Find(L"preExecute") != -1;
294 break;
295 case XFA_VALIDATE_preSave:
296 bValidate = wsValidateStr.Find(L"preSave") != -1;
297 break;
298 }
299 if (!bValidate) {
300 return XFA_EVENTERROR_Sucess;
301 }
302 }
303 CXFA_Node* pNode = pWidgetAcc ? pWidgetAcc->GetNode() : NULL;
304 if (!pNode) {
305 CXFA_Node* pRootItem =
306 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
307 if (!pRootItem) {
308 return XFA_EVENTERROR_Error;
309 }
310 pNode = pRootItem->GetChild(0, XFA_ELEMENT_Subform);
311 }
312 ExecEventActivityByDeepFirst(pNode, pParam->m_eType, pParam->m_bIsFormReady);
313 return XFA_EVENTERROR_Sucess;
314 }
315 IXFA_WidgetHandler* CXFA_FFDocView::GetWidgetHandler() {
316 if (!m_pWidgetHandler) {
317 m_pWidgetHandler = new CXFA_FFWidgetHandler(this);
318 }
319 return m_pWidgetHandler;
320 }
321 IXFA_WidgetIterator* CXFA_FFDocView::CreateWidgetIterator() {
322 CXFA_Node* pFormRoot = GetRootSubform();
323 if (!pFormRoot) {
324 return NULL;
325 }
326 return new CXFA_FFDocWidgetIterator(this, pFormRoot);
327 }
328 IXFA_WidgetAccIterator* CXFA_FFDocView::CreateWidgetAccIterator(
329 XFA_WIDGETORDER eOrder) {
330 CXFA_Node* pFormRoot = GetRootSubform();
331 if (!pFormRoot) {
332 return NULL;
333 }
334 return new CXFA_WidgetAccIterator(this, pFormRoot);
335 }
336 IXFA_Widget* CXFA_FFDocView::GetFocusWidget() {
337 return m_pFocusWidget;
338 }
339 void CXFA_FFDocView::KillFocus() {
340 if (m_pFocusWidget &&
341 (m_pFocusWidget->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
342 (m_pFocusWidget)->OnKillFocus(NULL);
343 }
344 m_pFocusAcc = NULL;
345 m_pFocusWidget = NULL;
346 m_pOldFocusWidget = NULL;
347 }
348 FX_BOOL CXFA_FFDocView::SetFocus(IXFA_Widget* hWidget) {
349 CXFA_FFWidget* pNewFocus = (CXFA_FFWidget*)hWidget;
350 if (m_pOldFocusWidget == pNewFocus) {
351 return FALSE;
352 }
353 CXFA_FFWidget* pOldFocus = m_pOldFocusWidget;
354 m_pOldFocusWidget = pNewFocus;
355 if (pOldFocus) {
356 if (m_pFocusWidget != m_pOldFocusWidget &&
357 (pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Focused)) {
358 m_pFocusWidget = pOldFocus;
359 pOldFocus->OnKillFocus(pNewFocus);
360 } else if ((pOldFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
361 if (!pOldFocus->IsLoaded()) {
362 pOldFocus->LoadWidget();
363 }
364 pOldFocus->OnSetFocus(m_pFocusWidget);
365 m_pFocusWidget = pOldFocus;
366 pOldFocus->OnKillFocus(pNewFocus);
367 }
368 }
369 if (m_pFocusWidget == m_pOldFocusWidget) {
370 return FALSE;
371 }
372 pNewFocus = m_pOldFocusWidget;
373 if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) {
374 m_pFocusAcc = NULL;
375 m_pFocusWidget = NULL;
376 m_pListFocusWidget = NULL;
377 m_pOldFocusWidget = NULL;
378 return FALSE;
379 }
380 if (pNewFocus && (pNewFocus->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
381 if (!pNewFocus->IsLoaded()) {
382 pNewFocus->LoadWidget();
383 }
384 pNewFocus->OnSetFocus(m_pFocusWidget);
385 }
386 m_pFocusAcc = pNewFocus ? pNewFocus->GetDataAcc() : NULL;
387 m_pFocusWidget = pNewFocus;
388 m_pOldFocusWidget = m_pFocusWidget;
389 return TRUE;
390 }
391 CXFA_WidgetAcc* CXFA_FFDocView::GetFocusWidgetAcc() {
392 return m_pFocusAcc;
393 }
394 void CXFA_FFDocView::SetFocusWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
395 CXFA_FFWidget* pNewFocus =
396 pWidgetAcc ? pWidgetAcc->GetNextWidget(NULL) : NULL;
397 if (SetFocus(pNewFocus)) {
398 m_pFocusAcc = pWidgetAcc;
399 if (m_iStatus == XFA_DOCVIEW_LAYOUTSTATUS_End) {
400 m_pDoc->GetDocProvider()->SetFocusWidget(m_pDoc, m_pFocusWidget);
401 }
402 }
403 }
404 void CXFA_FFDocView::DeleteLayoutItem(CXFA_FFWidget* pWidget) {
405 if (m_pFocusAcc == pWidget->GetDataAcc()) {
406 m_pFocusAcc = NULL;
407 m_pFocusWidget = NULL;
408 m_pOldFocusWidget = NULL;
409 }
410 }
411 static int32_t XFA_ProcessEvent(CXFA_FFDocView* pDocView,
412 CXFA_WidgetAcc* pWidgetAcc,
413 CXFA_EventParam* pParam) {
414 if (!pParam || pParam->m_eType == XFA_EVENT_Unknown) {
415 return XFA_EVENTERROR_NotExist;
416 }
417 if (!pWidgetAcc || pWidgetAcc->GetClassID() == XFA_ELEMENT_Draw) {
418 return XFA_EVENTERROR_NotExist;
419 }
420 switch (pParam->m_eType) {
421 case XFA_EVENT_Calculate:
422 return pWidgetAcc->ProcessCalculate();
423 case XFA_EVENT_Validate:
424 if (((CXFA_FFDoc*)pDocView->GetDoc())
425 ->GetDocProvider()
426 ->IsValidationsEnabled(pDocView->GetDoc())) {
427 return pWidgetAcc->ProcessValidate(0x01);
428 }
429 return XFA_EVENTERROR_Disabled;
430 case XFA_EVENT_InitCalculate: {
431 CXFA_Calculate calc = pWidgetAcc->GetCalculate();
432 if (!calc) {
433 return XFA_EVENTERROR_NotExist;
434 }
435 if (pWidgetAcc->GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
436 return XFA_EVENTERROR_Disabled;
437 }
438 CXFA_Script script = calc.GetScript();
439 return pWidgetAcc->ExecuteScript(script, pParam);
440 }
441 default:
442 break;
443 }
444 int32_t iRet =
445 pWidgetAcc->ProcessEvent(gs_EventActivity[pParam->m_eType], pParam);
446 return iRet;
447 }
448 int32_t CXFA_FFDocView::ExecEventActivityByDeepFirst(CXFA_Node* pFormNode,
449 XFA_EVENTTYPE eEventType,
450 FX_BOOL bIsFormReady,
451 FX_BOOL bRecursive,
452 CXFA_Node* pExclude) {
453 int32_t iRet = XFA_EVENTERROR_NotExist;
454 if (pFormNode == pExclude) {
455 return iRet;
456 }
457 XFA_ELEMENT elementType = pFormNode->GetClassID();
458 if (elementType == XFA_ELEMENT_Field) {
459 if (eEventType == XFA_EVENT_IndexChange) {
460 return iRet;
461 }
462 CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
463 if (pWidgetAcc == NULL) {
464 return iRet;
465 }
466 CXFA_EventParam eParam;
467 eParam.m_eType = eEventType;
468 eParam.m_pTarget = pWidgetAcc;
469 eParam.m_bIsFormReady = bIsFormReady;
470 return XFA_ProcessEvent(this, pWidgetAcc, &eParam);
471 }
472 if (bRecursive) {
473 for (CXFA_Node* pNode = pFormNode->GetNodeItem(
474 XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
475 pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling,
476 XFA_OBJECTTYPE_ContainerNode)) {
477 elementType = pNode->GetClassID();
478 if (elementType != XFA_ELEMENT_Variables &&
479 elementType != XFA_ELEMENT_Draw) {
480 iRet |= ExecEventActivityByDeepFirst(pNode, eEventType, bIsFormReady,
481 bRecursive, pExclude);
482 }
483 }
484 }
485 CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pFormNode->GetWidgetData();
486 if (pWidgetAcc == NULL) {
487 return iRet;
488 }
489 CXFA_EventParam eParam;
490 eParam.m_eType = eEventType;
491 eParam.m_pTarget = pWidgetAcc;
492 eParam.m_bIsFormReady = bIsFormReady;
493 iRet |= XFA_ProcessEvent(this, pWidgetAcc, &eParam);
494 return iRet;
495 }
496 CXFA_FFWidget* CXFA_FFDocView::GetWidgetByName(const CFX_WideStringC& wsName,
497 CXFA_FFWidget* pRefWidget) {
498 CXFA_WidgetAcc* pRefAcc = pRefWidget ? pRefWidget->GetDataAcc() : NULL;
499 if (CXFA_WidgetAcc* pAcc = GetWidgetAccByName(wsName, pRefAcc)) {
500 return pAcc->GetNextWidget(NULL);
501 }
502 return NULL;
503 }
504 CXFA_WidgetAcc* CXFA_FFDocView::GetWidgetAccByName(
505 const CFX_WideStringC& wsName,
506 CXFA_WidgetAcc* pRefWidgetAcc) {
507 CFX_WideString wsExpression;
508 FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
509 XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent;
510 IXFA_ScriptContext* pScriptContext = m_pDoc->GetXFADoc()->GetScriptContext();
511 if (!pScriptContext) {
512 return NULL;
513 }
514 CXFA_Node* refNode = NULL;
515 if (pRefWidgetAcc) {
516 refNode = pRefWidgetAcc->GetNode();
517 wsExpression = wsName;
518 } else {
519 wsExpression = L"$form." + wsName;
520 }
521 XFA_RESOLVENODE_RS resoveNodeRS;
522 int32_t iRet = pScriptContext->ResolveObjects(refNode, wsExpression,
523 resoveNodeRS, dwStyle);
524 if (iRet < 1) {
525 return NULL;
526 }
527 if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
528 CXFA_Node* pNode = resoveNodeRS.nodes[0]->AsNode();
529 if (pNode) {
530 return (CXFA_WidgetAcc*)pNode->GetWidgetData();
531 }
532 }
533 return NULL;
534 }
535 void CXFA_FFDocView::OnPageEvent(IXFA_LayoutPage* pSender,
536 XFA_PAGEEVENT eEvent,
537 int32_t iPageIndex) {
538 CXFA_FFPageView* pFFPageView = static_cast<CXFA_FFPageView*>(pSender);
539 if (eEvent == XFA_PAGEEVENT_PageRemoved) {
540 m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
541 XFA_PAGEVIEWEVENT_PostRemoved);
542 return;
543 }
544 m_pDoc->GetDocProvider()->PageViewEvent(pFFPageView,
545 XFA_PAGEVIEWEVENT_PostAdded);
546 pFFPageView->LoadPageView();
547 }
548 void CXFA_FFDocView::LockUpdate() {
549 m_iLock++;
550 }
551 void CXFA_FFDocView::UnlockUpdate() {
552 m_iLock--;
553 }
554 FX_BOOL CXFA_FFDocView::IsUpdateLocked() {
555 return m_iLock;
556 }
557 void CXFA_FFDocView::ClearInvalidateList() {
558 FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
559 while (ps) {
560 void* pPageView = NULL;
561 CFX_RectF* pRect = NULL;
562 m_mapPageInvalidate.GetNextAssoc(ps, pPageView, (void*&)pRect);
563 delete pRect;
564 }
565 m_mapPageInvalidate.RemoveAll();
566 }
567 void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget,
568 const CFX_RectF& rtInvalidate) {
569 AddInvalidateRect(pWidget->GetPageView(), rtInvalidate);
570 }
571 void CXFA_FFDocView::AddInvalidateRect(IXFA_PageView* pPageView,
572 const CFX_RectF& rtInvalidate) {
573 CFX_RectF* pRect = (CFX_RectF*)m_mapPageInvalidate.GetValueAt(pPageView);
574 if (!pRect) {
575 pRect = new CFX_RectF;
576 pRect->Set(rtInvalidate.left, rtInvalidate.top, rtInvalidate.width,
577 rtInvalidate.height);
578 m_mapPageInvalidate.SetAt(pPageView, pRect);
579 } else {
580 pRect->Union(rtInvalidate);
581 }
582 }
583 void CXFA_FFDocView::RunInvalidate() {
584 FX_POSITION ps = m_mapPageInvalidate.GetStartPosition();
585 while (ps) {
586 IXFA_PageView* pPageView = NULL;
587 CFX_RectF* pRect = NULL;
588 m_mapPageInvalidate.GetNextAssoc(ps, (void*&)pPageView, (void*&)pRect);
589 m_pDoc->GetDocProvider()->InvalidateRect(pPageView, *pRect);
590 delete pRect;
591 }
592 m_mapPageInvalidate.RemoveAll();
593 }
594 FX_BOOL CXFA_FFDocView::RunLayout() {
595 LockUpdate();
596 m_bInLayoutStatus = TRUE;
597 if (!m_pXFADocLayout->IncrementLayout() &&
598 m_pXFADocLayout->StartLayout() < 100) {
599 m_pXFADocLayout->DoLayout();
600 UnlockUpdate();
601 m_bInLayoutStatus = FALSE;
602 return TRUE;
603 }
604 m_bInLayoutStatus = FALSE;
605 UnlockUpdate();
606 return FALSE;
607 }
608 void CXFA_FFDocView::RunSubformIndexChange() {
609 int32_t iSubforms = m_IndexChangedSubforms.GetSize();
610 for (int32_t i = 0; i < iSubforms; i++) {
611 CXFA_Node* pSubformNode =
612 reinterpret_cast<CXFA_Node*>(m_IndexChangedSubforms[i]);
613 CXFA_WidgetAcc* pWidgetAcc = (CXFA_WidgetAcc*)pSubformNode->GetWidgetData();
614 if (!pWidgetAcc) {
615 continue;
616 }
617 CXFA_EventParam eParam;
618 eParam.m_eType = XFA_EVENT_IndexChange;
619 eParam.m_pTarget = pWidgetAcc;
620 pWidgetAcc->ProcessEvent(XFA_ATTRIBUTEENUM_IndexChange, &eParam);
621 }
622 m_IndexChangedSubforms.RemoveAll();
623 }
624 void CXFA_FFDocView::AddNewFormNode(CXFA_Node* pNode) {
625 m_NewAddedNodes.Add(pNode);
626 InitLayout(pNode);
627 }
628 void CXFA_FFDocView::AddIndexChangedSubform(CXFA_Node* pNode) {
629 FXSYS_assert(pNode->GetClassID() == XFA_ELEMENT_Subform);
630 m_IndexChangedSubforms.Add(pNode);
631 }
632 void CXFA_FFDocView::RunDocClose() {
633 CXFA_Node* pRootItem =
634 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
635 if (!pRootItem) {
636 return;
637 }
638 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose);
639 }
640 void CXFA_FFDocView::DestroyDocView() {
641 ClearInvalidateList();
642 m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
643 m_iLock = 0;
644 m_ValidateAccs.RemoveAll();
645 m_bindItems.RemoveAll();
646 m_CalculateAccs.RemoveAll();
647 }
648 FX_BOOL CXFA_FFDocView::IsStaticNotify() {
649 return m_pDoc->GetDocType() == XFA_DOCTYPE_Static;
650 }
651 void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
652 int32_t iAccs = m_CalculateAccs.GetSize();
653 CXFA_WidgetAcc* pCurrentAcc =
654 (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
655 : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
656 if (pCurrentAcc != pWidgetAcc) {
657 m_CalculateAccs.Add(pWidgetAcc);
658 }
659 }
660 void CXFA_FFDocView::AddCalculateNodeNotify(CXFA_Node* pNodeChange) {
661 CXFA_CalcData* pGlobalData =
662 (CXFA_CalcData*)pNodeChange->GetUserData(XFA_CalcData);
663 int32_t iCount = pGlobalData ? pGlobalData->m_Globals.GetSize() : 0;
664 for (int32_t i = 0; i < iCount; i++) {
665 CXFA_WidgetAcc* pResultAcc = (CXFA_WidgetAcc*)pGlobalData->m_Globals[i];
666 if (pResultAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
667 continue;
668 }
669 int32_t iAccs = m_CalculateAccs.GetSize();
670 CXFA_WidgetAcc* pCurrentAcc =
671 (iAccs < 1) ? (CXFA_WidgetAcc*)NULL
672 : (CXFA_WidgetAcc*)m_CalculateAccs[iAccs - 1];
673 if (pCurrentAcc != pResultAcc) {
674 m_CalculateAccs.Add(pResultAcc);
675 }
676 }
677 }
678 void CXFA_FFDocView::RunCalculateRecursive(int32_t& iIndex) {
679 while (iIndex < m_CalculateAccs.GetSize()) {
680 CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[iIndex];
681 AddCalculateNodeNotify(pCurAcc->GetNode());
682 int32_t iRefCount =
683 (int32_t)(uintptr_t)pCurAcc->GetNode()->GetUserData(XFA_CalcRefCount);
684 iRefCount++;
685 pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount,
686 (void*)(uintptr_t)iRefCount);
687 if (iRefCount > 11) {
688 break;
689 }
690 if ((pCurAcc->ProcessCalculate()) == XFA_EVENTERROR_Sucess) {
691 AddValidateWidget(pCurAcc);
692 }
693 iIndex++;
694 RunCalculateRecursive(iIndex);
695 }
696 }
697 int32_t CXFA_FFDocView::RunCalculateWidgets() {
698 if (!m_pDoc->GetDocProvider()->IsCalculationsEnabled(m_pDoc)) {
699 return XFA_EVENTERROR_Disabled;
700 }
701 int32_t iCounts = m_CalculateAccs.GetSize();
702 int32_t iIndex = 0;
703 if (iCounts > 0) {
704 RunCalculateRecursive(iIndex);
705 }
706 for (int32_t i = 0; i < m_CalculateAccs.GetSize(); i++) {
707 CXFA_WidgetAcc* pCurAcc = (CXFA_WidgetAcc*)m_CalculateAccs[i];
708 pCurAcc->GetNode()->SetUserData(XFA_CalcRefCount, (void*)(uintptr_t)0);
709 }
710 m_CalculateAccs.RemoveAll();
711 return XFA_EVENTERROR_Sucess;
712 }
713 void CXFA_FFDocView::AddValidateWidget(CXFA_WidgetAcc* pWidget) {
714 if (m_ValidateAccs.Find(pWidget) < 0) {
715 m_ValidateAccs.Add(pWidget);
716 }
717 }
718 FX_BOOL CXFA_FFDocView::InitCalculate(CXFA_Node* pNode) {
719 ExecEventActivityByDeepFirst(pNode, XFA_EVENT_InitCalculate);
720 return TRUE;
721 }
722 FX_BOOL CXFA_FFDocView::InitValidate(CXFA_Node* pNode) {
723 if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
724 return FALSE;
725 }
726 ExecEventActivityByDeepFirst(pNode, XFA_EVENT_Validate);
727 m_ValidateAccs.RemoveAll();
728 return TRUE;
729 }
730 FX_BOOL CXFA_FFDocView::RunValidate() {
731 if (!m_pDoc->GetDocProvider()->IsValidationsEnabled(m_pDoc)) {
732 return FALSE;
733 }
734 int32_t iCounts = m_ValidateAccs.GetSize();
735 for (int32_t i = 0; i < iCounts; i++) {
736 CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)m_ValidateAccs[i];
737 if (pAcc->GetNode()->HasFlag(XFA_NODEFLAG_HasRemoved)) {
738 continue;
739 }
740 pAcc->ProcessValidate();
741 }
742 m_ValidateAccs.RemoveAll();
743 return TRUE;
744 }
745 FX_BOOL CXFA_FFDocView::RunEventLayoutReady() {
746 CXFA_Node* pRootItem =
747 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
748 if (!pRootItem) {
749 return FALSE;
750 }
751 ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_Ready);
752 RunLayout();
753 return TRUE;
754 }
755 void CXFA_FFDocView::RunBindItems() {
756 int32_t iCount = m_bindItems.GetSize();
757 for (int32_t i = 0; i < iCount; i++) {
758 if (reinterpret_cast<CXFA_Node*>(m_bindItems[i])
759 ->HasFlag(XFA_NODEFLAG_HasRemoved)) {
760 continue;
761 }
762 CXFA_Node* pWidgetNode = reinterpret_cast<CXFA_Node*>(m_bindItems[i])
763 ->GetNodeItem(XFA_NODEITEM_Parent);
764 CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pWidgetNode->GetWidgetData();
765 if (!pAcc) {
766 continue;
767 }
768 CXFA_BindItems binditems(reinterpret_cast<CXFA_Node*>(m_bindItems[i]));
769 IXFA_ScriptContext* pScriptContext =
770 pWidgetNode->GetDocument()->GetScriptContext();
771 CFX_WideStringC wsRef;
772 binditems.GetRef(wsRef);
773 FX_DWORD dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
774 XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
775 XFA_RESOLVENODE_ALL;
776 XFA_RESOLVENODE_RS rs;
777 pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle);
778 int32_t iCount = rs.nodes.GetSize();
779 pAcc->DeleteItem(-1);
780 if (rs.dwFlags != XFA_RESOVENODE_RSTYPE_Nodes || iCount < 1) {
781 continue;
782 }
783 CFX_WideStringC wsValueRef, wsLabelRef;
784 binditems.GetValueRef(wsValueRef);
785 binditems.GetLabelRef(wsLabelRef);
786 const bool bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef;
787 const bool bLabelUseContent =
788 wsLabelRef.IsEmpty() || wsLabelRef == FX_WSTRC(L"$");
789 const bool bValueUseContent =
790 wsValueRef.IsEmpty() || wsValueRef == FX_WSTRC(L"$");
791 CFX_WideString wsValue, wsLabel;
792 FX_DWORD uValueHash = FX_HashCode_String_GetW(CFX_WideString(wsValueRef),
793 wsValueRef.GetLength());
794 for (int32_t i = 0; i < iCount; i++) {
795 CXFA_Object* refObj = rs.nodes[i];
796 if (!refObj->IsNode()) {
797 continue;
798 }
799 CXFA_Node* refNode = refObj->AsNode();
800 if (bValueUseContent) {
801 wsValue = refNode->GetContent();
802 } else {
803 CXFA_Node* nodeValue = refNode->GetFirstChildByName(uValueHash);
804 if (nodeValue == NULL) {
805 wsValue = refNode->GetContent();
806 } else {
807 wsValue = nodeValue->GetContent();
808 }
809 }
810 if (!bUseValue) {
811 if (bLabelUseContent) {
812 wsLabel = refNode->GetContent();
813 } else {
814 CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef);
815 if (nodeLabel)
816 wsLabel = nodeLabel->GetContent();
817 }
818 } else {
819 wsLabel = wsValue;
820 }
821 pAcc->InsertItem(wsLabel, wsValue);
822 }
823 }
824 m_bindItems.RemoveAll();
825 }
826 void CXFA_FFDocView::SetChangeMark() {
827 if (m_iStatus < XFA_DOCVIEW_LAYOUTSTATUS_End) {
828 return;
829 }
830 m_pDoc->GetDocProvider()->SetChangeMark(m_pDoc);
831 }
832 CXFA_Node* CXFA_FFDocView::GetRootSubform() {
833 CXFA_Node* pFormPacketNode =
834 ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
835 if (!pFormPacketNode) {
836 return NULL;
837 }
838 return pFormPacketNode->GetFirstChildByClass(XFA_ELEMENT_Subform);
839 }
840 CXFA_FFDocWidgetIterator::CXFA_FFDocWidgetIterator(CXFA_FFDocView* pDocView,
841 CXFA_Node* pTravelRoot)
842 : m_ContentIterator(pTravelRoot) {
843 m_pDocView = pDocView;
844 m_pCurWidget = NULL;
845 }
846 CXFA_FFDocWidgetIterator::~CXFA_FFDocWidgetIterator() {}
847 void CXFA_FFDocWidgetIterator::Reset() {
848 m_ContentIterator.Reset();
849 m_pCurWidget = NULL;
850 }
851 IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToFirst() {
852 return NULL;
853 }
854 IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToLast() {
855 return NULL;
856 }
857 IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToNext() {
858 CXFA_Node* pItem = m_pCurWidget ? m_ContentIterator.MoveToNext()
859 : m_ContentIterator.GetCurrent();
860 while (pItem) {
861 if (CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData()) {
862 while ((m_pCurWidget = pAcc->GetNextWidget(NULL))) {
863 if (!m_pCurWidget->IsLoaded() &&
864 (m_pCurWidget->GetStatus() & XFA_WIDGETSTATUS_Visible)) {
865 m_pCurWidget->LoadWidget();
866 }
867 return m_pCurWidget;
868 }
869 }
870 pItem = m_ContentIterator.MoveToNext();
871 }
872 return NULL;
873 }
874 IXFA_Widget* CXFA_FFDocWidgetIterator::MoveToPrevious() {
875 return NULL;
876 }
877 IXFA_Widget* CXFA_FFDocWidgetIterator::GetCurrentWidget() {
878 return NULL;
879 }
880 FX_BOOL CXFA_FFDocWidgetIterator::SetCurrentWidget(IXFA_Widget* hWidget) {
881 return FALSE;
882 }
883 IXFA_WidgetAccIterator* XFA_WidgetAccIterator_Create(
884 CXFA_WidgetAcc* pTravelRoot,
885 XFA_WIDGETORDER eOrder) {
886 if (!pTravelRoot) {
887 return NULL;
888 }
889 return new CXFA_WidgetAccIterator(pTravelRoot->GetDocView(),
890 pTravelRoot->GetNode());
891 }
892 CXFA_WidgetAccIterator::CXFA_WidgetAccIterator(CXFA_FFDocView* pDocView,
893 CXFA_Node* pTravelRoot)
894 : m_ContentIterator(pTravelRoot) {
895 m_pDocView = pDocView;
896 m_pCurWidgetAcc = NULL;
897 }
898 CXFA_WidgetAccIterator::~CXFA_WidgetAccIterator() {}
899 void CXFA_WidgetAccIterator::Reset() {
900 m_pCurWidgetAcc = NULL;
901 m_ContentIterator.Reset();
902 }
903 CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToFirst() {
904 return NULL;
905 }
906 CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToLast() {
907 return NULL;
908 }
909 CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToNext() {
910 CXFA_Node* pItem = m_pCurWidgetAcc ? m_ContentIterator.MoveToNext()
911 : m_ContentIterator.GetCurrent();
912 while (pItem) {
913 if ((m_pCurWidgetAcc = (CXFA_WidgetAcc*)pItem->GetWidgetData())) {
914 return m_pCurWidgetAcc;
915 }
916 pItem = m_ContentIterator.MoveToNext();
917 }
918 return NULL;
919 }
920 CXFA_WidgetAcc* CXFA_WidgetAccIterator::MoveToPrevious() {
921 return NULL;
922 }
923 CXFA_WidgetAcc* CXFA_WidgetAccIterator::GetCurrentWidgetAcc() {
924 return NULL;
925 }
926 FX_BOOL CXFA_WidgetAccIterator::SetCurrentWidgetAcc(CXFA_WidgetAcc* hWidget) {
927 return FALSE;
928 }
929 void CXFA_WidgetAccIterator::SkipTree() {
930 m_ContentIterator.SkipChildrenAndMoveToNext();
931 m_pCurWidgetAcc = NULL;
932 }
OLDNEW
« no previous file with comments | « xfa/src/fxfa/app/xfa_ffdocview.h ('k') | xfa/src/fxfa/app/xfa_ffdraw.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698