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