1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#include "../../include/formfiller/FormFiller.h"
8#include "../../include/formfiller/FFL_FormFiller.h"
9#include "../../include/formfiller/FFL_IFormFiller.h"
10#include "../../include/formfiller/FFL_CBA_Fontmap.h"
11#include "../../include/formfiller/FFL_ComboBox.h"
12
13
14/* ------------------------------- CFFL_ComboBox ------------------------------- */
15
16CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
17	CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
18{
19	//m_pFontMap = new CBA_FontMap( pAnnot, GetSystemHandler() );
20        m_State.nIndex = 0;
21        m_State.nStart = 0;
22        m_State.nEnd   = 0;
23}
24
25CFFL_ComboBox::~CFFL_ComboBox()
26{
27	if (m_pFontMap)
28	{
29		delete m_pFontMap;
30		m_pFontMap = NULL;
31	}
32
33// 	for (int i=0,sz=m_IMBox.GetSize(); i<sz; i++)
34// 	{
35// 		delete m_IMBox.GetAt(i);
36// 	}
37//
38// 	m_IMBox.RemoveAll();
39}
40
41PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()
42{
43	PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
44
45	ASSERT(m_pWidget != NULL);
46
47	int nFlags = m_pWidget->GetFieldFlags();
48
49	if (nFlags & FIELDFLAG_EDIT)
50	{
51		cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
52	}
53
54	/*
55	if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
56	{
57		m_bCommitOnSelectChange = TRUE;
58	}
59	*/
60
61	if (!m_pFontMap)
62	{
63		ASSERT(this->m_pApp != NULL);
64		m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
65		m_pFontMap->Initial();
66	}
67
68	cp.pFontMap = m_pFontMap;
69	cp.pFocusHandler = this;
70
71	return cp;
72}
73
74CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
75{
76	CPWL_ComboBox * pWnd = new CPWL_ComboBox();
77	pWnd->AttachFFLData(this);
78	pWnd->Create(cp);
79
80	ASSERT(m_pApp != NULL);
81	CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
82	pWnd->SetFillerNotify(pFormFiller);
83
84	ASSERT(m_pWidget != NULL);
85	FX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);
86
87	CFX_WideString swText;
88
89	if (nCurSel < 0)
90		swText = m_pWidget->GetValue();
91	else
92		swText = m_pWidget->GetOptionLabel(nCurSel);
93
94	for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
95	{
96		pWnd->AddString(m_pWidget->GetOptionLabel(i));
97	}
98
99	pWnd->SetSelect(nCurSel);
100	pWnd->SetText(swText);
101
102	return pWnd;
103}
104
105
106FX_BOOL	CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
107{
108	return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
109}
110
111FX_BOOL	CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)
112{
113	if (CPWL_ComboBox * pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
114	{
115		FX_INT32 nCurSel = pWnd->GetSelect();
116
117		ASSERT(m_pWidget != NULL);
118
119		if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
120		{
121			if (nCurSel >= 0)
122			{
123				return nCurSel != m_pWidget->GetSelectedIndex(0);
124			}
125			else
126			{
127				return pWnd->GetText() != m_pWidget->GetValue();
128			}
129		}
130		else
131		{
132			return nCurSel != m_pWidget->GetSelectedIndex(0);
133		}
134	}
135
136	return FALSE;
137}
138
139void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)
140{
141	ASSERT(m_pWidget != NULL);
142
143	if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
144	{
145		CFX_WideString swText = pWnd->GetText();
146		FX_INT32 nCurSel = pWnd->GetSelect();
147
148		//mantis:0004157
149		FX_BOOL bSetValue = TRUE;
150
151		if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
152		{
153			if (nCurSel >= 0)
154			{
155				if (swText != m_pWidget->GetOptionLabel(nCurSel))
156					bSetValue = TRUE;
157				else
158					bSetValue = FALSE;
159			}
160			else
161				bSetValue = TRUE;
162		}
163		else
164			bSetValue = FALSE;
165
166		CFX_WideString sOldValue;
167
168
169		if (bSetValue)
170		{
171			sOldValue = m_pWidget->GetValue();
172			m_pWidget->SetValue(swText, FALSE);
173		}
174		else
175		{
176			m_pWidget->GetSelectedIndex(0);
177			m_pWidget->SetOptionSelection(nCurSel, TRUE, FALSE);
178		}
179
180		m_pWidget->ResetFieldAppearance(TRUE);
181		m_pWidget->UpdateField();
182		SetChangeMark();
183
184		m_pWidget->GetPDFPage();
185
186
187	}
188}
189
190 void CFFL_ComboBox::GetActionData( CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa)
191{
192	switch (type)
193	{
194	case CPDF_AAction::KeyStroke:
195		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
196		{
197			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
198			{
199				fa.bFieldFull = pEdit->IsTextFull();
200				int nSelStart = 0;
201				int nSelEnd = 0;
202				pEdit->GetSel(nSelStart, nSelEnd);
203				fa.nSelEnd = nSelEnd;
204				fa.nSelStart = nSelStart;
205				fa.sValue = pEdit->GetText();
206				fa.sChangeEx = GetSelectExportText();
207
208				if (fa.bFieldFull)
209				{
210					fa.sChange = L"";
211					fa.sChangeEx = L"";
212				}
213			}
214		}
215		break;
216	case CPDF_AAction::Validate:
217		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
218		{
219			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
220			{
221				fa.sValue = pEdit->GetText();
222			}
223		}
224		break;
225	case CPDF_AAction::LoseFocus:
226	case CPDF_AAction::GetFocus:
227		ASSERT(m_pWidget != NULL);
228		fa.sValue = m_pWidget->GetValue();
229		break;
230	default:
231		break;
232	}
233}
234
235
236
237void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
238									const PDFSDK_FieldAction& fa)
239{
240	switch (type)
241	{
242	case CPDF_AAction::KeyStroke:
243		if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
244		{
245			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
246			{
247				pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
248				pEdit->ReplaceSel(fa.sChange);
249			}
250		}
251		break;
252	default:
253		break;
254	}
255}
256
257FX_BOOL	CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
258									const PDFSDK_FieldAction& faNew)
259{
260	switch (type)
261	{
262	case CPDF_AAction::KeyStroke:
263		return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
264			faOld.sChange != faNew.sChange;
265	default:
266		break;
267	}
268
269	return FALSE;
270}
271
272void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView)
273{
274	ASSERT(pPageView != NULL);
275
276	if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
277	{
278		m_State.nIndex = pComboBox->GetSelect();
279
280		if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
281		{
282			pEdit->GetSel(m_State.nStart, m_State.nEnd);
283			m_State.sValue = pEdit->GetText();
284		}
285	}
286}
287
288void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)
289{
290	ASSERT(pPageView != NULL);
291
292	if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, TRUE))
293	{
294		if (m_State.nIndex >= 0)
295			pComboBox->SetSelect(m_State.nIndex);
296		else
297		{
298			if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
299			{
300				pEdit->SetText(m_State.sValue);
301				pEdit->SetSel(m_State.nStart, m_State.nEnd);
302			}
303		}
304	}
305}
306
307CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
308{
309	if (bRestoreValue)
310		SaveState(pPageView);
311
312	DestroyPDFWindow(pPageView);
313
314	CPWL_Wnd* pRet = NULL;
315
316	if (bRestoreValue)
317	{
318		RestoreState(pPageView);
319		pRet = this->GetPDFWindow(pPageView, FALSE);
320	}
321	else
322		pRet = this->GetPDFWindow(pPageView, TRUE);
323
324	m_pWidget->UpdateField();
325
326	return pRet;
327}
328
329void CFFL_ComboBox::OnKeyStroke(FX_BOOL bKeyDown, FX_UINT nFlag)
330{
331	ASSERT(m_pWidget != NULL);
332
333	int nFlags = m_pWidget->GetFieldFlags();
334
335	if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
336	{
337		if (m_bValid)
338		{
339			CPDFSDK_PageView* pPageView = this->GetCurPageView();
340			ASSERT(pPageView != NULL);
341
342			if (CommitData(pPageView, nFlag))
343			{
344				DestroyPDFWindow(pPageView);
345				m_bValid = FALSE;
346			}
347		}
348	}
349}
350
351void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)
352{
353	ASSERT(m_pApp != NULL);
354
355	ASSERT(pWnd != NULL);
356
357	if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
358	{
359		CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
360		pEdit->SetCharSet(134);
361		pEdit->SetCodePage(936);
362
363		pEdit->SetReadyToInput();
364		CFX_WideString wsText = pEdit->GetText();
365		int nCharacters = wsText.GetLength();
366		CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
367		unsigned short* pBuffer = (unsigned short*)(FX_LPCSTR)bsUTFText;
368		m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, TRUE);
369
370 		pEdit->SetEditNotify(this);
371	}
372}
373
374void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)
375{
376	ASSERT(m_pApp != NULL);
377}
378
379FX_BOOL	CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
380{
381	ASSERT(pDocument != NULL);
382
383	return FALSE;
384}
385
386FX_BOOL CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)
387{
388	ASSERT(pDocument != NULL);
389
390	return FALSE;
391}
392
393FX_BOOL	CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
394{
395	ASSERT(pDocument != NULL);
396
397	return FALSE;
398}
399
400void CFFL_ComboBox::DoCopy(CPDFSDK_Document* pDocument)
401{
402	ASSERT(pDocument != NULL);
403}
404
405void CFFL_ComboBox::DoCut(CPDFSDK_Document* pDocument)
406{
407	ASSERT(pDocument != NULL);
408}
409
410void CFFL_ComboBox::DoPaste(CPDFSDK_Document* pDocument)
411{
412	ASSERT(pDocument != NULL);
413}
414
415void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)
416{
417	ASSERT(pEdit != NULL);
418}
419
420CFX_WideString CFFL_ComboBox::GetSelectExportText()
421{
422	CFX_WideString swRet;
423
424	int nExport = -1;
425	CPDFSDK_PageView *pPageView = GetCurPageView();
426	if (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, FALSE))
427	{
428		nExport = pComboBox->GetSelect();
429	}
430
431	if (nExport >= 0)
432	{
433		if (CPDF_FormField * pFormField = m_pWidget->GetFormField())
434		{
435			swRet = pFormField->GetOptionValue(nExport);
436			if (swRet.IsEmpty())
437				swRet = pFormField->GetOptionLabel(nExport);
438		}
439	}
440
441	return swRet;
442}
443