1// Copyright 2014 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
7#include "../../include/javascript/JavaScript.h"
8#include "../../include/javascript/IJavaScript.h"
9#include "../../include/javascript/JS_Define.h"
10#include "../../include/javascript/JS_Object.h"
11#include "../../include/javascript/JS_Value.h"
12#include "../../include/javascript/JS_EventHandler.h"
13//#include "../include/JS_ResMgr.h"
14#include "../../include/javascript/JS_Context.h"
15#include "../../include/javascript/event.h"
16#include "../../include/javascript/Field.h"
17
18/* -------------------------- event -------------------------- */
19
20BEGIN_JS_STATIC_CONST(CJS_Event)
21END_JS_STATIC_CONST()
22
23BEGIN_JS_STATIC_PROP(CJS_Event)
24	JS_STATIC_PROP_ENTRY(change)
25	JS_STATIC_PROP_ENTRY(changeEx)
26	JS_STATIC_PROP_ENTRY(commitKey)
27	JS_STATIC_PROP_ENTRY(fieldFull)
28	JS_STATIC_PROP_ENTRY(keyDown)
29	JS_STATIC_PROP_ENTRY(modifier)
30	JS_STATIC_PROP_ENTRY(name)
31	JS_STATIC_PROP_ENTRY(rc)
32	JS_STATIC_PROP_ENTRY(richChange)
33	JS_STATIC_PROP_ENTRY(richChangeEx)
34	JS_STATIC_PROP_ENTRY(richValue)
35	JS_STATIC_PROP_ENTRY(selEnd)
36	JS_STATIC_PROP_ENTRY(selStart)
37	JS_STATIC_PROP_ENTRY(shift)
38	JS_STATIC_PROP_ENTRY(source)
39	JS_STATIC_PROP_ENTRY(target)
40	JS_STATIC_PROP_ENTRY(targetName)
41	JS_STATIC_PROP_ENTRY(type)
42	JS_STATIC_PROP_ENTRY(value)
43	JS_STATIC_PROP_ENTRY(willCommit)
44END_JS_STATIC_PROP()
45
46BEGIN_JS_STATIC_METHOD(CJS_Event)
47END_JS_STATIC_METHOD()
48
49IMPLEMENT_JS_CLASS(CJS_Event,event)
50
51event::event(CJS_Object * pJsObject) : CJS_EmbedObj(pJsObject)
52{
53}
54
55event::~event(void)
56{
57}
58
59FX_BOOL event::change(OBJ_PROP_PARAMS)
60{
61	CJS_Context* pContext = (CJS_Context*)cc;
62	ASSERT(pContext != NULL);
63	CJS_EventHandler* pEvent = pContext->GetEventHandler();
64	ASSERT(pEvent != NULL);
65
66	CFX_WideString &wChange = pEvent->Change();
67	if (vp.IsSetting())
68	{
69		if (vp.GetType() == VT_string)
70			vp >> wChange;
71	}
72	else
73	{
74		vp << wChange;
75	}
76	return TRUE;
77}
78
79FX_BOOL event::changeEx(OBJ_PROP_PARAMS)
80{
81	if (!vp.IsGetting())return FALSE;
82
83	CJS_Context* pContext = (CJS_Context*)cc;
84	ASSERT(pContext != NULL);
85	CJS_EventHandler* pEvent = pContext->GetEventHandler();
86	ASSERT(pEvent != NULL);
87
88	vp << pEvent->ChangeEx();
89	return TRUE;
90}
91
92FX_BOOL event::commitKey(OBJ_PROP_PARAMS)
93{
94	if (!vp.IsGetting())return FALSE;
95
96	CJS_Context* pContext = (CJS_Context*)cc;
97	ASSERT(pContext != NULL);
98	CJS_EventHandler* pEvent = pContext->GetEventHandler();
99	ASSERT(pEvent != NULL);
100
101	vp << pEvent->CommitKey();
102	return TRUE;
103}
104
105FX_BOOL event::fieldFull(OBJ_PROP_PARAMS)
106{
107	CJS_Context* pContext = (CJS_Context*)cc;
108	ASSERT(pContext != NULL);
109	CJS_EventHandler* pEvent = pContext->GetEventHandler();
110	ASSERT(pEvent != NULL);
111
112	if (!vp.IsGetting() && wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
113		return FALSE;
114
115	if (pEvent->FieldFull())
116		vp << TRUE;
117	else
118		vp << FALSE;
119	return TRUE;
120}
121
122FX_BOOL event::keyDown(OBJ_PROP_PARAMS)
123{
124	if (!vp.IsGetting())return FALSE;
125
126	CJS_Context* pContext = (CJS_Context*)cc;
127	ASSERT(pContext != NULL);
128	CJS_EventHandler* pEvent = pContext->GetEventHandler();
129	ASSERT(pEvent != NULL);
130
131	if (pEvent->KeyDown())
132		vp << TRUE;
133	else
134		vp << FALSE;
135	return TRUE;
136}
137
138FX_BOOL event::modifier(OBJ_PROP_PARAMS)
139{
140	if (!vp.IsGetting())return FALSE;
141
142	CJS_Context* pContext = (CJS_Context*)cc;
143	ASSERT(pContext != NULL);
144	CJS_EventHandler* pEvent = pContext->GetEventHandler();
145	ASSERT(pEvent != NULL);
146
147	if (pEvent->Modifier())
148		vp << TRUE;
149	else
150		vp << FALSE;
151	return TRUE;
152}
153
154FX_BOOL event::name(OBJ_PROP_PARAMS)
155{
156	if (!vp.IsGetting())return FALSE;
157
158	CJS_Context* pContext = (CJS_Context*)cc;
159	ASSERT(pContext != NULL);
160	CJS_EventHandler* pEvent = pContext->GetEventHandler();
161	ASSERT(pEvent != NULL);
162
163	vp << pEvent->Name();
164	return TRUE;
165}
166
167FX_BOOL event::rc(OBJ_PROP_PARAMS)
168{
169	CJS_Context* pContext = (CJS_Context*)cc;
170	ASSERT(pContext != NULL);
171	CJS_EventHandler* pEvent = pContext->GetEventHandler();
172	ASSERT(pEvent != NULL);
173
174    FX_BOOL &bRc = pEvent->Rc();
175	if (vp.IsSetting())
176	{
177		vp>>bRc;
178	}
179	else
180	{
181		vp<<bRc;
182	}
183	return TRUE;
184}
185
186FX_BOOL event::richChange(OBJ_PROP_PARAMS)
187{
188	return TRUE;
189	if (vp.IsSetting())
190	{
191	}
192	else
193	{
194		;
195	}
196	return TRUE;
197}
198
199FX_BOOL event::richChangeEx(OBJ_PROP_PARAMS)
200{
201	return TRUE;
202	if (vp.IsSetting())
203	{
204	}
205	else
206	{
207		;
208	}
209	return TRUE;
210}
211
212
213FX_BOOL event::richValue(OBJ_PROP_PARAMS)
214{
215	return TRUE;
216	if (vp.IsSetting())
217	{
218	}
219	else
220	{
221		;
222	}
223	return TRUE;
224}
225
226FX_BOOL event::selEnd(OBJ_PROP_PARAMS)
227{
228	CJS_Context* pContext = (CJS_Context*)cc;
229	ASSERT(pContext != NULL);
230	CJS_EventHandler* pEvent = pContext->GetEventHandler();
231	ASSERT(pEvent != NULL);
232
233	if (wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
234	{
235		return TRUE;
236	}
237
238	int &iSelEnd = pEvent->SelEnd();
239	if (vp.IsSetting())
240	{
241		vp >> iSelEnd;
242	}
243	else
244	{
245		vp << iSelEnd;
246	}
247	return TRUE;
248}
249
250FX_BOOL event::selStart(OBJ_PROP_PARAMS)
251{
252	CJS_Context* pContext = (CJS_Context*)cc;
253	ASSERT(pContext != NULL);
254	CJS_EventHandler* pEvent = pContext->GetEventHandler();
255	ASSERT(pEvent != NULL);
256
257	if (wcscmp((const wchar_t*)pEvent->Name(),L"Keystroke") != 0)
258	{
259		return TRUE;
260	}
261	int &iSelStart = pEvent->SelStart();
262	if (vp.IsSetting())
263	{
264		vp >> iSelStart;
265	}
266	else
267	{
268		vp << iSelStart;
269	}
270	return TRUE;
271}
272
273FX_BOOL event::shift(OBJ_PROP_PARAMS)
274{
275	if (!vp.IsGetting())return FALSE;
276
277	CJS_Context* pContext = (CJS_Context*)cc;
278	ASSERT(pContext != NULL);
279	CJS_EventHandler* pEvent = pContext->GetEventHandler();
280	ASSERT(pEvent != NULL);
281
282	if (pEvent->Shift())
283		vp << TRUE;
284	else
285		vp << FALSE;
286	return TRUE;
287}
288
289FX_BOOL event::source(OBJ_PROP_PARAMS)
290{
291	if (!vp.IsGetting())return FALSE;
292
293	CJS_Context* pContext = (CJS_Context*)cc;
294	ASSERT(pContext != NULL);
295	CJS_EventHandler* pEvent = pContext->GetEventHandler();
296	ASSERT(pEvent != NULL);
297
298	vp << pEvent->Source()->GetJSObject();
299	return TRUE;
300}
301
302FX_BOOL event::target(OBJ_PROP_PARAMS)
303{
304	if (!vp.IsGetting())return FALSE;
305
306	CJS_Context* pContext = (CJS_Context*)cc;
307	ASSERT(pContext != NULL);
308	CJS_EventHandler* pEvent = pContext->GetEventHandler();
309	ASSERT(pEvent != NULL);
310
311	vp<<pEvent->Target_Field()->GetJSObject();
312	return TRUE;
313}
314
315FX_BOOL event::targetName(OBJ_PROP_PARAMS)
316{
317	if (!vp.IsGetting())return FALSE;
318
319	CJS_Context* pContext = (CJS_Context*)cc;
320	ASSERT(pContext != NULL);
321	CJS_EventHandler* pEvent = pContext->GetEventHandler();
322	ASSERT(pEvent != NULL);
323
324	vp << pEvent->TargetName();
325	return TRUE;
326}
327
328FX_BOOL event::type(OBJ_PROP_PARAMS)
329{
330	if (!vp.IsGetting())return FALSE;
331
332	CJS_Context* pContext = (CJS_Context*)cc;
333	ASSERT(pContext != NULL);
334	CJS_EventHandler* pEvent = pContext->GetEventHandler();
335	ASSERT(pEvent != NULL);
336
337	vp << pEvent->Type();
338	return TRUE;
339}
340
341FX_BOOL event::value(OBJ_PROP_PARAMS)
342{
343	CJS_Context* pContext = (CJS_Context*)cc;
344	ASSERT(pContext != NULL);
345	CJS_EventHandler* pEvent = pContext->GetEventHandler();
346	ASSERT(pEvent != NULL);
347
348	if (wcscmp((const wchar_t*)pEvent->Type(),L"Field") != 0)
349		return FALSE;
350	if(!pEvent->m_pValue)
351		return FALSE;
352	CFX_WideString & val = pEvent->Value();
353	if (vp.IsSetting())
354	{
355		val = vp;
356	}
357	else
358	{
359		vp << val;
360	}
361	return TRUE;
362}
363
364FX_BOOL event::willCommit(OBJ_PROP_PARAMS)
365{
366	if (!vp.IsGetting())return FALSE;
367
368	CJS_Context* pContext = (CJS_Context*)cc;
369	ASSERT(pContext != NULL);
370	CJS_EventHandler* pEvent = pContext->GetEventHandler();
371	ASSERT(pEvent != NULL);
372
373	if (pEvent->WillCommit())
374		vp << TRUE;
375	else
376		vp << FALSE;
377	return TRUE;
378}
379
380