blob: 1af4703da06cccfa5d469bf5a92c03d4ba398bbe [file] [log] [blame]
jaepark611adb82016-08-17 11:34:36 -07001// Copyright 2016 PDFium Authors. All rights reserved.
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002// 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
dsinclair114e46a2016-09-29 17:18:21 -07007#include "fpdfsdk/cpdfsdk_widget.h"
Lei Zhangc2fb35f2016-01-05 16:46:58 -08008
Lei Zhangaa8bf7e2015-12-24 19:13:32 -08009#include <memory>
10
tsepez0e606b52016-11-18 16:22:41 -080011#include "core/fpdfapi/parser/cpdf_array.h"
dsinclair488b7ad2016-10-04 11:55:50 -070012#include "core/fpdfapi/parser/cpdf_dictionary.h"
13#include "core/fpdfapi/parser/cpdf_document.h"
tsepez0e606b52016-11-18 16:22:41 -080014#include "core/fpdfapi/parser/cpdf_reference.h"
dsinclair488b7ad2016-10-04 11:55:50 -070015#include "core/fpdfapi/parser/cpdf_stream.h"
tsepez0e606b52016-11-18 16:22:41 -080016#include "core/fpdfapi/parser/cpdf_string.h"
dsinclair1727aee2016-09-29 13:12:56 -070017#include "core/fpdfdoc/cpdf_defaultappearance.h"
18#include "core/fpdfdoc/cpdf_formcontrol.h"
19#include "core/fpdfdoc/cpdf_formfield.h"
20#include "core/fpdfdoc/cpdf_iconfit.h"
21#include "core/fpdfdoc/cpdf_interform.h"
dsinclair74a34fc2016-09-29 16:41:42 -070022#include "core/fxge/cfx_graphstatedata.h"
23#include "core/fxge/cfx_pathdata.h"
24#include "core/fxge/cfx_renderdevice.h"
dsinclair735606d2016-10-05 15:47:02 -070025#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
dsinclair114e46a2016-09-29 17:18:21 -070026#include "fpdfsdk/cpdfsdk_interform.h"
27#include "fpdfsdk/cpdfsdk_pageview.h"
jaepark611adb82016-08-17 11:34:36 -070028#include "fpdfsdk/formfiller/cba_fontmap.h"
dsinclair114e46a2016-09-29 17:18:21 -070029#include "fpdfsdk/fsdk_actionhandler.h"
30#include "fpdfsdk/fsdk_define.h"
dsinclair0bb385b2016-09-29 17:03:59 -070031#include "fpdfsdk/fxedit/fxet_edit.h"
jaepark611adb82016-08-17 11:34:36 -070032#include "fpdfsdk/pdfwindow/PWL_Edit.h"
dan sinclair89e904b2016-03-23 19:29:15 -040033#include "fpdfsdk/pdfwindow/PWL_Utils.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070034
Tom Sepez40e9ff32015-11-30 12:39:54 -080035#ifdef PDF_ENABLE_XFA
dsinclair521b7502016-11-02 13:02:28 -070036#include "fpdfsdk/fpdfxfa/cpdfxfa_context.h"
dsinclair5b493092016-09-29 20:20:24 -070037#include "xfa/fxfa/cxfa_eventparam.h"
38#include "xfa/fxfa/fxfa_widget.h"
39#include "xfa/fxfa/xfa_ffdocview.h"
40#include "xfa/fxfa/xfa_ffwidget.h"
41#include "xfa/fxfa/xfa_ffwidgethandler.h"
Tom Sepez40e9ff32015-11-30 12:39:54 -080042#endif // PDF_ENABLE_XFA
43
dsinclair72177da2016-09-15 12:07:23 -070044namespace {
45
46// Convert a FX_ARGB to a FX_COLORREF.
47FX_COLORREF ARGBToColorRef(FX_ARGB argb) {
48 return (((static_cast<uint32_t>(argb) & 0x00FF0000) >> 16) |
49 (static_cast<uint32_t>(argb) & 0x0000FF00) |
50 ((static_cast<uint32_t>(argb) & 0x000000FF) << 16));
51}
52
53} // namespace
54
Nico Weber9d8ec5a2015-08-04 13:00:21 -070055CPDFSDK_Widget::CPDFSDK_Widget(CPDF_Annot* pAnnot,
56 CPDFSDK_PageView* pPageView,
57 CPDFSDK_InterForm* pInterForm)
58 : CPDFSDK_BAAnnot(pAnnot, pPageView),
59 m_pInterForm(pInterForm),
60 m_nAppAge(0),
Tom Sepez40e9ff32015-11-30 12:39:54 -080061 m_nValueAge(0)
62#ifdef PDF_ENABLE_XFA
63 ,
thestig1cd352e2016-06-07 17:53:06 -070064 m_hMixXFAWidget(nullptr),
65 m_pWidgetHandler(nullptr)
Tom Sepez40e9ff32015-11-30 12:39:54 -080066#endif // PDF_ENABLE_XFA
67{
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070068}
69
dsinclairce04a452016-09-07 05:46:55 -070070CPDFSDK_Widget::~CPDFSDK_Widget() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070071
Tom Sepez51da0932015-11-25 16:05:49 -080072#ifdef PDF_ENABLE_XFA
dsinclairdf4bc592016-03-31 20:34:43 -070073CXFA_FFWidget* CPDFSDK_Widget::GetMixXFAWidget() const {
dsinclair521b7502016-11-02 13:02:28 -070074 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
75 if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076 if (!m_hMixXFAWidget) {
dsinclair521b7502016-11-02 13:02:28 -070077 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070078 CFX_WideString sName;
Lei Zhang99766722016-02-23 11:21:48 -080079 if (GetFieldType() == FIELDTYPE_RADIOBUTTON) {
80 sName = GetAnnotName();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070081 if (sName.IsEmpty())
82 sName = GetName();
Dan Sinclair738b08c2016-03-01 14:45:20 -050083 } else {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070084 sName = GetName();
Dan Sinclair738b08c2016-03-01 14:45:20 -050085 }
Bo Xufdc00a72014-10-28 23:03:33 -070086
Nico Weber9d8ec5a2015-08-04 13:00:21 -070087 if (!sName.IsEmpty())
weilib4d1b572016-08-10 14:50:48 -070088 m_hMixXFAWidget = pDocView->GetWidgetByName(sName, nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -070090 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -070091 return m_hMixXFAWidget;
92 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070093
thestig1cd352e2016-06-07 17:53:06 -070094 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070095}
96
dsinclairdf4bc592016-03-31 20:34:43 -070097CXFA_FFWidget* CPDFSDK_Widget::GetGroupMixXFAWidget() {
dsinclair521b7502016-11-02 13:02:28 -070098 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
99 if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) {
100 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700101 CFX_WideString sName = GetName();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700102 if (!sName.IsEmpty())
weilib4d1b572016-08-10 14:50:48 -0700103 return pDocView->GetWidgetByName(sName, nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700104 }
105 }
106
Tom Sepez50d12ad2015-11-24 09:50:51 -0800107 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700108}
109
dsinclairdf4bc592016-03-31 20:34:43 -0700110CXFA_FFWidgetHandler* CPDFSDK_Widget::GetXFAWidgetHandler() const {
dsinclair521b7502016-11-02 13:02:28 -0700111 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
112 if (pContext->GetDocType() == DOCTYPE_STATIC_XFA) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700113 if (!m_pWidgetHandler) {
dsinclair521b7502016-11-02 13:02:28 -0700114 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115 m_pWidgetHandler = pDocView->GetWidgetHandler();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 }
117 return m_pWidgetHandler;
118 }
119
thestig1cd352e2016-06-07 17:53:06 -0700120 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121}
122
123static XFA_EVENTTYPE GetXFAEventType(PDFSDK_XFAAActionType eXFAAAT) {
124 XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown;
125
126 switch (eXFAAAT) {
127 case PDFSDK_XFA_Click:
128 eEventType = XFA_EVENT_Click;
129 break;
130 case PDFSDK_XFA_Full:
131 eEventType = XFA_EVENT_Full;
132 break;
133 case PDFSDK_XFA_PreOpen:
134 eEventType = XFA_EVENT_PreOpen;
135 break;
136 case PDFSDK_XFA_PostOpen:
137 eEventType = XFA_EVENT_PostOpen;
138 break;
139 }
140
141 return eEventType;
142}
143
144static XFA_EVENTTYPE GetXFAEventType(CPDF_AAction::AActionType eAAT,
tsepez4cf55152016-11-02 14:37:54 -0700145 bool bWillCommit) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 XFA_EVENTTYPE eEventType = XFA_EVENT_Unknown;
147
148 switch (eAAT) {
149 case CPDF_AAction::CursorEnter:
150 eEventType = XFA_EVENT_MouseEnter;
151 break;
152 case CPDF_AAction::CursorExit:
153 eEventType = XFA_EVENT_MouseExit;
154 break;
155 case CPDF_AAction::ButtonDown:
156 eEventType = XFA_EVENT_MouseDown;
157 break;
158 case CPDF_AAction::ButtonUp:
159 eEventType = XFA_EVENT_MouseUp;
160 break;
161 case CPDF_AAction::GetFocus:
162 eEventType = XFA_EVENT_Enter;
163 break;
164 case CPDF_AAction::LoseFocus:
165 eEventType = XFA_EVENT_Exit;
166 break;
167 case CPDF_AAction::PageOpen:
168 break;
169 case CPDF_AAction::PageClose:
170 break;
171 case CPDF_AAction::PageVisible:
172 break;
173 case CPDF_AAction::PageInvisible:
174 break;
175 case CPDF_AAction::KeyStroke:
jaepark611adb82016-08-17 11:34:36 -0700176 if (!bWillCommit)
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 eEventType = XFA_EVENT_Change;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700178 break;
179 case CPDF_AAction::Validate:
180 eEventType = XFA_EVENT_Validate;
181 break;
182 case CPDF_AAction::OpenPage:
183 case CPDF_AAction::ClosePage:
184 case CPDF_AAction::Format:
185 case CPDF_AAction::Calculate:
186 case CPDF_AAction::CloseDocument:
187 case CPDF_AAction::SaveDocument:
188 case CPDF_AAction::DocumentSaved:
189 case CPDF_AAction::PrintDocument:
190 case CPDF_AAction::DocumentPrinted:
191 break;
192 }
193
194 return eEventType;
195}
196
tsepez4cf55152016-11-02 14:37:54 -0700197bool CPDFSDK_Widget::HasXFAAAction(PDFSDK_XFAAActionType eXFAAAT) {
jaepark611adb82016-08-17 11:34:36 -0700198 CXFA_FFWidget* hWidget = GetMixXFAWidget();
199 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700200 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700201
jaepark611adb82016-08-17 11:34:36 -0700202 CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler();
203 if (!pXFAWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700204 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700205
jaepark611adb82016-08-17 11:34:36 -0700206 XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT);
207
208 CXFA_WidgetAcc* pAcc;
209 if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) &&
210 GetFieldType() == FIELDTYPE_RADIOBUTTON) {
211 if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) {
212 pAcc = hGroupWidget->GetDataAcc();
213 if (pXFAWidgetHandler->HasEvent(pAcc, eEventType))
tsepez4cf55152016-11-02 14:37:54 -0700214 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700215 }
216 }
217
jaepark611adb82016-08-17 11:34:36 -0700218 pAcc = hWidget->GetDataAcc();
219 return pXFAWidgetHandler->HasEvent(pAcc, eEventType);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700220}
221
tsepez4cf55152016-11-02 14:37:54 -0700222bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
223 PDFSDK_FieldAction& data,
224 CPDFSDK_PageView* pPageView) {
dsinclair521b7502016-11-02 13:02:28 -0700225 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226
jaepark611adb82016-08-17 11:34:36 -0700227 CXFA_FFWidget* hWidget = GetMixXFAWidget();
228 if (!hWidget)
tsepez4cf55152016-11-02 14:37:54 -0700229 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700230
jaepark611adb82016-08-17 11:34:36 -0700231 XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT);
232 if (eEventType == XFA_EVENT_Unknown)
tsepez4cf55152016-11-02 14:37:54 -0700233 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234
jaepark611adb82016-08-17 11:34:36 -0700235 CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler();
236 if (!pXFAWidgetHandler)
tsepez4cf55152016-11-02 14:37:54 -0700237 return false;
jaepark611adb82016-08-17 11:34:36 -0700238
239 CXFA_EventParam param;
240 param.m_eType = eEventType;
241 param.m_wsChange = data.sChange;
242 param.m_iCommitKey = data.nCommitKey;
243 param.m_bShift = data.bShift;
244 param.m_iSelStart = data.nSelStart;
245 param.m_iSelEnd = data.nSelEnd;
246 param.m_wsFullText = data.sValue;
247 param.m_bKeyDown = data.bKeyDown;
248 param.m_bModifier = data.bModifier;
249 param.m_wsNewText = data.sValue;
250 if (data.nSelEnd > data.nSelStart)
251 param.m_wsNewText.Delete(data.nSelStart, data.nSelEnd - data.nSelStart);
252
253 for (int i = 0; i < data.sChange.GetLength(); i++)
254 param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]);
255 param.m_wsPrevText = data.sValue;
256
257 if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) &&
258 GetFieldType() == FIELDTYPE_RADIOBUTTON) {
259 if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) {
260 CXFA_WidgetAcc* pAcc = hGroupWidget->GetDataAcc();
261 param.m_pTarget = pAcc;
262 if (pXFAWidgetHandler->ProcessEvent(pAcc, &param) !=
263 XFA_EVENTERROR_Success) {
tsepez4cf55152016-11-02 14:37:54 -0700264 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700265 }
266 }
267 }
jaepark611adb82016-08-17 11:34:36 -0700268 CXFA_WidgetAcc* pAcc = hWidget->GetDataAcc();
269 param.m_pTarget = pAcc;
270 int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, &param);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700271
dsinclair521b7502016-11-02 13:02:28 -0700272 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
jaepark611adb82016-08-17 11:34:36 -0700273 pDocView->UpdateDocView();
274
275 return nRet == XFA_EVENTERROR_Success;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700276}
277
tsepez4cf55152016-11-02 14:37:54 -0700278void CPDFSDK_Widget::Synchronize(bool bSynchronizeElse) {
jaepark611adb82016-08-17 11:34:36 -0700279 CXFA_FFWidget* hWidget = GetMixXFAWidget();
280 if (!hWidget)
281 return;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700282
jaepark611adb82016-08-17 11:34:36 -0700283 CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc();
284 if (!pWidgetAcc)
285 return;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700286
jaepark611adb82016-08-17 11:34:36 -0700287 CPDF_FormField* pFormField = GetFormField();
288 switch (GetFieldType()) {
289 case FIELDTYPE_CHECKBOX:
290 case FIELDTYPE_RADIOBUTTON: {
291 CPDF_FormControl* pFormCtrl = GetFormControl();
292 XFA_CHECKSTATE eCheckState =
293 pFormCtrl->IsChecked() ? XFA_CHECKSTATE_On : XFA_CHECKSTATE_Off;
294 pWidgetAcc->SetCheckState(eCheckState, true);
295 break;
296 }
297 case FIELDTYPE_TEXTFIELD:
298 pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit);
299 break;
300 case FIELDTYPE_LISTBOX: {
301 pWidgetAcc->ClearAllSelections();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302
jaepark611adb82016-08-17 11:34:36 -0700303 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
304 int nIndex = pFormField->GetSelectedIndex(i);
305 if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems())
tsepez4cf55152016-11-02 14:37:54 -0700306 pWidgetAcc->SetItemState(nIndex, true, false, false, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700307 }
jaepark611adb82016-08-17 11:34:36 -0700308 break;
309 }
310 case FIELDTYPE_COMBOBOX: {
311 pWidgetAcc->ClearAllSelections();
dsinclair221caf62016-04-04 12:08:40 -0700312
jaepark611adb82016-08-17 11:34:36 -0700313 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
314 int nIndex = pFormField->GetSelectedIndex(i);
315 if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems())
tsepez4cf55152016-11-02 14:37:54 -0700316 pWidgetAcc->SetItemState(nIndex, true, false, false, true);
jaepark611adb82016-08-17 11:34:36 -0700317 }
318 pWidgetAcc->SetValue(pFormField->GetValue(), XFA_VALUEPICTURE_Edit);
319 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700320 }
321 }
jaepark611adb82016-08-17 11:34:36 -0700322
323 if (bSynchronizeElse)
324 pWidgetAcc->ProcessValueChanged();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700325}
326
327void CPDFSDK_Widget::SynchronizeXFAValue() {
dsinclair521b7502016-11-02 13:02:28 -0700328 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
329 CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330 if (!pXFADocView)
331 return;
332
dsinclairdf4bc592016-03-31 20:34:43 -0700333 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
Tom Sepezbf59a072015-10-21 14:07:23 -0700334 if (GetXFAWidgetHandler()) {
335 CPDFSDK_Widget::SynchronizeXFAValue(pXFADocView, hWidget, GetFormField(),
336 GetFormControl());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700337 }
338 }
339}
340
341void CPDFSDK_Widget::SynchronizeXFAItems() {
dsinclair521b7502016-11-02 13:02:28 -0700342 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
343 CXFA_FFDocView* pXFADocView = pContext->GetXFADocView();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700344 if (!pXFADocView)
345 return;
346
dsinclairdf4bc592016-03-31 20:34:43 -0700347 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
Tom Sepezbf59a072015-10-21 14:07:23 -0700348 if (GetXFAWidgetHandler())
349 SynchronizeXFAItems(pXFADocView, hWidget, GetFormField(), nullptr);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700350 }
351}
352
dsinclairdf4bc592016-03-31 20:34:43 -0700353void CPDFSDK_Widget::SynchronizeXFAValue(CXFA_FFDocView* pXFADocView,
354 CXFA_FFWidget* hWidget,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355 CPDF_FormField* pFormField,
356 CPDF_FormControl* pFormControl) {
Lei Zhang5eca3052016-02-22 20:32:21 -0800357 ASSERT(hWidget);
dsinclair221caf62016-04-04 12:08:40 -0700358 ASSERT(pFormControl);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700359
dsinclair221caf62016-04-04 12:08:40 -0700360 switch (pFormField->GetFieldType()) {
361 case FIELDTYPE_CHECKBOX: {
362 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
363 pFormField->CheckControl(
364 pFormField->GetControlIndex(pFormControl),
365 pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On, true);
366 }
jaepark611adb82016-08-17 11:34:36 -0700367 break;
368 }
dsinclair221caf62016-04-04 12:08:40 -0700369 case FIELDTYPE_RADIOBUTTON: {
370 // TODO(weili): Check whether we need to handle checkbox and radio
371 // button differently, otherwise, merge these two cases.
372 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
373 pFormField->CheckControl(
374 pFormField->GetControlIndex(pFormControl),
375 pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On, true);
376 }
jaepark611adb82016-08-17 11:34:36 -0700377 break;
378 }
dsinclair221caf62016-04-04 12:08:40 -0700379 case FIELDTYPE_TEXTFIELD: {
380 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
381 CFX_WideString sValue;
382 pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display);
tsepez4cf55152016-11-02 14:37:54 -0700383 pFormField->SetValue(sValue, true);
dsinclair221caf62016-04-04 12:08:40 -0700384 }
jaepark611adb82016-08-17 11:34:36 -0700385 break;
386 }
dsinclair221caf62016-04-04 12:08:40 -0700387 case FIELDTYPE_LISTBOX: {
tsepez4cf55152016-11-02 14:37:54 -0700388 pFormField->ClearSelection(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700389
dsinclair221caf62016-04-04 12:08:40 -0700390 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
391 for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) {
392 int nIndex = pWidgetAcc->GetSelectedItem(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700393
dsinclair221caf62016-04-04 12:08:40 -0700394 if (nIndex > -1 && nIndex < pFormField->CountOptions()) {
tsepez4cf55152016-11-02 14:37:54 -0700395 pFormField->SetItemSelection(nIndex, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700396 }
397 }
dsinclair221caf62016-04-04 12:08:40 -0700398 }
jaepark611adb82016-08-17 11:34:36 -0700399 break;
400 }
dsinclair221caf62016-04-04 12:08:40 -0700401 case FIELDTYPE_COMBOBOX: {
tsepez4cf55152016-11-02 14:37:54 -0700402 pFormField->ClearSelection(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403
dsinclair221caf62016-04-04 12:08:40 -0700404 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
405 for (int i = 0, sz = pWidgetAcc->CountSelectedItems(); i < sz; i++) {
406 int nIndex = pWidgetAcc->GetSelectedItem(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700407
dsinclair221caf62016-04-04 12:08:40 -0700408 if (nIndex > -1 && nIndex < pFormField->CountOptions()) {
tsepez4cf55152016-11-02 14:37:54 -0700409 pFormField->SetItemSelection(nIndex, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700411 }
dsinclair221caf62016-04-04 12:08:40 -0700412
413 CFX_WideString sValue;
414 pWidgetAcc->GetValue(sValue, XFA_VALUEPICTURE_Display);
tsepez4cf55152016-11-02 14:37:54 -0700415 pFormField->SetValue(sValue, true);
dsinclair221caf62016-04-04 12:08:40 -0700416 }
jaepark611adb82016-08-17 11:34:36 -0700417 break;
418 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700419 }
420}
421
dsinclairdf4bc592016-03-31 20:34:43 -0700422void CPDFSDK_Widget::SynchronizeXFAItems(CXFA_FFDocView* pXFADocView,
423 CXFA_FFWidget* hWidget,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700424 CPDF_FormField* pFormField,
425 CPDF_FormControl* pFormControl) {
Lei Zhang5eca3052016-02-22 20:32:21 -0800426 ASSERT(hWidget);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427
dsinclair221caf62016-04-04 12:08:40 -0700428 switch (pFormField->GetFieldType()) {
429 case FIELDTYPE_LISTBOX: {
tsepez4cf55152016-11-02 14:37:54 -0700430 pFormField->ClearSelection(false);
431 pFormField->ClearOptions(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700432
dsinclair221caf62016-04-04 12:08:40 -0700433 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
434 for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; i++) {
435 CFX_WideString swText;
436 pWidgetAcc->GetChoiceListItem(swText, i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437
tsepez4cf55152016-11-02 14:37:54 -0700438 pFormField->InsertOption(swText, i, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439 }
dsinclair221caf62016-04-04 12:08:40 -0700440 }
jaepark611adb82016-08-17 11:34:36 -0700441 break;
442 }
dsinclair221caf62016-04-04 12:08:40 -0700443 case FIELDTYPE_COMBOBOX: {
tsepez4cf55152016-11-02 14:37:54 -0700444 pFormField->ClearSelection(false);
445 pFormField->ClearOptions(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700446
dsinclair221caf62016-04-04 12:08:40 -0700447 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
448 for (int i = 0, sz = pWidgetAcc->CountChoiceListItems(); i < sz; i++) {
449 CFX_WideString swText;
450 pWidgetAcc->GetChoiceListItem(swText, i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451
tsepez4cf55152016-11-02 14:37:54 -0700452 pFormField->InsertOption(swText, i, false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700453 }
dsinclair221caf62016-04-04 12:08:40 -0700454 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700455
tsepez4cf55152016-11-02 14:37:54 -0700456 pFormField->SetValue(L"", true);
jaepark611adb82016-08-17 11:34:36 -0700457 break;
458 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700459 }
460}
Tom Sepez40e9ff32015-11-30 12:39:54 -0800461#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700462
tsepez4cf55152016-11-02 14:37:54 -0700463bool CPDFSDK_Widget::IsWidgetAppearanceValid(CPDF_Annot::AppearanceMode mode) {
dsinclair38fd8442016-09-15 10:15:32 -0700464 CPDF_Dictionary* pAP = m_pAnnot->GetAnnotDict()->GetDictFor("AP");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700465 if (!pAP)
tsepez4cf55152016-11-02 14:37:54 -0700466 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700467
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468 // Choose the right sub-ap
469 const FX_CHAR* ap_entry = "N";
470 if (mode == CPDF_Annot::Down)
471 ap_entry = "D";
472 else if (mode == CPDF_Annot::Rollover)
473 ap_entry = "R";
474 if (!pAP->KeyExist(ap_entry))
475 ap_entry = "N";
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700476
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700477 // Get the AP stream or subdirectory
dsinclair38fd8442016-09-15 10:15:32 -0700478 CPDF_Object* psub = pAP->GetDirectObjectFor(ap_entry);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700479 if (!psub)
tsepez4cf55152016-11-02 14:37:54 -0700480 return false;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700481
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700482 int nFieldType = GetFieldType();
483 switch (nFieldType) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700484 case FIELDTYPE_PUSHBUTTON:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700485 case FIELDTYPE_COMBOBOX:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700486 case FIELDTYPE_LISTBOX:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700487 case FIELDTYPE_TEXTFIELD:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700488 case FIELDTYPE_SIGNATURE:
Dan Sinclairaa435ba2015-10-22 16:45:48 -0400489 return psub->IsStream();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490 case FIELDTYPE_CHECKBOX:
491 case FIELDTYPE_RADIOBUTTON:
Dan Sinclairf1251c12015-10-20 16:24:45 -0400492 if (CPDF_Dictionary* pSubDict = psub->AsDictionary()) {
dsinclair38fd8442016-09-15 10:15:32 -0700493 return !!pSubDict->GetStreamFor(GetAppState());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700494 }
tsepez4cf55152016-11-02 14:37:54 -0700495 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496 }
tsepez4cf55152016-11-02 14:37:54 -0700497 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700498}
499
500int CPDFSDK_Widget::GetFieldType() const {
dsinclair92828192016-08-17 13:28:51 -0700501 CPDF_FormField* pField = GetFormField();
502 return pField ? pField->GetFieldType() : FIELDTYPE_UNKNOWN;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700503}
504
tsepez4cf55152016-11-02 14:37:54 -0700505bool CPDFSDK_Widget::IsAppearanceValid() {
Tom Sepez51da0932015-11-25 16:05:49 -0800506#ifdef PDF_ENABLE_XFA
dsinclair521b7502016-11-02 13:02:28 -0700507 CPDFXFA_Context* pContext = m_pPageView->GetFormFillEnv()->GetXFAContext();
508 int nDocType = pContext->GetDocType();
Tom Sepez540c4362015-11-24 13:33:57 -0800509 if (nDocType != DOCTYPE_PDF && nDocType != DOCTYPE_STATIC_XFA)
tsepez4cf55152016-11-02 14:37:54 -0700510 return true;
Tom Sepez40e9ff32015-11-30 12:39:54 -0800511#endif // PDF_ENABLE_XFA
Tom Sepez540c4362015-11-24 13:33:57 -0800512 return CPDFSDK_BAAnnot::IsAppearanceValid();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700513}
514
weili625ad662016-06-15 11:21:33 -0700515int CPDFSDK_Widget::GetLayoutOrder() const {
516 return 2;
517}
518
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700519int CPDFSDK_Widget::GetFieldFlags() const {
520 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700521 CPDF_FormControl* pFormControl =
522 pPDFInterForm->GetControlByDict(m_pAnnot->GetAnnotDict());
523 CPDF_FormField* pFormField = pFormControl->GetField();
524 return pFormField->GetFieldFlags();
525}
526
jaepark9ed91372016-08-26 16:16:10 -0700527bool CPDFSDK_Widget::IsSignatureWidget() const {
528 return GetFieldType() == FIELDTYPE_SIGNATURE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700529}
530
531CPDF_FormField* CPDFSDK_Widget::GetFormField() const {
dsinclair92828192016-08-17 13:28:51 -0700532 CPDF_FormControl* pControl = GetFormControl();
533 return pControl ? pControl->GetField() : nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700534}
535
536CPDF_FormControl* CPDFSDK_Widget::GetFormControl() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700537 CPDF_InterForm* pPDFInterForm = m_pInterForm->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700538 return pPDFInterForm->GetControlByDict(GetAnnotDict());
539}
540
Lei Zhang1b700c32015-10-30 23:55:35 -0700541CPDF_FormControl* CPDFSDK_Widget::GetFormControl(
542 CPDF_InterForm* pInterForm,
543 const CPDF_Dictionary* pAnnotDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800544 ASSERT(pAnnotDict);
Lei Zhang1b700c32015-10-30 23:55:35 -0700545 return pInterForm->GetControlByDict(pAnnotDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700546}
547
548int CPDFSDK_Widget::GetRotate() const {
549 CPDF_FormControl* pCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700550 return pCtrl->GetRotation() % 360;
551}
552
Tom Sepez51da0932015-11-25 16:05:49 -0800553#ifdef PDF_ENABLE_XFA
Tom Sepezbf59a072015-10-21 14:07:23 -0700554CFX_WideString CPDFSDK_Widget::GetName() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700555 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700556 return pFormField->GetFullName();
557}
Tom Sepez40e9ff32015-11-30 12:39:54 -0800558#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700559
tsepez4cf55152016-11-02 14:37:54 -0700560bool CPDFSDK_Widget::GetFillColor(FX_COLORREF& color) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700561 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700562 int iColorType = 0;
dsinclair72177da2016-09-15 12:07:23 -0700563 color = ARGBToColorRef(pFormCtrl->GetBackgroundColor(iColorType));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700564 return iColorType != COLORTYPE_TRANSPARENT;
565}
566
tsepez4cf55152016-11-02 14:37:54 -0700567bool CPDFSDK_Widget::GetBorderColor(FX_COLORREF& color) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700568 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700569 int iColorType = 0;
dsinclair72177da2016-09-15 12:07:23 -0700570 color = ARGBToColorRef(pFormCtrl->GetBorderColor(iColorType));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700571 return iColorType != COLORTYPE_TRANSPARENT;
572}
573
tsepez4cf55152016-11-02 14:37:54 -0700574bool CPDFSDK_Widget::GetTextColor(FX_COLORREF& color) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700575 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700576 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
jaepark611adb82016-08-17 11:34:36 -0700577 if (!da.HasColor())
tsepez4cf55152016-11-02 14:37:54 -0700578 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700579
jaepark611adb82016-08-17 11:34:36 -0700580 FX_ARGB argb;
581 int iColorType = COLORTYPE_TRANSPARENT;
582 da.GetColor(argb, iColorType);
dsinclair72177da2016-09-15 12:07:23 -0700583 color = ARGBToColorRef(argb);
jaepark611adb82016-08-17 11:34:36 -0700584 return iColorType != COLORTYPE_TRANSPARENT;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700585}
586
587FX_FLOAT CPDFSDK_Widget::GetFontSize() const {
588 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700589 CPDF_DefaultAppearance pDa = pFormCtrl->GetDefaultAppearance();
590 CFX_ByteString csFont = "";
591 FX_FLOAT fFontSize = 0.0f;
592 pDa.GetFont(csFont, fFontSize);
593
594 return fFontSize;
595}
596
Tom Sepezbf59a072015-10-21 14:07:23 -0700597int CPDFSDK_Widget::GetSelectedIndex(int nIndex) const {
Tom Sepeza8a39e22015-10-12 15:47:07 -0700598#ifdef PDF_ENABLE_XFA
dsinclairdf4bc592016-03-31 20:34:43 -0700599 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
dsinclair221caf62016-04-04 12:08:40 -0700600 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
601 if (nIndex < pWidgetAcc->CountSelectedItems())
602 return pWidgetAcc->GetSelectedItem(nIndex);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700603 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700604 }
Tom Sepeza8a39e22015-10-12 15:47:07 -0700605#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700606 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607 return pFormField->GetSelectedIndex(nIndex);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700608}
609
Tom Sepeza8a39e22015-10-12 15:47:07 -0700610#ifdef PDF_ENABLE_XFA
tsepez4cf55152016-11-02 14:37:54 -0700611CFX_WideString CPDFSDK_Widget::GetValue(bool bDisplay) const {
dsinclairdf4bc592016-03-31 20:34:43 -0700612 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
dsinclair221caf62016-04-04 12:08:40 -0700613 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
614 CFX_WideString sValue;
615 pWidgetAcc->GetValue(
616 sValue, bDisplay ? XFA_VALUEPICTURE_Display : XFA_VALUEPICTURE_Edit);
617 return sValue;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700618 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619 }
Tom Sepez40e9ff32015-11-30 12:39:54 -0800620#else
621CFX_WideString CPDFSDK_Widget::GetValue() const {
Tom Sepeza8a39e22015-10-12 15:47:07 -0700622#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700623 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700624 return pFormField->GetValue();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700625}
626
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700627CFX_WideString CPDFSDK_Widget::GetDefaultValue() const {
628 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700629 return pFormField->GetDefaultValue();
630}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700631
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700632CFX_WideString CPDFSDK_Widget::GetOptionLabel(int nIndex) const {
633 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700634 return pFormField->GetOptionLabel(nIndex);
635}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700636
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700637int CPDFSDK_Widget::CountOptions() const {
638 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700639 return pFormField->CountOptions();
640}
641
tsepez4cf55152016-11-02 14:37:54 -0700642bool CPDFSDK_Widget::IsOptionSelected(int nIndex) const {
Tom Sepeza8a39e22015-10-12 15:47:07 -0700643#ifdef PDF_ENABLE_XFA
dsinclairdf4bc592016-03-31 20:34:43 -0700644 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
dsinclair221caf62016-04-04 12:08:40 -0700645 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc()) {
646 if (nIndex > -1 && nIndex < pWidgetAcc->CountChoiceListItems())
647 return pWidgetAcc->GetItemState(nIndex);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700648
tsepez4cf55152016-11-02 14:37:54 -0700649 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700650 }
651 }
Tom Sepeza8a39e22015-10-12 15:47:07 -0700652#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700653 CPDF_FormField* pFormField = GetFormField();
654 return pFormField->IsItemSelected(nIndex);
655}
656
657int CPDFSDK_Widget::GetTopVisibleIndex() const {
658 CPDF_FormField* pFormField = GetFormField();
659 return pFormField->GetTopVisibleIndex();
660}
661
Wei Li97da9762016-03-11 17:00:48 -0800662bool CPDFSDK_Widget::IsChecked() const {
Tom Sepeza8a39e22015-10-12 15:47:07 -0700663#ifdef PDF_ENABLE_XFA
dsinclair221caf62016-04-04 12:08:40 -0700664 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
665 if (CXFA_WidgetAcc* pWidgetAcc = hWidget->GetDataAcc())
666 return pWidgetAcc->GetCheckState() == XFA_CHECKSTATE_On;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700667 }
Tom Sepeza8a39e22015-10-12 15:47:07 -0700668#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700669 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700670 return pFormCtrl->IsChecked();
671}
672
673int CPDFSDK_Widget::GetAlignment() const {
674 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700675 return pFormCtrl->GetControlAlignment();
676}
677
678int CPDFSDK_Widget::GetMaxLen() const {
679 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700680 return pFormField->GetMaxLen();
681}
682
Wei Li97da9762016-03-11 17:00:48 -0800683void CPDFSDK_Widget::SetCheck(bool bChecked, bool bNotify) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700684 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700685 CPDF_FormField* pFormField = pFormCtrl->GetField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700686 pFormField->CheckControl(pFormField->GetControlIndex(pFormCtrl), bChecked,
687 bNotify);
Tom Sepez51da0932015-11-25 16:05:49 -0800688#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700689 if (!IsWidgetAppearanceValid(CPDF_Annot::Normal))
tsepez4cf55152016-11-02 14:37:54 -0700690 ResetAppearance(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700691 if (!bNotify)
tsepez4cf55152016-11-02 14:37:54 -0700692 Synchronize(true);
Tom Sepez40e9ff32015-11-30 12:39:54 -0800693#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700694}
695
tsepez4cf55152016-11-02 14:37:54 -0700696void CPDFSDK_Widget::SetValue(const CFX_WideString& sValue, bool bNotify) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700697 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700698 pFormField->SetValue(sValue, bNotify);
Tom Sepez51da0932015-11-25 16:05:49 -0800699#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700700 if (!bNotify)
tsepez4cf55152016-11-02 14:37:54 -0700701 Synchronize(true);
Tom Sepez40e9ff32015-11-30 12:39:54 -0800702#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700703}
704
705void CPDFSDK_Widget::SetDefaultValue(const CFX_WideString& sValue) {}
706void CPDFSDK_Widget::SetOptionSelection(int index,
tsepez4cf55152016-11-02 14:37:54 -0700707 bool bSelected,
708 bool bNotify) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700709 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700710 pFormField->SetItemSelection(index, bSelected, bNotify);
Tom Sepez51da0932015-11-25 16:05:49 -0800711#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700712 if (!bNotify)
tsepez4cf55152016-11-02 14:37:54 -0700713 Synchronize(true);
Tom Sepez40e9ff32015-11-30 12:39:54 -0800714#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700715}
716
tsepez4cf55152016-11-02 14:37:54 -0700717void CPDFSDK_Widget::ClearSelection(bool bNotify) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700718 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700719 pFormField->ClearSelection(bNotify);
Tom Sepez51da0932015-11-25 16:05:49 -0800720#ifdef PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700721 if (!bNotify)
tsepez4cf55152016-11-02 14:37:54 -0700722 Synchronize(true);
Tom Sepez40e9ff32015-11-30 12:39:54 -0800723#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700724}
725
726void CPDFSDK_Widget::SetTopVisibleIndex(int index) {}
727
728void CPDFSDK_Widget::SetAppModified() {
tsepez4cf55152016-11-02 14:37:54 -0700729 m_bAppModified = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700730}
731
732void CPDFSDK_Widget::ClearAppModified() {
tsepez4cf55152016-11-02 14:37:54 -0700733 m_bAppModified = false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700734}
735
tsepez4cf55152016-11-02 14:37:54 -0700736bool CPDFSDK_Widget::IsAppModified() const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700737 return m_bAppModified;
738}
739
Tom Sepez51da0932015-11-25 16:05:49 -0800740#ifdef PDF_ENABLE_XFA
tsepez4cf55152016-11-02 14:37:54 -0700741void CPDFSDK_Widget::ResetAppearance(bool bValueChanged) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700742 switch (GetFieldType()) {
743 case FIELDTYPE_TEXTFIELD:
744 case FIELDTYPE_COMBOBOX: {
tsepez4cf55152016-11-02 14:37:54 -0700745 bool bFormatted = false;
tsepez8c2a8cd2016-09-07 15:29:11 -0700746 CFX_WideString sValue = OnFormat(bFormatted);
tsepez4cf55152016-11-02 14:37:54 -0700747 ResetAppearance(bFormatted ? &sValue : nullptr, true);
jaepark611adb82016-08-17 11:34:36 -0700748 break;
749 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700750 default:
tsepez4cf55152016-11-02 14:37:54 -0700751 ResetAppearance(nullptr, false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700752 break;
753 }
754}
Tom Sepez40e9ff32015-11-30 12:39:54 -0800755#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700756
tsepeza31da742016-09-08 11:28:14 -0700757void CPDFSDK_Widget::ResetAppearance(const CFX_WideString* sValue,
tsepez4cf55152016-11-02 14:37:54 -0700758 bool bValueChanged) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700759 SetAppModified();
760
761 m_nAppAge++;
762 if (m_nAppAge > 999999)
763 m_nAppAge = 0;
764 if (bValueChanged)
765 m_nValueAge++;
766
767 int nFieldType = GetFieldType();
768
769 switch (nFieldType) {
770 case FIELDTYPE_PUSHBUTTON:
771 ResetAppearance_PushButton();
772 break;
773 case FIELDTYPE_CHECKBOX:
774 ResetAppearance_CheckBox();
775 break;
776 case FIELDTYPE_RADIOBUTTON:
777 ResetAppearance_RadioButton();
778 break;
779 case FIELDTYPE_COMBOBOX:
780 ResetAppearance_ComboBox(sValue);
781 break;
782 case FIELDTYPE_LISTBOX:
783 ResetAppearance_ListBox();
784 break;
785 case FIELDTYPE_TEXTFIELD:
786 ResetAppearance_TextField(sValue);
787 break;
788 }
789
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790 m_pAnnot->ClearCachedAP();
791}
792
tsepez4cf55152016-11-02 14:37:54 -0700793CFX_WideString CPDFSDK_Widget::OnFormat(bool& bFormatted) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700794 CPDF_FormField* pFormField = GetFormField();
Lei Zhang96660d62015-12-14 18:27:25 -0800795 ASSERT(pFormField);
tsepez8c2a8cd2016-09-07 15:29:11 -0700796 return m_pInterForm->OnFormat(pFormField, bFormatted);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700797}
798
tsepez4cf55152016-11-02 14:37:54 -0700799void CPDFSDK_Widget::ResetFieldAppearance(bool bValueChanged) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700800 CPDF_FormField* pFormField = GetFormField();
Lei Zhang96660d62015-12-14 18:27:25 -0800801 ASSERT(pFormField);
thestig1cd352e2016-06-07 17:53:06 -0700802 m_pInterForm->ResetFieldAppearance(pFormField, nullptr, bValueChanged);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700803}
804
805void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800806 const CFX_Matrix* pUser2Device,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700807 CPDF_Annot::AppearanceMode mode,
808 const CPDF_RenderOptions* pOptions) {
809 int nFieldType = GetFieldType();
810
811 if ((nFieldType == FIELDTYPE_CHECKBOX ||
812 nFieldType == FIELDTYPE_RADIOBUTTON) &&
813 mode == CPDF_Annot::Normal &&
814 !IsWidgetAppearanceValid(CPDF_Annot::Normal)) {
815 CFX_PathData pathData;
816
Tom Sepez281a9ea2016-02-26 14:24:28 -0800817 CFX_FloatRect rcAnnot = GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700818
819 pathData.AppendRect(rcAnnot.left, rcAnnot.bottom, rcAnnot.right,
820 rcAnnot.top);
821
822 CFX_GraphStateData gsd;
823 gsd.m_LineWidth = 0.0f;
824
825 pDevice->DrawPath(&pathData, pUser2Device, &gsd, 0, 0xFFAAAAAA,
826 FXFILL_ALTERNATE);
827 } else {
828 CPDFSDK_BAAnnot::DrawAppearance(pDevice, pUser2Device, mode, pOptions);
829 }
830}
831
832void CPDFSDK_Widget::UpdateField() {
833 CPDF_FormField* pFormField = GetFormField();
Lei Zhang96660d62015-12-14 18:27:25 -0800834 ASSERT(pFormField);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700835 m_pInterForm->UpdateField(pFormField);
836}
837
838void CPDFSDK_Widget::DrawShadow(CFX_RenderDevice* pDevice,
839 CPDFSDK_PageView* pPageView) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700840 int nFieldType = GetFieldType();
jaepark611adb82016-08-17 11:34:36 -0700841 if (!m_pInterForm->IsNeedHighLight(nFieldType))
842 return;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700843
jaepark611adb82016-08-17 11:34:36 -0700844 CFX_Matrix page2device;
845 pPageView->GetCurrentMatrix(page2device);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700846
Dan Sinclairafb44562017-02-09 13:07:43 -0500847 CFX_FloatRect rcDevice = GetRect();
848 page2device.TransformPoint(rcDevice.left, rcDevice.bottom);
849 page2device.TransformPoint(rcDevice.right, rcDevice.top);
jaepark611adb82016-08-17 11:34:36 -0700850 rcDevice.Normalize();
851
Dan Sinclairafb44562017-02-09 13:07:43 -0500852 FX_RECT rcDev = rcDevice.ToFxRect();
853 pDevice->FillRect(
854 &rcDev, ArgbEncode(static_cast<int>(m_pInterForm->GetHighlightAlpha()),
855 m_pInterForm->GetHighlightColor(nFieldType)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700856}
857
858void CPDFSDK_Widget::ResetAppearance_PushButton() {
859 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -0800860 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700861 int32_t nLayout = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700862 switch (pControl->GetTextPosition()) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700863 case TEXTPOS_ICON:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700864 nLayout = PPBL_ICON;
865 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700866 case TEXTPOS_BELOW:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700867 nLayout = PPBL_ICONTOPLABELBOTTOM;
868 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700869 case TEXTPOS_ABOVE:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 nLayout = PPBL_LABELTOPICONBOTTOM;
871 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700872 case TEXTPOS_RIGHT:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700873 nLayout = PPBL_ICONLEFTLABELRIGHT;
874 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700875 case TEXTPOS_LEFT:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700876 nLayout = PPBL_LABELLEFTICONRIGHT;
877 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700878 case TEXTPOS_OVERLAID:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700879 nLayout = PPBL_LABELOVERICON;
880 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700881 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700882 nLayout = PPBL_LABEL;
883 break;
884 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700885
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700886 CPWL_Color crBackground, crBorder;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700887
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700888 int iColorType;
889 FX_FLOAT fc[4];
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700890
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700891 pControl->GetOriginalBackgroundColor(iColorType, fc);
892 if (iColorType > 0)
893 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700894
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700895 pControl->GetOriginalBorderColor(iColorType, fc);
896 if (iColorType > 0)
897 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700898
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700899 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700900 CPWL_Dash dsBorder(3, 0, 0);
901 CPWL_Color crLeftTop, crRightBottom;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700902
dsinclair92cb5e52016-05-16 11:38:28 -0700903 BorderStyle nBorderStyle = GetBorderStyle();
904 switch (nBorderStyle) {
905 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700906 dsBorder = CPWL_Dash(3, 3, 0);
907 break;
dsinclair92cb5e52016-05-16 11:38:28 -0700908 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909 fBorderWidth *= 2;
910 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
911 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
912 break;
dsinclair92cb5e52016-05-16 11:38:28 -0700913 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700914 fBorderWidth *= 2;
915 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
916 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
917 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700918 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700919 break;
920 }
921
Tom Sepez281a9ea2016-02-26 14:24:28 -0800922 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700923
924 CPWL_Color crText(COLORTYPE_GRAY, 0);
925
926 FX_FLOAT fFontSize = 12.0f;
927 CFX_ByteString csNameTag;
928
929 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
930 if (da.HasColor()) {
931 da.GetColor(iColorType, fc);
932 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
933 }
934
935 if (da.HasFont())
936 da.GetFont(csNameTag, fFontSize);
937
938 CFX_WideString csWCaption;
939 CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;
940
jaepark611adb82016-08-17 11:34:36 -0700941 if (pControl->HasMKEntry("CA"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700942 csNormalCaption = pControl->GetNormalCaption();
jaepark611adb82016-08-17 11:34:36 -0700943
944 if (pControl->HasMKEntry("RC"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700945 csRolloverCaption = pControl->GetRolloverCaption();
jaepark611adb82016-08-17 11:34:36 -0700946
947 if (pControl->HasMKEntry("AC"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700948 csDownCaption = pControl->GetDownCaption();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700949
thestig1cd352e2016-06-07 17:53:06 -0700950 CPDF_Stream* pNormalIcon = nullptr;
951 CPDF_Stream* pRolloverIcon = nullptr;
952 CPDF_Stream* pDownIcon = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700953
jaepark611adb82016-08-17 11:34:36 -0700954 if (pControl->HasMKEntry("I"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700955 pNormalIcon = pControl->GetNormalIcon();
jaepark611adb82016-08-17 11:34:36 -0700956
957 if (pControl->HasMKEntry("RI"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700958 pRolloverIcon = pControl->GetRolloverIcon();
jaepark611adb82016-08-17 11:34:36 -0700959
960 if (pControl->HasMKEntry("IX"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700961 pDownIcon = pControl->GetDownIcon();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700962
963 if (pNormalIcon) {
964 if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700965 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800966 pImageDict->SetNewFor<CPDF_String>("Name", "ImgA", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700967 }
968 }
969
970 if (pRolloverIcon) {
971 if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700972 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800973 pImageDict->SetNewFor<CPDF_String>("Name", "ImgB", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700974 }
975 }
976
977 if (pDownIcon) {
978 if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700979 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800980 pImageDict->SetNewFor<CPDF_String>("Name", "ImgC", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981 }
982 }
983
984 CPDF_IconFit iconFit = pControl->GetIconFit();
985
dsinclair690c0332016-10-11 09:13:01 -0700986 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
Lei Zhangfcfa3b82015-12-24 21:07:28 -0800987 font_map.SetAPType("N");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700988
989 CFX_ByteString csAP =
990 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
991 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
992 crLeftTop, crRightBottom, nBorderStyle,
993 dsBorder) +
994 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -0800995 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700996 pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);
997
998 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP);
999 if (pNormalIcon)
1000 AddImageToAppearance("N", pNormalIcon);
1001
1002 CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();
1003 if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) {
1004 if (csRolloverCaption.IsEmpty() && !pRolloverIcon) {
1005 csRolloverCaption = csNormalCaption;
1006 pRolloverIcon = pNormalIcon;
1007 }
1008
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001009 font_map.SetAPType("R");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001010
1011 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1012 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1013 crLeftTop, crRightBottom,
1014 nBorderStyle, dsBorder) +
1015 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001016 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001017 pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize,
1018 nLayout);
1019
1020 WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP);
1021 if (pRolloverIcon)
1022 AddImageToAppearance("R", pRolloverIcon);
1023
1024 if (csDownCaption.IsEmpty() && !pDownIcon) {
1025 csDownCaption = csNormalCaption;
1026 pDownIcon = pNormalIcon;
1027 }
1028
1029 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001030 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001031 CPWL_Color crTemp = crLeftTop;
1032 crLeftTop = crRightBottom;
1033 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001034 break;
1035 }
1036 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001037 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1038 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001039 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001040 }
1041 default:
1042 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001043 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001044
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001045 font_map.SetAPType("D");
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001046
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001047 csAP = CPWL_Utils::GetRectFillAppStream(
1048 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) +
1049 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1050 crLeftTop, crRightBottom,
1051 nBorderStyle, dsBorder) +
1052 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001053 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001054 pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001055
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001056 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001057 if (pDownIcon)
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001058 AddImageToAppearance("D", pDownIcon);
1059 } else {
1060 RemoveAppearance("D");
1061 RemoveAppearance("R");
1062 }
1063}
1064
1065void CPDFSDK_Widget::ResetAppearance_CheckBox() {
1066 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001067 CPWL_Color crBackground, crBorder, crText;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001068 int iColorType;
1069 FX_FLOAT fc[4];
1070
1071 pControl->GetOriginalBackgroundColor(iColorType, fc);
1072 if (iColorType > 0)
1073 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1074
1075 pControl->GetOriginalBorderColor(iColorType, fc);
1076 if (iColorType > 0)
1077 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1078
1079 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001080 CPWL_Dash dsBorder(3, 0, 0);
1081 CPWL_Color crLeftTop, crRightBottom;
1082
dsinclair92cb5e52016-05-16 11:38:28 -07001083 BorderStyle nBorderStyle = GetBorderStyle();
1084 switch (nBorderStyle) {
1085 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001086 dsBorder = CPWL_Dash(3, 3, 0);
1087 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001088 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001089 fBorderWidth *= 2;
1090 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
1091 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
1092 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001093 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001094 fBorderWidth *= 2;
1095 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1096 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1097 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001098 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001099 break;
1100 }
1101
Tom Sepez281a9ea2016-02-26 14:24:28 -08001102 CFX_FloatRect rcWindow = GetRotatedRect();
1103 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001104
1105 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
1106 if (da.HasColor()) {
1107 da.GetColor(iColorType, fc);
1108 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1109 }
1110
1111 int32_t nStyle = 0;
1112
1113 CFX_WideString csWCaption = pControl->GetNormalCaption();
1114 if (csWCaption.GetLength() > 0) {
1115 switch (csWCaption[0]) {
1116 case L'l':
1117 nStyle = PCS_CIRCLE;
1118 break;
1119 case L'8':
1120 nStyle = PCS_CROSS;
1121 break;
1122 case L'u':
1123 nStyle = PCS_DIAMOND;
1124 break;
1125 case L'n':
1126 nStyle = PCS_SQUARE;
1127 break;
1128 case L'H':
1129 nStyle = PCS_STAR;
1130 break;
1131 default: // L'4'
1132 nStyle = PCS_CHECK;
1133 break;
1134 }
1135 } else {
1136 nStyle = PCS_CHECK;
1137 }
1138
1139 CFX_ByteString csAP_N_ON =
1140 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1141 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1142 crLeftTop, crRightBottom, nBorderStyle,
1143 dsBorder);
1144
1145 CFX_ByteString csAP_N_OFF = csAP_N_ON;
1146
1147 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001148 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001149 CPWL_Color crTemp = crLeftTop;
1150 crLeftTop = crRightBottom;
1151 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001152 break;
1153 }
1154 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001155 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1156 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1157 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001158 }
1159 default:
1160 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001161 }
1162
1163 CFX_ByteString csAP_D_ON =
1164 CPWL_Utils::GetRectFillAppStream(
1165 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) +
1166 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1167 crLeftTop, crRightBottom, nBorderStyle,
1168 dsBorder);
1169
1170 CFX_ByteString csAP_D_OFF = csAP_D_ON;
1171
1172 csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText);
1173 csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText);
1174
1175 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON,
1176 pControl->GetCheckedAPState());
1177 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
1178
1179 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON,
1180 pControl->GetCheckedAPState());
1181 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
1182
1183 CFX_ByteString csAS = GetAppState();
1184 if (csAS.IsEmpty())
1185 SetAppState("Off");
1186}
1187
1188void CPDFSDK_Widget::ResetAppearance_RadioButton() {
1189 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001190 CPWL_Color crBackground, crBorder, crText;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001191 int iColorType;
1192 FX_FLOAT fc[4];
1193
1194 pControl->GetOriginalBackgroundColor(iColorType, fc);
1195 if (iColorType > 0)
1196 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1197
1198 pControl->GetOriginalBorderColor(iColorType, fc);
1199 if (iColorType > 0)
1200 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1201
1202 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001203 CPWL_Dash dsBorder(3, 0, 0);
1204 CPWL_Color crLeftTop, crRightBottom;
1205
dsinclair92cb5e52016-05-16 11:38:28 -07001206 BorderStyle nBorderStyle = GetBorderStyle();
1207 switch (nBorderStyle) {
1208 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001209 dsBorder = CPWL_Dash(3, 3, 0);
1210 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001211 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001212 fBorderWidth *= 2;
1213 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
1214 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
1215 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001216 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001217 fBorderWidth *= 2;
1218 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1219 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1220 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001221 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001222 break;
1223 }
1224
Tom Sepez281a9ea2016-02-26 14:24:28 -08001225 CFX_FloatRect rcWindow = GetRotatedRect();
1226 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001227
1228 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
1229 if (da.HasColor()) {
1230 da.GetColor(iColorType, fc);
1231 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1232 }
1233
1234 int32_t nStyle = 0;
1235
1236 CFX_WideString csWCaption = pControl->GetNormalCaption();
1237 if (csWCaption.GetLength() > 0) {
1238 switch (csWCaption[0]) {
1239 default: // L'l':
1240 nStyle = PCS_CIRCLE;
1241 break;
1242 case L'8':
1243 nStyle = PCS_CROSS;
1244 break;
1245 case L'u':
1246 nStyle = PCS_DIAMOND;
1247 break;
1248 case L'n':
1249 nStyle = PCS_SQUARE;
1250 break;
1251 case L'H':
1252 nStyle = PCS_STAR;
1253 break;
1254 case L'4':
1255 nStyle = PCS_CHECK;
1256 break;
1257 }
1258 } else {
1259 nStyle = PCS_CIRCLE;
1260 }
1261
1262 CFX_ByteString csAP_N_ON;
1263
Tom Sepez281a9ea2016-02-26 14:24:28 -08001264 CFX_FloatRect rcCenter =
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001265 CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);
1266
1267 if (nStyle == PCS_CIRCLE) {
dsinclair92cb5e52016-05-16 11:38:28 -07001268 if (nBorderStyle == BorderStyle::BEVELED) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001269 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
1270 crRightBottom = CPWL_Utils::SubstractColor(crBackground, 0.25f);
dsinclair92cb5e52016-05-16 11:38:28 -07001271 } else if (nBorderStyle == BorderStyle::INSET) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001272 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5f);
1273 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75f);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001274 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001275
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001276 csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBackground) +
1277 CPWL_Utils::GetCircleBorderAppStream(
1278 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom,
1279 nBorderStyle, dsBorder);
1280 } else {
1281 csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1282 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1283 crLeftTop, crRightBottom,
1284 nBorderStyle, dsBorder);
1285 }
1286
1287 CFX_ByteString csAP_N_OFF = csAP_N_ON;
1288
1289 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001290 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001291 CPWL_Color crTemp = crLeftTop;
1292 crLeftTop = crRightBottom;
1293 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001294 break;
1295 }
1296 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001297 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1298 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1299 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001300 }
1301 default:
1302 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001303 }
1304
1305 CFX_ByteString csAP_D_ON;
1306
1307 if (nStyle == PCS_CIRCLE) {
1308 CPWL_Color crBK = CPWL_Utils::SubstractColor(crBackground, 0.25f);
dsinclair92cb5e52016-05-16 11:38:28 -07001309 if (nBorderStyle == BorderStyle::BEVELED) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001310 crLeftTop = CPWL_Utils::SubstractColor(crBackground, 0.25f);
1311 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1312 crBK = crBackground;
dsinclair92cb5e52016-05-16 11:38:28 -07001313 } else if (nBorderStyle == BorderStyle::INSET) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001314 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1315 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1316 }
1317
1318 csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBK) +
1319 CPWL_Utils::GetCircleBorderAppStream(
1320 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom,
1321 nBorderStyle, dsBorder);
1322 } else {
1323 csAP_D_ON = CPWL_Utils::GetRectFillAppStream(
1324 rcWindow, CPWL_Utils::SubstractColor(crBackground, 0.25f)) +
1325 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1326 crLeftTop, crRightBottom,
1327 nBorderStyle, dsBorder);
1328 }
1329
1330 CFX_ByteString csAP_D_OFF = csAP_D_ON;
1331
1332 csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText);
1333 csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText);
1334
1335 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON,
1336 pControl->GetCheckedAPState());
1337 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
1338
1339 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON,
1340 pControl->GetCheckedAPState());
1341 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
1342
1343 CFX_ByteString csAS = GetAppState();
1344 if (csAS.IsEmpty())
1345 SetAppState("Off");
1346}
1347
tsepeza31da742016-09-08 11:28:14 -07001348void CPDFSDK_Widget::ResetAppearance_ComboBox(const CFX_WideString* sValue) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001349 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001350 CPDF_FormField* pField = pControl->GetField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001351 CFX_ByteTextBuf sBody, sLines;
1352
Tom Sepez281a9ea2016-02-26 14:24:28 -08001353 CFX_FloatRect rcClient = GetClientRect();
1354 CFX_FloatRect rcButton = rcClient;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001355 rcButton.left = rcButton.right - 13;
1356 rcButton.Normalize();
1357
dsinclaire35af1e2016-07-13 11:26:20 -07001358 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001359 pEdit->EnableRefresh(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001360
dsinclair690c0332016-10-11 09:13:01 -07001361 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001362 pEdit->SetFontMap(&font_map);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001363
thestig732f6a02016-05-12 10:41:56 -07001364 CFX_FloatRect rcEdit = rcClient;
1365 rcEdit.right = rcButton.left;
1366 rcEdit.Normalize();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001367
thestig732f6a02016-05-12 10:41:56 -07001368 pEdit->SetPlateRect(rcEdit);
tsepez4cf55152016-11-02 14:37:54 -07001369 pEdit->SetAlignmentV(1, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001370
thestig732f6a02016-05-12 10:41:56 -07001371 FX_FLOAT fFontSize = GetFontSize();
1372 if (IsFloatZero(fFontSize))
tsepez4cf55152016-11-02 14:37:54 -07001373 pEdit->SetAutoFontSize(true, true);
thestig732f6a02016-05-12 10:41:56 -07001374 else
1375 pEdit->SetFontSize(fFontSize);
1376
1377 pEdit->Initialize();
1378
1379 if (sValue) {
tsepeza31da742016-09-08 11:28:14 -07001380 pEdit->SetText(*sValue);
thestig732f6a02016-05-12 10:41:56 -07001381 } else {
1382 int32_t nCurSel = pField->GetSelectedIndex(0);
thestig732f6a02016-05-12 10:41:56 -07001383 if (nCurSel < 0)
tsepez067990c2016-09-13 06:46:40 -07001384 pEdit->SetText(pField->GetValue());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001385 else
tsepez067990c2016-09-13 06:46:40 -07001386 pEdit->SetText(pField->GetOptionLabel(nCurSel));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001387 }
1388
thestig732f6a02016-05-12 10:41:56 -07001389 CFX_FloatRect rcContent = pEdit->GetContentRect();
1390
1391 CFX_ByteString sEdit =
dsinclair92a32db2017-02-14 14:58:49 +00001392 CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_FloatPoint());
thestig732f6a02016-05-12 10:41:56 -07001393 if (sEdit.GetLength() > 0) {
1394 sBody << "/Tx BMC\n"
1395 << "q\n";
1396 if (rcContent.Width() > rcEdit.Width() ||
1397 rcContent.Height() > rcEdit.Height()) {
1398 sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width()
1399 << " " << rcEdit.Height() << " re\nW\nn\n";
1400 }
1401
1402 CPWL_Color crText = GetTextPWLColor();
1403 sBody << "BT\n"
1404 << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"
1405 << "Q\nEMC\n";
1406 }
1407
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001408 sBody << CPWL_Utils::GetDropButtonAppStream(rcButton);
1409
1410 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001411 sLines.AsStringC() + sBody.AsStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001412
1413 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
1414}
1415
1416void CPDFSDK_Widget::ResetAppearance_ListBox() {
1417 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001418 CPDF_FormField* pField = pControl->GetField();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001419 CFX_FloatRect rcClient = GetClientRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001420 CFX_ByteTextBuf sBody, sLines;
1421
dsinclaire35af1e2016-07-13 11:26:20 -07001422 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001423 pEdit->EnableRefresh(false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001424
dsinclair690c0332016-10-11 09:13:01 -07001425 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001426 pEdit->SetFontMap(&font_map);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001427
thestig732f6a02016-05-12 10:41:56 -07001428 pEdit->SetPlateRect(CFX_FloatRect(rcClient.left, 0.0f, rcClient.right, 0.0f));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001429
thestig732f6a02016-05-12 10:41:56 -07001430 FX_FLOAT fFontSize = GetFontSize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001431
thestig594b20b2016-05-12 21:56:43 -07001432 pEdit->SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001433
thestig732f6a02016-05-12 10:41:56 -07001434 pEdit->Initialize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001435
thestig732f6a02016-05-12 10:41:56 -07001436 CFX_ByteTextBuf sList;
1437 FX_FLOAT fy = rcClient.top;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001438
thestig732f6a02016-05-12 10:41:56 -07001439 int32_t nTop = pField->GetTopVisibleIndex();
1440 int32_t nCount = pField->CountOptions();
1441 int32_t nSelCount = pField->CountSelectedItems();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001442
thestig594b20b2016-05-12 21:56:43 -07001443 for (int32_t i = nTop; i < nCount; ++i) {
1444 bool bSelected = false;
1445 for (int32_t j = 0; j < nSelCount; ++j) {
thestig732f6a02016-05-12 10:41:56 -07001446 if (pField->GetSelectedIndex(j) == i) {
thestig594b20b2016-05-12 21:56:43 -07001447 bSelected = true;
thestig732f6a02016-05-12 10:41:56 -07001448 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001449 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001450 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001451
tsepez067990c2016-09-13 06:46:40 -07001452 pEdit->SetText(pField->GetOptionLabel(i));
thestig732f6a02016-05-12 10:41:56 -07001453
1454 CFX_FloatRect rcContent = pEdit->GetContentRect();
1455 FX_FLOAT fItemHeight = rcContent.Height();
1456
1457 if (bSelected) {
1458 CFX_FloatRect rcItem =
1459 CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy);
1460 sList << "q\n"
1461 << CPWL_Utils::GetColorAppStream(
1462 CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f,
1463 113.0f / 255.0f),
tsepez4cf55152016-11-02 14:37:54 -07001464 true)
thestig732f6a02016-05-12 10:41:56 -07001465 << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width()
1466 << " " << rcItem.Height() << " re f\n"
1467 << "Q\n";
1468
1469 sList << "BT\n"
1470 << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1),
tsepez4cf55152016-11-02 14:37:54 -07001471 true)
dsinclair92a32db2017-02-14 14:58:49 +00001472 << CPWL_Utils::GetEditAppStream(pEdit.get(),
1473 CFX_FloatPoint(0.0f, fy))
thestig732f6a02016-05-12 10:41:56 -07001474 << "ET\n";
1475 } else {
1476 CPWL_Color crText = GetTextPWLColor();
1477 sList << "BT\n"
tsepez4cf55152016-11-02 14:37:54 -07001478 << CPWL_Utils::GetColorAppStream(crText, true)
dsinclair92a32db2017-02-14 14:58:49 +00001479 << CPWL_Utils::GetEditAppStream(pEdit.get(),
1480 CFX_FloatPoint(0.0f, fy))
thestig732f6a02016-05-12 10:41:56 -07001481 << "ET\n";
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001482 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001483
thestig732f6a02016-05-12 10:41:56 -07001484 fy -= fItemHeight;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001485 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001486
thestig732f6a02016-05-12 10:41:56 -07001487 if (sList.GetSize() > 0) {
1488 sBody << "/Tx BMC\n"
1489 << "q\n"
1490 << rcClient.left << " " << rcClient.bottom << " " << rcClient.Width()
1491 << " " << rcClient.Height() << " re\nW\nn\n";
1492 sBody << sList << "Q\nEMC\n";
1493 }
1494
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001495 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001496 sLines.AsStringC() + sBody.AsStringC();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001497
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001498 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001499}
1500
tsepeza31da742016-09-08 11:28:14 -07001501void CPDFSDK_Widget::ResetAppearance_TextField(const CFX_WideString* sValue) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001502 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001503 CPDF_FormField* pField = pControl->GetField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001504 CFX_ByteTextBuf sBody, sLines;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001505
dsinclaire35af1e2016-07-13 11:26:20 -07001506 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001507 pEdit->EnableRefresh(false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001508
dsinclair690c0332016-10-11 09:13:01 -07001509 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001510 pEdit->SetFontMap(&font_map);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001511
thestig732f6a02016-05-12 10:41:56 -07001512 CFX_FloatRect rcClient = GetClientRect();
1513 pEdit->SetPlateRect(rcClient);
tsepez4cf55152016-11-02 14:37:54 -07001514 pEdit->SetAlignmentH(pControl->GetControlAlignment(), true);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001515
thestig732f6a02016-05-12 10:41:56 -07001516 uint32_t dwFieldFlags = pField->GetFieldFlags();
tsepez4cf55152016-11-02 14:37:54 -07001517 bool bMultiLine = (dwFieldFlags >> 12) & 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001518
thestig732f6a02016-05-12 10:41:56 -07001519 if (bMultiLine) {
tsepez4cf55152016-11-02 14:37:54 -07001520 pEdit->SetMultiLine(true, true);
1521 pEdit->SetAutoReturn(true, true);
thestig732f6a02016-05-12 10:41:56 -07001522 } else {
tsepez4cf55152016-11-02 14:37:54 -07001523 pEdit->SetAlignmentV(1, true);
thestig732f6a02016-05-12 10:41:56 -07001524 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001525
thestig732f6a02016-05-12 10:41:56 -07001526 uint16_t subWord = 0;
1527 if ((dwFieldFlags >> 13) & 1) {
1528 subWord = '*';
tsepez4cf55152016-11-02 14:37:54 -07001529 pEdit->SetPasswordChar(subWord, true);
thestig732f6a02016-05-12 10:41:56 -07001530 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001531
thestig732f6a02016-05-12 10:41:56 -07001532 int nMaxLen = pField->GetMaxLen();
tsepez4cf55152016-11-02 14:37:54 -07001533 bool bCharArray = (dwFieldFlags >> 24) & 1;
thestig732f6a02016-05-12 10:41:56 -07001534 FX_FLOAT fFontSize = GetFontSize();
Bo Xufdc00a72014-10-28 23:03:33 -07001535
Tom Sepez51da0932015-11-25 16:05:49 -08001536#ifdef PDF_ENABLE_XFA
thestig732f6a02016-05-12 10:41:56 -07001537 CFX_WideString sValueTmp;
1538 if (!sValue && GetMixXFAWidget()) {
tsepez4cf55152016-11-02 14:37:54 -07001539 sValueTmp = GetValue(true);
tsepeza31da742016-09-08 11:28:14 -07001540 sValue = &sValueTmp;
thestig732f6a02016-05-12 10:41:56 -07001541 }
Tom Sepez40e9ff32015-11-30 12:39:54 -08001542#endif // PDF_ENABLE_XFA
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001543
thestig732f6a02016-05-12 10:41:56 -07001544 if (nMaxLen > 0) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001545 if (bCharArray) {
thestig732f6a02016-05-12 10:41:56 -07001546 pEdit->SetCharArray(nMaxLen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001547
thestig732f6a02016-05-12 10:41:56 -07001548 if (IsFloatZero(fFontSize)) {
1549 fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(font_map.GetPDFFont(0),
1550 rcClient, nMaxLen);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001551 }
thestig732f6a02016-05-12 10:41:56 -07001552 } else {
1553 if (sValue)
tsepeza31da742016-09-08 11:28:14 -07001554 nMaxLen = sValue->GetLength();
thestig732f6a02016-05-12 10:41:56 -07001555 pEdit->SetLimitChar(nMaxLen);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001556 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001557 }
1558
thestig732f6a02016-05-12 10:41:56 -07001559 if (IsFloatZero(fFontSize))
tsepez4cf55152016-11-02 14:37:54 -07001560 pEdit->SetAutoFontSize(true, true);
thestig732f6a02016-05-12 10:41:56 -07001561 else
1562 pEdit->SetFontSize(fFontSize);
1563
1564 pEdit->Initialize();
tsepez067990c2016-09-13 06:46:40 -07001565 pEdit->SetText(sValue ? *sValue : pField->GetValue());
thestig732f6a02016-05-12 10:41:56 -07001566
1567 CFX_FloatRect rcContent = pEdit->GetContentRect();
thestig732f6a02016-05-12 10:41:56 -07001568 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(
dsinclair92a32db2017-02-14 14:58:49 +00001569 pEdit.get(), CFX_FloatPoint(), nullptr, !bCharArray, subWord);
thestig732f6a02016-05-12 10:41:56 -07001570
1571 if (sEdit.GetLength() > 0) {
1572 sBody << "/Tx BMC\n"
1573 << "q\n";
1574 if (rcContent.Width() > rcClient.Width() ||
1575 rcContent.Height() > rcClient.Height()) {
1576 sBody << rcClient.left << " " << rcClient.bottom << " "
1577 << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
1578 }
1579 CPWL_Color crText = GetTextPWLColor();
1580 sBody << "BT\n"
1581 << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"
1582 << "Q\nEMC\n";
1583 }
1584
1585 if (bCharArray) {
1586 switch (GetBorderStyle()) {
dsinclair92cb5e52016-05-16 11:38:28 -07001587 case BorderStyle::SOLID: {
thestig732f6a02016-05-12 10:41:56 -07001588 CFX_ByteString sColor =
tsepez4cf55152016-11-02 14:37:54 -07001589 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false);
thestig732f6a02016-05-12 10:41:56 -07001590 if (sColor.GetLength() > 0) {
1591 sLines << "q\n"
1592 << GetBorderWidth() << " w\n"
tsepez4cf55152016-11-02 14:37:54 -07001593 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false)
thestig732f6a02016-05-12 10:41:56 -07001594 << " 2 J 0 j\n";
1595
thestig594b20b2016-05-12 21:56:43 -07001596 for (int32_t i = 1; i < nMaxLen; ++i) {
thestig732f6a02016-05-12 10:41:56 -07001597 sLines << rcClient.left +
1598 ((rcClient.right - rcClient.left) / nMaxLen) * i
1599 << " " << rcClient.bottom << " m\n"
1600 << rcClient.left +
1601 ((rcClient.right - rcClient.left) / nMaxLen) * i
1602 << " " << rcClient.top << " l S\n";
1603 }
1604
1605 sLines << "Q\n";
1606 }
dsinclair92cb5e52016-05-16 11:38:28 -07001607 break;
1608 }
1609 case BorderStyle::DASH: {
thestig732f6a02016-05-12 10:41:56 -07001610 CFX_ByteString sColor =
tsepez4cf55152016-11-02 14:37:54 -07001611 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false);
thestig732f6a02016-05-12 10:41:56 -07001612 if (sColor.GetLength() > 0) {
1613 CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0);
1614
1615 sLines << "q\n"
1616 << GetBorderWidth() << " w\n"
tsepez4cf55152016-11-02 14:37:54 -07001617 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false)
thestig732f6a02016-05-12 10:41:56 -07001618 << "[" << dsBorder.nDash << " " << dsBorder.nGap << "] "
1619 << dsBorder.nPhase << " d\n";
1620
thestig594b20b2016-05-12 21:56:43 -07001621 for (int32_t i = 1; i < nMaxLen; ++i) {
thestig732f6a02016-05-12 10:41:56 -07001622 sLines << rcClient.left +
1623 ((rcClient.right - rcClient.left) / nMaxLen) * i
1624 << " " << rcClient.bottom << " m\n"
1625 << rcClient.left +
1626 ((rcClient.right - rcClient.left) / nMaxLen) * i
1627 << " " << rcClient.top << " l S\n";
1628 }
1629
1630 sLines << "Q\n";
1631 }
dsinclair92cb5e52016-05-16 11:38:28 -07001632 break;
1633 }
1634 default:
1635 break;
thestig732f6a02016-05-12 10:41:56 -07001636 }
1637 }
1638
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001639 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001640 sLines.AsStringC() + sBody.AsStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001641 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001642}
1643
Tom Sepez281a9ea2016-02-26 14:24:28 -08001644CFX_FloatRect CPDFSDK_Widget::GetClientRect() const {
1645 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001646 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
1647 switch (GetBorderStyle()) {
dsinclair92cb5e52016-05-16 11:38:28 -07001648 case BorderStyle::BEVELED:
1649 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001650 fBorderWidth *= 2.0f;
1651 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001652 default:
1653 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001654 }
1655
1656 return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001657}
1658
Tom Sepez281a9ea2016-02-26 14:24:28 -08001659CFX_FloatRect CPDFSDK_Widget::GetRotatedRect() const {
1660 CFX_FloatRect rectAnnot = GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001661 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
1662 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
1663
1664 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001665 CFX_FloatRect rcPDFWindow;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001666 switch (abs(pControl->GetRotation() % 360)) {
1667 case 0:
1668 case 180:
1669 default:
Tom Sepez281a9ea2016-02-26 14:24:28 -08001670 rcPDFWindow = CFX_FloatRect(0, 0, fWidth, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001671 break;
1672 case 90:
1673 case 270:
Tom Sepez281a9ea2016-02-26 14:24:28 -08001674 rcPDFWindow = CFX_FloatRect(0, 0, fHeight, fWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001675 break;
1676 }
1677
1678 return rcPDFWindow;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001679}
1680
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001681CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const {
1682 CPWL_Color crBackground = GetFillPWLColor();
jaepark611adb82016-08-17 11:34:36 -07001683 if (crBackground.nColorType != COLORTYPE_TRANSPARENT)
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001684 return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);
jaepark611adb82016-08-17 11:34:36 -07001685
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001686 return "";
Bo Xufdc00a72014-10-28 23:03:33 -07001687}
1688
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001689CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001690 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001691 CPWL_Color crBorder = GetBorderPWLColor();
1692 CPWL_Color crBackground = GetFillPWLColor();
1693 CPWL_Color crLeftTop, crRightBottom;
1694
1695 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001696 CPWL_Dash dsBorder(3, 0, 0);
1697
dsinclair92cb5e52016-05-16 11:38:28 -07001698 BorderStyle nBorderStyle = GetBorderStyle();
1699 switch (nBorderStyle) {
1700 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001701 dsBorder = CPWL_Dash(3, 3, 0);
1702 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001703 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001704 fBorderWidth *= 2;
1705 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
1706 crRightBottom = CPWL_Utils::DevideColor(crBackground, 2);
1707 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001708 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001709 fBorderWidth *= 2;
1710 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1711 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1712 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001713 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001714 break;
1715 }
1716
1717 return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1718 crLeftTop, crRightBottom, nBorderStyle,
1719 dsBorder);
Bo Xufdc00a72014-10-28 23:03:33 -07001720}
1721
Tom Sepez60d909e2015-12-10 15:34:55 -08001722CFX_Matrix CPDFSDK_Widget::GetMatrix() const {
1723 CFX_Matrix mt;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001724 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001725 CFX_FloatRect rcAnnot = GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001726 FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;
1727 FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;
1728
1729 switch (abs(pControl->GetRotation() % 360)) {
1730 case 0:
1731 default:
Tom Sepez60d909e2015-12-10 15:34:55 -08001732 mt = CFX_Matrix(1, 0, 0, 1, 0, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001733 break;
1734 case 90:
Tom Sepez60d909e2015-12-10 15:34:55 -08001735 mt = CFX_Matrix(0, 1, -1, 0, fWidth, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001736 break;
1737 case 180:
Tom Sepez60d909e2015-12-10 15:34:55 -08001738 mt = CFX_Matrix(-1, 0, 0, -1, fWidth, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001739 break;
1740 case 270:
Tom Sepez60d909e2015-12-10 15:34:55 -08001741 mt = CFX_Matrix(0, -1, 1, 0, 0, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001742 break;
1743 }
1744
1745 return mt;
Bo Xufdc00a72014-10-28 23:03:33 -07001746}
1747
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001748CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const {
1749 CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);
1750
1751 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001752 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
1753 if (da.HasColor()) {
1754 int32_t iColorType;
1755 FX_FLOAT fc[4];
1756 da.GetColor(iColorType, fc);
1757 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1758 }
1759
1760 return crText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001761}
1762
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001763CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const {
1764 CPWL_Color crBorder;
1765
1766 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001767 int32_t iColorType;
1768 FX_FLOAT fc[4];
1769 pFormCtrl->GetOriginalBorderColor(iColorType, fc);
1770 if (iColorType > 0)
1771 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1772
1773 return crBorder;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001774}
1775
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001776CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const {
1777 CPWL_Color crFill;
1778
1779 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001780 int32_t iColorType;
1781 FX_FLOAT fc[4];
1782 pFormCtrl->GetOriginalBackgroundColor(iColorType, fc);
1783 if (iColorType > 0)
1784 crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1785
1786 return crFill;
Bo Xufdc00a72014-10-28 23:03:33 -07001787}
1788
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001789void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType,
1790 CPDF_Stream* pImage) {
dsinclair38fd8442016-09-15 10:15:32 -07001791 CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP");
1792 CPDF_Stream* pStream = pAPDict->GetStreamFor(sAPType);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001793 CPDF_Dictionary* pStreamDict = pStream->GetDict();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001794 CFX_ByteString sImageAlias = "IMG";
1795
1796 if (CPDF_Dictionary* pImageDict = pImage->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -07001797 sImageAlias = pImageDict->GetStringFor("Name");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001798 if (sImageAlias.IsEmpty())
1799 sImageAlias = "IMG";
1800 }
1801
tsepez698c5712016-09-28 16:47:07 -07001802 CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
dsinclair38fd8442016-09-15 10:15:32 -07001803 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
tsepez0e606b52016-11-18 16:22:41 -08001804 if (!pStreamResList)
1805 pStreamResList = pStreamDict->SetNewFor<CPDF_Dictionary>("Resources");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001806
tsepez0e606b52016-11-18 16:22:41 -08001807 CPDF_Dictionary* pXObject =
1808 pStreamResList->SetNewFor<CPDF_Dictionary>("XObject");
1809 pXObject->SetNewFor<CPDF_Reference>(sImageAlias, pDoc, pImage->GetObjNum());
Bo Xufdc00a72014-10-28 23:03:33 -07001810}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001811
1812void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) {
dsinclair38fd8442016-09-15 10:15:32 -07001813 if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP"))
1814 pAPDict->RemoveFor(sAPType);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001815}
1816
tsepez4cf55152016-11-02 14:37:54 -07001817bool CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type,
1818 PDFSDK_FieldAction& data,
1819 CPDFSDK_PageView* pPageView) {
dsinclairb402b172016-10-11 09:26:32 -07001820 CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001821
Tom Sepez40e9ff32015-11-30 12:39:54 -08001822#ifdef PDF_ENABLE_XFA
dsinclair521b7502016-11-02 13:02:28 -07001823 CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext();
dsinclairdf4bc592016-03-31 20:34:43 -07001824 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001825 XFA_EVENTTYPE eEventType = GetXFAEventType(type, data.bWillCommit);
1826
1827 if (eEventType != XFA_EVENT_Unknown) {
dsinclairdf4bc592016-03-31 20:34:43 -07001828 if (CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001829 CXFA_EventParam param;
1830 param.m_eType = eEventType;
1831 param.m_wsChange = data.sChange;
1832 param.m_iCommitKey = data.nCommitKey;
1833 param.m_bShift = data.bShift;
1834 param.m_iSelStart = data.nSelStart;
1835 param.m_iSelEnd = data.nSelEnd;
1836 param.m_wsFullText = data.sValue;
1837 param.m_bKeyDown = data.bKeyDown;
1838 param.m_bModifier = data.bModifier;
1839 param.m_wsNewText = data.sValue;
1840 if (data.nSelEnd > data.nSelStart)
1841 param.m_wsNewText.Delete(data.nSelStart,
1842 data.nSelEnd - data.nSelStart);
1843 for (int i = data.sChange.GetLength() - 1; i >= 0; i--)
1844 param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]);
1845 param.m_wsPrevText = data.sValue;
1846
dsinclair221caf62016-04-04 12:08:40 -07001847 CXFA_WidgetAcc* pAcc = hWidget->GetDataAcc();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001848 param.m_pTarget = pAcc;
1849 int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, &param);
1850
dsinclair521b7502016-11-02 13:02:28 -07001851 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001852 pDocView->UpdateDocView();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001853
Wei Lie98ac2e2016-03-18 15:43:04 -07001854 if (nRet == XFA_EVENTERROR_Success)
tsepez4cf55152016-11-02 14:37:54 -07001855 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001856 }
1857 }
1858 }
Tom Sepez40e9ff32015-11-30 12:39:54 -08001859#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001860
1861 CPDF_Action action = GetAAction(type);
Wei Li0fc6b252016-03-01 16:29:41 -08001862 if (action.GetDict() && action.GetType() != CPDF_Action::Unknown) {
dsinclairb402b172016-10-11 09:26:32 -07001863 CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHander();
dsinclair19c198b2016-10-11 12:51:37 -07001864 return pActionHandler->DoAction_Field(action, type, pFormFillEnv,
1865 GetFormField(), data);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001866 }
tsepez4cf55152016-11-02 14:37:54 -07001867 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001868}
1869
1870CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) {
1871 switch (eAAT) {
1872 case CPDF_AAction::CursorEnter:
1873 case CPDF_AAction::CursorExit:
1874 case CPDF_AAction::ButtonDown:
1875 case CPDF_AAction::ButtonUp:
1876 case CPDF_AAction::GetFocus:
1877 case CPDF_AAction::LoseFocus:
1878 case CPDF_AAction::PageOpen:
1879 case CPDF_AAction::PageClose:
1880 case CPDF_AAction::PageVisible:
1881 case CPDF_AAction::PageInvisible:
1882 return CPDFSDK_BAAnnot::GetAAction(eAAT);
1883
1884 case CPDF_AAction::KeyStroke:
1885 case CPDF_AAction::Format:
1886 case CPDF_AAction::Validate:
1887 case CPDF_AAction::Calculate: {
1888 CPDF_FormField* pField = GetFormField();
Wei Li0fc6b252016-03-01 16:29:41 -08001889 if (pField->GetAdditionalAction().GetDict())
1890 return pField->GetAdditionalAction().GetAction(eAAT);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001891 return CPDFSDK_BAAnnot::GetAAction(eAAT);
1892 }
1893 default:
1894 break;
1895 }
1896
1897 return CPDF_Action();
1898}
1899
1900CFX_WideString CPDFSDK_Widget::GetAlternateName() const {
1901 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001902 return pFormField->GetAlternateName();
1903}
1904
1905int32_t CPDFSDK_Widget::GetAppearanceAge() const {
1906 return m_nAppAge;
1907}
1908
1909int32_t CPDFSDK_Widget::GetValueAge() const {
1910 return m_nValueAge;
1911}
1912
tsepez4cf55152016-11-02 14:37:54 -07001913bool CPDFSDK_Widget::HitTest(FX_FLOAT pageX, FX_FLOAT pageY) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001914 CPDF_Annot* pAnnot = GetPDFAnnot();
jaeparka1d21112016-08-25 13:33:34 -07001915 CFX_FloatRect annotRect = pAnnot->GetRect();
jaepark611adb82016-08-17 11:34:36 -07001916 if (!annotRect.Contains(pageX, pageY))
tsepez4cf55152016-11-02 14:37:54 -07001917 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001918
jaepark611adb82016-08-17 11:34:36 -07001919 if (!IsVisible())
tsepez4cf55152016-11-02 14:37:54 -07001920 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001921
jaepark611adb82016-08-17 11:34:36 -07001922 if ((GetFieldFlags() & FIELDFLAG_READONLY) == FIELDFLAG_READONLY)
tsepez4cf55152016-11-02 14:37:54 -07001923 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001924
tsepez4cf55152016-11-02 14:37:54 -07001925 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001926}