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/Field.h"
13#include "../../include/javascript/JS_EventHandler.h"
14#include "../../include/javascript/JS_Context.h"
15#include "../../include/javascript/JS_Runtime.h"
16#include "../../include/javascript/Document.h"
17#include "../../include/javascript/color.h"
18#include "../../include/javascript/PublicMethods.h"
19#include "../../include/javascript/Icon.h"
20
21
22/* ---------------------- Field ---------------------- */
23
24BEGIN_JS_STATIC_CONST(CJS_Field)
25END_JS_STATIC_CONST()
26
27BEGIN_JS_STATIC_PROP(CJS_Field)
28	JS_STATIC_PROP_ENTRY(alignment)
29	JS_STATIC_PROP_ENTRY(borderStyle)
30	JS_STATIC_PROP_ENTRY(buttonAlignX)
31	JS_STATIC_PROP_ENTRY(buttonAlignY)
32	JS_STATIC_PROP_ENTRY(buttonFitBounds)
33	JS_STATIC_PROP_ENTRY(buttonPosition)
34	JS_STATIC_PROP_ENTRY(buttonScaleHow)
35	JS_STATIC_PROP_ENTRY(buttonScaleWhen)
36	JS_STATIC_PROP_ENTRY(calcOrderIndex)
37	JS_STATIC_PROP_ENTRY(charLimit)
38	JS_STATIC_PROP_ENTRY(comb)
39	JS_STATIC_PROP_ENTRY(commitOnSelChange)
40	JS_STATIC_PROP_ENTRY(currentValueIndices)
41	JS_STATIC_PROP_ENTRY(defaultStyle)
42	JS_STATIC_PROP_ENTRY(defaultValue)
43	JS_STATIC_PROP_ENTRY(doNotScroll)
44	JS_STATIC_PROP_ENTRY(doNotSpellCheck)
45	JS_STATIC_PROP_ENTRY(delay)
46	JS_STATIC_PROP_ENTRY(display)
47	JS_STATIC_PROP_ENTRY(doc)
48	JS_STATIC_PROP_ENTRY(editable)
49	JS_STATIC_PROP_ENTRY(exportValues)
50	JS_STATIC_PROP_ENTRY(hidden)
51	JS_STATIC_PROP_ENTRY(fileSelect)
52	JS_STATIC_PROP_ENTRY(fillColor)
53	JS_STATIC_PROP_ENTRY(lineWidth)
54	JS_STATIC_PROP_ENTRY(highlight)
55	JS_STATIC_PROP_ENTRY(multiline)
56	JS_STATIC_PROP_ENTRY(multipleSelection)
57	JS_STATIC_PROP_ENTRY(name)
58	JS_STATIC_PROP_ENTRY(numItems)
59	JS_STATIC_PROP_ENTRY(page)
60	JS_STATIC_PROP_ENTRY(password)
61	JS_STATIC_PROP_ENTRY(print)
62	JS_STATIC_PROP_ENTRY(radiosInUnison)
63	JS_STATIC_PROP_ENTRY(readonly)
64	JS_STATIC_PROP_ENTRY(rect)
65	JS_STATIC_PROP_ENTRY(required)
66	JS_STATIC_PROP_ENTRY(richText)
67	JS_STATIC_PROP_ENTRY(richValue)
68	JS_STATIC_PROP_ENTRY(rotation)
69	JS_STATIC_PROP_ENTRY(strokeColor)
70	JS_STATIC_PROP_ENTRY(style)
71	JS_STATIC_PROP_ENTRY(submitName)
72	JS_STATIC_PROP_ENTRY(textColor)
73	JS_STATIC_PROP_ENTRY(textFont)
74	JS_STATIC_PROP_ENTRY(textSize)
75	JS_STATIC_PROP_ENTRY(type)
76	JS_STATIC_PROP_ENTRY(userName)
77	JS_STATIC_PROP_ENTRY(value)
78	JS_STATIC_PROP_ENTRY(valueAsString)
79	JS_STATIC_PROP_ENTRY(source)
80END_JS_STATIC_PROP()
81
82BEGIN_JS_STATIC_METHOD(CJS_Field)
83	JS_STATIC_METHOD_ENTRY(browseForFileToSubmit)
84	JS_STATIC_METHOD_ENTRY(buttonGetCaption)
85	JS_STATIC_METHOD_ENTRY(buttonGetIcon)
86	JS_STATIC_METHOD_ENTRY(buttonImportIcon)
87	JS_STATIC_METHOD_ENTRY(buttonSetCaption)
88	JS_STATIC_METHOD_ENTRY(buttonSetIcon)
89	JS_STATIC_METHOD_ENTRY(checkThisBox)
90	JS_STATIC_METHOD_ENTRY(clearItems)
91	JS_STATIC_METHOD_ENTRY(defaultIsChecked)
92	JS_STATIC_METHOD_ENTRY(deleteItemAt)
93	JS_STATIC_METHOD_ENTRY(getArray )
94	JS_STATIC_METHOD_ENTRY(getItemAt)
95	JS_STATIC_METHOD_ENTRY(getLock)
96	JS_STATIC_METHOD_ENTRY(insertItemAt)
97	JS_STATIC_METHOD_ENTRY(isBoxChecked)
98	JS_STATIC_METHOD_ENTRY(isDefaultChecked)
99	JS_STATIC_METHOD_ENTRY(setAction)
100	JS_STATIC_METHOD_ENTRY(setFocus)
101	JS_STATIC_METHOD_ENTRY(setItems)
102	JS_STATIC_METHOD_ENTRY(setLock)
103	JS_STATIC_METHOD_ENTRY(signatureGetModifications)
104	JS_STATIC_METHOD_ENTRY(signatureGetSeedValue)
105	JS_STATIC_METHOD_ENTRY(signatureInfo)
106	JS_STATIC_METHOD_ENTRY(signatureSetSeedValue)
107	JS_STATIC_METHOD_ENTRY(signatureSign)
108	JS_STATIC_METHOD_ENTRY(signatureValidate)
109END_JS_STATIC_METHOD()
110
111IMPLEMENT_JS_CLASS(CJS_Field, Field)
112
113FX_BOOL	CJS_Field::InitInstance(IFXJS_Context* cc)
114{
115	CJS_Context* pContext = (CJS_Context*)cc;
116	ASSERT(pContext != NULL);
117
118	Field* pField = (Field*)GetEmbedObject();
119	ASSERT(pField != NULL);
120
121	pField->SetIsolate(pContext->GetJSRuntime()->GetIsolate());
122
123	return TRUE;
124};
125
126Field::Field(CJS_Object* pJSObject): CJS_EmbedObj(pJSObject),
127	m_pJSDoc(NULL),
128	m_pDocument(NULL),
129	m_nFormControlIndex(-1),
130	m_bCanSet(FALSE),
131	m_bDelay(FALSE),
132	m_isolate(NULL)
133{
134}
135
136Field::~Field()
137{
138}
139
140//note: iControlNo = -1, means not a widget.
141void Field::ParseFieldName(const std::wstring &strFieldNameParsed,std::wstring &strFieldName,int & iControlNo)
142{
143	int iStart = strFieldNameParsed.find_last_of(L'.');
144	if (iStart == -1)
145	{
146		strFieldName = strFieldNameParsed;
147		iControlNo = -1;
148		return;
149	}
150	std::wstring suffixal = strFieldNameParsed.substr(iStart+1);
151	iControlNo = FXSYS_wtoi(suffixal.c_str());
152	if (iControlNo == 0)
153	{
154		int iStart;
155		while((iStart = suffixal.find_last_of(L" ")) != -1)
156		{
157			suffixal.erase(iStart,1);
158		}
159
160		if (suffixal.compare(L"0") != 0)
161		{
162			strFieldName = strFieldNameParsed;
163			iControlNo = -1;
164			return;
165		}
166
167	}
168	strFieldName = strFieldNameParsed.substr(0,iStart);
169}
170
171FX_BOOL Field::AttachField(Document* pDocument, const CFX_WideString& csFieldName)
172{
173	ASSERT(pDocument != NULL);
174	m_pJSDoc = pDocument;
175
176	m_pDocument = pDocument->GetReaderDoc();
177	ASSERT(m_pDocument != NULL);
178
179	m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) ||
180		m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
181		m_pDocument->GetPermissions(FPDFPERM_MODIFY);
182
183	CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
184	ASSERT(pRDInterForm != NULL);
185
186	CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
187	ASSERT(pInterForm != NULL);
188
189	CFX_WideString swFieldNameTemp = csFieldName;
190	swFieldNameTemp.Replace(L"..", L".");
191
192	if (pInterForm->CountFields(swFieldNameTemp) <= 0)
193	{
194		std::wstring strFieldName;
195		int iControlNo = -1;
196		ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo);
197		if (iControlNo == -1) return FALSE;
198
199		m_FieldName = strFieldName.c_str();
200		m_nFormControlIndex = iControlNo;
201		return TRUE;
202	}
203
204	m_FieldName = swFieldNameTemp;
205	m_nFormControlIndex = -1;
206
207	return TRUE;
208}
209
210void Field::GetFormFields(CPDFSDK_Document* pDocument, const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
211{
212	ASSERT(pDocument != NULL);
213
214	CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
215	ASSERT(pReaderInterForm != NULL);
216
217	CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
218	ASSERT(pInterForm != NULL);
219
220	ASSERT(FieldArray.GetSize() == 0);
221
222	for (int i=0,sz=pInterForm->CountFields(csFieldName); i<sz; i++)
223	{
224		if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
225			FieldArray.Add((void*)pFormField);
226	}
227}
228
229void Field::GetFormFields(const CFX_WideString& csFieldName, CFX_PtrArray& FieldArray)
230{
231	ASSERT(m_pDocument != NULL);
232
233	Field::GetFormFields(m_pDocument, csFieldName, FieldArray);
234}
235
236void Field::UpdateFormField(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
237							FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
238{
239	ASSERT(pDocument != NULL);
240	ASSERT(pFormField != NULL);
241
242	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
243	ASSERT(pInterForm != NULL);
244
245	CFX_PtrArray widgets;
246	pInterForm->GetWidgets(pFormField, widgets);
247
248	if (bResetAP)
249	{
250		int nFieldType = pFormField->GetFieldType();
251		if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
252		{
253			for (int i=0,sz=widgets.GetSize(); i<sz; i++)
254			{
255				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
256				ASSERT(pWidget != NULL);
257
258				FX_BOOL bFormated = FALSE;
259				CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
260				if (bFormated)
261					pWidget->ResetAppearance(sValue.c_str(), FALSE);
262				else
263					pWidget->ResetAppearance(NULL, FALSE);
264			}
265		}
266		else
267		{
268			for (int i=0,sz=widgets.GetSize(); i<sz; i++)
269			{
270				CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
271				ASSERT(pWidget != NULL);
272
273				pWidget->ResetAppearance(NULL, FALSE);
274			}
275		}
276	}
277
278	if (bRefresh)
279	{
280		for (int i=0,sz=widgets.GetSize(); i<sz; i++)
281		{
282			CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgets.GetAt(i);
283			ASSERT(pWidget != NULL);
284
285			CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
286			CPDFSDK_Document* pDoc = pInterForm->GetDocument();
287// 			CReader_Page* pPage = pWidget->GetPage();
288 			ASSERT(pDoc != NULL);
289			pDoc->UpdateAllViews(NULL, pWidget);
290		}
291	}
292
293	if (bChangeMark)
294		pDocument->SetChangeMark();
295}
296
297void Field::UpdateFormControl(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl,
298							FX_BOOL bChangeMark, FX_BOOL bResetAP, FX_BOOL bRefresh)
299{
300	ASSERT(pDocument != NULL);
301	ASSERT(pFormControl != NULL);
302
303	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
304	ASSERT(pInterForm != NULL);
305
306	CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
307
308	if (pWidget)
309	{
310		if (bResetAP)
311		{
312			int nFieldType = pWidget->GetFieldType();
313			if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD)
314			{
315				FX_BOOL bFormated = FALSE;
316				CFX_WideString sValue = pWidget->OnFormat(0, bFormated);
317				if (bFormated)
318					pWidget->ResetAppearance(sValue.c_str(), FALSE);
319				else
320					pWidget->ResetAppearance(NULL, FALSE);
321			}
322			else
323			{
324				pWidget->ResetAppearance(NULL, FALSE);
325			}
326		}
327
328		if (bRefresh)
329		{
330			CPDFSDK_InterForm * pInterForm = pWidget->GetInterForm();
331			CPDFSDK_Document* pDoc = pInterForm->GetDocument();
332			ASSERT(pDoc != NULL);
333			pDoc->UpdateAllViews(NULL, pWidget);
334		}
335
336	}
337
338	if (bChangeMark)
339		pDocument->SetChangeMark();
340}
341
342CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument, CPDF_FormControl* pFormControl)
343{
344	ASSERT(pDocument != NULL);
345	ASSERT(pFormControl != NULL);
346
347	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
348	ASSERT(pInterForm != NULL);
349
350	return pInterForm->GetWidget(pFormControl);
351}
352
353FX_BOOL Field::ValueIsOccur(CPDF_FormField* pFormField, CFX_WideString csOptLabel)
354{
355	ASSERT(pFormField != NULL);
356
357	for (int i=0,sz = pFormField->CountOptions(); i < sz; i++)
358	{
359		if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
360			return TRUE;
361	}
362
363	return FALSE;
364}
365
366CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField)
367{
368	ASSERT(pFormField != NULL);
369	if(!pFormField->CountControls() || m_nFormControlIndex>=pFormField->CountControls()) return NULL;
370
371	if (m_nFormControlIndex<0)
372		return pFormField->GetControl(0);
373	else
374		return pFormField->GetControl(m_nFormControlIndex);
375}
376
377/* ---------------------------------------- property ---------------------------------------- */
378
379FX_BOOL Field::alignment(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
380{
381	ASSERT(m_pDocument != NULL);
382
383	if (vp.IsSetting())
384	{
385		if (!m_bCanSet) return FALSE;
386
387		CFX_ByteString alignStr;
388		vp >> alignStr;
389
390		if (m_bDelay)
391		{
392			AddDelay_String(FP_ALIGNMENT, alignStr);
393		}
394		else
395		{
396			Field::SetAlignment(m_pDocument, m_FieldName, m_nFormControlIndex, alignStr);
397		}
398	}
399	else
400	{
401		CFX_PtrArray FieldArray;
402		GetFormFields(m_FieldName, FieldArray);
403		if (FieldArray.GetSize() <= 0) return FALSE;
404
405		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
406		ASSERT(pFormField != NULL);
407
408		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
409			return FALSE;
410
411		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
412		if (!pFormControl)return FALSE;
413
414		switch (pFormControl->GetControlAlignment())
415		{
416			case 1:
417				vp << L"center";
418				break;
419			case 0:
420				vp << L"left";
421				break;
422			case 2:
423				vp << L"right";
424				break;
425			default:
426				vp << L"";
427		}
428	}
429
430	return TRUE;
431}
432
433void Field::SetAlignment(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
434						 const CFX_ByteString& string)
435{
436	//Not supported.
437}
438
439FX_BOOL Field::borderStyle(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
440{
441	ASSERT(m_pDocument != NULL);
442
443	if (vp.IsSetting())
444	{
445		if (!m_bCanSet) return FALSE;
446
447		CFX_ByteString strType = "";
448		vp >> strType;
449
450		if (m_bDelay)
451		{
452			AddDelay_String(FP_BORDERSTYLE, strType);
453		}
454		else
455		{
456			Field::SetBorderStyle(m_pDocument, m_FieldName, m_nFormControlIndex, strType);
457		}
458	}
459	else
460	{
461		CFX_PtrArray FieldArray;
462		GetFormFields(m_FieldName, FieldArray);
463		if (FieldArray.GetSize() <= 0) return FALSE;
464
465		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
466		if (!pFormField) return FALSE;
467
468		CPDFSDK_Widget* pWidget = GetWidget(m_pDocument, GetSmartFieldControl(pFormField));
469		if (!pWidget) return FALSE;
470
471		int nBorderstyle = pWidget->GetBorderStyle();
472
473		switch (nBorderstyle)
474		{
475			case BBS_SOLID:
476				vp << L"solid";
477				break;
478			case BBS_DASH:
479				vp << L"dashed";
480				break;
481			case BBS_BEVELED:
482				vp << L"beveled";
483				break;
484			case BBS_INSET:
485				vp << L"inset";
486				break;
487			case BBS_UNDERLINE:
488				vp << L"underline";
489				break;
490			default:
491				vp << L"";
492				break;
493		}
494	}
495
496	return TRUE;
497}
498
499void Field::SetBorderStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
500						   const CFX_ByteString& string)
501{
502	ASSERT(pDocument != NULL);
503
504	int nBorderStyle = 0;
505
506	if (string == "solid")
507		nBorderStyle = BBS_SOLID;
508	else if (string == "beveled")
509		nBorderStyle = BBS_BEVELED;
510	else if (string == "dashed")
511		nBorderStyle = BBS_DASH;
512	else if (string == "inset")
513		nBorderStyle = BBS_INSET;
514	else if (string == "underline")
515		nBorderStyle = BBS_UNDERLINE;
516	else return;
517
518	CFX_PtrArray FieldArray;
519	GetFormFields(pDocument, swFieldName, FieldArray);
520
521	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
522	{
523		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
524		ASSERT(pFormField != NULL);
525
526		if (nControlIndex < 0)
527		{
528			FX_BOOL bSet = FALSE;
529			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
530			{
531				if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormField->GetControl(j)))
532				{
533					if (pWidget->GetBorderStyle() != nBorderStyle)
534					{
535						pWidget->SetBorderStyle(nBorderStyle);
536						bSet = TRUE;
537					}
538				}
539			}
540			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
541		}
542		else
543		{
544			if(nControlIndex >= pFormField->CountControls()) return;
545			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
546			{
547				if (CPDFSDK_Widget* pWidget = GetWidget(pDocument, pFormControl))
548				{
549					if (pWidget->GetBorderStyle() != nBorderStyle)
550					{
551						pWidget->SetBorderStyle(nBorderStyle);
552						UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
553					}
554				}
555			}
556		}
557	}
558}
559
560FX_BOOL Field::buttonAlignX(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
561{
562	ASSERT(m_pDocument != NULL);
563
564	if (vp.IsSetting())
565	{
566		if (!m_bCanSet) return FALSE;
567
568		int nVP;
569		vp >> nVP;
570
571		if (m_bDelay)
572		{
573			AddDelay_Int(FP_BUTTONALIGNX, nVP);
574		}
575		else
576		{
577			Field::SetButtonAlignX(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
578		}
579	}
580	else
581	{
582		CFX_PtrArray FieldArray;
583		GetFormFields(m_FieldName,FieldArray);
584		if (FieldArray.GetSize() <= 0) return FALSE;
585
586		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
587		ASSERT(pFormField != NULL);
588
589		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
590			return FALSE;
591
592		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
593		if (!pFormControl)return FALSE;
594
595		CPDF_IconFit IconFit = pFormControl->GetIconFit();
596
597		FX_FLOAT fLeft,fBottom;
598		IconFit.GetIconPosition(fLeft,fBottom);
599
600		vp << (FX_INT32)fLeft;
601	}
602
603	return TRUE;
604}
605
606void Field::SetButtonAlignX(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
607{
608	//Not supported.
609}
610
611FX_BOOL Field::buttonAlignY(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
612{
613	ASSERT(m_pDocument != NULL);
614
615	if (vp.IsSetting())
616	{
617		if (!m_bCanSet) return FALSE;
618
619		int nVP;
620		vp >> nVP;
621
622		if (m_bDelay)
623		{
624			AddDelay_Int(FP_BUTTONALIGNY, nVP);
625		}
626		else
627		{
628			Field::SetButtonAlignY(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
629		}
630	}
631	else
632	{
633		CFX_PtrArray FieldArray;
634		GetFormFields(m_FieldName,FieldArray);
635		if (FieldArray.GetSize() <= 0) return FALSE;
636
637		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
638		ASSERT(pFormField != NULL);
639
640		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
641			return FALSE;
642
643		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
644		if (!pFormControl)return FALSE;
645
646		CPDF_IconFit IconFit = pFormControl->GetIconFit();
647
648		FX_FLOAT fLeft,fBottom;
649		IconFit.GetIconPosition(fLeft,fBottom);
650
651		vp <<  (FX_INT32)fBottom;
652	}
653
654	return TRUE;
655}
656
657void Field::SetButtonAlignY(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
658{
659	//Not supported.
660}
661
662FX_BOOL Field::buttonFitBounds(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
663{
664	ASSERT(m_pDocument != NULL);
665
666	if (vp.IsSetting())
667	{
668		if (!m_bCanSet) return FALSE;
669
670		bool bVP;
671		vp >> bVP;
672
673		if (m_bDelay)
674		{
675			AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
676		}
677		else
678		{
679			Field::SetButtonFitBounds(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
680		}
681	}
682	else
683	{
684		CFX_PtrArray FieldArray;
685		GetFormFields(m_FieldName,FieldArray);
686		if (FieldArray.GetSize() <= 0) return FALSE;
687
688		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
689		ASSERT(pFormField != NULL);
690
691		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
692			return FALSE;
693
694		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
695		if (!pFormControl)return FALSE;
696
697		CPDF_IconFit IconFit = pFormControl->GetIconFit();
698		vp << IconFit.GetFittingBounds();
699	}
700
701	return TRUE;
702}
703
704void Field::SetButtonFitBounds(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
705{
706	//Not supported.
707}
708
709FX_BOOL Field::buttonPosition(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
710{
711	ASSERT(m_pDocument != NULL);
712
713	if (vp.IsSetting())
714	{
715		if (!m_bCanSet) return FALSE;
716
717		int nVP;
718		vp >> nVP;
719
720		if (m_bDelay)
721		{
722			AddDelay_Int(FP_BUTTONPOSITION, nVP);
723		}
724		else
725		{
726			Field::SetButtonPosition(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
727		}
728	}
729	else
730	{
731		CFX_PtrArray FieldArray;
732		GetFormFields(m_FieldName,FieldArray);
733		if (FieldArray.GetSize() <= 0) return FALSE;
734
735		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
736		ASSERT(pFormField != NULL);
737
738		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
739			return FALSE;
740
741		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
742		if (!pFormControl)return FALSE;
743
744		vp <<  pFormControl->GetTextPosition();
745	}
746	return TRUE;
747}
748
749void Field::SetButtonPosition(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
750{
751	//Not supported.
752}
753
754FX_BOOL Field::buttonScaleHow(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
755{
756	ASSERT(m_pDocument != NULL);
757
758	if (vp.IsSetting())
759	{
760		if (!m_bCanSet) return FALSE;
761
762		int nVP;
763		vp >> nVP;
764
765		if (m_bDelay)
766		{
767			AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
768		}
769		else
770		{
771			Field::SetButtonScaleHow(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
772		}
773	}
774	else
775	{
776		CFX_PtrArray FieldArray;
777		GetFormFields(m_FieldName, FieldArray);
778		if (FieldArray.GetSize() <= 0) return FALSE;
779
780		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
781		ASSERT(pFormField != NULL);
782
783		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
784			return FALSE;
785
786		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
787		if (!pFormControl)return FALSE;
788
789		CPDF_IconFit IconFit = pFormControl->GetIconFit();
790		if (IconFit.IsProportionalScale())
791			vp << (FX_INT32)0;
792		else
793			vp << (FX_INT32)1;
794	}
795
796	return TRUE;
797}
798
799void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
800{
801	//Not supported.
802}
803
804FX_BOOL Field::buttonScaleWhen(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
805{
806	ASSERT(m_pDocument != NULL);
807
808	if (vp.IsSetting())
809	{
810		if (!m_bCanSet) return FALSE;
811
812		int nVP;
813		vp >> nVP;
814
815		if (m_bDelay)
816		{
817			AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
818		}
819		else
820		{
821			Field::SetButtonScaleWhen(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
822		}
823	}
824	else
825	{
826		CFX_PtrArray FieldArray;
827		GetFormFields(m_FieldName,FieldArray);
828		if (FieldArray.GetSize() <= 0) return FALSE;
829
830		CPDF_FormField* pFormField = (CPDF_FormField*) FieldArray.ElementAt(0);
831		ASSERT(pFormField != NULL);
832
833		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
834			return FALSE;
835
836		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
837		if (!pFormControl) return FALSE;
838
839		CPDF_IconFit IconFit = pFormControl->GetIconFit();
840		int ScaleM = IconFit.GetScaleMethod();
841		switch (ScaleM)
842		{
843			case CPDF_IconFit::Always :
844				vp <<  (FX_INT32) CPDF_IconFit::Always;
845				break;
846			case CPDF_IconFit::Bigger :
847				vp <<  (FX_INT32) CPDF_IconFit::Bigger;
848				break;
849			case CPDF_IconFit::Never :
850				vp <<  (FX_INT32) CPDF_IconFit::Never;
851				break;
852			case CPDF_IconFit::Smaller :
853				vp <<  (FX_INT32) CPDF_IconFit::Smaller;
854				break;
855		}
856	}
857
858	return TRUE;
859}
860
861void Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
862{
863	//Not supported.
864}
865
866FX_BOOL Field::calcOrderIndex(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
867{
868	ASSERT(m_pDocument != NULL);
869
870	if (vp.IsSetting())
871	{
872		if (!m_bCanSet) return FALSE;
873
874		int nVP;
875		vp >> nVP;
876
877		if (m_bDelay)
878		{
879			AddDelay_Int(FP_CALCORDERINDEX, nVP);
880		}
881		else
882		{
883			Field::SetCalcOrderIndex(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
884		}
885	}
886	else
887	{
888		CFX_PtrArray FieldArray;
889		GetFormFields(m_FieldName, FieldArray);
890		if (FieldArray.GetSize() <= 0) return FALSE;
891
892		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
893		ASSERT(pFormField != NULL);
894
895		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
896			return FALSE;
897
898		CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
899		ASSERT(pRDInterForm != NULL);
900
901		CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
902		ASSERT(pInterForm != NULL);
903
904		vp << (FX_INT32)pInterForm->FindFieldInCalculationOrder(pFormField);
905	}
906
907	return TRUE;
908}
909
910void Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
911{
912	//Not supported.
913}
914
915FX_BOOL Field::charLimit(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
916{
917	ASSERT(m_pDocument != NULL);
918
919	if (vp.IsSetting())
920	{
921		if (!m_bCanSet) return FALSE;
922
923		int nVP;
924		vp >> nVP;
925
926		if (m_bDelay)
927		{
928			AddDelay_Int(FP_CHARLIMIT, nVP);
929		}
930		else
931		{
932			Field::SetCharLimit(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
933		}
934	}
935	else
936	{
937		CFX_PtrArray FieldArray;
938		GetFormFields(m_FieldName, FieldArray);
939		if (FieldArray.GetSize() <= 0) return FALSE;
940
941		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
942		ASSERT(pFormField != NULL);
943
944		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
945			return FALSE;
946
947		vp << (FX_INT32)pFormField->GetMaxLen();
948	}
949	return TRUE;
950}
951
952void Field::SetCharLimit(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
953{
954	//Not supported.
955}
956
957FX_BOOL Field::comb(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
958{
959	ASSERT(m_pDocument != NULL);
960
961	if (vp.IsSetting())
962	{
963		if (!m_bCanSet) return FALSE;
964
965		bool bVP;
966		vp >> bVP;
967
968		if (m_bDelay)
969		{
970			AddDelay_Bool(FP_COMB, bVP);
971		}
972		else
973		{
974			Field::SetComb(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
975		}
976	}
977	else
978	{
979		CFX_PtrArray FieldArray;
980		GetFormFields(m_FieldName,FieldArray);
981		if (FieldArray.GetSize() <= 0) return FALSE;
982
983		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
984		ASSERT(pFormField != NULL);
985
986		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
987			return FALSE;
988
989		if (pFormField->GetFieldFlags() & FIELDFLAG_COMB)
990			vp << true;
991		else
992			vp << false;
993	}
994
995	return TRUE;
996}
997
998void Field::SetComb(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
999{
1000	//Not supported.
1001}
1002
1003FX_BOOL Field::commitOnSelChange(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1004{
1005	ASSERT(m_pDocument != NULL);
1006
1007	if (vp.IsSetting())
1008	{
1009		if (!m_bCanSet) return FALSE;
1010
1011		bool bVP;
1012		vp >> bVP;
1013
1014		if (m_bDelay)
1015		{
1016			AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
1017		}
1018		else
1019		{
1020			Field::SetCommitOnSelChange(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
1021		}
1022	}
1023	else
1024	{
1025		CFX_PtrArray FieldArray;
1026		GetFormFields(m_FieldName,FieldArray);
1027		if (FieldArray.GetSize() <= 0) return FALSE;
1028
1029		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1030		ASSERT(pFormField != NULL);
1031
1032		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
1033			return FALSE;
1034
1035		if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)
1036			vp << true;
1037		else
1038			vp << false;
1039	}
1040
1041	return TRUE;
1042}
1043
1044void Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
1045{
1046	//Not supported.
1047}
1048
1049FX_BOOL Field::currentValueIndices(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1050{
1051	ASSERT(m_pDocument != NULL);
1052
1053	if (vp.IsSetting())
1054	{
1055		if (!m_bCanSet) return FALSE;
1056
1057		CFX_DWordArray array;
1058
1059		if (vp.GetType() == VT_number)
1060		{
1061			int iSelecting = 0;
1062			vp >> iSelecting;
1063			array.Add(iSelecting);
1064		}
1065		else if (vp.IsArrayObject())
1066		{
1067			CJS_Array SelArray(m_isolate);
1068			CJS_Value SelValue(m_isolate);
1069			int iSelecting;
1070			vp >> SelArray;
1071			for (int i=0,sz=SelArray.GetLength(); i<sz; i++)
1072			{
1073				SelArray.GetElement(i,SelValue);
1074				iSelecting = SelValue.ToInt();
1075				array.Add(iSelecting);
1076			}
1077		}
1078
1079		if (m_bDelay)
1080		{
1081			AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
1082		}
1083		else
1084		{
1085			Field::SetCurrentValueIndices(m_pDocument, m_FieldName, m_nFormControlIndex, array);
1086		}
1087	}
1088	else
1089	{
1090		CFX_PtrArray FieldArray;
1091		GetFormFields(m_FieldName,FieldArray);
1092		if (FieldArray.GetSize() <= 0) return FALSE;
1093
1094		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1095		ASSERT(pFormField != NULL);
1096
1097		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX && pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
1098			return FALSE;
1099
1100		if (pFormField->CountSelectedItems() == 1)
1101			vp << pFormField->GetSelectedIndex(0);
1102		else if (pFormField->CountSelectedItems() > 1)
1103		{
1104			CJS_Array SelArray(m_isolate);
1105			for (int i=0,sz=pFormField->CountSelectedItems(); i<sz; i++)
1106			{
1107				SelArray.SetElement(i, CJS_Value(m_isolate,pFormField->GetSelectedIndex(i)));
1108			}
1109			vp << SelArray;
1110		}
1111		else
1112			vp << -1;
1113	}
1114
1115	return TRUE;
1116}
1117
1118void Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
1119								   const CFX_DWordArray& array)
1120{
1121	ASSERT(pDocument != NULL);
1122
1123	CFX_PtrArray FieldArray;
1124	GetFormFields(pDocument, swFieldName, FieldArray);
1125
1126	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
1127	{
1128		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
1129		ASSERT(pFormField != NULL);
1130
1131		int nFieldType = pFormField->GetFieldType();
1132		if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX)
1133		{
1134			FX_DWORD dwFieldFlags = pFormField->GetFieldFlags();
1135			pFormField->ClearSelection(TRUE);
1136
1137			for (int i=0,sz=array.GetSize(); i<sz; i++)
1138			{
1139				if (i>0 && !(dwFieldFlags & (1<<21)))
1140				{
1141					break;
1142				}
1143
1144				int iSelecting = (FX_INT32)array.GetAt(i);
1145				if (iSelecting < pFormField->CountOptions() && !pFormField->IsItemSelected(iSelecting))
1146					pFormField->SetItemSelection(iSelecting, TRUE);
1147
1148			}
1149			UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
1150		}
1151	}
1152}
1153
1154FX_BOOL Field::defaultStyle(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1155{
1156	// MQG sError = JSGetStringFromID(IDS_STRING_NOTSUPPORT);
1157	return FALSE;
1158
1159	if (vp.IsSetting())
1160	{
1161		if (!m_bCanSet) return FALSE;
1162
1163		;
1164	}
1165	else
1166	{
1167		;
1168	}
1169	return TRUE;
1170}
1171
1172void Field::SetDefaultStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
1173{
1174	//Not supported.
1175}
1176
1177FX_BOOL Field::defaultValue(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1178{
1179	ASSERT(m_pDocument != NULL);
1180
1181	if (vp.IsSetting())
1182	{
1183		if (!m_bCanSet) return FALSE;
1184
1185		CFX_WideString WideStr;
1186		vp >> WideStr;
1187
1188		if (m_bDelay)
1189		{
1190			AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
1191		}
1192		else
1193		{
1194			Field::SetDefaultValue(m_pDocument, m_FieldName, m_nFormControlIndex, WideStr);
1195		}
1196	}
1197	else
1198	{
1199		CFX_PtrArray FieldArray;
1200		GetFormFields(m_FieldName,FieldArray);
1201		if (FieldArray.GetSize() <= 0) return FALSE;
1202
1203		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1204		ASSERT(pFormField != NULL);
1205
1206		if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON ||
1207			pFormField->GetFieldType() == FIELDTYPE_SIGNATURE)
1208			return FALSE;
1209
1210		vp << pFormField->GetDefaultValue();
1211	}
1212	return TRUE;
1213}
1214
1215void Field::SetDefaultValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
1216							const CFX_WideString& string)
1217{
1218	//Not supported.
1219}
1220
1221FX_BOOL Field::doNotScroll(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1222{
1223	ASSERT(m_pDocument != NULL);
1224
1225	if (vp.IsSetting())
1226	{
1227		if (!m_bCanSet) return FALSE;
1228
1229		bool bVP;
1230		vp >> bVP;
1231
1232		if (m_bDelay)
1233		{
1234			AddDelay_Bool(FP_DONOTSCROLL, bVP);
1235		}
1236		else
1237		{
1238			Field::SetDoNotScroll(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
1239		}
1240	}
1241	else
1242	{
1243		CFX_PtrArray FieldArray;
1244		GetFormFields(m_FieldName,FieldArray);
1245		if (FieldArray.GetSize() <= 0) return FALSE;
1246
1247		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1248		ASSERT(pFormField != NULL);
1249
1250		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1251			return FALSE;
1252
1253		if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)
1254			vp << true;
1255		else
1256			vp << false;
1257	}
1258
1259	return TRUE;
1260}
1261
1262void Field::SetDoNotScroll(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
1263{
1264	//Not supported.
1265}
1266
1267FX_BOOL Field::doNotSpellCheck(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1268{
1269	ASSERT(m_pDocument != NULL);
1270
1271	if (vp.IsSetting())
1272	{
1273		if (!m_bCanSet) return FALSE;
1274
1275		bool bVP;
1276		vp >> bVP;
1277	}
1278	else
1279	{
1280		CFX_PtrArray FieldArray;
1281		GetFormFields(m_FieldName,FieldArray);
1282		if (FieldArray.GetSize() <= 0) return FALSE;
1283
1284		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1285		ASSERT(pFormField != NULL);
1286
1287		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD &&
1288			pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
1289			return FALSE;
1290
1291		if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)
1292			vp << true;
1293		else
1294			vp << false;
1295	}
1296
1297	return TRUE;
1298}
1299
1300void Field::SetDelay(FX_BOOL bDelay)
1301{
1302	m_bDelay = bDelay;
1303
1304	if (!m_bDelay)
1305	{
1306		if (m_pJSDoc)
1307			m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
1308	}
1309}
1310
1311FX_BOOL Field::delay(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1312{
1313	if (vp.IsSetting())
1314	{
1315		if (!m_bCanSet) return FALSE;
1316
1317		bool bVP;
1318		vp >> bVP;
1319
1320		SetDelay(bVP);
1321	}
1322	else
1323	{
1324		vp << m_bDelay;
1325	}
1326	return TRUE;
1327}
1328
1329FX_BOOL Field::display(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1330{
1331	ASSERT(m_pDocument != NULL);
1332
1333	if (vp.IsSetting())
1334	{
1335		if (!m_bCanSet) return FALSE;
1336
1337		int nVP;
1338		vp >> nVP;
1339
1340		if (m_bDelay)
1341		{
1342			AddDelay_Int(FP_DISPLAY, nVP);
1343		}
1344		else
1345		{
1346			Field::SetDisplay(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
1347		}
1348	}
1349	else
1350	{
1351		CFX_PtrArray FieldArray;
1352		GetFormFields(m_FieldName,FieldArray);
1353		if (FieldArray.GetSize() <= 0) return FALSE;
1354
1355		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1356		ASSERT(pFormField != NULL);
1357
1358		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
1359		ASSERT(pInterForm != NULL);
1360
1361		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1362		if (!pWidget)return FALSE;
1363
1364		FX_DWORD dwFlag = pWidget->GetFlags();
1365
1366		if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
1367		{
1368			vp << (FX_INT32)1;
1369		}
1370		else
1371		{
1372			if (ANNOTFLAG_PRINT & dwFlag)
1373			{
1374				if (ANNOTFLAG_NOVIEW & dwFlag)
1375				{
1376					vp << (FX_INT32)3;
1377				}
1378				else
1379				{
1380					vp << (FX_INT32)0;
1381				}
1382			}
1383			else
1384			{
1385				vp << (FX_INT32)2;
1386			}
1387		}
1388	}
1389
1390	return TRUE;
1391}
1392
1393void Field::SetDisplay(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
1394{
1395	ASSERT(pDocument != NULL);
1396
1397	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
1398	ASSERT(pInterForm != NULL);
1399
1400	CFX_PtrArray FieldArray;
1401	GetFormFields(pDocument, swFieldName, FieldArray);
1402
1403	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
1404	{
1405		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
1406		ASSERT(pFormField != NULL);
1407
1408		if (nControlIndex < 0)
1409		{
1410			FX_BOOL bSet = FALSE;
1411			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
1412			{
1413				CPDF_FormControl* pFormControl = pFormField->GetControl(j);
1414				ASSERT(pFormControl != NULL);
1415
1416				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
1417				{
1418					FX_DWORD dwFlag = pWidget->GetFlags();
1419					switch (number)
1420					{
1421					case 0:
1422						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1423						dwFlag &= (~ANNOTFLAG_HIDDEN);
1424						dwFlag &= (~ANNOTFLAG_NOVIEW);
1425						dwFlag |= ANNOTFLAG_PRINT;
1426						break;
1427					case 1:
1428						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1429						dwFlag &= (~ANNOTFLAG_NOVIEW);
1430						dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
1431						break;
1432					case 2:
1433						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1434						dwFlag &= (~ANNOTFLAG_PRINT);
1435						dwFlag &= (~ANNOTFLAG_HIDDEN);
1436						dwFlag &= (~ANNOTFLAG_NOVIEW);
1437						break;
1438					case 3:
1439						dwFlag |= ANNOTFLAG_NOVIEW;
1440						dwFlag |= ANNOTFLAG_PRINT;
1441						dwFlag &= (~ANNOTFLAG_HIDDEN);
1442						break;
1443					}
1444
1445					if (dwFlag != pWidget->GetFlags())
1446					{
1447						pWidget->SetFlags(dwFlag);
1448						bSet = TRUE;
1449					}
1450				}
1451			}
1452
1453			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
1454		}
1455		else
1456		{
1457			if(nControlIndex >= pFormField->CountControls()) return;
1458			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
1459			{
1460				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
1461				{
1462
1463					FX_DWORD dwFlag = pWidget->GetFlags();
1464					switch (number)
1465					{
1466					case 0:
1467						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1468						dwFlag &= (~ANNOTFLAG_HIDDEN);
1469						dwFlag &= (~ANNOTFLAG_NOVIEW);
1470						dwFlag |= ANNOTFLAG_PRINT;
1471						break;
1472					case 1:
1473						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1474						dwFlag &= (~ANNOTFLAG_NOVIEW);
1475						dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
1476						break;
1477					case 2:
1478						dwFlag &= (~ANNOTFLAG_INVISIBLE);
1479						dwFlag &= (~ANNOTFLAG_PRINT);
1480						dwFlag &= (~ANNOTFLAG_HIDDEN);
1481						dwFlag &= (~ANNOTFLAG_NOVIEW);
1482						break;
1483					case 3:
1484						dwFlag |= ANNOTFLAG_NOVIEW;
1485						dwFlag |= ANNOTFLAG_PRINT;
1486						dwFlag &= (~ANNOTFLAG_HIDDEN);
1487						break;
1488					}
1489					if (dwFlag != pWidget->GetFlags())
1490					{
1491						pWidget->SetFlags(dwFlag);
1492						UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
1493					}
1494				}
1495			}
1496		}
1497	}
1498}
1499
1500FX_BOOL Field::doc(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1501{
1502	if (!vp.IsGetting()) {
1503		return FALSE;
1504	}
1505	vp << m_pJSDoc->GetCJSDoc();
1506	return TRUE;
1507}
1508
1509FX_BOOL Field::editable(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1510{
1511	ASSERT(m_pDocument != NULL);
1512	if (vp.IsSetting())
1513	{
1514		if (!m_bCanSet) return FALSE;
1515
1516		bool bVP;
1517		vp >> bVP;
1518	}
1519	else
1520	{
1521		CFX_PtrArray FieldArray;
1522		GetFormFields(m_FieldName, FieldArray);
1523		if (FieldArray.GetSize() <= 0) return FALSE;
1524
1525		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1526		ASSERT(pFormField != NULL);
1527
1528		if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
1529			return FALSE;
1530
1531		if (pFormField->GetFieldFlags() & FIELDFLAG_EDIT)
1532			vp << true;
1533		else
1534			vp << false;
1535	}
1536
1537	return TRUE;
1538}
1539
1540FX_BOOL Field::exportValues(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1541{
1542	ASSERT(m_pDocument != NULL);
1543
1544	CFX_PtrArray FieldArray;
1545	GetFormFields(m_FieldName,FieldArray);
1546	if (FieldArray.GetSize() <= 0) return FALSE;
1547
1548	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1549	ASSERT(pFormField != NULL);
1550
1551	if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
1552		pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
1553		return FALSE;
1554
1555	if (vp.IsSetting())
1556	{
1557		if (!m_bCanSet) return FALSE;
1558		if (!vp.IsArrayObject())return FALSE;
1559	}
1560	else
1561	{
1562		CJS_Array ExportValusArray(m_isolate);
1563
1564		if (m_nFormControlIndex < 0)
1565		{
1566			for (int i=0,sz=pFormField->CountControls(); i<sz; i++)
1567			{
1568				CPDF_FormControl* pFormControl = pFormField->GetControl(i);
1569				ASSERT(pFormControl != NULL);
1570
1571				ExportValusArray.SetElement(i, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
1572			}
1573		}
1574		else
1575		{
1576			if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
1577			CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex);
1578			if (!pFormControl) return FALSE;
1579
1580			ExportValusArray.SetElement(0, CJS_Value(m_isolate,pFormControl->GetExportValue().c_str()));
1581		}
1582
1583		vp << ExportValusArray;
1584	}
1585
1586	return TRUE;
1587}
1588
1589FX_BOOL Field::fileSelect(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1590{
1591	ASSERT(m_pDocument != NULL);
1592
1593	CFX_PtrArray FieldArray;
1594	GetFormFields(m_FieldName, FieldArray);
1595	if (FieldArray.GetSize() <= 0) return FALSE;
1596
1597	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1598	ASSERT(pFormField != NULL);
1599
1600	if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1601		return FALSE;
1602
1603	if (vp.IsSetting())
1604	{
1605		if (!m_bCanSet) return FALSE;
1606
1607		bool bVP;
1608		vp >> bVP;
1609
1610	}
1611	else
1612	{
1613		if (pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)
1614			vp << true;
1615		else
1616			vp << false;
1617	}
1618
1619	return TRUE;
1620}
1621
1622FX_BOOL Field::fillColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1623{
1624	ASSERT(m_pDocument != NULL);
1625
1626	CJS_Array crArray(m_isolate);
1627
1628	CFX_PtrArray FieldArray;
1629	GetFormFields(m_FieldName,FieldArray);
1630	if (FieldArray.GetSize() <= 0) return FALSE;
1631
1632	if (vp.IsSetting())
1633	{
1634		if (!m_bCanSet) return FALSE;
1635		if (!vp.IsArrayObject()) return FALSE;
1636
1637		vp >> crArray;
1638
1639		CPWL_Color color;
1640		color::ConvertArrayToPWLColor(crArray, color);
1641
1642		if (m_bDelay)
1643		{
1644			AddDelay_Color(FP_FILLCOLOR, color);
1645		}
1646		else
1647		{
1648			Field::SetFillColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
1649		}
1650	}
1651	else
1652	{
1653		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1654		ASSERT(pFormField != NULL);
1655
1656		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1657		if (!pFormControl)return FALSE;
1658
1659		int iColorType;
1660		pFormControl->GetBackgroundColor(iColorType);
1661
1662		CPWL_Color color;
1663
1664		if (iColorType == COLORTYPE_TRANSPARENT)
1665		{
1666			color = CPWL_Color(COLORTYPE_TRANSPARENT);
1667		}
1668		else if (iColorType == COLORTYPE_GRAY)
1669		{
1670			color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBackgroundColor(0));
1671		}
1672		else if (iColorType == COLORTYPE_RGB)
1673		{
1674			color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBackgroundColor(0),
1675				pFormControl->GetOriginalBackgroundColor(1),
1676				pFormControl->GetOriginalBackgroundColor(2));
1677		}
1678		else if (iColorType == COLORTYPE_CMYK)
1679		{
1680			color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBackgroundColor(0),
1681				pFormControl->GetOriginalBackgroundColor(1),
1682				pFormControl->GetOriginalBackgroundColor(2),
1683				pFormControl->GetOriginalBackgroundColor(3));
1684		}
1685		else
1686			return FALSE;
1687
1688		color::ConvertPWLColorToArray(color, crArray);
1689        vp  <<  crArray;
1690	}
1691
1692	return TRUE;
1693}
1694
1695void Field::SetFillColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
1696{
1697	//Not supported.
1698}
1699
1700FX_BOOL Field::hidden(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1701{
1702	ASSERT(m_pDocument != NULL);
1703
1704	if (vp.IsSetting())
1705	{
1706		if (!m_bCanSet) return FALSE;
1707
1708		bool bVP;
1709		vp >> bVP;
1710
1711		if (m_bDelay)
1712		{
1713			AddDelay_Bool(FP_HIDDEN, bVP);
1714		}
1715		else
1716		{
1717			Field::SetHidden(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
1718		}
1719	}
1720	else
1721	{
1722		CFX_PtrArray FieldArray;
1723		GetFormFields(m_FieldName,FieldArray);
1724		if (FieldArray.GetSize() <= 0) return FALSE;
1725
1726		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1727		ASSERT(pFormField != NULL);
1728
1729		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
1730		ASSERT(pInterForm != NULL);
1731
1732		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1733		if (!pWidget) return FALSE;
1734
1735		FX_DWORD dwFlags = pWidget->GetFlags();
1736
1737		if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags)
1738		{
1739			vp << true;
1740		}
1741		else
1742			vp << false;
1743	}
1744
1745	return TRUE;
1746}
1747
1748void Field::SetHidden(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
1749{
1750	ASSERT(pDocument != NULL);
1751
1752	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
1753	ASSERT(pInterForm != NULL);
1754
1755	CFX_PtrArray FieldArray;
1756	GetFormFields(pDocument, swFieldName, FieldArray);
1757
1758	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
1759	{
1760		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
1761		ASSERT(pFormField != NULL);
1762
1763		if (nControlIndex < 0)
1764		{
1765			FX_BOOL bSet = FALSE;
1766			for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
1767			{
1768				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
1769				{
1770					FX_DWORD dwFlags = pWidget->GetFlags();
1771
1772					if (b)
1773					{
1774						dwFlags &= (~ANNOTFLAG_INVISIBLE);
1775						dwFlags &= (~ANNOTFLAG_NOVIEW);
1776						dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
1777					}
1778					else
1779					{
1780						dwFlags &= (~ANNOTFLAG_INVISIBLE);
1781						dwFlags &= (~ANNOTFLAG_HIDDEN);
1782						dwFlags &= (~ANNOTFLAG_NOVIEW);
1783						dwFlags |= ANNOTFLAG_PRINT;
1784					}
1785
1786					if (dwFlags != pWidget->GetFlags())
1787					{
1788						pWidget->SetFlags(dwFlags);
1789						bSet = TRUE;
1790					}
1791				}
1792			}
1793
1794			if (bSet)
1795				UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
1796		}
1797		else
1798		{
1799			if(nControlIndex >= pFormField->CountControls()) return;
1800			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
1801			{
1802				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
1803				{
1804					FX_DWORD dwFlags = pWidget->GetFlags();
1805
1806					if (b)
1807					{
1808						dwFlags &= (~ANNOTFLAG_INVISIBLE);
1809						dwFlags &= (~ANNOTFLAG_NOVIEW);
1810						dwFlags |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
1811					}
1812					else
1813					{
1814						dwFlags &= (~ANNOTFLAG_INVISIBLE);
1815						dwFlags &= (~ANNOTFLAG_HIDDEN);
1816						dwFlags &= (~ANNOTFLAG_NOVIEW);
1817						dwFlags |= ANNOTFLAG_PRINT;
1818					}
1819
1820					if (dwFlags != pWidget->GetFlags())
1821					{
1822						pWidget->SetFlags(dwFlags);
1823						UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
1824					}
1825				}
1826			}
1827		}
1828	}
1829}
1830
1831FX_BOOL Field::highlight(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1832{
1833	ASSERT(m_pDocument != NULL);
1834
1835	if (vp.IsSetting())
1836	{
1837		if (!m_bCanSet) return FALSE;
1838
1839		CFX_ByteString strMode;
1840		vp >> strMode;
1841
1842		if (m_bDelay)
1843		{
1844			AddDelay_String(FP_HIGHLIGHT, strMode);
1845		}
1846		else
1847		{
1848			Field::SetHighlight(m_pDocument, m_FieldName, m_nFormControlIndex, strMode);
1849		}
1850	}
1851	else
1852	{
1853		CFX_PtrArray FieldArray;
1854		GetFormFields(m_FieldName,FieldArray);
1855		if (FieldArray.GetSize() <= 0) return FALSE;
1856
1857		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1858		ASSERT(pFormField != NULL);
1859
1860		if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
1861			return FALSE;
1862
1863		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1864		if (!pFormControl) return FALSE;
1865
1866		int eHM = pFormControl->GetHighlightingMode();
1867		switch (eHM)
1868		{
1869		case CPDF_FormControl::None:
1870			vp  <<  L"none";
1871			break;
1872		case CPDF_FormControl::Push:
1873			vp  <<  L"push";
1874			break;
1875		case CPDF_FormControl::Invert:
1876			vp  <<  L"invert";
1877			break;
1878		case CPDF_FormControl::Outline:
1879			vp  <<  L"outline";
1880			break;
1881		case CPDF_FormControl::Toggle:
1882			 vp  <<  L"toggle";
1883			 break;
1884		}
1885	}
1886
1887	return TRUE;
1888}
1889
1890void Field::SetHighlight(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
1891{
1892	//Not supported.
1893}
1894
1895FX_BOOL Field::lineWidth(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1896{
1897	ASSERT(m_pDocument != NULL);
1898
1899	if (vp.IsSetting())
1900	{
1901		if (!m_bCanSet) return FALSE;
1902
1903		int iWidth;
1904		vp >> iWidth;
1905
1906		if (m_bDelay)
1907		{
1908			AddDelay_Int(FP_LINEWIDTH, iWidth);
1909		}
1910		else
1911		{
1912			Field::SetLineWidth(m_pDocument, m_FieldName, m_nFormControlIndex, iWidth);
1913		}
1914	}
1915	else
1916	{
1917		CFX_PtrArray FieldArray;
1918		GetFormFields(m_FieldName,FieldArray);
1919		if (FieldArray.GetSize() <= 0) return FALSE;
1920
1921		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
1922		ASSERT(pFormField != NULL);
1923
1924		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1925		if (!pFormControl) return FALSE;
1926
1927		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
1928		ASSERT(pInterForm != NULL);
1929
1930		if(!pFormField->CountControls()) return FALSE;
1931
1932		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
1933		if (!pWidget) return FALSE;
1934
1935		vp << (FX_INT32)pWidget->GetBorderWidth();
1936	}
1937
1938	return TRUE;
1939}
1940
1941void Field::SetLineWidth(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
1942{
1943	ASSERT(pDocument != NULL);
1944
1945	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
1946	ASSERT(pInterForm != NULL);
1947
1948	CFX_PtrArray FieldArray;
1949	GetFormFields(pDocument, swFieldName, FieldArray);
1950
1951	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
1952	{
1953		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
1954		ASSERT(pFormField != NULL);
1955
1956		if (nControlIndex < 0)
1957		{
1958			FX_BOOL bSet = FALSE;
1959			for (int j=0,jsz=pFormField->CountControls(); j<jsz; j++)
1960			{
1961				CPDF_FormControl* pFormControl = pFormField->GetControl(j);
1962				ASSERT(pFormControl != NULL);
1963
1964				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
1965				{
1966					if (number != pWidget->GetBorderWidth())
1967					{
1968						pWidget->SetBorderWidth(number);
1969						bSet = TRUE;
1970					}
1971				}
1972			}
1973			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
1974		}
1975		else
1976		{
1977			if(nControlIndex >= pFormField->CountControls()) return;
1978			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
1979			{
1980				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
1981				{
1982					if (number != pWidget->GetBorderWidth())
1983					{
1984						pWidget->SetBorderWidth(number);
1985						UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
1986					}
1987				}
1988			}
1989		}
1990	}
1991}
1992
1993FX_BOOL Field::multiline(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
1994{
1995	ASSERT(m_pDocument != NULL);
1996
1997	if (vp.IsSetting())
1998	{
1999		if (!m_bCanSet) return FALSE;
2000
2001		bool bVP;
2002		vp >> bVP;
2003
2004		if (m_bDelay)
2005		{
2006			AddDelay_Bool(FP_MULTILINE, bVP);
2007		}
2008		else
2009		{
2010			Field::SetMultiline(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
2011		}
2012	}
2013	else
2014	{
2015		CFX_PtrArray FieldArray;
2016		GetFormFields(m_FieldName, FieldArray);
2017		if (FieldArray.GetSize() <= 0) return FALSE;
2018
2019		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2020		ASSERT(pFormField != NULL);
2021
2022		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
2023			return FALSE;
2024
2025		if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)
2026			vp << true;
2027		else
2028			vp << false;
2029	}
2030
2031	return TRUE;
2032}
2033
2034void Field::SetMultiline(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
2035{
2036	//Not supported.
2037}
2038
2039FX_BOOL Field::multipleSelection(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2040{
2041	ASSERT(m_pDocument != NULL);
2042
2043	if (vp.IsSetting())
2044	{
2045		if (!m_bCanSet) return FALSE;
2046
2047		bool bVP;
2048		vp >> bVP;
2049
2050		if (m_bDelay)
2051		{
2052			AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
2053		}
2054		else
2055		{
2056			Field::SetMultipleSelection(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
2057		}
2058	}
2059	else
2060	{
2061		CFX_PtrArray FieldArray;
2062		GetFormFields(m_FieldName,FieldArray);
2063		if (FieldArray.GetSize() <= 0) return FALSE;
2064
2065		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2066		ASSERT(pFormField != NULL);
2067
2068		if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
2069			return FALSE;
2070
2071		if (pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)
2072			vp << true;
2073		else
2074			vp << false;
2075	}
2076
2077	return TRUE;
2078}
2079
2080void Field::SetMultipleSelection(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
2081{
2082	//Not supported.
2083}
2084
2085FX_BOOL Field::name(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2086{
2087	if (!vp.IsGetting()) return FALSE;
2088
2089	CFX_PtrArray FieldArray;
2090	GetFormFields(m_FieldName, FieldArray);
2091	if (FieldArray.GetSize() <= 0) return FALSE;
2092
2093   	vp << m_FieldName;
2094
2095	return TRUE;
2096}
2097
2098FX_BOOL Field::numItems(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2099{
2100	CFX_PtrArray FieldArray;
2101	GetFormFields(m_FieldName, FieldArray);
2102	if (FieldArray.GetSize() <= 0) return FALSE;
2103
2104	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2105	ASSERT(pFormField != NULL);
2106
2107	if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
2108		pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
2109		return FALSE;
2110
2111	if (!vp.IsGetting()) return FALSE;
2112
2113	vp << (FX_INT32)pFormField->CountOptions();
2114
2115	return TRUE;
2116}
2117
2118FX_BOOL Field::page(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2119{
2120	if (!vp.IsGetting()) return FALSE;
2121
2122	CFX_PtrArray FieldArray;
2123	GetFormFields(m_FieldName, FieldArray);
2124	if (FieldArray.GetSize() <= 0) return FALSE;
2125
2126	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2127	if (!pFormField) return FALSE;
2128
2129	ASSERT(m_pDocument != NULL);
2130
2131	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
2132	ASSERT(pInterForm != NULL);
2133
2134	CFX_PtrArray widgetArray;
2135	pInterForm->GetWidgets(pFormField, widgetArray);
2136
2137	if (widgetArray.GetSize() > 0)
2138	{
2139		CJS_Array PageArray(m_isolate);
2140
2141		for (int i=0,sz=widgetArray.GetSize(); i<sz; i++)
2142		{
2143			CPDFSDK_Widget* pWidget = (CPDFSDK_Widget*)widgetArray.GetAt(i);
2144			ASSERT(pWidget != NULL);
2145
2146			CPDFSDK_PageView* pPageView = pWidget->GetPageView();
2147			if(!pPageView)
2148				return FALSE;
2149
2150			PageArray.SetElement(i, CJS_Value(m_isolate,(FX_INT32)pPageView->GetPageIndex()));
2151		}
2152
2153		vp << PageArray;
2154	}
2155	else
2156	{
2157		vp << (FX_INT32) -1;
2158	}
2159
2160	return TRUE;
2161}
2162
2163FX_BOOL Field::password(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2164{
2165	ASSERT(m_pDocument != NULL);
2166
2167	if (vp.IsSetting())
2168	{
2169		if (!m_bCanSet) return FALSE;
2170
2171		bool bVP;
2172		vp >> bVP;
2173
2174		if (m_bDelay)
2175		{
2176			AddDelay_Bool(FP_PASSWORD, bVP);
2177		}
2178		else
2179		{
2180			Field::SetPassword(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
2181		}
2182	}
2183	else
2184	{
2185		CFX_PtrArray FieldArray;
2186		GetFormFields(m_FieldName,FieldArray);
2187		if (FieldArray.GetSize() <= 0) return FALSE;
2188
2189		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2190		ASSERT(pFormField != NULL);
2191
2192		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
2193			return FALSE;
2194
2195		if (pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)
2196			vp << true;
2197		else
2198			vp << false;
2199	}
2200
2201	return TRUE;
2202}
2203
2204void Field::SetPassword(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
2205{
2206	//Not supported.
2207}
2208
2209FX_BOOL Field::print(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2210{
2211	ASSERT(m_pDocument != NULL);
2212
2213	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
2214	ASSERT(pInterForm != NULL);
2215
2216	CFX_PtrArray FieldArray;
2217	GetFormFields(m_FieldName, FieldArray);
2218	if (FieldArray.GetSize() <= 0) return FALSE;
2219
2220	if (vp.IsSetting())
2221	{
2222		if (!m_bCanSet) return FALSE;
2223
2224		bool bVP;
2225		vp >> bVP;
2226
2227		for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
2228		{
2229			CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
2230			ASSERT(pFormField != NULL);
2231
2232			if (m_nFormControlIndex < 0)
2233			{
2234				FX_BOOL bSet = FALSE;
2235				for (int j=0,jsz = pFormField->CountControls(); j<jsz; j++)
2236				{
2237					if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(j)))
2238					{
2239						FX_DWORD dwFlags = pWidget->GetFlags();
2240						if (bVP)
2241							dwFlags |= ANNOTFLAG_PRINT;
2242						else
2243							dwFlags &= ~ANNOTFLAG_PRINT;
2244
2245						if (dwFlags != pWidget->GetFlags())
2246						{
2247							pWidget->SetFlags(dwFlags);
2248							bSet = TRUE;
2249						}
2250					}
2251				}
2252
2253				if (bSet)
2254					UpdateFormField(m_pDocument, pFormField, TRUE, FALSE, TRUE);
2255			}
2256			else
2257			{
2258				if(m_nFormControlIndex >= pFormField->CountControls()) return FALSE;
2259				if (CPDF_FormControl* pFormControl = pFormField->GetControl(m_nFormControlIndex))
2260				{
2261					if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
2262					{
2263						FX_DWORD dwFlags = pWidget->GetFlags();
2264						if (bVP)
2265							dwFlags |= ANNOTFLAG_PRINT;
2266						else
2267							dwFlags &= ~ANNOTFLAG_PRINT;
2268
2269						if (dwFlags != pWidget->GetFlags())
2270						{
2271							pWidget->SetFlags(dwFlags);
2272							UpdateFormControl(m_pDocument, pFormField->GetControl(m_nFormControlIndex), TRUE, FALSE, TRUE);
2273						}
2274					}
2275				}
2276			}
2277		}
2278	}
2279	else
2280	{
2281		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2282		ASSERT(pFormField != NULL);
2283
2284		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
2285		if (!pWidget) return FALSE;
2286
2287		if (pWidget->GetFlags() & ANNOTFLAG_PRINT)
2288			vp << true;
2289		else
2290			vp << false;
2291	}
2292
2293	return TRUE;
2294}
2295
2296FX_BOOL Field::radiosInUnison(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2297{
2298	ASSERT(m_pDocument != NULL);
2299
2300	CFX_PtrArray FieldArray;
2301	GetFormFields(m_FieldName,FieldArray);
2302	if (FieldArray.GetSize() <= 0) return FALSE;
2303
2304	if (vp.IsSetting())
2305	{
2306		if (!m_bCanSet) return FALSE;
2307
2308		bool bVP;
2309		vp >> bVP;
2310
2311	}
2312	else
2313	{
2314		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2315		ASSERT(pFormField != NULL);
2316
2317		if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
2318			return FALSE;
2319
2320		if (pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)
2321			vp << true;
2322		else
2323			vp << false;
2324	}
2325
2326	return TRUE;
2327}
2328
2329FX_BOOL Field::readonly(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2330{
2331	ASSERT(m_pDocument != NULL);
2332
2333	CFX_PtrArray FieldArray;
2334	GetFormFields(m_FieldName,FieldArray);
2335	if (FieldArray.GetSize() <= 0) return FALSE;
2336
2337	if (vp.IsSetting())
2338	{
2339		if (!m_bCanSet) return FALSE;
2340
2341		bool bVP;
2342		vp >> bVP;
2343
2344	}
2345	else
2346	{
2347		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2348		ASSERT(pFormField != NULL);
2349
2350		if (pFormField->GetFieldFlags() & FIELDFLAG_READONLY)
2351			vp << true;
2352		else
2353			vp << false;
2354	}
2355
2356	return TRUE;
2357}
2358
2359FX_BOOL Field::rect(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2360{
2361	ASSERT(m_pDocument != NULL);
2362
2363	if (vp.IsSetting())
2364	{
2365		if (!m_bCanSet) return FALSE;
2366		if (!vp.IsArrayObject())return FALSE;
2367
2368		CJS_Array rcArray(m_isolate);
2369		vp >> rcArray;
2370		CJS_Value Upper_Leftx(m_isolate), Upper_Lefty(m_isolate), Lower_Rightx(m_isolate), Lower_Righty(m_isolate);
2371		rcArray.GetElement(0, Upper_Leftx);
2372		rcArray.GetElement(1, Upper_Lefty);
2373		rcArray.GetElement(2, Lower_Rightx);
2374		rcArray.GetElement(3, Lower_Righty);
2375
2376		FX_FLOAT pArray[4] = {0.0f,0.0f,0.0f,0.0f};
2377		pArray[0] = (FX_FLOAT)Upper_Leftx.ToInt();
2378		pArray[1] = (FX_FLOAT)Lower_Righty.ToInt();
2379		pArray[2] = (FX_FLOAT)Lower_Rightx.ToInt();
2380		pArray[3] = (FX_FLOAT)Upper_Lefty.ToInt();
2381
2382		CPDF_Rect crRect(pArray);
2383
2384		if (m_bDelay)
2385		{
2386			AddDelay_Rect(FP_RECT, crRect);
2387		}
2388		else
2389		{
2390			Field::SetRect(m_pDocument, m_FieldName, m_nFormControlIndex, crRect);
2391		}
2392	}
2393	else
2394	{
2395		CFX_PtrArray FieldArray;
2396		GetFormFields(m_FieldName,FieldArray);
2397		if (FieldArray.GetSize() <= 0) return FALSE;
2398
2399		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2400		ASSERT(pFormField != NULL);
2401
2402		CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
2403		ASSERT(pInterForm != NULL);
2404
2405		CPDFSDK_Widget* pWidget = pInterForm->GetWidget(GetSmartFieldControl(pFormField));
2406		if (!pWidget) return FALSE;
2407
2408		CFX_FloatRect crRect = pWidget->GetRect();
2409		CJS_Value Upper_Leftx(m_isolate),Upper_Lefty(m_isolate),Lower_Rightx(m_isolate),Lower_Righty(m_isolate);
2410		Upper_Leftx = (FX_INT32)crRect.left;
2411		Upper_Lefty = (FX_INT32)crRect.top;
2412		Lower_Rightx = (FX_INT32)crRect.right;
2413		Lower_Righty = (FX_INT32)crRect.bottom;
2414
2415		CJS_Array rcArray(m_isolate);
2416		rcArray.SetElement(0,Upper_Leftx);
2417		rcArray.SetElement(1,Upper_Lefty);
2418		rcArray.SetElement(2,Lower_Rightx);
2419		rcArray.SetElement(3,Lower_Righty);
2420
2421		vp  <<  rcArray;
2422	}
2423
2424	return TRUE;
2425}
2426
2427void Field::SetRect(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPDF_Rect& rect)
2428{
2429	ASSERT(pDocument != NULL);
2430
2431	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
2432	ASSERT(pInterForm != NULL);
2433
2434	CFX_PtrArray FieldArray;
2435	GetFormFields(pDocument, swFieldName, FieldArray);
2436
2437	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
2438	{
2439		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
2440		ASSERT(pFormField != NULL);
2441
2442		if (nControlIndex < 0)
2443		{
2444			FX_BOOL bSet = FALSE;
2445			for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
2446			{
2447				CPDF_FormControl* pFormControl = pFormField->GetControl(i);
2448				ASSERT(pFormControl != NULL);
2449
2450				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
2451				{
2452					CPDF_Rect crRect = rect;
2453
2454					CPDF_Page* pPDFPage = pWidget->GetPDFPage();
2455					ASSERT(pPDFPage != NULL);
2456
2457// 					CPDF_Page* pPDFPage = pPage->GetPage();
2458// 					ASSERT(pPDFPage != NULL);
2459
2460					crRect.Intersect(pPDFPage->GetPageBBox());
2461
2462					if (!crRect.IsEmpty())
2463					{
2464						CPDF_Rect rcOld = pWidget->GetRect();
2465						if (crRect.left != rcOld.left ||
2466							crRect.right != rcOld.right ||
2467							crRect.top != rcOld.top ||
2468							crRect.bottom != rcOld.bottom)
2469						{
2470							pWidget->SetRect(crRect);
2471							bSet = TRUE;
2472						}
2473					}
2474				}
2475			}
2476
2477			if (bSet) UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
2478		}
2479		else
2480		{
2481			if(nControlIndex >= pFormField->CountControls()) return;
2482			if (CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex))
2483			{
2484				if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl))
2485				{
2486					CPDF_Rect crRect = rect;
2487
2488					CPDF_Page* pPDFPage = pWidget->GetPDFPage();
2489					ASSERT(pPDFPage != NULL);
2490
2491// 					CPDF_Page* pPDFPage = pPage->GetPage();
2492// 					ASSERT(pPDFPage != NULL);
2493
2494					crRect.Intersect(pPDFPage->GetPageBBox());
2495
2496					if (!crRect.IsEmpty())
2497					{
2498						CPDF_Rect rcOld = pWidget->GetRect();
2499						if (crRect.left != rcOld.left ||
2500							crRect.right != rcOld.right ||
2501							crRect.top != rcOld.top ||
2502							crRect.bottom != rcOld.bottom)
2503						{
2504							pWidget->SetRect(crRect);
2505							UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
2506						}
2507					}
2508				}
2509			}
2510		}
2511	}
2512}
2513
2514FX_BOOL Field::required(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2515{
2516	ASSERT(m_pDocument != NULL);
2517
2518	CFX_PtrArray FieldArray;
2519	GetFormFields(m_FieldName,FieldArray);
2520	if (FieldArray.GetSize() <= 0) return FALSE;
2521
2522	if (vp.IsSetting())
2523	{
2524		if (!m_bCanSet) return FALSE;
2525
2526
2527		bool bVP;
2528		vp >> bVP;
2529
2530	}
2531	else
2532	{
2533		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2534		ASSERT(pFormField != NULL);
2535
2536		if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
2537			return FALSE;
2538
2539		if (pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)
2540			vp << true;
2541		else
2542			vp << false;
2543	}
2544
2545	return TRUE;
2546}
2547
2548FX_BOOL Field::richText(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2549{
2550	ASSERT(m_pDocument != NULL);
2551
2552	if (vp.IsSetting())
2553	{
2554		if (!m_bCanSet) return FALSE;
2555
2556		bool bVP;
2557		vp >> bVP;
2558
2559		if (m_bDelay)
2560		{
2561			AddDelay_Bool(FP_RICHTEXT, bVP);
2562		}
2563		else
2564		{
2565			Field::SetRichText(m_pDocument, m_FieldName, m_nFormControlIndex, bVP);
2566		}
2567	}
2568	else
2569	{
2570		CFX_PtrArray FieldArray;
2571		GetFormFields(m_FieldName,FieldArray);
2572		if (FieldArray.GetSize() <= 0) return FALSE;
2573
2574		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2575		ASSERT(pFormField != NULL);
2576
2577		if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
2578			return FALSE;
2579
2580		if (pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)
2581			vp << true;
2582		else
2583			vp << false;
2584	}
2585
2586	return TRUE;
2587}
2588
2589void Field::SetRichText(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, bool b)
2590{
2591	//Not supported.
2592}
2593
2594FX_BOOL Field::richValue(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2595{
2596	return TRUE;
2597	if (vp.IsSetting())
2598	{
2599		if (!m_bCanSet) return FALSE;
2600		;
2601	}
2602	else
2603	{
2604		;
2605	}
2606	return TRUE;
2607}
2608
2609void Field::SetRichValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex)
2610{
2611	//Not supported.
2612}
2613
2614FX_BOOL Field::rotation(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2615{
2616	ASSERT(m_pDocument != NULL);
2617
2618	if (vp.IsSetting())
2619	{
2620		if (!m_bCanSet) return FALSE;
2621
2622		int nVP;
2623		vp >> nVP;
2624
2625		if (m_bDelay)
2626		{
2627			AddDelay_Int(FP_ROTATION, nVP);
2628		}
2629		else
2630		{
2631			Field::SetRotation(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
2632		}
2633	}
2634	else
2635	{
2636		CFX_PtrArray FieldArray;
2637		GetFormFields(m_FieldName,FieldArray);
2638		if (FieldArray.GetSize() <= 0) return FALSE;
2639
2640		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2641		ASSERT(pFormField != NULL);
2642
2643		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2644		if (!pFormControl)return FALSE;
2645
2646		vp << (FX_INT32)pFormControl->GetRotation();
2647	}
2648
2649	return TRUE;
2650}
2651
2652void Field::SetRotation(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
2653{
2654	//Not supported.
2655}
2656
2657FX_BOOL Field::strokeColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2658{
2659	ASSERT(m_pDocument != NULL);
2660
2661	if (vp.IsSetting())
2662	{
2663		if (!m_bCanSet) return FALSE;
2664
2665		if (!vp.IsArrayObject())return FALSE;
2666
2667		CJS_Array crArray(m_isolate);
2668		vp >> crArray;
2669
2670		CPWL_Color color;
2671		color::ConvertArrayToPWLColor(crArray, color);
2672
2673		if (m_bDelay)
2674		{
2675			AddDelay_Color(FP_STROKECOLOR, color);
2676		}
2677		else
2678		{
2679			Field::SetStrokeColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
2680		}
2681	}
2682	else
2683	{
2684		CFX_PtrArray FieldArray;
2685		GetFormFields(m_FieldName,FieldArray);
2686		if (FieldArray.GetSize() <= 0) return FALSE;
2687
2688		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2689		ASSERT(pFormField != NULL);
2690
2691		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2692		if (!pFormControl)return FALSE;
2693
2694		int iColorType;
2695		pFormControl->GetBorderColor(iColorType);
2696
2697		CPWL_Color color;
2698
2699		if (iColorType == COLORTYPE_TRANSPARENT)
2700		{
2701			color = CPWL_Color(COLORTYPE_TRANSPARENT);
2702		}
2703		else if (iColorType == COLORTYPE_GRAY)
2704		{
2705			color = CPWL_Color(COLORTYPE_GRAY, pFormControl->GetOriginalBorderColor(0));
2706		}
2707		else if (iColorType == COLORTYPE_RGB)
2708		{
2709			color = CPWL_Color(COLORTYPE_RGB, pFormControl->GetOriginalBorderColor(0),
2710				pFormControl->GetOriginalBorderColor(1),
2711				pFormControl->GetOriginalBorderColor(2));
2712		}
2713		else if (iColorType == COLORTYPE_CMYK)
2714		{
2715			color = CPWL_Color(COLORTYPE_CMYK, pFormControl->GetOriginalBorderColor(0),
2716				pFormControl->GetOriginalBorderColor(1),
2717				pFormControl->GetOriginalBorderColor(2),
2718				pFormControl->GetOriginalBorderColor(3));
2719		}
2720		else
2721			return FALSE;
2722
2723		CJS_Array crArray(m_isolate);
2724		color::ConvertPWLColorToArray(color, crArray);
2725        vp  <<  crArray;
2726	}
2727
2728	return TRUE;
2729}
2730
2731void Field::SetStrokeColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
2732{
2733	//Not supported.
2734}
2735
2736FX_BOOL Field::style(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2737{
2738	ASSERT(m_pDocument != NULL);
2739
2740	if (vp.IsSetting())
2741	{
2742		if (!m_bCanSet) return FALSE;
2743
2744		CFX_ByteString csBCaption;
2745		vp >> csBCaption;
2746
2747		if (m_bDelay)
2748		{
2749			AddDelay_String(FP_STYLE, csBCaption);
2750		}
2751		else
2752		{
2753			Field::SetStyle(m_pDocument, m_FieldName, m_nFormControlIndex, csBCaption);
2754		}
2755	}
2756	else
2757	{
2758		CFX_PtrArray FieldArray;
2759		GetFormFields(m_FieldName,FieldArray);
2760		if (FieldArray.GetSize() <= 0) return FALSE;
2761
2762		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2763		ASSERT(pFormField != NULL);
2764
2765		if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON &&
2766			pFormField->GetFieldType() != FIELDTYPE_CHECKBOX)
2767			return FALSE;
2768
2769		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2770		if (!pFormControl) return FALSE;
2771
2772		CFX_WideString csWCaption = pFormControl->GetNormalCaption();
2773		CFX_ByteString csBCaption;
2774
2775		switch (csWCaption[0])
2776		{
2777			case L'l':
2778				csBCaption = "circle";
2779				break;
2780			case L'8':
2781				csBCaption = "cross";
2782				break;
2783			case L'u':
2784				csBCaption = "diamond";
2785				break;
2786			case L'n':
2787				csBCaption = "square";
2788				break;
2789			case L'H':
2790				csBCaption = "star";
2791				break;
2792			default: //L'4'
2793				csBCaption = "check";
2794				break;
2795		}
2796		vp << csBCaption;
2797	}
2798
2799	return TRUE;
2800}
2801
2802void Field::SetStyle(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex,
2803					 const CFX_ByteString& string)
2804{
2805	//Not supported.
2806}
2807
2808FX_BOOL Field::submitName(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2809{
2810	return TRUE;
2811}
2812
2813FX_BOOL Field::textColor(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2814{
2815	ASSERT(m_pDocument != NULL);
2816
2817	if (vp.IsSetting())
2818	{
2819		if (!m_bCanSet) return FALSE;
2820
2821		CJS_Array crArray(m_isolate);
2822		if (!vp.IsArrayObject())return FALSE;
2823		vp >> crArray;
2824
2825		CPWL_Color color;
2826		color::ConvertArrayToPWLColor(crArray, color);
2827
2828		if (m_bDelay)
2829		{
2830			AddDelay_Color(FP_TEXTCOLOR, color);
2831		}
2832		else
2833		{
2834			Field::SetTextColor(m_pDocument, m_FieldName, m_nFormControlIndex, color);
2835		}
2836	}
2837	else
2838	{
2839		CFX_PtrArray FieldArray;
2840		GetFormFields(m_FieldName,FieldArray);
2841		if (FieldArray.GetSize() <= 0) return FALSE;
2842
2843		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2844		ASSERT(pFormField != NULL);
2845
2846		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2847		if (!pFormControl)return FALSE;
2848
2849		int iColorType;
2850		FX_ARGB color;
2851		CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2852		FieldAppearance.GetColor(color, iColorType);
2853		FX_INT32 a,r,g,b;
2854		ArgbDecode(color, a, r, g, b);
2855
2856		CPWL_Color crRet = CPWL_Color(COLORTYPE_RGB, r / 255.0f,
2857				g / 255.0f,
2858				b / 255.0f);
2859
2860		if (iColorType == COLORTYPE_TRANSPARENT)
2861			crRet = CPWL_Color(COLORTYPE_TRANSPARENT);
2862
2863		CJS_Array crArray(m_isolate);
2864		color::ConvertPWLColorToArray(crRet, crArray);
2865        vp  <<  crArray;
2866	}
2867
2868	return TRUE;
2869}
2870
2871void Field::SetTextColor(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CPWL_Color& color)
2872{
2873	//Not supported.
2874}
2875
2876FX_BOOL Field::textFont(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2877{
2878	ASSERT(m_pDocument != NULL);
2879
2880	if (vp.IsSetting())
2881	{
2882		if (!m_bCanSet) return FALSE;
2883
2884		CFX_ByteString csFontName;
2885		vp >> csFontName;
2886		if (csFontName.IsEmpty()) return FALSE;
2887
2888		if (m_bDelay)
2889		{
2890			AddDelay_String(FP_TEXTFONT, csFontName);
2891		}
2892		else
2893		{
2894			Field::SetTextFont(m_pDocument, m_FieldName, m_nFormControlIndex, csFontName);
2895		}
2896	}
2897	else
2898	{
2899		CFX_PtrArray FieldArray;
2900		GetFormFields(m_FieldName,FieldArray);
2901		if (FieldArray.GetSize() <= 0) return FALSE;
2902
2903		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2904		ASSERT(pFormField != NULL);
2905
2906		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2907		if (!pFormControl)return FALSE;
2908
2909		int nFieldType = pFormField->GetFieldType();
2910
2911		if (nFieldType == FIELDTYPE_PUSHBUTTON ||
2912			nFieldType == FIELDTYPE_COMBOBOX ||
2913			nFieldType == FIELDTYPE_LISTBOX ||
2914			nFieldType == FIELDTYPE_TEXTFIELD)
2915		{
2916			CPDF_Font * pFont = pFormControl->GetDefaultControlFont();
2917			if (!pFont) return FALSE;
2918
2919			vp << pFont->GetBaseFont();
2920		}
2921		else
2922			return FALSE;
2923	}
2924
2925	return TRUE;
2926}
2927
2928void Field::SetTextFont(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_ByteString& string)
2929{
2930	//Not supported.
2931}
2932
2933FX_BOOL Field::textSize(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2934{
2935	ASSERT(m_pDocument != NULL);
2936
2937	if (vp.IsSetting())
2938	{
2939		if (!m_bCanSet) return FALSE;
2940
2941		int nVP;
2942		vp >> nVP;
2943
2944		if (m_bDelay)
2945		{
2946			AddDelay_Int(FP_TEXTSIZE, nVP);
2947		}
2948		else
2949		{
2950			Field::SetTextSize(m_pDocument, m_FieldName, m_nFormControlIndex, nVP);
2951		}
2952	}
2953	else
2954	{
2955		CFX_PtrArray FieldArray;
2956		GetFormFields(m_FieldName,FieldArray);
2957		if (FieldArray.GetSize() <= 0) return FALSE;
2958
2959		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2960		ASSERT(pFormField != NULL);
2961
2962		CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2963		if (!pFormControl)return FALSE;
2964
2965		CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2966
2967		CFX_ByteString csFontNameTag;
2968		FX_FLOAT fFontSize;
2969		FieldAppearance.GetFont(csFontNameTag,fFontSize);
2970
2971		vp << (int)fFontSize;
2972	}
2973
2974	return TRUE;
2975}
2976
2977void Field::SetTextSize(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, int number)
2978{
2979	//Not supported.
2980}
2981
2982FX_BOOL Field::type(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
2983{
2984	ASSERT(m_pDocument != NULL);
2985
2986	if (!vp.IsGetting()) return FALSE;
2987
2988	CFX_PtrArray FieldArray;
2989	GetFormFields(m_FieldName,FieldArray);
2990	if (FieldArray.GetSize() <= 0) return FALSE;
2991
2992 	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
2993	ASSERT(pFormField != NULL);
2994
2995	switch (pFormField->GetFieldType())
2996	{
2997		case FIELDTYPE_UNKNOWN:
2998			vp << L"unknown";
2999			break;
3000		case FIELDTYPE_PUSHBUTTON:
3001			vp << L"button";
3002			break;
3003		case FIELDTYPE_CHECKBOX:
3004			vp << L"checkbox";
3005			break;
3006		case FIELDTYPE_RADIOBUTTON:
3007			vp << L"radiobutton";
3008			break;
3009		case FIELDTYPE_COMBOBOX:
3010			vp << L"combobox";
3011			break;
3012		case FIELDTYPE_LISTBOX:
3013			vp << L"listbox";
3014			break;
3015		case FIELDTYPE_TEXTFIELD:
3016			vp << L"text";
3017			break;
3018		case FIELDTYPE_SIGNATURE:
3019			vp << L"signature";
3020			break;
3021		default :
3022			vp << L"unknown";
3023			break;
3024	}
3025
3026	return TRUE;
3027}
3028
3029FX_BOOL Field::userName(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
3030{
3031	ASSERT(m_pDocument != NULL);
3032
3033  	if (vp.IsSetting())
3034	{
3035		if (!m_bCanSet) return FALSE;
3036
3037		CFX_WideString swName;
3038		vp >> swName;
3039
3040		if (m_bDelay)
3041		{
3042			AddDelay_WideString(FP_USERNAME, swName);
3043		}
3044		else
3045		{
3046			Field::SetUserName(m_pDocument, m_FieldName, m_nFormControlIndex, swName);
3047		}
3048	}
3049	else
3050	{
3051		CFX_PtrArray FieldArray;
3052		GetFormFields(m_FieldName,FieldArray);
3053		if (FieldArray.GetSize() <= 0) return FALSE;
3054
3055 		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3056		ASSERT(pFormField != NULL);
3057
3058		vp << (CFX_WideString)pFormField->GetAlternateName();
3059	}
3060
3061	return TRUE;
3062}
3063
3064void Field::SetUserName(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName, int nControlIndex, const CFX_WideString& string)
3065{
3066	//Not supported.
3067}
3068
3069FX_BOOL Field::value(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
3070{
3071	ASSERT(m_pDocument != NULL);
3072
3073	if (vp.IsSetting())
3074	{
3075		if (!m_bCanSet) return FALSE;
3076
3077		CJS_WideStringArray strArray;
3078
3079		if (vp.IsArrayObject())
3080		{
3081			CJS_Array ValueArray(m_isolate);
3082			vp.ConvertToArray(ValueArray);
3083			for (int i = 0,sz = ValueArray.GetLength(); i < sz; i++)
3084			{
3085				CJS_Value ElementValue(m_isolate);
3086				ValueArray.GetElement(i, ElementValue);
3087				strArray.Add(ElementValue.ToCFXWideString());
3088			}
3089		}
3090		else
3091		{
3092			CFX_WideString swValue;
3093			vp >> swValue;
3094
3095			strArray.Add(swValue);
3096		}
3097
3098		if (m_bDelay)
3099		{
3100			AddDelay_WideStringArray(FP_VALUE, strArray);
3101		}
3102		else
3103		{
3104			Field::SetValue(m_pDocument, m_FieldName, m_nFormControlIndex, strArray);
3105		}
3106	}
3107	else
3108	{
3109		CFX_PtrArray FieldArray;
3110		GetFormFields(m_FieldName,FieldArray);
3111		if (FieldArray.GetSize() <= 0) return FALSE;
3112
3113 		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3114		ASSERT(pFormField != NULL);
3115
3116
3117
3118		switch (pFormField->GetFieldType())
3119		{
3120		case FIELDTYPE_PUSHBUTTON:
3121			return FALSE;
3122		case FIELDTYPE_COMBOBOX:
3123		case FIELDTYPE_TEXTFIELD:
3124			{
3125				CFX_WideString swValue = pFormField->GetValue();
3126
3127				double dRet;
3128				FX_BOOL bDot;
3129				if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
3130				{
3131					if (bDot)
3132						vp << dRet;
3133					else
3134						vp << dRet;
3135				}
3136				else
3137					vp << swValue;
3138			}
3139			break;
3140		case FIELDTYPE_LISTBOX:
3141			{
3142				if (pFormField->CountSelectedItems() > 1)
3143				{
3144					CJS_Array ValueArray(m_isolate);
3145					CJS_Value ElementValue(m_isolate);
3146					int iIndex;
3147					for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++)
3148					{
3149						iIndex = pFormField->GetSelectedIndex(i);
3150						ElementValue = pFormField->GetOptionValue(iIndex).c_str();
3151						if (FXSYS_wcslen(ElementValue.ToCFXWideString().c_str()) == 0)
3152							ElementValue = pFormField->GetOptionLabel(iIndex).c_str();
3153						ValueArray.SetElement(i, ElementValue);
3154					}
3155					vp << ValueArray;
3156				}
3157				else
3158				{
3159					CFX_WideString swValue = pFormField->GetValue();
3160
3161					double dRet;
3162					FX_BOOL bDot;
3163					if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
3164					{
3165						if (bDot)
3166							vp << dRet;
3167						else
3168							vp << dRet;
3169					}
3170					else
3171						vp << swValue;
3172				}
3173			}
3174			break;
3175		case FIELDTYPE_CHECKBOX:
3176		case FIELDTYPE_RADIOBUTTON:
3177			{
3178				FX_BOOL bFind = FALSE;
3179				for (int i = 0 , sz = pFormField->CountControls(); i < sz; i++)
3180				{
3181					if (pFormField->GetControl(i)->IsChecked())
3182					{
3183						CFX_WideString swValue = pFormField->GetControl(i)->GetExportValue();
3184						double dRet;
3185						FX_BOOL bDot;
3186						if (CJS_PublicMethods::ConvertStringToNumber(swValue.c_str(), dRet, bDot))
3187						{
3188							if (bDot)
3189								vp << dRet;
3190							else
3191								vp << dRet;
3192						}
3193						else
3194							vp << swValue;
3195
3196						bFind = TRUE;
3197						break;
3198					}
3199					else
3200						continue;
3201				}
3202				if (!bFind)
3203					vp << L"Off";
3204			}
3205			break;
3206		default:
3207			vp << pFormField->GetValue();
3208			break;
3209		}
3210	}
3211
3212	return TRUE;
3213}
3214
3215void Field::SetValue(CPDFSDK_Document* pDocument, const CFX_WideString& swFieldName,
3216					 int nControlIndex, const CJS_WideStringArray& strArray)
3217{
3218	ASSERT(pDocument != NULL);
3219
3220	if (strArray.GetSize() < 1) return;
3221
3222	CFX_PtrArray FieldArray;
3223	GetFormFields(pDocument, swFieldName, FieldArray);
3224
3225	for (int i=0,isz=FieldArray.GetSize(); i<isz; i++)
3226	{
3227		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
3228		ASSERT(pFormField != NULL);
3229
3230		if (pFormField->GetFullName().Compare(swFieldName) != 0)
3231			continue;
3232
3233		switch (pFormField->GetFieldType())
3234		{
3235		case FIELDTYPE_TEXTFIELD:
3236		case FIELDTYPE_COMBOBOX:
3237			if (pFormField->GetValue() != strArray.GetAt(0))
3238			{
3239				CFX_WideString WideString = strArray.GetAt(0);
3240				pFormField->SetValue(strArray.GetAt(0), TRUE);
3241				UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
3242			}
3243			break;
3244		case FIELDTYPE_CHECKBOX: //mantis: 0004493
3245		case FIELDTYPE_RADIOBUTTON:
3246			{
3247				if (pFormField->GetValue() != strArray.GetAt(0))
3248				{
3249					pFormField->SetValue(strArray.GetAt(0), TRUE);
3250					UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
3251				}
3252			}
3253			break;
3254		case FIELDTYPE_LISTBOX:
3255			{
3256				FX_BOOL bModified = FALSE;
3257
3258				for (int i=0,sz=strArray.GetSize(); i<sz; i++)
3259				{
3260					int iIndex = pFormField->FindOption(strArray.GetAt(i));
3261
3262					if (!pFormField->IsItemSelected(iIndex))
3263					{
3264						bModified = TRUE;
3265						break;
3266					}
3267				}
3268
3269				if (bModified)
3270				{
3271					pFormField->ClearSelection(TRUE);
3272					for (int i=0,sz=strArray.GetSize(); i<sz; i++)
3273					{
3274						int iIndex = pFormField->FindOption(strArray.GetAt(i));
3275						pFormField->SetItemSelection(iIndex, TRUE, TRUE);
3276					}
3277
3278					UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
3279				}
3280			}
3281			break;
3282		default:
3283			break;
3284		}
3285	}
3286}
3287
3288FX_BOOL Field::valueAsString(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
3289{
3290	ASSERT(m_pDocument != NULL);
3291
3292	if (!vp.IsGetting()) return FALSE;
3293
3294	CFX_PtrArray FieldArray;
3295	GetFormFields(m_FieldName,FieldArray);
3296	if (FieldArray.GetSize() <= 0) return FALSE;
3297
3298   	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3299	ASSERT(pFormField != NULL);
3300
3301	if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
3302		return FALSE;
3303
3304	if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
3305	{
3306		if(!pFormField->CountControls()) return FALSE;
3307
3308		if (pFormField->GetControl(0)->IsChecked())
3309			vp << L"Yes";
3310		else
3311			vp << L"Off";
3312	}
3313	else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON && !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON))
3314	{
3315		for (int i=0, sz=pFormField->CountControls(); i<sz; i++)
3316		{
3317			if (pFormField->GetControl(i)->IsChecked())
3318			{
3319				vp << pFormField->GetControl(i)->GetExportValue().c_str();
3320				break;
3321			}
3322			else
3323				vp << L"Off";
3324		}
3325	}
3326	else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX && (pFormField->CountSelectedItems() > 1))
3327	{
3328		vp << L"";
3329	}
3330	else
3331		vp << pFormField->GetValue().c_str();
3332
3333	return TRUE;
3334}
3335
3336/* --------------------------------- methods --------------------------------- */
3337
3338FX_BOOL Field::browseForFileToSubmit(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3339{
3340	ASSERT(m_pDocument != NULL);
3341
3342	CFX_PtrArray FieldArray;
3343	GetFormFields(m_FieldName, FieldArray);
3344	if (FieldArray.GetSize() <= 0) return FALSE;
3345
3346	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3347	ASSERT(pFormField != NULL);
3348
3349 	CPDFDoc_Environment* pApp = m_pDocument->GetEnv();
3350 	ASSERT(pApp != NULL);
3351
3352	if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
3353		(pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD))
3354	{
3355		CFX_WideString wsFileName = pApp->JS_fieldBrowse();
3356		if(!wsFileName.IsEmpty())
3357		{
3358 			pFormField->SetValue(wsFileName);
3359 			UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
3360         }
3361	}
3362	else
3363		return FALSE;
3364
3365	return TRUE;
3366}
3367
3368
3369FX_BOOL Field::buttonGetCaption(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3370{
3371	ASSERT(m_pDocument != NULL);
3372
3373	int nface = 0;
3374	int iSize = params.size();
3375	if (iSize >= 1)
3376		nface = params[0].ToInt();
3377
3378	CFX_PtrArray FieldArray;
3379	GetFormFields(m_FieldName,FieldArray);
3380	if (FieldArray.GetSize() <= 0) return FALSE;
3381
3382	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3383	ASSERT(pFormField != NULL);
3384
3385	if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
3386		return FALSE;
3387
3388	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
3389	if (!pFormControl)return FALSE;
3390
3391	if (nface == 0)
3392		vRet = pFormControl->GetNormalCaption().c_str();
3393	else if (nface == 1)
3394		vRet = pFormControl->GetDownCaption().c_str();
3395	else if (nface == 2)
3396		vRet = pFormControl->GetRolloverCaption().c_str();
3397	else
3398		return FALSE;
3399
3400	return TRUE;
3401}
3402
3403//#pragma warning(disable: 4800)
3404
3405FX_BOOL Field::buttonGetIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3406{
3407	ASSERT(m_pDocument != NULL);
3408
3409	int nface = 0;
3410	int iSize = params.size();
3411	if (iSize >= 1)
3412		nface = params[0].ToInt();
3413
3414	CFX_PtrArray FieldArray;
3415	GetFormFields(m_FieldName,FieldArray);
3416	if (FieldArray.GetSize() <= 0) return FALSE;
3417
3418	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3419	ASSERT(pFormField != NULL);
3420
3421	if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
3422		return FALSE;
3423
3424	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
3425	if (!pFormControl)return FALSE;
3426
3427	CJS_Context* pContext = (CJS_Context*)cc;
3428	ASSERT(pContext != NULL);
3429
3430	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
3431	ASSERT(pRuntime != NULL);
3432
3433	JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Icon"));
3434	ASSERT(pObj.IsEmpty() == FALSE);
3435
3436	CJS_Icon* pJS_Icon = (CJS_Icon*)JS_GetPrivate(pObj);
3437	ASSERT(pJS_Icon != NULL);
3438
3439	Icon* pIcon = (Icon*)pJS_Icon->GetEmbedObject();
3440	ASSERT(pIcon != NULL);
3441
3442	CPDF_Stream* pIconStream = NULL;
3443	if (nface == 0)
3444		pIconStream = pFormControl->GetNormalIcon();
3445	else if (nface == 1)
3446		pIconStream = pFormControl->GetDownIcon();
3447	else if (nface == 2)
3448		pIconStream = pFormControl->GetRolloverIcon();
3449	else
3450		return FALSE;
3451
3452	pIcon->SetStream(pIconStream);
3453	vRet = pJS_Icon;
3454
3455	return TRUE;
3456}
3457
3458//#pragma warning(default: 4800)
3459
3460FX_BOOL Field::buttonImportIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3461{
3462#if 0
3463	ASSERT(m_pDocument != NULL);
3464
3465	CFX_PtrArray FieldArray;
3466	GetFormFields(m_FieldName,FieldArray);
3467	if (FieldArray.GetSize() <= 0) return FALSE;
3468
3469	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3470	if (!pFormField)return FALSE;
3471
3472	CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
3473	ASSERT(pEnv);
3474
3475	CFX_WideString sIconFileName = pEnv->JS_fieldBrowse();
3476	if (sIconFileName.IsEmpty())
3477	{
3478		vRet = 1;
3479		return TRUE;
3480	}
3481
3482	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
3483	ASSERT(pInterForm != NULL);
3484
3485	CPDF_Stream* pStream = pInterForm->LoadImageFromFile(sIconFileName);
3486	if (!pStream)
3487	{
3488		vRet = -1;
3489		return TRUE;
3490	}
3491
3492	CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
3493	if (!pFormControl)return FALSE;
3494
3495	pFormControl->SetNormalIcon(pStream);
3496	UpdateFormControl(m_pDocument, pFormControl, TRUE, TRUE, TRUE);
3497
3498	vRet = 0;
3499#endif // 0
3500	return TRUE;
3501}
3502
3503FX_BOOL Field::buttonSetCaption(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3504{
3505	return FALSE;
3506}
3507
3508FX_BOOL Field::buttonSetIcon(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3509{
3510	return FALSE;
3511}
3512
3513FX_BOOL Field::checkThisBox(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3514{
3515	ASSERT(m_pDocument != NULL);
3516
3517	if (!m_bCanSet) return FALSE;
3518
3519	int iSize = params.size();
3520	if (iSize < 1)
3521		return FALSE;
3522
3523	int nWidget = params[0].ToInt();
3524
3525	FX_BOOL bCheckit = TRUE;
3526	if (iSize >= 2)
3527		bCheckit = params[1].ToBool();
3528
3529	CFX_PtrArray FieldArray;
3530	GetFormFields(m_FieldName,FieldArray);
3531	if (FieldArray.GetSize() <= 0) return FALSE;
3532
3533	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3534	ASSERT(pFormField != NULL);
3535
3536	if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX && pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
3537		return FALSE;
3538	if(nWidget <0 || nWidget >= pFormField->CountControls())
3539		return FALSE;
3540	if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
3541		pFormField->CheckControl(nWidget, bCheckit, TRUE);
3542	else
3543		pFormField->CheckControl(nWidget, bCheckit, TRUE);
3544
3545	UpdateFormField(m_pDocument, pFormField, TRUE, TRUE, TRUE);
3546	return TRUE;
3547}
3548
3549FX_BOOL Field::clearItems(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3550{
3551	return TRUE;
3552}
3553
3554FX_BOOL Field::defaultIsChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3555{
3556	ASSERT(m_pDocument != NULL);
3557
3558	if (!m_bCanSet) return FALSE;
3559
3560	int iSize = params.size();
3561	if (iSize < 1)
3562		return FALSE;
3563
3564	int nWidget = params[0].ToInt();
3565
3566	CFX_PtrArray FieldArray;
3567	GetFormFields(m_FieldName,FieldArray);
3568	if (FieldArray.GetSize() <= 0) return FALSE;
3569
3570	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3571	ASSERT(pFormField != NULL);
3572
3573	if(nWidget <0 || nWidget >= pFormField->CountControls())
3574	{
3575		vRet = FALSE;
3576		return FALSE;
3577	}
3578	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
3579		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
3580	{
3581
3582		vRet = TRUE;
3583	}
3584	else
3585		vRet = FALSE;
3586
3587	return TRUE;
3588}
3589
3590FX_BOOL Field::deleteItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3591{
3592	return TRUE;
3593}
3594
3595int JS_COMPARESTRING(CFX_WideString* ps1, CFX_WideString* ps2)
3596{
3597	ASSERT(ps1 != NULL);
3598	ASSERT(ps2 != NULL);
3599
3600	return ps1->Compare(*ps2);
3601}
3602
3603
3604FX_BOOL Field::getArray(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3605{
3606	ASSERT(m_pDocument != NULL);
3607
3608	CFX_PtrArray FieldArray;
3609	GetFormFields(m_FieldName,FieldArray);
3610	if (FieldArray.GetSize() <= 0) return FALSE;
3611
3612	CGW_ArrayTemplate<CFX_WideString*> swSort;
3613
3614	for (int i=0,sz=FieldArray.GetSize(); i<sz; i++)
3615	{
3616		CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(i);
3617		ASSERT(pFormField != NULL);
3618
3619		swSort.Add(new CFX_WideString(pFormField->GetFullName()));
3620
3621	}
3622	swSort.Sort(JS_COMPARESTRING);
3623
3624	CJS_Context* pContext = (CJS_Context*)cc;
3625	ASSERT(pContext != NULL);
3626	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
3627	ASSERT(pRuntime != NULL);
3628
3629	CJS_Array FormFieldArray(m_isolate);
3630	for (int j=0,jsz = swSort.GetSize(); j<jsz; j++)
3631	{
3632		CFX_WideString* pStr = swSort.GetAt(j);
3633
3634		JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"Field"));
3635		ASSERT(pObj.IsEmpty() == FALSE);
3636
3637		CJS_Field* pJSField = (CJS_Field*)JS_GetPrivate(pObj);
3638		ASSERT(pJSField != NULL);
3639
3640		Field* pField = (Field*)pJSField->GetEmbedObject();
3641		ASSERT(pField != NULL);
3642
3643		pField->AttachField(this->m_pJSDoc, *pStr);
3644
3645		CJS_Value FormFieldValue(m_isolate);
3646		FormFieldValue = pJSField;
3647		FormFieldArray.SetElement(j, FormFieldValue);
3648
3649		delete pStr;
3650	}
3651
3652	vRet = FormFieldArray;
3653	swSort.RemoveAll();
3654	return TRUE;
3655}
3656
3657FX_BOOL Field::getItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3658{
3659	ASSERT(m_pDocument != NULL);
3660	int iSize = params.size();
3661
3662	int nIdx = -1;
3663	if (iSize >= 1)
3664		nIdx = params[0].ToInt();
3665
3666	FX_BOOL bExport = TRUE;
3667	if (iSize >= 2)
3668		bExport = params[1].ToBool();
3669
3670	CFX_PtrArray FieldArray;
3671	GetFormFields(m_FieldName,FieldArray);
3672	if (FieldArray.GetSize() <= 0) return FALSE;
3673
3674	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3675	ASSERT(pFormField != NULL);
3676
3677	if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX)
3678		|| (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX))
3679	{
3680		if (nIdx == -1 || nIdx > pFormField->CountOptions())
3681			nIdx = pFormField->CountOptions() -1;
3682		if (bExport)
3683		{
3684			CFX_WideString strval = pFormField->GetOptionValue(nIdx);
3685			if (strval.IsEmpty())
3686				vRet = pFormField->GetOptionLabel(nIdx).c_str();
3687			else
3688				vRet = strval.c_str();
3689		}
3690		else
3691			vRet = pFormField->GetOptionLabel(nIdx).c_str();
3692	}
3693	else
3694		return FALSE;
3695
3696	return TRUE;
3697}
3698
3699FX_BOOL Field::getLock(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3700{
3701	return FALSE;
3702}
3703
3704FX_BOOL Field::insertItemAt(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3705{
3706	return TRUE;
3707}
3708
3709FX_BOOL Field::isBoxChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3710{
3711	ASSERT(m_pDocument != NULL);
3712
3713	int nIndex = -1;
3714	if (params.size() >= 1)
3715		nIndex = params[0].ToInt();
3716
3717	CFX_PtrArray FieldArray;
3718	GetFormFields(m_FieldName,FieldArray);
3719	if (FieldArray.GetSize() <= 0) return FALSE;
3720
3721	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3722	ASSERT(pFormField != NULL);
3723
3724	if(nIndex <0 || nIndex >= pFormField->CountControls())
3725	{
3726		vRet = FALSE;
3727		return FALSE;
3728	}
3729
3730	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
3731		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
3732	{
3733		if (pFormField->GetControl(nIndex)->IsChecked() !=0 )
3734			vRet = TRUE;
3735		else
3736			vRet = FALSE;
3737	}
3738	else
3739		vRet = FALSE;
3740
3741	return TRUE;
3742}
3743
3744FX_BOOL Field::isDefaultChecked(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3745{
3746	ASSERT(m_pDocument != NULL);
3747
3748	int nIndex = -1;
3749	if (params.size() >= 1)
3750		nIndex = params[0].ToInt();
3751
3752	CFX_PtrArray FieldArray;
3753	GetFormFields(m_FieldName,FieldArray);
3754	if (FieldArray.GetSize() <= 0) return FALSE;
3755
3756	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3757	ASSERT(pFormField != NULL);
3758
3759	if(nIndex <0 || nIndex >= pFormField->CountControls())
3760	{
3761		vRet = FALSE;
3762		return FALSE;
3763	}
3764	if ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX)
3765		|| (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON))
3766	{
3767		if (pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)
3768			vRet = TRUE;
3769		else
3770			vRet = FALSE;
3771	}
3772	else
3773		vRet = FALSE;
3774
3775	return TRUE;
3776}
3777
3778FX_BOOL Field::setAction(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3779{
3780	return TRUE;
3781}
3782
3783FX_BOOL Field::setFocus(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3784{
3785	ASSERT(m_pDocument != NULL);
3786
3787	CFX_PtrArray FieldArray;
3788	GetFormFields(m_FieldName,FieldArray);
3789	if (FieldArray.GetSize() <= 0) return FALSE;
3790
3791	CPDF_FormField* pFormField = (CPDF_FormField*)FieldArray.ElementAt(0);
3792	ASSERT(pFormField != NULL);
3793
3794	FX_INT32 nCount = pFormField->CountControls();
3795
3796	if (nCount < 1) return FALSE;
3797
3798	CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)m_pDocument->GetInterForm();
3799	ASSERT(pInterForm != NULL);
3800
3801	CPDFSDK_Widget* pWidget = NULL;
3802	if (nCount == 1)
3803	{
3804		pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
3805	}
3806	else
3807	{
3808		CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
3809		ASSERT(pEnv);
3810		CPDF_Page* pPage = (CPDF_Page*)pEnv->FFI_GetCurrentPage(m_pDocument->GetDocument());
3811		if(!pPage)
3812			return FALSE;
3813		if (CPDFSDK_PageView* pCurPageView = m_pDocument->GetPageView(pPage))
3814		{
3815			for (FX_INT32 i=0; i<nCount; i++)
3816			{
3817				if (CPDFSDK_Widget* pTempWidget =  pInterForm->GetWidget(pFormField->GetControl(i)))
3818				{
3819					if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage())
3820					{
3821						pWidget = pTempWidget;
3822						break;
3823					}
3824				}
3825			}
3826		}
3827	}
3828
3829	if (pWidget)
3830	{
3831		m_pDocument->SetFocusAnnot(pWidget);
3832	}
3833
3834	return TRUE;
3835}
3836
3837FX_BOOL Field::setItems(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3838{
3839	return TRUE;
3840}
3841
3842FX_BOOL Field::setLock(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3843{
3844	return FALSE;
3845}
3846
3847FX_BOOL Field::signatureGetModifications(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3848{
3849	return FALSE;
3850}
3851
3852FX_BOOL Field::signatureGetSeedValue(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3853{
3854	return FALSE;
3855}
3856
3857FX_BOOL Field::signatureInfo(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3858{
3859	return FALSE;
3860}
3861
3862FX_BOOL Field::signatureSetSeedValue(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3863{
3864	return FALSE;
3865}
3866
3867FX_BOOL Field::signatureSign(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3868{
3869	return FALSE;
3870}
3871
3872FX_BOOL Field::signatureValidate(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
3873{
3874	return FALSE;
3875}
3876
3877FX_BOOL Field::source(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
3878{
3879	if (vp.IsGetting())
3880	{
3881		vp << (CJS_Object*)NULL;
3882	}
3883
3884	return TRUE;
3885}
3886
3887/////////////////////////////////////////// delay /////////////////////////////////////////////
3888
3889void Field::AddDelay_Int(enum FIELD_PROP prop, FX_INT32 n)
3890{
3891	ASSERT(m_pJSDoc != NULL);
3892
3893	CJS_DelayData* pNewData = new CJS_DelayData;
3894	pNewData->sFieldName = m_FieldName;
3895	pNewData->nControlIndex = m_nFormControlIndex;
3896	pNewData->eProp = prop;
3897	pNewData->num = n;
3898
3899	m_pJSDoc->AddDelayData(pNewData);
3900}
3901
3902void Field::AddDelay_Bool(enum FIELD_PROP prop,bool b)
3903{
3904	ASSERT(m_pJSDoc != NULL);
3905
3906	CJS_DelayData* pNewData = new CJS_DelayData;
3907	pNewData->sFieldName = m_FieldName;
3908	pNewData->nControlIndex = m_nFormControlIndex;
3909	pNewData->eProp = prop;
3910	pNewData->b = b;
3911
3912	m_pJSDoc->AddDelayData(pNewData);
3913}
3914
3915void Field::AddDelay_String(enum FIELD_PROP prop, const CFX_ByteString& string)
3916{
3917	ASSERT(m_pJSDoc != NULL);
3918
3919	CJS_DelayData* pNewData = new CJS_DelayData;
3920	pNewData->sFieldName = m_FieldName;
3921	pNewData->nControlIndex = m_nFormControlIndex;
3922	pNewData->eProp = prop;
3923	pNewData->string = string;
3924
3925	m_pJSDoc->AddDelayData(pNewData);
3926}
3927
3928void Field::AddDelay_WideString(enum FIELD_PROP prop, const CFX_WideString& string)
3929{
3930	ASSERT(m_pJSDoc != NULL);
3931
3932	CJS_DelayData* pNewData = new CJS_DelayData;
3933	pNewData->sFieldName = m_FieldName;
3934	pNewData->nControlIndex = m_nFormControlIndex;
3935	pNewData->eProp = prop;
3936	pNewData->widestring = string;
3937
3938	m_pJSDoc->AddDelayData(pNewData);
3939}
3940
3941void Field::AddDelay_Rect(enum FIELD_PROP prop, const CPDF_Rect& rect)
3942{
3943	ASSERT(m_pJSDoc != NULL);
3944
3945	CJS_DelayData* pNewData = new CJS_DelayData;
3946	pNewData->sFieldName = m_FieldName;
3947	pNewData->nControlIndex = m_nFormControlIndex;
3948	pNewData->eProp = prop;
3949	pNewData->rect = rect;
3950
3951	m_pJSDoc->AddDelayData(pNewData);
3952}
3953
3954void Field::AddDelay_Color(enum FIELD_PROP prop, const CPWL_Color& color)
3955{
3956	ASSERT(m_pJSDoc != NULL);
3957
3958	CJS_DelayData* pNewData = new CJS_DelayData;
3959	pNewData->sFieldName = m_FieldName;
3960	pNewData->nControlIndex = m_nFormControlIndex;
3961	pNewData->eProp = prop;
3962	pNewData->color = color;
3963
3964	m_pJSDoc->AddDelayData(pNewData);
3965}
3966
3967void Field::AddDelay_WordArray(enum FIELD_PROP prop, const CFX_DWordArray& array)
3968{
3969	ASSERT(m_pJSDoc != NULL);
3970
3971	CJS_DelayData* pNewData = new CJS_DelayData;
3972	pNewData->sFieldName = m_FieldName;
3973	pNewData->nControlIndex = m_nFormControlIndex;
3974	pNewData->eProp = prop;
3975
3976	for (int i=0,sz=array.GetSize(); i<sz; i++)
3977		pNewData->wordarray.Add(array.GetAt(i));
3978
3979	m_pJSDoc->AddDelayData(pNewData);
3980}
3981
3982void Field::AddDelay_WideStringArray(enum FIELD_PROP prop, const CJS_WideStringArray& array)
3983{
3984	ASSERT(m_pJSDoc != NULL);
3985
3986	CJS_DelayData* pNewData = new CJS_DelayData;
3987	pNewData->sFieldName = m_FieldName;
3988	pNewData->nControlIndex = m_nFormControlIndex;
3989	pNewData->eProp = prop;
3990	for (int i=0,sz=array.GetSize(); i<sz; i++)
3991		pNewData->widestringarray.Add(array.GetAt(i));
3992
3993	m_pJSDoc->AddDelayData(pNewData);
3994}
3995
3996void Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData)
3997{
3998	ASSERT(pDocument != NULL);
3999	ASSERT(pData != NULL);
4000
4001	switch (pData->eProp)
4002	{
4003	case FP_ALIGNMENT:
4004		Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
4005		break;
4006	case FP_BORDERSTYLE:
4007		Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
4008		break;
4009	case FP_BUTTONALIGNX:
4010		Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4011		break;
4012	case FP_BUTTONALIGNY:
4013		Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4014		break;
4015	case FP_BUTTONFITBOUNDS:
4016		Field::SetButtonFitBounds(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4017		break;
4018	case FP_BUTTONPOSITION:
4019		Field::SetButtonPosition(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4020		break;
4021	case FP_BUTTONSCALEHOW:
4022		Field::SetButtonScaleHow(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4023		break;
4024	case FP_BUTTONSCALEWHEN:
4025		Field::SetButtonScaleWhen(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4026		break;
4027	case FP_CALCORDERINDEX:
4028		Field::SetCalcOrderIndex(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4029		break;
4030	case FP_CHARLIMIT:
4031		Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4032		break;
4033	case FP_COMB:
4034		Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4035		break;
4036	case FP_COMMITONSELCHANGE:
4037		Field::SetCommitOnSelChange(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4038		break;
4039	case FP_CURRENTVALUEINDICES:
4040		Field::SetCurrentValueIndices(pDocument, pData->sFieldName, pData->nControlIndex, pData->wordarray);
4041		break;
4042	case FP_DEFAULTVALUE:
4043		Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
4044		break;
4045	case FP_DONOTSCROLL:
4046		Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4047		break;
4048	case FP_DISPLAY:
4049		Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4050		break;
4051	case FP_FILLCOLOR:
4052		Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
4053		break;
4054	case FP_HIDDEN:
4055		Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4056		break;
4057	case FP_HIGHLIGHT:
4058		Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
4059		break;
4060	case FP_LINEWIDTH:
4061		Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4062		break;
4063	case FP_MULTILINE:
4064		Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4065		break;
4066	case FP_MULTIPLESELECTION:
4067		Field::SetMultipleSelection(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4068		break;
4069	case FP_PASSWORD:
4070		Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4071		break;
4072	case FP_RECT:
4073		Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex, pData->rect);
4074		break;
4075	case FP_RICHTEXT:
4076		Field::SetRichText(pDocument, pData->sFieldName, pData->nControlIndex, pData->b);
4077		break;
4078	case FP_RICHVALUE:
4079		break;
4080	case FP_ROTATION:
4081		Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4082		break;
4083	case FP_STROKECOLOR:
4084		Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
4085		break;
4086	case FP_STYLE:
4087		Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
4088		break;
4089	case FP_TEXTCOLOR:
4090		Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex, pData->color);
4091		break;
4092	case FP_TEXTFONT:
4093		Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex, pData->string);
4094		break;
4095	case FP_TEXTSIZE:
4096		Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex, pData->num);
4097		break;
4098	case FP_USERNAME:
4099		Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestring);
4100		break;
4101	case FP_VALUE:
4102		Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex, pData->widestringarray);
4103		break;
4104	}
4105}
4106
4107#define JS_FIELD_MINWIDTH	1
4108#define JS_FIELD_MINHEIGHT	1
4109
4110void Field::AddField(CPDFSDK_Document* pDocument, int nPageIndex, int nFieldType,
4111							const CFX_WideString& sName, const CPDF_Rect& rcCoords)
4112{
4113	//Not supported.
4114}
4115
4116