OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "fpdfsdk/pdfwindow/PWL_ListBox.h" | 7 #include "fpdfsdk/pdfwindow/PWL_ListBox.h" |
8 | 8 |
9 #include "fpdfsdk/fxedit/include/fxet_edit.h" | 9 #include "fpdfsdk/fxedit/include/fxet_edit.h" |
10 #include "fpdfsdk/fxedit/include/fxet_list.h" | 10 #include "fpdfsdk/fxedit/include/fxet_list.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 m_pFillerNotify(nullptr) {} | 73 m_pFillerNotify(nullptr) {} |
74 | 74 |
75 CPWL_ListBox::~CPWL_ListBox() { | 75 CPWL_ListBox::~CPWL_ListBox() { |
76 } | 76 } |
77 | 77 |
78 CFX_ByteString CPWL_ListBox::GetClassName() const { | 78 CFX_ByteString CPWL_ListBox::GetClassName() const { |
79 return "CPWL_ListBox"; | 79 return "CPWL_ListBox"; |
80 } | 80 } |
81 | 81 |
82 void CPWL_ListBox::OnCreated() { | 82 void CPWL_ListBox::OnCreated() { |
83 if (m_pList) { | 83 m_pList->SetFontMap(GetFontMap()); |
84 m_pList->SetFontMap(GetFontMap()); | 84 m_pListNotify.reset(new CPWL_List_Notify(this)); |
85 m_pListNotify.reset(new CPWL_List_Notify(this)); | 85 m_pList->SetNotify(m_pListNotify.get()); |
86 m_pList->SetNotify(m_pListNotify.get()); | |
87 | 86 |
88 SetHoverSel(HasFlag(PLBS_HOVERSEL)); | 87 SetHoverSel(HasFlag(PLBS_HOVERSEL)); |
89 m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); | 88 m_pList->SetMultipleSel(HasFlag(PLBS_MULTIPLESEL)); |
90 m_pList->SetFontSize(GetCreationParam().fFontSize); | 89 m_pList->SetFontSize(GetCreationParam().fFontSize); |
91 | 90 |
92 m_bHoverSel = HasFlag(PLBS_HOVERSEL); | 91 m_bHoverSel = HasFlag(PLBS_HOVERSEL); |
93 } | |
94 } | 92 } |
95 | 93 |
96 void CPWL_ListBox::OnDestroy() { | 94 void CPWL_ListBox::OnDestroy() { |
97 // Make sure the notifier is removed from the list as we are about to | 95 // Make sure the notifier is removed from the list as we are about to |
98 // destroy the notifier and don't want to leave a dangling pointer. | 96 // destroy the notifier and don't want to leave a dangling pointer. |
99 if (m_pList) | 97 m_pList->SetNotify(nullptr); |
100 m_pList->SetNotify(nullptr); | |
101 m_pListNotify.reset(); | 98 m_pListNotify.reset(); |
102 } | 99 } |
103 | 100 |
104 void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { | 101 void CPWL_ListBox::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { |
105 CPWL_Wnd::GetThisAppearanceStream(sAppStream); | 102 CPWL_Wnd::GetThisAppearanceStream(sAppStream); |
106 | 103 |
107 CFX_ByteTextBuf sListItems; | 104 CFX_ByteTextBuf sListItems; |
108 | 105 |
109 if (m_pList) { | 106 CFX_FloatRect rcPlate = m_pList->GetPlateRect(); |
110 CFX_FloatRect rcPlate = m_pList->GetPlateRect(); | 107 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { |
111 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { | 108 CFX_FloatRect rcItem = m_pList->GetItemRect(i); |
112 CFX_FloatRect rcItem = m_pList->GetItemRect(i); | |
113 | 109 |
114 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) | 110 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) |
115 continue; | 111 continue; |
116 | 112 |
117 CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); | 113 CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); |
118 if (m_pList->IsItemSelected(i)) { | 114 if (m_pList->IsItemSelected(i)) { |
119 sListItems << CPWL_Utils::GetRectFillAppStream(rcItem, | 115 sListItems << CPWL_Utils::GetRectFillAppStream(rcItem, |
120 PWL_DEFAULT_SELBACKCOLOR) | 116 PWL_DEFAULT_SELBACKCOLOR) |
121 .AsStringC(); | 117 .AsStringC(); |
122 CFX_ByteString sItem = | 118 CFX_ByteString sItem = |
123 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); | 119 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); |
124 if (sItem.GetLength() > 0) { | 120 if (sItem.GetLength() > 0) { |
125 sListItems << "BT\n" | 121 sListItems << "BT\n" |
126 << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) | 122 << CPWL_Utils::GetColorAppStream(PWL_DEFAULT_SELTEXTCOLOR) |
127 .AsStringC() | 123 .AsStringC() |
128 << sItem.AsStringC() << "ET\n"; | 124 << sItem.AsStringC() << "ET\n"; |
129 } | 125 } |
130 } else { | 126 } else { |
131 CFX_ByteString sItem = | 127 CFX_ByteString sItem = |
132 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); | 128 CPWL_Utils::GetEditAppStream(m_pList->GetItemEdit(i), ptOffset); |
133 if (sItem.GetLength() > 0) { | 129 if (sItem.GetLength() > 0) { |
134 sListItems << "BT\n" | 130 sListItems << "BT\n" |
135 << CPWL_Utils::GetColorAppStream(GetTextColor()) | 131 << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC() |
136 .AsStringC() | 132 << sItem.AsStringC() << "ET\n"; |
137 << sItem.AsStringC() << "ET\n"; | |
138 } | |
139 } | 133 } |
140 } | 134 } |
141 } | 135 } |
142 | 136 |
143 if (sListItems.GetLength() > 0) { | 137 if (sListItems.GetLength() > 0) { |
144 CFX_ByteTextBuf sClip; | 138 CFX_ByteTextBuf sClip; |
145 CFX_FloatRect rcClient = GetClientRect(); | 139 CFX_FloatRect rcClient = GetClientRect(); |
146 | 140 |
147 sClip << "q\n"; | 141 sClip << "q\n"; |
148 sClip << rcClient.left << " " << rcClient.bottom << " " | 142 sClip << rcClient.left << " " << rcClient.bottom << " " |
149 << rcClient.right - rcClient.left << " " | 143 << rcClient.right - rcClient.left << " " |
150 << rcClient.top - rcClient.bottom << " re W n\n"; | 144 << rcClient.top - rcClient.bottom << " re W n\n"; |
151 | 145 |
152 sClip << sListItems << "Q\n"; | 146 sClip << sListItems << "Q\n"; |
153 | 147 |
154 sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; | 148 sAppStream << "/Tx BMC\n" << sClip << "EMC\n"; |
155 } | 149 } |
156 } | 150 } |
157 | 151 |
158 void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, | 152 void CPWL_ListBox::DrawThisAppearance(CFX_RenderDevice* pDevice, |
159 CFX_Matrix* pUser2Device) { | 153 CFX_Matrix* pUser2Device) { |
160 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); | 154 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); |
161 | 155 |
162 if (m_pList) { | 156 CFX_FloatRect rcPlate = m_pList->GetPlateRect(); |
163 CFX_FloatRect rcPlate = m_pList->GetPlateRect(); | 157 CFX_FloatRect rcList = GetListRect(); |
164 CFX_FloatRect rcList = GetListRect(); | 158 CFX_FloatRect rcClient = GetClientRect(); |
165 CFX_FloatRect rcClient = GetClientRect(); | |
166 | 159 |
167 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { | 160 for (int32_t i = 0, sz = m_pList->GetCount(); i < sz; i++) { |
168 CFX_FloatRect rcItem = m_pList->GetItemRect(i); | 161 CFX_FloatRect rcItem = m_pList->GetItemRect(i); |
169 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) | 162 if (rcItem.bottom > rcPlate.top || rcItem.top < rcPlate.bottom) |
170 continue; | 163 continue; |
171 | 164 |
172 CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); | 165 CFX_FloatPoint ptOffset(rcItem.left, (rcItem.top + rcItem.bottom) * 0.5f); |
173 if (CFX_Edit* pEdit = m_pList->GetItemEdit(i)) { | 166 if (CFX_Edit* pEdit = m_pList->GetItemEdit(i)) { |
174 CFX_FloatRect rcContent = pEdit->GetContentRect(); | 167 CFX_FloatRect rcContent = pEdit->GetContentRect(); |
175 if (rcContent.Width() > rcClient.Width()) | 168 if (rcContent.Width() > rcClient.Width()) |
176 rcItem.Intersect(rcList); | 169 rcItem.Intersect(rcList); |
177 else | 170 else |
178 rcItem.Intersect(rcClient); | 171 rcItem.Intersect(rcClient); |
179 } | 172 } |
180 | 173 |
181 if (m_pList->IsItemSelected(i)) { | 174 if (m_pList->IsItemSelected(i)) { |
182 CFX_SystemHandler* pSysHandler = GetSystemHandler(); | 175 CFX_SystemHandler* pSysHandler = GetSystemHandler(); |
183 if (pSysHandler && pSysHandler->IsSelectionImplemented()) { | 176 if (pSysHandler && pSysHandler->IsSelectionImplemented()) { |
184 CFX_Edit::DrawEdit( | |
185 pDevice, pUser2Device, m_pList->GetItemEdit(i), | |
186 CPWL_Utils::PWLColorToFXColor(GetTextColor()), | |
187 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), rcList, | |
188 ptOffset, nullptr, pSysHandler, m_pFormFiller); | |
189 pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); | |
190 } else { | |
191 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, | |
192 ArgbEncode(255, 0, 51, 113)); | |
193 CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), | |
194 ArgbEncode(255, 255, 255, 255), 0, rcList, | |
195 ptOffset, nullptr, pSysHandler, m_pFormFiller); | |
196 } | |
197 } else { | |
198 CFX_SystemHandler* pSysHandler = GetSystemHandler(); | |
199 CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), | 177 CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), |
200 CPWL_Utils::PWLColorToFXColor(GetTextColor()), | 178 CPWL_Utils::PWLColorToFXColor(GetTextColor()), |
201 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), | 179 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), |
202 rcList, ptOffset, nullptr, pSysHandler, nullptr); | 180 rcList, ptOffset, nullptr, pSysHandler, |
| 181 m_pFormFiller); |
| 182 pSysHandler->OutputSelectedRect(m_pFormFiller, rcItem); |
| 183 } else { |
| 184 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcItem, |
| 185 ArgbEncode(255, 0, 51, 113)); |
| 186 CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), |
| 187 ArgbEncode(255, 255, 255, 255), 0, rcList, ptOffset, |
| 188 nullptr, pSysHandler, m_pFormFiller); |
203 } | 189 } |
| 190 } else { |
| 191 CFX_SystemHandler* pSysHandler = GetSystemHandler(); |
| 192 CFX_Edit::DrawEdit(pDevice, pUser2Device, m_pList->GetItemEdit(i), |
| 193 CPWL_Utils::PWLColorToFXColor(GetTextColor()), |
| 194 CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor()), |
| 195 rcList, ptOffset, nullptr, pSysHandler, nullptr); |
204 } | 196 } |
205 } | 197 } |
206 } | 198 } |
207 | 199 |
208 FX_BOOL CPWL_ListBox::OnKeyDown(uint16_t nChar, uint32_t nFlag) { | 200 FX_BOOL CPWL_ListBox::OnKeyDown(uint16_t nChar, uint32_t nFlag) { |
209 CPWL_Wnd::OnKeyDown(nChar, nFlag); | 201 CPWL_Wnd::OnKeyDown(nChar, nFlag); |
210 | 202 |
211 if (!m_pList) | |
212 return FALSE; | |
213 | |
214 switch (nChar) { | 203 switch (nChar) { |
215 default: | 204 default: |
216 return FALSE; | 205 return FALSE; |
217 case FWL_VKEY_Up: | 206 case FWL_VKEY_Up: |
218 case FWL_VKEY_Down: | 207 case FWL_VKEY_Down: |
219 case FWL_VKEY_Home: | 208 case FWL_VKEY_Home: |
220 case FWL_VKEY_Left: | 209 case FWL_VKEY_Left: |
221 case FWL_VKEY_End: | 210 case FWL_VKEY_End: |
222 case FWL_VKEY_Right: | 211 case FWL_VKEY_Right: |
223 break; | 212 break; |
(...skipping 24 matching lines...) Expand all Loading... |
248 | 237 |
249 FX_BOOL bExit = FALSE; | 238 FX_BOOL bExit = FALSE; |
250 OnNotifySelChanged(TRUE, bExit, nFlag); | 239 OnNotifySelChanged(TRUE, bExit, nFlag); |
251 | 240 |
252 return TRUE; | 241 return TRUE; |
253 } | 242 } |
254 | 243 |
255 FX_BOOL CPWL_ListBox::OnChar(uint16_t nChar, uint32_t nFlag) { | 244 FX_BOOL CPWL_ListBox::OnChar(uint16_t nChar, uint32_t nFlag) { |
256 CPWL_Wnd::OnChar(nChar, nFlag); | 245 CPWL_Wnd::OnChar(nChar, nFlag); |
257 | 246 |
258 if (!m_pList) | |
259 return FALSE; | |
260 | |
261 if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) | 247 if (!m_pList->OnChar(nChar, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag))) |
262 return FALSE; | 248 return FALSE; |
263 | 249 |
264 FX_BOOL bExit = FALSE; | 250 FX_BOOL bExit = FALSE; |
265 OnNotifySelChanged(TRUE, bExit, nFlag); | 251 OnNotifySelChanged(TRUE, bExit, nFlag); |
266 | 252 |
267 return TRUE; | 253 return TRUE; |
268 } | 254 } |
269 | 255 |
270 FX_BOOL CPWL_ListBox::OnLButtonDown(const CFX_FloatPoint& point, | 256 FX_BOOL CPWL_ListBox::OnLButtonDown(const CFX_FloatPoint& point, |
271 uint32_t nFlag) { | 257 uint32_t nFlag) { |
272 CPWL_Wnd::OnLButtonDown(point, nFlag); | 258 CPWL_Wnd::OnLButtonDown(point, nFlag); |
273 | 259 |
274 if (ClientHitTest(point)) { | 260 if (ClientHitTest(point)) { |
275 m_bMouseDown = TRUE; | 261 m_bMouseDown = TRUE; |
276 SetFocus(); | 262 SetFocus(); |
277 SetCapture(); | 263 SetCapture(); |
278 | 264 |
279 if (m_pList) | 265 m_pList->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
280 m_pList->OnMouseDown(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); | |
281 } | 266 } |
282 | 267 |
283 return TRUE; | 268 return TRUE; |
284 } | 269 } |
285 | 270 |
286 FX_BOOL CPWL_ListBox::OnLButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) { | 271 FX_BOOL CPWL_ListBox::OnLButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) { |
287 CPWL_Wnd::OnLButtonUp(point, nFlag); | 272 CPWL_Wnd::OnLButtonUp(point, nFlag); |
288 | 273 |
289 if (m_bMouseDown) { | 274 if (m_bMouseDown) { |
290 ReleaseCapture(); | 275 ReleaseCapture(); |
291 m_bMouseDown = FALSE; | 276 m_bMouseDown = FALSE; |
292 } | 277 } |
293 | 278 |
294 FX_BOOL bExit = FALSE; | 279 FX_BOOL bExit = FALSE; |
295 OnNotifySelChanged(FALSE, bExit, nFlag); | 280 OnNotifySelChanged(FALSE, bExit, nFlag); |
296 | 281 |
297 return TRUE; | 282 return TRUE; |
298 } | 283 } |
299 | 284 |
300 void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) { | 285 void CPWL_ListBox::SetHoverSel(FX_BOOL bHoverSel) { |
301 m_bHoverSel = bHoverSel; | 286 m_bHoverSel = bHoverSel; |
302 } | 287 } |
303 | 288 |
304 FX_BOOL CPWL_ListBox::OnMouseMove(const CFX_FloatPoint& point, uint32_t nFlag) { | 289 FX_BOOL CPWL_ListBox::OnMouseMove(const CFX_FloatPoint& point, uint32_t nFlag) { |
305 CPWL_Wnd::OnMouseMove(point, nFlag); | 290 CPWL_Wnd::OnMouseMove(point, nFlag); |
306 | 291 |
307 if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) { | 292 if (m_bHoverSel && !IsCaptureMouse() && ClientHitTest(point)) |
308 if (m_pList) | 293 m_pList->Select(m_pList->GetItemIndex(point)); |
309 m_pList->Select(m_pList->GetItemIndex(point)); | 294 if (m_bMouseDown) |
310 } | 295 m_pList->OnMouseMove(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
311 | |
312 if (m_bMouseDown) { | |
313 if (m_pList) | |
314 m_pList->OnMouseMove(point, IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); | |
315 } | |
316 | 296 |
317 return TRUE; | 297 return TRUE; |
318 } | 298 } |
319 | 299 |
320 void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, | 300 void CPWL_ListBox::OnNotify(CPWL_Wnd* pWnd, |
321 uint32_t msg, | 301 uint32_t msg, |
322 intptr_t wParam, | 302 intptr_t wParam, |
323 intptr_t lParam) { | 303 intptr_t lParam) { |
324 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); | 304 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); |
325 | 305 |
(...skipping 15 matching lines...) Expand all Loading... |
341 if (CPWL_Wnd* pChild = GetVScrollBar()) { | 321 if (CPWL_Wnd* pChild = GetVScrollBar()) { |
342 pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); | 322 pChild->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam); |
343 } | 323 } |
344 break; | 324 break; |
345 } | 325 } |
346 break; | 326 break; |
347 case PNM_SCROLLWINDOW: | 327 case PNM_SCROLLWINDOW: |
348 fPos = *(FX_FLOAT*)lParam; | 328 fPos = *(FX_FLOAT*)lParam; |
349 switch (wParam) { | 329 switch (wParam) { |
350 case SBT_VSCROLL: | 330 case SBT_VSCROLL: |
351 if (m_pList) | 331 m_pList->SetScrollPos(CFX_FloatPoint(0, fPos)); |
352 m_pList->SetScrollPos(CFX_FloatPoint(0, fPos)); | |
353 break; | 332 break; |
354 } | 333 } |
355 break; | 334 break; |
356 } | 335 } |
357 } | 336 } |
358 | 337 |
359 void CPWL_ListBox::KillFocus() { | 338 void CPWL_ListBox::KillFocus() { |
360 CPWL_Wnd::KillFocus(); | 339 CPWL_Wnd::KillFocus(); |
361 } | 340 } |
362 | 341 |
363 void CPWL_ListBox::RePosChildWnd() { | 342 void CPWL_ListBox::RePosChildWnd() { |
364 CPWL_Wnd::RePosChildWnd(); | 343 CPWL_Wnd::RePosChildWnd(); |
365 | 344 |
366 if (m_pList) | 345 m_pList->SetPlateRect(GetListRect()); |
367 m_pList->SetPlateRect(GetListRect()); | |
368 } | 346 } |
369 | 347 |
370 void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, | 348 void CPWL_ListBox::OnNotifySelChanged(FX_BOOL bKeyDown, |
371 FX_BOOL& bExit, | 349 FX_BOOL& bExit, |
372 uint32_t nFlag) { | 350 uint32_t nFlag) { |
373 if (!m_pFillerNotify) | 351 if (!m_pFillerNotify) |
374 return; | 352 return; |
375 | 353 |
376 FX_BOOL bRC = TRUE; | 354 FX_BOOL bRC = TRUE; |
377 CFX_WideString swChange = GetText(); | 355 CFX_WideString swChange = GetText(); |
378 CFX_WideString strChangeEx; | 356 CFX_WideString strChangeEx; |
379 int nSelStart = 0; | 357 int nSelStart = 0; |
380 int nSelEnd = swChange.GetLength(); | 358 int nSelEnd = swChange.GetLength(); |
381 m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, strChangeEx, | 359 m_pFillerNotify->OnBeforeKeyStroke(GetAttachedData(), swChange, strChangeEx, |
382 nSelStart, nSelEnd, bKeyDown, bRC, bExit, | 360 nSelStart, nSelEnd, bKeyDown, bRC, bExit, |
383 nFlag); | 361 nFlag); |
384 } | 362 } |
385 | 363 |
386 CFX_FloatRect CPWL_ListBox::GetFocusRect() const { | 364 CFX_FloatRect CPWL_ListBox::GetFocusRect() const { |
387 if (m_pList && m_pList->IsMultipleSel()) { | 365 if (m_pList->IsMultipleSel()) { |
388 CFX_FloatRect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); | 366 CFX_FloatRect rcCaret = m_pList->GetItemRect(m_pList->GetCaret()); |
389 rcCaret.Intersect(GetClientRect()); | 367 rcCaret.Intersect(GetClientRect()); |
390 return rcCaret; | 368 return rcCaret; |
391 } | 369 } |
392 | 370 |
393 return CPWL_Wnd::GetFocusRect(); | 371 return CPWL_Wnd::GetFocusRect(); |
394 } | 372 } |
395 | 373 |
396 void CPWL_ListBox::AddString(const FX_WCHAR* str) { | 374 void CPWL_ListBox::AddString(const FX_WCHAR* str) { |
397 if (m_pList) { | 375 m_pList->AddString(str); |
398 m_pList->AddString(str); | |
399 } | |
400 } | 376 } |
401 | 377 |
402 CFX_WideString CPWL_ListBox::GetText() const { | 378 CFX_WideString CPWL_ListBox::GetText() const { |
403 if (m_pList) | 379 return m_pList->GetText(); |
404 return m_pList->GetText(); | |
405 | |
406 return L""; | |
407 } | 380 } |
408 | 381 |
409 void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) { | 382 void CPWL_ListBox::SetFontSize(FX_FLOAT fFontSize) { |
410 if (m_pList) | 383 m_pList->SetFontSize(fFontSize); |
411 m_pList->SetFontSize(fFontSize); | |
412 } | 384 } |
413 | 385 |
414 FX_FLOAT CPWL_ListBox::GetFontSize() const { | 386 FX_FLOAT CPWL_ListBox::GetFontSize() const { |
415 if (m_pList) | 387 return m_pList->GetFontSize(); |
416 return m_pList->GetFontSize(); | |
417 return 0.0f; | |
418 } | 388 } |
419 | 389 |
420 void CPWL_ListBox::Select(int32_t nItemIndex) { | 390 void CPWL_ListBox::Select(int32_t nItemIndex) { |
421 if (m_pList) | 391 m_pList->Select(nItemIndex); |
422 m_pList->Select(nItemIndex); | |
423 } | 392 } |
424 | 393 |
425 void CPWL_ListBox::SetCaret(int32_t nItemIndex) { | 394 void CPWL_ListBox::SetCaret(int32_t nItemIndex) { |
426 if (m_pList) | 395 m_pList->SetCaret(nItemIndex); |
427 m_pList->SetCaret(nItemIndex); | |
428 } | 396 } |
429 | 397 |
430 void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) { | 398 void CPWL_ListBox::SetTopVisibleIndex(int32_t nItemIndex) { |
431 if (m_pList) | 399 m_pList->SetTopItem(nItemIndex); |
432 m_pList->SetTopItem(nItemIndex); | |
433 } | 400 } |
434 | 401 |
435 void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) { | 402 void CPWL_ListBox::ScrollToListItem(int32_t nItemIndex) { |
436 if (m_pList) | 403 m_pList->ScrollToListItem(nItemIndex); |
437 m_pList->ScrollToListItem(nItemIndex); | |
438 } | 404 } |
439 | 405 |
440 void CPWL_ListBox::ResetContent() { | 406 void CPWL_ListBox::ResetContent() { |
441 if (m_pList) | 407 m_pList->Empty(); |
442 m_pList->Empty(); | |
443 } | 408 } |
444 | 409 |
445 void CPWL_ListBox::Reset() { | 410 void CPWL_ListBox::Reset() { |
446 if (m_pList) | 411 m_pList->Cancel(); |
447 m_pList->Cancel(); | |
448 } | 412 } |
449 | 413 |
450 FX_BOOL CPWL_ListBox::IsMultipleSel() const { | 414 FX_BOOL CPWL_ListBox::IsMultipleSel() const { |
451 if (m_pList) | 415 return m_pList->IsMultipleSel(); |
452 return m_pList->IsMultipleSel(); | |
453 | |
454 return FALSE; | |
455 } | 416 } |
456 | 417 |
457 int32_t CPWL_ListBox::GetCaretIndex() const { | 418 int32_t CPWL_ListBox::GetCaretIndex() const { |
458 if (m_pList) | 419 return m_pList->GetCaret(); |
459 return m_pList->GetCaret(); | |
460 | |
461 return -1; | |
462 } | 420 } |
463 | 421 |
464 int32_t CPWL_ListBox::GetCurSel() const { | 422 int32_t CPWL_ListBox::GetCurSel() const { |
465 if (m_pList) | 423 return m_pList->GetSelect(); |
466 return m_pList->GetSelect(); | |
467 | |
468 return -1; | |
469 } | 424 } |
470 | 425 |
471 FX_BOOL CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const { | 426 FX_BOOL CPWL_ListBox::IsItemSelected(int32_t nItemIndex) const { |
472 if (m_pList) | 427 return m_pList->IsItemSelected(nItemIndex); |
473 return m_pList->IsItemSelected(nItemIndex); | |
474 | |
475 return FALSE; | |
476 } | 428 } |
477 | 429 |
478 int32_t CPWL_ListBox::GetTopVisibleIndex() const { | 430 int32_t CPWL_ListBox::GetTopVisibleIndex() const { |
479 if (m_pList) { | 431 m_pList->ScrollToListItem(m_pList->GetFirstSelected()); |
480 m_pList->ScrollToListItem(m_pList->GetFirstSelected()); | 432 return m_pList->GetTopItem(); |
481 return m_pList->GetTopItem(); | |
482 } | |
483 | |
484 return -1; | |
485 } | 433 } |
486 | 434 |
487 int32_t CPWL_ListBox::GetCount() const { | 435 int32_t CPWL_ListBox::GetCount() const { |
488 if (m_pList) | 436 return m_pList->GetCount(); |
489 return m_pList->GetCount(); | |
490 | |
491 return 0; | |
492 } | 437 } |
493 | 438 |
494 int32_t CPWL_ListBox::FindNext(int32_t nIndex, FX_WCHAR nChar) const { | 439 int32_t CPWL_ListBox::FindNext(int32_t nIndex, FX_WCHAR nChar) const { |
495 if (m_pList) | 440 return m_pList->FindNext(nIndex, nChar); |
496 return m_pList->FindNext(nIndex, nChar); | |
497 | |
498 return nIndex; | |
499 } | 441 } |
500 | 442 |
501 CFX_FloatRect CPWL_ListBox::GetContentRect() const { | 443 CFX_FloatRect CPWL_ListBox::GetContentRect() const { |
502 if (m_pList) | 444 return m_pList->GetContentRect(); |
503 return m_pList->GetContentRect(); | |
504 | |
505 return CFX_FloatRect(); | |
506 } | 445 } |
507 | 446 |
508 FX_FLOAT CPWL_ListBox::GetFirstHeight() const { | 447 FX_FLOAT CPWL_ListBox::GetFirstHeight() const { |
509 if (m_pList) | 448 return m_pList->GetFirstHeight(); |
510 return m_pList->GetFirstHeight(); | |
511 | |
512 return 0.0f; | |
513 } | 449 } |
514 | 450 |
515 CFX_FloatRect CPWL_ListBox::GetListRect() const { | 451 CFX_FloatRect CPWL_ListBox::GetListRect() const { |
516 return CPWL_Utils::DeflateRect( | 452 return CPWL_Utils::DeflateRect( |
517 GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); | 453 GetWindowRect(), (FX_FLOAT)(GetBorderWidth() + GetInnerBorderWidth())); |
518 } | 454 } |
519 | 455 |
520 FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, | 456 FX_BOOL CPWL_ListBox::OnMouseWheel(short zDelta, |
521 const CFX_FloatPoint& point, | 457 const CFX_FloatPoint& point, |
522 uint32_t nFlag) { | 458 uint32_t nFlag) { |
523 if (!m_pList) | 459 if (zDelta < 0) |
524 return FALSE; | |
525 | |
526 if (zDelta < 0) { | |
527 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); | 460 m_pList->OnVK_DOWN(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
528 } else { | 461 else |
529 m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); | 462 m_pList->OnVK_UP(IsSHIFTpressed(nFlag), IsCTRLpressed(nFlag)); |
530 } | |
531 | 463 |
532 FX_BOOL bExit = FALSE; | 464 FX_BOOL bExit = FALSE; |
533 OnNotifySelChanged(FALSE, bExit, nFlag); | 465 OnNotifySelChanged(FALSE, bExit, nFlag); |
534 return TRUE; | 466 return TRUE; |
535 } | 467 } |
OLD | NEW |