• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_ListBox.h"
10 //#include "../../include/formfiller/FFL_Module.h"
11 #include "../../include/formfiller/FFL_IFormFiller.h"
12 //#include "../../include/formfiller/FFL_Undo.h"
13 #include "../../include/formfiller/FFL_CBA_Fontmap.h"
14 
15 
16 #define	FFL_DEFAULTLISTBOXFONTSIZE		12.0f
17 
18 
19 /* ------------------------------- CFFL_ListBox ------------------------------- */
20 
CFFL_ListBox(CPDFDoc_Environment * pApp,CPDFSDK_Annot * pWidget)21 CFFL_ListBox::CFFL_ListBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pWidget) :
22 	CFFL_FormFiller(pApp, pWidget),
23 	m_pFontMap(NULL)
24 {
25 }
26 
~CFFL_ListBox()27 CFFL_ListBox::~CFFL_ListBox()
28 {
29 	if (m_pFontMap)
30 	{
31 		delete m_pFontMap;
32 		m_pFontMap = NULL;
33 	}
34 }
35 
GetCreateParam()36 PWL_CREATEPARAM	CFFL_ListBox::GetCreateParam()
37 {
38 	PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();
39 
40 	ASSERT(m_pWidget != NULL);
41 	FX_DWORD dwFieldFlag = m_pWidget->GetFieldFlags();
42 
43 	if (dwFieldFlag & FIELDFLAG_MULTISELECT)
44 	{
45 		cp.dwFlags |= PLBS_MULTIPLESEL;
46 	}
47 
48 	if (dwFieldFlag & FIELDFLAG_COMMITONSELCHANGE)
49 	{
50 		//cp.dwFlags |= PLBS_COMMITSELECTEDVALUE;
51 	}
52 
53 	cp.dwFlags |= PWS_VSCROLL;
54 
55 	if (cp.dwFlags & PWS_AUTOFONTSIZE)
56 		cp.fFontSize = FFL_DEFAULTLISTBOXFONTSIZE;
57 
58 	if (!m_pFontMap)
59 	{
60 		ASSERT(this->m_pApp != NULL);
61 		m_pFontMap = new CBA_FontMap(m_pWidget,m_pApp->GetSysHandler());//, ISystemHandle::GetSystemHandler(m_pApp));
62 		m_pFontMap->Initial();
63 	}
64 	cp.pFontMap = m_pFontMap;
65 
66 	return cp;
67 }
68 
NewPDFWindow(const PWL_CREATEPARAM & cp,CPDFSDK_PageView * pPageView)69 CPWL_Wnd* CFFL_ListBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
70 {
71 	CPWL_ListBox* pWnd = new CPWL_ListBox();
72 	pWnd->AttachFFLData(this);
73 	pWnd->Create(cp);
74 
75 	ASSERT(m_pApp != NULL);
76 	CFFL_IFormFiller* pIFormFiller = m_pApp->GetIFormFiller();
77 	pWnd->SetFillerNotify(pIFormFiller);
78 
79 	ASSERT(m_pWidget != NULL);
80 
81 	for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
82 		pWnd->AddString(m_pWidget->GetOptionLabel(i));
83 
84 	if (pWnd->HasFlag(PLBS_MULTIPLESEL))
85 	{
86 		m_OriginSelections.RemoveAll();
87 
88 		FX_BOOL bSetCaret = FALSE;
89 		for (FX_INT32 i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
90 		{
91 			if (m_pWidget->IsOptionSelected(i))
92 			{
93 				if (!bSetCaret)
94 				{
95 					pWnd->SetCaret(i);
96 					bSetCaret = TRUE;
97 				}
98 				pWnd->Select(i);
99 				m_OriginSelections.SetAt(i, NULL);
100 			}
101 		}
102 	}
103 	else
104 	{
105 		for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
106 		{
107 			if (m_pWidget->IsOptionSelected(i))
108 			{
109 				pWnd->Select(i);
110 				break;
111 			}
112 		}
113 	}
114 
115 	pWnd->SetTopVisibleIndex(m_pWidget->GetTopVisibleIndex());
116 
117 	return pWnd;
118 }
119 
120 
OnChar(CPDFSDK_Annot * pAnnot,FX_UINT nChar,FX_UINT nFlags)121 FX_BOOL	CFFL_ListBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
122 {
123 	return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
124 }
125 
IsDataChanged(CPDFSDK_PageView * pPageView)126 FX_BOOL	CFFL_ListBox::IsDataChanged(CPDFSDK_PageView* pPageView)
127 {
128 	ASSERT(m_pWidget != NULL);
129 
130 	if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
131 	{
132 		if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
133 		{
134 			int nSelCount = 0;
135 			for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
136 			{
137 				if (pListBox->IsItemSelected(i))
138 				{
139 					void* p = NULL;
140 					if (!m_OriginSelections.Lookup(i, p))
141 						return TRUE;
142 
143 					nSelCount++;
144 				}
145 			}
146 
147 			return nSelCount != m_OriginSelections.GetCount();
148 		}
149 		else
150 		{
151 			return pListBox->GetCurSel() != m_pWidget->GetSelectedIndex(0);
152 		}
153 	}
154 
155 	return FALSE;
156 }
157 
SaveData(CPDFSDK_PageView * pPageView)158 void CFFL_ListBox::SaveData(CPDFSDK_PageView* pPageView)
159 {
160 	ASSERT(m_pWidget != NULL);
161 
162 	if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
163 	{
164 		CFX_IntArray aOldSelect, aNewSelect;
165 
166 		{
167 			for (int i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
168 			{
169 				if (m_pWidget->IsOptionSelected(i))
170 				{
171 					aOldSelect.Add(i);
172 				}
173 			}
174 		}
175 
176 
177 		FX_INT32 nNewTopIndex = pListBox->GetTopVisibleIndex();
178 
179 		m_pWidget->ClearSelection(FALSE);
180 
181 		if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
182 		{
183 			for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
184 			{
185 				if (pListBox->IsItemSelected(i))
186 				{
187 					m_pWidget->SetOptionSelection(i, TRUE, FALSE);
188 					aNewSelect.Add(i);
189 				}
190 			}
191 		}
192 		else
193 		{
194 			m_pWidget->SetOptionSelection(pListBox->GetCurSel(), TRUE, FALSE);
195 			aNewSelect.Add(pListBox->GetCurSel());
196 		}
197 
198 		m_pWidget->SetTopVisibleIndex(nNewTopIndex);
199 		m_pWidget->ResetFieldAppearance(TRUE);
200 		m_pWidget->UpdateField();
201 		SetChangeMark();
202 	}
203 }
204 
GetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,PDFSDK_FieldAction & fa)205 void CFFL_ListBox::GetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
206 						PDFSDK_FieldAction& fa)
207 {
208 	switch (type)
209 	{
210 	case CPDF_AAction::Validate:
211 		if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
212 		{
213 			fa.sValue = L"";
214 		}
215 		else
216 		{
217 			if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
218 			{
219 				ASSERT(m_pWidget != NULL);
220 				FX_INT32 nCurSel = pListBox->GetCurSel();
221 				if (nCurSel >= 0)
222 					fa.sValue = m_pWidget->GetOptionLabel(nCurSel);
223 			}
224 		}
225 		break;
226 	case CPDF_AAction::LoseFocus:
227 	case CPDF_AAction::GetFocus:
228 		if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT)
229 		{
230 			fa.sValue = L"";
231 		}
232 		else
233 		{
234 			ASSERT(m_pWidget != NULL);
235 			FX_INT32 nCurSel = m_pWidget->GetSelectedIndex(0);
236 			if (nCurSel >= 0)
237 				fa.sValue = m_pWidget->GetOptionLabel(nCurSel);
238 		}
239 		break;
240 	default:
241 		break;
242 	}
243 }
244 
245 
SetActionData(CPDFSDK_PageView * pPageView,CPDF_AAction::AActionType type,const PDFSDK_FieldAction & fa)246 void CFFL_ListBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
247 								const PDFSDK_FieldAction& fa)
248 {
249 }
250 
SaveState(CPDFSDK_PageView * pPageView)251 void CFFL_ListBox::SaveState(CPDFSDK_PageView* pPageView)
252 {
253 	ASSERT(pPageView != NULL);
254 
255 	if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
256 	{
257 		for (FX_INT32 i=0,sz=pListBox->GetCount(); i<sz; i++)
258 		{
259 			if (pListBox->IsItemSelected(i))
260 			{
261 				m_State.Add(i);
262 			}
263 		}
264 	}
265 }
266 
RestoreState(CPDFSDK_PageView * pPageView)267 void CFFL_ListBox::RestoreState(CPDFSDK_PageView* pPageView)
268 {
269 	if (CPWL_ListBox* pListBox = (CPWL_ListBox*)GetPDFWindow(pPageView, FALSE))
270 	{
271 		for (int i=0,sz=m_State.GetSize(); i<sz; i++)
272 			pListBox->Select(m_State[i]);
273 	}
274 }
275 
ResetPDFWindow(CPDFSDK_PageView * pPageView,FX_BOOL bRestoreValue)276 CPWL_Wnd* CFFL_ListBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, FX_BOOL bRestoreValue)
277 {
278 	if (bRestoreValue)
279 		SaveState(pPageView);
280 
281 	DestroyPDFWindow(pPageView);
282 
283 	CPWL_Wnd* pRet = NULL;
284 
285 	if (bRestoreValue)
286 	{
287 		RestoreState(pPageView);
288 		pRet = this->GetPDFWindow(pPageView, FALSE);
289 	}
290 	else
291 		pRet = this->GetPDFWindow(pPageView, TRUE);
292 
293 	m_pWidget->UpdateField();
294 
295 	return pRet;
296 }
297 
OnKeyStroke(FX_BOOL bKeyDown,FX_DWORD nFlag)298 void CFFL_ListBox::OnKeyStroke(FX_BOOL bKeyDown, FX_DWORD nFlag)
299 {
300 	ASSERT(m_pWidget != NULL);
301 
302 	int nFlags = m_pWidget->GetFieldFlags();
303 
304 	if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
305 	{
306 		if (m_bValid)
307 		{
308 			CPDFSDK_PageView* pPageView = this->GetCurPageView();
309 			ASSERT(pPageView != NULL);
310 
311 			if (CommitData(pPageView, nFlag))
312 			{
313 				DestroyPDFWindow(pPageView);
314 				m_bValid = FALSE;
315 			}
316 		}
317 	}
318 }
319 
320