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 #ifndef XFA_FXFA_FXFA_WIDGET_H_
8 #define XFA_FXFA_FXFA_WIDGET_H_
9 
10 #include <memory>
11 
12 #include "core/fxcrt/cfx_retain_ptr.h"
13 #include "core/fxcrt/fx_coordinates.h"
14 #include "core/fxge/fx_dib.h"
15 #include "xfa/fxfa/parser/cxfa_box.h"
16 #include "xfa/fxfa/parser/cxfa_event.h"
17 #include "xfa/fxfa/parser/cxfa_image.h"
18 #include "xfa/fxfa/parser/cxfa_margin.h"
19 #include "xfa/fxfa/parser/cxfa_script.h"
20 #include "xfa/fxfa/parser/cxfa_value.h"
21 #include "xfa/fxfa/parser/cxfa_widgetdata.h"
22 
23 class CFGAS_GEFont;
24 class CXFA_EventParam;
25 class CXFA_FFApp;
26 class CXFA_FFDoc;
27 class CXFA_FFDocView;
28 class CXFA_FFWidget;
29 class CXFA_Node;
30 class CXFA_TextLayout;
31 class CXFA_WidgetLayoutData;
32 class IXFA_AppProvider;
33 
34 class CXFA_WidgetAcc : public CXFA_WidgetData {
35  public:
36   CXFA_WidgetAcc(CXFA_FFDocView* pDocView, CXFA_Node* pNode);
37   ~CXFA_WidgetAcc();
38 
39   bool GetName(CFX_WideString& wsName, int32_t iNameType = 0);
40   bool ProcessValueChanged();
41   void ResetData();
42 
43   void SetImageEdit(const CFX_WideString& wsContentType,
44                     const CFX_WideString& wsHref,
45                     const CFX_WideString& wsData);
46 
47   CXFA_WidgetAcc* GetExclGroup();
48   CXFA_FFDocView* GetDocView();
49   CXFA_FFDoc* GetDoc();
50   CXFA_FFApp* GetApp();
51   IXFA_AppProvider* GetAppProvider();
52 
53   int32_t ProcessEvent(int32_t iActivity, CXFA_EventParam* pEventParam);
54   int32_t ProcessEvent(CXFA_Event& event, CXFA_EventParam* pEventParam);
55   int32_t ProcessCalculate();
56   int32_t ProcessValidate(int32_t iFlags = 0);
57   int32_t ExecuteScript(CXFA_Script script,
58                         CXFA_EventParam* pEventParam,
59                         CFXJSE_Value** pRetValue = nullptr);
60 
61   CXFA_FFWidget* GetNextWidget(CXFA_FFWidget* pWidget);
62   void StartWidgetLayout(FX_FLOAT& fCalcWidth, FX_FLOAT& fCalcHeight);
63   bool FindSplitPos(int32_t iBlockIndex, FX_FLOAT& fCalcHeight);
64   bool LoadCaption();
65   void LoadText();
66   bool LoadImageImage();
67   bool LoadImageEditImage();
68   void GetImageDpi(int32_t& iImageXDpi, int32_t& iImageYDpi);
69   void GetImageEditDpi(int32_t& iImageXDpi, int32_t& iImageYDpi);
70   CXFA_TextLayout* GetCaptionTextLayout();
71   CXFA_TextLayout* GetTextLayout();
72   CFX_DIBitmap* GetImageImage();
73   CFX_DIBitmap* GetImageEditImage();
74   void SetImageImage(CFX_DIBitmap* newImage);
75   void SetImageEditImage(CFX_DIBitmap* newImage);
76   void UpdateUIDisplay(CXFA_FFWidget* pExcept = nullptr);
77 
78   CXFA_Node* GetDatasets();
79   CFX_RetainPtr<CFGAS_GEFont> GetFDEFont();
80   FX_FLOAT GetFontSize();
81   FX_ARGB GetTextColor();
82   FX_FLOAT GetLineHeight();
83   CXFA_WidgetLayoutData* GetWidgetLayoutData();
84 
85  protected:
86   void ProcessScriptTestValidate(CXFA_Validate validate,
87                                  int32_t iRet,
88                                  CFXJSE_Value* pRetValue,
89                                  bool bVersionFlag);
90   int32_t ProcessFormatTestValidate(CXFA_Validate validate, bool bVersionFlag);
91   int32_t ProcessNullTestValidate(CXFA_Validate validate,
92                                   int32_t iFlags,
93                                   bool bVersionFlag);
94   CFX_WideString GetValidateCaptionName(bool bVersionFlag);
95   CFX_WideString GetValidateMessage(bool bError, bool bVersionFlag);
96   void CalcCaptionSize(CFX_SizeF& szCap);
97   bool CalculateFieldAutoSize(CFX_SizeF& size);
98   bool CalculateWidgetAutoSize(CFX_SizeF& size);
99   bool CalculateTextEditAutoSize(CFX_SizeF& size);
100   bool CalculateCheckButtonAutoSize(CFX_SizeF& size);
101   bool CalculatePushButtonAutoSize(CFX_SizeF& size);
102   bool CalculateImageEditAutoSize(CFX_SizeF& size);
103   bool CalculateImageAutoSize(CFX_SizeF& size);
104   bool CalculateTextAutoSize(CFX_SizeF& size);
105   FX_FLOAT CalculateWidgetAutoHeight(FX_FLOAT fHeightCalc);
106   FX_FLOAT CalculateWidgetAutoWidth(FX_FLOAT fWidthCalc);
107   FX_FLOAT GetWidthWithoutMargin(FX_FLOAT fWidthCalc);
108   FX_FLOAT GetHeightWithoutMargin(FX_FLOAT fHeightCalc);
109   void CalculateTextContentSize(CFX_SizeF& size);
110   void CalculateAccWidthAndHeight(XFA_Element eUIType,
111                                   FX_FLOAT& fWidth,
112                                   FX_FLOAT& fCalcHeight);
113   void InitLayoutData();
114   void StartTextLayout(FX_FLOAT& fCalcWidth, FX_FLOAT& fCalcHeight);
115 
116   CXFA_FFDocView* m_pDocView;
117   std::unique_ptr<CXFA_WidgetLayoutData> m_pLayoutData;
118   uint32_t m_nRecursionDepth;
119 };
120 
121 #endif  // XFA_FXFA_FXFA_WIDGET_H_
122