OLD | NEW |
| (Empty) |
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 "xfa/include/fwl/lightwidget/listbox.h" | |
8 | |
9 #include <memory> | |
10 | |
11 #include "third_party/base/stl_util.h" | |
12 | |
13 CFWL_ListBox* CFWL_ListBox::Create() { | |
14 return new CFWL_ListBox; | |
15 } | |
16 FWL_ERR CFWL_ListBox::Initialize(const CFWL_WidgetProperties* pProperties) { | |
17 if (m_pIface) | |
18 return FWL_ERR_Indefinite; | |
19 if (pProperties) { | |
20 *m_pProperties = *pProperties; | |
21 } | |
22 std::unique_ptr<IFWL_ListBox> pListBox(IFWL_ListBox::Create( | |
23 m_pProperties->MakeWidgetImpProperties(&m_ListBoxDP), nullptr)); | |
24 FWL_ERR ret = pListBox->Initialize(); | |
25 if (ret != FWL_ERR_Succeeded) { | |
26 return ret; | |
27 } | |
28 m_pIface = pListBox.release(); | |
29 CFWL_Widget::Initialize(); | |
30 return FWL_ERR_Succeeded; | |
31 } | |
32 FWL_ERR CFWL_ListBox::AddDIBitmap(CFX_DIBitmap* pDIB, FWL_HLISTITEM hItem) { | |
33 reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB = pDIB; | |
34 return FWL_ERR_Succeeded; | |
35 } | |
36 FWL_HLISTITEM CFWL_ListBox::AddString(const CFX_WideStringC& wsAdd, | |
37 FX_BOOL bSelect) { | |
38 std::unique_ptr<CFWL_ListItem> pItem(new CFWL_ListItem); | |
39 pItem->m_dwStates = 0; | |
40 pItem->m_wsText = wsAdd; | |
41 pItem->m_dwStates = bSelect ? FWL_ITEMSTATE_LTB_Selected : 0; | |
42 m_ListBoxDP.m_ItemArray.push_back(std::move(pItem)); | |
43 return (FWL_HLISTITEM)m_ListBoxDP.m_ItemArray.back().get(); | |
44 } | |
45 FX_BOOL CFWL_ListBox::DeleteString(FWL_HLISTITEM hItem) { | |
46 int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem); | |
47 if (nIndex < 0 || | |
48 static_cast<size_t>(nIndex) >= m_ListBoxDP.m_ItemArray.size()) { | |
49 return FALSE; | |
50 } | |
51 int32_t iCount = m_ListBoxDP.CountItems(m_pIface); | |
52 int32_t iSel = nIndex + 1; | |
53 if (iSel >= iCount) { | |
54 iSel = nIndex - 1; | |
55 if (iSel < 0) { | |
56 iSel = -1; | |
57 } | |
58 } | |
59 if (iSel >= 0) { | |
60 CFWL_ListItem* pSel = | |
61 reinterpret_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface, iSel)); | |
62 pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected; | |
63 } | |
64 m_ListBoxDP.m_ItemArray.erase(m_ListBoxDP.m_ItemArray.begin() + nIndex); | |
65 return TRUE; | |
66 } | |
67 void CFWL_ListBox::DeleteAll() { | |
68 m_ListBoxDP.m_ItemArray.clear(); | |
69 } | |
70 int32_t CFWL_ListBox::CountSelItems() { | |
71 if (!m_pIface) | |
72 return 0; | |
73 return static_cast<IFWL_ListBox*>(m_pIface)->CountSelItems(); | |
74 } | |
75 FWL_HLISTITEM CFWL_ListBox::GetSelItem(int32_t nIndexSel) { | |
76 if (!m_pIface) | |
77 return NULL; | |
78 return static_cast<IFWL_ListBox*>(m_pIface)->GetSelItem(nIndexSel); | |
79 } | |
80 int32_t CFWL_ListBox::GetSelIndex(int32_t nIndex) { | |
81 if (!m_pIface) | |
82 return 0; | |
83 return static_cast<IFWL_ListBox*>(m_pIface)->GetSelIndex(nIndex); | |
84 } | |
85 FWL_ERR CFWL_ListBox::SetSelItem(FWL_HLISTITEM hItem, FX_BOOL bSelect) { | |
86 if (!m_pIface) | |
87 return FWL_ERR_Indefinite; | |
88 return static_cast<IFWL_ListBox*>(m_pIface)->SetSelItem(hItem, bSelect); | |
89 } | |
90 FWL_ERR CFWL_ListBox::GetItemText(FWL_HLISTITEM hItem, CFX_WideString& wsText) { | |
91 if (!m_pIface) | |
92 return FWL_ERR_Indefinite; | |
93 return static_cast<IFWL_ListBox*>(m_pIface)->GetItemText(hItem, wsText); | |
94 } | |
95 FWL_ERR CFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) { | |
96 if (!m_pIface) | |
97 return FWL_ERR_Indefinite; | |
98 return static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fPos, bVert); | |
99 } | |
100 FWL_ERR CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) { | |
101 m_ListBoxDP.m_fItemHeight = fItemHeight; | |
102 return FWL_ERR_Succeeded; | |
103 } | |
104 FWL_HLISTITEM CFWL_ListBox::GetFocusItem() { | |
105 for (const auto& hItem : m_ListBoxDP.m_ItemArray) { | |
106 if (hItem->m_dwStates & FWL_ITEMSTATE_LTB_Focused) | |
107 return (FWL_HLISTITEM)hItem.get(); | |
108 } | |
109 return nullptr; | |
110 } | |
111 FWL_ERR CFWL_ListBox::SetFocusItem(FWL_HLISTITEM hItem) { | |
112 int32_t nIndex = m_ListBoxDP.GetItemIndex(GetWidget(), hItem); | |
113 m_ListBoxDP.m_ItemArray[nIndex]->m_dwStates |= FWL_ITEMSTATE_LTB_Focused; | |
114 return FWL_ERR_Succeeded; | |
115 } | |
116 FWL_ERR* CFWL_ListBox::Sort(IFWL_ListBoxCompare* pCom) { | |
117 return static_cast<IFWL_ListBox*>(m_pIface)->Sort(pCom); | |
118 } | |
119 int32_t CFWL_ListBox::CountItems() { | |
120 return pdfium::CollectionSize<int32_t>(m_ListBoxDP.m_ItemArray); | |
121 } | |
122 FWL_HLISTITEM CFWL_ListBox::GetItem(int32_t nIndex) { | |
123 if (nIndex < 0 || nIndex >= CountItems()) | |
124 return nullptr; | |
125 | |
126 return (FWL_HLISTITEM)m_ListBoxDP.m_ItemArray[nIndex].get(); | |
127 } | |
128 FWL_ERR CFWL_ListBox::SetItemString(FWL_HLISTITEM hItem, | |
129 const CFX_WideStringC& wsText) { | |
130 if (!hItem) | |
131 return FWL_ERR_Indefinite; | |
132 reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = wsText; | |
133 return FWL_ERR_Succeeded; | |
134 } | |
135 FWL_ERR CFWL_ListBox::GetItemString(FWL_HLISTITEM hItem, | |
136 CFX_WideString& wsText) { | |
137 if (!hItem) | |
138 return FWL_ERR_Indefinite; | |
139 wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText; | |
140 return FWL_ERR_Succeeded; | |
141 } | |
142 FWL_ERR CFWL_ListBox::SetItemData(FWL_HLISTITEM hItem, void* pData) { | |
143 if (!hItem) | |
144 return FWL_ERR_Indefinite; | |
145 reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData = pData; | |
146 return FWL_ERR_Succeeded; | |
147 } | |
148 void* CFWL_ListBox::GetItemData(FWL_HLISTITEM hItem) { | |
149 if (!hItem) | |
150 return NULL; | |
151 return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pData; | |
152 } | |
153 FWL_HLISTITEM CFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) { | |
154 CFX_RectF rtClient; | |
155 m_pIface->GetClientRect(rtClient); | |
156 fx -= rtClient.left; | |
157 fy -= rtClient.top; | |
158 FX_FLOAT fPosX = 0; | |
159 FX_FLOAT fPosY = 0; | |
160 static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fx); | |
161 static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fy, FALSE); | |
162 int32_t nCount = m_ListBoxDP.CountItems(NULL); | |
163 for (int32_t i = 0; i < nCount; i++) { | |
164 FWL_HLISTITEM hItem = m_ListBoxDP.GetItem(NULL, i); | |
165 if (!hItem) { | |
166 continue; | |
167 } | |
168 CFX_RectF rtItem; | |
169 m_ListBoxDP.GetItemRect(NULL, hItem, rtItem); | |
170 rtItem.Offset(-fPosX, -fPosY); | |
171 if (rtItem.Contains(fx, fy)) { | |
172 return hItem; | |
173 } | |
174 } | |
175 return NULL; | |
176 } | |
177 FX_DWORD CFWL_ListBox::GetItemStates(FWL_HLISTITEM hItem) { | |
178 if (!hItem) | |
179 return 0; | |
180 CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem); | |
181 return pItem->m_dwStates | pItem->m_dwCheckState; | |
182 } | |
183 CFWL_ListBox::CFWL_ListBox() {} | |
184 CFWL_ListBox::~CFWL_ListBox() {} | |
185 CFWL_ListBox::CFWL_ListBoxDP::CFWL_ListBoxDP() {} | |
186 CFWL_ListBox::CFWL_ListBoxDP::~CFWL_ListBoxDP() {} | |
187 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetCaption(IFWL_Widget* pWidget, | |
188 CFX_WideString& wsCaption) { | |
189 wsCaption = m_wsData; | |
190 return FWL_ERR_Succeeded; | |
191 } | |
192 int32_t CFWL_ListBox::CFWL_ListBoxDP::CountItems(IFWL_Widget* pWidget) { | |
193 return pdfium::CollectionSize<int32_t>(m_ItemArray); | |
194 } | |
195 FWL_HLISTITEM CFWL_ListBox::CFWL_ListBoxDP::GetItem(IFWL_Widget* pWidget, | |
196 int32_t nIndex) { | |
197 if (nIndex < 0 || nIndex >= CountItems(pWidget)) | |
198 return nullptr; | |
199 | |
200 return (FWL_HLISTITEM)m_ItemArray[nIndex].get(); | |
201 } | |
202 int32_t CFWL_ListBox::CFWL_ListBoxDP::GetItemIndex(IFWL_Widget* pWidget, | |
203 FWL_HLISTITEM hItem) { | |
204 auto it = std::find_if( | |
205 m_ItemArray.begin(), m_ItemArray.end(), | |
206 [hItem](const std::unique_ptr<CFWL_ListItem>& candidate) { | |
207 return candidate.get() == reinterpret_cast<CFWL_ListItem*>(hItem); | |
208 }); | |
209 return it != m_ItemArray.end() ? it - m_ItemArray.begin() : -1; | |
210 } | |
211 FX_BOOL CFWL_ListBox::CFWL_ListBoxDP::SetItemIndex(IFWL_Widget* pWidget, | |
212 FWL_HLISTITEM hItem, | |
213 int32_t nIndex) { | |
214 if (nIndex < 0 || nIndex >= CountItems(pWidget)) | |
215 return FALSE; | |
216 m_ItemArray[nIndex].reset(reinterpret_cast<CFWL_ListItem*>(hItem)); | |
217 return TRUE; | |
218 } | |
219 FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemStyles(IFWL_Widget* pWidget, | |
220 FWL_HLISTITEM hItem) { | |
221 if (!hItem) | |
222 return -1; | |
223 return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates; | |
224 } | |
225 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemText(IFWL_Widget* pWidget, | |
226 FWL_HLISTITEM hItem, | |
227 CFX_WideString& wsText) { | |
228 if (!hItem) | |
229 return FWL_ERR_Indefinite; | |
230 wsText = reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText; | |
231 return FWL_ERR_Succeeded; | |
232 } | |
233 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemRect(IFWL_Widget* pWidget, | |
234 FWL_HLISTITEM hItem, | |
235 CFX_RectF& rtItem) { | |
236 if (!hItem) | |
237 return FWL_ERR_Indefinite; | |
238 CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem); | |
239 rtItem = pItem->m_rtItem; | |
240 return FWL_ERR_Succeeded; | |
241 } | |
242 void* CFWL_ListBox::CFWL_ListBoxDP::GetItemData(IFWL_Widget* pWidget, | |
243 FWL_HLISTITEM hItem) { | |
244 if (!hItem) | |
245 return NULL; | |
246 CFWL_ListItem* pItem = reinterpret_cast<CFWL_ListItem*>(hItem); | |
247 return pItem->m_pData; | |
248 } | |
249 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemStyles(IFWL_Widget* pWidget, | |
250 FWL_HLISTITEM hItem, | |
251 FX_DWORD dwStyle) { | |
252 if (!hItem) | |
253 return FWL_ERR_Indefinite; | |
254 reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwStates = dwStyle; | |
255 return FWL_ERR_Succeeded; | |
256 } | |
257 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemText(IFWL_Widget* pWidget, | |
258 FWL_HLISTITEM hItem, | |
259 const FX_WCHAR* pszText) { | |
260 if (!hItem) | |
261 return FWL_ERR_Indefinite; | |
262 reinterpret_cast<CFWL_ListItem*>(hItem)->m_wsText = pszText; | |
263 return FWL_ERR_Succeeded; | |
264 } | |
265 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemRect(IFWL_Widget* pWidget, | |
266 FWL_HLISTITEM hItem, | |
267 const CFX_RectF& rtItem) { | |
268 if (!hItem) | |
269 return FWL_ERR_Indefinite; | |
270 reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtItem = rtItem; | |
271 return FWL_ERR_Succeeded; | |
272 } | |
273 FX_FLOAT CFWL_ListBox::CFWL_ListBoxDP::GetItemHeight(IFWL_Widget* pWidget) { | |
274 return m_fItemHeight; | |
275 } | |
276 CFX_DIBitmap* CFWL_ListBox::CFWL_ListBoxDP::GetItemIcon(IFWL_Widget* pWidget, | |
277 FWL_HLISTITEM hItem) { | |
278 return reinterpret_cast<CFWL_ListItem*>(hItem)->m_pDIB; | |
279 } | |
280 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckRect(IFWL_Widget* pWidget, | |
281 FWL_HLISTITEM hItem, | |
282 CFX_RectF& rtCheck) { | |
283 rtCheck = reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox; | |
284 return FWL_ERR_Succeeded; | |
285 } | |
286 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckRect( | |
287 IFWL_Widget* pWidget, | |
288 FWL_HLISTITEM hItem, | |
289 const CFX_RectF& rtCheck) { | |
290 reinterpret_cast<CFWL_ListItem*>(hItem)->m_rtCheckBox = rtCheck; | |
291 return FWL_ERR_Succeeded; | |
292 } | |
293 FX_DWORD CFWL_ListBox::CFWL_ListBoxDP::GetItemCheckState(IFWL_Widget* pWidget, | |
294 FWL_HLISTITEM hItem) { | |
295 return reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwCheckState; | |
296 } | |
297 FWL_ERR CFWL_ListBox::CFWL_ListBoxDP::SetItemCheckState(IFWL_Widget* pWidget, | |
298 FWL_HLISTITEM hItem, | |
299 FX_DWORD dwCheckState) { | |
300 reinterpret_cast<CFWL_ListItem*>(hItem)->m_dwCheckState = dwCheckState; | |
301 return FWL_ERR_Succeeded; | |
302 } | |
OLD | NEW |