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

Side by Side Diff: xfa/src/fxfa/app/xfa_ffwidgetacc.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_ffwidgetacc.h ('k') | xfa/src/fxfa/app/xfa_ffwidgethandler.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_ffwidgetacc.h"
8
9 #include <algorithm>
10
11 #include "xfa/src/fde/tto/fde_textout.h"
12 #include "xfa/src/fxfa/app/xfa_ffapp.h"
13 #include "xfa/src/fxfa/app/xfa_ffcheckbutton.h"
14 #include "xfa/src/fxfa/app/xfa_ffchoicelist.h"
15 #include "xfa/src/fxfa/app/xfa_ffdoc.h"
16 #include "xfa/src/fxfa/app/xfa_ffdocview.h"
17 #include "xfa/src/fxfa/app/xfa_fffield.h"
18 #include "xfa/src/fxfa/app/xfa_ffpageview.h"
19 #include "xfa/src/fxfa/app/xfa_ffwidget.h"
20 #include "xfa/src/fxfa/app/xfa_fontmgr.h"
21 #include "xfa/src/fxfa/app/xfa_fwladapter.h"
22 #include "xfa/src/fxfa/app/xfa_textlayout.h"
23 #include "xfa/src/fxfa/parser/xfa_localevalue.h"
24 #include "xfa/src/fxfa/parser/xfa_script.h"
25
26 static void XFA_FFDeleteCalcData(void* pData) {
27 if (pData) {
28 delete ((CXFA_CalcData*)pData);
29 }
30 }
31 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADeleteCalcData = {
32 XFA_FFDeleteCalcData, NULL};
33 class CXFA_WidgetLayoutData {
34 public:
35 CXFA_WidgetLayoutData() : m_fWidgetHeight(-1) {}
36 virtual ~CXFA_WidgetLayoutData() {}
37 virtual void Release() { delete this; }
38 FX_FLOAT m_fWidgetHeight;
39 };
40 class CXFA_TextLayoutData : public CXFA_WidgetLayoutData {
41 public:
42 CXFA_TextLayoutData() : m_pTextLayout(NULL), m_pTextProvider(NULL) {}
43 ~CXFA_TextLayoutData() {
44 if (m_pTextLayout) {
45 delete m_pTextLayout;
46 }
47 m_pTextLayout = NULL;
48 if (m_pTextProvider) {
49 delete m_pTextProvider;
50 }
51 m_pTextProvider = NULL;
52 }
53 void LoadText(CXFA_WidgetAcc* pAcc) {
54 if (m_pTextLayout)
55 return;
56
57 m_pTextProvider = new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Text);
58 m_pTextLayout = new CXFA_TextLayout(m_pTextProvider);
59 }
60 CXFA_TextLayout* m_pTextLayout;
61 CXFA_TextProvider* m_pTextProvider;
62 };
63 class CXFA_ImageLayoutData : public CXFA_WidgetLayoutData {
64 public:
65 CXFA_ImageLayoutData()
66 : m_pDIBitmap(NULL),
67 m_bNamedImage(FALSE),
68 m_iImageXDpi(0),
69 m_iImageYDpi(0) {}
70
71 ~CXFA_ImageLayoutData() {
72 if (m_pDIBitmap && !m_bNamedImage) {
73 delete m_pDIBitmap;
74 }
75 m_pDIBitmap = NULL;
76 }
77
78 FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
79 if (m_pDIBitmap) {
80 return TRUE;
81 }
82 CXFA_Value value = pAcc->GetFormValue();
83 if (!value) {
84 return FALSE;
85 }
86 CXFA_Image imageObj = value.GetImage();
87 if (!imageObj) {
88 return FALSE;
89 }
90 CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
91 pAcc->SetImageImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
92 m_iImageXDpi, m_iImageYDpi));
93 return m_pDIBitmap != NULL;
94 }
95
96 CFX_DIBitmap* m_pDIBitmap;
97 FX_BOOL m_bNamedImage;
98 int32_t m_iImageXDpi;
99 int32_t m_iImageYDpi;
100 };
101 class CXFA_FieldLayoutData : public CXFA_WidgetLayoutData {
102 public:
103 CXFA_FieldLayoutData()
104 : m_pCapTextLayout(NULL),
105 m_pCapTextProvider(NULL),
106 m_pTextOut(NULL),
107 m_pFieldSplitArray(NULL) {}
108 ~CXFA_FieldLayoutData() {
109 if (m_pCapTextLayout) {
110 delete m_pCapTextLayout;
111 }
112 m_pCapTextLayout = NULL;
113 if (m_pCapTextProvider) {
114 delete m_pCapTextProvider;
115 }
116 m_pCapTextProvider = NULL;
117 if (m_pTextOut) {
118 m_pTextOut->Release();
119 }
120 m_pTextOut = NULL;
121 if (m_pFieldSplitArray) {
122 m_pFieldSplitArray->RemoveAll();
123 delete m_pFieldSplitArray;
124 m_pFieldSplitArray = NULL;
125 }
126 }
127 FX_BOOL LoadCaption(CXFA_WidgetAcc* pAcc) {
128 if (m_pCapTextLayout) {
129 return TRUE;
130 }
131 CXFA_Caption caption = pAcc->GetCaption();
132 if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
133 m_pCapTextProvider =
134 new CXFA_TextProvider(pAcc, XFA_TEXTPROVIDERTYPE_Caption);
135 m_pCapTextLayout = new CXFA_TextLayout(m_pCapTextProvider);
136 return TRUE;
137 }
138 return FALSE;
139 }
140 CXFA_TextLayout* m_pCapTextLayout;
141 CXFA_TextProvider* m_pCapTextProvider;
142 IFDE_TextOut* m_pTextOut;
143 CFX_FloatArray* m_pFieldSplitArray;
144 };
145 class CXFA_TextEditData : public CXFA_FieldLayoutData {
146 public:
147 };
148 class CXFA_ImageEditData : public CXFA_FieldLayoutData {
149 public:
150 CXFA_ImageEditData()
151 : m_pDIBitmap(NULL),
152 m_bNamedImage(FALSE),
153 m_iImageXDpi(0),
154 m_iImageYDpi(0) {}
155
156 ~CXFA_ImageEditData() {
157 if (m_pDIBitmap && !m_bNamedImage) {
158 delete m_pDIBitmap;
159 }
160 m_pDIBitmap = NULL;
161 }
162 FX_BOOL LoadImageData(CXFA_WidgetAcc* pAcc) {
163 if (m_pDIBitmap) {
164 return TRUE;
165 }
166 CXFA_Value value = pAcc->GetFormValue();
167 if (!value) {
168 return FALSE;
169 }
170 CXFA_Image imageObj = value.GetImage();
171 CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
172 pAcc->SetImageEditImage(XFA_LoadImageData(pFFDoc, &imageObj, m_bNamedImage,
173 m_iImageXDpi, m_iImageYDpi));
174 return m_pDIBitmap != NULL;
175 }
176 CFX_DIBitmap* m_pDIBitmap;
177 FX_BOOL m_bNamedImage;
178 int32_t m_iImageXDpi;
179 int32_t m_iImageYDpi;
180 };
181 CXFA_WidgetAcc::CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode)
182 : CXFA_WidgetData(pNode),
183 m_pDocView(pDocView),
184 m_pLayoutData(NULL),
185 m_nRecursionDepth(0) {}
186 CXFA_WidgetAcc::~CXFA_WidgetAcc() {
187 if (m_pLayoutData) {
188 m_pLayoutData->Release();
189 m_pLayoutData = NULL;
190 }
191 }
192 FX_BOOL CXFA_WidgetAcc::GetName(CFX_WideString& wsName, int32_t iNameType) {
193 if (iNameType == 0) {
194 m_pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
195 return !wsName.IsEmpty();
196 }
197 m_pNode->GetSOMExpression(wsName);
198 if (iNameType == 2 && wsName.GetLength() >= 15) {
199 CFX_WideStringC wsPre = FX_WSTRC(L"xfa[0].form[0].");
200 if (wsPre == CFX_WideStringC(wsName, wsPre.GetLength())) {
201 wsName.Delete(0, wsPre.GetLength());
202 }
203 }
204 return TRUE;
205 }
206 CXFA_Node* CXFA_WidgetAcc::GetDatasets() {
207 return m_pNode->GetBindData();
208 }
209 FX_BOOL CXFA_WidgetAcc::ProcessValueChanged() {
210 m_pDocView->AddValidateWidget(this);
211 m_pDocView->AddCalculateWidgetAcc(this);
212 m_pDocView->RunCalculateWidgets();
213 m_pDocView->RunValidate();
214 return TRUE;
215 }
216 void CXFA_WidgetAcc::ResetData() {
217 CFX_WideString wsValue;
218 XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
219 switch (eUIType) {
220 case XFA_ELEMENT_ImageEdit: {
221 CXFA_Value imageValue = GetDefaultValue();
222 CXFA_Image image = imageValue.GetImage();
223 CFX_WideString wsContentType, wsHref;
224 if (image) {
225 image.GetContent(wsValue);
226 image.GetContentType(wsContentType);
227 image.GetHref(wsHref);
228 }
229 SetImageEdit(wsContentType, wsHref, wsValue);
230 } break;
231 case XFA_ELEMENT_ExclGroup: {
232 CXFA_Node* pNextChild = m_pNode->GetNodeItem(
233 XFA_NODEITEM_FirstChild, XFA_OBJECTTYPE_ContainerNode);
234 while (pNextChild) {
235 CXFA_Node* pChild = pNextChild;
236 CXFA_WidgetAcc* pAcc = (CXFA_WidgetAcc*)pChild->GetWidgetData();
237 if (!pAcc) {
238 continue;
239 }
240 CXFA_Value defValue(NULL);
241 if (wsValue.IsEmpty() && (defValue = pAcc->GetDefaultValue())) {
242 defValue.GetChildValueContent(wsValue);
243 SetValue(wsValue, XFA_VALUEPICTURE_Raw);
244 pAcc->SetValue(wsValue, XFA_VALUEPICTURE_Raw);
245 } else {
246 CXFA_Node* pItems = pChild->GetChild(0, XFA_ELEMENT_Items);
247 if (!pItems) {
248 continue;
249 }
250 CFX_WideString itemText;
251 if (pItems->CountChildren(XFA_ELEMENT_UNKNOWN) > 1) {
252 itemText = pItems->GetChild(1, XFA_ELEMENT_UNKNOWN)->GetContent();
253 }
254 pAcc->SetValue(itemText, XFA_VALUEPICTURE_Raw);
255 }
256 pNextChild = pChild->GetNodeItem(XFA_NODEITEM_NextSibling,
257 XFA_OBJECTTYPE_ContainerNode);
258 }
259 } break;
260 case XFA_ELEMENT_ChoiceList:
261 ClearAllSelections();
262 default:
263 if (CXFA_Value defValue = GetDefaultValue()) {
264 defValue.GetChildValueContent(wsValue);
265 }
266 SetValue(wsValue, XFA_VALUEPICTURE_Raw);
267 break;
268 }
269 }
270 void CXFA_WidgetAcc::SetImageEdit(const CFX_WideStringC& wsContentType,
271 const CFX_WideStringC& wsHref,
272 const CFX_WideStringC& wsData) {
273 CXFA_Image image = GetFormValue().GetImage();
274 if (image) {
275 image.SetContentType(wsContentType);
276 image.SetHref(wsHref);
277 }
278 CFX_WideString wsFormatValue(wsData);
279 GetFormatDataValue(wsData, wsFormatValue);
280 m_pNode->SetContent(wsData, wsFormatValue, TRUE);
281 CXFA_Node* pBind = GetDatasets();
282 if (!pBind) {
283 image.SetTransferEncoding(XFA_ATTRIBUTEENUM_Base64);
284 return;
285 }
286 pBind->SetCData(XFA_ATTRIBUTE_ContentType, wsContentType);
287 CXFA_Node* pHrefNode = pBind->GetNodeItem(XFA_NODEITEM_FirstChild);
288 if (pHrefNode) {
289 pHrefNode->SetCData(XFA_ATTRIBUTE_Value, wsHref);
290 } else {
291 IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
292 FXSYS_assert(pXMLNode && pXMLNode->GetType() == FDE_XMLNODE_Element);
293 ((IFDE_XMLElement*)pXMLNode)->SetString(FX_WSTRC(L"href"), wsHref);
294 }
295 }
296
297 CXFA_WidgetAcc* CXFA_WidgetAcc::GetExclGroup() {
298 CXFA_Node* pExcl = m_pNode->GetNodeItem(XFA_NODEITEM_Parent);
299 if (!pExcl || pExcl->GetClassID() != XFA_ELEMENT_ExclGroup) {
300 return NULL;
301 }
302 return (CXFA_WidgetAcc*)pExcl->GetWidgetData();
303 }
304 CXFA_FFDocView* CXFA_WidgetAcc::GetDocView() {
305 return m_pDocView;
306 }
307 CXFA_FFDoc* CXFA_WidgetAcc::GetDoc() {
308 return (CXFA_FFDoc*)m_pDocView->GetDoc();
309 }
310 CXFA_FFApp* CXFA_WidgetAcc::GetApp() {
311 return GetDoc()->GetApp();
312 }
313 IXFA_AppProvider* CXFA_WidgetAcc::GetAppProvider() {
314 return GetApp()->GetAppProvider();
315 }
316 int32_t CXFA_WidgetAcc::ProcessEvent(int32_t iActivity,
317 CXFA_EventParam* pEventParam) {
318 if (GetClassID() == XFA_ELEMENT_Draw) {
319 return XFA_EVENTERROR_NotExist;
320 }
321 int32_t iRet = XFA_EVENTERROR_NotExist;
322 CXFA_NodeArray eventArray;
323 int32_t iCounts =
324 GetEventByActivity(iActivity, eventArray, pEventParam->m_bIsFormReady);
325 for (int32_t i = 0; i < iCounts; i++) {
326 CXFA_Event event(eventArray[i]);
327 int32_t result = ProcessEvent(event, pEventParam);
328 if (i == 0) {
329 iRet = result;
330 } else if (result == XFA_EVENTERROR_Sucess) {
331 iRet = result;
332 }
333 }
334 return iRet;
335 }
336 int32_t CXFA_WidgetAcc::ProcessEvent(CXFA_Event& event,
337 CXFA_EventParam* pEventParam) {
338 if (!event) {
339 return XFA_EVENTERROR_NotExist;
340 }
341 switch (event.GetEventType()) {
342 case XFA_ELEMENT_Execute:
343 break;
344 case XFA_ELEMENT_Script: {
345 CXFA_Script script = event.GetScript();
346 return ExecuteScript(script, pEventParam);
347 } break;
348 case XFA_ELEMENT_SignData:
349 break;
350 case XFA_ELEMENT_Submit: {
351 CXFA_Submit submit = event.GetSubmit();
352 return GetDoc()->GetDocProvider()->SubmitData(GetDoc(), submit);
353 }
354 default:
355 break;
356 }
357 return XFA_EVENTERROR_NotExist;
358 }
359 int32_t CXFA_WidgetAcc::ProcessCalculate() {
360 if (GetClassID() == XFA_ELEMENT_Draw) {
361 return XFA_EVENTERROR_NotExist;
362 }
363 CXFA_Calculate calc = GetCalculate();
364 if (!calc) {
365 return XFA_EVENTERROR_NotExist;
366 }
367 if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
368 return XFA_EVENTERROR_Disabled;
369 }
370 CXFA_EventParam EventParam;
371 EventParam.m_eType = XFA_EVENT_Calculate;
372 CXFA_Script script = calc.GetScript();
373 int32_t iRet = ExecuteScript(script, &EventParam);
374 if (iRet == XFA_EVENTERROR_Sucess) {
375 if (GetRawValue() != EventParam.m_wsResult) {
376 const bool bNotify = GetDoc()->GetDocType() == XFA_DOCTYPE_Static;
377 SetValue(EventParam.m_wsResult, XFA_VALUEPICTURE_Raw);
378 UpdateUIDisplay();
379 if (bNotify) {
380 NotifyEvent(XFA_WIDGETEVENT_PostContentChanged, NULL, NULL, NULL);
381 }
382 iRet = XFA_EVENTERROR_Sucess;
383 }
384 }
385 return iRet;
386 }
387 void CXFA_WidgetAcc::ProcessScriptTestValidate(CXFA_Validate validate,
388 int32_t iRet,
389 FXJSE_HVALUE pRetValue,
390 FX_BOOL bVersionFlag) {
391 if (iRet == XFA_EVENTERROR_Sucess && pRetValue) {
392 if (FXJSE_Value_IsBoolean(pRetValue) && !FXJSE_Value_ToBoolean(pRetValue)) {
393 IXFA_AppProvider* pAppProvider = GetAppProvider();
394 if (!pAppProvider) {
395 return;
396 }
397 CFX_WideString wsTitle;
398 pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
399 CFX_WideString wsScriptMsg;
400 validate.GetScriptMessageText(wsScriptMsg);
401 int32_t eScriptTest = validate.GetScriptTest();
402 if (eScriptTest == XFA_ATTRIBUTEENUM_Warning) {
403 if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
404 return;
405 }
406 if (wsScriptMsg.IsEmpty()) {
407 GetValidateMessage(pAppProvider, wsScriptMsg, FALSE, bVersionFlag);
408 }
409 if (bVersionFlag) {
410 pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
411 XFA_MB_OK);
412 return;
413 }
414 if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
415 XFA_MB_YesNo) == XFA_IDYes) {
416 GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
417 }
418 } else {
419 if (wsScriptMsg.IsEmpty()) {
420 GetValidateMessage(pAppProvider, wsScriptMsg, TRUE, bVersionFlag);
421 }
422 pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
423 }
424 }
425 }
426 }
427 int32_t CXFA_WidgetAcc::ProcessFormatTestValidate(CXFA_Validate validate,
428 FX_BOOL bVersionFlag) {
429 CFX_WideString wsRawValue = GetRawValue();
430 if (!wsRawValue.IsEmpty()) {
431 CFX_WideString wsPicture;
432 validate.GetPicture(wsPicture);
433 if (wsPicture.IsEmpty()) {
434 return XFA_EVENTERROR_NotExist;
435 }
436 IFX_Locale* pLocale = GetLocal();
437 if (!pLocale) {
438 return XFA_EVENTERROR_NotExist;
439 }
440 CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this);
441 if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale)) {
442 IXFA_AppProvider* pAppProvider = GetAppProvider();
443 if (!pAppProvider) {
444 return XFA_EVENTERROR_NotExist;
445 }
446 CFX_WideString wsFormatMsg;
447 validate.GetFormatMessageText(wsFormatMsg);
448 CFX_WideString wsTitle;
449 pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
450 int32_t eFormatTest = validate.GetFormatTest();
451 if (eFormatTest == XFA_ATTRIBUTEENUM_Error) {
452 if (wsFormatMsg.IsEmpty()) {
453 GetValidateMessage(pAppProvider, wsFormatMsg, TRUE, bVersionFlag);
454 }
455 pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
456 return XFA_EVENTERROR_Sucess;
457 }
458 if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
459 return XFA_EVENTERROR_NotExist;
460 }
461 if (wsFormatMsg.IsEmpty()) {
462 GetValidateMessage(pAppProvider, wsFormatMsg, FALSE, bVersionFlag);
463 }
464 if (bVersionFlag) {
465 pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
466 XFA_MB_OK);
467 return XFA_EVENTERROR_Sucess;
468 }
469 if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
470 XFA_MB_YesNo) == XFA_IDYes) {
471 GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
472 }
473 return XFA_EVENTERROR_Sucess;
474 }
475 }
476 return XFA_EVENTERROR_NotExist;
477 }
478 int32_t CXFA_WidgetAcc::ProcessNullTestValidate(CXFA_Validate validate,
479 int32_t iFlags,
480 FX_BOOL bVersionFlag) {
481 CFX_WideString wsValue;
482 GetValue(wsValue, XFA_VALUEPICTURE_Raw);
483 if (!wsValue.IsEmpty()) {
484 return XFA_EVENTERROR_Sucess;
485 }
486 if (m_bIsNull && (m_bPreNull == m_bIsNull)) {
487 return XFA_EVENTERROR_Sucess;
488 }
489 int32_t eNullTest = validate.GetNullTest();
490 CFX_WideString wsNullMsg;
491 validate.GetNullMessageText(wsNullMsg);
492 if (iFlags & 0x01) {
493 int32_t iRet = XFA_EVENTERROR_Sucess;
494 if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
495 iRet = XFA_EVENTERROR_Error;
496 }
497 if (!wsNullMsg.IsEmpty()) {
498 if (eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
499 m_pDocView->m_arrNullTestMsg.Add(wsNullMsg);
500 return XFA_EVENTERROR_Error;
501 }
502 return XFA_EVENTERROR_Sucess;
503 }
504 return iRet;
505 }
506 if (wsNullMsg.IsEmpty() && bVersionFlag &&
507 eNullTest != XFA_ATTRIBUTEENUM_Disabled) {
508 return XFA_EVENTERROR_Error;
509 }
510 IXFA_AppProvider* pAppProvider = GetAppProvider();
511 if (!pAppProvider) {
512 return XFA_EVENTERROR_NotExist;
513 }
514 CFX_WideString wsCaptionName;
515 CFX_WideString wsTitle;
516 pAppProvider->LoadString(XFA_IDS_AppName, wsTitle);
517 switch (eNullTest) {
518 case XFA_ATTRIBUTEENUM_Error: {
519 if (wsNullMsg.IsEmpty()) {
520 GetValidateCaptionName(wsCaptionName, bVersionFlag);
521 CFX_WideString wsError;
522 pAppProvider->LoadString(XFA_IDS_ValidateNullError, wsError);
523 wsNullMsg.Format(wsError, (const FX_WCHAR*)wsCaptionName);
524 }
525 pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
526 return XFA_EVENTERROR_Error;
527 }
528 case XFA_ATTRIBUTEENUM_Warning: {
529 if (GetNode()->HasFlag(XFA_NODEFLAG_UserInteractive)) {
530 return TRUE;
531 }
532 if (wsNullMsg.IsEmpty()) {
533 GetValidateCaptionName(wsCaptionName, bVersionFlag);
534 CFX_WideString wsWarning;
535 pAppProvider->LoadString(XFA_IDS_ValidateNullWarning, wsWarning);
536 wsNullMsg.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
537 (const FX_WCHAR*)wsCaptionName);
538 }
539 if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning,
540 XFA_MB_YesNo) == XFA_IDYes) {
541 GetNode()->SetFlag(XFA_NODEFLAG_UserInteractive, TRUE, FALSE);
542 }
543 return XFA_EVENTERROR_Error;
544 }
545 case XFA_ATTRIBUTEENUM_Disabled:
546 default:
547 break;
548 }
549 return XFA_EVENTERROR_Sucess;
550 }
551 void CXFA_WidgetAcc::GetValidateCaptionName(CFX_WideString& wsCaptionName,
552 FX_BOOL bVersionFlag) {
553 if (!bVersionFlag) {
554 CXFA_Caption caption = GetCaption();
555 if (caption) {
556 CXFA_Value capValue = caption.GetValue();
557 if (capValue) {
558 CXFA_Text capText = capValue.GetText();
559 if (capText) {
560 capText.GetContent(wsCaptionName);
561 }
562 }
563 }
564 }
565 if (wsCaptionName.IsEmpty()) {
566 GetName(wsCaptionName);
567 }
568 }
569 void CXFA_WidgetAcc::GetValidateMessage(IXFA_AppProvider* pAppProvider,
570 CFX_WideString& wsMessage,
571 FX_BOOL bError,
572 FX_BOOL bVersionFlag) {
573 CFX_WideString wsCaptionName;
574 GetValidateCaptionName(wsCaptionName, bVersionFlag);
575 CFX_WideString wsError;
576 if (bVersionFlag) {
577 pAppProvider->LoadString(XFA_IDS_ValidateFailed, wsError);
578 wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
579 return;
580 }
581 if (bError) {
582 pAppProvider->LoadString(XFA_IDS_ValidateError, wsError);
583 wsMessage.Format(wsError, (const FX_WCHAR*)wsCaptionName);
584 return;
585 }
586 CFX_WideString wsWarning;
587 pAppProvider->LoadString(XFA_IDS_ValidateWarning, wsWarning);
588 wsMessage.Format(wsWarning, (const FX_WCHAR*)wsCaptionName,
589 (const FX_WCHAR*)wsCaptionName);
590 }
591 int32_t CXFA_WidgetAcc::ProcessValidate(int32_t iFlags) {
592 if (GetClassID() == XFA_ELEMENT_Draw) {
593 return XFA_EVENTERROR_NotExist;
594 }
595 CXFA_Validate validate = GetValidate();
596 if (!validate) {
597 return XFA_EVENTERROR_NotExist;
598 }
599 FX_BOOL bInitDoc = validate.GetNode()->HasFlag(XFA_NODEFLAG_NeedsInitApp);
600 FX_BOOL bStatus =
601 m_pDocView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End;
602 int32_t iFormat = 0;
603 FXJSE_HVALUE pRetValue = NULL;
604 int32_t iRet = XFA_EVENTERROR_NotExist;
605 CXFA_Script script = validate.GetScript();
606 if (script) {
607 CXFA_EventParam eParam;
608 eParam.m_eType = XFA_EVENT_Validate;
609 eParam.m_pTarget = this;
610 iRet = ExecuteScript(script, &eParam,
611 ((bInitDoc || bStatus) && GetRawValue().IsEmpty())
612 ? nullptr
613 : &pRetValue);
614 }
615 XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
616 FX_BOOL bVersionFlag = FALSE;
617 if (version < XFA_VERSION_208) {
618 bVersionFlag = TRUE;
619 }
620 if (bInitDoc) {
621 validate.GetNode()->SetFlag(XFA_NODEFLAG_NeedsInitApp, FALSE, FALSE);
622 } else {
623 iFormat = ProcessFormatTestValidate(validate, bVersionFlag);
624 if (!bVersionFlag) {
625 bVersionFlag = GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting);
626 }
627 iRet |= ProcessNullTestValidate(validate, iFlags, bVersionFlag);
628 }
629 if (iFormat != XFA_EVENTERROR_Sucess) {
630 ProcessScriptTestValidate(validate, iRet, pRetValue, bVersionFlag);
631 }
632 if (pRetValue) {
633 FXJSE_Value_Release(pRetValue);
634 }
635 return iRet | iFormat;
636 }
637 int32_t CXFA_WidgetAcc::ExecuteScript(CXFA_Script script,
638 CXFA_EventParam* pEventParam,
639 FXJSE_HVALUE* pRetValue) {
640 static const uint32_t MAX_RECURSION_DEPTH = 2;
641 if (m_nRecursionDepth > MAX_RECURSION_DEPTH)
642 return XFA_EVENTERROR_Sucess;
643 FXSYS_assert(pEventParam);
644 if (!script) {
645 return XFA_EVENTERROR_NotExist;
646 }
647 if (script.GetRunAt() == XFA_ATTRIBUTEENUM_Server) {
648 return XFA_EVENTERROR_Disabled;
649 }
650 CFX_WideString wsExpression;
651 script.GetExpression(wsExpression);
652 if (wsExpression.IsEmpty()) {
653 return XFA_EVENTERROR_NotExist;
654 }
655 XFA_SCRIPTTYPE eScriptType = script.GetContentType();
656 if (eScriptType == XFA_SCRIPTTYPE_Unkown) {
657 return XFA_EVENTERROR_Sucess;
658 }
659 CXFA_FFDoc* pDoc = GetDoc();
660 IXFA_ScriptContext* pContext = pDoc->GetXFADoc()->GetScriptContext();
661 pContext->SetEventParam(*pEventParam);
662 pContext->SetRunAtType((XFA_ATTRIBUTEENUM)script.GetRunAt());
663 CXFA_NodeArray refNodes;
664 if (pEventParam->m_eType == XFA_EVENT_InitCalculate ||
665 pEventParam->m_eType == XFA_EVENT_Calculate) {
666 pContext->SetNodesOfRunScript(&refNodes);
667 }
668 FXJSE_HVALUE hRetValue = FXJSE_Value_Create(pContext->GetRuntime());
669 ++m_nRecursionDepth;
670 FX_BOOL bRet = pContext->RunScript((XFA_SCRIPTLANGTYPE)eScriptType,
671 wsExpression, hRetValue, m_pNode);
672 --m_nRecursionDepth;
673 int32_t iRet = XFA_EVENTERROR_Error;
674 if (bRet) {
675 iRet = XFA_EVENTERROR_Sucess;
676 if (pEventParam->m_eType == XFA_EVENT_Calculate ||
677 pEventParam->m_eType == XFA_EVENT_InitCalculate) {
678 if (!FXJSE_Value_IsUndefined(hRetValue)) {
679 if (!FXJSE_Value_IsNull(hRetValue)) {
680 CFX_ByteString bsString;
681 FXJSE_Value_ToUTF8String(hRetValue, bsString);
682 pEventParam->m_wsResult =
683 CFX_WideString::FromUTF8(bsString, bsString.GetLength());
684 }
685 iRet = XFA_EVENTERROR_Sucess;
686 } else {
687 iRet = XFA_EVENTERROR_Error;
688 }
689 if (pEventParam->m_eType == XFA_EVENT_InitCalculate) {
690 if ((iRet == XFA_EVENTERROR_Sucess) &&
691 (GetRawValue() != pEventParam->m_wsResult)) {
692 SetValue(pEventParam->m_wsResult, XFA_VALUEPICTURE_Raw);
693 m_pDocView->AddValidateWidget(this);
694 }
695 }
696 int32_t iRefs = refNodes.GetSize();
697 for (int32_t r = 0; r < iRefs; r++) {
698 CXFA_WidgetAcc* pRefAcc = (CXFA_WidgetAcc*)refNodes[r]->GetWidgetData();
699 if (pRefAcc && pRefAcc == this) {
700 continue;
701 }
702 CXFA_Node* pRefNode = refNodes[r];
703 CXFA_CalcData* pGlobalData =
704 (CXFA_CalcData*)pRefNode->GetUserData(XFA_CalcData);
705 if (!pGlobalData) {
706 pGlobalData = new CXFA_CalcData;
707 pRefNode->SetUserData(XFA_CalcData, pGlobalData,
708 &gs_XFADeleteCalcData);
709 }
710 if (pGlobalData->m_Globals.Find(this) < 0) {
711 pGlobalData->m_Globals.Add(this);
712 }
713 }
714 }
715 }
716 if (pRetValue) {
717 *pRetValue = hRetValue;
718 } else {
719 FXJSE_Value_Release(hRetValue);
720 }
721 pContext->SetNodesOfRunScript(NULL);
722 return iRet;
723 }
724 CXFA_FFWidget* CXFA_WidgetAcc::GetNextWidget(CXFA_FFWidget* pWidget) {
725 CXFA_LayoutItem* pLayout = nullptr;
726 if (pWidget) {
727 pLayout = pWidget->GetNext();
728 } else {
729 pLayout = m_pDocView->GetXFALayout()->GetLayoutItem(m_pNode);
730 }
731 return static_cast<CXFA_FFWidget*>(pLayout);
732 }
733 void CXFA_WidgetAcc::UpdateUIDisplay(CXFA_FFWidget* pExcept) {
734 CXFA_FFWidget* pWidget = NULL;
735 while ((pWidget = GetNextWidget(pWidget))) {
736 if (pWidget == pExcept || !pWidget->IsLoaded() ||
737 (GetUIType() != XFA_ELEMENT_CheckButton && pWidget->IsFocused())) {
738 continue;
739 }
740 pWidget->UpdateFWLData();
741 pWidget->AddInvalidateRect();
742 }
743 }
744 void CXFA_WidgetAcc::NotifyEvent(FX_DWORD dwEvent,
745 CXFA_FFWidget* pWidget,
746 void* pParam,
747 void* pAdditional) {
748 IXFA_DocProvider* pDocProvider = GetDoc()->GetDocProvider();
749 if (pWidget) {
750 pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
751 } else {
752 pWidget = GetNextWidget(pWidget);
753 if (pWidget == NULL) {
754 pDocProvider->WidgetEvent(NULL, this, dwEvent, pParam, pAdditional);
755 return;
756 }
757 while (pWidget) {
758 pDocProvider->WidgetEvent(pWidget, this, dwEvent, pParam, pAdditional);
759 pWidget = GetNextWidget(pWidget);
760 }
761 }
762 }
763 void CXFA_WidgetAcc::CalcCaptionSize(CFX_SizeF& szCap) {
764 CXFA_Caption caption = GetCaption();
765 if (!caption || caption.GetPresence() != XFA_ATTRIBUTEENUM_Visible) {
766 return;
767 }
768 LoadCaption();
769 XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
770 int32_t iCapPlacement = caption.GetPlacementType();
771 FX_FLOAT fCapReserve = caption.GetReserve();
772 const bool bVert = iCapPlacement == XFA_ATTRIBUTEENUM_Top ||
773 iCapPlacement == XFA_ATTRIBUTEENUM_Bottom;
774 const bool bReserveExit = fCapReserve > 0.01;
775 CXFA_TextLayout* pCapTextLayout =
776 ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout;
777 if (pCapTextLayout) {
778 if (!bVert && eUIType != XFA_ELEMENT_Button) {
779 szCap.x = fCapReserve;
780 }
781 CFX_SizeF minSize;
782 pCapTextLayout->CalcSize(minSize, szCap, szCap);
783 if (bReserveExit) {
784 bVert ? szCap.y = fCapReserve : szCap.x = fCapReserve;
785 }
786 } else {
787 FX_FLOAT fFontSize = 10.0f;
788 if (CXFA_Font font = caption.GetFont()) {
789 fFontSize = font.GetFontSize();
790 } else if (CXFA_Font widgetfont = GetFont()) {
791 fFontSize = widgetfont.GetFontSize();
792 }
793 if (bVert) {
794 szCap.y = fCapReserve > 0 ? fCapReserve : fFontSize;
795 } else {
796 szCap.x = fCapReserve > 0 ? fCapReserve : 0;
797 szCap.y = fFontSize;
798 }
799 }
800 if (CXFA_Margin mgCap = caption.GetMargin()) {
801 FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
802 mgCap.GetLeftInset(fLeftInset);
803 mgCap.GetTopInset(fTopInset);
804 mgCap.GetRightInset(fRightInset);
805 mgCap.GetBottomInset(fBottomInset);
806 if (bReserveExit) {
807 bVert ? (szCap.x += fLeftInset + fRightInset)
808 : (szCap.y += fTopInset + fBottomInset);
809 } else {
810 szCap.x += fLeftInset + fRightInset;
811 szCap.y += fTopInset + fBottomInset;
812 }
813 }
814 }
815 FX_BOOL CXFA_WidgetAcc::CalculateFieldAutoSize(CFX_SizeF& size) {
816 CFX_SizeF szCap;
817 CalcCaptionSize(szCap);
818 CFX_RectF rtUIMargin;
819 GetUIMargin(rtUIMargin);
820 size.x += rtUIMargin.left + rtUIMargin.width;
821 size.y += rtUIMargin.top + rtUIMargin.height;
822 if (szCap.x > 0 && szCap.y > 0) {
823 int32_t iCapPlacement = GetCaption().GetPlacementType();
824 switch (iCapPlacement) {
825 case XFA_ATTRIBUTEENUM_Left:
826 case XFA_ATTRIBUTEENUM_Right:
827 case XFA_ATTRIBUTEENUM_Inline: {
828 size.x += szCap.x;
829 size.y = std::max(size.y, szCap.y);
830 } break;
831 case XFA_ATTRIBUTEENUM_Top:
832 case XFA_ATTRIBUTEENUM_Bottom: {
833 size.y += szCap.y;
834 size.x = std::max(size.x, szCap.x);
835 }
836 default:
837 break;
838 }
839 }
840 return CalculateWidgetAutoSize(size);
841 }
842 FX_BOOL CXFA_WidgetAcc::CalculateWidgetAutoSize(CFX_SizeF& size) {
843 CXFA_Margin mgWidget = GetMargin();
844 if (mgWidget) {
845 FX_FLOAT fLeftInset, fTopInset, fRightInset, fBottomInset;
846 mgWidget.GetLeftInset(fLeftInset);
847 mgWidget.GetTopInset(fTopInset);
848 mgWidget.GetRightInset(fRightInset);
849 mgWidget.GetBottomInset(fBottomInset);
850 size.x += fLeftInset + fRightInset;
851 size.y += fTopInset + fBottomInset;
852 }
853 CXFA_Para para = GetPara();
854 if (para) {
855 size.x += para.GetMarginLeft();
856 size.x += para.GetTextIndent();
857 }
858 FX_FLOAT fVal = 0, fMin = 0, fMax = 0;
859 if (GetWidth(fVal)) {
860 size.x = fVal;
861 } else {
862 if (GetMinWidth(fMin)) {
863 size.x = std::max(size.x, fMin);
864 }
865 if (GetMaxWidth(fMax) && fMax > 0) {
866 size.x = std::min(size.x, fMax);
867 }
868 }
869 fVal = 0, fMin = 0, fMax = 0;
870 if (GetHeight(fVal)) {
871 size.y = fVal;
872 } else {
873 if (GetMinHeight(fMin)) {
874 size.y = std::max(size.y, fMin);
875 }
876 if (GetMaxHeight(fMax) && fMax > 0) {
877 size.y = std::min(size.y, fMax);
878 }
879 }
880 return TRUE;
881 }
882 void CXFA_WidgetAcc::CalculateTextContentSize(CFX_SizeF& size) {
883 FX_FLOAT fFontSize = GetFontSize();
884 CFX_WideString wsText;
885 GetValue(wsText, XFA_VALUEPICTURE_Display);
886 if (wsText.IsEmpty()) {
887 size.y += fFontSize;
888 return;
889 }
890 FX_WCHAR wcEnter = '\n';
891 FX_WCHAR wsLast = wsText.GetAt(wsText.GetLength() - 1);
892 if (wsLast == wcEnter) {
893 wsText = wsText + wcEnter;
894 }
895 if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
896 ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut = IFDE_TextOut::Create();
897 IFDE_TextOut* pTextOut = ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut;
898 pTextOut->SetFont(GetFDEFont());
899 pTextOut->SetFontSize(fFontSize);
900 pTextOut->SetLineBreakTolerance(fFontSize * 0.2f);
901 pTextOut->SetLineSpace(GetLineHeight());
902 FX_DWORD dwStyles = FDE_TTOSTYLE_LastLineHeight;
903 if (GetUIType() == XFA_ELEMENT_TextEdit && IsMultiLine()) {
904 dwStyles |= FDE_TTOSTYLE_LineWrap;
905 }
906 pTextOut->SetStyles(dwStyles);
907 }
908 ((CXFA_FieldLayoutData*)m_pLayoutData)
909 ->m_pTextOut->CalcLogicSize(wsText, wsText.GetLength(), size);
910 }
911 FX_BOOL CXFA_WidgetAcc::CalculateTextEditAutoSize(CFX_SizeF& size) {
912 if (size.x > 0) {
913 CFX_SizeF szOrz = size;
914 CFX_SizeF szCap;
915 CalcCaptionSize(szCap);
916 FX_BOOL bCapExit = szCap.x > 0.01 && szCap.y > 0.01;
917 int32_t iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
918 if (bCapExit) {
919 iCapPlacement = GetCaption().GetPlacementType();
920 switch (iCapPlacement) {
921 case XFA_ATTRIBUTEENUM_Left:
922 case XFA_ATTRIBUTEENUM_Right:
923 case XFA_ATTRIBUTEENUM_Inline: {
924 size.x -= szCap.x;
925 }
926 default:
927 break;
928 }
929 }
930 CFX_RectF rtUIMargin;
931 GetUIMargin(rtUIMargin);
932 size.x -= rtUIMargin.left + rtUIMargin.width;
933 CXFA_Margin mgWidget = GetMargin();
934 if (mgWidget) {
935 FX_FLOAT fLeftInset, fRightInset;
936 mgWidget.GetLeftInset(fLeftInset);
937 mgWidget.GetRightInset(fRightInset);
938 size.x -= fLeftInset + fRightInset;
939 }
940 CalculateTextContentSize(size);
941 size.y += rtUIMargin.top + rtUIMargin.height;
942 if (bCapExit) {
943 switch (iCapPlacement) {
944 case XFA_ATTRIBUTEENUM_Left:
945 case XFA_ATTRIBUTEENUM_Right:
946 case XFA_ATTRIBUTEENUM_Inline: {
947 size.y = std::max(size.y, szCap.y);
948 } break;
949 case XFA_ATTRIBUTEENUM_Top:
950 case XFA_ATTRIBUTEENUM_Bottom: {
951 size.y += szCap.y;
952 }
953 default:
954 break;
955 }
956 }
957 size.x = szOrz.x;
958 return CalculateWidgetAutoSize(size);
959 }
960 CalculateTextContentSize(size);
961 return CalculateFieldAutoSize(size);
962 }
963 FX_BOOL CXFA_WidgetAcc::CalculateCheckButtonAutoSize(CFX_SizeF& size) {
964 FX_FLOAT fCheckSize = GetCheckButtonSize();
965 size.x = size.y = fCheckSize;
966 return CalculateFieldAutoSize(size);
967 }
968 FX_BOOL CXFA_WidgetAcc::CalculatePushButtonAutoSize(CFX_SizeF& size) {
969 CalcCaptionSize(size);
970 return CalculateWidgetAutoSize(size);
971 }
972 FX_BOOL CXFA_WidgetAcc::CalculateImageAutoSize(CFX_SizeF& size) {
973 if (!GetImageImage()) {
974 LoadImageImage();
975 }
976 size.clear();
977 if (CFX_DIBitmap* pBitmap = GetImageImage()) {
978 CFX_RectF rtImage, rtFit;
979 rtImage.Set(0, 0, 0, 0);
980 rtFit.Set(0, 0, 0, 0);
981 int32_t iImageXDpi = 0;
982 int32_t iImageYDpi = 0;
983 GetImageDpi(iImageXDpi, iImageYDpi);
984 rtImage.width =
985 XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
986 rtImage.height =
987 XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
988 if (GetWidth(rtFit.width)) {
989 GetWidthWithoutMargin(rtFit.width);
990 } else {
991 rtFit.width = rtImage.width;
992 }
993 if (GetHeight(rtFit.height)) {
994 GetHeightWithoutMargin(rtFit.height);
995 } else {
996 rtFit.height = rtImage.height;
997 }
998 size.x = rtFit.width;
999 size.y = rtFit.height;
1000 }
1001 return CalculateWidgetAutoSize(size);
1002 }
1003 FX_BOOL CXFA_WidgetAcc::CalculateImageEditAutoSize(CFX_SizeF& size) {
1004 if (!GetImageEditImage()) {
1005 LoadImageEditImage();
1006 }
1007 size.clear();
1008 if (CFX_DIBitmap* pBitmap = GetImageEditImage()) {
1009 CFX_RectF rtImage, rtFit;
1010 rtImage.Set(0, 0, 0, 0);
1011 rtFit.Set(0, 0, 0, 0);
1012 int32_t iImageXDpi = 0;
1013 int32_t iImageYDpi = 0;
1014 GetImageEditDpi(iImageXDpi, iImageYDpi);
1015 rtImage.width =
1016 XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetWidth(), (FX_FLOAT)iImageXDpi);
1017 rtImage.height =
1018 XFA_UnitPx2Pt((FX_FLOAT)pBitmap->GetHeight(), (FX_FLOAT)iImageYDpi);
1019 if (GetWidth(rtFit.width)) {
1020 GetWidthWithoutMargin(rtFit.width);
1021 } else {
1022 rtFit.width = rtImage.width;
1023 }
1024 if (GetHeight(rtFit.height)) {
1025 GetHeightWithoutMargin(rtFit.height);
1026 } else {
1027 rtFit.height = rtImage.height;
1028 }
1029 size.x = rtFit.width;
1030 size.y = rtFit.height;
1031 }
1032 return CalculateFieldAutoSize(size);
1033 }
1034 FX_BOOL CXFA_WidgetAcc::LoadImageImage() {
1035 InitLayoutData();
1036 return ((CXFA_ImageLayoutData*)m_pLayoutData)->LoadImageData(this);
1037 }
1038 FX_BOOL CXFA_WidgetAcc::LoadImageEditImage() {
1039 InitLayoutData();
1040 return ((CXFA_ImageEditData*)m_pLayoutData)->LoadImageData(this);
1041 }
1042 void CXFA_WidgetAcc::GetImageDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
1043 iImageXDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageXDpi;
1044 iImageYDpi = ((CXFA_ImageLayoutData*)m_pLayoutData)->m_iImageYDpi;
1045 }
1046 void CXFA_WidgetAcc::GetImageEditDpi(int32_t& iImageXDpi, int32_t& iImageYDpi) {
1047 iImageXDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageXDpi;
1048 iImageYDpi = ((CXFA_ImageEditData*)m_pLayoutData)->m_iImageYDpi;
1049 }
1050 FX_BOOL CXFA_WidgetAcc::CalculateTextAutoSize(CFX_SizeF& size) {
1051 LoadText();
1052 CXFA_TextLayout* pTextLayout =
1053 ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
1054 if (pTextLayout) {
1055 size.x = pTextLayout->StartLayout(size.x);
1056 size.y = pTextLayout->GetLayoutHeight();
1057 }
1058 return CalculateWidgetAutoSize(size);
1059 }
1060 void CXFA_WidgetAcc::LoadText() {
1061 InitLayoutData();
1062 ((CXFA_TextLayoutData*)m_pLayoutData)->LoadText(this);
1063 }
1064 FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoWidth(FX_FLOAT fWidthCalc) {
1065 CXFA_Margin mgWidget = GetMargin();
1066 if (mgWidget) {
1067 FX_FLOAT fLeftInset, fRightInset;
1068 mgWidget.GetLeftInset(fLeftInset);
1069 mgWidget.GetRightInset(fRightInset);
1070 fWidthCalc += fLeftInset + fRightInset;
1071 }
1072 FX_FLOAT fMin = 0, fMax = 0;
1073 if (GetMinWidth(fMin)) {
1074 fWidthCalc = std::max(fWidthCalc, fMin);
1075 }
1076 if (GetMaxWidth(fMax) && fMax > 0) {
1077 fWidthCalc = std::min(fWidthCalc, fMax);
1078 }
1079 return fWidthCalc;
1080 }
1081 FX_FLOAT CXFA_WidgetAcc::GetWidthWithoutMargin(FX_FLOAT fWidthCalc) {
1082 CXFA_Margin mgWidget = GetMargin();
1083 if (mgWidget) {
1084 FX_FLOAT fLeftInset, fRightInset;
1085 mgWidget.GetLeftInset(fLeftInset);
1086 mgWidget.GetRightInset(fRightInset);
1087 fWidthCalc -= fLeftInset + fRightInset;
1088 }
1089 return fWidthCalc;
1090 }
1091 FX_FLOAT CXFA_WidgetAcc::CalculateWidgetAutoHeight(FX_FLOAT fHeightCalc) {
1092 CXFA_Margin mgWidget = GetMargin();
1093 if (mgWidget) {
1094 FX_FLOAT fTopInset, fBottomInset;
1095 mgWidget.GetTopInset(fTopInset);
1096 mgWidget.GetBottomInset(fBottomInset);
1097 fHeightCalc += fTopInset + fBottomInset;
1098 }
1099 FX_FLOAT fMin = 0, fMax = 0;
1100 if (GetMinHeight(fMin)) {
1101 fHeightCalc = std::max(fHeightCalc, fMin);
1102 }
1103 if (GetMaxHeight(fMax) && fMax > 0) {
1104 fHeightCalc = std::min(fHeightCalc, fMax);
1105 }
1106 return fHeightCalc;
1107 }
1108 FX_FLOAT CXFA_WidgetAcc::GetHeightWithoutMargin(FX_FLOAT fHeightCalc) {
1109 CXFA_Margin mgWidget = GetMargin();
1110 if (mgWidget) {
1111 FX_FLOAT fTopInset, fBottomInset;
1112 mgWidget.GetTopInset(fTopInset);
1113 mgWidget.GetBottomInset(fBottomInset);
1114 fHeightCalc -= fTopInset + fBottomInset;
1115 }
1116 return fHeightCalc;
1117 }
1118 void CXFA_WidgetAcc::StartWidgetLayout(FX_FLOAT& fCalcWidth,
1119 FX_FLOAT& fCalcHeight) {
1120 InitLayoutData();
1121 XFA_ELEMENT eUIType = GetUIType();
1122 if (eUIType == XFA_ELEMENT_Text) {
1123 m_pLayoutData->m_fWidgetHeight = -1;
1124 GetHeight(m_pLayoutData->m_fWidgetHeight);
1125 StartTextLayout(fCalcWidth, fCalcHeight);
1126 return;
1127 }
1128 if (fCalcWidth > 0 && fCalcHeight > 0) {
1129 return;
1130 }
1131 m_pLayoutData->m_fWidgetHeight = -1;
1132 FX_FLOAT fWidth = 0;
1133 if (fCalcWidth > 0 && fCalcHeight < 0) {
1134 if (!GetHeight(fCalcHeight)) {
1135 CalculateAccWidthAndHeight(eUIType, fCalcWidth, fCalcHeight);
1136 }
1137 m_pLayoutData->m_fWidgetHeight = fCalcHeight;
1138 return;
1139 }
1140 if (fCalcWidth < 0 && fCalcHeight < 0) {
1141 if (!GetWidth(fWidth) || !GetHeight(fCalcHeight)) {
1142 CalculateAccWidthAndHeight(eUIType, fWidth, fCalcHeight);
1143 }
1144 fCalcWidth = fWidth;
1145 }
1146 m_pLayoutData->m_fWidgetHeight = fCalcHeight;
1147 }
1148 void CXFA_WidgetAcc::CalculateAccWidthAndHeight(XFA_ELEMENT eUIType,
1149 FX_FLOAT& fWidth,
1150 FX_FLOAT& fCalcHeight) {
1151 CFX_SizeF sz(fWidth, m_pLayoutData->m_fWidgetHeight);
1152 switch (eUIType) {
1153 case XFA_ELEMENT_Barcode:
1154 case XFA_ELEMENT_ChoiceList:
1155 case XFA_ELEMENT_Signature:
1156 CalculateFieldAutoSize(sz);
1157 break;
1158 case XFA_ELEMENT_ImageEdit:
1159 CalculateImageEditAutoSize(sz);
1160 break;
1161 case XFA_ELEMENT_Button:
1162 CalculatePushButtonAutoSize(sz);
1163 break;
1164 case XFA_ELEMENT_CheckButton:
1165 CalculateCheckButtonAutoSize(sz);
1166 break;
1167 case XFA_ELEMENT_DateTimeEdit:
1168 case XFA_ELEMENT_NumericEdit:
1169 case XFA_ELEMENT_PasswordEdit:
1170 case XFA_ELEMENT_TextEdit:
1171 CalculateTextEditAutoSize(sz);
1172 break;
1173 case XFA_ELEMENT_Image:
1174 CalculateImageAutoSize(sz);
1175 break;
1176 case XFA_ELEMENT_Arc:
1177 case XFA_ELEMENT_Line:
1178 case XFA_ELEMENT_Rectangle:
1179 case XFA_ELEMENT_Subform:
1180 case XFA_ELEMENT_ExclGroup:
1181 CalculateWidgetAutoSize(sz);
1182 break;
1183 default:
1184 break;
1185 }
1186 fWidth = sz.x;
1187 m_pLayoutData->m_fWidgetHeight = sz.y;
1188 fCalcHeight = sz.y;
1189 }
1190 FX_BOOL CXFA_WidgetAcc::FindSplitPos(int32_t iBlockIndex,
1191 FX_FLOAT& fCalcHeight) {
1192 XFA_ELEMENT eUIType = (XFA_ELEMENT)GetUIType();
1193 if (eUIType == XFA_ELEMENT_Subform) {
1194 return FALSE;
1195 }
1196 if (eUIType != XFA_ELEMENT_Text && eUIType != XFA_ELEMENT_TextEdit &&
1197 eUIType != XFA_ELEMENT_NumericEdit &&
1198 eUIType != XFA_ELEMENT_PasswordEdit) {
1199 fCalcHeight = 0;
1200 return TRUE;
1201 }
1202 FX_FLOAT fTopInset = 0;
1203 FX_FLOAT fBottomInset = 0;
1204 if (iBlockIndex == 0) {
1205 CXFA_Margin mgWidget = GetMargin();
1206 if (mgWidget) {
1207 mgWidget.GetTopInset(fTopInset);
1208 mgWidget.GetBottomInset(fBottomInset);
1209 }
1210 CFX_RectF rtUIMargin;
1211 GetUIMargin(rtUIMargin);
1212 fTopInset += rtUIMargin.top;
1213 fBottomInset += rtUIMargin.width;
1214 }
1215 if (eUIType == XFA_ELEMENT_Text) {
1216 FX_FLOAT fHeight = fCalcHeight;
1217 if (iBlockIndex == 0) {
1218 fCalcHeight = fCalcHeight - fTopInset;
1219 if (fCalcHeight < 0) {
1220 fCalcHeight = 0;
1221 }
1222 }
1223 CXFA_TextLayout* pTextLayout =
1224 ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
1225 pTextLayout->DoLayout(iBlockIndex, fCalcHeight, fCalcHeight,
1226 m_pLayoutData->m_fWidgetHeight - fTopInset);
1227 if (fCalcHeight != 0) {
1228 if (iBlockIndex == 0) {
1229 fCalcHeight = fCalcHeight + fTopInset;
1230 }
1231 if (fabs(fHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
1232 return FALSE;
1233 }
1234 }
1235 return TRUE;
1236 }
1237 XFA_ATTRIBUTEENUM iCapPlacement = XFA_ATTRIBUTEENUM_Unknown;
1238 FX_FLOAT fCapReserve = 0;
1239 if (iBlockIndex == 0) {
1240 CXFA_Caption caption = GetCaption();
1241 if (caption && caption.GetPresence() != XFA_ATTRIBUTEENUM_Hidden) {
1242 iCapPlacement = (XFA_ATTRIBUTEENUM)caption.GetPlacementType();
1243 fCapReserve = caption.GetReserve();
1244 }
1245 if (iCapPlacement == XFA_ATTRIBUTEENUM_Top &&
1246 fCalcHeight < fCapReserve + fTopInset) {
1247 fCalcHeight = 0;
1248 return TRUE;
1249 }
1250 if (iCapPlacement == XFA_ATTRIBUTEENUM_Bottom &&
1251 m_pLayoutData->m_fWidgetHeight - fCapReserve - fBottomInset) {
1252 fCalcHeight = 0;
1253 return TRUE;
1254 }
1255 if (iCapPlacement != XFA_ATTRIBUTEENUM_Top) {
1256 fCapReserve = 0;
1257 }
1258 }
1259 int32_t iLinesCount = 0;
1260 FX_FLOAT fHeight = m_pLayoutData->m_fWidgetHeight;
1261 CFX_WideString wsText;
1262 GetValue(wsText, XFA_VALUEPICTURE_Display);
1263 if (wsText.IsEmpty()) {
1264 iLinesCount = 1;
1265 } else {
1266 if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut) {
1267 FX_FLOAT fWidth = 0;
1268 GetWidth(fWidth);
1269 CalculateAccWidthAndHeight(eUIType, fWidth, fHeight);
1270 }
1271 iLinesCount =
1272 ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pTextOut->GetTotalLines();
1273 }
1274 if (!((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray) {
1275 ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray =
1276 new CFX_FloatArray;
1277 }
1278 CFX_FloatArray* pFieldArray =
1279 ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pFieldSplitArray;
1280 int32_t iFieldSplitCount = pFieldArray->GetSize();
1281 for (int32_t i = 0; i < iBlockIndex * 3; i += 3) {
1282 iLinesCount -= (int32_t)pFieldArray->GetAt(i + 1);
1283 fHeight -= pFieldArray->GetAt(i + 2);
1284 }
1285 if (iLinesCount == 0) {
1286 return FALSE;
1287 }
1288 FX_FLOAT fLineHeight = GetLineHeight();
1289 FX_FLOAT fFontSize = GetFontSize();
1290 FX_FLOAT fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize;
1291 FX_FLOAT fSpaceAbove = 0;
1292 FX_FLOAT fStartOffset = 0;
1293 if (fHeight > 0.1f && iBlockIndex == 0) {
1294 fStartOffset = fTopInset;
1295 fHeight -= (fTopInset + fBottomInset);
1296 if (CXFA_Para para = GetPara()) {
1297 fSpaceAbove = para.GetSpaceAbove();
1298 FX_FLOAT fSpaceBelow = para.GetSpaceBelow();
1299 fHeight -= (fSpaceAbove + fSpaceBelow);
1300 switch (para.GetVerticalAlign()) {
1301 case XFA_ATTRIBUTEENUM_Top:
1302 fStartOffset += fSpaceAbove;
1303 break;
1304 case XFA_ATTRIBUTEENUM_Middle:
1305 fStartOffset += ((fHeight - fTextHeight) / 2 + fSpaceAbove);
1306 break;
1307 case XFA_ATTRIBUTEENUM_Bottom:
1308 fStartOffset += (fHeight - fTextHeight + fSpaceAbove);
1309 break;
1310 }
1311 }
1312 if (fStartOffset < 0.1f) {
1313 fStartOffset = 0;
1314 }
1315 }
1316 for (int32_t i = iBlockIndex - 1; iBlockIndex > 0 && i < iBlockIndex; i++) {
1317 fStartOffset = pFieldArray->GetAt(i * 3) - pFieldArray->GetAt(i * 3 + 2);
1318 if (fStartOffset < 0.1f) {
1319 fStartOffset = 0;
1320 }
1321 }
1322 if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
1323 pFieldArray->SetAt(0, fStartOffset);
1324 } else {
1325 pFieldArray->Add(fStartOffset);
1326 }
1327 XFA_VERSION version = GetDoc()->GetXFADoc()->GetCurVersionMode();
1328 FX_BOOL bCanSplitNoContent = FALSE;
1329 XFA_ATTRIBUTEENUM eLayoutMode;
1330 GetNode()
1331 ->GetNodeItem(XFA_NODEITEM_Parent)
1332 ->TryEnum(XFA_ATTRIBUTE_Layout, eLayoutMode, TRUE);
1333 if ((eLayoutMode == XFA_ATTRIBUTEENUM_Position ||
1334 eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
1335 eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
1336 eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
1337 version > XFA_VERSION_208) {
1338 bCanSplitNoContent = TRUE;
1339 }
1340 if ((eLayoutMode == XFA_ATTRIBUTEENUM_Tb ||
1341 eLayoutMode == XFA_ATTRIBUTEENUM_Row ||
1342 eLayoutMode == XFA_ATTRIBUTEENUM_Table) &&
1343 version <= XFA_VERSION_208) {
1344 if (fStartOffset < fCalcHeight) {
1345 bCanSplitNoContent = TRUE;
1346 } else {
1347 fCalcHeight = 0;
1348 return TRUE;
1349 }
1350 }
1351 if (bCanSplitNoContent) {
1352 if ((fCalcHeight - fTopInset - fSpaceAbove < fLineHeight)) {
1353 fCalcHeight = 0;
1354 return TRUE;
1355 }
1356 if (fStartOffset + XFA_FLOAT_PERCISION >= fCalcHeight) {
1357 if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
1358 pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
1359 pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
1360 } else {
1361 pFieldArray->Add(0);
1362 pFieldArray->Add(fCalcHeight);
1363 }
1364 return FALSE;
1365 }
1366 if (fCalcHeight - fStartOffset < fLineHeight) {
1367 fCalcHeight = fStartOffset;
1368 if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
1369 pFieldArray->SetAt(iBlockIndex * 3 + 1, 0);
1370 pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
1371 } else {
1372 pFieldArray->Add(0);
1373 pFieldArray->Add(fCalcHeight);
1374 }
1375 return TRUE;
1376 }
1377 FX_FLOAT fTextNum =
1378 fCalcHeight + XFA_FLOAT_PERCISION - fCapReserve - fStartOffset;
1379 int32_t iLineNum =
1380 (int32_t)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
1381 if (iLineNum >= iLinesCount) {
1382 if (fCalcHeight - fStartOffset - fTextHeight >= fFontSize) {
1383 if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
1384 pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLinesCount);
1385 pFieldArray->SetAt(iBlockIndex * 3 + 2, fCalcHeight);
1386 } else {
1387 pFieldArray->Add((FX_FLOAT)iLinesCount);
1388 pFieldArray->Add(fCalcHeight);
1389 }
1390 return FALSE;
1391 }
1392 if (fHeight - fStartOffset - fTextHeight < fFontSize) {
1393 iLineNum -= 1;
1394 if (iLineNum == 0) {
1395 fCalcHeight = 0;
1396 return TRUE;
1397 }
1398 } else {
1399 iLineNum = (int32_t)(fTextNum / fLineHeight);
1400 }
1401 }
1402 if (iLineNum > 0) {
1403 FX_FLOAT fSplitHeight =
1404 iLineNum * fLineHeight + fCapReserve + fStartOffset;
1405 if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
1406 pFieldArray->SetAt(iBlockIndex * 3 + 1, (FX_FLOAT)iLineNum);
1407 pFieldArray->SetAt(iBlockIndex * 3 + 2, fSplitHeight);
1408 } else {
1409 pFieldArray->Add((FX_FLOAT)iLineNum);
1410 pFieldArray->Add(fSplitHeight);
1411 }
1412 if (fabs(fSplitHeight - fCalcHeight) < XFA_FLOAT_PERCISION) {
1413 return FALSE;
1414 }
1415 fCalcHeight = fSplitHeight;
1416 return TRUE;
1417 }
1418 }
1419 fCalcHeight = 0;
1420 return TRUE;
1421 }
1422 void CXFA_WidgetAcc::InitLayoutData() {
1423 if (m_pLayoutData) {
1424 return;
1425 }
1426 switch (GetUIType()) {
1427 case XFA_ELEMENT_Text:
1428 m_pLayoutData = new CXFA_TextLayoutData;
1429 return;
1430 case XFA_ELEMENT_TextEdit:
1431 m_pLayoutData = new CXFA_TextEditData;
1432 return;
1433 case XFA_ELEMENT_Image:
1434 m_pLayoutData = new CXFA_ImageLayoutData;
1435 return;
1436 case XFA_ELEMENT_ImageEdit:
1437 m_pLayoutData = new CXFA_ImageEditData;
1438 return;
1439 default:
1440 break;
1441 }
1442 if (GetClassID() == XFA_ELEMENT_Field) {
1443 m_pLayoutData = new CXFA_FieldLayoutData;
1444 } else {
1445 m_pLayoutData = new CXFA_WidgetLayoutData;
1446 }
1447 }
1448 void CXFA_WidgetAcc::StartTextLayout(FX_FLOAT& fCalcWidth,
1449 FX_FLOAT& fCalcHeight) {
1450 LoadText();
1451 CXFA_TextLayout* pTextLayout =
1452 ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout;
1453 FX_FLOAT fTextHeight = 0;
1454 if (fCalcWidth > 0 && fCalcHeight > 0) {
1455 FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
1456 pTextLayout->StartLayout(fWidth);
1457 fTextHeight = fCalcHeight;
1458 fTextHeight = GetHeightWithoutMargin(fTextHeight);
1459 pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
1460 return;
1461 }
1462 if (fCalcWidth > 0 && fCalcHeight < 0) {
1463 FX_FLOAT fWidth = GetWidthWithoutMargin(fCalcWidth);
1464 pTextLayout->StartLayout(fWidth);
1465 }
1466 if (fCalcWidth < 0 && fCalcHeight < 0) {
1467 FX_FLOAT fMaxWidth = -1;
1468 FX_BOOL bRet = GetWidth(fMaxWidth);
1469 if (bRet) {
1470 FX_FLOAT fWidth = GetWidthWithoutMargin(fMaxWidth);
1471 pTextLayout->StartLayout(fWidth);
1472 } else {
1473 FX_FLOAT fWidth = pTextLayout->StartLayout(fMaxWidth);
1474 fMaxWidth = CalculateWidgetAutoWidth(fWidth);
1475 fWidth = GetWidthWithoutMargin(fMaxWidth);
1476 pTextLayout->StartLayout(fWidth);
1477 }
1478 fCalcWidth = fMaxWidth;
1479 }
1480 if (m_pLayoutData->m_fWidgetHeight < 0) {
1481 m_pLayoutData->m_fWidgetHeight = pTextLayout->GetLayoutHeight();
1482 m_pLayoutData->m_fWidgetHeight =
1483 CalculateWidgetAutoHeight(m_pLayoutData->m_fWidgetHeight);
1484 }
1485 fTextHeight = m_pLayoutData->m_fWidgetHeight;
1486 fTextHeight = GetHeightWithoutMargin(fTextHeight);
1487 pTextLayout->DoLayout(0, fTextHeight, -1, fTextHeight);
1488 fCalcHeight = m_pLayoutData->m_fWidgetHeight;
1489 }
1490 FX_BOOL CXFA_WidgetAcc::LoadCaption() {
1491 InitLayoutData();
1492 return ((CXFA_FieldLayoutData*)m_pLayoutData)->LoadCaption(this);
1493 }
1494 CXFA_TextLayout* CXFA_WidgetAcc::GetCaptionTextLayout() {
1495 return m_pLayoutData
1496 ? ((CXFA_FieldLayoutData*)m_pLayoutData)->m_pCapTextLayout
1497 : NULL;
1498 }
1499 CXFA_TextLayout* CXFA_WidgetAcc::GetTextLayout() {
1500 return m_pLayoutData ? ((CXFA_TextLayoutData*)m_pLayoutData)->m_pTextLayout
1501 : NULL;
1502 }
1503 CFX_DIBitmap* CXFA_WidgetAcc::GetImageImage() {
1504 return m_pLayoutData ? ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap
1505 : NULL;
1506 }
1507 CFX_DIBitmap* CXFA_WidgetAcc::GetImageEditImage() {
1508 return m_pLayoutData ? ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap
1509 : NULL;
1510 }
1511 void CXFA_WidgetAcc::SetImageImage(CFX_DIBitmap* newImage) {
1512 if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap == newImage) {
1513 return;
1514 }
1515 if (((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap &&
1516 !((CXFA_ImageLayoutData*)m_pLayoutData)->m_bNamedImage) {
1517 delete ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap;
1518 ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = NULL;
1519 }
1520 ((CXFA_ImageLayoutData*)m_pLayoutData)->m_pDIBitmap = newImage;
1521 }
1522 void CXFA_WidgetAcc::SetImageEditImage(CFX_DIBitmap* newImage) {
1523 if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap == newImage) {
1524 return;
1525 }
1526 if (((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap &&
1527 !((CXFA_ImageEditData*)m_pLayoutData)->m_bNamedImage) {
1528 delete ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap;
1529 ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = NULL;
1530 }
1531 ((CXFA_ImageEditData*)m_pLayoutData)->m_pDIBitmap = newImage;
1532 }
1533 CXFA_WidgetLayoutData* CXFA_WidgetAcc::GetWidgetLayoutData() {
1534 return m_pLayoutData;
1535 }
1536 IFX_Font* CXFA_WidgetAcc::GetFDEFont() {
1537 CFX_WideStringC wsFontName = FX_WSTRC(L"Courier");
1538 FX_DWORD dwFontStyle = 0;
1539 if (CXFA_Font font = GetFont()) {
1540 if (font.IsBold()) {
1541 dwFontStyle |= FX_FONTSTYLE_Bold;
1542 }
1543 if (font.IsItalic()) {
1544 dwFontStyle |= FX_FONTSTYLE_Italic;
1545 }
1546 font.GetTypeface(wsFontName);
1547 }
1548 CXFA_FFDoc* pDoc = GetDoc();
1549 return pDoc->GetApp()->GetXFAFontMgr()->GetFont(pDoc, wsFontName,
1550 dwFontStyle);
1551 }
1552 FX_FLOAT CXFA_WidgetAcc::GetFontSize() {
1553 FX_FLOAT fFontSize = 10.0f;
1554 if (CXFA_Font font = GetFont()) {
1555 fFontSize = font.GetFontSize();
1556 }
1557 return fFontSize < 0.1f ? 10.0f : fFontSize;
1558 }
1559 FX_FLOAT CXFA_WidgetAcc::GetLineHeight() {
1560 FX_FLOAT fLineHeight = 0;
1561 if (CXFA_Para para = GetPara()) {
1562 fLineHeight = para.GetLineHeight();
1563 }
1564 if (fLineHeight < 1) {
1565 fLineHeight = GetFontSize() * 1.2f;
1566 }
1567 return fLineHeight;
1568 }
1569 FX_ARGB CXFA_WidgetAcc::GetTextColor() {
1570 if (CXFA_Font font = GetFont()) {
1571 return font.GetColor();
1572 }
1573 return 0xFF000000;
1574 }
1575 CXFA_Node* CXFA_TextProvider::GetTextNode(FX_BOOL& bRichText) {
1576 bRichText = FALSE;
1577 if (m_pTextNode) {
1578 if (m_pTextNode->GetClassID() == XFA_ELEMENT_ExData) {
1579 CFX_WideString wsContentType;
1580 m_pTextNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType,
1581 FALSE);
1582 if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
1583 bRichText = TRUE;
1584 }
1585 }
1586 return m_pTextNode;
1587 }
1588 if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
1589 CXFA_Node* pElementNode = m_pWidgetAcc->GetNode();
1590 CXFA_Node* pValueNode = pElementNode->GetChild(0, XFA_ELEMENT_Value);
1591 if (!pValueNode) {
1592 return NULL;
1593 }
1594 CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1595 if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
1596 CFX_WideString wsContentType;
1597 pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
1598 if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
1599 bRichText = TRUE;
1600 }
1601 }
1602 return pChildNode;
1603 } else if (m_eType == XFA_TEXTPROVIDERTYPE_Datasets) {
1604 CXFA_Node* pBind = m_pWidgetAcc->GetDatasets();
1605 IFDE_XMLNode* pXMLNode = pBind->GetXMLMappingNode();
1606 FXSYS_assert(pXMLNode);
1607 for (IFDE_XMLNode* pXMLChild =
1608 pXMLNode->GetNodeItem(IFDE_XMLNode::FirstChild);
1609 pXMLChild;
1610 pXMLChild = pXMLChild->GetNodeItem(IFDE_XMLNode::NextSibling)) {
1611 if (pXMLChild->GetType() == FDE_XMLNODE_Element) {
1612 IFDE_XMLElement* pElement = (IFDE_XMLElement*)pXMLChild;
1613 if (XFA_RecognizeRichText(pElement)) {
1614 bRichText = TRUE;
1615 }
1616 }
1617 }
1618 return pBind;
1619 } else if (m_eType == XFA_TEXTPROVIDERTYPE_Caption) {
1620 CXFA_Node* pCaptionNode =
1621 m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
1622 if (pCaptionNode == NULL) {
1623 return NULL;
1624 }
1625 CXFA_Node* pValueNode = pCaptionNode->GetChild(0, XFA_ELEMENT_Value);
1626 if (pValueNode == NULL) {
1627 return NULL;
1628 }
1629 CXFA_Node* pChildNode = pValueNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1630 if (pChildNode && pChildNode->GetClassID() == XFA_ELEMENT_ExData) {
1631 CFX_WideString wsContentType;
1632 pChildNode->GetAttribute(XFA_ATTRIBUTE_ContentType, wsContentType, FALSE);
1633 if (wsContentType.Equal(FX_WSTRC(L"text/html"))) {
1634 bRichText = TRUE;
1635 }
1636 }
1637 return pChildNode;
1638 }
1639 CXFA_Node* pItemNode =
1640 m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Items);
1641 if (pItemNode == NULL) {
1642 return NULL;
1643 }
1644 CXFA_Node* pNode = pItemNode->GetNodeItem(XFA_NODEITEM_FirstChild);
1645 while (pNode) {
1646 CFX_WideStringC wsName;
1647 pNode->TryCData(XFA_ATTRIBUTE_Name, wsName);
1648 if (m_eType == XFA_TEXTPROVIDERTYPE_Rollover &&
1649 wsName == FX_WSTRC(L"rollover")) {
1650 return pNode;
1651 }
1652 if (m_eType == XFA_TEXTPROVIDERTYPE_Down && wsName == FX_WSTRC(L"down")) {
1653 return pNode;
1654 }
1655 pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling);
1656 }
1657 return NULL;
1658 }
1659 CXFA_Para CXFA_TextProvider::GetParaNode() {
1660 if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
1661 return m_pWidgetAcc->GetPara();
1662 }
1663 CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
1664 return CXFA_Para(pNode->GetChild(0, XFA_ELEMENT_Para));
1665 }
1666 CXFA_Font CXFA_TextProvider::GetFontNode() {
1667 if (m_eType == XFA_TEXTPROVIDERTYPE_Text) {
1668 return m_pWidgetAcc->GetFont();
1669 }
1670 CXFA_Node* pNode = m_pWidgetAcc->GetNode()->GetChild(0, XFA_ELEMENT_Caption);
1671 pNode = pNode->GetChild(0, XFA_ELEMENT_Font);
1672 if (pNode) {
1673 return CXFA_Font(pNode);
1674 }
1675 return m_pWidgetAcc->GetFont();
1676 }
1677 FX_BOOL CXFA_TextProvider::IsCheckButtonAndAutoWidth() {
1678 XFA_ELEMENT eType = m_pWidgetAcc->GetUIType();
1679 if (eType == XFA_ELEMENT_CheckButton) {
1680 FX_FLOAT fWidth = 0;
1681 return !m_pWidgetAcc->GetWidth(fWidth);
1682 }
1683 return FALSE;
1684 }
1685 FX_BOOL CXFA_TextProvider::GetEmbbedObj(FX_BOOL bURI,
1686 FX_BOOL bRaw,
1687 const CFX_WideString& wsAttr,
1688 CFX_WideString& wsValue) {
1689 if (m_eType != XFA_TEXTPROVIDERTYPE_Text) {
1690 return FALSE;
1691 }
1692 if (bURI) {
1693 CXFA_Node* pWidgetNode = m_pWidgetAcc->GetNode();
1694 CXFA_Node* pParent = pWidgetNode->GetNodeItem(XFA_NODEITEM_Parent);
1695 CXFA_Document* pDocument = pWidgetNode->GetDocument();
1696 CXFA_Node* pIDNode = NULL;
1697 CXFA_WidgetAcc* pEmbAcc = NULL;
1698 if (pParent) {
1699 pIDNode = pDocument->GetNodeByID(pParent, wsAttr);
1700 }
1701 if (!pIDNode) {
1702 pIDNode = pDocument->GetNodeByID(
1703 ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Form)), wsAttr);
1704 }
1705 if (pIDNode) {
1706 pEmbAcc = (CXFA_WidgetAcc*)pIDNode->GetWidgetData();
1707 }
1708 if (pEmbAcc) {
1709 pEmbAcc->GetValue(wsValue, XFA_VALUEPICTURE_Display);
1710 return TRUE;
1711 }
1712 }
1713 return FALSE;
1714 }
OLDNEW
« no previous file with comments | « xfa/src/fxfa/app/xfa_ffwidgetacc.h ('k') | xfa/src/fxfa/app/xfa_ffwidgethandler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698