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