blob: b6c32b5208933260107643152b0492d80de35f45 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclairf766ad22016-03-14 13:51:24 -04007#include "fpdfsdk/javascript/Field.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Tom Sepezb9cc7a02016-02-01 13:42:30 -08009#include <algorithm>
10#include <memory>
Dan Sinclair3ebd1212016-03-09 09:59:23 -050011#include <string>
Tom Sepezb9cc7a02016-02-01 13:42:30 -080012#include <vector>
13
dsinclairbc5e6d22016-10-04 11:08:49 -070014#include "core/fpdfapi/font/cpdf_font.h"
dsinclair41872fa2016-10-04 11:29:35 -070015#include "core/fpdfapi/page/cpdf_page.h"
dsinclair488b7ad2016-10-04 11:55:50 -070016#include "core/fpdfapi/parser/cpdf_document.h"
dsinclair1727aee2016-09-29 13:12:56 -070017#include "core/fpdfdoc/cpdf_interform.h"
dsinclair735606d2016-10-05 15:47:02 -070018#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070019#include "fpdfsdk/cpdfsdk_interform.h"
20#include "fpdfsdk/cpdfsdk_pageview.h"
21#include "fpdfsdk/cpdfsdk_widget.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040022#include "fpdfsdk/javascript/Document.h"
23#include "fpdfsdk/javascript/Icon.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040024#include "fpdfsdk/javascript/JS_Define.h"
25#include "fpdfsdk/javascript/JS_EventHandler.h"
26#include "fpdfsdk/javascript/JS_Object.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040027#include "fpdfsdk/javascript/JS_Value.h"
28#include "fpdfsdk/javascript/PublicMethods.h"
Tom Sepezd6ae2af2017-02-16 11:49:55 -080029#include "fpdfsdk/javascript/cjs_event_context.h"
dsinclair64376be2016-03-31 20:03:24 -070030#include "fpdfsdk/javascript/cjs_runtime.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040031#include "fpdfsdk/javascript/color.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070032
tonikitoo7c05a7a2016-08-17 11:08:46 -070033namespace {
34
35bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) {
36 if (!pWidget)
37 return false;
38
39 uint32_t dwFlag = pWidget->GetFlags();
40 switch (value) {
41 case 0:
42 dwFlag &= ~ANNOTFLAG_INVISIBLE;
43 dwFlag &= ~ANNOTFLAG_HIDDEN;
44 dwFlag &= ~ANNOTFLAG_NOVIEW;
45 dwFlag |= ANNOTFLAG_PRINT;
46 break;
47 case 1:
48 dwFlag &= ~ANNOTFLAG_INVISIBLE;
49 dwFlag &= ~ANNOTFLAG_NOVIEW;
50 dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
51 break;
52 case 2:
53 dwFlag &= ~ANNOTFLAG_INVISIBLE;
54 dwFlag &= ~ANNOTFLAG_PRINT;
55 dwFlag &= ~ANNOTFLAG_HIDDEN;
56 dwFlag &= ~ANNOTFLAG_NOVIEW;
57 break;
58 case 3:
59 dwFlag |= ANNOTFLAG_NOVIEW;
60 dwFlag |= ANNOTFLAG_PRINT;
61 dwFlag &= ~ANNOTFLAG_HIDDEN;
62 break;
63 }
64
65 if (dwFlag != pWidget->GetFlags()) {
66 pWidget->SetFlags(dwFlag);
67 return true;
68 }
69
70 return false;
71}
72
73} // namespace
74
Tom Sepez04557b82017-02-16 09:43:10 -080075JSConstSpec CJS_Field::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070076
Tom Sepez04557b82017-02-16 09:43:10 -080077JSPropertySpec CJS_Field::PropertySpecs[] = {
Tom Sepez4d5b8c52017-02-21 15:17:07 -080078 {"alignment", get_alignment_static, set_alignment_static},
dan sinclaircbe23db2017-10-19 14:29:33 -040079 {"borderStyle", get_border_style_static, set_border_style_static},
80 {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
81 {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
82 {"buttonFitBounds", get_button_fit_bounds_static,
83 set_button_fit_bounds_static},
84 {"buttonPosition", get_button_position_static, set_button_position_static},
85 {"buttonScaleHow", get_button_scale_how_static,
86 set_button_scale_how_static},
87 {"buttonScaleWhen", get_button_scale_when_static,
88 set_button_scale_when_static},
89 {"calcOrderIndex", get_calc_order_index_static,
90 set_calc_order_index_static},
91 {"charLimit", get_char_limit_static, set_char_limit_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -080092 {"comb", get_comb_static, set_comb_static},
dan sinclaircbe23db2017-10-19 14:29:33 -040093 {"commitOnSelChange", get_commit_on_sel_change_static,
94 set_commit_on_sel_change_static},
95 {"currentValueIndices", get_current_value_indices_static,
96 set_current_value_indices_static},
97 {"defaultStyle", get_default_style_static, set_default_style_static},
98 {"defaultValue", get_default_value_static, set_default_value_static},
99 {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
100 {"doNotSpellCheck", get_do_not_spell_check_static,
101 set_do_not_spell_check_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800102 {"delay", get_delay_static, set_delay_static},
103 {"display", get_display_static, set_display_static},
104 {"doc", get_doc_static, set_doc_static},
105 {"editable", get_editable_static, set_editable_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400106 {"exportValues", get_export_values_static, set_export_values_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800107 {"hidden", get_hidden_static, set_hidden_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400108 {"fileSelect", get_file_select_static, set_file_select_static},
109 {"fillColor", get_fill_color_static, set_fill_color_static},
110 {"lineWidth", get_line_width_static, set_line_width_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800111 {"highlight", get_highlight_static, set_highlight_static},
112 {"multiline", get_multiline_static, set_multiline_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400113 {"multipleSelection", get_multiple_selection_static,
114 set_multiple_selection_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800115 {"name", get_name_static, set_name_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400116 {"numItems", get_num_items_static, set_num_items_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800117 {"page", get_page_static, set_page_static},
118 {"password", get_password_static, set_password_static},
119 {"print", get_print_static, set_print_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400120 {"radiosInUnison", get_radios_in_unison_static,
121 set_radios_in_unison_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800122 {"readonly", get_readonly_static, set_readonly_static},
123 {"rect", get_rect_static, set_rect_static},
124 {"required", get_required_static, set_required_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400125 {"richText", get_rich_text_static, set_rich_text_static},
126 {"richValue", get_rich_value_static, set_rich_value_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800127 {"rotation", get_rotation_static, set_rotation_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400128 {"strokeColor", get_stroke_color_static, set_stroke_color_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800129 {"style", get_style_static, set_style_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400130 {"submitName", get_submit_name_static, set_submit_name_static},
131 {"textColor", get_text_color_static, set_text_color_static},
132 {"textFont", get_text_font_static, set_text_font_static},
133 {"textSize", get_text_size_static, set_text_size_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800134 {"type", get_type_static, set_type_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400135 {"userName", get_user_name_static, set_user_name_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800136 {"value", get_value_static, set_value_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400137 {"valueAsString", get_value_as_string_static, set_value_as_string_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800138 {"source", get_source_static, set_source_static},
Tom Sepez04557b82017-02-16 09:43:10 -0800139 {0, 0, 0}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700140
Tom Sepez04557b82017-02-16 09:43:10 -0800141JSMethodSpec CJS_Field::MethodSpecs[] = {
Tom Sepez9b99b632017-02-21 15:05:57 -0800142 {"browseForFileToSubmit", browseForFileToSubmit_static},
143 {"buttonGetCaption", buttonGetCaption_static},
144 {"buttonGetIcon", buttonGetIcon_static},
145 {"buttonImportIcon", buttonImportIcon_static},
146 {"buttonSetCaption", buttonSetCaption_static},
147 {"buttonSetIcon", buttonSetIcon_static},
148 {"checkThisBox", checkThisBox_static},
149 {"clearItems", clearItems_static},
150 {"defaultIsChecked", defaultIsChecked_static},
151 {"deleteItemAt", deleteItemAt_static},
152 {"getArray", getArray_static},
153 {"getItemAt", getItemAt_static},
154 {"getLock", getLock_static},
155 {"insertItemAt", insertItemAt_static},
156 {"isBoxChecked", isBoxChecked_static},
157 {"isDefaultChecked", isDefaultChecked_static},
158 {"setAction", setAction_static},
159 {"setFocus", setFocus_static},
160 {"setItems", setItems_static},
161 {"setLock", setLock_static},
162 {"signatureGetModifications", signatureGetModifications_static},
163 {"signatureGetSeedValue", signatureGetSeedValue_static},
164 {"signatureInfo", signatureInfo_static},
165 {"signatureSetSeedValue", signatureSetSeedValue_static},
166 {"signatureSign", signatureSign_static},
167 {"signatureValidate", signatureValidate_static},
Tom Sepez04557b82017-02-16 09:43:10 -0800168 {0, 0}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700169
Dan Sinclair4b172c42017-10-23 11:22:31 -0400170IMPLEMENT_JS_CLASS(CJS_Field, Field, Field)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700171
Ryan Harrison275e2602017-09-18 14:23:18 -0400172CJS_DelayData::CJS_DelayData(FIELD_PROP prop, int idx, const WideString& name)
weili625ad662016-06-15 11:21:33 -0700173 : eProp(prop), nControlIndex(idx), sFieldName(name) {}
174
175CJS_DelayData::~CJS_DelayData() {}
176
dan sinclaircbe23db2017-10-19 14:29:33 -0400177void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700178
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700179Field::Field(CJS_Object* pJSObject)
180 : CJS_EmbedObj(pJSObject),
thestig1cd352e2016-06-07 17:53:06 -0700181 m_pJSDoc(nullptr),
dsinclair3a7741a2016-10-11 10:39:49 -0700182 m_pFormFillEnv(nullptr),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700183 m_nFormControlIndex(-1),
tsepez4cf55152016-11-02 14:37:54 -0700184 m_bCanSet(false),
185 m_bDelay(false) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700186
187Field::~Field() {}
188
189// note: iControlNo = -1, means not a widget.
190void Field::ParseFieldName(const std::wstring& strFieldNameParsed,
191 std::wstring& strFieldName,
192 int& iControlNo) {
193 int iStart = strFieldNameParsed.find_last_of(L'.');
194 if (iStart == -1) {
195 strFieldName = strFieldNameParsed;
196 iControlNo = -1;
197 return;
198 }
199 std::wstring suffixal = strFieldNameParsed.substr(iStart + 1);
200 iControlNo = FXSYS_wtoi(suffixal.c_str());
201 if (iControlNo == 0) {
weilidb444d22016-06-02 15:48:15 -0700202 int iSpaceStart;
203 while ((iSpaceStart = suffixal.find_last_of(L" ")) != -1) {
204 suffixal.erase(iSpaceStart, 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700205 }
206
207 if (suffixal.compare(L"0") != 0) {
208 strFieldName = strFieldNameParsed;
209 iControlNo = -1;
210 return;
211 }
212 }
213 strFieldName = strFieldNameParsed.substr(0, iStart);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214}
215
Ryan Harrison275e2602017-09-18 14:23:18 -0400216bool Field::AttachField(Document* pDocument, const WideString& csFieldName) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700217 m_pJSDoc = pDocument;
dsinclair82e17672016-10-11 12:38:01 -0700218 m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
dsinclair7cbe68e2016-10-12 11:56:23 -0700219 m_bCanSet = m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM) ||
220 m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM) ||
221 m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700222
dsinclair7cbe68e2016-10-12 11:56:23 -0700223 CPDFSDK_InterForm* pRDInterForm = m_pFormFillEnv->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700224 CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
Ryan Harrison275e2602017-09-18 14:23:18 -0400225 WideString swFieldNameTemp = csFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226 swFieldNameTemp.Replace(L"..", L".");
227
228 if (pInterForm->CountFields(swFieldNameTemp) <= 0) {
229 std::wstring strFieldName;
230 int iControlNo = -1;
231 ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo);
232 if (iControlNo == -1)
tsepez4cf55152016-11-02 14:37:54 -0700233 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234
235 m_FieldName = strFieldName.c_str();
236 m_nFormControlIndex = iControlNo;
tsepez4cf55152016-11-02 14:37:54 -0700237 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 }
239
240 m_FieldName = swFieldNameTemp;
241 m_nFormControlIndex = -1;
242
tsepez4cf55152016-11-02 14:37:54 -0700243 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700244}
245
Lei Zhangd88a3642015-11-10 09:38:57 -0800246std::vector<CPDF_FormField*> Field::GetFormFields(
dsinclair3a7741a2016-10-11 10:39:49 -0700247 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -0400248 const WideString& csFieldName) {
Lei Zhangd88a3642015-11-10 09:38:57 -0800249 std::vector<CPDF_FormField*> fields;
dsinclair7cbe68e2016-10-12 11:56:23 -0700250 CPDFSDK_InterForm* pReaderInterForm = pFormFillEnv->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700251 CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -0800252 for (int i = 0, sz = pInterForm->CountFields(csFieldName); i < sz; ++i) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
Lei Zhangd88a3642015-11-10 09:38:57 -0800254 fields.push_back(pFormField);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700255 }
Lei Zhangd88a3642015-11-10 09:38:57 -0800256 return fields;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257}
258
Lei Zhangd88a3642015-11-10 09:38:57 -0800259std::vector<CPDF_FormField*> Field::GetFormFields(
Ryan Harrison275e2602017-09-18 14:23:18 -0400260 const WideString& csFieldName) const {
dsinclair3a7741a2016-10-11 10:39:49 -0700261 return Field::GetFormFields(m_pFormFillEnv.Get(), csFieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700262}
263
dsinclair3a7741a2016-10-11 10:39:49 -0700264void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265 CPDF_FormField* pFormField,
tsepez4cf55152016-11-02 14:37:54 -0700266 bool bChangeMark,
267 bool bResetAP,
268 bool bRefresh) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700269 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700270
271 if (bResetAP) {
tsepez8fa82792017-01-11 09:32:33 -0800272 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
dsinclair1df1efa2016-09-07 09:55:37 -0700273 pInterForm->GetWidgets(pFormField, &widgets);
274
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700275 int nFieldType = pFormField->GetFieldType();
276 if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_TEXTFIELD) {
tsepez8fa82792017-01-11 09:32:33 -0800277 for (auto& pObserved : widgets) {
tsepez1c620542016-09-12 09:47:52 -0700278 if (pObserved) {
tsepez8fa82792017-01-11 09:32:33 -0800279 bool bFormatted = false;
Ryan Harrison275e2602017-09-18 14:23:18 -0400280 WideString sValue = static_cast<CPDFSDK_Widget*>(pObserved.Get())
281 ->OnFormat(bFormatted);
tsepez8fa82792017-01-11 09:32:33 -0800282 if (pObserved) { // Not redundant, may be clobbered by OnFormat.
283 static_cast<CPDFSDK_Widget*>(pObserved.Get())
284 ->ResetAppearance(bFormatted ? &sValue : nullptr, false);
285 }
tsepezca97a8e2016-08-01 10:10:36 -0700286 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700287 }
288 } else {
tsepez8fa82792017-01-11 09:32:33 -0800289 for (auto& pObserved : widgets) {
290 if (pObserved) {
291 static_cast<CPDFSDK_Widget*>(pObserved.Get())
292 ->ResetAppearance(nullptr, false);
293 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700294 }
295 }
296 }
297
298 if (bRefresh) {
dsinclair1df1efa2016-09-07 09:55:37 -0700299 // Refresh the widget list. The calls in |bResetAP| may have caused widgets
300 // to be removed from the list. We need to call |GetWidgets| again to be
301 // sure none of the widgets have been deleted.
tsepez8fa82792017-01-11 09:32:33 -0800302 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
dsinclair1df1efa2016-09-07 09:55:37 -0700303 pInterForm->GetWidgets(pFormField, &widgets);
304
dsinclair690c0332016-10-11 09:13:01 -0700305 // TODO(dsinclair): Determine if all widgets share the same
306 // CPDFSDK_InterForm. If that's the case, we can move the code to
dsinclair7cbe68e2016-10-12 11:56:23 -0700307 // |GetFormFillEnv| out of the loop.
tsepez8fa82792017-01-11 09:32:33 -0800308 for (auto& pObserved : widgets) {
309 if (pObserved) {
310 CPDFSDK_Widget* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
311 pWidget->GetInterForm()->GetFormFillEnv()->UpdateAllViews(nullptr,
312 pWidget);
313 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700314 }
315 }
316
317 if (bChangeMark)
dsinclair7cbe68e2016-10-12 11:56:23 -0700318 pFormFillEnv->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700319}
320
dsinclair3a7741a2016-10-11 10:39:49 -0700321void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700322 CPDF_FormControl* pFormControl,
tsepez4cf55152016-11-02 14:37:54 -0700323 bool bChangeMark,
324 bool bResetAP,
325 bool bRefresh) {
Lei Zhang96660d62015-12-14 18:27:25 -0800326 ASSERT(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700327
dsinclair7cbe68e2016-10-12 11:56:23 -0700328 CPDFSDK_InterForm* pForm = pFormFillEnv->GetInterForm();
dsinclairc5267c52016-11-04 15:35:12 -0700329 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330
331 if (pWidget) {
Ryan Harrison569817c2017-10-05 14:14:03 -0400332 CPDFSDK_Widget::ObservedPtr observed_widget(pWidget);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700333 if (bResetAP) {
334 int nFieldType = pWidget->GetFieldType();
335 if (nFieldType == FIELDTYPE_COMBOBOX ||
336 nFieldType == FIELDTYPE_TEXTFIELD) {
tsepez4cf55152016-11-02 14:37:54 -0700337 bool bFormatted = false;
Ryan Harrison275e2602017-09-18 14:23:18 -0400338 WideString sValue = pWidget->OnFormat(bFormatted);
Ryan Harrison569817c2017-10-05 14:14:03 -0400339 if (!observed_widget)
340 return;
tsepez4cf55152016-11-02 14:37:54 -0700341 pWidget->ResetAppearance(bFormatted ? &sValue : nullptr, false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700342 } else {
tsepez4cf55152016-11-02 14:37:54 -0700343 pWidget->ResetAppearance(nullptr, false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700344 }
Ryan Harrison569817c2017-10-05 14:14:03 -0400345 if (!observed_widget)
346 return;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700347 }
348
349 if (bRefresh) {
350 CPDFSDK_InterForm* pInterForm = pWidget->GetInterForm();
dsinclair7cbe68e2016-10-12 11:56:23 -0700351 pInterForm->GetFormFillEnv()->UpdateAllViews(nullptr, pWidget);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352 }
353 }
354
355 if (bChangeMark)
dsinclair7cbe68e2016-10-12 11:56:23 -0700356 pFormFillEnv->SetChangeMark();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700357}
358
dsinclair3a7741a2016-10-11 10:39:49 -0700359CPDFSDK_Widget* Field::GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
dsinclairc5267c52016-11-04 15:35:12 -0700360 CPDF_FormControl* pFormControl) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700361 CPDFSDK_InterForm* pInterForm =
362 static_cast<CPDFSDK_InterForm*>(pFormFillEnv->GetInterForm());
dsinclairc5267c52016-11-04 15:35:12 -0700363 return pInterForm ? pInterForm->GetWidget(pFormControl) : nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700364}
365
Ryan Harrison275e2602017-09-18 14:23:18 -0400366bool Field::ValueIsOccur(CPDF_FormField* pFormField, WideString csOptLabel) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700367 for (int i = 0, sz = pFormField->CountOptions(); i < sz; i++) {
368 if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
tsepez4cf55152016-11-02 14:37:54 -0700369 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700370 }
371
tsepez4cf55152016-11-02 14:37:54 -0700372 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700373}
374
375CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
376 if (!pFormField->CountControls() ||
377 m_nFormControlIndex >= pFormField->CountControls())
thestig1cd352e2016-06-07 17:53:06 -0700378 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700379 if (m_nFormControlIndex < 0)
380 return pFormField->GetControl(0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700381 return pFormField->GetControl(m_nFormControlIndex);
382}
383
dan sinclaircbe23db2017-10-19 14:29:33 -0400384bool Field::get_alignment(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400385 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400386 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700387 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700388
dan sinclair646634b2017-10-19 14:30:28 -0400389 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
390 if (FieldArray.empty())
391 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392
dan sinclair646634b2017-10-19 14:30:28 -0400393 CPDF_FormField* pFormField = FieldArray[0];
394 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
395 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700396
dan sinclair646634b2017-10-19 14:30:28 -0400397 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
398 if (!pFormControl)
399 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700400
dan sinclair646634b2017-10-19 14:30:28 -0400401 switch (pFormControl->GetControlAlignment()) {
402 case 1:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400403 vp->Set(pRuntime, L"center");
dan sinclair646634b2017-10-19 14:30:28 -0400404 break;
405 case 0:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400406 vp->Set(pRuntime, L"left");
dan sinclair646634b2017-10-19 14:30:28 -0400407 break;
408 case 2:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400409 vp->Set(pRuntime, L"right");
dan sinclair646634b2017-10-19 14:30:28 -0400410 break;
411 default:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400412 vp->Set(pRuntime, L"");
dan sinclair646634b2017-10-19 14:30:28 -0400413 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700414
tsepez4cf55152016-11-02 14:37:54 -0700415 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700416}
417
dan sinclaircbe23db2017-10-19 14:29:33 -0400418bool Field::set_alignment(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400419 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400420 WideString* sError) {
421 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400422 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700423}
424
dan sinclaircbe23db2017-10-19 14:29:33 -0400425bool Field::get_border_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400426 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400427 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700428 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700429
dan sinclaircbe23db2017-10-19 14:29:33 -0400430 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
431 if (FieldArray.empty())
432 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433
dan sinclaircbe23db2017-10-19 14:29:33 -0400434 CPDF_FormField* pFormField = FieldArray[0];
435 if (!pFormField)
436 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437
dan sinclaircbe23db2017-10-19 14:29:33 -0400438 CPDFSDK_Widget* pWidget =
439 GetWidget(m_pFormFillEnv.Get(), GetSmartFieldControl(pFormField));
440 if (!pWidget)
441 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700442
dan sinclaircbe23db2017-10-19 14:29:33 -0400443 switch (pWidget->GetBorderStyle()) {
444 case BorderStyle::SOLID:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400445 vp->Set(pRuntime, L"solid");
dan sinclaircbe23db2017-10-19 14:29:33 -0400446 break;
447 case BorderStyle::DASH:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400448 vp->Set(pRuntime, L"dashed");
dan sinclaircbe23db2017-10-19 14:29:33 -0400449 break;
450 case BorderStyle::BEVELED:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400451 vp->Set(pRuntime, L"beveled");
dan sinclaircbe23db2017-10-19 14:29:33 -0400452 break;
453 case BorderStyle::INSET:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400454 vp->Set(pRuntime, L"inset");
dan sinclaircbe23db2017-10-19 14:29:33 -0400455 break;
456 case BorderStyle::UNDERLINE:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400457 vp->Set(pRuntime, L"underline");
dan sinclaircbe23db2017-10-19 14:29:33 -0400458 break;
459 default:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400460 vp->Set(pRuntime, L"");
dan sinclaircbe23db2017-10-19 14:29:33 -0400461 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700462 }
dan sinclaircbe23db2017-10-19 14:29:33 -0400463 return true;
464}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700465
dan sinclaircbe23db2017-10-19 14:29:33 -0400466bool Field::set_border_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400467 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400468 WideString* sError) {
469 ASSERT(m_pFormFillEnv);
470
471 if (!m_bCanSet)
472 return false;
473
474 if (m_bDelay) {
Dan Sinclair33d13f22017-10-23 09:44:30 -0400475 AddDelay_String(FP_BORDERSTYLE, vp.ToByteString(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -0400476 } else {
477 Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400478 m_nFormControlIndex, vp.ToByteString(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -0400479 }
tsepez4cf55152016-11-02 14:37:54 -0700480 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700481}
482
dsinclair3a7741a2016-10-11 10:39:49 -0700483void Field::SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -0400484 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700485 int nControlIndex,
Ryan Harrison275e2602017-09-18 14:23:18 -0400486 const ByteString& string) {
dsinclair3a7741a2016-10-11 10:39:49 -0700487 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700488
dsinclair92cb5e52016-05-16 11:38:28 -0700489 BorderStyle nBorderStyle = BorderStyle::SOLID;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490 if (string == "solid")
dsinclair92cb5e52016-05-16 11:38:28 -0700491 nBorderStyle = BorderStyle::SOLID;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700492 else if (string == "beveled")
dsinclair92cb5e52016-05-16 11:38:28 -0700493 nBorderStyle = BorderStyle::BEVELED;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700494 else if (string == "dashed")
dsinclair92cb5e52016-05-16 11:38:28 -0700495 nBorderStyle = BorderStyle::DASH;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496 else if (string == "inset")
dsinclair92cb5e52016-05-16 11:38:28 -0700497 nBorderStyle = BorderStyle::INSET;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700498 else if (string == "underline")
dsinclair92cb5e52016-05-16 11:38:28 -0700499 nBorderStyle = BorderStyle::UNDERLINE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700500 else
501 return;
502
Lei Zhangd88a3642015-11-10 09:38:57 -0800503 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -0700504 GetFormFields(pFormFillEnv, swFieldName);
Lei Zhangd88a3642015-11-10 09:38:57 -0800505 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700506 if (nControlIndex < 0) {
tsepez4cf55152016-11-02 14:37:54 -0700507 bool bSet = false;
Lei Zhangd88a3642015-11-10 09:38:57 -0800508 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700509 if (CPDFSDK_Widget* pWidget =
dsinclairc5267c52016-11-04 15:35:12 -0700510 GetWidget(pFormFillEnv, pFormField->GetControl(i))) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700511 if (pWidget->GetBorderStyle() != nBorderStyle) {
512 pWidget->SetBorderStyle(nBorderStyle);
tsepez4cf55152016-11-02 14:37:54 -0700513 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700514 }
515 }
516 }
517 if (bSet)
tsepez4cf55152016-11-02 14:37:54 -0700518 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700519 } else {
520 if (nControlIndex >= pFormField->CountControls())
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700521 return;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700522 if (CPDF_FormControl* pFormControl =
523 pFormField->GetControl(nControlIndex)) {
dsinclairc5267c52016-11-04 15:35:12 -0700524 if (CPDFSDK_Widget* pWidget = GetWidget(pFormFillEnv, pFormControl)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700525 if (pWidget->GetBorderStyle() != nBorderStyle) {
526 pWidget->SetBorderStyle(nBorderStyle);
tsepez4cf55152016-11-02 14:37:54 -0700527 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700528 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700529 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700530 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700531 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700532 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700533}
534
dan sinclaircbe23db2017-10-19 14:29:33 -0400535bool Field::get_button_align_x(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400536 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400537 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700538 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700539
dan sinclaircbe23db2017-10-19 14:29:33 -0400540 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
541 if (FieldArray.empty())
542 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700543
dan sinclaircbe23db2017-10-19 14:29:33 -0400544 CPDF_FormField* pFormField = FieldArray[0];
545 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
546 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547
dan sinclaircbe23db2017-10-19 14:29:33 -0400548 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
549 if (!pFormControl)
550 return false;
551
552 CPDF_IconFit IconFit = pFormControl->GetIconFit();
553
554 float fLeft;
555 float fBottom;
556 IconFit.GetIconPosition(fLeft, fBottom);
557
Dan Sinclair33d13f22017-10-23 09:44:30 -0400558 vp->Set(pRuntime, static_cast<int32_t>(fLeft));
dan sinclaircbe23db2017-10-19 14:29:33 -0400559 return true;
560}
561
562bool Field::set_button_align_x(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400563 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400564 WideString* sError) {
565 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400566 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700567}
568
dan sinclaircbe23db2017-10-19 14:29:33 -0400569bool Field::get_button_align_y(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400570 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400571 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700572 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700573
dan sinclaircbe23db2017-10-19 14:29:33 -0400574 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
575 if (FieldArray.empty())
576 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700577
dan sinclaircbe23db2017-10-19 14:29:33 -0400578 CPDF_FormField* pFormField = FieldArray[0];
579 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
580 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700581
dan sinclaircbe23db2017-10-19 14:29:33 -0400582 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
583 if (!pFormControl)
584 return false;
585
586 CPDF_IconFit IconFit = pFormControl->GetIconFit();
587
588 float fLeft;
589 float fBottom;
590 IconFit.GetIconPosition(fLeft, fBottom);
591
Dan Sinclair33d13f22017-10-23 09:44:30 -0400592 vp->Set(pRuntime, static_cast<int32_t>(fBottom));
dan sinclaircbe23db2017-10-19 14:29:33 -0400593 return true;
594}
595
596bool Field::set_button_align_y(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400597 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400598 WideString* sError) {
599 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400600 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700601}
602
dan sinclaircbe23db2017-10-19 14:29:33 -0400603bool Field::get_button_fit_bounds(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400604 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400605 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700606 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607
dan sinclair646634b2017-10-19 14:30:28 -0400608 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
609 if (FieldArray.empty())
610 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700611
dan sinclair646634b2017-10-19 14:30:28 -0400612 CPDF_FormField* pFormField = FieldArray[0];
613 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
614 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700615
dan sinclair646634b2017-10-19 14:30:28 -0400616 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
617 if (!pFormControl)
618 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619
Dan Sinclair33d13f22017-10-23 09:44:30 -0400620 vp->Set(pRuntime, pFormControl->GetIconFit().GetFittingBounds());
dan sinclair646634b2017-10-19 14:30:28 -0400621 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400622}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700623
dan sinclaircbe23db2017-10-19 14:29:33 -0400624bool Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400625 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400626 WideString* sError) {
627 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400628 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700629}
630
dan sinclaircbe23db2017-10-19 14:29:33 -0400631bool Field::get_button_position(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400632 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400633 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700634 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700635
dan sinclair646634b2017-10-19 14:30:28 -0400636 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
637 if (FieldArray.empty())
638 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700639
dan sinclair646634b2017-10-19 14:30:28 -0400640 CPDF_FormField* pFormField = FieldArray[0];
641 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
642 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700643
dan sinclair646634b2017-10-19 14:30:28 -0400644 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
645 if (!pFormControl)
646 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700647
Dan Sinclair33d13f22017-10-23 09:44:30 -0400648 vp->Set(pRuntime, pFormControl->GetTextPosition());
dan sinclair646634b2017-10-19 14:30:28 -0400649 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400650}
651
652bool Field::set_button_position(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400653 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400654 WideString* sError) {
655 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400656 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700657}
658
dan sinclaircbe23db2017-10-19 14:29:33 -0400659bool Field::get_button_scale_how(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400660 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400661 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700662 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700663
dan sinclair646634b2017-10-19 14:30:28 -0400664 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
665 if (FieldArray.empty())
666 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700667
dan sinclair646634b2017-10-19 14:30:28 -0400668 CPDF_FormField* pFormField = FieldArray[0];
669 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
670 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700671
dan sinclair646634b2017-10-19 14:30:28 -0400672 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
673 if (!pFormControl)
674 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700675
Dan Sinclair33d13f22017-10-23 09:44:30 -0400676 vp->Set(pRuntime, pFormControl->GetIconFit().IsProportionalScale() ? 0 : 1);
dan sinclair646634b2017-10-19 14:30:28 -0400677 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400678}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700679
dan sinclaircbe23db2017-10-19 14:29:33 -0400680bool Field::set_button_scale_how(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400681 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400682 WideString* sError) {
683 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400684 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700685}
686
dan sinclaircbe23db2017-10-19 14:29:33 -0400687bool Field::get_button_scale_when(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400688 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400689 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700690 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700691
dan sinclair646634b2017-10-19 14:30:28 -0400692 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
693 if (FieldArray.empty())
694 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700695
dan sinclair646634b2017-10-19 14:30:28 -0400696 CPDF_FormField* pFormField = FieldArray[0];
697 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
698 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700699
dan sinclair646634b2017-10-19 14:30:28 -0400700 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
701 if (!pFormControl)
702 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700703
dan sinclair646634b2017-10-19 14:30:28 -0400704 CPDF_IconFit IconFit = pFormControl->GetIconFit();
705 int ScaleM = IconFit.GetScaleMethod();
706 switch (ScaleM) {
707 case CPDF_IconFit::Always:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400708 vp->Set(pRuntime, static_cast<int32_t>(CPDF_IconFit::Always));
dan sinclair646634b2017-10-19 14:30:28 -0400709 break;
710 case CPDF_IconFit::Bigger:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400711 vp->Set(pRuntime, static_cast<int32_t>(CPDF_IconFit::Bigger));
dan sinclair646634b2017-10-19 14:30:28 -0400712 break;
713 case CPDF_IconFit::Never:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400714 vp->Set(pRuntime, static_cast<int32_t>(CPDF_IconFit::Never));
dan sinclair646634b2017-10-19 14:30:28 -0400715 break;
716 case CPDF_IconFit::Smaller:
Dan Sinclair33d13f22017-10-23 09:44:30 -0400717 vp->Set(pRuntime, static_cast<int32_t>(CPDF_IconFit::Smaller));
dan sinclair646634b2017-10-19 14:30:28 -0400718 break;
719 }
720 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400721}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700722
dan sinclaircbe23db2017-10-19 14:29:33 -0400723bool Field::set_button_scale_when(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400724 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400725 WideString* sError) {
726 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400727 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700728}
729
dan sinclaircbe23db2017-10-19 14:29:33 -0400730bool Field::get_calc_order_index(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400731 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400732 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700733 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700734
dan sinclair646634b2017-10-19 14:30:28 -0400735 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
736 if (FieldArray.empty())
737 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700738
dan sinclair646634b2017-10-19 14:30:28 -0400739 CPDF_FormField* pFormField = FieldArray[0];
740 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
741 pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD) {
742 return false;
743 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700744
dan sinclair646634b2017-10-19 14:30:28 -0400745 CPDFSDK_InterForm* pRDInterForm = m_pFormFillEnv->GetInterForm();
746 CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
Dan Sinclair33d13f22017-10-23 09:44:30 -0400747 vp->Set(pRuntime, static_cast<int32_t>(
748 pInterForm->FindFieldInCalculationOrder(pFormField)));
dan sinclair646634b2017-10-19 14:30:28 -0400749 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400750}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700751
dan sinclaircbe23db2017-10-19 14:29:33 -0400752bool Field::set_calc_order_index(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400753 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400754 WideString* sError) {
755 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400756 return m_bCanSet;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700757}
758
dan sinclaircbe23db2017-10-19 14:29:33 -0400759bool Field::get_char_limit(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400760 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400761 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700762 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700763
dan sinclaircbe23db2017-10-19 14:29:33 -0400764 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
765 if (FieldArray.empty())
766 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700767
dan sinclaircbe23db2017-10-19 14:29:33 -0400768 CPDF_FormField* pFormField = FieldArray[0];
769 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
770 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700771
Dan Sinclair33d13f22017-10-23 09:44:30 -0400772 vp->Set(pRuntime, static_cast<int32_t>(pFormField->GetMaxLen()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400773 return true;
774}
775
776bool Field::set_char_limit(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400777 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400778 WideString* sError) {
779 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400780 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700781}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700782
Dan Sinclair33d13f22017-10-23 09:44:30 -0400783bool Field::get_comb(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700784 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700785
dan sinclaircbe23db2017-10-19 14:29:33 -0400786 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
787 if (FieldArray.empty())
788 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700789
dan sinclaircbe23db2017-10-19 14:29:33 -0400790 CPDF_FormField* pFormField = FieldArray[0];
791 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
792 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700793
Dan Sinclair33d13f22017-10-23 09:44:30 -0400794 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_COMB));
dan sinclaircbe23db2017-10-19 14:29:33 -0400795 return true;
796}
797
798bool Field::set_comb(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400799 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400800 WideString* sError) {
801 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400802 return m_bCanSet;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700803}
804
dan sinclaircbe23db2017-10-19 14:29:33 -0400805bool Field::get_commit_on_sel_change(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400806 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400807 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700808 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700809
dan sinclair646634b2017-10-19 14:30:28 -0400810 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
811 if (FieldArray.empty())
812 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700813
dan sinclair646634b2017-10-19 14:30:28 -0400814 CPDF_FormField* pFormField = FieldArray[0];
815 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
816 pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
817 return false;
818 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700819
Dan Sinclair33d13f22017-10-23 09:44:30 -0400820 vp->Set(pRuntime,
821 !!(pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE));
dan sinclair646634b2017-10-19 14:30:28 -0400822 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400823}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700824
dan sinclaircbe23db2017-10-19 14:29:33 -0400825bool Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400826 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400827 WideString* sError) {
828 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400829 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700830}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700831
dan sinclaircbe23db2017-10-19 14:29:33 -0400832bool Field::get_current_value_indices(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400833 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400834 WideString* sError) {
835 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
836 if (FieldArray.empty())
837 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700838
dan sinclaircbe23db2017-10-19 14:29:33 -0400839 CPDF_FormField* pFormField = FieldArray[0];
840 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
841 pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
842 return false;
843 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700844
dan sinclaircbe23db2017-10-19 14:29:33 -0400845 int count = pFormField->CountSelectedItems();
846 if (count <= 0) {
Dan Sinclair33d13f22017-10-23 09:44:30 -0400847 vp->Set(pRuntime, -1);
dan sinclaircbe23db2017-10-19 14:29:33 -0400848 return true;
849 }
850 if (count == 1) {
Dan Sinclair33d13f22017-10-23 09:44:30 -0400851 vp->Set(pRuntime, pFormField->GetSelectedIndex(0));
dan sinclaircbe23db2017-10-19 14:29:33 -0400852 return true;
853 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700854
dan sinclaircbe23db2017-10-19 14:29:33 -0400855 CJS_Array SelArray;
856 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
857 SelArray.SetElement(pRuntime, i,
858 CJS_Value(pRuntime, pFormField->GetSelectedIndex(i)));
859 }
Dan Sinclair33d13f22017-10-23 09:44:30 -0400860 vp->Set(pRuntime, SelArray);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700861
dan sinclaircbe23db2017-10-19 14:29:33 -0400862 return true;
863}
864
865bool Field::set_current_value_indices(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400866 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400867 WideString* sError) {
868 if (!m_bCanSet)
869 return false;
870
871 std::vector<uint32_t> array;
Dan Sinclair33d13f22017-10-23 09:44:30 -0400872 if (vp.GetType() == CJS_Value::VT_number) {
873 array.push_back(vp.ToInt(pRuntime));
874 } else if (vp.IsArrayObject()) {
875 CJS_Array SelArray = vp.ToArray(pRuntime);
Dan Sinclairc9708952017-10-23 09:40:59 -0400876 for (int i = 0, sz = SelArray.GetLength(pRuntime); i < sz; i++)
877 array.push_back(SelArray.GetElement(pRuntime, i).ToInt(pRuntime));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700878 }
879
dan sinclaircbe23db2017-10-19 14:29:33 -0400880 if (m_bDelay) {
881 AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
882 } else {
883 Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
884 m_nFormControlIndex, array);
885 }
tsepez4cf55152016-11-02 14:37:54 -0700886 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700887}
888
dsinclair3a7741a2016-10-11 10:39:49 -0700889void Field::SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -0400890 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700891 int nControlIndex,
tsepez41a53ad2016-03-28 16:59:30 -0700892 const std::vector<uint32_t>& array) {
dsinclair3a7741a2016-10-11 10:39:49 -0700893 ASSERT(pFormFillEnv);
Lei Zhangd88a3642015-11-10 09:38:57 -0800894 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -0700895 GetFormFields(pFormFillEnv, swFieldName);
tsepez41a53ad2016-03-28 16:59:30 -0700896
Lei Zhangd88a3642015-11-10 09:38:57 -0800897 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700898 int nFieldType = pFormField->GetFieldType();
899 if (nFieldType == FIELDTYPE_COMBOBOX || nFieldType == FIELDTYPE_LISTBOX) {
tsepezc3255f52016-03-25 14:52:27 -0700900 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
tsepez4cf55152016-11-02 14:37:54 -0700901 pFormField->ClearSelection(true);
tsepez41a53ad2016-03-28 16:59:30 -0700902 for (size_t i = 0; i < array.size(); ++i) {
903 if (i != 0 && !(dwFieldFlags & (1 << 21)))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700904 break;
Wei Li05d53f02016-03-29 16:42:53 -0700905 if (array[i] < static_cast<uint32_t>(pFormField->CountOptions()) &&
tsepez41a53ad2016-03-28 16:59:30 -0700906 !pFormField->IsItemSelected(array[i])) {
tsepez4cf55152016-11-02 14:37:54 -0700907 pFormField->SetItemSelection(array[i], true);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700908 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909 }
tsepez4cf55152016-11-02 14:37:54 -0700910 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700911 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700912 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700913}
914
dan sinclaircbe23db2017-10-19 14:29:33 -0400915bool Field::get_default_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400916 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400917 WideString* sError) {
918 return false;
919}
920
921bool Field::set_default_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400922 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400923 WideString* sError) {
tsepez4cf55152016-11-02 14:37:54 -0700924 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700925}
926
dan sinclaircbe23db2017-10-19 14:29:33 -0400927bool Field::get_default_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400928 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400929 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700930 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700931
Lei Zhangd88a3642015-11-10 09:38:57 -0800932 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
933 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -0700934 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700935
Lei Zhangd88a3642015-11-10 09:38:57 -0800936 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700937 if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON ||
Lei Zhangd88a3642015-11-10 09:38:57 -0800938 pFormField->GetFieldType() == FIELDTYPE_SIGNATURE) {
tsepez4cf55152016-11-02 14:37:54 -0700939 return false;
Lei Zhangd88a3642015-11-10 09:38:57 -0800940 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700941
Dan Sinclair33d13f22017-10-23 09:44:30 -0400942 vp->Set(pRuntime, pFormField->GetDefaultValue());
dan sinclaircbe23db2017-10-19 14:29:33 -0400943 return true;
944}
945
946bool Field::set_default_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400947 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400948 WideString* sError) {
949 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400950 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700951}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700952
dan sinclaircbe23db2017-10-19 14:29:33 -0400953bool Field::get_do_not_scroll(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400954 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400955 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700956 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700957
dan sinclaircbe23db2017-10-19 14:29:33 -0400958 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
959 if (FieldArray.empty())
960 return false;
961
962 CPDF_FormField* pFormField = FieldArray[0];
963 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
964 return false;
965
Dan Sinclair33d13f22017-10-23 09:44:30 -0400966 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL));
dan sinclaircbe23db2017-10-19 14:29:33 -0400967 return true;
968}
969
970bool Field::set_do_not_scroll(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400971 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400972 WideString* sError) {
973 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -0400974 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700975}
976
dan sinclaircbe23db2017-10-19 14:29:33 -0400977bool Field::get_do_not_spell_check(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400978 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400979 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -0700980 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981
dan sinclair646634b2017-10-19 14:30:28 -0400982 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
983 if (FieldArray.empty())
984 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700985
dan sinclair646634b2017-10-19 14:30:28 -0400986 CPDF_FormField* pFormField = FieldArray[0];
987 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD &&
988 pFormField->GetFieldType() != FIELDTYPE_COMBOBOX) {
989 return false;
990 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700991
Dan Sinclair33d13f22017-10-23 09:44:30 -0400992 vp->Set(pRuntime,
993 !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK));
dan sinclair646634b2017-10-19 14:30:28 -0400994 return true;
dan sinclaircbe23db2017-10-19 14:29:33 -0400995}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700996
dan sinclaircbe23db2017-10-19 14:29:33 -0400997bool Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -0400998 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -0400999 WideString* sError) {
1000 ASSERT(m_pFormFillEnv);
1001 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001002}
1003
tsepez4cf55152016-11-02 14:37:54 -07001004void Field::SetDelay(bool bDelay) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001005 m_bDelay = bDelay;
1006
dan sinclaircbe23db2017-10-19 14:29:33 -04001007 if (m_bDelay)
1008 return;
dan sinclaircbe23db2017-10-19 14:29:33 -04001009 if (m_pJSDoc)
1010 m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001011}
1012
dan sinclaircbe23db2017-10-19 14:29:33 -04001013bool Field::get_delay(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001014 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001015 WideString* sError) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001016 vp->Set(pRuntime, m_bDelay);
tsepez4cf55152016-11-02 14:37:54 -07001017 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001018}
1019
dan sinclaircbe23db2017-10-19 14:29:33 -04001020bool Field::set_delay(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001021 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001022 WideString* sError) {
1023 if (!m_bCanSet)
1024 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001025
Dan Sinclair33d13f22017-10-23 09:44:30 -04001026 SetDelay(vp.ToBool(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001027 return true;
1028}
1029
1030bool Field::get_display(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001031 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001032 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001033 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1034 if (FieldArray.empty())
1035 return false;
1036
1037 CPDF_FormField* pFormField = FieldArray[0];
1038 ASSERT(pFormField);
dan sinclaircbe23db2017-10-19 14:29:33 -04001039
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001040 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
1041 CPDFSDK_Widget* pWidget =
1042 pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1043 if (!pWidget)
1044 return false;
1045
1046 uint32_t dwFlag = pWidget->GetFlags();
1047 if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001048 vp->Set(pRuntime, 1);
dan sinclaircbe23db2017-10-19 14:29:33 -04001049 return true;
1050 }
1051 if (ANNOTFLAG_PRINT & dwFlag) {
1052 if (ANNOTFLAG_NOVIEW & dwFlag)
Dan Sinclair33d13f22017-10-23 09:44:30 -04001053 vp->Set(pRuntime, 3);
dan sinclaircbe23db2017-10-19 14:29:33 -04001054 else
Dan Sinclair33d13f22017-10-23 09:44:30 -04001055 vp->Set(pRuntime, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001056 } else {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001057 vp->Set(pRuntime, 2);
dan sinclaircbe23db2017-10-19 14:29:33 -04001058 }
1059 return true;
1060}
1061
1062bool Field::set_display(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001063 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001064 WideString* sError) {
1065 if (!m_bCanSet)
1066 return false;
1067
1068 if (m_bDelay) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001069 AddDelay_Int(FP_DISPLAY, vp.ToInt(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001070 } else {
1071 Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001072 vp.ToInt(pRuntime));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001073 }
tsepez4cf55152016-11-02 14:37:54 -07001074 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001075}
1076
dsinclair3a7741a2016-10-11 10:39:49 -07001077void Field::SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -04001078 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001079 int nControlIndex,
1080 int number) {
dsinclair7cbe68e2016-10-12 11:56:23 -07001081 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -08001082 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -07001083 GetFormFields(pFormFillEnv, swFieldName);
Lei Zhangd88a3642015-11-10 09:38:57 -08001084 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001085 if (nControlIndex < 0) {
tonikitoo7c05a7a2016-08-17 11:08:46 -07001086 bool bAnySet = false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001087 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1088 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Lei Zhang96660d62015-12-14 18:27:25 -08001089 ASSERT(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001090
dsinclairc5267c52016-11-04 15:35:12 -07001091 CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
tonikitoo7c05a7a2016-08-17 11:08:46 -07001092 if (SetWidgetDisplayStatus(pWidget, number))
1093 bAnySet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001094 }
1095
tonikitoo7c05a7a2016-08-17 11:08:46 -07001096 if (bAnySet)
tsepez4cf55152016-11-02 14:37:54 -07001097 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001098 } else {
1099 if (nControlIndex >= pFormField->CountControls())
1100 return;
tonikitoo7c05a7a2016-08-17 11:08:46 -07001101
1102 CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex);
1103 if (!pFormControl)
1104 return;
1105
dsinclairc5267c52016-11-04 15:35:12 -07001106 CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl);
tonikitoo7c05a7a2016-08-17 11:08:46 -07001107 if (SetWidgetDisplayStatus(pWidget, number))
tsepez4cf55152016-11-02 14:37:54 -07001108 UpdateFormControl(pFormFillEnv, pFormControl, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001109 }
1110 }
1111}
1112
Dan Sinclair33d13f22017-10-23 09:44:30 -04001113bool Field::get_doc(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
1114 vp->Set(pRuntime, m_pJSDoc->GetCJSDoc());
tsepez4cf55152016-11-02 14:37:54 -07001115 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001116}
1117
dan sinclaircbe23db2017-10-19 14:29:33 -04001118bool Field::set_doc(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001119 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001120 WideString* sError) {
1121 return false;
1122}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001123
dan sinclaircbe23db2017-10-19 14:29:33 -04001124bool Field::get_editable(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001125 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001126 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001127 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1128 if (FieldArray.empty())
1129 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001130
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001131 CPDF_FormField* pFormField = FieldArray[0];
1132 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
1133 return false;
1134
Dan Sinclair33d13f22017-10-23 09:44:30 -04001135 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT));
tsepez4cf55152016-11-02 14:37:54 -07001136 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001137}
1138
dan sinclaircbe23db2017-10-19 14:29:33 -04001139bool Field::set_editable(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001140 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001141 WideString* sError) {
1142 return m_bCanSet;
1143}
1144
1145bool Field::get_export_values(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001146 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001147 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001148 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1149 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001150 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001151
Lei Zhangd88a3642015-11-10 09:38:57 -08001152 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001153 if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
Lei Zhangd88a3642015-11-10 09:38:57 -08001154 pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) {
tsepez4cf55152016-11-02 14:37:54 -07001155 return false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001156 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001157
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001158 CJS_Array ExportValusArray;
1159 if (m_nFormControlIndex < 0) {
1160 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
1161 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001162 ExportValusArray.SetElement(
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001163 pRuntime, i,
tsepeze5aff742016-08-08 09:49:42 -07001164 CJS_Value(pRuntime, pFormControl->GetExportValue().c_str()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001165 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001166 } else {
1167 if (m_nFormControlIndex >= pFormField->CountControls())
1168 return false;
1169
1170 CPDF_FormControl* pFormControl =
1171 pFormField->GetControl(m_nFormControlIndex);
1172 if (!pFormControl)
1173 return false;
1174
1175 ExportValusArray.SetElement(
1176 pRuntime, 0,
1177 CJS_Value(pRuntime, pFormControl->GetExportValue().c_str()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001178 }
dan sinclaircbe23db2017-10-19 14:29:33 -04001179
Dan Sinclair33d13f22017-10-23 09:44:30 -04001180 vp->Set(pRuntime, ExportValusArray);
tsepez4cf55152016-11-02 14:37:54 -07001181 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001182}
1183
dan sinclaircbe23db2017-10-19 14:29:33 -04001184bool Field::set_export_values(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001185 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001186 WideString* sError) {
1187 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1188 if (FieldArray.empty())
1189 return false;
1190
1191 CPDF_FormField* pFormField = FieldArray[0];
1192 if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
1193 pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) {
1194 return false;
1195 }
1196
Dan Sinclair33d13f22017-10-23 09:44:30 -04001197 return m_bCanSet && vp.IsArrayObject();
dan sinclaircbe23db2017-10-19 14:29:33 -04001198}
1199
1200bool Field::get_file_select(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001201 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001202 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001203 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1204 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001205 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001206
Lei Zhangd88a3642015-11-10 09:38:57 -08001207 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001208 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
tsepez4cf55152016-11-02 14:37:54 -07001209 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001210
Dan Sinclair33d13f22017-10-23 09:44:30 -04001211 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT));
tsepez4cf55152016-11-02 14:37:54 -07001212 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001213}
1214
dan sinclaircbe23db2017-10-19 14:29:33 -04001215bool Field::set_file_select(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001216 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001217 WideString* sError) {
1218 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1219 if (FieldArray.empty())
1220 return false;
1221
1222 CPDF_FormField* pFormField = FieldArray[0];
1223 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1224 return false;
1225
1226 return m_bCanSet;
1227}
1228
1229bool Field::get_fill_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001230 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001231 WideString* sError) {
tsepeze5aff742016-08-08 09:49:42 -07001232 CJS_Array crArray;
Lei Zhangd88a3642015-11-10 09:38:57 -08001233 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1234 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001235 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001236
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001237 CPDF_FormField* pFormField = FieldArray[0];
1238 ASSERT(pFormField);
1239 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1240 if (!pFormControl)
1241 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001242
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001243 int iColorType;
1244 pFormControl->GetBackgroundColor(iColorType);
1245
Dan Sinclair7f55a542017-07-13 14:17:10 -04001246 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001247 if (iColorType == CFX_Color::kTransparent) {
1248 color = CFX_Color(CFX_Color::kTransparent);
1249 } else if (iColorType == CFX_Color::kGray) {
1250 color = CFX_Color(CFX_Color::kGray,
1251 pFormControl->GetOriginalBackgroundColor(0));
1252 } else if (iColorType == CFX_Color::kRGB) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001253 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001254 CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001255 pFormControl->GetOriginalBackgroundColor(1),
1256 pFormControl->GetOriginalBackgroundColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001257 } else if (iColorType == CFX_Color::kCMYK) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001258 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001259 CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001260 pFormControl->GetOriginalBackgroundColor(1),
1261 pFormControl->GetOriginalBackgroundColor(2),
1262 pFormControl->GetOriginalBackgroundColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001263 } else {
1264 return false;
1265 }
dan sinclaircbe23db2017-10-19 14:29:33 -04001266
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001267 color::ConvertPWLColorToArray(pRuntime, color, &crArray);
Dan Sinclair33d13f22017-10-23 09:44:30 -04001268 vp->Set(pRuntime, crArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001269 return true;
1270}
1271
1272bool Field::set_fill_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001273 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001274 WideString* sError) {
1275 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1276 if (FieldArray.empty())
1277 return false;
dan sinclaircbe23db2017-10-19 14:29:33 -04001278 if (!m_bCanSet)
1279 return false;
Dan Sinclair33d13f22017-10-23 09:44:30 -04001280 if (!vp.IsArrayObject())
dan sinclaircbe23db2017-10-19 14:29:33 -04001281 return false;
tsepez4cf55152016-11-02 14:37:54 -07001282 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001283}
1284
dan sinclaircbe23db2017-10-19 14:29:33 -04001285bool Field::get_hidden(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001286 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001287 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001288 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1289 if (FieldArray.empty())
1290 return false;
1291
1292 CPDF_FormField* pFormField = FieldArray[0];
1293 ASSERT(pFormField);
dan sinclaircbe23db2017-10-19 14:29:33 -04001294
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001295 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
1296 CPDFSDK_Widget* pWidget =
1297 pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1298 if (!pWidget)
1299 return false;
1300
1301 uint32_t dwFlags = pWidget->GetFlags();
Dan Sinclair33d13f22017-10-23 09:44:30 -04001302 vp->Set(pRuntime,
1303 ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags);
dan sinclaircbe23db2017-10-19 14:29:33 -04001304 return true;
1305}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001306
dan sinclaircbe23db2017-10-19 14:29:33 -04001307bool Field::set_hidden(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001308 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001309 WideString* sError) {
1310 if (!m_bCanSet)
1311 return false;
1312
1313 if (m_bDelay) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001314 AddDelay_Bool(FP_HIDDEN, vp.ToBool(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001315 } else {
1316 Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001317 vp.ToBool(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001318 }
tsepez4cf55152016-11-02 14:37:54 -07001319 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001320}
1321
dsinclair3a7741a2016-10-11 10:39:49 -07001322void Field::SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -04001323 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001324 int nControlIndex,
1325 bool b) {
tonikitooa73b8fe2016-08-22 14:06:49 -07001326 int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
dsinclair3a7741a2016-10-11 10:39:49 -07001327 SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001328}
1329
dan sinclaircbe23db2017-10-19 14:29:33 -04001330bool Field::get_highlight(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001331 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001332 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001333 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001334
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001335 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1336 if (FieldArray.empty())
1337 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001338
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001339 CPDF_FormField* pFormField = FieldArray[0];
1340 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
1341 return false;
1342
1343 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1344 if (!pFormControl)
1345 return false;
1346
1347 int eHM = pFormControl->GetHighlightingMode();
1348 switch (eHM) {
1349 case CPDF_FormControl::None:
Dan Sinclair33d13f22017-10-23 09:44:30 -04001350 vp->Set(pRuntime, L"none");
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001351 break;
1352 case CPDF_FormControl::Push:
Dan Sinclair33d13f22017-10-23 09:44:30 -04001353 vp->Set(pRuntime, L"push");
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001354 break;
1355 case CPDF_FormControl::Invert:
Dan Sinclair33d13f22017-10-23 09:44:30 -04001356 vp->Set(pRuntime, L"invert");
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001357 break;
1358 case CPDF_FormControl::Outline:
Dan Sinclair33d13f22017-10-23 09:44:30 -04001359 vp->Set(pRuntime, L"outline");
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001360 break;
1361 case CPDF_FormControl::Toggle:
Dan Sinclair33d13f22017-10-23 09:44:30 -04001362 vp->Set(pRuntime, L"toggle");
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001363 break;
1364 }
tsepez4cf55152016-11-02 14:37:54 -07001365 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001366}
1367
dan sinclaircbe23db2017-10-19 14:29:33 -04001368bool Field::set_highlight(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001369 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001370 WideString* sError) {
1371 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001372 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001373}
1374
dan sinclaircbe23db2017-10-19 14:29:33 -04001375bool Field::get_line_width(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001376 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001377 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001378 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1379 if (FieldArray.empty())
1380 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001381
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001382 CPDF_FormField* pFormField = FieldArray[0];
1383 ASSERT(pFormField);
dan sinclaircbe23db2017-10-19 14:29:33 -04001384
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001385 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1386 if (!pFormControl)
1387 return false;
1388
1389 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
1390 if (!pFormField->CountControls())
1391 return false;
1392
1393 CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
1394 if (!pWidget)
1395 return false;
1396
Dan Sinclair33d13f22017-10-23 09:44:30 -04001397 vp->Set(pRuntime, pWidget->GetBorderWidth());
dan sinclaircbe23db2017-10-19 14:29:33 -04001398 return true;
1399}
1400
1401bool Field::set_line_width(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001402 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001403 WideString* sError) {
1404 if (!m_bCanSet)
1405 return false;
1406
1407 if (m_bDelay) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001408 AddDelay_Int(FP_LINEWIDTH, vp.ToInt(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001409 } else {
1410 Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001411 vp.ToInt(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04001412 }
tsepez4cf55152016-11-02 14:37:54 -07001413 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001414}
1415
dsinclair3a7741a2016-10-11 10:39:49 -07001416void Field::SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -04001417 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001418 int nControlIndex,
1419 int number) {
dsinclair7cbe68e2016-10-12 11:56:23 -07001420 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -08001421 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -07001422 GetFormFields(pFormFillEnv, swFieldName);
Lei Zhangd88a3642015-11-10 09:38:57 -08001423 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001424 if (nControlIndex < 0) {
tsepez4cf55152016-11-02 14:37:54 -07001425 bool bSet = false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001426 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1427 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Lei Zhang96660d62015-12-14 18:27:25 -08001428 ASSERT(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001429
dsinclairc5267c52016-11-04 15:35:12 -07001430 if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001431 if (number != pWidget->GetBorderWidth()) {
1432 pWidget->SetBorderWidth(number);
tsepez4cf55152016-11-02 14:37:54 -07001433 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001434 }
1435 }
1436 }
1437 if (bSet)
tsepez4cf55152016-11-02 14:37:54 -07001438 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001439 } else {
1440 if (nControlIndex >= pFormField->CountControls())
1441 return;
1442 if (CPDF_FormControl* pFormControl =
1443 pFormField->GetControl(nControlIndex)) {
dsinclairc5267c52016-11-04 15:35:12 -07001444 if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001445 if (number != pWidget->GetBorderWidth()) {
1446 pWidget->SetBorderWidth(number);
tsepez4cf55152016-11-02 14:37:54 -07001447 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001448 }
1449 }
1450 }
1451 }
1452 }
1453}
1454
dan sinclaircbe23db2017-10-19 14:29:33 -04001455bool Field::get_multiline(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001456 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001457 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001458 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001459
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001460 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1461 if (FieldArray.empty())
1462 return false;
1463
1464 CPDF_FormField* pFormField = FieldArray[0];
1465 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1466 return false;
1467
Dan Sinclair33d13f22017-10-23 09:44:30 -04001468 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE));
tsepez4cf55152016-11-02 14:37:54 -07001469 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001470}
1471
dan sinclaircbe23db2017-10-19 14:29:33 -04001472bool Field::set_multiline(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001473 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001474 WideString* sError) {
1475 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001476 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001477}
1478
dan sinclaircbe23db2017-10-19 14:29:33 -04001479bool Field::get_multiple_selection(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001480 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001481 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001482 ASSERT(m_pFormFillEnv);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001483 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1484 if (FieldArray.empty())
1485 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001486
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001487 CPDF_FormField* pFormField = FieldArray[0];
1488 if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
1489 return false;
1490
Dan Sinclair33d13f22017-10-23 09:44:30 -04001491 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT));
dan sinclaircbe23db2017-10-19 14:29:33 -04001492 return true;
1493}
1494
1495bool Field::set_multiple_selection(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001496 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001497 WideString* sError) {
1498 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001499 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001500}
1501
Dan Sinclair33d13f22017-10-23 09:44:30 -04001502bool Field::get_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001503 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1504 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001505 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001506
Dan Sinclair33d13f22017-10-23 09:44:30 -04001507 vp->Set(pRuntime, m_FieldName);
tsepez4cf55152016-11-02 14:37:54 -07001508 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001509}
1510
dan sinclaircbe23db2017-10-19 14:29:33 -04001511bool Field::set_name(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001512 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001513 WideString* sError) {
1514 return false;
1515}
Tom Sepez67fd5df2015-10-08 12:24:19 -07001516
dan sinclaircbe23db2017-10-19 14:29:33 -04001517bool Field::get_num_items(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001518 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001519 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001520 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1521 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001522 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001523
Lei Zhangd88a3642015-11-10 09:38:57 -08001524 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001525 if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
Lei Zhangd88a3642015-11-10 09:38:57 -08001526 pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
tsepez4cf55152016-11-02 14:37:54 -07001527 return false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001528 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001529
Dan Sinclair33d13f22017-10-23 09:44:30 -04001530 vp->Set(pRuntime, pFormField->CountOptions());
tsepez4cf55152016-11-02 14:37:54 -07001531 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001532}
1533
dan sinclaircbe23db2017-10-19 14:29:33 -04001534bool Field::set_num_items(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001535 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001536 WideString* sError) {
1537 return false;
1538}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001539
Dan Sinclair33d13f22017-10-23 09:44:30 -04001540bool Field::get_page(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001541 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1542 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001543 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001544
Lei Zhangd88a3642015-11-10 09:38:57 -08001545 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001546 if (!pFormField)
tsepez4cf55152016-11-02 14:37:54 -07001547 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001548
tsepez8fa82792017-01-11 09:32:33 -08001549 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
dsinclair7cbe68e2016-10-12 11:56:23 -07001550 m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets);
Lei Zhangd88a3642015-11-10 09:38:57 -08001551 if (widgets.empty()) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04001552 vp->Set(pRuntime, -1);
tsepez4cf55152016-11-02 14:37:54 -07001553 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001554 }
1555
tsepeze5aff742016-08-08 09:49:42 -07001556 CJS_Array PageArray;
tsepez8fa82792017-01-11 09:32:33 -08001557 int i = 0;
1558 for (const auto& pObserved : widgets) {
1559 if (!pObserved) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001560 *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
tsepez8fa82792017-01-11 09:32:33 -08001561 return false;
1562 }
1563
Lei Zhang375c2762017-03-10 14:37:14 -08001564 auto* pWidget = static_cast<CPDFSDK_Widget*>(pObserved.Get());
tsepez8fa82792017-01-11 09:32:33 -08001565 CPDFSDK_PageView* pPageView = pWidget->GetPageView();
Lei Zhangd88a3642015-11-10 09:38:57 -08001566 if (!pPageView)
tsepez4cf55152016-11-02 14:37:54 -07001567 return false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001568
1569 PageArray.SetElement(
tsepezb4694242016-08-15 16:44:55 -07001570 pRuntime, i, CJS_Value(pRuntime, (int32_t)pPageView->GetPageIndex()));
tsepez8fa82792017-01-11 09:32:33 -08001571 ++i;
Lei Zhangd88a3642015-11-10 09:38:57 -08001572 }
1573
Dan Sinclair33d13f22017-10-23 09:44:30 -04001574 vp->Set(pRuntime, PageArray);
tsepez4cf55152016-11-02 14:37:54 -07001575 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001576}
1577
dan sinclaircbe23db2017-10-19 14:29:33 -04001578bool Field::set_page(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001579 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001580 WideString* sError) {
1581 *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
1582 return false;
1583}
1584
1585bool Field::get_password(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001586 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001587 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001588 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001589
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001590 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1591 if (FieldArray.empty())
1592 return false;
1593
1594 CPDF_FormField* pFormField = FieldArray[0];
1595 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1596 return false;
1597
Dan Sinclair33d13f22017-10-23 09:44:30 -04001598 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD));
tsepez4cf55152016-11-02 14:37:54 -07001599 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001600}
1601
dan sinclaircbe23db2017-10-19 14:29:33 -04001602bool Field::set_password(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001603 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001604 WideString* sError) {
1605 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001606 return m_bCanSet;
1607}
dan sinclaircbe23db2017-10-19 14:29:33 -04001608
dan sinclair646634b2017-10-19 14:30:28 -04001609bool Field::get_print(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001610 CJS_Value* vp,
dan sinclair646634b2017-10-19 14:30:28 -04001611 WideString* sError) {
1612 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
1613 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1614 if (FieldArray.empty())
1615 return false;
dan sinclaircbe23db2017-10-19 14:29:33 -04001616
dan sinclair646634b2017-10-19 14:30:28 -04001617 CPDF_FormField* pFormField = FieldArray[0];
1618 CPDFSDK_Widget* pWidget =
1619 pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1620 if (!pWidget)
1621 return false;
dan sinclaircbe23db2017-10-19 14:29:33 -04001622
Dan Sinclair33d13f22017-10-23 09:44:30 -04001623 vp->Set(pRuntime, !!(pWidget->GetFlags() & ANNOTFLAG_PRINT));
dan sinclair646634b2017-10-19 14:30:28 -04001624 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001625}
1626
dan sinclaircbe23db2017-10-19 14:29:33 -04001627bool Field::set_print(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001628 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001629 WideString* sError) {
dsinclair7cbe68e2016-10-12 11:56:23 -07001630 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -08001631 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1632 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001633 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001634
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001635 if (!m_bCanSet)
tsepez4cf55152016-11-02 14:37:54 -07001636 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001637
Lei Zhangd88a3642015-11-10 09:38:57 -08001638 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001639 if (m_nFormControlIndex < 0) {
tsepez4cf55152016-11-02 14:37:54 -07001640 bool bSet = false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001641 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001642 if (CPDFSDK_Widget* pWidget =
dsinclairc5267c52016-11-04 15:35:12 -07001643 pInterForm->GetWidget(pFormField->GetControl(i))) {
tsepezc3255f52016-03-25 14:52:27 -07001644 uint32_t dwFlags = pWidget->GetFlags();
Dan Sinclair33d13f22017-10-23 09:44:30 -04001645 if (vp.ToBool(pRuntime))
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001646 dwFlags |= ANNOTFLAG_PRINT;
1647 else
1648 dwFlags &= ~ANNOTFLAG_PRINT;
1649
1650 if (dwFlags != pWidget->GetFlags()) {
1651 pWidget->SetFlags(dwFlags);
tsepez4cf55152016-11-02 14:37:54 -07001652 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001653 }
1654 }
1655 }
1656
1657 if (bSet)
tsepez4cf55152016-11-02 14:37:54 -07001658 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001659
dan sinclaircbe23db2017-10-19 14:29:33 -04001660 continue;
1661 }
1662
1663 if (m_nFormControlIndex >= pFormField->CountControls())
1664 return false;
1665 if (CPDF_FormControl* pFormControl =
1666 pFormField->GetControl(m_nFormControlIndex)) {
1667 if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
1668 uint32_t dwFlags = pWidget->GetFlags();
Dan Sinclair33d13f22017-10-23 09:44:30 -04001669 if (vp.ToBool(pRuntime))
dan sinclaircbe23db2017-10-19 14:29:33 -04001670 dwFlags |= ANNOTFLAG_PRINT;
1671 else
1672 dwFlags &= ~ANNOTFLAG_PRINT;
1673
1674 if (dwFlags != pWidget->GetFlags()) {
1675 pWidget->SetFlags(dwFlags);
1676 UpdateFormControl(m_pFormFillEnv.Get(),
1677 pFormField->GetControl(m_nFormControlIndex), true,
1678 false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001679 }
1680 }
1681 }
1682 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001683 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001684}
1685
dan sinclaircbe23db2017-10-19 14:29:33 -04001686bool Field::get_radios_in_unison(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001687 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001688 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001689 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1690 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001691 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001692
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001693 CPDF_FormField* pFormField = FieldArray[0];
1694 if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
1695 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001696
Dan Sinclair33d13f22017-10-23 09:44:30 -04001697 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON));
tsepez4cf55152016-11-02 14:37:54 -07001698 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001699}
1700
dan sinclaircbe23db2017-10-19 14:29:33 -04001701bool Field::set_radios_in_unison(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001702 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001703 WideString* sError) {
1704 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1705 if (FieldArray.empty())
1706 return false;
1707 return m_bCanSet;
1708}
1709
1710bool Field::get_readonly(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001711 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001712 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001713 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1714 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001715 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001716
Dan Sinclair33d13f22017-10-23 09:44:30 -04001717 vp->Set(pRuntime, !!(FieldArray[0]->GetFieldFlags() & FIELDFLAG_READONLY));
tsepez4cf55152016-11-02 14:37:54 -07001718 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001719}
1720
dan sinclaircbe23db2017-10-19 14:29:33 -04001721bool Field::set_readonly(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001722 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001723 WideString* sError) {
1724 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1725 if (FieldArray.empty())
1726 return false;
dan sinclaircbe23db2017-10-19 14:29:33 -04001727 return m_bCanSet;
1728}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001729
Dan Sinclair33d13f22017-10-23 09:44:30 -04001730bool Field::get_rect(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001731 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1732 if (FieldArray.empty())
1733 return false;
1734
1735 CPDF_FormField* pFormField = FieldArray[0];
1736 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
1737 CPDFSDK_Widget* pWidget =
1738 pInterForm->GetWidget(GetSmartFieldControl(pFormField));
1739 if (!pWidget)
1740 return false;
1741
1742 CFX_FloatRect crRect = pWidget->GetRect();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001743 CJS_Array rcArray;
dan sinclaircbe23db2017-10-19 14:29:33 -04001744 rcArray.SetElement(pRuntime, 0,
1745 CJS_Value(pRuntime, static_cast<int32_t>(crRect.left)));
1746 rcArray.SetElement(pRuntime, 1,
1747 CJS_Value(pRuntime, static_cast<int32_t>(crRect.top)));
1748 rcArray.SetElement(pRuntime, 2,
1749 CJS_Value(pRuntime, static_cast<int32_t>(crRect.right)));
1750 rcArray.SetElement(pRuntime, 3,
1751 CJS_Value(pRuntime, static_cast<int32_t>(crRect.bottom)));
Dan Sinclair33d13f22017-10-23 09:44:30 -04001752 vp->Set(pRuntime, rcArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001753 return true;
1754}
1755
1756bool Field::set_rect(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001757 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001758 WideString* sError) {
1759 if (!m_bCanSet)
1760 return false;
Dan Sinclair33d13f22017-10-23 09:44:30 -04001761 if (!vp.IsArrayObject())
dan sinclaircbe23db2017-10-19 14:29:33 -04001762 return false;
1763
Dan Sinclair33d13f22017-10-23 09:44:30 -04001764 CJS_Array rcArray = vp.ToArray(pRuntime);
Dan Sinclairc9708952017-10-23 09:40:59 -04001765 CJS_Value Upper_Leftx = rcArray.GetElement(pRuntime, 0);
1766 CJS_Value Upper_Lefty = rcArray.GetElement(pRuntime, 1);
1767 CJS_Value Lower_Rightx = rcArray.GetElement(pRuntime, 2);
1768 CJS_Value Lower_Righty = rcArray.GetElement(pRuntime, 3);
dan sinclaircbe23db2017-10-19 14:29:33 -04001769
1770 float pArray[4];
1771 pArray[0] = static_cast<float>(Upper_Leftx.ToInt(pRuntime));
1772 pArray[1] = static_cast<float>(Lower_Righty.ToInt(pRuntime));
1773 pArray[2] = static_cast<float>(Lower_Rightx.ToInt(pRuntime));
1774 pArray[3] = static_cast<float>(Upper_Lefty.ToInt(pRuntime));
1775
1776 CFX_FloatRect crRect(pArray);
1777 if (m_bDelay) {
1778 AddDelay_Rect(FP_RECT, crRect);
1779 } else {
1780 Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1781 crRect);
1782 }
tsepez4cf55152016-11-02 14:37:54 -07001783 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001784}
1785
dsinclair3a7741a2016-10-11 10:39:49 -07001786void Field::SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -04001787 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001788 int nControlIndex,
Tom Sepez281a9ea2016-02-26 14:24:28 -08001789 const CFX_FloatRect& rect) {
dsinclair7cbe68e2016-10-12 11:56:23 -07001790 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Lei Zhangd88a3642015-11-10 09:38:57 -08001791 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -07001792 GetFormFields(pFormFillEnv, swFieldName);
Lei Zhangd88a3642015-11-10 09:38:57 -08001793 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001794 if (nControlIndex < 0) {
tsepez4cf55152016-11-02 14:37:54 -07001795 bool bSet = false;
Lei Zhangd88a3642015-11-10 09:38:57 -08001796 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001797 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Lei Zhang96660d62015-12-14 18:27:25 -08001798 ASSERT(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001799
dsinclairc5267c52016-11-04 15:35:12 -07001800 if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001801 CFX_FloatRect crRect = rect;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001802
1803 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001804 crRect.Intersect(pPDFPage->GetPageBBox());
1805
1806 if (!crRect.IsEmpty()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001807 CFX_FloatRect rcOld = pWidget->GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001808 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
1809 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
1810 pWidget->SetRect(crRect);
tsepez4cf55152016-11-02 14:37:54 -07001811 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001812 }
1813 }
1814 }
1815 }
1816
1817 if (bSet)
tsepez4cf55152016-11-02 14:37:54 -07001818 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001819
dan sinclaircbe23db2017-10-19 14:29:33 -04001820 continue;
1821 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001822
dan sinclaircbe23db2017-10-19 14:29:33 -04001823 if (nControlIndex >= pFormField->CountControls())
1824 return;
1825 if (CPDF_FormControl* pFormControl =
1826 pFormField->GetControl(nControlIndex)) {
1827 if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
1828 CFX_FloatRect crRect = rect;
1829
1830 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
1831 crRect.Intersect(pPDFPage->GetPageBBox());
1832
1833 if (!crRect.IsEmpty()) {
1834 CFX_FloatRect rcOld = pWidget->GetRect();
1835 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
1836 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
1837 pWidget->SetRect(crRect);
1838 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001839 }
1840 }
1841 }
1842 }
1843 }
1844}
1845
dan sinclaircbe23db2017-10-19 14:29:33 -04001846bool Field::get_required(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001847 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001848 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08001849 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1850 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07001851 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001852
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001853 CPDF_FormField* pFormField = FieldArray[0];
1854 if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
1855 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001856
Dan Sinclair33d13f22017-10-23 09:44:30 -04001857 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED));
tsepez4cf55152016-11-02 14:37:54 -07001858 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001859}
1860
dan sinclaircbe23db2017-10-19 14:29:33 -04001861bool Field::set_required(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001862 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001863 WideString* sError) {
1864 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1865 if (FieldArray.empty())
1866 return false;
1867
1868 return m_bCanSet;
1869}
1870
1871bool Field::get_rich_text(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001872 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001873 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001874 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001875
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001876 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1877 if (FieldArray.empty())
1878 return false;
1879
1880 CPDF_FormField* pFormField = FieldArray[0];
1881 if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
1882 return false;
1883
Dan Sinclair33d13f22017-10-23 09:44:30 -04001884 vp->Set(pRuntime, !!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT));
tsepez4cf55152016-11-02 14:37:54 -07001885 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001886}
1887
dan sinclaircbe23db2017-10-19 14:29:33 -04001888bool Field::set_rich_text(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001889 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001890 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001891 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001892 return m_bCanSet;
dan sinclaircbe23db2017-10-19 14:29:33 -04001893}
1894
1895bool Field::get_rich_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001896 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001897 WideString* sError) {
1898 return true;
1899}
1900
1901bool Field::set_rich_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001902 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001903 WideString* sError) {
1904 return true;
1905}
1906
1907bool Field::get_rotation(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001908 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001909 WideString* sError) {
1910 ASSERT(m_pFormFillEnv);
1911
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001912 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1913 if (FieldArray.empty())
1914 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001915
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001916 CPDF_FormField* pFormField = FieldArray[0];
1917 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1918 if (!pFormControl)
1919 return false;
1920
Dan Sinclair33d13f22017-10-23 09:44:30 -04001921 vp->Set(pRuntime, pFormControl->GetRotation());
dan sinclaircbe23db2017-10-19 14:29:33 -04001922 return true;
1923}
1924
1925bool Field::set_rotation(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001926 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001927 WideString* sError) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001928 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04001929 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001930}
1931
dan sinclaircbe23db2017-10-19 14:29:33 -04001932bool Field::get_stroke_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001933 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001934 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001935 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1936 if (FieldArray.empty())
1937 return false;
1938
1939 CPDF_FormField* pFormField = FieldArray[0];
1940 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1941 if (!pFormControl)
1942 return false;
1943
1944 int iColorType;
1945 pFormControl->GetBorderColor(iColorType);
1946
Dan Sinclair7f55a542017-07-13 14:17:10 -04001947 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001948 if (iColorType == CFX_Color::kTransparent) {
1949 color = CFX_Color(CFX_Color::kTransparent);
1950 } else if (iColorType == CFX_Color::kGray) {
1951 color =
1952 CFX_Color(CFX_Color::kGray, pFormControl->GetOriginalBorderColor(0));
1953 } else if (iColorType == CFX_Color::kRGB) {
1954 color = CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001955 pFormControl->GetOriginalBorderColor(1),
1956 pFormControl->GetOriginalBorderColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001957 } else if (iColorType == CFX_Color::kCMYK) {
1958 color = CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001959 pFormControl->GetOriginalBorderColor(1),
1960 pFormControl->GetOriginalBorderColor(2),
1961 pFormControl->GetOriginalBorderColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001962 } else {
1963 return false;
1964 }
1965
dan sinclaircbe23db2017-10-19 14:29:33 -04001966 CJS_Array crArray;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001967 color::ConvertPWLColorToArray(pRuntime, color, &crArray);
Dan Sinclair33d13f22017-10-23 09:44:30 -04001968 vp->Set(pRuntime, crArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001969 return true;
1970}
1971
1972bool Field::set_stroke_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001973 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001974 WideString* sError) {
1975 if (!m_bCanSet)
1976 return false;
Dan Sinclair33d13f22017-10-23 09:44:30 -04001977 if (!vp.IsArrayObject())
dan sinclaircbe23db2017-10-19 14:29:33 -04001978 return false;
tsepez4cf55152016-11-02 14:37:54 -07001979 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001980}
1981
dan sinclaircbe23db2017-10-19 14:29:33 -04001982bool Field::get_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04001983 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04001984 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07001985 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001986
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001987 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
1988 if (FieldArray.empty())
1989 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001990
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001991 CPDF_FormField* pFormField = FieldArray[0];
1992 if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON &&
1993 pFormField->GetFieldType() != FIELDTYPE_CHECKBOX) {
1994 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001995 }
1996
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001997 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1998 if (!pFormControl)
1999 return false;
2000
Ryan Harrison275e2602017-09-18 14:23:18 -04002001 WideString csWCaption = pFormControl->GetNormalCaption();
2002 ByteString csBCaption;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002003
2004 switch (csWCaption[0]) {
2005 case L'l':
2006 csBCaption = "circle";
2007 break;
2008 case L'8':
2009 csBCaption = "cross";
2010 break;
2011 case L'u':
2012 csBCaption = "diamond";
2013 break;
2014 case L'n':
2015 csBCaption = "square";
2016 break;
2017 case L'H':
2018 csBCaption = "star";
2019 break;
2020 default: // L'4'
2021 csBCaption = "check";
2022 break;
2023 }
Dan Sinclair33d13f22017-10-23 09:44:30 -04002024 vp->Set(pRuntime, csBCaption);
dan sinclaircbe23db2017-10-19 14:29:33 -04002025 return true;
2026}
2027
2028bool Field::set_style(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002029 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002030 WideString* sError) {
2031 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04002032 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002033}
2034
dan sinclaircbe23db2017-10-19 14:29:33 -04002035bool Field::get_submit_name(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002036 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002037 WideString* sError) {
tsepez4cf55152016-11-02 14:37:54 -07002038 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002039}
2040
dan sinclaircbe23db2017-10-19 14:29:33 -04002041bool Field::set_submit_name(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002042 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002043 WideString* sError) {
2044 return true;
2045}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002046
dan sinclaircbe23db2017-10-19 14:29:33 -04002047bool Field::get_text_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002048 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002049 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002050 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2051 if (FieldArray.empty())
2052 return false;
2053
2054 CPDF_FormField* pFormField = FieldArray[0];
2055 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2056 if (!pFormControl)
2057 return false;
2058
2059 int iColorType;
2060 FX_ARGB color;
2061 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2062 FieldAppearance.GetColor(color, iColorType);
2063
2064 int32_t a;
2065 int32_t r;
2066 int32_t g;
2067 int32_t b;
Nicolas Penaddfc3dc2017-04-20 15:29:25 -04002068 std::tie(a, r, g, b) = ArgbDecode(color);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002069
Dan Sinclair7f55a542017-07-13 14:17:10 -04002070 CFX_Color crRet =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04002071 CFX_Color(CFX_Color::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002072
Dan Sinclair8e7f9322017-10-16 11:35:42 -04002073 if (iColorType == CFX_Color::kTransparent)
2074 crRet = CFX_Color(CFX_Color::kTransparent);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002075
dan sinclaircbe23db2017-10-19 14:29:33 -04002076 CJS_Array crArray;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002077 color::ConvertPWLColorToArray(pRuntime, crRet, &crArray);
Dan Sinclair33d13f22017-10-23 09:44:30 -04002078 vp->Set(pRuntime, crArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04002079 return true;
2080}
2081
2082bool Field::set_text_color(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002083 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002084 WideString* sError) {
2085 if (!m_bCanSet)
2086 return false;
Dan Sinclair33d13f22017-10-23 09:44:30 -04002087 if (!vp.IsArrayObject())
dan sinclaircbe23db2017-10-19 14:29:33 -04002088 return false;
tsepez4cf55152016-11-02 14:37:54 -07002089 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002090}
2091
dan sinclaircbe23db2017-10-19 14:29:33 -04002092bool Field::get_text_font(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002093 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002094 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07002095 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002096
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002097 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2098 if (FieldArray.empty())
2099 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002100
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002101 CPDF_FormField* pFormField = FieldArray[0];
2102 ASSERT(pFormField);
2103 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2104 if (!pFormControl)
2105 return false;
2106
2107 int nFieldType = pFormField->GetFieldType();
2108 if (nFieldType != FIELDTYPE_PUSHBUTTON && nFieldType != FIELDTYPE_COMBOBOX &&
2109 nFieldType != FIELDTYPE_LISTBOX && nFieldType != FIELDTYPE_TEXTFIELD) {
2110 return false;
2111 }
2112 CPDF_Font* pFont = pFormControl->GetDefaultControlFont();
2113 if (!pFont)
2114 return false;
2115
Dan Sinclair33d13f22017-10-23 09:44:30 -04002116 vp->Set(pRuntime, pFont->GetBaseFont());
tsepez4cf55152016-11-02 14:37:54 -07002117 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002118}
2119
dan sinclaircbe23db2017-10-19 14:29:33 -04002120bool Field::set_text_font(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002121 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002122 WideString* sError) {
2123 ASSERT(m_pFormFillEnv);
2124
dan sinclair646634b2017-10-19 14:30:28 -04002125 if (!m_bCanSet)
2126 return false;
dan sinclaircbe23db2017-10-19 14:29:33 -04002127
Dan Sinclair33d13f22017-10-23 09:44:30 -04002128 ByteString fontName = vp.ToByteString(pRuntime);
dan sinclair646634b2017-10-19 14:30:28 -04002129 return !fontName.IsEmpty();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002130}
2131
dan sinclaircbe23db2017-10-19 14:29:33 -04002132bool Field::get_text_size(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002133 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002134 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07002135 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002136
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002137 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2138 if (FieldArray.empty())
2139 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002140
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002141 CPDF_FormField* pFormField = FieldArray[0];
2142 ASSERT(pFormField);
2143 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2144 if (!pFormControl)
2145 return false;
2146
Dan Sinclair05df0752017-03-14 14:43:42 -04002147 float fFontSize;
Tom Sepezc4a2b752017-04-07 13:56:13 -07002148 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2149 FieldAppearance.GetFont(&fFontSize);
Dan Sinclair33d13f22017-10-23 09:44:30 -04002150 vp->Set(pRuntime, static_cast<int>(fFontSize));
dan sinclaircbe23db2017-10-19 14:29:33 -04002151 return true;
2152}
2153
2154bool Field::set_text_size(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002155 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002156 WideString* sError) {
2157 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04002158 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002159}
2160
Dan Sinclair33d13f22017-10-23 09:44:30 -04002161bool Field::get_type(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08002162 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2163 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002164 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002165
Lei Zhangd88a3642015-11-10 09:38:57 -08002166 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002167 switch (pFormField->GetFieldType()) {
2168 case FIELDTYPE_UNKNOWN:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002169 vp->Set(pRuntime, L"unknown");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002170 break;
2171 case FIELDTYPE_PUSHBUTTON:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002172 vp->Set(pRuntime, L"button");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002173 break;
2174 case FIELDTYPE_CHECKBOX:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002175 vp->Set(pRuntime, L"checkbox");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002176 break;
2177 case FIELDTYPE_RADIOBUTTON:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002178 vp->Set(pRuntime, L"radiobutton");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002179 break;
2180 case FIELDTYPE_COMBOBOX:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002181 vp->Set(pRuntime, L"combobox");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002182 break;
2183 case FIELDTYPE_LISTBOX:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002184 vp->Set(pRuntime, L"listbox");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002185 break;
2186 case FIELDTYPE_TEXTFIELD:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002187 vp->Set(pRuntime, L"text");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002188 break;
2189 case FIELDTYPE_SIGNATURE:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002190 vp->Set(pRuntime, L"signature");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002191 break;
2192 default:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002193 vp->Set(pRuntime, L"unknown");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002194 break;
2195 }
tsepez4cf55152016-11-02 14:37:54 -07002196 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002197}
2198
dan sinclaircbe23db2017-10-19 14:29:33 -04002199bool Field::set_type(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002200 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002201 WideString* sError) {
2202 return false;
2203}
2204
2205bool Field::get_user_name(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002206 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002207 WideString* sError) {
dsinclair3a7741a2016-10-11 10:39:49 -07002208 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002209
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002210 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2211 if (FieldArray.empty())
2212 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002213
Dan Sinclair33d13f22017-10-23 09:44:30 -04002214 vp->Set(pRuntime, FieldArray[0]->GetAlternateName());
tsepez4cf55152016-11-02 14:37:54 -07002215 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002216}
2217
dan sinclaircbe23db2017-10-19 14:29:33 -04002218bool Field::set_user_name(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002219 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002220 WideString* sError) {
2221 ASSERT(m_pFormFillEnv);
dan sinclair646634b2017-10-19 14:30:28 -04002222 return m_bCanSet;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002223}
2224
dan sinclaircbe23db2017-10-19 14:29:33 -04002225bool Field::get_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002226 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002227 WideString* sError) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002228 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2229 if (FieldArray.empty())
2230 return false;
2231
2232 CPDF_FormField* pFormField = FieldArray[0];
2233 switch (pFormField->GetFieldType()) {
2234 case FIELDTYPE_PUSHBUTTON:
2235 return false;
2236 case FIELDTYPE_COMBOBOX:
dan sinclaircbe23db2017-10-19 14:29:33 -04002237 case FIELDTYPE_TEXTFIELD:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002238 vp->Set(pRuntime, pFormField->GetValue());
dan sinclaircbe23db2017-10-19 14:29:33 -04002239 break;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002240 case FIELDTYPE_LISTBOX: {
2241 if (pFormField->CountSelectedItems() > 1) {
2242 CJS_Array ValueArray;
2243 CJS_Value ElementValue(pRuntime);
2244 int iIndex;
2245 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
2246 iIndex = pFormField->GetSelectedIndex(i);
2247 ElementValue =
2248 CJS_Value(pRuntime, pFormField->GetOptionValue(iIndex).c_str());
Dan Sinclairc9708952017-10-23 09:40:59 -04002249 if (wcslen(ElementValue.ToWideString(pRuntime).c_str()) == 0) {
tsepezf3dc8c62016-08-10 06:29:29 -07002250 ElementValue =
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002251 CJS_Value(pRuntime, pFormField->GetOptionLabel(iIndex).c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002252 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002253 ValueArray.SetElement(pRuntime, i, ElementValue);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002254 }
Dan Sinclair33d13f22017-10-23 09:44:30 -04002255 vp->Set(pRuntime, ValueArray);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002256 } else {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002257 vp->Set(pRuntime, pFormField->GetValue());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002258 }
dan sinclaircbe23db2017-10-19 14:29:33 -04002259 break;
2260 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002261 case FIELDTYPE_CHECKBOX:
2262 case FIELDTYPE_RADIOBUTTON: {
2263 bool bFind = false;
2264 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2265 if (pFormField->GetControl(i)->IsChecked()) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002266 vp->Set(pRuntime, pFormField->GetControl(i)->GetExportValue());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002267 bFind = true;
2268 break;
2269 }
2270 }
2271 if (!bFind)
Dan Sinclair33d13f22017-10-23 09:44:30 -04002272 vp->Set(pRuntime, L"Off");
dan sinclaircbe23db2017-10-19 14:29:33 -04002273
2274 break;
2275 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002276 default:
Dan Sinclair33d13f22017-10-23 09:44:30 -04002277 vp->Set(pRuntime, pFormField->GetValue());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002278 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002279 }
Dan Sinclair33d13f22017-10-23 09:44:30 -04002280 vp->MaybeCoerceToNumber(pRuntime);
dan sinclaircbe23db2017-10-19 14:29:33 -04002281 return true;
2282}
2283
2284bool Field::set_value(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002285 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002286 WideString* sError) {
2287 if (!m_bCanSet)
2288 return false;
2289
2290 std::vector<WideString> strArray;
Dan Sinclair33d13f22017-10-23 09:44:30 -04002291 if (vp.IsArrayObject()) {
2292 CJS_Array ValueArray = vp.ToArray(pRuntime);
dan sinclaircbe23db2017-10-19 14:29:33 -04002293 for (int i = 0, sz = ValueArray.GetLength(pRuntime); i < sz; i++) {
Dan Sinclairc9708952017-10-23 09:40:59 -04002294 CJS_Value ElementValue = ValueArray.GetElement(pRuntime, i);
2295 strArray.push_back(ElementValue.ToWideString(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04002296 }
2297 } else {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002298 strArray.push_back(vp.ToWideString(pRuntime));
dan sinclaircbe23db2017-10-19 14:29:33 -04002299 }
2300
2301 if (m_bDelay) {
2302 AddDelay_WideStringArray(FP_VALUE, strArray);
2303 } else {
2304 Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
2305 strArray);
2306 }
tsepez4cf55152016-11-02 14:37:54 -07002307 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002308}
2309
dsinclair3a7741a2016-10-11 10:39:49 -07002310void Field::SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -04002311 const WideString& swFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002312 int nControlIndex,
Ryan Harrison275e2602017-09-18 14:23:18 -04002313 const std::vector<WideString>& strArray) {
dsinclair3a7741a2016-10-11 10:39:49 -07002314 ASSERT(pFormFillEnv);
tsepez41a53ad2016-03-28 16:59:30 -07002315 if (strArray.empty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002316 return;
2317
Lei Zhangd88a3642015-11-10 09:38:57 -08002318 std::vector<CPDF_FormField*> FieldArray =
dsinclair3a7741a2016-10-11 10:39:49 -07002319 GetFormFields(pFormFillEnv, swFieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002320
Lei Zhangd88a3642015-11-10 09:38:57 -08002321 for (CPDF_FormField* pFormField : FieldArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002322 if (pFormField->GetFullName().Compare(swFieldName) != 0)
2323 continue;
2324
2325 switch (pFormField->GetFieldType()) {
2326 case FIELDTYPE_TEXTFIELD:
2327 case FIELDTYPE_COMBOBOX:
tsepez41a53ad2016-03-28 16:59:30 -07002328 if (pFormField->GetValue() != strArray[0]) {
tsepez4cf55152016-11-02 14:37:54 -07002329 pFormField->SetValue(strArray[0], true);
2330 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002331 }
2332 break;
tsepez41a53ad2016-03-28 16:59:30 -07002333 case FIELDTYPE_CHECKBOX:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002334 case FIELDTYPE_RADIOBUTTON: {
tsepez41a53ad2016-03-28 16:59:30 -07002335 if (pFormField->GetValue() != strArray[0]) {
tsepez4cf55152016-11-02 14:37:54 -07002336 pFormField->SetValue(strArray[0], true);
2337 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002338 }
2339 } break;
2340 case FIELDTYPE_LISTBOX: {
tsepez4cf55152016-11-02 14:37:54 -07002341 bool bModified = false;
tsepez41a53ad2016-03-28 16:59:30 -07002342 for (const auto& str : strArray) {
2343 if (!pFormField->IsItemSelected(pFormField->FindOption(str))) {
tsepez4cf55152016-11-02 14:37:54 -07002344 bModified = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002345 break;
2346 }
2347 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002348 if (bModified) {
tsepez4cf55152016-11-02 14:37:54 -07002349 pFormField->ClearSelection(true);
tsepez41a53ad2016-03-28 16:59:30 -07002350 for (const auto& str : strArray) {
2351 int index = pFormField->FindOption(str);
2352 if (!pFormField->IsItemSelected(index))
tsepez4cf55152016-11-02 14:37:54 -07002353 pFormField->SetItemSelection(index, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002354 }
tsepez4cf55152016-11-02 14:37:54 -07002355 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002356 }
2357 } break;
2358 default:
2359 break;
2360 }
2361 }
2362}
2363
dan sinclaircbe23db2017-10-19 14:29:33 -04002364bool Field::get_value_as_string(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002365 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002366 WideString* sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08002367 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2368 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002369 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002370
Lei Zhangd88a3642015-11-10 09:38:57 -08002371 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002372 if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
tsepez4cf55152016-11-02 14:37:54 -07002373 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002374
2375 if (pFormField->GetFieldType() == FIELDTYPE_CHECKBOX) {
2376 if (!pFormField->CountControls())
tsepez4cf55152016-11-02 14:37:54 -07002377 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002378
Dan Sinclair33d13f22017-10-23 09:44:30 -04002379 vp->Set(pRuntime, pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off");
dan sinclaircbe23db2017-10-19 14:29:33 -04002380 return true;
2381 }
2382
2383 if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON &&
2384 !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002385 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2386 if (pFormField->GetControl(i)->IsChecked()) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002387 vp->Set(pRuntime, pFormField->GetControl(i)->GetExportValue().c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002388 break;
Lei Zhangd88a3642015-11-10 09:38:57 -08002389 } else {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002390 vp->Set(pRuntime, L"Off");
Lei Zhangd88a3642015-11-10 09:38:57 -08002391 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002392 }
dan sinclaircbe23db2017-10-19 14:29:33 -04002393 return true;
2394 }
2395
2396 if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX &&
2397 (pFormField->CountSelectedItems() > 1)) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002398 vp->Set(pRuntime, L"");
Lei Zhangd88a3642015-11-10 09:38:57 -08002399 } else {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002400 vp->Set(pRuntime, pFormField->GetValue().c_str());
Lei Zhangd88a3642015-11-10 09:38:57 -08002401 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002402
tsepez4cf55152016-11-02 14:37:54 -07002403 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002404}
2405
dan sinclaircbe23db2017-10-19 14:29:33 -04002406bool Field::set_value_as_string(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002407 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002408 WideString* sError) {
2409 return false;
2410}
2411
Tom Sepezb1670b52017-02-16 17:01:00 -08002412bool Field::browseForFileToSubmit(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002413 const std::vector<CJS_Value>& params,
2414 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002415 WideString& sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08002416 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2417 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002418 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002419
Lei Zhangd88a3642015-11-10 09:38:57 -08002420 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002421 if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
2422 (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD)) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002423 WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002424 if (!wsFileName.IsEmpty()) {
2425 pFormField->SetValue(wsFileName);
tsepez4cf55152016-11-02 14:37:54 -07002426 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002427 }
tsepez4cf55152016-11-02 14:37:54 -07002428 return true;
Lei Zhangd88a3642015-11-10 09:38:57 -08002429 }
tsepez4cf55152016-11-02 14:37:54 -07002430 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002431}
2432
Tom Sepezb1670b52017-02-16 17:01:00 -08002433bool Field::buttonGetCaption(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002434 const std::vector<CJS_Value>& params,
2435 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002436 WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002437 int nface = 0;
2438 int iSize = params.size();
2439 if (iSize >= 1)
tsepezb4694242016-08-15 16:44:55 -07002440 nface = params[0].ToInt(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002441
Lei Zhangd88a3642015-11-10 09:38:57 -08002442 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2443 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002444 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002445
Lei Zhangd88a3642015-11-10 09:38:57 -08002446 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002447 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
tsepez4cf55152016-11-02 14:37:54 -07002448 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002449
2450 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2451 if (!pFormControl)
tsepez4cf55152016-11-02 14:37:54 -07002452 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002453
2454 if (nface == 0)
tsepezf3dc8c62016-08-10 06:29:29 -07002455 vRet = CJS_Value(pRuntime, pFormControl->GetNormalCaption().c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002456 else if (nface == 1)
tsepezf3dc8c62016-08-10 06:29:29 -07002457 vRet = CJS_Value(pRuntime, pFormControl->GetDownCaption().c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002458 else if (nface == 2)
tsepezf3dc8c62016-08-10 06:29:29 -07002459 vRet = CJS_Value(pRuntime, pFormControl->GetRolloverCaption().c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002460 else
tsepez4cf55152016-11-02 14:37:54 -07002461 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002462
tsepez4cf55152016-11-02 14:37:54 -07002463 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002464}
2465
Tom Sepezb1670b52017-02-16 17:01:00 -08002466bool Field::buttonGetIcon(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002467 const std::vector<CJS_Value>& params,
2468 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002469 WideString& sError) {
Tom Sepez40e0a812017-02-23 13:07:36 -08002470 if (params.size() >= 1) {
2471 int nFace = params[0].ToInt(pRuntime);
2472 if (nFace < 0 || nFace > 2)
2473 return false;
2474 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002475
Lei Zhangd88a3642015-11-10 09:38:57 -08002476 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2477 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002478 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002479
Lei Zhangd88a3642015-11-10 09:38:57 -08002480 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002481 if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
tsepez4cf55152016-11-02 14:37:54 -07002482 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002483
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002484 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2485 if (!pFormControl)
tsepez4cf55152016-11-02 14:37:54 -07002486 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002487
tsepezb4694242016-08-15 16:44:55 -07002488 v8::Local<v8::Object> pObj =
2489 pRuntime->NewFxDynamicObj(CJS_Icon::g_nObjDefnID);
Tom Sepezc5a14722017-02-24 15:31:12 -08002490 if (pObj.IsEmpty())
2491 return false;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002492
tsepezb4694242016-08-15 16:44:55 -07002493 CJS_Icon* pJS_Icon = static_cast<CJS_Icon*>(pRuntime->GetObjectPrivate(pObj));
tsepezf3dc8c62016-08-10 06:29:29 -07002494 vRet = CJS_Value(pRuntime, pJS_Icon);
tsepez4cf55152016-11-02 14:37:54 -07002495 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002496}
2497
Tom Sepezb1670b52017-02-16 17:01:00 -08002498bool Field::buttonImportIcon(CJS_Runtime* pRuntime,
Lei Zhang945fdb72015-11-11 10:18:16 -08002499 const std::vector<CJS_Value>& params,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002500 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002501 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002502 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002503}
2504
Tom Sepezb1670b52017-02-16 17:01:00 -08002505bool Field::buttonSetCaption(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002506 const std::vector<CJS_Value>& params,
2507 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002508 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002509 return false;
2510}
2511
Tom Sepezb1670b52017-02-16 17:01:00 -08002512bool Field::buttonSetIcon(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002513 const std::vector<CJS_Value>& params,
2514 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002515 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002516 return false;
2517}
2518
Tom Sepezb1670b52017-02-16 17:01:00 -08002519bool Field::checkThisBox(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002520 const std::vector<CJS_Value>& params,
2521 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002522 WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002523 int iSize = params.size();
2524 if (iSize < 1)
tsepez4cf55152016-11-02 14:37:54 -07002525 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002526
tsepezf3dc8c62016-08-10 06:29:29 -07002527 if (!m_bCanSet)
tsepez4cf55152016-11-02 14:37:54 -07002528 return false;
tsepezf3dc8c62016-08-10 06:29:29 -07002529
tsepezb4694242016-08-15 16:44:55 -07002530 int nWidget = params[0].ToInt(pRuntime);
Wei Li97da9762016-03-11 17:00:48 -08002531 bool bCheckit = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002532 if (iSize >= 2)
tsepezb4694242016-08-15 16:44:55 -07002533 bCheckit = params[1].ToBool(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002534
Lei Zhangd88a3642015-11-10 09:38:57 -08002535 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2536 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002537 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002538
Lei Zhangd88a3642015-11-10 09:38:57 -08002539 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002540 if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
2541 pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
tsepez4cf55152016-11-02 14:37:54 -07002542 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002543 if (nWidget < 0 || nWidget >= pFormField->CountControls())
tsepez4cf55152016-11-02 14:37:54 -07002544 return false;
Wei Li97da9762016-03-11 17:00:48 -08002545 // TODO(weili): Check whether anything special needed for radio button,
2546 // otherwise merge these branches.
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002547 if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON)
Wei Li97da9762016-03-11 17:00:48 -08002548 pFormField->CheckControl(nWidget, bCheckit, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002549 else
Wei Li97da9762016-03-11 17:00:48 -08002550 pFormField->CheckControl(nWidget, bCheckit, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002551
tsepez4cf55152016-11-02 14:37:54 -07002552 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
2553 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002554}
2555
Tom Sepezb1670b52017-02-16 17:01:00 -08002556bool Field::clearItems(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002557 const std::vector<CJS_Value>& params,
2558 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002559 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002560 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002561}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002562
Tom Sepezb1670b52017-02-16 17:01:00 -08002563bool Field::defaultIsChecked(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002564 const std::vector<CJS_Value>& params,
2565 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002566 WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002567 if (!m_bCanSet)
tsepez4cf55152016-11-02 14:37:54 -07002568 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002569
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002570 int iSize = params.size();
2571 if (iSize < 1)
tsepez4cf55152016-11-02 14:37:54 -07002572 return false;
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002573
tsepezb4694242016-08-15 16:44:55 -07002574 int nWidget = params[0].ToInt(pRuntime);
Lei Zhangd88a3642015-11-10 09:38:57 -08002575 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2576 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002577 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002578
Lei Zhangd88a3642015-11-10 09:38:57 -08002579 CPDF_FormField* pFormField = FieldArray[0];
tsepezf3dc8c62016-08-10 06:29:29 -07002580 if (nWidget < 0 || nWidget >= pFormField->CountControls())
tsepez4cf55152016-11-02 14:37:54 -07002581 return false;
tsepezf3dc8c62016-08-10 06:29:29 -07002582
2583 vRet = CJS_Value(pRuntime,
2584 pFormField->GetFieldType() == FIELDTYPE_CHECKBOX ||
2585 pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002586
tsepez4cf55152016-11-02 14:37:54 -07002587 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002588}
2589
Tom Sepezb1670b52017-02-16 17:01:00 -08002590bool Field::deleteItemAt(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002591 const std::vector<CJS_Value>& params,
2592 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002593 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002594 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002595}
2596
Tom Sepezb1670b52017-02-16 17:01:00 -08002597bool Field::getArray(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002598 const std::vector<CJS_Value>& params,
2599 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002600 WideString& sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08002601 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2602 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002603 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002604
Ryan Harrison275e2602017-09-18 14:23:18 -04002605 std::vector<std::unique_ptr<WideString>> swSort;
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002606 for (CPDF_FormField* pFormField : FieldArray) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002607 swSort.push_back(
2608 std::unique_ptr<WideString>(new WideString(pFormField->GetFullName())));
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002609 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002610
Ryan Harrison275e2602017-09-18 14:23:18 -04002611 std::sort(swSort.begin(), swSort.end(),
2612 [](const std::unique_ptr<WideString>& p1,
2613 const std::unique_ptr<WideString>& p2) { return *p1 < *p2; });
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002614
tsepeze5aff742016-08-08 09:49:42 -07002615 CJS_Array FormFieldArray;
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002616
2617 int j = 0;
2618 for (const auto& pStr : swSort) {
tsepezb4694242016-08-15 16:44:55 -07002619 v8::Local<v8::Object> pObj =
2620 pRuntime->NewFxDynamicObj(CJS_Field::g_nObjDefnID);
Tom Sepezc5a14722017-02-24 15:31:12 -08002621 if (pObj.IsEmpty())
2622 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002623
Tom Sepezd5a0e952015-09-17 15:40:06 -07002624 CJS_Field* pJSField =
tsepezb4694242016-08-15 16:44:55 -07002625 static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pObj));
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002626 Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002627 pField->AttachField(m_pJSDoc, *pStr);
tsepezb4694242016-08-15 16:44:55 -07002628 FormFieldArray.SetElement(pRuntime, j++, CJS_Value(pRuntime, pJSField));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002629 }
2630
tsepeze5aff742016-08-08 09:49:42 -07002631 vRet = CJS_Value(pRuntime, FormFieldArray);
tsepez4cf55152016-11-02 14:37:54 -07002632 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002633}
2634
Tom Sepezb1670b52017-02-16 17:01:00 -08002635bool Field::getItemAt(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002636 const std::vector<CJS_Value>& params,
2637 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002638 WideString& sError) {
tsepezf3dc8c62016-08-10 06:29:29 -07002639 int iSize = params.size();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002640 int nIdx = -1;
2641 if (iSize >= 1)
tsepezb4694242016-08-15 16:44:55 -07002642 nIdx = params[0].ToInt(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002643
tsepez4cf55152016-11-02 14:37:54 -07002644 bool bExport = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002645 if (iSize >= 2)
tsepezb4694242016-08-15 16:44:55 -07002646 bExport = params[1].ToBool(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002647
Lei Zhangd88a3642015-11-10 09:38:57 -08002648 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2649 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002650 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002651
Lei Zhangd88a3642015-11-10 09:38:57 -08002652 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002653 if ((pFormField->GetFieldType() == FIELDTYPE_LISTBOX) ||
2654 (pFormField->GetFieldType() == FIELDTYPE_COMBOBOX)) {
2655 if (nIdx == -1 || nIdx > pFormField->CountOptions())
2656 nIdx = pFormField->CountOptions() - 1;
2657 if (bExport) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002658 WideString strval = pFormField->GetOptionValue(nIdx);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002659 if (strval.IsEmpty())
tsepezf3dc8c62016-08-10 06:29:29 -07002660 vRet = CJS_Value(pRuntime, pFormField->GetOptionLabel(nIdx).c_str());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002661 else
tsepezf3dc8c62016-08-10 06:29:29 -07002662 vRet = CJS_Value(pRuntime, strval.c_str());
Lei Zhangd88a3642015-11-10 09:38:57 -08002663 } else {
tsepezf3dc8c62016-08-10 06:29:29 -07002664 vRet = CJS_Value(pRuntime, pFormField->GetOptionLabel(nIdx).c_str());
Lei Zhangd88a3642015-11-10 09:38:57 -08002665 }
2666 } else {
tsepez4cf55152016-11-02 14:37:54 -07002667 return false;
Lei Zhangd88a3642015-11-10 09:38:57 -08002668 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002669
tsepez4cf55152016-11-02 14:37:54 -07002670 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002671}
2672
Tom Sepezb1670b52017-02-16 17:01:00 -08002673bool Field::getLock(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002674 const std::vector<CJS_Value>& params,
2675 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002676 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002677 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002678}
2679
Tom Sepezb1670b52017-02-16 17:01:00 -08002680bool Field::insertItemAt(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002681 const std::vector<CJS_Value>& params,
2682 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002683 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002684 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002685}
2686
Tom Sepezb1670b52017-02-16 17:01:00 -08002687bool Field::isBoxChecked(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002688 const std::vector<CJS_Value>& params,
2689 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002690 WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002691 int nIndex = -1;
2692 if (params.size() >= 1)
tsepezb4694242016-08-15 16:44:55 -07002693 nIndex = params[0].ToInt(pRuntime);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002694
Lei Zhangd88a3642015-11-10 09:38:57 -08002695 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2696 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002697 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002698
Lei Zhangd88a3642015-11-10 09:38:57 -08002699 CPDF_FormField* pFormField = FieldArray[0];
dan sinclair646634b2017-10-19 14:30:28 -04002700 if (nIndex < 0 || nIndex >= pFormField->CountControls())
tsepez4cf55152016-11-02 14:37:54 -07002701 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002702
tsepezf3dc8c62016-08-10 06:29:29 -07002703 vRet = CJS_Value(pRuntime,
2704 ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX ||
2705 pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) &&
2706 pFormField->GetControl(nIndex)->IsChecked() != 0));
tsepez4cf55152016-11-02 14:37:54 -07002707 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002708}
2709
Tom Sepezb1670b52017-02-16 17:01:00 -08002710bool Field::isDefaultChecked(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002711 const std::vector<CJS_Value>& params,
2712 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002713 WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002714 int nIndex = -1;
2715 if (params.size() >= 1)
tsepezb4694242016-08-15 16:44:55 -07002716 nIndex = params[0].ToInt(pRuntime);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002717
Lei Zhangd88a3642015-11-10 09:38:57 -08002718 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2719 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002720 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002721
Lei Zhangd88a3642015-11-10 09:38:57 -08002722 CPDF_FormField* pFormField = FieldArray[0];
tsepezf3dc8c62016-08-10 06:29:29 -07002723 if (nIndex < 0 || nIndex >= pFormField->CountControls())
tsepez4cf55152016-11-02 14:37:54 -07002724 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002725
tsepezf3dc8c62016-08-10 06:29:29 -07002726 vRet = CJS_Value(pRuntime,
2727 ((pFormField->GetFieldType() == FIELDTYPE_CHECKBOX ||
2728 pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON) &&
2729 pFormField->GetControl(nIndex)->IsDefaultChecked() != 0));
tsepez4cf55152016-11-02 14:37:54 -07002730 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002731}
2732
Tom Sepezb1670b52017-02-16 17:01:00 -08002733bool Field::setAction(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002734 const std::vector<CJS_Value>& params,
2735 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002736 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002737 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002738}
2739
Tom Sepezb1670b52017-02-16 17:01:00 -08002740bool Field::setFocus(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002741 const std::vector<CJS_Value>& params,
2742 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002743 WideString& sError) {
Lei Zhangd88a3642015-11-10 09:38:57 -08002744 std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
2745 if (FieldArray.empty())
tsepez4cf55152016-11-02 14:37:54 -07002746 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002747
Lei Zhangd88a3642015-11-10 09:38:57 -08002748 CPDF_FormField* pFormField = FieldArray[0];
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002749 int32_t nCount = pFormField->CountControls();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002750 if (nCount < 1)
tsepez4cf55152016-11-02 14:37:54 -07002751 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002752
dsinclair7cbe68e2016-10-12 11:56:23 -07002753 CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
thestig1cd352e2016-06-07 17:53:06 -07002754 CPDFSDK_Widget* pWidget = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002755 if (nCount == 1) {
dsinclairc5267c52016-11-04 15:35:12 -07002756 pWidget = pInterForm->GetWidget(pFormField->GetControl(0));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002757 } else {
dsinclair3a7741a2016-10-11 10:39:49 -07002758 UnderlyingPageType* pPage =
2759 UnderlyingFromFPDFPage(m_pFormFillEnv->GetCurrentPage(
2760 m_pFormFillEnv->GetUnderlyingDocument()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002761 if (!pPage)
tsepez4cf55152016-11-02 14:37:54 -07002762 return false;
dsinclair461eeaf2016-07-27 07:40:05 -07002763 if (CPDFSDK_PageView* pCurPageView =
dsinclair7cbe68e2016-10-12 11:56:23 -07002764 m_pFormFillEnv->GetPageView(pPage, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002765 for (int32_t i = 0; i < nCount; i++) {
2766 if (CPDFSDK_Widget* pTempWidget =
dsinclairc5267c52016-11-04 15:35:12 -07002767 pInterForm->GetWidget(pFormField->GetControl(i))) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002768 if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) {
2769 pWidget = pTempWidget;
2770 break;
2771 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002772 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002773 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002774 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002775 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002776
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002777 if (pWidget) {
tsepezf8074ce2016-09-27 14:29:57 -07002778 CPDFSDK_Annot::ObservedPtr pObserved(pWidget);
dsinclair7cbe68e2016-10-12 11:56:23 -07002779 m_pFormFillEnv->SetFocusAnnot(&pObserved);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002780 }
2781
tsepez4cf55152016-11-02 14:37:54 -07002782 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002783}
2784
Tom Sepezb1670b52017-02-16 17:01:00 -08002785bool Field::setItems(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002786 const std::vector<CJS_Value>& params,
2787 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002788 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002789 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002790}
2791
Tom Sepezb1670b52017-02-16 17:01:00 -08002792bool Field::setLock(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002793 const std::vector<CJS_Value>& params,
2794 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002795 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002796 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002797}
2798
Tom Sepezb1670b52017-02-16 17:01:00 -08002799bool Field::signatureGetModifications(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002800 const std::vector<CJS_Value>& params,
2801 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002802 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002803 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002804}
2805
Tom Sepezb1670b52017-02-16 17:01:00 -08002806bool Field::signatureGetSeedValue(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002807 const std::vector<CJS_Value>& params,
2808 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002809 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002810 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002811}
2812
Tom Sepezb1670b52017-02-16 17:01:00 -08002813bool Field::signatureInfo(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002814 const std::vector<CJS_Value>& params,
2815 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002816 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002817 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002818}
2819
Tom Sepezb1670b52017-02-16 17:01:00 -08002820bool Field::signatureSetSeedValue(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002821 const std::vector<CJS_Value>& params,
2822 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002823 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002824 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002825}
2826
Tom Sepezb1670b52017-02-16 17:01:00 -08002827bool Field::signatureSign(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002828 const std::vector<CJS_Value>& params,
2829 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002830 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002831 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002832}
2833
Tom Sepezb1670b52017-02-16 17:01:00 -08002834bool Field::signatureValidate(CJS_Runtime* pRuntime,
tsepez4cf55152016-11-02 14:37:54 -07002835 const std::vector<CJS_Value>& params,
2836 CJS_Value& vRet,
Ryan Harrison275e2602017-09-18 14:23:18 -04002837 WideString& sError) {
tsepez4cf55152016-11-02 14:37:54 -07002838 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002839}
2840
dan sinclaircbe23db2017-10-19 14:29:33 -04002841bool Field::get_source(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002842 CJS_Value* vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002843 WideString* sError) {
Dan Sinclair33d13f22017-10-23 09:44:30 -04002844 vp->Set(pRuntime, static_cast<CJS_Object*>(nullptr));
dan sinclaircbe23db2017-10-19 14:29:33 -04002845 return true;
2846}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002847
dan sinclaircbe23db2017-10-19 14:29:33 -04002848bool Field::set_source(CJS_Runtime* pRuntime,
Dan Sinclair33d13f22017-10-23 09:44:30 -04002849 const CJS_Value& vp,
dan sinclaircbe23db2017-10-19 14:29:33 -04002850 WideString* sError) {
tsepez4cf55152016-11-02 14:37:54 -07002851 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002852}
2853
tsepez41a53ad2016-03-28 16:59:30 -07002854void Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
2855 CJS_DelayData* pNewData =
2856 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002857 pNewData->num = n;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002858 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002859}
2860
tsepez41a53ad2016-03-28 16:59:30 -07002861void Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
2862 CJS_DelayData* pNewData =
2863 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002864 pNewData->b = b;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002865 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002866}
2867
Ryan Harrison275e2602017-09-18 14:23:18 -04002868void Field::AddDelay_String(FIELD_PROP prop, const ByteString& string) {
tsepez41a53ad2016-03-28 16:59:30 -07002869 CJS_DelayData* pNewData =
2870 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002871 pNewData->string = string;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002872 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002873}
2874
tsepez41a53ad2016-03-28 16:59:30 -07002875void Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
2876 CJS_DelayData* pNewData =
2877 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002878 pNewData->rect = rect;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002879 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002880}
2881
tsepez41a53ad2016-03-28 16:59:30 -07002882void Field::AddDelay_WordArray(FIELD_PROP prop,
2883 const std::vector<uint32_t>& array) {
2884 CJS_DelayData* pNewData =
2885 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
2886 pNewData->wordarray = array;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002887 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002888}
2889
tsepez41a53ad2016-03-28 16:59:30 -07002890void Field::AddDelay_WideStringArray(FIELD_PROP prop,
Ryan Harrison275e2602017-09-18 14:23:18 -04002891 const std::vector<WideString>& array) {
tsepez41a53ad2016-03-28 16:59:30 -07002892 CJS_DelayData* pNewData =
2893 new CJS_DelayData(prop, m_nFormControlIndex, m_FieldName);
2894 pNewData->widestringarray = array;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002895 m_pJSDoc->AddDelayData(pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002896}
2897
dsinclair3a7741a2016-10-11 10:39:49 -07002898void Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
2899 CJS_DelayData* pData) {
2900 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002901 switch (pData->eProp) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002902 case FP_BORDERSTYLE:
dsinclair3a7741a2016-10-11 10:39:49 -07002903 Field::SetBorderStyle(pFormFillEnv, pData->sFieldName,
2904 pData->nControlIndex, pData->string);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002905 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002906 case FP_CURRENTVALUEINDICES:
dsinclair3a7741a2016-10-11 10:39:49 -07002907 Field::SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002908 pData->nControlIndex, pData->wordarray);
2909 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002910 case FP_DISPLAY:
dsinclair3a7741a2016-10-11 10:39:49 -07002911 Field::SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002912 pData->num);
2913 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002914 case FP_HIDDEN:
dsinclair3a7741a2016-10-11 10:39:49 -07002915 Field::SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002916 pData->b);
2917 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002918 case FP_LINEWIDTH:
dsinclair3a7741a2016-10-11 10:39:49 -07002919 Field::SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002920 pData->num);
2921 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002922 case FP_RECT:
dsinclair3a7741a2016-10-11 10:39:49 -07002923 Field::SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002924 pData->rect);
2925 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002926 case FP_VALUE:
dsinclair3a7741a2016-10-11 10:39:49 -07002927 Field::SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002928 pData->widestringarray);
2929 break;
dan sinclair646634b2017-10-19 14:30:28 -04002930 default:
2931 NOTREACHED();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002932 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002933}