blob: cd86f7a0b5d22b57e75ef800ace4b2696ef3ce91 [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();
Dan Sinclaira0061af2017-02-23 09:25:17 -0500848 CFX_PointF tmp =
849 page2device.Transform(CFX_PointF(rcDevice.left, rcDevice.bottom));
850 rcDevice.left = tmp.x;
851 rcDevice.bottom = tmp.y;
852
853 tmp = page2device.Transform(CFX_PointF(rcDevice.right, rcDevice.top));
854 rcDevice.right = tmp.x;
855 rcDevice.top = tmp.y;
jaepark611adb82016-08-17 11:34:36 -0700856 rcDevice.Normalize();
857
Dan Sinclairafb44562017-02-09 13:07:43 -0500858 FX_RECT rcDev = rcDevice.ToFxRect();
859 pDevice->FillRect(
860 &rcDev, ArgbEncode(static_cast<int>(m_pInterForm->GetHighlightAlpha()),
861 m_pInterForm->GetHighlightColor(nFieldType)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700862}
863
864void CPDFSDK_Widget::ResetAppearance_PushButton() {
865 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -0800866 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700867 int32_t nLayout = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700868 switch (pControl->GetTextPosition()) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700869 case TEXTPOS_ICON:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 nLayout = PPBL_ICON;
871 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700872 case TEXTPOS_BELOW:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700873 nLayout = PPBL_ICONTOPLABELBOTTOM;
874 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700875 case TEXTPOS_ABOVE:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700876 nLayout = PPBL_LABELTOPICONBOTTOM;
877 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700878 case TEXTPOS_RIGHT:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700879 nLayout = PPBL_ICONLEFTLABELRIGHT;
880 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700881 case TEXTPOS_LEFT:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700882 nLayout = PPBL_LABELLEFTICONRIGHT;
883 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700884 case TEXTPOS_OVERLAID:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700885 nLayout = PPBL_LABELOVERICON;
886 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700887 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700888 nLayout = PPBL_LABEL;
889 break;
890 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700891
Dan Sinclairfc54e052017-02-23 09:59:05 -0500892 CPWL_Color crBackground;
893 CPWL_Color crBorder;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700894 int iColorType;
895 FX_FLOAT fc[4];
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700896 pControl->GetOriginalBackgroundColor(iColorType, fc);
897 if (iColorType > 0)
898 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700899
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700900 pControl->GetOriginalBorderColor(iColorType, fc);
901 if (iColorType > 0)
902 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700903
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700904 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700905 CPWL_Dash dsBorder(3, 0, 0);
Dan Sinclairfc54e052017-02-23 09:59:05 -0500906 CPWL_Color crLeftTop;
907 CPWL_Color crRightBottom;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700908
dsinclair92cb5e52016-05-16 11:38:28 -0700909 BorderStyle nBorderStyle = GetBorderStyle();
910 switch (nBorderStyle) {
911 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700912 dsBorder = CPWL_Dash(3, 3, 0);
913 break;
dsinclair92cb5e52016-05-16 11:38:28 -0700914 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700915 fBorderWidth *= 2;
916 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
Dan Sinclairfc54e052017-02-23 09:59:05 -0500917 crRightBottom = crBackground / 2.0f;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700918 break;
dsinclair92cb5e52016-05-16 11:38:28 -0700919 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700920 fBorderWidth *= 2;
921 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
922 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
923 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700924 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700925 break;
926 }
927
Tom Sepez281a9ea2016-02-26 14:24:28 -0800928 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700929
930 CPWL_Color crText(COLORTYPE_GRAY, 0);
931
932 FX_FLOAT fFontSize = 12.0f;
933 CFX_ByteString csNameTag;
934
935 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
936 if (da.HasColor()) {
937 da.GetColor(iColorType, fc);
938 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
939 }
940
941 if (da.HasFont())
942 da.GetFont(csNameTag, fFontSize);
943
944 CFX_WideString csWCaption;
945 CFX_WideString csNormalCaption, csRolloverCaption, csDownCaption;
946
jaepark611adb82016-08-17 11:34:36 -0700947 if (pControl->HasMKEntry("CA"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700948 csNormalCaption = pControl->GetNormalCaption();
jaepark611adb82016-08-17 11:34:36 -0700949
950 if (pControl->HasMKEntry("RC"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700951 csRolloverCaption = pControl->GetRolloverCaption();
jaepark611adb82016-08-17 11:34:36 -0700952
953 if (pControl->HasMKEntry("AC"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700954 csDownCaption = pControl->GetDownCaption();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700955
thestig1cd352e2016-06-07 17:53:06 -0700956 CPDF_Stream* pNormalIcon = nullptr;
957 CPDF_Stream* pRolloverIcon = nullptr;
958 CPDF_Stream* pDownIcon = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700959
jaepark611adb82016-08-17 11:34:36 -0700960 if (pControl->HasMKEntry("I"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700961 pNormalIcon = pControl->GetNormalIcon();
jaepark611adb82016-08-17 11:34:36 -0700962
963 if (pControl->HasMKEntry("RI"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700964 pRolloverIcon = pControl->GetRolloverIcon();
jaepark611adb82016-08-17 11:34:36 -0700965
966 if (pControl->HasMKEntry("IX"))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700967 pDownIcon = pControl->GetDownIcon();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700968
969 if (pNormalIcon) {
970 if (CPDF_Dictionary* pImageDict = pNormalIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700971 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800972 pImageDict->SetNewFor<CPDF_String>("Name", "ImgA", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700973 }
974 }
975
976 if (pRolloverIcon) {
977 if (CPDF_Dictionary* pImageDict = pRolloverIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700978 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800979 pImageDict->SetNewFor<CPDF_String>("Name", "ImgB", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700980 }
981 }
982
983 if (pDownIcon) {
984 if (CPDF_Dictionary* pImageDict = pDownIcon->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -0700985 if (pImageDict->GetStringFor("Name").IsEmpty())
tsepez0e606b52016-11-18 16:22:41 -0800986 pImageDict->SetNewFor<CPDF_String>("Name", "ImgC", false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700987 }
988 }
989
990 CPDF_IconFit iconFit = pControl->GetIconFit();
991
dsinclair690c0332016-10-11 09:13:01 -0700992 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
Lei Zhangfcfa3b82015-12-24 21:07:28 -0800993 font_map.SetAPType("N");
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700994
995 CFX_ByteString csAP =
996 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
997 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
998 crLeftTop, crRightBottom, nBorderStyle,
999 dsBorder) +
1000 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001001 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001002 pNormalIcon, iconFit, csNormalCaption, crText, fFontSize, nLayout);
1003
1004 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP);
1005 if (pNormalIcon)
1006 AddImageToAppearance("N", pNormalIcon);
1007
1008 CPDF_FormControl::HighlightingMode eHLM = pControl->GetHighlightingMode();
1009 if (eHLM == CPDF_FormControl::Push || eHLM == CPDF_FormControl::Toggle) {
1010 if (csRolloverCaption.IsEmpty() && !pRolloverIcon) {
1011 csRolloverCaption = csNormalCaption;
1012 pRolloverIcon = pNormalIcon;
1013 }
1014
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001015 font_map.SetAPType("R");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001016
1017 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1018 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1019 crLeftTop, crRightBottom,
1020 nBorderStyle, dsBorder) +
1021 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001022 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001023 pRolloverIcon, iconFit, csRolloverCaption, crText, fFontSize,
1024 nLayout);
1025
1026 WriteAppearance("R", GetRotatedRect(), GetMatrix(), csAP);
1027 if (pRolloverIcon)
1028 AddImageToAppearance("R", pRolloverIcon);
1029
1030 if (csDownCaption.IsEmpty() && !pDownIcon) {
1031 csDownCaption = csNormalCaption;
1032 pDownIcon = pNormalIcon;
1033 }
1034
1035 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001036 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001037 CPWL_Color crTemp = crLeftTop;
1038 crLeftTop = crRightBottom;
1039 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001040 break;
1041 }
1042 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001043 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1044 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001045 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001046 }
1047 default:
1048 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001049 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001050
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001051 font_map.SetAPType("D");
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001052
Dan Sinclairfc54e052017-02-23 09:59:05 -05001053 csAP = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) +
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001054 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1055 crLeftTop, crRightBottom,
1056 nBorderStyle, dsBorder) +
1057 CPWL_Utils::GetPushButtonAppStream(
Lei Zhangfcfa3b82015-12-24 21:07:28 -08001058 iconFit.GetFittingBounds() ? rcWindow : rcClient, &font_map,
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001059 pDownIcon, iconFit, csDownCaption, crText, fFontSize, nLayout);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001060
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001061 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001062 if (pDownIcon)
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001063 AddImageToAppearance("D", pDownIcon);
1064 } else {
1065 RemoveAppearance("D");
1066 RemoveAppearance("R");
1067 }
1068}
1069
1070void CPDFSDK_Widget::ResetAppearance_CheckBox() {
1071 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001072 CPWL_Color crBackground, crBorder, crText;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001073 int iColorType;
1074 FX_FLOAT fc[4];
1075
1076 pControl->GetOriginalBackgroundColor(iColorType, fc);
1077 if (iColorType > 0)
1078 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1079
1080 pControl->GetOriginalBorderColor(iColorType, fc);
1081 if (iColorType > 0)
1082 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1083
1084 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001085 CPWL_Dash dsBorder(3, 0, 0);
1086 CPWL_Color crLeftTop, crRightBottom;
1087
dsinclair92cb5e52016-05-16 11:38:28 -07001088 BorderStyle nBorderStyle = GetBorderStyle();
1089 switch (nBorderStyle) {
1090 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001091 dsBorder = CPWL_Dash(3, 3, 0);
1092 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001093 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001094 fBorderWidth *= 2;
1095 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
Dan Sinclairfc54e052017-02-23 09:59:05 -05001096 crRightBottom = crBackground / 2.0f;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001097 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001098 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001099 fBorderWidth *= 2;
1100 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1101 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1102 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001103 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001104 break;
1105 }
1106
Tom Sepez281a9ea2016-02-26 14:24:28 -08001107 CFX_FloatRect rcWindow = GetRotatedRect();
1108 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001109 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
1110 if (da.HasColor()) {
1111 da.GetColor(iColorType, fc);
1112 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1113 }
1114
1115 int32_t nStyle = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001116 CFX_WideString csWCaption = pControl->GetNormalCaption();
1117 if (csWCaption.GetLength() > 0) {
1118 switch (csWCaption[0]) {
1119 case L'l':
1120 nStyle = PCS_CIRCLE;
1121 break;
1122 case L'8':
1123 nStyle = PCS_CROSS;
1124 break;
1125 case L'u':
1126 nStyle = PCS_DIAMOND;
1127 break;
1128 case L'n':
1129 nStyle = PCS_SQUARE;
1130 break;
1131 case L'H':
1132 nStyle = PCS_STAR;
1133 break;
1134 default: // L'4'
1135 nStyle = PCS_CHECK;
1136 break;
1137 }
1138 } else {
1139 nStyle = PCS_CHECK;
1140 }
1141
1142 CFX_ByteString csAP_N_ON =
1143 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1144 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1145 crLeftTop, crRightBottom, nBorderStyle,
1146 dsBorder);
1147
1148 CFX_ByteString csAP_N_OFF = csAP_N_ON;
1149
1150 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001151 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001152 CPWL_Color crTemp = crLeftTop;
1153 crLeftTop = crRightBottom;
1154 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001155 break;
1156 }
1157 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001158 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1159 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1160 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001161 }
1162 default:
1163 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001164 }
1165
1166 CFX_ByteString csAP_D_ON =
Dan Sinclairfc54e052017-02-23 09:59:05 -05001167 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) +
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001168 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1169 crLeftTop, crRightBottom, nBorderStyle,
1170 dsBorder);
1171
1172 CFX_ByteString csAP_D_OFF = csAP_D_ON;
1173
1174 csAP_N_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText);
1175 csAP_D_ON += CPWL_Utils::GetCheckBoxAppStream(rcClient, nStyle, crText);
1176
1177 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON,
1178 pControl->GetCheckedAPState());
1179 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
1180
1181 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON,
1182 pControl->GetCheckedAPState());
1183 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
1184
1185 CFX_ByteString csAS = GetAppState();
1186 if (csAS.IsEmpty())
1187 SetAppState("Off");
1188}
1189
1190void CPDFSDK_Widget::ResetAppearance_RadioButton() {
1191 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001192 CPWL_Color crBackground, crBorder, crText;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001193 int iColorType;
1194 FX_FLOAT fc[4];
1195
1196 pControl->GetOriginalBackgroundColor(iColorType, fc);
1197 if (iColorType > 0)
1198 crBackground = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1199
1200 pControl->GetOriginalBorderColor(iColorType, fc);
1201 if (iColorType > 0)
1202 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1203
1204 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001205 CPWL_Dash dsBorder(3, 0, 0);
Dan Sinclairfc54e052017-02-23 09:59:05 -05001206 CPWL_Color crLeftTop;
1207 CPWL_Color crRightBottom;
dsinclair92cb5e52016-05-16 11:38:28 -07001208 BorderStyle nBorderStyle = GetBorderStyle();
1209 switch (nBorderStyle) {
1210 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001211 dsBorder = CPWL_Dash(3, 3, 0);
1212 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001213 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001214 fBorderWidth *= 2;
1215 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
Dan Sinclairfc54e052017-02-23 09:59:05 -05001216 crRightBottom = crBackground / 2.0f;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001217 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001218 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001219 fBorderWidth *= 2;
1220 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1221 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1222 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001223 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001224 break;
1225 }
1226
Tom Sepez281a9ea2016-02-26 14:24:28 -08001227 CFX_FloatRect rcWindow = GetRotatedRect();
1228 CFX_FloatRect rcClient = CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001229
1230 CPDF_DefaultAppearance da = pControl->GetDefaultAppearance();
1231 if (da.HasColor()) {
1232 da.GetColor(iColorType, fc);
1233 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1234 }
1235
1236 int32_t nStyle = 0;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001237 CFX_WideString csWCaption = pControl->GetNormalCaption();
1238 if (csWCaption.GetLength() > 0) {
1239 switch (csWCaption[0]) {
1240 default: // L'l':
1241 nStyle = PCS_CIRCLE;
1242 break;
1243 case L'8':
1244 nStyle = PCS_CROSS;
1245 break;
1246 case L'u':
1247 nStyle = PCS_DIAMOND;
1248 break;
1249 case L'n':
1250 nStyle = PCS_SQUARE;
1251 break;
1252 case L'H':
1253 nStyle = PCS_STAR;
1254 break;
1255 case L'4':
1256 nStyle = PCS_CHECK;
1257 break;
1258 }
1259 } else {
1260 nStyle = PCS_CIRCLE;
1261 }
1262
1263 CFX_ByteString csAP_N_ON;
1264
Tom Sepez281a9ea2016-02-26 14:24:28 -08001265 CFX_FloatRect rcCenter =
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001266 CPWL_Utils::DeflateRect(CPWL_Utils::GetCenterSquare(rcWindow), 1.0f);
1267
1268 if (nStyle == PCS_CIRCLE) {
dsinclair92cb5e52016-05-16 11:38:28 -07001269 if (nBorderStyle == BorderStyle::BEVELED) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001270 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
Dan Sinclairfc54e052017-02-23 09:59:05 -05001271 crRightBottom = crBackground - 0.25f;
dsinclair92cb5e52016-05-16 11:38:28 -07001272 } else if (nBorderStyle == BorderStyle::INSET) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001273 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5f);
1274 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75f);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001275 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001276
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001277 csAP_N_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBackground) +
1278 CPWL_Utils::GetCircleBorderAppStream(
1279 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom,
1280 nBorderStyle, dsBorder);
1281 } else {
1282 csAP_N_ON = CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground) +
1283 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1284 crLeftTop, crRightBottom,
1285 nBorderStyle, dsBorder);
1286 }
1287
1288 CFX_ByteString csAP_N_OFF = csAP_N_ON;
1289
1290 switch (nBorderStyle) {
dsinclair92cb5e52016-05-16 11:38:28 -07001291 case BorderStyle::BEVELED: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001292 CPWL_Color crTemp = crLeftTop;
1293 crLeftTop = crRightBottom;
1294 crRightBottom = crTemp;
dsinclair92cb5e52016-05-16 11:38:28 -07001295 break;
1296 }
1297 case BorderStyle::INSET: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001298 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1299 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1300 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001301 }
1302 default:
1303 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001304 }
1305
1306 CFX_ByteString csAP_D_ON;
1307
1308 if (nStyle == PCS_CIRCLE) {
Dan Sinclairfc54e052017-02-23 09:59:05 -05001309 CPWL_Color crBK = crBackground - 0.25f;
dsinclair92cb5e52016-05-16 11:38:28 -07001310 if (nBorderStyle == BorderStyle::BEVELED) {
Dan Sinclairfc54e052017-02-23 09:59:05 -05001311 crLeftTop = crBackground - 0.25f;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001312 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1313 crBK = crBackground;
dsinclair92cb5e52016-05-16 11:38:28 -07001314 } else if (nBorderStyle == BorderStyle::INSET) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001315 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0);
1316 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 1);
1317 }
1318
1319 csAP_D_ON = CPWL_Utils::GetCircleFillAppStream(rcCenter, crBK) +
1320 CPWL_Utils::GetCircleBorderAppStream(
1321 rcCenter, fBorderWidth, crBorder, crLeftTop, crRightBottom,
1322 nBorderStyle, dsBorder);
1323 } else {
Dan Sinclairfc54e052017-02-23 09:59:05 -05001324 csAP_D_ON =
1325 CPWL_Utils::GetRectFillAppStream(rcWindow, crBackground - 0.25f) +
1326 CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1327 crLeftTop, crRightBottom, nBorderStyle,
1328 dsBorder);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001329 }
1330
1331 CFX_ByteString csAP_D_OFF = csAP_D_ON;
1332
1333 csAP_N_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText);
1334 csAP_D_ON += CPWL_Utils::GetRadioButtonAppStream(rcClient, nStyle, crText);
1335
1336 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_ON,
1337 pControl->GetCheckedAPState());
1338 WriteAppearance("N", GetRotatedRect(), GetMatrix(), csAP_N_OFF, "Off");
1339
1340 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_ON,
1341 pControl->GetCheckedAPState());
1342 WriteAppearance("D", GetRotatedRect(), GetMatrix(), csAP_D_OFF, "Off");
1343
1344 CFX_ByteString csAS = GetAppState();
1345 if (csAS.IsEmpty())
1346 SetAppState("Off");
1347}
1348
tsepeza31da742016-09-08 11:28:14 -07001349void CPDFSDK_Widget::ResetAppearance_ComboBox(const CFX_WideString* sValue) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001350 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001351 CPDF_FormField* pField = pControl->GetField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001352 CFX_ByteTextBuf sBody, sLines;
1353
Tom Sepez281a9ea2016-02-26 14:24:28 -08001354 CFX_FloatRect rcClient = GetClientRect();
1355 CFX_FloatRect rcButton = rcClient;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001356 rcButton.left = rcButton.right - 13;
1357 rcButton.Normalize();
1358
dsinclaire35af1e2016-07-13 11:26:20 -07001359 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001360 pEdit->EnableRefresh(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001361
dsinclair690c0332016-10-11 09:13:01 -07001362 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001363 pEdit->SetFontMap(&font_map);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001364
thestig732f6a02016-05-12 10:41:56 -07001365 CFX_FloatRect rcEdit = rcClient;
1366 rcEdit.right = rcButton.left;
1367 rcEdit.Normalize();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001368
thestig732f6a02016-05-12 10:41:56 -07001369 pEdit->SetPlateRect(rcEdit);
tsepez4cf55152016-11-02 14:37:54 -07001370 pEdit->SetAlignmentV(1, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001371
thestig732f6a02016-05-12 10:41:56 -07001372 FX_FLOAT fFontSize = GetFontSize();
1373 if (IsFloatZero(fFontSize))
tsepez4cf55152016-11-02 14:37:54 -07001374 pEdit->SetAutoFontSize(true, true);
thestig732f6a02016-05-12 10:41:56 -07001375 else
1376 pEdit->SetFontSize(fFontSize);
1377
1378 pEdit->Initialize();
1379
1380 if (sValue) {
tsepeza31da742016-09-08 11:28:14 -07001381 pEdit->SetText(*sValue);
thestig732f6a02016-05-12 10:41:56 -07001382 } else {
1383 int32_t nCurSel = pField->GetSelectedIndex(0);
thestig732f6a02016-05-12 10:41:56 -07001384 if (nCurSel < 0)
tsepez067990c2016-09-13 06:46:40 -07001385 pEdit->SetText(pField->GetValue());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001386 else
tsepez067990c2016-09-13 06:46:40 -07001387 pEdit->SetText(pField->GetOptionLabel(nCurSel));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001388 }
1389
thestig732f6a02016-05-12 10:41:56 -07001390 CFX_FloatRect rcContent = pEdit->GetContentRect();
1391
1392 CFX_ByteString sEdit =
Dan Sinclairf528eee2017-02-14 11:52:07 -05001393 CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF());
thestig732f6a02016-05-12 10:41:56 -07001394 if (sEdit.GetLength() > 0) {
1395 sBody << "/Tx BMC\n"
1396 << "q\n";
1397 if (rcContent.Width() > rcEdit.Width() ||
1398 rcContent.Height() > rcEdit.Height()) {
1399 sBody << rcEdit.left << " " << rcEdit.bottom << " " << rcEdit.Width()
1400 << " " << rcEdit.Height() << " re\nW\nn\n";
1401 }
1402
1403 CPWL_Color crText = GetTextPWLColor();
1404 sBody << "BT\n"
1405 << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"
1406 << "Q\nEMC\n";
1407 }
1408
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001409 sBody << CPWL_Utils::GetDropButtonAppStream(rcButton);
1410
1411 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001412 sLines.AsStringC() + sBody.AsStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001413
1414 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
1415}
1416
1417void CPDFSDK_Widget::ResetAppearance_ListBox() {
1418 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001419 CPDF_FormField* pField = pControl->GetField();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001420 CFX_FloatRect rcClient = GetClientRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001421 CFX_ByteTextBuf sBody, sLines;
1422
dsinclaire35af1e2016-07-13 11:26:20 -07001423 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001424 pEdit->EnableRefresh(false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001425
dsinclair690c0332016-10-11 09:13:01 -07001426 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001427 pEdit->SetFontMap(&font_map);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001428
thestig732f6a02016-05-12 10:41:56 -07001429 pEdit->SetPlateRect(CFX_FloatRect(rcClient.left, 0.0f, rcClient.right, 0.0f));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001430
thestig732f6a02016-05-12 10:41:56 -07001431 FX_FLOAT fFontSize = GetFontSize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001432
thestig594b20b2016-05-12 21:56:43 -07001433 pEdit->SetFontSize(IsFloatZero(fFontSize) ? 12.0f : fFontSize);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001434
thestig732f6a02016-05-12 10:41:56 -07001435 pEdit->Initialize();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001436
thestig732f6a02016-05-12 10:41:56 -07001437 CFX_ByteTextBuf sList;
1438 FX_FLOAT fy = rcClient.top;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001439
thestig732f6a02016-05-12 10:41:56 -07001440 int32_t nTop = pField->GetTopVisibleIndex();
1441 int32_t nCount = pField->CountOptions();
1442 int32_t nSelCount = pField->CountSelectedItems();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001443
thestig594b20b2016-05-12 21:56:43 -07001444 for (int32_t i = nTop; i < nCount; ++i) {
1445 bool bSelected = false;
1446 for (int32_t j = 0; j < nSelCount; ++j) {
thestig732f6a02016-05-12 10:41:56 -07001447 if (pField->GetSelectedIndex(j) == i) {
thestig594b20b2016-05-12 21:56:43 -07001448 bSelected = true;
thestig732f6a02016-05-12 10:41:56 -07001449 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001450 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001451 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001452
tsepez067990c2016-09-13 06:46:40 -07001453 pEdit->SetText(pField->GetOptionLabel(i));
thestig732f6a02016-05-12 10:41:56 -07001454
1455 CFX_FloatRect rcContent = pEdit->GetContentRect();
1456 FX_FLOAT fItemHeight = rcContent.Height();
1457
1458 if (bSelected) {
1459 CFX_FloatRect rcItem =
1460 CFX_FloatRect(rcClient.left, fy - fItemHeight, rcClient.right, fy);
1461 sList << "q\n"
1462 << CPWL_Utils::GetColorAppStream(
1463 CPWL_Color(COLORTYPE_RGB, 0, 51.0f / 255.0f,
1464 113.0f / 255.0f),
tsepez4cf55152016-11-02 14:37:54 -07001465 true)
thestig732f6a02016-05-12 10:41:56 -07001466 << rcItem.left << " " << rcItem.bottom << " " << rcItem.Width()
1467 << " " << rcItem.Height() << " re f\n"
1468 << "Q\n";
1469
1470 sList << "BT\n"
1471 << CPWL_Utils::GetColorAppStream(CPWL_Color(COLORTYPE_GRAY, 1),
tsepez4cf55152016-11-02 14:37:54 -07001472 true)
Dan Sinclairf528eee2017-02-14 11:52:07 -05001473 << CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF(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)
Dan Sinclairf528eee2017-02-14 11:52:07 -05001479 << CPWL_Utils::GetEditAppStream(pEdit.get(), CFX_PointF(0.0f, fy))
thestig732f6a02016-05-12 10:41:56 -07001480 << "ET\n";
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001481 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001482
thestig732f6a02016-05-12 10:41:56 -07001483 fy -= fItemHeight;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001484 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001485
thestig732f6a02016-05-12 10:41:56 -07001486 if (sList.GetSize() > 0) {
1487 sBody << "/Tx BMC\n"
1488 << "q\n"
1489 << rcClient.left << " " << rcClient.bottom << " " << rcClient.Width()
1490 << " " << rcClient.Height() << " re\nW\nn\n";
1491 sBody << sList << "Q\nEMC\n";
1492 }
1493
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001494 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001495 sLines.AsStringC() + sBody.AsStringC();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001496
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001497 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001498}
1499
tsepeza31da742016-09-08 11:28:14 -07001500void CPDFSDK_Widget::ResetAppearance_TextField(const CFX_WideString* sValue) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001501 CPDF_FormControl* pControl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001502 CPDF_FormField* pField = pControl->GetField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001503 CFX_ByteTextBuf sBody, sLines;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001504
dsinclaire35af1e2016-07-13 11:26:20 -07001505 std::unique_ptr<CFX_Edit> pEdit(new CFX_Edit);
tsepez4cf55152016-11-02 14:37:54 -07001506 pEdit->EnableRefresh(false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001507
dsinclair690c0332016-10-11 09:13:01 -07001508 CBA_FontMap font_map(this, m_pInterForm->GetFormFillEnv()->GetSysHandler());
thestig732f6a02016-05-12 10:41:56 -07001509 pEdit->SetFontMap(&font_map);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001510
thestig732f6a02016-05-12 10:41:56 -07001511 CFX_FloatRect rcClient = GetClientRect();
1512 pEdit->SetPlateRect(rcClient);
tsepez4cf55152016-11-02 14:37:54 -07001513 pEdit->SetAlignmentH(pControl->GetControlAlignment(), true);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001514
thestig732f6a02016-05-12 10:41:56 -07001515 uint32_t dwFieldFlags = pField->GetFieldFlags();
tsepez4cf55152016-11-02 14:37:54 -07001516 bool bMultiLine = (dwFieldFlags >> 12) & 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001517
thestig732f6a02016-05-12 10:41:56 -07001518 if (bMultiLine) {
tsepez4cf55152016-11-02 14:37:54 -07001519 pEdit->SetMultiLine(true, true);
1520 pEdit->SetAutoReturn(true, true);
thestig732f6a02016-05-12 10:41:56 -07001521 } else {
tsepez4cf55152016-11-02 14:37:54 -07001522 pEdit->SetAlignmentV(1, true);
thestig732f6a02016-05-12 10:41:56 -07001523 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001524
thestig732f6a02016-05-12 10:41:56 -07001525 uint16_t subWord = 0;
1526 if ((dwFieldFlags >> 13) & 1) {
1527 subWord = '*';
tsepez4cf55152016-11-02 14:37:54 -07001528 pEdit->SetPasswordChar(subWord, true);
thestig732f6a02016-05-12 10:41:56 -07001529 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001530
thestig732f6a02016-05-12 10:41:56 -07001531 int nMaxLen = pField->GetMaxLen();
tsepez4cf55152016-11-02 14:37:54 -07001532 bool bCharArray = (dwFieldFlags >> 24) & 1;
thestig732f6a02016-05-12 10:41:56 -07001533 FX_FLOAT fFontSize = GetFontSize();
Bo Xufdc00a72014-10-28 23:03:33 -07001534
Tom Sepez51da0932015-11-25 16:05:49 -08001535#ifdef PDF_ENABLE_XFA
thestig732f6a02016-05-12 10:41:56 -07001536 CFX_WideString sValueTmp;
1537 if (!sValue && GetMixXFAWidget()) {
tsepez4cf55152016-11-02 14:37:54 -07001538 sValueTmp = GetValue(true);
tsepeza31da742016-09-08 11:28:14 -07001539 sValue = &sValueTmp;
thestig732f6a02016-05-12 10:41:56 -07001540 }
Tom Sepez40e9ff32015-11-30 12:39:54 -08001541#endif // PDF_ENABLE_XFA
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001542
thestig732f6a02016-05-12 10:41:56 -07001543 if (nMaxLen > 0) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001544 if (bCharArray) {
thestig732f6a02016-05-12 10:41:56 -07001545 pEdit->SetCharArray(nMaxLen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001546
thestig732f6a02016-05-12 10:41:56 -07001547 if (IsFloatZero(fFontSize)) {
1548 fFontSize = CPWL_Edit::GetCharArrayAutoFontSize(font_map.GetPDFFont(0),
1549 rcClient, nMaxLen);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001550 }
thestig732f6a02016-05-12 10:41:56 -07001551 } else {
1552 if (sValue)
tsepeza31da742016-09-08 11:28:14 -07001553 nMaxLen = sValue->GetLength();
thestig732f6a02016-05-12 10:41:56 -07001554 pEdit->SetLimitChar(nMaxLen);
Tom Sepez2f2ffec2015-07-23 14:42:09 -07001555 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001556 }
1557
thestig732f6a02016-05-12 10:41:56 -07001558 if (IsFloatZero(fFontSize))
tsepez4cf55152016-11-02 14:37:54 -07001559 pEdit->SetAutoFontSize(true, true);
thestig732f6a02016-05-12 10:41:56 -07001560 else
1561 pEdit->SetFontSize(fFontSize);
1562
1563 pEdit->Initialize();
tsepez067990c2016-09-13 06:46:40 -07001564 pEdit->SetText(sValue ? *sValue : pField->GetValue());
thestig732f6a02016-05-12 10:41:56 -07001565
1566 CFX_FloatRect rcContent = pEdit->GetContentRect();
thestig732f6a02016-05-12 10:41:56 -07001567 CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(
Dan Sinclairf528eee2017-02-14 11:52:07 -05001568 pEdit.get(), CFX_PointF(), nullptr, !bCharArray, subWord);
thestig732f6a02016-05-12 10:41:56 -07001569
1570 if (sEdit.GetLength() > 0) {
1571 sBody << "/Tx BMC\n"
1572 << "q\n";
1573 if (rcContent.Width() > rcClient.Width() ||
1574 rcContent.Height() > rcClient.Height()) {
1575 sBody << rcClient.left << " " << rcClient.bottom << " "
1576 << rcClient.Width() << " " << rcClient.Height() << " re\nW\nn\n";
1577 }
1578 CPWL_Color crText = GetTextPWLColor();
1579 sBody << "BT\n"
1580 << CPWL_Utils::GetColorAppStream(crText) << sEdit << "ET\n"
1581 << "Q\nEMC\n";
1582 }
1583
1584 if (bCharArray) {
1585 switch (GetBorderStyle()) {
dsinclair92cb5e52016-05-16 11:38:28 -07001586 case BorderStyle::SOLID: {
thestig732f6a02016-05-12 10:41:56 -07001587 CFX_ByteString sColor =
tsepez4cf55152016-11-02 14:37:54 -07001588 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false);
thestig732f6a02016-05-12 10:41:56 -07001589 if (sColor.GetLength() > 0) {
1590 sLines << "q\n"
1591 << GetBorderWidth() << " w\n"
tsepez4cf55152016-11-02 14:37:54 -07001592 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false)
thestig732f6a02016-05-12 10:41:56 -07001593 << " 2 J 0 j\n";
1594
thestig594b20b2016-05-12 21:56:43 -07001595 for (int32_t i = 1; i < nMaxLen; ++i) {
thestig732f6a02016-05-12 10:41:56 -07001596 sLines << rcClient.left +
1597 ((rcClient.right - rcClient.left) / nMaxLen) * i
1598 << " " << rcClient.bottom << " m\n"
1599 << rcClient.left +
1600 ((rcClient.right - rcClient.left) / nMaxLen) * i
1601 << " " << rcClient.top << " l S\n";
1602 }
1603
1604 sLines << "Q\n";
1605 }
dsinclair92cb5e52016-05-16 11:38:28 -07001606 break;
1607 }
1608 case BorderStyle::DASH: {
thestig732f6a02016-05-12 10:41:56 -07001609 CFX_ByteString sColor =
tsepez4cf55152016-11-02 14:37:54 -07001610 CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false);
thestig732f6a02016-05-12 10:41:56 -07001611 if (sColor.GetLength() > 0) {
1612 CPWL_Dash dsBorder = CPWL_Dash(3, 3, 0);
1613
1614 sLines << "q\n"
1615 << GetBorderWidth() << " w\n"
tsepez4cf55152016-11-02 14:37:54 -07001616 << CPWL_Utils::GetColorAppStream(GetBorderPWLColor(), false)
thestig732f6a02016-05-12 10:41:56 -07001617 << "[" << dsBorder.nDash << " " << dsBorder.nGap << "] "
1618 << dsBorder.nPhase << " d\n";
1619
thestig594b20b2016-05-12 21:56:43 -07001620 for (int32_t i = 1; i < nMaxLen; ++i) {
thestig732f6a02016-05-12 10:41:56 -07001621 sLines << rcClient.left +
1622 ((rcClient.right - rcClient.left) / nMaxLen) * i
1623 << " " << rcClient.bottom << " m\n"
1624 << rcClient.left +
1625 ((rcClient.right - rcClient.left) / nMaxLen) * i
1626 << " " << rcClient.top << " l S\n";
1627 }
1628
1629 sLines << "Q\n";
1630 }
dsinclair92cb5e52016-05-16 11:38:28 -07001631 break;
1632 }
1633 default:
1634 break;
thestig732f6a02016-05-12 10:41:56 -07001635 }
1636 }
1637
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001638 CFX_ByteString sAP = GetBackgroundAppStream() + GetBorderAppStream() +
tsepez8e4c5052016-04-14 13:42:44 -07001639 sLines.AsStringC() + sBody.AsStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001640 WriteAppearance("N", GetRotatedRect(), GetMatrix(), sAP);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001641}
1642
Tom Sepez281a9ea2016-02-26 14:24:28 -08001643CFX_FloatRect CPDFSDK_Widget::GetClientRect() const {
1644 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001645 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
1646 switch (GetBorderStyle()) {
dsinclair92cb5e52016-05-16 11:38:28 -07001647 case BorderStyle::BEVELED:
1648 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001649 fBorderWidth *= 2.0f;
1650 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001651 default:
1652 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001653 }
1654
1655 return CPWL_Utils::DeflateRect(rcWindow, fBorderWidth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001656}
1657
Tom Sepez281a9ea2016-02-26 14:24:28 -08001658CFX_FloatRect CPDFSDK_Widget::GetRotatedRect() const {
1659 CFX_FloatRect rectAnnot = GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001660 FX_FLOAT fWidth = rectAnnot.right - rectAnnot.left;
1661 FX_FLOAT fHeight = rectAnnot.top - rectAnnot.bottom;
1662
1663 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001664 CFX_FloatRect rcPDFWindow;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001665 switch (abs(pControl->GetRotation() % 360)) {
1666 case 0:
1667 case 180:
1668 default:
Tom Sepez281a9ea2016-02-26 14:24:28 -08001669 rcPDFWindow = CFX_FloatRect(0, 0, fWidth, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001670 break;
1671 case 90:
1672 case 270:
Tom Sepez281a9ea2016-02-26 14:24:28 -08001673 rcPDFWindow = CFX_FloatRect(0, 0, fHeight, fWidth);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001674 break;
1675 }
1676
1677 return rcPDFWindow;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001678}
1679
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001680CFX_ByteString CPDFSDK_Widget::GetBackgroundAppStream() const {
1681 CPWL_Color crBackground = GetFillPWLColor();
jaepark611adb82016-08-17 11:34:36 -07001682 if (crBackground.nColorType != COLORTYPE_TRANSPARENT)
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001683 return CPWL_Utils::GetRectFillAppStream(GetRotatedRect(), crBackground);
jaepark611adb82016-08-17 11:34:36 -07001684
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001685 return "";
Bo Xufdc00a72014-10-28 23:03:33 -07001686}
1687
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001688CFX_ByteString CPDFSDK_Widget::GetBorderAppStream() const {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001689 CFX_FloatRect rcWindow = GetRotatedRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001690 CPWL_Color crBorder = GetBorderPWLColor();
1691 CPWL_Color crBackground = GetFillPWLColor();
1692 CPWL_Color crLeftTop, crRightBottom;
1693
1694 FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001695 CPWL_Dash dsBorder(3, 0, 0);
1696
dsinclair92cb5e52016-05-16 11:38:28 -07001697 BorderStyle nBorderStyle = GetBorderStyle();
1698 switch (nBorderStyle) {
1699 case BorderStyle::DASH:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001700 dsBorder = CPWL_Dash(3, 3, 0);
1701 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001702 case BorderStyle::BEVELED:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001703 fBorderWidth *= 2;
1704 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 1);
Dan Sinclairfc54e052017-02-23 09:59:05 -05001705 crRightBottom = crBackground / 2.0f;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001706 break;
dsinclair92cb5e52016-05-16 11:38:28 -07001707 case BorderStyle::INSET:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001708 fBorderWidth *= 2;
1709 crLeftTop = CPWL_Color(COLORTYPE_GRAY, 0.5);
1710 crRightBottom = CPWL_Color(COLORTYPE_GRAY, 0.75);
1711 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001712 default:
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001713 break;
1714 }
1715
1716 return CPWL_Utils::GetBorderAppStream(rcWindow, fBorderWidth, crBorder,
1717 crLeftTop, crRightBottom, nBorderStyle,
1718 dsBorder);
Bo Xufdc00a72014-10-28 23:03:33 -07001719}
1720
Tom Sepez60d909e2015-12-10 15:34:55 -08001721CFX_Matrix CPDFSDK_Widget::GetMatrix() const {
1722 CFX_Matrix mt;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001723 CPDF_FormControl* pControl = GetFormControl();
Tom Sepez281a9ea2016-02-26 14:24:28 -08001724 CFX_FloatRect rcAnnot = GetRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001725 FX_FLOAT fWidth = rcAnnot.right - rcAnnot.left;
1726 FX_FLOAT fHeight = rcAnnot.top - rcAnnot.bottom;
1727
1728 switch (abs(pControl->GetRotation() % 360)) {
1729 case 0:
1730 default:
Tom Sepez60d909e2015-12-10 15:34:55 -08001731 mt = CFX_Matrix(1, 0, 0, 1, 0, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001732 break;
1733 case 90:
Tom Sepez60d909e2015-12-10 15:34:55 -08001734 mt = CFX_Matrix(0, 1, -1, 0, fWidth, 0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001735 break;
1736 case 180:
Tom Sepez60d909e2015-12-10 15:34:55 -08001737 mt = CFX_Matrix(-1, 0, 0, -1, fWidth, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001738 break;
1739 case 270:
Tom Sepez60d909e2015-12-10 15:34:55 -08001740 mt = CFX_Matrix(0, -1, 1, 0, 0, fHeight);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001741 break;
1742 }
1743
1744 return mt;
Bo Xufdc00a72014-10-28 23:03:33 -07001745}
1746
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001747CPWL_Color CPDFSDK_Widget::GetTextPWLColor() const {
1748 CPWL_Color crText = CPWL_Color(COLORTYPE_GRAY, 0);
1749
1750 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001751 CPDF_DefaultAppearance da = pFormCtrl->GetDefaultAppearance();
1752 if (da.HasColor()) {
1753 int32_t iColorType;
1754 FX_FLOAT fc[4];
1755 da.GetColor(iColorType, fc);
1756 crText = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1757 }
1758
1759 return crText;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001760}
1761
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001762CPWL_Color CPDFSDK_Widget::GetBorderPWLColor() const {
1763 CPWL_Color crBorder;
1764
1765 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001766 int32_t iColorType;
1767 FX_FLOAT fc[4];
1768 pFormCtrl->GetOriginalBorderColor(iColorType, fc);
1769 if (iColorType > 0)
1770 crBorder = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1771
1772 return crBorder;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001773}
1774
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001775CPWL_Color CPDFSDK_Widget::GetFillPWLColor() const {
1776 CPWL_Color crFill;
1777
1778 CPDF_FormControl* pFormCtrl = GetFormControl();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001779 int32_t iColorType;
1780 FX_FLOAT fc[4];
1781 pFormCtrl->GetOriginalBackgroundColor(iColorType, fc);
1782 if (iColorType > 0)
1783 crFill = CPWL_Color(iColorType, fc[0], fc[1], fc[2], fc[3]);
1784
1785 return crFill;
Bo Xufdc00a72014-10-28 23:03:33 -07001786}
1787
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001788void CPDFSDK_Widget::AddImageToAppearance(const CFX_ByteString& sAPType,
1789 CPDF_Stream* pImage) {
dsinclair38fd8442016-09-15 10:15:32 -07001790 CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP");
1791 CPDF_Stream* pStream = pAPDict->GetStreamFor(sAPType);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001792 CPDF_Dictionary* pStreamDict = pStream->GetDict();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001793 CFX_ByteString sImageAlias = "IMG";
1794
1795 if (CPDF_Dictionary* pImageDict = pImage->GetDict()) {
dsinclair38fd8442016-09-15 10:15:32 -07001796 sImageAlias = pImageDict->GetStringFor("Name");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001797 if (sImageAlias.IsEmpty())
1798 sImageAlias = "IMG";
1799 }
1800
tsepez698c5712016-09-28 16:47:07 -07001801 CPDF_Document* pDoc = m_pPageView->GetPDFDocument();
dsinclair38fd8442016-09-15 10:15:32 -07001802 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
tsepez0e606b52016-11-18 16:22:41 -08001803 if (!pStreamResList)
1804 pStreamResList = pStreamDict->SetNewFor<CPDF_Dictionary>("Resources");
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001805
tsepez0e606b52016-11-18 16:22:41 -08001806 CPDF_Dictionary* pXObject =
1807 pStreamResList->SetNewFor<CPDF_Dictionary>("XObject");
1808 pXObject->SetNewFor<CPDF_Reference>(sImageAlias, pDoc, pImage->GetObjNum());
Bo Xufdc00a72014-10-28 23:03:33 -07001809}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001810
1811void CPDFSDK_Widget::RemoveAppearance(const CFX_ByteString& sAPType) {
dsinclair38fd8442016-09-15 10:15:32 -07001812 if (CPDF_Dictionary* pAPDict = m_pAnnot->GetAnnotDict()->GetDictFor("AP"))
1813 pAPDict->RemoveFor(sAPType);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001814}
1815
tsepez4cf55152016-11-02 14:37:54 -07001816bool CPDFSDK_Widget::OnAAction(CPDF_AAction::AActionType type,
1817 PDFSDK_FieldAction& data,
1818 CPDFSDK_PageView* pPageView) {
dsinclairb402b172016-10-11 09:26:32 -07001819 CPDFSDK_FormFillEnvironment* pFormFillEnv = pPageView->GetFormFillEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001820
Tom Sepez40e9ff32015-11-30 12:39:54 -08001821#ifdef PDF_ENABLE_XFA
dsinclair521b7502016-11-02 13:02:28 -07001822 CPDFXFA_Context* pContext = pFormFillEnv->GetXFAContext();
dsinclairdf4bc592016-03-31 20:34:43 -07001823 if (CXFA_FFWidget* hWidget = GetMixXFAWidget()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001824 XFA_EVENTTYPE eEventType = GetXFAEventType(type, data.bWillCommit);
1825
1826 if (eEventType != XFA_EVENT_Unknown) {
dsinclairdf4bc592016-03-31 20:34:43 -07001827 if (CXFA_FFWidgetHandler* pXFAWidgetHandler = GetXFAWidgetHandler()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001828 CXFA_EventParam param;
1829 param.m_eType = eEventType;
1830 param.m_wsChange = data.sChange;
1831 param.m_iCommitKey = data.nCommitKey;
1832 param.m_bShift = data.bShift;
1833 param.m_iSelStart = data.nSelStart;
1834 param.m_iSelEnd = data.nSelEnd;
1835 param.m_wsFullText = data.sValue;
1836 param.m_bKeyDown = data.bKeyDown;
1837 param.m_bModifier = data.bModifier;
1838 param.m_wsNewText = data.sValue;
1839 if (data.nSelEnd > data.nSelStart)
1840 param.m_wsNewText.Delete(data.nSelStart,
1841 data.nSelEnd - data.nSelStart);
1842 for (int i = data.sChange.GetLength() - 1; i >= 0; i--)
1843 param.m_wsNewText.Insert(data.nSelStart, data.sChange[i]);
1844 param.m_wsPrevText = data.sValue;
1845
dsinclair221caf62016-04-04 12:08:40 -07001846 CXFA_WidgetAcc* pAcc = hWidget->GetDataAcc();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001847 param.m_pTarget = pAcc;
1848 int32_t nRet = pXFAWidgetHandler->ProcessEvent(pAcc, &param);
1849
dsinclair521b7502016-11-02 13:02:28 -07001850 if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001851 pDocView->UpdateDocView();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001852
Wei Lie98ac2e2016-03-18 15:43:04 -07001853 if (nRet == XFA_EVENTERROR_Success)
tsepez4cf55152016-11-02 14:37:54 -07001854 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001855 }
1856 }
1857 }
Tom Sepez40e9ff32015-11-30 12:39:54 -08001858#endif // PDF_ENABLE_XFA
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001859
1860 CPDF_Action action = GetAAction(type);
Wei Li0fc6b252016-03-01 16:29:41 -08001861 if (action.GetDict() && action.GetType() != CPDF_Action::Unknown) {
dsinclairb402b172016-10-11 09:26:32 -07001862 CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHander();
dsinclair19c198b2016-10-11 12:51:37 -07001863 return pActionHandler->DoAction_Field(action, type, pFormFillEnv,
1864 GetFormField(), data);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001865 }
tsepez4cf55152016-11-02 14:37:54 -07001866 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001867}
1868
1869CPDF_Action CPDFSDK_Widget::GetAAction(CPDF_AAction::AActionType eAAT) {
1870 switch (eAAT) {
1871 case CPDF_AAction::CursorEnter:
1872 case CPDF_AAction::CursorExit:
1873 case CPDF_AAction::ButtonDown:
1874 case CPDF_AAction::ButtonUp:
1875 case CPDF_AAction::GetFocus:
1876 case CPDF_AAction::LoseFocus:
1877 case CPDF_AAction::PageOpen:
1878 case CPDF_AAction::PageClose:
1879 case CPDF_AAction::PageVisible:
1880 case CPDF_AAction::PageInvisible:
1881 return CPDFSDK_BAAnnot::GetAAction(eAAT);
1882
1883 case CPDF_AAction::KeyStroke:
1884 case CPDF_AAction::Format:
1885 case CPDF_AAction::Validate:
1886 case CPDF_AAction::Calculate: {
1887 CPDF_FormField* pField = GetFormField();
Wei Li0fc6b252016-03-01 16:29:41 -08001888 if (pField->GetAdditionalAction().GetDict())
1889 return pField->GetAdditionalAction().GetAction(eAAT);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001890 return CPDFSDK_BAAnnot::GetAAction(eAAT);
1891 }
1892 default:
1893 break;
1894 }
1895
1896 return CPDF_Action();
1897}
1898
1899CFX_WideString CPDFSDK_Widget::GetAlternateName() const {
1900 CPDF_FormField* pFormField = GetFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001901 return pFormField->GetAlternateName();
1902}
1903
1904int32_t CPDFSDK_Widget::GetAppearanceAge() const {
1905 return m_nAppAge;
1906}
1907
1908int32_t CPDFSDK_Widget::GetValueAge() const {
1909 return m_nValueAge;
1910}