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_ffimageedit.h"
8*3ac0a46fSAndroid Build Coastguard Worker
9*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
10*3ac0a46fSAndroid Build Coastguard Worker
11*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/visitor.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_app.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_messagemouse.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_picturebox.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdoc.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fffield.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffpageview.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_border.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_image.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_para.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_value.h"
27*3ac0a46fSAndroid Build Coastguard Worker
CXFA_FFImageEdit(CXFA_Node * pNode)28*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFImageEdit::CXFA_FFImageEdit(CXFA_Node* pNode) : CXFA_FFField(pNode) {}
29*3ac0a46fSAndroid Build Coastguard Worker
30*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFImageEdit::~CXFA_FFImageEdit() = default;
31*3ac0a46fSAndroid Build Coastguard Worker
PreFinalize()32*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::PreFinalize() {
33*3ac0a46fSAndroid Build Coastguard Worker m_pNode->SetEditImage(nullptr);
34*3ac0a46fSAndroid Build Coastguard Worker }
35*3ac0a46fSAndroid Build Coastguard Worker
Trace(cppgc::Visitor * visitor) const36*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::Trace(cppgc::Visitor* visitor) const {
37*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFField::Trace(visitor);
38*3ac0a46fSAndroid Build Coastguard Worker visitor->Trace(m_pOldDelegate);
39*3ac0a46fSAndroid Build Coastguard Worker }
40*3ac0a46fSAndroid Build Coastguard Worker
LoadWidget()41*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::LoadWidget() {
42*3ac0a46fSAndroid Build Coastguard Worker DCHECK(!IsLoaded());
43*3ac0a46fSAndroid Build Coastguard Worker
44*3ac0a46fSAndroid Build Coastguard Worker CFWL_PictureBox* pPictureBox = cppgc::MakeGarbageCollected<CFWL_PictureBox>(
45*3ac0a46fSAndroid Build Coastguard Worker GetFWLApp()->GetHeap()->GetAllocationHandle(), GetFWLApp());
46*3ac0a46fSAndroid Build Coastguard Worker SetNormalWidget(pPictureBox);
47*3ac0a46fSAndroid Build Coastguard Worker pPictureBox->SetAdapterIface(this);
48*3ac0a46fSAndroid Build Coastguard Worker
49*3ac0a46fSAndroid Build Coastguard Worker CFWL_NoteDriver* pNoteDriver = pPictureBox->GetFWLApp()->GetNoteDriver();
50*3ac0a46fSAndroid Build Coastguard Worker pNoteDriver->RegisterEventTarget(pPictureBox, pPictureBox);
51*3ac0a46fSAndroid Build Coastguard Worker m_pOldDelegate = pPictureBox->GetDelegate();
52*3ac0a46fSAndroid Build Coastguard Worker pPictureBox->SetDelegate(this);
53*3ac0a46fSAndroid Build Coastguard Worker
54*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFField::LoadWidget();
55*3ac0a46fSAndroid Build Coastguard Worker if (!m_pNode->GetEditImage())
56*3ac0a46fSAndroid Build Coastguard Worker UpdateFWLData();
57*3ac0a46fSAndroid Build Coastguard Worker
58*3ac0a46fSAndroid Build Coastguard Worker return true;
59*3ac0a46fSAndroid Build Coastguard Worker }
60*3ac0a46fSAndroid Build Coastguard Worker
RenderWidget(CFGAS_GEGraphics * pGS,const CFX_Matrix & matrix,HighlightOption highlight)61*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::RenderWidget(CFGAS_GEGraphics* pGS,
62*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& matrix,
63*3ac0a46fSAndroid Build Coastguard Worker HighlightOption highlight) {
64*3ac0a46fSAndroid Build Coastguard Worker if (!HasVisibleStatus())
65*3ac0a46fSAndroid Build Coastguard Worker return;
66*3ac0a46fSAndroid Build Coastguard Worker
67*3ac0a46fSAndroid Build Coastguard Worker CFX_Matrix mtRotate = GetRotateMatrix();
68*3ac0a46fSAndroid Build Coastguard Worker mtRotate.Concat(matrix);
69*3ac0a46fSAndroid Build Coastguard Worker
70*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFWidget::RenderWidget(pGS, mtRotate, highlight);
71*3ac0a46fSAndroid Build Coastguard Worker DrawBorder(pGS, m_pNode->GetUIBorder(), m_UIRect, mtRotate);
72*3ac0a46fSAndroid Build Coastguard Worker RenderCaption(pGS, mtRotate);
73*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> pDIBitmap = m_pNode->GetEditImage();
74*3ac0a46fSAndroid Build Coastguard Worker if (!pDIBitmap)
75*3ac0a46fSAndroid Build Coastguard Worker return;
76*3ac0a46fSAndroid Build Coastguard Worker
77*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtImage = GetNormalWidget()->GetWidgetRect();
78*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iHorzAlign = XFA_AttributeValue::Left;
79*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iVertAlign = XFA_AttributeValue::Top;
80*3ac0a46fSAndroid Build Coastguard Worker CXFA_Para* para = m_pNode->GetParaIfExists();
81*3ac0a46fSAndroid Build Coastguard Worker if (para) {
82*3ac0a46fSAndroid Build Coastguard Worker iHorzAlign = para->GetHorizontalAlign();
83*3ac0a46fSAndroid Build Coastguard Worker iVertAlign = para->GetVerticalAlign();
84*3ac0a46fSAndroid Build Coastguard Worker }
85*3ac0a46fSAndroid Build Coastguard Worker
86*3ac0a46fSAndroid Build Coastguard Worker XFA_AttributeValue iAspect = XFA_AttributeValue::Fit;
87*3ac0a46fSAndroid Build Coastguard Worker CXFA_Value* value = m_pNode->GetFormValueIfExists();
88*3ac0a46fSAndroid Build Coastguard Worker if (value) {
89*3ac0a46fSAndroid Build Coastguard Worker CXFA_Image* image = value->GetImageIfExists();
90*3ac0a46fSAndroid Build Coastguard Worker if (image)
91*3ac0a46fSAndroid Build Coastguard Worker iAspect = image->GetAspect();
92*3ac0a46fSAndroid Build Coastguard Worker }
93*3ac0a46fSAndroid Build Coastguard Worker
94*3ac0a46fSAndroid Build Coastguard Worker XFA_DrawImage(pGS, rtImage, mtRotate, std::move(pDIBitmap), iAspect,
95*3ac0a46fSAndroid Build Coastguard Worker m_pNode->GetEditImageDpi(), iHorzAlign, iVertAlign);
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker
AcceptsFocusOnButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point,CFWL_MessageMouse::MouseCommand command)98*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::AcceptsFocusOnButtonDown(
99*3ac0a46fSAndroid Build Coastguard Worker Mask<XFA_FWL_KeyFlag> dwFlags,
100*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point,
101*3ac0a46fSAndroid Build Coastguard Worker CFWL_MessageMouse::MouseCommand command) {
102*3ac0a46fSAndroid Build Coastguard Worker if (command != CFWL_MessageMouse::MouseCommand::kLeftButtonDown)
103*3ac0a46fSAndroid Build Coastguard Worker return CXFA_FFField::AcceptsFocusOnButtonDown(dwFlags, point, command);
104*3ac0a46fSAndroid Build Coastguard Worker
105*3ac0a46fSAndroid Build Coastguard Worker if (!m_pNode->IsOpenAccess())
106*3ac0a46fSAndroid Build Coastguard Worker return false;
107*3ac0a46fSAndroid Build Coastguard Worker if (!PtInActiveRect(point))
108*3ac0a46fSAndroid Build Coastguard Worker return false;
109*3ac0a46fSAndroid Build Coastguard Worker
110*3ac0a46fSAndroid Build Coastguard Worker return true;
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker
OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,const CFX_PointF & point)113*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::OnLButtonDown(Mask<XFA_FWL_KeyFlag> dwFlags,
114*3ac0a46fSAndroid Build Coastguard Worker const CFX_PointF& point) {
115*3ac0a46fSAndroid Build Coastguard Worker SetButtonDown(true);
116*3ac0a46fSAndroid Build Coastguard Worker CFWL_MessageMouse msg(GetNormalWidget(),
117*3ac0a46fSAndroid Build Coastguard Worker CFWL_MessageMouse::MouseCommand::kLeftButtonDown,
118*3ac0a46fSAndroid Build Coastguard Worker dwFlags, FWLToClient(point));
119*3ac0a46fSAndroid Build Coastguard Worker SendMessageToFWLWidget(&msg);
120*3ac0a46fSAndroid Build Coastguard Worker return true;
121*3ac0a46fSAndroid Build Coastguard Worker }
122*3ac0a46fSAndroid Build Coastguard Worker
SetFWLRect()123*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::SetFWLRect() {
124*3ac0a46fSAndroid Build Coastguard Worker if (!GetNormalWidget())
125*3ac0a46fSAndroid Build Coastguard Worker return;
126*3ac0a46fSAndroid Build Coastguard Worker
127*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtUIMargin = m_pNode->GetUIMargin();
128*3ac0a46fSAndroid Build Coastguard Worker CFX_RectF rtImage(m_UIRect);
129*3ac0a46fSAndroid Build Coastguard Worker rtImage.Deflate(rtUIMargin.left, rtUIMargin.top, rtUIMargin.width,
130*3ac0a46fSAndroid Build Coastguard Worker rtUIMargin.height);
131*3ac0a46fSAndroid Build Coastguard Worker GetNormalWidget()->SetWidgetRect(rtImage);
132*3ac0a46fSAndroid Build Coastguard Worker }
133*3ac0a46fSAndroid Build Coastguard Worker
CommitData()134*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::CommitData() {
135*3ac0a46fSAndroid Build Coastguard Worker return true;
136*3ac0a46fSAndroid Build Coastguard Worker }
137*3ac0a46fSAndroid Build Coastguard Worker
UpdateFWLData()138*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFImageEdit::UpdateFWLData() {
139*3ac0a46fSAndroid Build Coastguard Worker m_pNode->SetEditImage(nullptr);
140*3ac0a46fSAndroid Build Coastguard Worker m_pNode->LoadEditImage(GetDoc());
141*3ac0a46fSAndroid Build Coastguard Worker return true;
142*3ac0a46fSAndroid Build Coastguard Worker }
143*3ac0a46fSAndroid Build Coastguard Worker
OnProcessMessage(CFWL_Message * pMessage)144*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnProcessMessage(CFWL_Message* pMessage) {
145*3ac0a46fSAndroid Build Coastguard Worker m_pOldDelegate->OnProcessMessage(pMessage);
146*3ac0a46fSAndroid Build Coastguard Worker }
147*3ac0a46fSAndroid Build Coastguard Worker
OnProcessEvent(CFWL_Event * pEvent)148*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnProcessEvent(CFWL_Event* pEvent) {
149*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFField::OnProcessEvent(pEvent);
150*3ac0a46fSAndroid Build Coastguard Worker m_pOldDelegate->OnProcessEvent(pEvent);
151*3ac0a46fSAndroid Build Coastguard Worker }
152*3ac0a46fSAndroid Build Coastguard Worker
OnDrawWidget(CFGAS_GEGraphics * pGraphics,const CFX_Matrix & matrix)153*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFImageEdit::OnDrawWidget(CFGAS_GEGraphics* pGraphics,
154*3ac0a46fSAndroid Build Coastguard Worker const CFX_Matrix& matrix) {
155*3ac0a46fSAndroid Build Coastguard Worker m_pOldDelegate->OnDrawWidget(pGraphics, matrix);
156*3ac0a46fSAndroid Build Coastguard Worker }
157*3ac0a46fSAndroid Build Coastguard Worker
GetFormFieldType()158*3ac0a46fSAndroid Build Coastguard Worker FormFieldType CXFA_FFImageEdit::GetFormFieldType() {
159*3ac0a46fSAndroid Build Coastguard Worker return FormFieldType::kXFA_ImageField;
160*3ac0a46fSAndroid Build Coastguard Worker }
161