• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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