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