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