blob: e9c99721b73881c5ee40d3d0cefca8c3fee887bd [file] [log] [blame]
jaepark98e10192016-08-15 10:51:11 -07001// Copyright 2016 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dsinclair114e46a2016-09-29 17:18:21 -07007#include "fpdfsdk/cpdfsdk_xfawidgethandler.h"
jaepark98e10192016-08-15 10:51:11 -07008
dsinclair1727aee2016-09-29 13:12:56 -07009#include "core/fpdfdoc/cpdf_interform.h"
dsinclair114e46a2016-09-29 17:18:21 -070010#include "fpdfsdk/cpdfsdk_annot.h"
dsinclair735606d2016-10-05 15:47:02 -070011#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070012#include "fpdfsdk/cpdfsdk_interform.h"
13#include "fpdfsdk/cpdfsdk_pageview.h"
14#include "fpdfsdk/cpdfsdk_xfawidget.h"
dsinclair521b7502016-11-02 13:02:28 -070015#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
dsinclair447b1f32016-12-08 10:06:32 -080016#include "xfa/fwl/cfwl_app.h"
17#include "xfa/fwl/fwl_widgethit.h"
Dan Sinclair80c48782017-03-23 12:11:20 -040018#include "xfa/fxfa/cxfa_ffdocview.h"
19#include "xfa/fxfa/cxfa_ffpageview.h"
20#include "xfa/fxfa/cxfa_ffwidget.h"
21#include "xfa/fxfa/cxfa_ffwidgethandler.h"
dsinclair5b493092016-09-29 20:20:24 -070022#include "xfa/fxfa/fxfa_basic.h"
Dan Sinclair2b918c82017-07-13 14:47:10 -040023#include "xfa/fxgraphics/cxfa_graphics.h"
jaepark98e10192016-08-15 10:51:11 -070024
dsinclair735606d2016-10-05 15:47:02 -070025CPDFSDK_XFAWidgetHandler::CPDFSDK_XFAWidgetHandler(
dsinclair8779fa82016-10-12 12:05:44 -070026 CPDFSDK_FormFillEnvironment* pFormFillEnv)
27 : m_pFormFillEnv(pFormFillEnv) {}
jaepark98e10192016-08-15 10:51:11 -070028
jaepark8c541822016-08-30 13:43:05 -070029CPDFSDK_XFAWidgetHandler::~CPDFSDK_XFAWidgetHandler() {}
jaepark98e10192016-08-15 10:51:11 -070030
tsepez4cf55152016-11-02 14:37:54 -070031bool CPDFSDK_XFAWidgetHandler::CanAnswer(CPDFSDK_Annot* pAnnot) {
jaepark98e10192016-08-15 10:51:11 -070032 return !!pAnnot->GetXFAWidget();
33}
34
jaepark8c541822016-08-30 13:43:05 -070035CPDFSDK_Annot* CPDFSDK_XFAWidgetHandler::NewAnnot(CPDF_Annot* pAnnot,
36 CPDFSDK_PageView* pPage) {
jaepark98e10192016-08-15 10:51:11 -070037 return nullptr;
38}
39
jaepark8c541822016-08-30 13:43:05 -070040CPDFSDK_Annot* CPDFSDK_XFAWidgetHandler::NewAnnot(CXFA_FFWidget* pAnnot,
41 CPDFSDK_PageView* pPage) {
dsinclair8779fa82016-10-12 12:05:44 -070042 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
jaepark98e10192016-08-15 10:51:11 -070043 CPDFSDK_XFAWidget* pWidget = new CPDFSDK_XFAWidget(pAnnot, pPage, pInterForm);
44 pInterForm->AddXFAMap(pAnnot, pWidget);
45 return pWidget;
46}
47
jaepark8c541822016-08-30 13:43:05 -070048void CPDFSDK_XFAWidgetHandler::OnDraw(CPDFSDK_PageView* pPageView,
49 CPDFSDK_Annot* pAnnot,
50 CFX_RenderDevice* pDevice,
jaepark75f84a52016-09-09 15:39:09 -070051 CFX_Matrix* pUser2Device,
52 bool bDrawAnnots) {
jaepark98e10192016-08-15 10:51:11 -070053 ASSERT(pPageView);
54 ASSERT(pAnnot);
55
Dan Sinclair2b918c82017-07-13 14:47:10 -040056 CXFA_Graphics gs(pDevice);
jaepark98e10192016-08-15 10:51:11 -070057
Dan Sinclairbba2a7c2017-02-07 16:36:39 -050058 CFX_Matrix mt = *pUser2Device;
tsepez4cf55152016-11-02 14:37:54 -070059 bool bIsHighlight = false;
dsinclair7cbe68e2016-10-12 11:56:23 -070060 if (pPageView->GetFormFillEnv()->GetFocusAnnot() != pAnnot)
tsepez4cf55152016-11-02 14:37:54 -070061 bIsHighlight = true;
jaepark98e10192016-08-15 10:51:11 -070062
Lei Zhang7c9d4c22017-08-17 13:53:52 -070063 GetXFAWidgetHandler(pAnnot)->RenderWidget(pAnnot->GetXFAWidget(), &gs, mt,
dsinclairb402b172016-10-11 09:26:32 -070064 bIsHighlight);
jaepark98e10192016-08-15 10:51:11 -070065
66 // to do highlight and shadow
67}
68
jaepark8c541822016-08-30 13:43:05 -070069void CPDFSDK_XFAWidgetHandler::OnLoad(CPDFSDK_Annot* pAnnot) {}
jaepark98e10192016-08-15 10:51:11 -070070
jaepark8c541822016-08-30 13:43:05 -070071void CPDFSDK_XFAWidgetHandler::ReleaseAnnot(CPDFSDK_Annot* pAnnot) {
jaepark98e10192016-08-15 10:51:11 -070072 CPDFSDK_XFAWidget* pWidget = reinterpret_cast<CPDFSDK_XFAWidget*>(pAnnot);
73 CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
74 pInterForm->RemoveXFAMap(pWidget->GetXFAWidget());
75
76 delete pWidget;
77}
78
jaepark8c541822016-08-30 13:43:05 -070079CFX_FloatRect CPDFSDK_XFAWidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
80 CPDFSDK_Annot* pAnnot) {
jaepark98e10192016-08-15 10:51:11 -070081 ASSERT(pAnnot);
82
83 CFX_RectF rcBBox;
84 XFA_Element eType = pAnnot->GetXFAWidget()->GetDataAcc()->GetUIType();
85 if (eType == XFA_Element::Signature)
Dan Sinclair1b08df12017-02-09 09:17:20 -050086 rcBBox = pAnnot->GetXFAWidget()->GetBBox(XFA_WidgetStatus_Visible, true);
jaepark98e10192016-08-15 10:51:11 -070087 else
Dan Sinclair1b08df12017-02-09 09:17:20 -050088 rcBBox = pAnnot->GetXFAWidget()->GetBBox(XFA_WidgetStatus_None);
jaepark98e10192016-08-15 10:51:11 -070089
90 CFX_FloatRect rcWidget(rcBBox.left, rcBBox.top, rcBBox.left + rcBBox.width,
91 rcBBox.top + rcBBox.height);
92 rcWidget.left -= 1.0f;
93 rcWidget.right += 1.0f;
94 rcWidget.bottom -= 1.0f;
95 rcWidget.top += 1.0f;
96
97 return rcWidget;
98}
99
Diana Gageab390972017-07-28 17:07:39 -0700100// TODO(bug 840): Implement so selected text can be obtained from XFA
Diana Gage1c7f1422017-07-24 11:19:52 -0700101// fields.
Diana Gagedce2d722017-06-20 11:17:11 -0700102CFX_WideString CPDFSDK_XFAWidgetHandler::GetSelectedText(
103 CPDFSDK_Annot* pAnnot) {
104 return CFX_WideString();
105}
106
Diana Gageab390972017-07-28 17:07:39 -0700107// TODO(bug 840): Implement so text can be inserted into and deleted from XFA
Diana Gage1c7f1422017-07-24 11:19:52 -0700108// fields.
Diana Gageab390972017-07-28 17:07:39 -0700109void CPDFSDK_XFAWidgetHandler::ReplaceSelection(CPDFSDK_Annot* pAnnot,
110 const CFX_WideString& text) {}
Diana Gage1c7f1422017-07-24 11:19:52 -0700111
tsepez4cf55152016-11-02 14:37:54 -0700112bool CPDFSDK_XFAWidgetHandler::HitTest(CPDFSDK_PageView* pPageView,
113 CPDFSDK_Annot* pAnnot,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500114 const CFX_PointF& point) {
jaepark98e10192016-08-15 10:51:11 -0700115 if (!pPageView || !pAnnot)
tsepez4cf55152016-11-02 14:37:54 -0700116 return false;
jaepark98e10192016-08-15 10:51:11 -0700117
dsinclairb402b172016-10-11 09:26:32 -0700118 CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
dsinclair7cbe68e2016-10-12 11:56:23 -0700119 if (!pFormFillEnv)
tsepez4cf55152016-11-02 14:37:54 -0700120 return false;
jaepark98e10192016-08-15 10:51:11 -0700121
dsinclair521b7502016-11-02 13:02:28 -0700122 CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext();
123 if (!pContext)
tsepez4cf55152016-11-02 14:37:54 -0700124 return false;
jaepark98e10192016-08-15 10:51:11 -0700125
dsinclair521b7502016-11-02 13:02:28 -0700126 CXFA_FFDocView* pDocView = pContext->GetXFADocView();
jaepark98e10192016-08-15 10:51:11 -0700127 if (!pDocView)
tsepez4cf55152016-11-02 14:37:54 -0700128 return false;
jaepark98e10192016-08-15 10:51:11 -0700129
130 CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
131 if (!pWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700132 return false;
jaepark98e10192016-08-15 10:51:11 -0700133
134 FWL_WidgetHit dwHitTest =
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500135 pWidgetHandler->OnHitTest(pAnnot->GetXFAWidget(), point);
jaepark98e10192016-08-15 10:51:11 -0700136 return dwHitTest != FWL_WidgetHit::Unknown;
137}
138
jaepark8c541822016-08-30 13:43:05 -0700139void CPDFSDK_XFAWidgetHandler::OnMouseEnter(CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700140 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark8c541822016-08-30 13:43:05 -0700141 uint32_t nFlag) {
tsepezf8074ce2016-09-27 14:29:57 -0700142 if (!pPageView || !(*pAnnot))
jaepark98e10192016-08-15 10:51:11 -0700143 return;
tsepezf8074ce2016-09-27 14:29:57 -0700144 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
145 pWidgetHandler->OnMouseEnter((*pAnnot)->GetXFAWidget());
jaepark98e10192016-08-15 10:51:11 -0700146}
147
jaepark8c541822016-08-30 13:43:05 -0700148void CPDFSDK_XFAWidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
tsepezf8074ce2016-09-27 14:29:57 -0700149 CPDFSDK_Annot::ObservedPtr* pAnnot,
jaepark8c541822016-08-30 13:43:05 -0700150 uint32_t nFlag) {
tsepezf8074ce2016-09-27 14:29:57 -0700151 if (!pPageView || !(*pAnnot))
jaepark98e10192016-08-15 10:51:11 -0700152 return;
153
tsepezf8074ce2016-09-27 14:29:57 -0700154 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
155 pWidgetHandler->OnMouseExit((*pAnnot)->GetXFAWidget());
jaepark98e10192016-08-15 10:51:11 -0700156}
157
tsepez4cf55152016-11-02 14:37:54 -0700158bool CPDFSDK_XFAWidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
159 CPDFSDK_Annot::ObservedPtr* pAnnot,
160 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500161 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700162 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700163 return false;
jaepark98e10192016-08-15 10:51:11 -0700164
tsepezf8074ce2016-09-27 14:29:57 -0700165 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
166 return pWidgetHandler->OnLButtonDown((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500167 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700168}
169
tsepez4cf55152016-11-02 14:37:54 -0700170bool CPDFSDK_XFAWidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
171 CPDFSDK_Annot::ObservedPtr* pAnnot,
172 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500173 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700174 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700175 return false;
jaepark98e10192016-08-15 10:51:11 -0700176
tsepezf8074ce2016-09-27 14:29:57 -0700177 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
178 return pWidgetHandler->OnLButtonUp((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500179 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700180}
181
tsepez4cf55152016-11-02 14:37:54 -0700182bool CPDFSDK_XFAWidgetHandler::OnLButtonDblClk(
tsepezf8074ce2016-09-27 14:29:57 -0700183 CPDFSDK_PageView* pPageView,
184 CPDFSDK_Annot::ObservedPtr* pAnnot,
185 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500186 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700187 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700188 return false;
jaepark98e10192016-08-15 10:51:11 -0700189
tsepezf8074ce2016-09-27 14:29:57 -0700190 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
191 return pWidgetHandler->OnLButtonDblClk((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500192 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700193}
194
tsepez4cf55152016-11-02 14:37:54 -0700195bool CPDFSDK_XFAWidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
196 CPDFSDK_Annot::ObservedPtr* pAnnot,
197 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500198 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700199 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700200 return false;
jaepark98e10192016-08-15 10:51:11 -0700201
tsepezf8074ce2016-09-27 14:29:57 -0700202 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
203 return pWidgetHandler->OnMouseMove((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500204 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700205}
206
tsepez4cf55152016-11-02 14:37:54 -0700207bool CPDFSDK_XFAWidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
208 CPDFSDK_Annot::ObservedPtr* pAnnot,
209 uint32_t nFlags,
210 short zDelta,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500211 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700212 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700213 return false;
jaepark98e10192016-08-15 10:51:11 -0700214
tsepezf8074ce2016-09-27 14:29:57 -0700215 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500216 return pWidgetHandler->OnMouseWheel((*pAnnot)->GetXFAWidget(),
217 GetFWLFlags(nFlags), zDelta, point);
jaepark98e10192016-08-15 10:51:11 -0700218}
219
tsepez4cf55152016-11-02 14:37:54 -0700220bool CPDFSDK_XFAWidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
221 CPDFSDK_Annot::ObservedPtr* pAnnot,
222 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500223 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700224 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700225 return false;
jaepark98e10192016-08-15 10:51:11 -0700226
tsepezf8074ce2016-09-27 14:29:57 -0700227 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
228 return pWidgetHandler->OnRButtonDown((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500229 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700230}
231
tsepez4cf55152016-11-02 14:37:54 -0700232bool CPDFSDK_XFAWidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
233 CPDFSDK_Annot::ObservedPtr* pAnnot,
234 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500235 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700236 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700237 return false;
jaepark98e10192016-08-15 10:51:11 -0700238
tsepezf8074ce2016-09-27 14:29:57 -0700239 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
240 return pWidgetHandler->OnRButtonUp((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500241 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700242}
243
tsepez4cf55152016-11-02 14:37:54 -0700244bool CPDFSDK_XFAWidgetHandler::OnRButtonDblClk(
tsepezf8074ce2016-09-27 14:29:57 -0700245 CPDFSDK_PageView* pPageView,
246 CPDFSDK_Annot::ObservedPtr* pAnnot,
247 uint32_t nFlags,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500248 const CFX_PointF& point) {
tsepezf8074ce2016-09-27 14:29:57 -0700249 if (!pPageView || !(*pAnnot))
tsepez4cf55152016-11-02 14:37:54 -0700250 return false;
jaepark98e10192016-08-15 10:51:11 -0700251
tsepezf8074ce2016-09-27 14:29:57 -0700252 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot->Get());
253 return pWidgetHandler->OnRButtonDblClk((*pAnnot)->GetXFAWidget(),
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500254 GetFWLFlags(nFlags), point);
jaepark98e10192016-08-15 10:51:11 -0700255}
256
tsepez4cf55152016-11-02 14:37:54 -0700257bool CPDFSDK_XFAWidgetHandler::OnChar(CPDFSDK_Annot* pAnnot,
258 uint32_t nChar,
259 uint32_t nFlags) {
jaepark98e10192016-08-15 10:51:11 -0700260 if (!pAnnot)
tsepez4cf55152016-11-02 14:37:54 -0700261 return false;
jaepark98e10192016-08-15 10:51:11 -0700262
263 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
264 return pWidgetHandler->OnChar(pAnnot->GetXFAWidget(), nChar,
265 GetFWLFlags(nFlags));
266}
267
tsepez4cf55152016-11-02 14:37:54 -0700268bool CPDFSDK_XFAWidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
269 int nKeyCode,
270 int nFlag) {
jaepark98e10192016-08-15 10:51:11 -0700271 if (!pAnnot)
tsepez4cf55152016-11-02 14:37:54 -0700272 return false;
jaepark98e10192016-08-15 10:51:11 -0700273
274 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
275 return pWidgetHandler->OnKeyDown(pAnnot->GetXFAWidget(), nKeyCode,
276 GetFWLFlags(nFlag));
277}
278
tsepez4cf55152016-11-02 14:37:54 -0700279bool CPDFSDK_XFAWidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
280 int nKeyCode,
281 int nFlag) {
jaepark98e10192016-08-15 10:51:11 -0700282 if (!pAnnot)
tsepez4cf55152016-11-02 14:37:54 -0700283 return false;
jaepark98e10192016-08-15 10:51:11 -0700284
285 CXFA_FFWidgetHandler* pWidgetHandler = GetXFAWidgetHandler(pAnnot);
286 return pWidgetHandler->OnKeyUp(pAnnot->GetXFAWidget(), nKeyCode,
287 GetFWLFlags(nFlag));
288}
289
tsepez4cf55152016-11-02 14:37:54 -0700290bool CPDFSDK_XFAWidgetHandler::OnSetFocus(CPDFSDK_Annot::ObservedPtr* pAnnot,
291 uint32_t nFlag) {
292 return true;
jaepark98e10192016-08-15 10:51:11 -0700293}
294
tsepez4cf55152016-11-02 14:37:54 -0700295bool CPDFSDK_XFAWidgetHandler::OnKillFocus(CPDFSDK_Annot::ObservedPtr* pAnnot,
296 uint32_t nFlag) {
297 return true;
jaepark8c541822016-08-30 13:43:05 -0700298}
299
tsepez4cf55152016-11-02 14:37:54 -0700300bool CPDFSDK_XFAWidgetHandler::OnXFAChangedFocus(
tsepezf8074ce2016-09-27 14:29:57 -0700301 CPDFSDK_Annot::ObservedPtr* pOldAnnot,
302 CPDFSDK_Annot::ObservedPtr* pNewAnnot) {
jaepark98e10192016-08-15 10:51:11 -0700303 CXFA_FFWidgetHandler* pWidgetHandler = nullptr;
tsepezf8074ce2016-09-27 14:29:57 -0700304 if (*pOldAnnot)
305 pWidgetHandler = GetXFAWidgetHandler(pOldAnnot->Get());
306 else if (*pNewAnnot)
307 pWidgetHandler = GetXFAWidgetHandler(pNewAnnot->Get());
jaepark98e10192016-08-15 10:51:11 -0700308
tsepezf8074ce2016-09-27 14:29:57 -0700309 if (!pWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700310 return true;
jaepark98e10192016-08-15 10:51:11 -0700311
tsepezf8074ce2016-09-27 14:29:57 -0700312 CXFA_FFWidget* hWidget = *pNewAnnot ? (*pNewAnnot)->GetXFAWidget() : nullptr;
313 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700314 return true;
jaepark98e10192016-08-15 10:51:11 -0700315
tsepezf8074ce2016-09-27 14:29:57 -0700316 CXFA_FFPageView* pXFAPageView = hWidget->GetPageView();
317 if (!pXFAPageView)
tsepez4cf55152016-11-02 14:37:54 -0700318 return true;
tsepezf8074ce2016-09-27 14:29:57 -0700319
tsepez4cf55152016-11-02 14:37:54 -0700320 bool bRet = pXFAPageView->GetDocView()->SetFocus(hWidget);
tsepezf8074ce2016-09-27 14:29:57 -0700321 if (pXFAPageView->GetDocView()->GetFocusWidget() == hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700322 bRet = true;
tsepezf8074ce2016-09-27 14:29:57 -0700323
324 return bRet;
jaepark98e10192016-08-15 10:51:11 -0700325}
326
jaepark8c541822016-08-30 13:43:05 -0700327CXFA_FFWidgetHandler* CPDFSDK_XFAWidgetHandler::GetXFAWidgetHandler(
jaepark98e10192016-08-15 10:51:11 -0700328 CPDFSDK_Annot* pAnnot) {
329 if (!pAnnot)
330 return nullptr;
331
332 CPDFSDK_PageView* pPageView = pAnnot->GetPageView();
333 if (!pPageView)
334 return nullptr;
335
dsinclairb402b172016-10-11 09:26:32 -0700336 CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
dsinclair7cbe68e2016-10-12 11:56:23 -0700337 if (!pFormFillEnv)
jaepark98e10192016-08-15 10:51:11 -0700338 return nullptr;
339
dsinclair521b7502016-11-02 13:02:28 -0700340 CPDFXFA_Context* pDoc = pFormFillEnv->GetXFAContext();
jaepark98e10192016-08-15 10:51:11 -0700341 if (!pDoc)
342 return nullptr;
343
344 CXFA_FFDocView* pDocView = pDoc->GetXFADocView();
345 if (!pDocView)
346 return nullptr;
347
348 return pDocView->GetWidgetHandler();
349}
350
jaepark8c541822016-08-30 13:43:05 -0700351uint32_t CPDFSDK_XFAWidgetHandler::GetFWLFlags(uint32_t dwFlag) {
jaepark98e10192016-08-15 10:51:11 -0700352 uint32_t dwFWLFlag = 0;
353
354 if (dwFlag & FWL_EVENTFLAG_ControlKey)
355 dwFWLFlag |= FWL_KEYFLAG_Ctrl;
356 if (dwFlag & FWL_EVENTFLAG_LeftButtonDown)
357 dwFWLFlag |= FWL_KEYFLAG_LButton;
358 if (dwFlag & FWL_EVENTFLAG_MiddleButtonDown)
359 dwFWLFlag |= FWL_KEYFLAG_MButton;
360 if (dwFlag & FWL_EVENTFLAG_RightButtonDown)
361 dwFWLFlag |= FWL_KEYFLAG_RButton;
362 if (dwFlag & FWL_EVENTFLAG_ShiftKey)
363 dwFWLFlag |= FWL_KEYFLAG_Shift;
364 if (dwFlag & FWL_EVENTFLAG_AltKey)
365 dwFWLFlag |= FWL_KEYFLAG_Alt;
366
367 return dwFWLFlag;
368}