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/pdfwindow/PDFWindow.h"
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_Wnd.h"
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_ListBox.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_Utils.h"
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_ScrollBar.h"
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_EditCtrl.h"
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/pdfwindow/PWL_Edit.h"
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IsFloatZero(f)						((f) < 0.0001 && (f) > -0.0001)
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IsFloatBigger(fa,fb)				((fa) > (fb) && !IsFloatZero((fa) - (fb)))
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IsFloatSmaller(fa,fb)				((fa) < (fb) && !IsFloatZero((fa) - (fb)))
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define IsFloatEqual(fa,fb)					IsFloatZero((fa)-(fb))
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ------------------------ CPWL_List_Notify ----------------------- */
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_List_Notify::CPWL_List_Notify(CPWL_ListBox* pList) : m_pList(pList)
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(m_pList != NULL);
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_List_Notify::~CPWL_List_Notify()
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_List_Notify::IOnSetScrollInfoY(FX_FLOAT fPlateMin, FX_FLOAT fPlateMax,
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov												FX_FLOAT fContentMin, FX_FLOAT fContentMax,
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov												FX_FLOAT fSmallStep, FX_FLOAT fBigStep)
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	PWL_SCROLL_INFO Info;
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Info.fPlateWidth = fPlateMax - fPlateMin;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Info.fContentMin = fContentMin;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Info.fContentMax = fContentMax;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Info.fSmallStep = fSmallStep;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	Info.fBigStep = fBigStep;
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pList->OnNotify(m_pList,PNM_SETSCROLLINFO,SBT_VSCROLL,(FX_INTPTR)&Info);
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (CPWL_ScrollBar * pScroll = m_pList->GetVScrollBar())
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (IsFloatBigger(Info.fPlateWidth,Info.fContentMax-Info.fContentMin)
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			|| IsFloatEqual(Info.fPlateWidth,Info.fContentMax-Info.fContentMin))
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (pScroll->IsVisible())
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pScroll->SetVisible(FALSE);
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				m_pList->RePosChildWnd();
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		else
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (!pScroll->IsVisible())
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pScroll->SetVisible(TRUE);
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				m_pList->RePosChildWnd();
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_List_Notify::IOnSetScrollPosY(FX_FLOAT fy)
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pList->OnNotify(m_pList,PNM_SETSCROLLPOS,SBT_VSCROLL,(FX_INTPTR)&fy);
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_List_Notify::IOnInvalidateRect(CPDF_Rect * pRect)
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pList->InvalidateRect(pRect);
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* --------------------------- CPWL_ListBox ---------------------------- */
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_ListBox::CPWL_ListBox() :
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pList(NULL),
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pListNotify(NULL),
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_bMouseDown(FALSE),
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_bHoverSel(FALSE),
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pFillerNotify(NULL)
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_pList = IFX_List::NewList();
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	ASSERT(m_pList != NULL);
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPWL_ListBox::~CPWL_ListBox()
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	IFX_List::DelList(m_pList);
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pListNotify)
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete m_pListNotify;
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pListNotify = NULL;
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_ByteString CPWL_ListBox::GetClassName() const
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return "CPWL_ListBox";
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::OnCreated()
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pListNotify) delete m_pListNotify;
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetFontMap(GetFontMap());
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetNotify(m_pListNotify = new CPWL_List_Notify(this));
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetHoverSel(HasFlag(PLBS_HOVERSEL));
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL));
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetFontSize(this->GetCreationParam().fFontSize);
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_bHoverSel = HasFlag(PLBS_HOVERSEL);
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::OnDestroy()
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pListNotify)
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		delete m_pListNotify;
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pListNotify = NULL;
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream)
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::GetThisAppearanceStream(sAppStream);
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CFX_ByteTextBuf sListItems;
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcPlate = m_pList->GetPlateRect();
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_Rect rcItem = m_pList->GetItemRect(i);
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (m_pList->IsItemSelected(i))
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				sListItems << CPWL_Utils::GetRectFillAppStream(rcItem,PWL_DEFAULT_SELBACKCOLOR);
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (sItem.GetLength() > 0)
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) << sItem << "ET\n";
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CFX_ByteString sItem = CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (sItem.GetLength() > 0)
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					sListItems << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()) << sItem << "ET\n";
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (sListItems.GetLength() > 0)
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_ByteTextBuf sClip;
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcClient = this->GetClientRect();
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sClip << "q\n";
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sClip << rcClient.left << " " << rcClient.bottom << " "
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			<< rcClient.right - rcClient.left << " " <<	rcClient.top - rcClient.bottom << " re W n\n";
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sClip << sListItems << "Q\n";
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		sAppStream << "/Tx BMC\n" << sClip << "EMC\n";
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device)
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device);
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcPlate = m_pList->GetPlateRect();
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcList = GetListRect();
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcClient = GetClientRect();
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for (FX_INT32 i=0,sz=m_pList->GetCount(); i<sz; i++)
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_Rect rcItem = m_pList->GetItemRect(i);
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) continue;
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			CPDF_Point ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f);
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (IFX_Edit* pEdit = m_pList->GetItemEdit(i))
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				CPDF_Rect rcContent = pEdit->GetContentRect();
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (rcContent.Width() > rcClient.Width())
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					rcItem.Intersect(rcList);
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				else
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					rcItem.Intersect(rcClient);
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (m_pList->IsItemSelected(i))
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			//	CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				IFX_SystemHandler* pSysHandler = GetSystemHandler();
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if(pSysHandler && pSysHandler->IsSelectionImplemented())
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), CPWL_Utils::PWLColorToFXColor(GetTextColor()), CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						rcList, ptOffset, NULL,pSysHandler, m_pFormFiller);
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem);
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				else
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				{
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, ArgbEncode(255,0,51,113));
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), ArgbEncode(255,255,255,255), 0,
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						rcList, ptOffset, NULL, pSysHandler, m_pFormFiller);
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				}
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			else
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				IFX_SystemHandler* pSysHandler = GetSystemHandler();
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				IFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i),
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						CPWL_Utils::PWLColorToFXColor(GetTextColor()),
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()),
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov						rcList, ptOffset, NULL,pSysHandler, NULL);
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::OnKeyDown(FX_WORD nChar, FX_DWORD nFlag)
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnKeyDown(nChar, nFlag);
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!m_pList) return FALSE;
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (nChar)
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	default:
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return FALSE;
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Up:
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Down:
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Home:
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Left:
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_End:
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Right:
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (nChar)
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Up:
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Down:
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Home:
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_HOME(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Left:
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_LEFT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_End:
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_END(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Right:
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_RIGHT(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case FWL_VKEY_Delete:
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bExit = FALSE;
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OnNotifySelChanged(TRUE,bExit,nFlag);
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::OnChar(FX_WORD nChar, FX_DWORD nFlag)
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnChar(nChar,nFlag);
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!m_pList) return FALSE;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!m_pList->OnChar(nChar,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag))) return FALSE;
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bExit = FALSE;
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OnNotifySelChanged(TRUE,bExit, nFlag);
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag)
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnLButtonDown(point,nFlag);
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (ClientHitTest(point))
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_bMouseDown = TRUE;
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetFocus();
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		SetCapture();
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pList)
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			m_pList->OnMouseDown(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag)
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnLButtonUp(point,nFlag);
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_bMouseDown)
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		ReleaseCapture();
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_bMouseDown = FALSE;
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bExit = FALSE;
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OnNotifySelChanged(FALSE,bExit,nFlag);
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel)
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	m_bHoverSel = bHoverSel;
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag)
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnMouseMove(point, nFlag);
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point))
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pList)
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			m_pList->Select(m_pList->GetItemIndex(point));
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_bMouseDown)
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (m_pList)
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			m_pList->OnMouseMove(point,IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX_INTPTR lParam)
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam);
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_FLOAT fPos;
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	switch (msg)
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case PNM_SETSCROLLINFO:
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		switch (wParam)
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case SBT_VSCROLL:
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (CPWL_Wnd * pChild = GetVScrollBar())
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pChild->OnNotify(pWnd,PNM_SETSCROLLINFO,wParam,lParam);
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case PNM_SETSCROLLPOS:
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		switch (wParam)
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case SBT_VSCROLL:
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (CPWL_Wnd * pChild = GetVScrollBar())
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				pChild->OnNotify(pWnd,PNM_SETSCROLLPOS,wParam,lParam);
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	case PNM_SCROLLWINDOW:
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		fPos = *(FX_FLOAT*)lParam;
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		switch (wParam)
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		case SBT_VSCROLL:
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (m_pList)
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				m_pList->SetScrollPos(CPDF_Point(0,fPos));
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			break;
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		break;
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::KillFocus()
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::KillFocus();
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	/*
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (this->IsMultipleSel())
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		for(FX_INT32 i=0;i<this->GetCount();i++)
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		{
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			if (this->IsListItemSelected(i))
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			{
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				if (!IsListItemVisible(i))
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov					this->ScrollToListItem(i);
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov				break;
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			}
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		}
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (!IsListItemVisible(this->GetCurSel()))
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov			this->ScrollToListItem(this->GetCurSel());
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	SetListItemCaret(m_nCaretIndex,FALSE);
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	*/
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::RePosChildWnd()
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	CPWL_Wnd::RePosChildWnd();
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetPlateRect(GetListRect());
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, FX_BOOL & bExit,  FX_DWORD nFlag)
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pFillerNotify)
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		FX_BOOL bRC = TRUE;
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_WideString swChange = GetText();
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CFX_WideString strChangeEx;
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		int nSelStart = 0;
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		int nSelEnd = swChange.GetLength();
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pFillerNotify->OnBeforeKeyStroke(FALSE, GetAttachedData(), 0, swChange, strChangeEx, nSelStart, nSelEnd, bKeyDown, bRC, bExit, nFlag);
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		if (bExit) return;
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pFillerNotify->OnAfterKeyStroke(FALSE, GetAttachedData(), bExit,nFlag);
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Rect CPWL_ListBox::GetFocusRect() const
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList && m_pList->IsMultipleSel())
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		CPDF_Rect rcCaret = m_pList->GetItemRect(m_pList->GetCaret());
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		rcCaret.Intersect(GetClientRect());
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return rcCaret;
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return CPWL_Wnd::GetFocusRect();
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::AddString(FX_LPCWSTR string)
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->AddString(string);
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::SetText(FX_LPCWSTR csText,FX_BOOL bRefresh)
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	//return CPDF_List::SetText(csText,bRefresh);
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_WideString CPWL_ListBox::GetText() const
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetText();
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return L"";
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize)
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetFontSize(fFontSize);
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPWL_ListBox::GetFontSize() const
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetFontSize();
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0.0f;
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::Select(FX_INT32 nItemIndex)
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->Select(nItemIndex);
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::SetCaret(FX_INT32 nItemIndex)
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetCaret(nItemIndex);
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::SetTopVisibleIndex(FX_INT32 nItemIndex)
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->SetTopItem(nItemIndex);
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::ScrollToListItem(FX_INT32 nItemIndex)
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->ScrollToListItem(nItemIndex);
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::ResetContent()
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->Empty();
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPWL_ListBox::Reset()
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->Cancel();
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::IsMultipleSel() const
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->IsMultipleSel();
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_ListBox::GetCaretIndex() const
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetCaret();
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_ListBox::GetCurSel() const
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetSelect();
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPWL_ListBox::IsItemSelected(FX_INT32 nItemIndex) const
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->IsItemSelected(nItemIndex);
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return FALSE;
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_ListBox::GetTopVisibleIndex() const
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->ScrollToListItem(m_pList->GetFirstSelected());
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetTopItem();
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return -1;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_ListBox::GetCount() const
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetCount();
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0;
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPWL_ListBox::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->FindNext(nIndex,nChar);
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return nIndex;
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Rect CPWL_ListBox::GetContentRect() const
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetContentRect();
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return CPDF_Rect();
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPWL_ListBox::GetFirstHeight() const
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (m_pList)
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		return m_pList->GetFirstHeight();
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return 0.0f;
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_Rect CPWL_ListBox::GetListRect() const
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return CPWL_Utils::DeflateRect(GetWindowRect(),(FX_FLOAT)(GetBorderWidth()+GetInnerBorderWidth()));
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL	CPWL_ListBox::OnMouseWheel(short zDelta, const CPDF_Point & point, FX_DWORD nFlag)
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (!m_pList) return FALSE;
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	if (zDelta < 0)
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	else
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	{
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov		m_pList->OnVK_UP(IsSHIFTpressed(nFlag),IsCTRLpressed(nFlag));
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	}
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	FX_BOOL bExit = FALSE;
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	OnNotifySelChanged(FALSE,bExit, nFlag);
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov	return TRUE;
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
633