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/foxitlib.h"
8 #include "xfa/src/fxfa/src/common/xfa_utils.h"
9 #include "xfa/src/fxfa/src/common/xfa_object.h"
10 #include "xfa/src/fxfa/src/common/xfa_document.h"
11 #include "xfa/src/fxfa/src/common/xfa_parser.h"
12 #include "xfa/src/fxfa/src/common/xfa_script.h"
13 #include "xfa/src/fxfa/src/common/xfa_docdata.h"
14 #include "xfa/src/fxfa/src/common/xfa_doclayout.h"
15 #include "xfa/src/fxfa/src/common/xfa_localemgr.h"
16 #include "xfa/src/fxfa/src/common/xfa_fm2jsapi.h"
17 #include "xfa_script_layoutpseudomodel.h"
18 #include "xfa_document_layout_imp.h"
19 #include "xfa_layout_appadapter.h"
CScript_LayoutPseudoModel(CXFA_Document * pDocument)20 CScript_LayoutPseudoModel::CScript_LayoutPseudoModel(CXFA_Document* pDocument)
21     : CXFA_OrdinaryObject(pDocument, XFA_ELEMENT_LayoutPseudoModel) {
22   m_uScriptHash = XFA_HASHCODE_Layout;
23 }
~CScript_LayoutPseudoModel()24 CScript_LayoutPseudoModel::~CScript_LayoutPseudoModel() {}
Script_LayoutPseudoModel_Ready(FXJSE_HVALUE hValue,FX_BOOL bSetting,XFA_ATTRIBUTE eAttribute)25 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Ready(
26     FXJSE_HVALUE hValue,
27     FX_BOOL bSetting,
28     XFA_ATTRIBUTE eAttribute) {
29   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
30   if (!pNotify) {
31     return;
32   }
33   if (bSetting) {
34     ThrowScriptErrorMessage(XFA_IDS_UNABLE_SET_READY);
35     return;
36   }
37   int32_t iStatus = pNotify->GetLayoutStatus();
38   FXJSE_Value_SetBoolean(hValue, iStatus >= 2);
39 }
Script_LayoutPseudoModel_HWXY(CFXJSE_Arguments * pArguments,XFA_LAYOUTMODEL_HWXY layoutModel)40 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_HWXY(
41     CFXJSE_Arguments* pArguments,
42     XFA_LAYOUTMODEL_HWXY layoutModel) {
43   int32_t iLength = pArguments->GetLength();
44   if (iLength < 1 || iLength > 3) {
45     const FX_WCHAR* methodName = NULL;
46     switch (layoutModel) {
47       case XFA_LAYOUTMODEL_H:
48         methodName = L"h";
49         break;
50       case XFA_LAYOUTMODEL_W:
51         methodName = L"w";
52         break;
53       case XFA_LAYOUTMODEL_X:
54         methodName = L"x";
55         break;
56       case XFA_LAYOUTMODEL_Y:
57         methodName = L"y";
58         break;
59     }
60     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
61     return;
62   }
63   CXFA_Node* pNode = NULL;
64   CFX_WideString wsUnit = FX_WSTRC(L"pt");
65   int32_t iIndex = 0;
66   if (iLength >= 1) {
67     pNode = (CXFA_Node*)pArguments->GetObject(0);
68   }
69   if (iLength >= 2) {
70     CFX_ByteString bsUnit = pArguments->GetUTF8String(1);
71     if (!bsUnit.IsEmpty()) {
72       wsUnit = CFX_WideString::FromUTF8(bsUnit, bsUnit.GetLength());
73     }
74   }
75   if (iLength >= 3) {
76     iIndex = pArguments->GetInt32(2);
77   }
78   if (!pNode) {
79     return;
80   }
81   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
82   if (!pDocLayout) {
83     return;
84   }
85   CFX_RectF rtRect;
86   CXFA_Measurement measure;
87   CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
88   if (!pLayoutItem) {
89     return;
90   }
91   while (iIndex > 0 && pLayoutItem) {
92     pLayoutItem = pLayoutItem->GetNext();
93     iIndex--;
94   }
95   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
96   if (!pLayoutItem) {
97     FXJSE_Value_SetFloat(hValue, 0);
98     return;
99   }
100   pLayoutItem->GetRect(rtRect, TRUE);
101   switch (layoutModel) {
102     case XFA_LAYOUTMODEL_H:
103       measure.Set(rtRect.height, XFA_UNIT_Pt);
104       break;
105     case XFA_LAYOUTMODEL_W:
106       measure.Set(rtRect.width, XFA_UNIT_Pt);
107       break;
108     case XFA_LAYOUTMODEL_X:
109       measure.Set(rtRect.left, XFA_UNIT_Pt);
110       break;
111     case XFA_LAYOUTMODEL_Y:
112       measure.Set(rtRect.top, XFA_UNIT_Pt);
113       break;
114   }
115   XFA_UNIT unit = measure.GetUnit(wsUnit);
116   FX_FLOAT fValue = measure.ToUnit(unit);
117   fValue = FXSYS_round(fValue * 1000) / 1000.0f;
118   if (hValue) {
119     FXJSE_Value_SetFloat(hValue, fValue);
120   }
121 }
Script_LayoutPseudoModel_H(CFXJSE_Arguments * pArguments)122 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_H(
123     CFXJSE_Arguments* pArguments) {
124   Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_H);
125 }
Script_LayoutPseudoModel_W(CFXJSE_Arguments * pArguments)126 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_W(
127     CFXJSE_Arguments* pArguments) {
128   Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_W);
129 }
Script_LayoutPseudoModel_X(CFXJSE_Arguments * pArguments)130 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_X(
131     CFXJSE_Arguments* pArguments) {
132   Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_X);
133 }
Script_LayoutPseudoModel_Y(CFXJSE_Arguments * pArguments)134 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Y(
135     CFXJSE_Arguments* pArguments) {
136   Script_LayoutPseudoModel_HWXY(pArguments, XFA_LAYOUTMODEL_Y);
137 }
Script_LayoutPseudoModel_NumberedPageCount(CFXJSE_Arguments * pArguments,FX_BOOL bNumbered)138 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_NumberedPageCount(
139     CFXJSE_Arguments* pArguments,
140     FX_BOOL bNumbered) {
141   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
142   if (!pDocLayout) {
143     return;
144   }
145   int32_t iPageCount = 0;
146   int32_t iPageNum = pDocLayout->CountPages();
147   if (bNumbered) {
148     for (int32_t i = 0; i < iPageNum; i++) {
149       IXFA_LayoutPage* pLayoutPage = pDocLayout->GetPage(i);
150       if (!pLayoutPage) {
151         continue;
152       }
153       CXFA_Node* pMasterPage = pLayoutPage->GetMasterPage();
154       if (pMasterPage->GetInteger(XFA_ATTRIBUTE_Numbered)) {
155         iPageCount++;
156       }
157     }
158   } else {
159     iPageCount = iPageNum;
160   }
161   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
162   if (hValue) {
163     FXJSE_Value_SetInteger(hValue, iPageCount);
164   }
165 }
Script_LayoutPseudoModel_PageCount(CFXJSE_Arguments * pArguments)166 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageCount(
167     CFXJSE_Arguments* pArguments) {
168   Script_LayoutPseudoModel_NumberedPageCount(pArguments, TRUE);
169 }
Script_LayoutPseudoModel_PageSpan(CFXJSE_Arguments * pArguments)170 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageSpan(
171     CFXJSE_Arguments* pArguments) {
172   int32_t iLength = pArguments->GetLength();
173   if (iLength != 1) {
174     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageSpan");
175     return;
176   }
177   CXFA_Node* pNode = NULL;
178   if (iLength >= 1) {
179     pNode = (CXFA_Node*)pArguments->GetObject(0);
180   }
181   if (!pNode) {
182     return;
183   }
184   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
185   if (!pDocLayout) {
186     return;
187   }
188   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
189   CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
190   if (!pLayoutItem) {
191     FXJSE_Value_SetInteger(hValue, -1);
192     return;
193   }
194   int32_t iLast = pLayoutItem->GetLast()->GetPage()->GetPageIndex();
195   int32_t iFirst = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
196   int32_t iPageSpan = iLast - iFirst + 1;
197   if (hValue) {
198     FXJSE_Value_SetInteger(hValue, iPageSpan);
199   }
200 }
Script_LayoutPseudoModel_Page(CFXJSE_Arguments * pArguments)201 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Page(
202     CFXJSE_Arguments* pArguments) {
203   Script_LayoutPseudoModel_PageImp(pArguments, FALSE);
204 }
Script_LayoutPseudoModel_GetObjArray(IXFA_DocLayout * pDocLayout,int32_t iPageNo,const CFX_WideString & wsType,FX_BOOL bOnPageArea,CXFA_NodeArray & retArray)205 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_GetObjArray(
206     IXFA_DocLayout* pDocLayout,
207     int32_t iPageNo,
208     const CFX_WideString& wsType,
209     FX_BOOL bOnPageArea,
210     CXFA_NodeArray& retArray) {
211   CXFA_ContainerLayoutItem* pLayoutPage =
212       (CXFA_ContainerLayoutItem*)pDocLayout->GetPage(iPageNo);
213   if (!pLayoutPage) {
214     return;
215   }
216   if (wsType == FX_WSTRC(L"pageArea")) {
217     if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
218       retArray.Add(pMasterPage);
219     }
220     return;
221   }
222   if (wsType == FX_WSTRC(L"contentArea")) {
223     for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
224          pItem = pItem->m_pNextSibling) {
225       if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
226         retArray.Add(pItem->m_pFormNode);
227       }
228     }
229     return;
230   }
231   CFX_MapPtrToPtr formItems;
232   formItems.InitHashTable(256, TRUE);
233   if (wsType.IsEmpty()) {
234     if (CXFA_Node* pMasterPage = pLayoutPage->m_pFormNode) {
235       retArray.Add(pMasterPage);
236     }
237     for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
238          pItem = pItem->m_pNextSibling) {
239       if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
240         retArray.Add(pItem->m_pFormNode);
241         if (!bOnPageArea) {
242           CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
243                                     CXFA_TraverseStrategy_ContentLayoutItem>
244           iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
245           for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
246                pItemChild; pItemChild = iterator.MoveToNext()) {
247             if (!pItemChild->IsContentLayoutItem()) {
248               continue;
249             }
250             XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
251             if (eElementType != XFA_ELEMENT_Field &&
252                 eElementType != XFA_ELEMENT_Draw &&
253                 eElementType != XFA_ELEMENT_Subform &&
254                 eElementType != XFA_ELEMENT_Area) {
255               continue;
256             }
257             if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
258               continue;
259             }
260             formItems.SetAt(pItemChild->m_pFormNode, this);
261             retArray.Add(pItemChild->m_pFormNode);
262           }
263         }
264       } else {
265         if (bOnPageArea) {
266           CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
267                                     CXFA_TraverseStrategy_ContentLayoutItem>
268           iterator((CXFA_ContentLayoutItem*)pItem);
269           for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
270                pItemChild; pItemChild = iterator.MoveToNext()) {
271             if (!pItemChild->IsContentLayoutItem()) {
272               continue;
273             }
274             XFA_ELEMENT eElementType = pItemChild->m_pFormNode->GetClassID();
275             if (eElementType != XFA_ELEMENT_Field &&
276                 eElementType != XFA_ELEMENT_Draw &&
277                 eElementType != XFA_ELEMENT_Subform &&
278                 eElementType != XFA_ELEMENT_Area) {
279               continue;
280             }
281             if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
282               continue;
283             }
284             formItems.SetAt(pItemChild->m_pFormNode, this);
285             retArray.Add(pItemChild->m_pFormNode);
286           }
287         }
288       }
289     }
290     return;
291   }
292   XFA_ELEMENT eType = XFA_ELEMENT_UNKNOWN;
293   if (wsType == FX_WSTRC(L"field")) {
294     eType = XFA_ELEMENT_Field;
295   } else if (wsType == FX_WSTRC(L"draw")) {
296     eType = XFA_ELEMENT_Draw;
297   } else if (wsType == FX_WSTRC(L"subform")) {
298     eType = XFA_ELEMENT_Subform;
299   } else if (wsType == FX_WSTRC(L"area")) {
300     eType = XFA_ELEMENT_Area;
301   }
302   if (eType != XFA_ELEMENT_UNKNOWN) {
303     for (CXFA_LayoutItem* pItem = pLayoutPage->m_pFirstChild; pItem;
304          pItem = pItem->m_pNextSibling) {
305       if (pItem->m_pFormNode->GetClassID() == XFA_ELEMENT_ContentArea) {
306         if (!bOnPageArea) {
307           CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
308                                     CXFA_TraverseStrategy_ContentLayoutItem>
309           iterator((CXFA_ContentLayoutItem*)pItem->m_pFirstChild);
310           for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
311                pItemChild; pItemChild = iterator.MoveToNext()) {
312             if (!pItemChild->IsContentLayoutItem()) {
313               continue;
314             }
315             if (pItemChild->m_pFormNode->GetClassID() != eType) {
316               continue;
317             }
318             if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
319               continue;
320             }
321             formItems.SetAt(pItemChild->m_pFormNode, this);
322             retArray.Add(pItemChild->m_pFormNode);
323           }
324         }
325       } else {
326         if (bOnPageArea) {
327           CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
328                                     CXFA_TraverseStrategy_ContentLayoutItem>
329           iterator((CXFA_ContentLayoutItem*)pItem);
330           for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
331                pItemChild; pItemChild = iterator.MoveToNext()) {
332             if (!pItemChild->IsContentLayoutItem()) {
333               continue;
334             }
335             if (pItemChild->m_pFormNode->GetClassID() != eType) {
336               continue;
337             }
338             if (formItems.GetValueAt(pItemChild->m_pFormNode)) {
339               continue;
340             }
341             formItems.SetAt(pItemChild->m_pFormNode, this);
342             retArray.Add(pItemChild->m_pFormNode);
343           }
344         }
345       }
346     }
347     return;
348   }
349 }
Script_LayoutPseudoModel_PageContent(CFXJSE_Arguments * pArguments)350 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageContent(
351     CFXJSE_Arguments* pArguments) {
352   int32_t iLength = pArguments->GetLength();
353   if (iLength < 1 || iLength > 3) {
354     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"pageContent");
355     return;
356   }
357   int32_t iIndex = 0;
358   CFX_WideString wsType;
359   FX_BOOL bOnPageArea = FALSE;
360   if (iLength >= 1) {
361     iIndex = pArguments->GetInt32(0);
362   }
363   if (iLength >= 2) {
364     CFX_ByteString bsType = pArguments->GetUTF8String(1);
365     wsType = CFX_WideString::FromUTF8(bsType, bsType.GetLength());
366   }
367   if (iLength >= 3) {
368     bOnPageArea = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
369   }
370   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
371   if (!pNotify) {
372     return;
373   }
374   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
375   if (!pDocLayout) {
376     return;
377   }
378   CXFA_NodeArray retArray;
379   Script_LayoutPseudoModel_GetObjArray(pDocLayout, iIndex, wsType, bOnPageArea,
380                                        retArray);
381   CXFA_ArrayNodeList* pArrayNodeList = new CXFA_ArrayNodeList(m_pDocument);
382   pArrayNodeList->SetArrayNodeList(retArray);
383   FXJSE_Value_SetObject(pArguments->GetReturnValue(),
384                         (CXFA_Object*)pArrayNodeList,
385                         m_pDocument->GetScriptContext()->GetJseNormalClass());
386 }
Script_LayoutPseudoModel_AbsPageCount(CFXJSE_Arguments * pArguments)387 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCount(
388     CFXJSE_Arguments* pArguments) {
389   Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
390 }
Script_LayoutPseudoModel_AbsPageCountInBatch(CFXJSE_Arguments * pArguments)391 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageCountInBatch(
392     CFXJSE_Arguments* pArguments) {
393   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
394   if (!pNotify) {
395     return;
396   }
397   IXFA_Doc* hDoc = pNotify->GetHDOC();
398   int32_t iPageCount = pNotify->GetDocProvider()->AbsPageCountInBatch(hDoc);
399   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
400   if (hValue) {
401     FXJSE_Value_SetInteger(hValue, iPageCount);
402   }
403 }
Script_LayoutPseudoModel_SheetCountInBatch(CFXJSE_Arguments * pArguments)404 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCountInBatch(
405     CFXJSE_Arguments* pArguments) {
406   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
407   if (!pNotify) {
408     return;
409   }
410   IXFA_Doc* hDoc = pNotify->GetHDOC();
411   int32_t iPageCount = pNotify->GetDocProvider()->SheetCountInBatch(hDoc);
412   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
413   if (hValue) {
414     FXJSE_Value_SetInteger(hValue, iPageCount);
415   }
416 }
Script_LayoutPseudoModel_Relayout(CFXJSE_Arguments * pArguments)417 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Relayout(
418     CFXJSE_Arguments* pArguments) {
419   CXFA_Node* pRootNode = m_pDocument->GetRoot();
420   CXFA_Node* pFormRoot = pRootNode->GetFirstChildByClass(XFA_ELEMENT_Form);
421   FXSYS_assert(pFormRoot);
422   CXFA_Node* pContentRootNode = pFormRoot->GetNodeItem(XFA_NODEITEM_FirstChild);
423   CXFA_LayoutProcessor* pLayoutProcessor = m_pDocument->GetLayoutProcessor();
424   if (pContentRootNode) {
425     pLayoutProcessor->AddChangedContainer(pContentRootNode);
426   }
427   pLayoutProcessor->SetForceReLayout(TRUE);
428 }
Script_LayoutPseudoModel_AbsPageSpan(CFXJSE_Arguments * pArguments)429 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageSpan(
430     CFXJSE_Arguments* pArguments) {
431   Script_LayoutPseudoModel_PageSpan(pArguments);
432 }
Script_LayoutPseudoModel_AbsPageInBatch(CFXJSE_Arguments * pArguments)433 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPageInBatch(
434     CFXJSE_Arguments* pArguments) {
435   int32_t iLength = pArguments->GetLength();
436   if (iLength != 1) {
437     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
438                             L"absPageInBatch");
439     return;
440   }
441   CXFA_Node* pNode = NULL;
442   if (iLength >= 1) {
443     pNode = (CXFA_Node*)pArguments->GetObject(0);
444   }
445   if (!pNode) {
446     return;
447   }
448   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
449   if (!pNotify) {
450     return;
451   }
452   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
453   if (!pDocLayout) {
454     return;
455   }
456   IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
457   if (!hWidget) {
458     return;
459   }
460   IXFA_Doc* hDoc = pNotify->GetHDOC();
461   int32_t iPageCount = pNotify->GetDocProvider()->AbsPageInBatch(hDoc, hWidget);
462   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
463   if (hValue) {
464     FXJSE_Value_SetInteger(hValue, iPageCount);
465   }
466 }
Script_LayoutPseudoModel_SheetInBatch(CFXJSE_Arguments * pArguments)467 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetInBatch(
468     CFXJSE_Arguments* pArguments) {
469   int32_t iLength = pArguments->GetLength();
470   if (iLength != 1) {
471     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD,
472                             L"sheetInBatch");
473     return;
474   }
475   CXFA_Node* pNode = NULL;
476   if (iLength >= 1) {
477     pNode = (CXFA_Node*)pArguments->GetObject(0);
478   }
479   if (!pNode) {
480     return;
481   }
482   IXFA_Notify* pNotify = m_pDocument->GetParser()->GetNotify();
483   if (!pNotify) {
484     return;
485   }
486   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
487   if (!pDocLayout) {
488     return;
489   }
490   IXFA_Widget* hWidget = pNotify->GetHWidget(pDocLayout->GetLayoutItem(pNode));
491   if (!hWidget) {
492     return;
493   }
494   IXFA_Doc* hDoc = pNotify->GetHDOC();
495   int32_t iPageCount = pNotify->GetDocProvider()->SheetInBatch(hDoc, hWidget);
496   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
497   if (hValue) {
498     FXJSE_Value_SetInteger(hValue, iPageCount);
499   }
500 }
Script_LayoutPseudoModel_Sheet(CFXJSE_Arguments * pArguments)501 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_Sheet(
502     CFXJSE_Arguments* pArguments) {
503   Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
504 }
Script_LayoutPseudoModel_RelayoutPageArea(CFXJSE_Arguments * pArguments)505 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_RelayoutPageArea(
506     CFXJSE_Arguments* pArguments) {}
Script_LayoutPseudoModel_SheetCount(CFXJSE_Arguments * pArguments)507 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_SheetCount(
508     CFXJSE_Arguments* pArguments) {
509   Script_LayoutPseudoModel_NumberedPageCount(pArguments, FALSE);
510 }
Script_LayoutPseudoModel_AbsPage(CFXJSE_Arguments * pArguments)511 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_AbsPage(
512     CFXJSE_Arguments* pArguments) {
513   Script_LayoutPseudoModel_PageImp(pArguments, TRUE);
514 }
Script_LayoutPseudoModel_PageImp(CFXJSE_Arguments * pArguments,FX_BOOL bAbsPage)515 void CScript_LayoutPseudoModel::Script_LayoutPseudoModel_PageImp(
516     CFXJSE_Arguments* pArguments,
517     FX_BOOL bAbsPage) {
518   int32_t iLength = pArguments->GetLength();
519   if (iLength != 1) {
520     const FX_WCHAR* methodName;
521     if (bAbsPage) {
522       methodName = L"absPage";
523     } else {
524       methodName = L"page";
525     }
526     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, methodName);
527     return;
528   }
529   CXFA_Node* pNode = NULL;
530   if (iLength >= 1) {
531     pNode = (CXFA_Node*)pArguments->GetObject(0);
532   }
533   int32_t iPage = 0;
534   FXJSE_HVALUE hValue = pArguments->GetReturnValue();
535   if (!pNode && hValue) {
536     FXJSE_Value_SetInteger(hValue, iPage);
537   }
538   IXFA_DocLayout* pDocLayout = m_pDocument->GetDocLayout();
539   if (!pDocLayout) {
540     return;
541   }
542   CXFA_LayoutItem* pLayoutItem = pDocLayout->GetLayoutItem(pNode);
543   if (!pLayoutItem) {
544     FXJSE_Value_SetInteger(hValue, -1);
545     return;
546   }
547   iPage = pLayoutItem->GetFirst()->GetPage()->GetPageIndex();
548   if (hValue) {
549     FXJSE_Value_SetInteger(hValue, bAbsPage ? iPage : iPage + 1);
550   }
551 }
552