xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffwidget.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
11*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcodec/fx_codec.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcodec/progressive_decoder.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/maybe_owned.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_fillrenderoptions.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_path.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/cfx_renderdevice.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/graphics/cfgas_gegraphics.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/fwl_widgethit.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_eventparam.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffapp.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpageview.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidgethandler.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_imagerenderer.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_border.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_box.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_edge.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_image.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_margin.h"
36*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
37*3ac0a46fSAndroid Build Coastguard Worker 
38*3ac0a46fSAndroid Build Coastguard Worker namespace {
39*3ac0a46fSAndroid Build Coastguard Worker 
XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type,int32_t iComponents,int32_t iBitsPerComponent)40*3ac0a46fSAndroid Build Coastguard Worker FXDIB_Format XFA_GetDIBFormat(FXCODEC_IMAGE_TYPE type,
41*3ac0a46fSAndroid Build Coastguard Worker                               int32_t iComponents,
42*3ac0a46fSAndroid Build Coastguard Worker                               int32_t iBitsPerComponent) {
43*3ac0a46fSAndroid Build Coastguard Worker   FXDIB_Format dibFormat = FXDIB_Format::kArgb;
44*3ac0a46fSAndroid Build Coastguard Worker   switch (type) {
45*3ac0a46fSAndroid Build Coastguard Worker     case FXCODEC_IMAGE_JPG:
46*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_BMP
47*3ac0a46fSAndroid Build Coastguard Worker     case FXCODEC_IMAGE_BMP:
48*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA_BMP
49*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_TIFF
50*3ac0a46fSAndroid Build Coastguard Worker     case FXCODEC_IMAGE_TIFF:
51*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA_TIFF
52*3ac0a46fSAndroid Build Coastguard Worker     {
53*3ac0a46fSAndroid Build Coastguard Worker       dibFormat = FXDIB_Format::kRgb32;
54*3ac0a46fSAndroid Build Coastguard Worker       int32_t bpp = iComponents * iBitsPerComponent;
55*3ac0a46fSAndroid Build Coastguard Worker       if (bpp <= 24) {
56*3ac0a46fSAndroid Build Coastguard Worker         dibFormat = FXDIB_Format::kRgb;
57*3ac0a46fSAndroid Build Coastguard Worker       }
58*3ac0a46fSAndroid Build Coastguard Worker     } break;
59*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA_PNG
60*3ac0a46fSAndroid Build Coastguard Worker     case FXCODEC_IMAGE_PNG:
61*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA_PNG
62*3ac0a46fSAndroid Build Coastguard Worker     default:
63*3ac0a46fSAndroid Build Coastguard Worker       break;
64*3ac0a46fSAndroid Build Coastguard Worker   }
65*3ac0a46fSAndroid Build Coastguard Worker   return dibFormat;
66*3ac0a46fSAndroid Build Coastguard Worker }
67*3ac0a46fSAndroid Build Coastguard Worker 
68*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
69*3ac0a46fSAndroid Build Coastguard Worker 
XFA_DrawImage(CFGAS_GEGraphics * pGS,const CFX_RectF & rtImage,const CFX_Matrix & matrix,RetainPtr<CFX_DIBitmap> pDIBitmap,XFA_AttributeValue iAspect,const CFX_Size & dpi,XFA_AttributeValue iHorzAlign,XFA_AttributeValue iVertAlign)70*3ac0a46fSAndroid Build Coastguard Worker void XFA_DrawImage(CFGAS_GEGraphics* pGS,
71*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_RectF& rtImage,
72*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_Matrix& matrix,
73*3ac0a46fSAndroid Build Coastguard Worker                    RetainPtr<CFX_DIBitmap> pDIBitmap,
74*3ac0a46fSAndroid Build Coastguard Worker                    XFA_AttributeValue iAspect,
75*3ac0a46fSAndroid Build Coastguard Worker                    const CFX_Size& dpi,
76*3ac0a46fSAndroid Build Coastguard Worker                    XFA_AttributeValue iHorzAlign,
77*3ac0a46fSAndroid Build Coastguard Worker                    XFA_AttributeValue iVertAlign) {
78*3ac0a46fSAndroid Build Coastguard Worker   if (rtImage.IsEmpty())
79*3ac0a46fSAndroid Build Coastguard Worker     return;
80*3ac0a46fSAndroid Build Coastguard Worker 
81*3ac0a46fSAndroid Build Coastguard Worker   if (!pDIBitmap || pDIBitmap->GetBuffer().empty())
82*3ac0a46fSAndroid Build Coastguard Worker     return;
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtFit(rtImage.TopLeft(),
85*3ac0a46fSAndroid Build Coastguard Worker                   XFA_UnitPx2Pt(pDIBitmap->GetWidth(), dpi.width),
86*3ac0a46fSAndroid Build Coastguard Worker                   XFA_UnitPx2Pt(pDIBitmap->GetHeight(), dpi.height));
87*3ac0a46fSAndroid Build Coastguard Worker   switch (iAspect) {
88*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Fit: {
89*3ac0a46fSAndroid Build Coastguard Worker       float f1 = rtImage.height / rtFit.height;
90*3ac0a46fSAndroid Build Coastguard Worker       float f2 = rtImage.width / rtFit.width;
91*3ac0a46fSAndroid Build Coastguard Worker       f1 = std::min(f1, f2);
92*3ac0a46fSAndroid Build Coastguard Worker       rtFit.height = rtFit.height * f1;
93*3ac0a46fSAndroid Build Coastguard Worker       rtFit.width = rtFit.width * f1;
94*3ac0a46fSAndroid Build Coastguard Worker       break;
95*3ac0a46fSAndroid Build Coastguard Worker     }
96*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Height: {
97*3ac0a46fSAndroid Build Coastguard Worker       float f1 = rtImage.height / rtFit.height;
98*3ac0a46fSAndroid Build Coastguard Worker       rtFit.height = rtImage.height;
99*3ac0a46fSAndroid Build Coastguard Worker       rtFit.width = f1 * rtFit.width;
100*3ac0a46fSAndroid Build Coastguard Worker       break;
101*3ac0a46fSAndroid Build Coastguard Worker     }
102*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::None:
103*3ac0a46fSAndroid Build Coastguard Worker       rtFit.height = rtImage.height;
104*3ac0a46fSAndroid Build Coastguard Worker       rtFit.width = rtImage.width;
105*3ac0a46fSAndroid Build Coastguard Worker       break;
106*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Width: {
107*3ac0a46fSAndroid Build Coastguard Worker       float f1 = rtImage.width / rtFit.width;
108*3ac0a46fSAndroid Build Coastguard Worker       rtFit.width = rtImage.width;
109*3ac0a46fSAndroid Build Coastguard Worker       rtFit.height = rtFit.height * f1;
110*3ac0a46fSAndroid Build Coastguard Worker       break;
111*3ac0a46fSAndroid Build Coastguard Worker     }
112*3ac0a46fSAndroid Build Coastguard Worker     case XFA_AttributeValue::Actual:
113*3ac0a46fSAndroid Build Coastguard Worker     default:
114*3ac0a46fSAndroid Build Coastguard Worker       break;
115*3ac0a46fSAndroid Build Coastguard Worker   }
116*3ac0a46fSAndroid Build Coastguard Worker 
117*3ac0a46fSAndroid Build Coastguard Worker   if (iHorzAlign == XFA_AttributeValue::Center)
118*3ac0a46fSAndroid Build Coastguard Worker     rtFit.left += (rtImage.width - rtFit.width) / 2;
119*3ac0a46fSAndroid Build Coastguard Worker   else if (iHorzAlign == XFA_AttributeValue::Right)
120*3ac0a46fSAndroid Build Coastguard Worker     rtFit.left = rtImage.right() - rtFit.width;
121*3ac0a46fSAndroid Build Coastguard Worker 
122*3ac0a46fSAndroid Build Coastguard Worker   if (iVertAlign == XFA_AttributeValue::Middle)
123*3ac0a46fSAndroid Build Coastguard Worker     rtFit.top += (rtImage.height - rtFit.height) / 2;
124*3ac0a46fSAndroid Build Coastguard Worker   else if (iVertAlign == XFA_AttributeValue::Bottom)
125*3ac0a46fSAndroid Build Coastguard Worker     rtFit.top = rtImage.bottom() - rtImage.height;
126*3ac0a46fSAndroid Build Coastguard Worker 
127*3ac0a46fSAndroid Build Coastguard Worker   CFX_RenderDevice* pRenderDevice = pGS->GetRenderDevice();
128*3ac0a46fSAndroid Build Coastguard Worker   CFX_RenderDevice::StateRestorer restorer(pRenderDevice);
129*3ac0a46fSAndroid Build Coastguard Worker   CFX_Path path;
130*3ac0a46fSAndroid Build Coastguard Worker   path.AppendRect(rtImage.left, rtImage.bottom(), rtImage.right(), rtImage.top);
131*3ac0a46fSAndroid Build Coastguard Worker   pRenderDevice->SetClip_PathFill(path, &matrix,
132*3ac0a46fSAndroid Build Coastguard Worker                                   CFX_FillRenderOptions::WindingOptions());
133*3ac0a46fSAndroid Build Coastguard Worker 
134*3ac0a46fSAndroid Build Coastguard Worker   CFX_Matrix mtImage(1, 0, 0, -1, 0, 1);
135*3ac0a46fSAndroid Build Coastguard Worker   mtImage.Concat(
136*3ac0a46fSAndroid Build Coastguard Worker       CFX_Matrix(rtFit.width, 0, 0, rtFit.height, rtFit.left, rtFit.top));
137*3ac0a46fSAndroid Build Coastguard Worker   mtImage.Concat(matrix);
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker   CXFA_ImageRenderer imageRender(pRenderDevice, std::move(pDIBitmap), mtImage);
140*3ac0a46fSAndroid Build Coastguard Worker   if (!imageRender.Start())
141*3ac0a46fSAndroid Build Coastguard Worker     return;
142*3ac0a46fSAndroid Build Coastguard Worker 
143*3ac0a46fSAndroid Build Coastguard Worker   while (imageRender.Continue())
144*3ac0a46fSAndroid Build Coastguard Worker     continue;
145*3ac0a46fSAndroid Build Coastguard Worker }
146*3ac0a46fSAndroid Build Coastguard Worker 
XFA_LoadImageFromBuffer(RetainPtr<IFX_SeekableReadStream> pImageFileRead,FXCODEC_IMAGE_TYPE type,int32_t & iImageXDpi,int32_t & iImageYDpi)147*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> XFA_LoadImageFromBuffer(
148*3ac0a46fSAndroid Build Coastguard Worker     RetainPtr<IFX_SeekableReadStream> pImageFileRead,
149*3ac0a46fSAndroid Build Coastguard Worker     FXCODEC_IMAGE_TYPE type,
150*3ac0a46fSAndroid Build Coastguard Worker     int32_t& iImageXDpi,
151*3ac0a46fSAndroid Build Coastguard Worker     int32_t& iImageYDpi) {
152*3ac0a46fSAndroid Build Coastguard Worker   auto pProgressiveDecoder = std::make_unique<ProgressiveDecoder>();
153*3ac0a46fSAndroid Build Coastguard Worker 
154*3ac0a46fSAndroid Build Coastguard Worker   CFX_DIBAttribute dibAttr;
155*3ac0a46fSAndroid Build Coastguard Worker   pProgressiveDecoder->LoadImageInfo(std::move(pImageFileRead), type, &dibAttr,
156*3ac0a46fSAndroid Build Coastguard Worker                                      false);
157*3ac0a46fSAndroid Build Coastguard Worker   switch (dibAttr.m_wDPIUnit) {
158*3ac0a46fSAndroid Build Coastguard Worker     case CFX_DIBAttribute::kResUnitCentimeter:
159*3ac0a46fSAndroid Build Coastguard Worker       dibAttr.m_nXDPI = static_cast<int32_t>(dibAttr.m_nXDPI * 2.54f);
160*3ac0a46fSAndroid Build Coastguard Worker       dibAttr.m_nYDPI = static_cast<int32_t>(dibAttr.m_nYDPI * 2.54f);
161*3ac0a46fSAndroid Build Coastguard Worker       break;
162*3ac0a46fSAndroid Build Coastguard Worker     case CFX_DIBAttribute::kResUnitMeter:
163*3ac0a46fSAndroid Build Coastguard Worker       dibAttr.m_nXDPI =
164*3ac0a46fSAndroid Build Coastguard Worker           static_cast<int32_t>(dibAttr.m_nXDPI / (float)100 * 2.54f);
165*3ac0a46fSAndroid Build Coastguard Worker       dibAttr.m_nYDPI =
166*3ac0a46fSAndroid Build Coastguard Worker           static_cast<int32_t>(dibAttr.m_nYDPI / (float)100 * 2.54f);
167*3ac0a46fSAndroid Build Coastguard Worker       break;
168*3ac0a46fSAndroid Build Coastguard Worker     default:
169*3ac0a46fSAndroid Build Coastguard Worker       break;
170*3ac0a46fSAndroid Build Coastguard Worker   }
171*3ac0a46fSAndroid Build Coastguard Worker   iImageXDpi = dibAttr.m_nXDPI > 1 ? dibAttr.m_nXDPI : (96);
172*3ac0a46fSAndroid Build Coastguard Worker   iImageYDpi = dibAttr.m_nYDPI > 1 ? dibAttr.m_nYDPI : (96);
173*3ac0a46fSAndroid Build Coastguard Worker   if (pProgressiveDecoder->GetWidth() <= 0 ||
174*3ac0a46fSAndroid Build Coastguard Worker       pProgressiveDecoder->GetHeight() <= 0) {
175*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
176*3ac0a46fSAndroid Build Coastguard Worker   }
177*3ac0a46fSAndroid Build Coastguard Worker 
178*3ac0a46fSAndroid Build Coastguard Worker   type = pProgressiveDecoder->GetType();
179*3ac0a46fSAndroid Build Coastguard Worker   int32_t iComponents = pProgressiveDecoder->GetNumComponents();
180*3ac0a46fSAndroid Build Coastguard Worker   int32_t iBpc = pProgressiveDecoder->GetBPC();
181*3ac0a46fSAndroid Build Coastguard Worker   FXDIB_Format dibFormat = XFA_GetDIBFormat(type, iComponents, iBpc);
182*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CFX_DIBitmap> pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
183*3ac0a46fSAndroid Build Coastguard Worker   pBitmap->Create(pProgressiveDecoder->GetWidth(),
184*3ac0a46fSAndroid Build Coastguard Worker                   pProgressiveDecoder->GetHeight(), dibFormat);
185*3ac0a46fSAndroid Build Coastguard Worker   pBitmap->Clear(0xffffffff);
186*3ac0a46fSAndroid Build Coastguard Worker 
187*3ac0a46fSAndroid Build Coastguard Worker   size_t nFrames;
188*3ac0a46fSAndroid Build Coastguard Worker   FXCODEC_STATUS status;
189*3ac0a46fSAndroid Build Coastguard Worker   std::tie(status, nFrames) = pProgressiveDecoder->GetFrames();
190*3ac0a46fSAndroid Build Coastguard Worker   if (status != FXCODEC_STATUS::kDecodeReady || nFrames == 0)
191*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
192*3ac0a46fSAndroid Build Coastguard Worker 
193*3ac0a46fSAndroid Build Coastguard Worker   status = pProgressiveDecoder->StartDecode(pBitmap, 0, 0, pBitmap->GetWidth(),
194*3ac0a46fSAndroid Build Coastguard Worker                                             pBitmap->GetHeight());
195*3ac0a46fSAndroid Build Coastguard Worker   if (status == FXCODEC_STATUS::kError)
196*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
197*3ac0a46fSAndroid Build Coastguard Worker 
198*3ac0a46fSAndroid Build Coastguard Worker   while (status == FXCODEC_STATUS::kDecodeToBeContinued) {
199*3ac0a46fSAndroid Build Coastguard Worker     status = pProgressiveDecoder->ContinueDecode();
200*3ac0a46fSAndroid Build Coastguard Worker     if (status == FXCODEC_STATUS::kError)
201*3ac0a46fSAndroid Build Coastguard Worker       return nullptr;
202*3ac0a46fSAndroid Build Coastguard Worker   }
203*3ac0a46fSAndroid Build Coastguard Worker 
204*3ac0a46fSAndroid Build Coastguard Worker   return pBitmap;
205*3ac0a46fSAndroid Build Coastguard Worker }
206*3ac0a46fSAndroid Build Coastguard Worker 
XFA_RectWithoutMargin(CFX_RectF * rt,const CXFA_Margin * margin)207*3ac0a46fSAndroid Build Coastguard Worker void XFA_RectWithoutMargin(CFX_RectF* rt, const CXFA_Margin* margin) {
208*3ac0a46fSAndroid Build Coastguard Worker   if (!margin)
209*3ac0a46fSAndroid Build Coastguard Worker     return;
210*3ac0a46fSAndroid Build Coastguard Worker 
211*3ac0a46fSAndroid Build Coastguard Worker   rt->Deflate(margin->GetLeftInset(), margin->GetTopInset(),
212*3ac0a46fSAndroid Build Coastguard Worker               margin->GetRightInset(), margin->GetBottomInset());
213*3ac0a46fSAndroid Build Coastguard Worker }
214*3ac0a46fSAndroid Build Coastguard Worker 
215*3ac0a46fSAndroid Build Coastguard Worker // static
FromLayoutItem(CXFA_LayoutItem * pLayoutItem)216*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFWidget::FromLayoutItem(CXFA_LayoutItem* pLayoutItem) {
217*3ac0a46fSAndroid Build Coastguard Worker   if (!pLayoutItem->GetFormNode()->HasCreatedUIWidget())
218*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
219*3ac0a46fSAndroid Build Coastguard Worker 
220*3ac0a46fSAndroid Build Coastguard Worker   return GetFFWidget(ToContentLayoutItem(pLayoutItem));
221*3ac0a46fSAndroid Build Coastguard Worker }
222*3ac0a46fSAndroid Build Coastguard Worker 
CXFA_FFWidget(CXFA_Node * node)223*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget::CXFA_FFWidget(CXFA_Node* node) : m_pNode(node) {}
224*3ac0a46fSAndroid Build Coastguard Worker 
225*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget::~CXFA_FFWidget() = default;
226*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const227*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::Trace(cppgc::Visitor* visitor) const {
228*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pLayoutItem);
229*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pDocView);
230*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pPageView);
231*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pNode);
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker 
GetFWLApp() const234*3ac0a46fSAndroid Build Coastguard Worker CFWL_App* CXFA_FFWidget::GetFWLApp() const {
235*3ac0a46fSAndroid Build Coastguard Worker   return GetPageView()->GetDocView()->GetDoc()->GetApp()->GetFWLApp();
236*3ac0a46fSAndroid Build Coastguard Worker }
237*3ac0a46fSAndroid Build Coastguard Worker 
GetNextFFWidget() const238*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget* CXFA_FFWidget::GetNextFFWidget() const {
239*3ac0a46fSAndroid Build Coastguard Worker   return GetFFWidget(GetLayoutItem()->GetNext());
240*3ac0a46fSAndroid Build Coastguard Worker }
241*3ac0a46fSAndroid Build Coastguard Worker 
GetWidgetRect() const242*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& CXFA_FFWidget::GetWidgetRect() const {
243*3ac0a46fSAndroid Build Coastguard Worker   if (!GetLayoutItem()->TestStatusBits(XFA_WidgetStatus::kRectCached))
244*3ac0a46fSAndroid Build Coastguard Worker     RecacheWidgetRect();
245*3ac0a46fSAndroid Build Coastguard Worker   return m_WidgetRect;
246*3ac0a46fSAndroid Build Coastguard Worker }
247*3ac0a46fSAndroid Build Coastguard Worker 
RecacheWidgetRect() const248*3ac0a46fSAndroid Build Coastguard Worker const CFX_RectF& CXFA_FFWidget::RecacheWidgetRect() const {
249*3ac0a46fSAndroid Build Coastguard Worker   GetLayoutItem()->SetStatusBits(XFA_WidgetStatus::kRectCached);
250*3ac0a46fSAndroid Build Coastguard Worker   m_WidgetRect = GetLayoutItem()->GetAbsoluteRect();
251*3ac0a46fSAndroid Build Coastguard Worker   return m_WidgetRect;
252*3ac0a46fSAndroid Build Coastguard Worker }
253*3ac0a46fSAndroid Build Coastguard Worker 
GetRectWithoutRotate()254*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF CXFA_FFWidget::GetRectWithoutRotate() {
255*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtWidget = GetWidgetRect();
256*3ac0a46fSAndroid Build Coastguard Worker   float fValue = 0;
257*3ac0a46fSAndroid Build Coastguard Worker   switch (m_pNode->GetRotate()) {
258*3ac0a46fSAndroid Build Coastguard Worker     case 90:
259*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.top = rtWidget.bottom();
260*3ac0a46fSAndroid Build Coastguard Worker       fValue = rtWidget.width;
261*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.width = rtWidget.height;
262*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.height = fValue;
263*3ac0a46fSAndroid Build Coastguard Worker       break;
264*3ac0a46fSAndroid Build Coastguard Worker     case 180:
265*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.left = rtWidget.right();
266*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.top = rtWidget.bottom();
267*3ac0a46fSAndroid Build Coastguard Worker       break;
268*3ac0a46fSAndroid Build Coastguard Worker     case 270:
269*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.left = rtWidget.right();
270*3ac0a46fSAndroid Build Coastguard Worker       fValue = rtWidget.width;
271*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.width = rtWidget.height;
272*3ac0a46fSAndroid Build Coastguard Worker       rtWidget.height = fValue;
273*3ac0a46fSAndroid Build Coastguard Worker       break;
274*3ac0a46fSAndroid Build Coastguard Worker   }
275*3ac0a46fSAndroid Build Coastguard Worker   return rtWidget;
276*3ac0a46fSAndroid Build Coastguard Worker }
277*3ac0a46fSAndroid Build Coastguard Worker 
ModifyStatus(Mask<XFA_WidgetStatus> dwAdded,Mask<XFA_WidgetStatus> dwRemoved)278*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::ModifyStatus(Mask<XFA_WidgetStatus> dwAdded,
279*3ac0a46fSAndroid Build Coastguard Worker                                  Mask<XFA_WidgetStatus> dwRemoved) {
280*3ac0a46fSAndroid Build Coastguard Worker   GetLayoutItem()->ClearStatusBits(dwRemoved);
281*3ac0a46fSAndroid Build Coastguard Worker   GetLayoutItem()->SetStatusBits(dwAdded);
282*3ac0a46fSAndroid Build Coastguard Worker }
283*3ac0a46fSAndroid Build Coastguard Worker 
AsField()284*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFField* CXFA_FFWidget::AsField() {
285*3ac0a46fSAndroid Build Coastguard Worker   return nullptr;
286*3ac0a46fSAndroid Build Coastguard Worker }
287*3ac0a46fSAndroid Build Coastguard Worker 
GetBBox(FocusOption focus)288*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF CXFA_FFWidget::GetBBox(FocusOption focus) {
289*3ac0a46fSAndroid Build Coastguard Worker   if (focus == kDrawFocus || !m_pPageView)
290*3ac0a46fSAndroid Build Coastguard Worker     return CFX_RectF();
291*3ac0a46fSAndroid Build Coastguard Worker   return m_pPageView->GetPageViewRect();
292*3ac0a46fSAndroid Build Coastguard Worker }
293*3ac0a46fSAndroid Build Coastguard Worker 
RenderWidget(CFGAS_GEGraphics * pGS,const CFX_Matrix & matrix,HighlightOption highlight)294*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::RenderWidget(CFGAS_GEGraphics* pGS,
295*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_Matrix& matrix,
296*3ac0a46fSAndroid Build Coastguard Worker                                  HighlightOption highlight) {
297*3ac0a46fSAndroid Build Coastguard Worker   if (!HasVisibleStatus())
298*3ac0a46fSAndroid Build Coastguard Worker     return;
299*3ac0a46fSAndroid Build Coastguard Worker 
300*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Border* border = m_pNode->GetBorderIfExists();
301*3ac0a46fSAndroid Build Coastguard Worker   if (!border)
302*3ac0a46fSAndroid Build Coastguard Worker     return;
303*3ac0a46fSAndroid Build Coastguard Worker 
304*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtBorder = GetRectWithoutRotate();
305*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Margin* margin = border->GetMarginIfExists();
306*3ac0a46fSAndroid Build Coastguard Worker   XFA_RectWithoutMargin(&rtBorder, margin);
307*3ac0a46fSAndroid Build Coastguard Worker   rtBorder.Normalize();
308*3ac0a46fSAndroid Build Coastguard Worker   DrawBorder(pGS, border, rtBorder, matrix);
309*3ac0a46fSAndroid Build Coastguard Worker }
310*3ac0a46fSAndroid Build Coastguard Worker 
IsLoaded()311*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::IsLoaded() {
312*3ac0a46fSAndroid Build Coastguard Worker   return !!m_pPageView;
313*3ac0a46fSAndroid Build Coastguard Worker }
314*3ac0a46fSAndroid Build Coastguard Worker 
LoadWidget()315*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::LoadWidget() {
316*3ac0a46fSAndroid Build Coastguard Worker   PerformLayout();
317*3ac0a46fSAndroid Build Coastguard Worker   return true;
318*3ac0a46fSAndroid Build Coastguard Worker }
319*3ac0a46fSAndroid Build Coastguard Worker 
PerformLayout()320*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::PerformLayout() {
321*3ac0a46fSAndroid Build Coastguard Worker   RecacheWidgetRect();
322*3ac0a46fSAndroid Build Coastguard Worker   return true;
323*3ac0a46fSAndroid Build Coastguard Worker }
324*3ac0a46fSAndroid Build Coastguard Worker 
UpdateFWLData()325*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::UpdateFWLData() {
326*3ac0a46fSAndroid Build Coastguard Worker   return false;
327*3ac0a46fSAndroid Build Coastguard Worker }
328*3ac0a46fSAndroid Build Coastguard Worker 
UpdateWidgetProperty()329*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::UpdateWidgetProperty() {}
330*3ac0a46fSAndroid Build Coastguard Worker 
HasEventUnderHandler(XFA_EVENTTYPE eEventType,CXFA_FFWidgetHandler * pHandler)331*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::HasEventUnderHandler(XFA_EVENTTYPE eEventType,
332*3ac0a46fSAndroid Build Coastguard Worker                                          CXFA_FFWidgetHandler* pHandler) {
333*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* pNode = GetNode();
334*3ac0a46fSAndroid Build Coastguard Worker   return pNode->IsWidgetReady() && pHandler->HasEvent(pNode, eEventType);
335*3ac0a46fSAndroid Build Coastguard Worker }
336*3ac0a46fSAndroid Build Coastguard Worker 
ProcessEventUnderHandler(CXFA_EventParam * params,CXFA_FFWidgetHandler * pHandler)337*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::ProcessEventUnderHandler(CXFA_EventParam* params,
338*3ac0a46fSAndroid Build Coastguard Worker                                              CXFA_FFWidgetHandler* pHandler) {
339*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* pNode = GetNode();
340*3ac0a46fSAndroid Build Coastguard Worker   if (!pNode->IsWidgetReady())
341*3ac0a46fSAndroid Build Coastguard Worker     return false;
342*3ac0a46fSAndroid Build Coastguard Worker 
343*3ac0a46fSAndroid Build Coastguard Worker   return pHandler->ProcessEvent(pNode, params) == XFA_EventError::kSuccess;
344*3ac0a46fSAndroid Build Coastguard Worker }
345*3ac0a46fSAndroid Build Coastguard Worker 
DrawBorder(CFGAS_GEGraphics * pGS,CXFA_Box * box,const CFX_RectF & rtBorder,const CFX_Matrix & matrix)346*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::DrawBorder(CFGAS_GEGraphics* pGS,
347*3ac0a46fSAndroid Build Coastguard Worker                                CXFA_Box* box,
348*3ac0a46fSAndroid Build Coastguard Worker                                const CFX_RectF& rtBorder,
349*3ac0a46fSAndroid Build Coastguard Worker                                const CFX_Matrix& matrix) {
350*3ac0a46fSAndroid Build Coastguard Worker   if (box)
351*3ac0a46fSAndroid Build Coastguard Worker     box->Draw(pGS, rtBorder, matrix, false);
352*3ac0a46fSAndroid Build Coastguard Worker }
353*3ac0a46fSAndroid Build Coastguard Worker 
DrawBorderWithFlag(CFGAS_GEGraphics * pGS,CXFA_Box * box,const CFX_RectF & rtBorder,const CFX_Matrix & matrix,bool forceRound)354*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::DrawBorderWithFlag(CFGAS_GEGraphics* pGS,
355*3ac0a46fSAndroid Build Coastguard Worker                                        CXFA_Box* box,
356*3ac0a46fSAndroid Build Coastguard Worker                                        const CFX_RectF& rtBorder,
357*3ac0a46fSAndroid Build Coastguard Worker                                        const CFX_Matrix& matrix,
358*3ac0a46fSAndroid Build Coastguard Worker                                        bool forceRound) {
359*3ac0a46fSAndroid Build Coastguard Worker   if (box)
360*3ac0a46fSAndroid Build Coastguard Worker     box->Draw(pGS, rtBorder, matrix, forceRound);
361*3ac0a46fSAndroid Build Coastguard Worker }
362*3ac0a46fSAndroid Build Coastguard Worker 
InvalidateRect()363*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::InvalidateRect() {
364*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtWidget = GetBBox(kDoNotDrawFocus);
365*3ac0a46fSAndroid Build Coastguard Worker   rtWidget.Inflate(2, 2);
366*3ac0a46fSAndroid Build Coastguard Worker   m_pDocView->InvalidateRect(m_pPageView.Get(), rtWidget);
367*3ac0a46fSAndroid Build Coastguard Worker }
368*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseEnter()369*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnMouseEnter() {
370*3ac0a46fSAndroid Build Coastguard Worker   return false;
371*3ac0a46fSAndroid Build Coastguard Worker }
372*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseExit()373*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnMouseExit() {
374*3ac0a46fSAndroid Build Coastguard Worker   return false;
375*3ac0a46fSAndroid Build Coastguard Worker }
376*3ac0a46fSAndroid Build Coastguard Worker 
AcceptsFocusOnButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point,CFWL_MessageMouse::MouseCommand command)377*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::AcceptsFocusOnButtonDown(
378*3ac0a46fSAndroid Build Coastguard Worker     Mask<XFA_FWL_KeyFlag> dwFlags,
379*3ac0a46fSAndroid Build Coastguard Worker     const CFX_PointF& point,
380*3ac0a46fSAndroid Build Coastguard Worker     CFWL_MessageMouse::MouseCommand command) {
381*3ac0a46fSAndroid Build Coastguard Worker   return false;
382*3ac0a46fSAndroid Build Coastguard Worker }
383*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)384*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,
385*3ac0a46fSAndroid Build Coastguard Worker                                   const CFX_PointF& point) {
386*3ac0a46fSAndroid Build Coastguard Worker   return false;
387*3ac0a46fSAndroid Build Coastguard Worker }
388*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonUp(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)389*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnLButtonUp(Mask<XFA_FWL_KeyFlag> dwFlags,
390*3ac0a46fSAndroid Build Coastguard Worker                                 const CFX_PointF& point) {
391*3ac0a46fSAndroid Build Coastguard Worker   return false;
392*3ac0a46fSAndroid Build Coastguard Worker }
393*3ac0a46fSAndroid Build Coastguard Worker 
OnLButtonDblClk(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)394*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnLButtonDblClk(Mask<XFA_FWL_KeyFlag> dwFlags,
395*3ac0a46fSAndroid Build Coastguard Worker                                     const CFX_PointF& point) {
396*3ac0a46fSAndroid Build Coastguard Worker   return false;
397*3ac0a46fSAndroid Build Coastguard Worker }
398*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseMove(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)399*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnMouseMove(Mask<XFA_FWL_KeyFlag> dwFlags,
400*3ac0a46fSAndroid Build Coastguard Worker                                 const CFX_PointF& point) {
401*3ac0a46fSAndroid Build Coastguard Worker   return false;
402*3ac0a46fSAndroid Build Coastguard Worker }
403*3ac0a46fSAndroid Build Coastguard Worker 
OnMouseWheel(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point,const CFX_Vector & delta)404*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnMouseWheel(Mask<XFA_FWL_KeyFlag> dwFlags,
405*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_PointF& point,
406*3ac0a46fSAndroid Build Coastguard Worker                                  const CFX_Vector& delta) {
407*3ac0a46fSAndroid Build Coastguard Worker   return false;
408*3ac0a46fSAndroid Build Coastguard Worker }
409*3ac0a46fSAndroid Build Coastguard Worker 
OnRButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)410*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnRButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,
411*3ac0a46fSAndroid Build Coastguard Worker                                   const CFX_PointF& point) {
412*3ac0a46fSAndroid Build Coastguard Worker   return false;
413*3ac0a46fSAndroid Build Coastguard Worker }
414*3ac0a46fSAndroid Build Coastguard Worker 
OnRButtonUp(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)415*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnRButtonUp(Mask<XFA_FWL_KeyFlag> dwFlags,
416*3ac0a46fSAndroid Build Coastguard Worker                                 const CFX_PointF& point) {
417*3ac0a46fSAndroid Build Coastguard Worker   return false;
418*3ac0a46fSAndroid Build Coastguard Worker }
419*3ac0a46fSAndroid Build Coastguard Worker 
OnRButtonDblClk(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)420*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnRButtonDblClk(Mask<XFA_FWL_KeyFlag> dwFlags,
421*3ac0a46fSAndroid Build Coastguard Worker                                     const CFX_PointF& point) {
422*3ac0a46fSAndroid Build Coastguard Worker   return false;
423*3ac0a46fSAndroid Build Coastguard Worker }
424*3ac0a46fSAndroid Build Coastguard Worker 
OnSetFocus(CXFA_FFWidget * pOldWidget)425*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnSetFocus(CXFA_FFWidget* pOldWidget) {
426*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
427*3ac0a46fSAndroid Build Coastguard Worker   if (pParent && !pParent->IsAncestorOf(pOldWidget)) {
428*3ac0a46fSAndroid Build Coastguard Worker     if (!pParent->OnSetFocus(pOldWidget))
429*3ac0a46fSAndroid Build Coastguard Worker       return false;
430*3ac0a46fSAndroid Build Coastguard Worker   }
431*3ac0a46fSAndroid Build Coastguard Worker   GetLayoutItem()->SetStatusBits(XFA_WidgetStatus::kFocused);
432*3ac0a46fSAndroid Build Coastguard Worker 
433*3ac0a46fSAndroid Build Coastguard Worker   CXFA_EventParam eParam;
434*3ac0a46fSAndroid Build Coastguard Worker   eParam.m_eType = XFA_EVENT_Enter;
435*3ac0a46fSAndroid Build Coastguard Worker   m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Enter, &eParam);
436*3ac0a46fSAndroid Build Coastguard Worker   return true;
437*3ac0a46fSAndroid Build Coastguard Worker }
438*3ac0a46fSAndroid Build Coastguard Worker 
OnKillFocus(CXFA_FFWidget * pNewWidget)439*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnKillFocus(CXFA_FFWidget* pNewWidget) {
440*3ac0a46fSAndroid Build Coastguard Worker   GetLayoutItem()->ClearStatusBits(XFA_WidgetStatus::kFocused);
441*3ac0a46fSAndroid Build Coastguard Worker   EventKillFocus();
442*3ac0a46fSAndroid Build Coastguard Worker   if (!pNewWidget)
443*3ac0a46fSAndroid Build Coastguard Worker     return true;
444*3ac0a46fSAndroid Build Coastguard Worker 
445*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFWidget* pParent = GetFFWidget(ToContentLayoutItem(GetParent()));
446*3ac0a46fSAndroid Build Coastguard Worker   if (pParent && !pParent->IsAncestorOf(pNewWidget)) {
447*3ac0a46fSAndroid Build Coastguard Worker     if (!pParent->OnKillFocus(pNewWidget))
448*3ac0a46fSAndroid Build Coastguard Worker       return false;
449*3ac0a46fSAndroid Build Coastguard Worker   }
450*3ac0a46fSAndroid Build Coastguard Worker   return true;
451*3ac0a46fSAndroid Build Coastguard Worker }
452*3ac0a46fSAndroid Build Coastguard Worker 
OnKeyDown(XFA_FWL_VKEYCODE dwKeyCode,Mask<XFA_FWL_KeyFlag> dwFlags)453*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnKeyDown(XFA_FWL_VKEYCODE dwKeyCode,
454*3ac0a46fSAndroid Build Coastguard Worker                               Mask<XFA_FWL_KeyFlag> dwFlags) {
455*3ac0a46fSAndroid Build Coastguard Worker   return false;
456*3ac0a46fSAndroid Build Coastguard Worker }
457*3ac0a46fSAndroid Build Coastguard Worker 
OnChar(uint32_t dwChar,Mask<XFA_FWL_KeyFlag> dwFlags)458*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::OnChar(uint32_t dwChar, Mask<XFA_FWL_KeyFlag> dwFlags) {
459*3ac0a46fSAndroid Build Coastguard Worker   return false;
460*3ac0a46fSAndroid Build Coastguard Worker }
461*3ac0a46fSAndroid Build Coastguard Worker 
HitTest(const CFX_PointF & point)462*3ac0a46fSAndroid Build Coastguard Worker FWL_WidgetHit CXFA_FFWidget::HitTest(const CFX_PointF& point) {
463*3ac0a46fSAndroid Build Coastguard Worker   return FWL_WidgetHit::Unknown;
464*3ac0a46fSAndroid Build Coastguard Worker }
465*3ac0a46fSAndroid Build Coastguard Worker 
CanUndo()466*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanUndo() {
467*3ac0a46fSAndroid Build Coastguard Worker   return false;
468*3ac0a46fSAndroid Build Coastguard Worker }
469*3ac0a46fSAndroid Build Coastguard Worker 
CanRedo()470*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanRedo() {
471*3ac0a46fSAndroid Build Coastguard Worker   return false;
472*3ac0a46fSAndroid Build Coastguard Worker }
473*3ac0a46fSAndroid Build Coastguard Worker 
CanCopy()474*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanCopy() {
475*3ac0a46fSAndroid Build Coastguard Worker   return false;
476*3ac0a46fSAndroid Build Coastguard Worker }
477*3ac0a46fSAndroid Build Coastguard Worker 
CanCut()478*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanCut() {
479*3ac0a46fSAndroid Build Coastguard Worker   return false;
480*3ac0a46fSAndroid Build Coastguard Worker }
481*3ac0a46fSAndroid Build Coastguard Worker 
CanPaste()482*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanPaste() {
483*3ac0a46fSAndroid Build Coastguard Worker   return false;
484*3ac0a46fSAndroid Build Coastguard Worker }
485*3ac0a46fSAndroid Build Coastguard Worker 
CanSelectAll()486*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanSelectAll() {
487*3ac0a46fSAndroid Build Coastguard Worker   return false;
488*3ac0a46fSAndroid Build Coastguard Worker }
489*3ac0a46fSAndroid Build Coastguard Worker 
CanDelete()490*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanDelete() {
491*3ac0a46fSAndroid Build Coastguard Worker   return CanCut();
492*3ac0a46fSAndroid Build Coastguard Worker }
493*3ac0a46fSAndroid Build Coastguard Worker 
CanDeSelect()494*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::CanDeSelect() {
495*3ac0a46fSAndroid Build Coastguard Worker   return CanCopy();
496*3ac0a46fSAndroid Build Coastguard Worker }
497*3ac0a46fSAndroid Build Coastguard Worker 
Undo()498*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::Undo() {
499*3ac0a46fSAndroid Build Coastguard Worker   return false;
500*3ac0a46fSAndroid Build Coastguard Worker }
501*3ac0a46fSAndroid Build Coastguard Worker 
Redo()502*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::Redo() {
503*3ac0a46fSAndroid Build Coastguard Worker   return false;
504*3ac0a46fSAndroid Build Coastguard Worker }
505*3ac0a46fSAndroid Build Coastguard Worker 
Copy()506*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_FFWidget::Copy() {
507*3ac0a46fSAndroid Build Coastguard Worker   return absl::nullopt;
508*3ac0a46fSAndroid Build Coastguard Worker }
509*3ac0a46fSAndroid Build Coastguard Worker 
Cut()510*3ac0a46fSAndroid Build Coastguard Worker absl::optional<WideString> CXFA_FFWidget::Cut() {
511*3ac0a46fSAndroid Build Coastguard Worker   return absl::nullopt;
512*3ac0a46fSAndroid Build Coastguard Worker }
513*3ac0a46fSAndroid Build Coastguard Worker 
Paste(const WideString & wsPaste)514*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::Paste(const WideString& wsPaste) {
515*3ac0a46fSAndroid Build Coastguard Worker   return false;
516*3ac0a46fSAndroid Build Coastguard Worker }
517*3ac0a46fSAndroid Build Coastguard Worker 
SelectAll()518*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::SelectAll() {}
519*3ac0a46fSAndroid Build Coastguard Worker 
Delete()520*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::Delete() {}
521*3ac0a46fSAndroid Build Coastguard Worker 
DeSelect()522*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::DeSelect() {}
523*3ac0a46fSAndroid Build Coastguard Worker 
GetText()524*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_FFWidget::GetText() {
525*3ac0a46fSAndroid Build Coastguard Worker   return WideString();
526*3ac0a46fSAndroid Build Coastguard Worker }
527*3ac0a46fSAndroid Build Coastguard Worker 
GetFormFieldType()528*3ac0a46fSAndroid Build Coastguard Worker FormFieldType CXFA_FFWidget::GetFormFieldType() {
529*3ac0a46fSAndroid Build Coastguard Worker   return FormFieldType::kXFA;
530*3ac0a46fSAndroid Build Coastguard Worker }
531*3ac0a46fSAndroid Build Coastguard Worker 
Rotate2Normal(const CFX_PointF & point)532*3ac0a46fSAndroid Build Coastguard Worker CFX_PointF CXFA_FFWidget::Rotate2Normal(const CFX_PointF& point) {
533*3ac0a46fSAndroid Build Coastguard Worker   CFX_Matrix mt = GetRotateMatrix();
534*3ac0a46fSAndroid Build Coastguard Worker   if (mt.IsIdentity())
535*3ac0a46fSAndroid Build Coastguard Worker     return point;
536*3ac0a46fSAndroid Build Coastguard Worker 
537*3ac0a46fSAndroid Build Coastguard Worker   return mt.GetInverse().Transform(point);
538*3ac0a46fSAndroid Build Coastguard Worker }
539*3ac0a46fSAndroid Build Coastguard Worker 
GetRotateMatrix()540*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix CXFA_FFWidget::GetRotateMatrix() {
541*3ac0a46fSAndroid Build Coastguard Worker   int32_t iRotate = m_pNode->GetRotate();
542*3ac0a46fSAndroid Build Coastguard Worker   if (!iRotate)
543*3ac0a46fSAndroid Build Coastguard Worker     return CFX_Matrix();
544*3ac0a46fSAndroid Build Coastguard Worker 
545*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rcWidget = GetRectWithoutRotate();
546*3ac0a46fSAndroid Build Coastguard Worker   CFX_Matrix mt;
547*3ac0a46fSAndroid Build Coastguard Worker   switch (iRotate) {
548*3ac0a46fSAndroid Build Coastguard Worker     case 90:
549*3ac0a46fSAndroid Build Coastguard Worker       mt.a = 0;
550*3ac0a46fSAndroid Build Coastguard Worker       mt.b = -1;
551*3ac0a46fSAndroid Build Coastguard Worker       mt.c = 1;
552*3ac0a46fSAndroid Build Coastguard Worker       mt.d = 0;
553*3ac0a46fSAndroid Build Coastguard Worker       mt.e = rcWidget.left - rcWidget.top;
554*3ac0a46fSAndroid Build Coastguard Worker       mt.f = rcWidget.left + rcWidget.top;
555*3ac0a46fSAndroid Build Coastguard Worker       break;
556*3ac0a46fSAndroid Build Coastguard Worker     case 180:
557*3ac0a46fSAndroid Build Coastguard Worker       mt.a = -1;
558*3ac0a46fSAndroid Build Coastguard Worker       mt.b = 0;
559*3ac0a46fSAndroid Build Coastguard Worker       mt.c = 0;
560*3ac0a46fSAndroid Build Coastguard Worker       mt.d = -1;
561*3ac0a46fSAndroid Build Coastguard Worker       mt.e = rcWidget.left * 2;
562*3ac0a46fSAndroid Build Coastguard Worker       mt.f = rcWidget.top * 2;
563*3ac0a46fSAndroid Build Coastguard Worker       break;
564*3ac0a46fSAndroid Build Coastguard Worker     case 270:
565*3ac0a46fSAndroid Build Coastguard Worker       mt.a = 0;
566*3ac0a46fSAndroid Build Coastguard Worker       mt.b = 1;
567*3ac0a46fSAndroid Build Coastguard Worker       mt.c = -1;
568*3ac0a46fSAndroid Build Coastguard Worker       mt.d = 0;
569*3ac0a46fSAndroid Build Coastguard Worker       mt.e = rcWidget.left + rcWidget.top;
570*3ac0a46fSAndroid Build Coastguard Worker       mt.f = rcWidget.top - rcWidget.left;
571*3ac0a46fSAndroid Build Coastguard Worker       break;
572*3ac0a46fSAndroid Build Coastguard Worker   }
573*3ac0a46fSAndroid Build Coastguard Worker   return mt;
574*3ac0a46fSAndroid Build Coastguard Worker }
575*3ac0a46fSAndroid Build Coastguard Worker 
DisplayCaret(bool bVisible,const CFX_RectF * pRtAnchor)576*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::DisplayCaret(bool bVisible, const CFX_RectF* pRtAnchor) {
577*3ac0a46fSAndroid Build Coastguard Worker   GetDoc()->DisplayCaret(this, bVisible, pRtAnchor);
578*3ac0a46fSAndroid Build Coastguard Worker }
579*3ac0a46fSAndroid Build Coastguard Worker 
GetBorderColorAndThickness(FX_ARGB * cr,float * fWidth)580*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::GetBorderColorAndThickness(FX_ARGB* cr, float* fWidth) {
581*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(GetNode()->IsWidgetReady());
582*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Border* borderUI = GetNode()->GetUIBorder();
583*3ac0a46fSAndroid Build Coastguard Worker   if (!borderUI)
584*3ac0a46fSAndroid Build Coastguard Worker     return;
585*3ac0a46fSAndroid Build Coastguard Worker 
586*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Edge* edge = borderUI->GetEdgeIfExists(0);
587*3ac0a46fSAndroid Build Coastguard Worker   if (!edge)
588*3ac0a46fSAndroid Build Coastguard Worker     return;
589*3ac0a46fSAndroid Build Coastguard Worker 
590*3ac0a46fSAndroid Build Coastguard Worker   *cr = edge->GetColor();
591*3ac0a46fSAndroid Build Coastguard Worker   *fWidth = edge->GetThickness();
592*3ac0a46fSAndroid Build Coastguard Worker }
593*3ac0a46fSAndroid Build Coastguard Worker 
IsLayoutRectEmpty()594*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::IsLayoutRectEmpty() {
595*3ac0a46fSAndroid Build Coastguard Worker   CFX_RectF rtLayout = GetRectWithoutRotate();
596*3ac0a46fSAndroid Build Coastguard Worker   return rtLayout.width < 0.1f && rtLayout.height < 0.1f;
597*3ac0a46fSAndroid Build Coastguard Worker }
598*3ac0a46fSAndroid Build Coastguard Worker 
GetParent()599*3ac0a46fSAndroid Build Coastguard Worker CXFA_LayoutItem* CXFA_FFWidget::GetParent() {
600*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* pParentNode = m_pNode->GetParent();
601*3ac0a46fSAndroid Build Coastguard Worker   if (!pParentNode)
602*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
603*3ac0a46fSAndroid Build Coastguard Worker 
604*3ac0a46fSAndroid Build Coastguard Worker   CXFA_LayoutProcessor* layout = GetDocView()->GetLayoutProcessor();
605*3ac0a46fSAndroid Build Coastguard Worker   return layout->GetLayoutItem(pParentNode);
606*3ac0a46fSAndroid Build Coastguard Worker }
607*3ac0a46fSAndroid Build Coastguard Worker 
IsAncestorOf(CXFA_FFWidget * pWidget)608*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::IsAncestorOf(CXFA_FFWidget* pWidget) {
609*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
610*3ac0a46fSAndroid Build Coastguard Worker     return false;
611*3ac0a46fSAndroid Build Coastguard Worker 
612*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* pChildNode = pWidget->GetNode();
613*3ac0a46fSAndroid Build Coastguard Worker   while (pChildNode) {
614*3ac0a46fSAndroid Build Coastguard Worker     if (pChildNode == m_pNode)
615*3ac0a46fSAndroid Build Coastguard Worker       return true;
616*3ac0a46fSAndroid Build Coastguard Worker 
617*3ac0a46fSAndroid Build Coastguard Worker     pChildNode = pChildNode->GetParent();
618*3ac0a46fSAndroid Build Coastguard Worker   }
619*3ac0a46fSAndroid Build Coastguard Worker   return false;
620*3ac0a46fSAndroid Build Coastguard Worker }
621*3ac0a46fSAndroid Build Coastguard Worker 
PtInActiveRect(const CFX_PointF & point)622*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::PtInActiveRect(const CFX_PointF& point) {
623*3ac0a46fSAndroid Build Coastguard Worker   return GetWidgetRect().Contains(point);
624*3ac0a46fSAndroid Build Coastguard Worker }
625*3ac0a46fSAndroid Build Coastguard Worker 
GetDoc()626*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc* CXFA_FFWidget::GetDoc() {
627*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocView->GetDoc();
628*3ac0a46fSAndroid Build Coastguard Worker }
629*3ac0a46fSAndroid Build Coastguard Worker 
GetApp()630*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp* CXFA_FFWidget::GetApp() {
631*3ac0a46fSAndroid Build Coastguard Worker   return GetDoc()->GetApp();
632*3ac0a46fSAndroid Build Coastguard Worker }
633*3ac0a46fSAndroid Build Coastguard Worker 
GetAppProvider()634*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFApp::CallbackIface* CXFA_FFWidget::GetAppProvider() {
635*3ac0a46fSAndroid Build Coastguard Worker   return GetApp()->GetAppProvider();
636*3ac0a46fSAndroid Build Coastguard Worker }
637*3ac0a46fSAndroid Build Coastguard Worker 
HasVisibleStatus() const638*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::HasVisibleStatus() const {
639*3ac0a46fSAndroid Build Coastguard Worker   return GetLayoutItem()->TestStatusBits(XFA_WidgetStatus::kVisible);
640*3ac0a46fSAndroid Build Coastguard Worker }
641*3ac0a46fSAndroid Build Coastguard Worker 
EventKillFocus()642*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::EventKillFocus() {
643*3ac0a46fSAndroid Build Coastguard Worker   CXFA_ContentLayoutItem* pItem = GetLayoutItem();
644*3ac0a46fSAndroid Build Coastguard Worker   if (pItem->TestStatusBits(XFA_WidgetStatus::kAccess)) {
645*3ac0a46fSAndroid Build Coastguard Worker     pItem->ClearStatusBits(XFA_WidgetStatus::kAccess);
646*3ac0a46fSAndroid Build Coastguard Worker     return;
647*3ac0a46fSAndroid Build Coastguard Worker   }
648*3ac0a46fSAndroid Build Coastguard Worker   CXFA_EventParam eParam;
649*3ac0a46fSAndroid Build Coastguard Worker   eParam.m_eType = XFA_EVENT_Exit;
650*3ac0a46fSAndroid Build Coastguard Worker   m_pNode->ProcessEvent(GetDocView(), XFA_AttributeValue::Exit, &eParam);
651*3ac0a46fSAndroid Build Coastguard Worker }
652*3ac0a46fSAndroid Build Coastguard Worker 
IsButtonDown()653*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFWidget::IsButtonDown() {
654*3ac0a46fSAndroid Build Coastguard Worker   return GetLayoutItem()->TestStatusBits(XFA_WidgetStatus::kButtonDown);
655*3ac0a46fSAndroid Build Coastguard Worker }
656*3ac0a46fSAndroid Build Coastguard Worker 
SetButtonDown(bool bSet)657*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFWidget::SetButtonDown(bool bSet) {
658*3ac0a46fSAndroid Build Coastguard Worker   CXFA_ContentLayoutItem* pItem = GetLayoutItem();
659*3ac0a46fSAndroid Build Coastguard Worker   if (bSet)
660*3ac0a46fSAndroid Build Coastguard Worker     pItem->SetStatusBits(XFA_WidgetStatus::kButtonDown);
661*3ac0a46fSAndroid Build Coastguard Worker   else
662*3ac0a46fSAndroid Build Coastguard Worker     pItem->ClearStatusBits(XFA_WidgetStatus::kButtonDown);
663*3ac0a46fSAndroid Build Coastguard Worker }
664