1 // Copyright 2016 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "fpdfsdk/fpdfxfa/cpdfxfa_widget.h"
8
9 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
10 #include "fpdfsdk/cpdfsdk_pageview.h"
11 #include "third_party/base/check.h"
12 #include "xfa/fgas/graphics/cfgas_gegraphics.h"
13 #include "xfa/fxfa/cxfa_ffdocview.h"
14 #include "xfa/fxfa/cxfa_ffpageview.h"
15 #include "xfa/fxfa/cxfa_ffwidget.h"
16 #include "xfa/fxfa/cxfa_ffwidgethandler.h"
17 #include "xfa/fxfa/parser/cxfa_node.h"
18
19 #define CHECK_FWL_VKEY_ENUM____(name) \
20 static_assert(static_cast<int>(name) == static_cast<int>(XFA_##name), \
21 "FWL_VKEYCODE enum mismatch")
22
23 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Back);
24 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Tab);
25 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NewLine);
26 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Clear);
27 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Return);
28 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Shift);
29 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Control);
30 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Menu);
31 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Pause);
32 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Capital);
33 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Kana);
34 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Hangul);
35 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Junja);
36 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Final);
37 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Hanja);
38 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Kanji);
39 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Escape);
40 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Convert);
41 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NonConvert);
42 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Accept);
43 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_ModeChange);
44 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Space);
45 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Prior);
46 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Next);
47 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_End);
48 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Home);
49 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Left);
50 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Up);
51 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Right);
52 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Down);
53 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Select);
54 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Print);
55 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Execute);
56 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Snapshot);
57 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Insert);
58 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Delete);
59 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Help);
60 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_0);
61 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_1);
62 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_2);
63 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_3);
64 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_4);
65 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_5);
66 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_6);
67 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_7);
68 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_8);
69 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_9);
70 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_A);
71 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_B);
72 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_C);
73 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_D);
74 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_E);
75 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F);
76 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_G);
77 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_H);
78 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_I);
79 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_J);
80 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_K);
81 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_L);
82 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_M);
83 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_N);
84 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_O);
85 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_P);
86 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Q);
87 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_R);
88 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_S);
89 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_T);
90 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_U);
91 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_V);
92 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_W);
93 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_X);
94 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Y);
95 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Z);
96 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LWin);
97 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Command);
98 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RWin);
99 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Apps);
100 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Sleep);
101 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad0);
102 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad1);
103 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad2);
104 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad3);
105 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad4);
106 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad5);
107 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad6);
108 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad7);
109 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad8);
110 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NumPad9);
111 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Multiply);
112 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Add);
113 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Separator);
114 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Subtract);
115 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Decimal);
116 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Divide);
117 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F1);
118 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F2);
119 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F3);
120 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F4);
121 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F5);
122 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F6);
123 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F7);
124 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F8);
125 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F9);
126 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F10);
127 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F11);
128 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F12);
129 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F13);
130 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F14);
131 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F15);
132 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F16);
133 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F17);
134 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F18);
135 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F19);
136 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F20);
137 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F21);
138 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F22);
139 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F23);
140 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_F24);
141 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NunLock);
142 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Scroll);
143 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LShift);
144 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RShift);
145 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LControl);
146 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RControl);
147 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_LMenu);
148 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_RMenu);
149 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Back);
150 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Forward);
151 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Refresh);
152 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Stop);
153 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Search);
154 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Favorites);
155 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_BROWSER_Home);
156 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Mute);
157 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Down);
158 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_VOLUME_Up);
159 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_NEXT_Track);
160 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_PREV_Track);
161 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_Stop);
162 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_PLAY_Pause);
163 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_Mail);
164 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_MEDIA_Select);
165 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_APP1);
166 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_MEDIA_LAUNCH_APP2);
167 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_1);
168 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Plus);
169 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Comma);
170 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Minus);
171 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Period);
172 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_2);
173 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_3);
174 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_4);
175 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_5);
176 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_6);
177 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_7);
178 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_8);
179 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_102);
180 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_ProcessKey);
181 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Packet);
182 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Attn);
183 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Crsel);
184 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Exsel);
185 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Ereof);
186 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Play);
187 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Zoom);
188 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_NoName);
189 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_PA1);
190 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_OEM_Clear);
191 CHECK_FWL_VKEY_ENUM____(FWL_VKEY_Unknown);
192
193 #undef CHECK_FWL_VKEY_ENUM____
194
195 namespace {
196
GetKeyFlags(Mask<FWL_EVENTFLAG> input)197 Mask<XFA_FWL_KeyFlag> GetKeyFlags(Mask<FWL_EVENTFLAG> input) {
198 Mask<XFA_FWL_KeyFlag> results;
199
200 if (input & FWL_EVENTFLAG_ControlKey)
201 results |= XFA_FWL_KeyFlag::kCtrl;
202 if (input & FWL_EVENTFLAG_LeftButtonDown)
203 results |= XFA_FWL_KeyFlag::kLButton;
204 if (input & FWL_EVENTFLAG_MiddleButtonDown)
205 results |= XFA_FWL_KeyFlag::kMButton;
206 if (input & FWL_EVENTFLAG_RightButtonDown)
207 results |= XFA_FWL_KeyFlag::kRButton;
208 if (input & FWL_EVENTFLAG_ShiftKey)
209 results |= XFA_FWL_KeyFlag::kShift;
210 if (input & FWL_EVENTFLAG_AltKey)
211 results |= XFA_FWL_KeyFlag::kAlt;
212
213 return results;
214 }
215
216 } // namespace
217
CPDFXFA_Widget(CXFA_FFWidget * pXFAFFWidget,CPDFSDK_PageView * pPageView)218 CPDFXFA_Widget::CPDFXFA_Widget(CXFA_FFWidget* pXFAFFWidget,
219 CPDFSDK_PageView* pPageView)
220 : CPDFSDK_Annot(pPageView), m_pXFAFFWidget(pXFAFFWidget) {}
221
222 CPDFXFA_Widget::~CPDFXFA_Widget() = default;
223
AsXFAWidget()224 CPDFXFA_Widget* CPDFXFA_Widget::AsXFAWidget() {
225 return this;
226 }
227
GetUnsafeInputHandlers()228 CPDFSDK_Annot::UnsafeInputHandlers* CPDFXFA_Widget::GetUnsafeInputHandlers() {
229 return this;
230 }
231
GetAnnotSubtype() const232 CPDF_Annot::Subtype CPDFXFA_Widget::GetAnnotSubtype() const {
233 return CPDF_Annot::Subtype::XFAWIDGET;
234 }
235
GetRect() const236 CFX_FloatRect CPDFXFA_Widget::GetRect() const {
237 return GetXFAFFWidget()->GetLayoutItem()->GetAbsoluteRect().ToFloatRect();
238 }
239
OnDraw(CFX_RenderDevice * pDevice,const CFX_Matrix & mtUser2Device,bool bDrawAnnots)240 void CPDFXFA_Widget::OnDraw(CFX_RenderDevice* pDevice,
241 const CFX_Matrix& mtUser2Device,
242 bool bDrawAnnots) {
243 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
244 if (!widget_handler)
245 return;
246
247 CFGAS_GEGraphics gs(pDevice);
248 bool is_highlight = GetPageView()->GetFormFillEnv()->GetFocusAnnot() != this;
249 widget_handler->RenderWidget(GetXFAFFWidget(), &gs, mtUser2Device,
250 is_highlight);
251
252 // to do highlight and shadow
253 }
254
DoHitTest(const CFX_PointF & point)255 bool CPDFXFA_Widget::DoHitTest(const CFX_PointF& point) {
256 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
257 if (!widget_handler)
258 return false;
259
260 return widget_handler->HitTest(GetXFAFFWidget(), point) !=
261 FWL_WidgetHit::Unknown;
262 }
263
OnChangedFocus()264 bool CPDFXFA_Widget::OnChangedFocus() {
265 CXFA_FFDocView* doc_view = GetDocView();
266 if (!doc_view)
267 return false;
268
269 CXFA_FFWidget* widget = GetXFAFFWidget();
270 if (doc_view->SetFocus(widget))
271 return false;
272
273 return doc_view->GetFocusWidget() != widget;
274 }
275
GetViewBBox()276 CFX_FloatRect CPDFXFA_Widget::GetViewBBox() {
277 CXFA_FFWidget* widget = GetXFAFFWidget();
278 CXFA_Node* node = widget->GetNode();
279 DCHECK(node->IsWidgetReady());
280
281 CFX_RectF bbox =
282 widget->GetBBox(node->GetFFWidgetType() == XFA_FFWidgetType::kSignature
283 ? CXFA_FFWidget::kDrawFocus
284 : CXFA_FFWidget::kDoNotDrawFocus);
285
286 CFX_FloatRect result = bbox.ToFloatRect();
287 result.Inflate(1.0f, 1.0f);
288 return result;
289 }
290
OnMouseEnter(Mask<FWL_EVENTFLAG> nFlags)291 void CPDFXFA_Widget::OnMouseEnter(Mask<FWL_EVENTFLAG> nFlags) {
292 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
293 if (widget_handler)
294 widget_handler->OnMouseEnter(GetXFAFFWidget());
295 }
296
OnMouseExit(Mask<FWL_EVENTFLAG> nFlags)297 void CPDFXFA_Widget::OnMouseExit(Mask<FWL_EVENTFLAG> nFlags) {
298 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
299 if (widget_handler)
300 widget_handler->OnMouseExit(GetXFAFFWidget());
301 }
302
OnLButtonDown(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)303 bool CPDFXFA_Widget::OnLButtonDown(Mask<FWL_EVENTFLAG> nFlags,
304 const CFX_PointF& point) {
305 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
306 return widget_handler && widget_handler->OnLButtonDown(
307 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
308 }
309
OnLButtonUp(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)310 bool CPDFXFA_Widget::OnLButtonUp(Mask<FWL_EVENTFLAG> nFlags,
311 const CFX_PointF& point) {
312 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
313 return widget_handler && widget_handler->OnLButtonUp(
314 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
315 }
316
OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)317 bool CPDFXFA_Widget::OnLButtonDblClk(Mask<FWL_EVENTFLAG> nFlags,
318 const CFX_PointF& point) {
319 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
320 return widget_handler && widget_handler->OnLButtonDblClk(
321 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
322 }
323
OnMouseMove(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)324 bool CPDFXFA_Widget::OnMouseMove(Mask<FWL_EVENTFLAG> nFlags,
325 const CFX_PointF& point) {
326 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
327 return widget_handler && widget_handler->OnMouseMove(
328 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
329 }
330
OnMouseWheel(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point,const CFX_Vector & delta)331 bool CPDFXFA_Widget::OnMouseWheel(Mask<FWL_EVENTFLAG> nFlags,
332 const CFX_PointF& point,
333 const CFX_Vector& delta) {
334 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
335 return widget_handler &&
336 widget_handler->OnMouseWheel(GetXFAFFWidget(), GetKeyFlags(nFlags),
337 point, delta);
338 }
339
OnRButtonDown(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)340 bool CPDFXFA_Widget::OnRButtonDown(Mask<FWL_EVENTFLAG> nFlags,
341 const CFX_PointF& point) {
342 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
343 return widget_handler && widget_handler->OnRButtonDown(
344 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
345 }
346
OnRButtonUp(Mask<FWL_EVENTFLAG> nFlags,const CFX_PointF & point)347 bool CPDFXFA_Widget::OnRButtonUp(Mask<FWL_EVENTFLAG> nFlags,
348 const CFX_PointF& point) {
349 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
350 return widget_handler && widget_handler->OnRButtonUp(
351 GetXFAFFWidget(), GetKeyFlags(nFlags), point);
352 }
353
OnChar(uint32_t nChar,Mask<FWL_EVENTFLAG> nFlags)354 bool CPDFXFA_Widget::OnChar(uint32_t nChar, Mask<FWL_EVENTFLAG> nFlags) {
355 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
356 return widget_handler &&
357 widget_handler->OnChar(GetXFAFFWidget(), nChar, GetKeyFlags(nFlags));
358 }
359
OnKeyDown(FWL_VKEYCODE nKeyCode,Mask<FWL_EVENTFLAG> nFlags)360 bool CPDFXFA_Widget::OnKeyDown(FWL_VKEYCODE nKeyCode,
361 Mask<FWL_EVENTFLAG> nFlags) {
362 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
363 return widget_handler &&
364 widget_handler->OnKeyDown(GetXFAFFWidget(),
365 static_cast<XFA_FWL_VKEYCODE>(nKeyCode),
366 GetKeyFlags(nFlags));
367 }
368
OnSetFocus(Mask<FWL_EVENTFLAG> nFlags)369 bool CPDFXFA_Widget::OnSetFocus(Mask<FWL_EVENTFLAG> nFlags) {
370 return true;
371 }
372
OnKillFocus(Mask<FWL_EVENTFLAG> nFlags)373 bool CPDFXFA_Widget::OnKillFocus(Mask<FWL_EVENTFLAG> nFlags) {
374 CXFA_FFDocView* doc_view = GetDocView();
375 if (doc_view)
376 doc_view->SetFocus(nullptr);
377 return true;
378 }
379
CanUndo()380 bool CPDFXFA_Widget::CanUndo() {
381 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
382 return widget_handler && widget_handler->CanUndo(GetXFAFFWidget());
383 }
384
CanRedo()385 bool CPDFXFA_Widget::CanRedo() {
386 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
387 return widget_handler && widget_handler->CanRedo(GetXFAFFWidget());
388 }
389
Undo()390 bool CPDFXFA_Widget::Undo() {
391 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
392 return widget_handler && widget_handler->Undo(GetXFAFFWidget());
393 }
394
Redo()395 bool CPDFXFA_Widget::Redo() {
396 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
397 return widget_handler && widget_handler->Redo(GetXFAFFWidget());
398 }
399
GetText()400 WideString CPDFXFA_Widget::GetText() {
401 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
402 if (!widget_handler)
403 return WideString();
404 return widget_handler->GetText(GetXFAFFWidget());
405 }
406
GetSelectedText()407 WideString CPDFXFA_Widget::GetSelectedText() {
408 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
409 if (!widget_handler)
410 return WideString();
411 return widget_handler->GetSelectedText(GetXFAFFWidget());
412 }
413
ReplaceAndKeepSelection(const WideString & text)414 void CPDFXFA_Widget::ReplaceAndKeepSelection(const WideString& text) {
415 // XFA does not seem to support IME input at all. Therefore we don't bother
416 // to keep selection for IMEs.
417 ReplaceSelection(text);
418 }
419
ReplaceSelection(const WideString & text)420 void CPDFXFA_Widget::ReplaceSelection(const WideString& text) {
421 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
422 if (widget_handler)
423 widget_handler->PasteText(GetXFAFFWidget(), text);
424 }
425
SelectAllText()426 bool CPDFXFA_Widget::SelectAllText() {
427 CXFA_FFWidgetHandler* widget_handler = GetWidgetHandler();
428 return widget_handler && widget_handler->SelectAllText(GetXFAFFWidget());
429 }
430
SetIndexSelected(int index,bool selected)431 bool CPDFXFA_Widget::SetIndexSelected(int index, bool selected) {
432 return false;
433 }
434
IsIndexSelected(int index)435 bool CPDFXFA_Widget::IsIndexSelected(int index) {
436 return false;
437 }
438
GetDocView()439 CXFA_FFDocView* CPDFXFA_Widget::GetDocView() {
440 CXFA_FFPageView* page_view = GetXFAFFWidget()->GetPageView();
441 return page_view ? page_view->GetDocView() : nullptr;
442 }
443
GetWidgetHandler()444 CXFA_FFWidgetHandler* CPDFXFA_Widget::GetWidgetHandler() {
445 CXFA_FFDocView* doc_view = GetDocView();
446 return doc_view ? doc_view->GetWidgetHandler() : nullptr;
447 }
448