Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: xfa/fwl/core/ifwl_listbox.cpp

Issue 2506253004: Split fwl/core class pt I. (Closed)
Patch Set: Rebase to master Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « xfa/fwl/core/ifwl_listbox.h ('k') | xfa/fwl/core/ifwl_monthcalendar.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "xfa/fwl/core/ifwl_listbox.h" 7 #include "xfa/fwl/core/ifwl_listbox.h"
8 8
9 #include "third_party/base/ptr_util.h" 9 #include "third_party/base/ptr_util.h"
10 #include "xfa/fde/tto/fde_textout.h" 10 #include "xfa/fde/tto/fde_textout.h"
11 #include "xfa/fwl/core/cfwl_msgkey.h" 11 #include "xfa/fwl/core/cfwl_msgkey.h"
12 #include "xfa/fwl/core/cfwl_msgmouse.h" 12 #include "xfa/fwl/core/cfwl_msgmouse.h"
13 #include "xfa/fwl/core/cfwl_msgmousewheel.h" 13 #include "xfa/fwl/core/cfwl_msgmousewheel.h"
14 #include "xfa/fwl/core/cfwl_themebackground.h" 14 #include "xfa/fwl/core/cfwl_themebackground.h"
15 #include "xfa/fwl/core/cfwl_themepart.h" 15 #include "xfa/fwl/core/cfwl_themepart.h"
16 #include "xfa/fwl/core/cfwl_themetext.h" 16 #include "xfa/fwl/core/cfwl_themetext.h"
17 #include "xfa/fwl/core/ifwl_app.h" 17 #include "xfa/fwl/core/ifwl_app.h"
18 #include "xfa/fwl/core/ifwl_listbox.h"
18 #include "xfa/fwl/core/ifwl_themeprovider.h" 19 #include "xfa/fwl/core/ifwl_themeprovider.h"
19 20
20 namespace { 21 namespace {
21 22
22 const int kItemTextMargin = 2; 23 const int kItemTextMargin = 2;
23 24
24 } // namespace 25 } // namespace
25 26
26 IFWL_ListBox::IFWL_ListBox(const IFWL_App* app, 27 IFWL_ListBox::IFWL_ListBox(const IFWL_App* app,
27 std::unique_ptr<CFWL_WidgetProperties> properties, 28 std::unique_ptr<CFWL_WidgetProperties> properties,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 void IFWL_ListBox::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) { 140 void IFWL_ListBox::SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) {
140 if (pThemeProvider) 141 if (pThemeProvider)
141 m_pProperties->m_pThemeProvider = pThemeProvider; 142 m_pProperties->m_pThemeProvider = pThemeProvider;
142 } 143 }
143 144
144 int32_t IFWL_ListBox::CountSelItems() { 145 int32_t IFWL_ListBox::CountSelItems() {
145 if (!m_pProperties->m_pDataProvider) 146 if (!m_pProperties->m_pDataProvider)
146 return 0; 147 return 0;
147 148
148 int32_t iRet = 0; 149 int32_t iRet = 0;
149 IFWL_ListBoxDP* pData = 150 IFWL_ListBox::DataProvider* pData =
150 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 151 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
151 int32_t iCount = pData->CountItems(this); 152 int32_t iCount = pData->CountItems(this);
152 for (int32_t i = 0; i < iCount; i++) { 153 for (int32_t i = 0; i < iCount; i++) {
153 CFWL_ListItem* pItem = pData->GetItem(this, i); 154 CFWL_ListItem* pItem = pData->GetItem(this, i);
154 if (!pItem) 155 if (!pItem)
155 continue; 156 continue;
156 157
157 uint32_t dwStyle = pData->GetItemStyles(this, pItem); 158 uint32_t dwStyle = pData->GetItemStyles(this, pItem);
158 if (dwStyle & FWL_ITEMSTATE_LTB_Selected) 159 if (dwStyle & FWL_ITEMSTATE_LTB_Selected)
159 iRet++; 160 iRet++;
160 } 161 }
161 return iRet; 162 return iRet;
162 } 163 }
163 164
164 CFWL_ListItem* IFWL_ListBox::GetSelItem(int32_t nIndexSel) { 165 CFWL_ListItem* IFWL_ListBox::GetSelItem(int32_t nIndexSel) {
165 int32_t idx = GetSelIndex(nIndexSel); 166 int32_t idx = GetSelIndex(nIndexSel);
166 if (idx < 0) 167 if (idx < 0)
167 return nullptr; 168 return nullptr;
168 IFWL_ListBoxDP* pData = 169 IFWL_ListBox::DataProvider* pData =
169 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 170 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
170 return pData->GetItem(this, idx); 171 return pData->GetItem(this, idx);
171 } 172 }
172 173
173 int32_t IFWL_ListBox::GetSelIndex(int32_t nIndex) { 174 int32_t IFWL_ListBox::GetSelIndex(int32_t nIndex) {
174 if (!m_pProperties->m_pDataProvider) 175 if (!m_pProperties->m_pDataProvider)
175 return -1; 176 return -1;
176 177
177 int32_t index = 0; 178 int32_t index = 0;
178 IFWL_ListBoxDP* pData = 179 IFWL_ListBox::DataProvider* pData =
179 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 180 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
180 int32_t iCount = pData->CountItems(this); 181 int32_t iCount = pData->CountItems(this);
181 for (int32_t i = 0; i < iCount; i++) { 182 for (int32_t i = 0; i < iCount; i++) {
182 CFWL_ListItem* pItem = pData->GetItem(this, i); 183 CFWL_ListItem* pItem = pData->GetItem(this, i);
183 if (!pItem) 184 if (!pItem)
184 return -1; 185 return -1;
185 186
186 uint32_t dwStyle = pData->GetItemStyles(this, pItem); 187 uint32_t dwStyle = pData->GetItemStyles(this, pItem);
187 if (dwStyle & FWL_ITEMSTATE_LTB_Selected) { 188 if (dwStyle & FWL_ITEMSTATE_LTB_Selected) {
188 if (index == nIndex) 189 if (index == nIndex)
189 return i; 190 return i;
(...skipping 18 matching lines...) Expand all
208 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) 209 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection)
209 SetSelectionDirect(pItem, bSelect); 210 SetSelectionDirect(pItem, bSelect);
210 else 211 else
211 SetSelection(pItem, pItem, bSelect); 212 SetSelection(pItem, pItem, bSelect);
212 } 213 }
213 214
214 void IFWL_ListBox::GetItemText(CFWL_ListItem* pItem, CFX_WideString& wsText) { 215 void IFWL_ListBox::GetItemText(CFWL_ListItem* pItem, CFX_WideString& wsText) {
215 if (!m_pProperties->m_pDataProvider) 216 if (!m_pProperties->m_pDataProvider)
216 return; 217 return;
217 218
218 IFWL_ListBoxDP* pData = 219 IFWL_ListBox::DataProvider* pData =
219 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 220 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
220 if (!pItem) 221 if (!pItem)
221 return; 222 return;
222 223
223 pData->GetItemText(this, pItem, wsText); 224 pData->GetItemText(this, pItem, wsText);
224 } 225 }
225 226
226 CFWL_ListItem* IFWL_ListBox::GetItem(CFWL_ListItem* pItem, uint32_t dwKeyCode) { 227 CFWL_ListItem* IFWL_ListBox::GetItem(CFWL_ListItem* pItem, uint32_t dwKeyCode) {
227 CFWL_ListItem* hRet = nullptr; 228 CFWL_ListItem* hRet = nullptr;
228 switch (dwKeyCode) { 229 switch (dwKeyCode) {
229 case FWL_VKEY_Up: 230 case FWL_VKEY_Up:
230 case FWL_VKEY_Down: 231 case FWL_VKEY_Down:
231 case FWL_VKEY_Home: 232 case FWL_VKEY_Home:
232 case FWL_VKEY_End: { 233 case FWL_VKEY_End: {
233 const bool bUp = dwKeyCode == FWL_VKEY_Up; 234 const bool bUp = dwKeyCode == FWL_VKEY_Up;
234 const bool bDown = dwKeyCode == FWL_VKEY_Down; 235 const bool bDown = dwKeyCode == FWL_VKEY_Down;
235 const bool bHome = dwKeyCode == FWL_VKEY_Home; 236 const bool bHome = dwKeyCode == FWL_VKEY_Home;
236 IFWL_ListBoxDP* pData = 237 IFWL_ListBox::DataProvider* pData =
237 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 238 static_cast<IFWL_ListBox::DataProvider*>(
239 m_pProperties->m_pDataProvider);
238 int32_t iDstItem = -1; 240 int32_t iDstItem = -1;
239 if (bUp || bDown) { 241 if (bUp || bDown) {
240 int32_t index = pData->GetItemIndex(this, pItem); 242 int32_t index = pData->GetItemIndex(this, pItem);
241 iDstItem = dwKeyCode == FWL_VKEY_Up ? index - 1 : index + 1; 243 iDstItem = dwKeyCode == FWL_VKEY_Up ? index - 1 : index + 1;
242 } else if (bHome) { 244 } else if (bHome) {
243 iDstItem = 0; 245 iDstItem = 0;
244 } else { 246 } else {
245 int32_t iCount = pData->CountItems(this); 247 int32_t iCount = pData->CountItems(this);
246 iDstItem = iCount - 1; 248 iDstItem = iCount - 1;
247 } 249 }
248 hRet = pData->GetItem(this, iDstItem); 250 hRet = pData->GetItem(this, iDstItem);
249 break; 251 break;
250 } 252 }
251 default: 253 default:
252 break; 254 break;
253 } 255 }
254 return hRet; 256 return hRet;
255 } 257 }
256 258
257 void IFWL_ListBox::SetSelection(CFWL_ListItem* hStart, 259 void IFWL_ListBox::SetSelection(CFWL_ListItem* hStart,
258 CFWL_ListItem* hEnd, 260 CFWL_ListItem* hEnd,
259 bool bSelected) { 261 bool bSelected) {
260 IFWL_ListBoxDP* pData = 262 IFWL_ListBox::DataProvider* pData =
261 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 263 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
262 int32_t iStart = pData->GetItemIndex(this, hStart); 264 int32_t iStart = pData->GetItemIndex(this, hStart);
263 int32_t iEnd = pData->GetItemIndex(this, hEnd); 265 int32_t iEnd = pData->GetItemIndex(this, hEnd);
264 if (iStart > iEnd) { 266 if (iStart > iEnd) {
265 int32_t iTemp = iStart; 267 int32_t iTemp = iStart;
266 iStart = iEnd; 268 iStart = iEnd;
267 iEnd = iTemp; 269 iEnd = iTemp;
268 } 270 }
269 if (bSelected) { 271 if (bSelected) {
270 int32_t iCount = pData->CountItems(this); 272 int32_t iCount = pData->CountItems(this);
271 for (int32_t i = 0; i < iCount; i++) { 273 for (int32_t i = 0; i < iCount; i++) {
272 CFWL_ListItem* pItem = pData->GetItem(this, i); 274 CFWL_ListItem* pItem = pData->GetItem(this, i);
273 SetSelectionDirect(pItem, false); 275 SetSelectionDirect(pItem, false);
274 } 276 }
275 } 277 }
276 for (; iStart <= iEnd; iStart++) { 278 for (; iStart <= iEnd; iStart++) {
277 CFWL_ListItem* pItem = pData->GetItem(this, iStart); 279 CFWL_ListItem* pItem = pData->GetItem(this, iStart);
278 SetSelectionDirect(pItem, bSelected); 280 SetSelectionDirect(pItem, bSelected);
279 } 281 }
280 } 282 }
281 283
282 void IFWL_ListBox::SetSelectionDirect(CFWL_ListItem* pItem, bool bSelect) { 284 void IFWL_ListBox::SetSelectionDirect(CFWL_ListItem* pItem, bool bSelect) {
283 IFWL_ListBoxDP* pData = 285 IFWL_ListBox::DataProvider* pData =
284 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 286 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
285 uint32_t dwOldStyle = pData->GetItemStyles(this, pItem); 287 uint32_t dwOldStyle = pData->GetItemStyles(this, pItem);
286 bSelect ? dwOldStyle |= FWL_ITEMSTATE_LTB_Selected 288 bSelect ? dwOldStyle |= FWL_ITEMSTATE_LTB_Selected
287 : dwOldStyle &= ~FWL_ITEMSTATE_LTB_Selected; 289 : dwOldStyle &= ~FWL_ITEMSTATE_LTB_Selected;
288 pData->SetItemStyles(this, pItem, dwOldStyle); 290 pData->SetItemStyles(this, pItem, dwOldStyle);
289 } 291 }
290 292
291 bool IFWL_ListBox::IsItemSelected(CFWL_ListItem* pItem) { 293 bool IFWL_ListBox::IsItemSelected(CFWL_ListItem* pItem) {
292 IFWL_ListBoxDP* pData = 294 IFWL_ListBox::DataProvider* pData =
293 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 295 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
294 uint32_t dwState = pData->GetItemStyles(this, pItem); 296 uint32_t dwState = pData->GetItemStyles(this, pItem);
295 return (dwState & FWL_ITEMSTATE_LTB_Selected) != 0; 297 return (dwState & FWL_ITEMSTATE_LTB_Selected) != 0;
296 } 298 }
297 299
298 void IFWL_ListBox::ClearSelection() { 300 void IFWL_ListBox::ClearSelection() {
299 bool bMulti = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection; 301 bool bMulti = m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection;
300 IFWL_ListBoxDP* pData = 302 IFWL_ListBox::DataProvider* pData =
301 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 303 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
302 int32_t iCount = pData->CountItems(this); 304 int32_t iCount = pData->CountItems(this);
303 for (int32_t i = 0; i < iCount; i++) { 305 for (int32_t i = 0; i < iCount; i++) {
304 CFWL_ListItem* pItem = pData->GetItem(this, i); 306 CFWL_ListItem* pItem = pData->GetItem(this, i);
305 uint32_t dwState = pData->GetItemStyles(this, pItem); 307 uint32_t dwState = pData->GetItemStyles(this, pItem);
306 if (!(dwState & FWL_ITEMSTATE_LTB_Selected)) 308 if (!(dwState & FWL_ITEMSTATE_LTB_Selected))
307 continue; 309 continue;
308 SetSelectionDirect(pItem, false); 310 SetSelectionDirect(pItem, false);
309 if (!bMulti) 311 if (!bMulti)
310 return; 312 return;
311 } 313 }
312 } 314 }
313 315
314 void IFWL_ListBox::SelectAll() { 316 void IFWL_ListBox::SelectAll() {
315 if (!m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) 317 if (!m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection)
316 return; 318 return;
317 319
318 IFWL_ListBoxDP* pData = 320 IFWL_ListBox::DataProvider* pData =
319 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 321 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
320 int32_t iCount = pData->CountItems(this); 322 int32_t iCount = pData->CountItems(this);
321 if (iCount <= 0) 323 if (iCount <= 0)
322 return; 324 return;
323 325
324 CFWL_ListItem* pItemStart = pData->GetItem(this, 0); 326 CFWL_ListItem* pItemStart = pData->GetItem(this, 0);
325 CFWL_ListItem* pItemEnd = pData->GetItem(this, iCount - 1); 327 CFWL_ListItem* pItemEnd = pData->GetItem(this, iCount - 1);
326 SetSelection(pItemStart, pItemEnd, false); 328 SetSelection(pItemStart, pItemEnd, false);
327 } 329 }
328 330
329 CFWL_ListItem* IFWL_ListBox::GetFocusedItem() { 331 CFWL_ListItem* IFWL_ListBox::GetFocusedItem() {
330 IFWL_ListBoxDP* pData = 332 IFWL_ListBox::DataProvider* pData =
331 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 333 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
332 int32_t iCount = pData->CountItems(this); 334 int32_t iCount = pData->CountItems(this);
333 for (int32_t i = 0; i < iCount; i++) { 335 for (int32_t i = 0; i < iCount; i++) {
334 CFWL_ListItem* pItem = pData->GetItem(this, i); 336 CFWL_ListItem* pItem = pData->GetItem(this, i);
335 if (!pItem) 337 if (!pItem)
336 return nullptr; 338 return nullptr;
337 if (pData->GetItemStyles(this, pItem) & FWL_ITEMSTATE_LTB_Focused) 339 if (pData->GetItemStyles(this, pItem) & FWL_ITEMSTATE_LTB_Focused)
338 return pItem; 340 return pItem;
339 } 341 }
340 return nullptr; 342 return nullptr;
341 } 343 }
342 344
343 void IFWL_ListBox::SetFocusItem(CFWL_ListItem* pItem) { 345 void IFWL_ListBox::SetFocusItem(CFWL_ListItem* pItem) {
344 IFWL_ListBoxDP* pData = 346 IFWL_ListBox::DataProvider* pData =
345 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 347 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
346 CFWL_ListItem* hFocus = GetFocusedItem(); 348 CFWL_ListItem* hFocus = GetFocusedItem();
347 if (pItem == hFocus) 349 if (pItem == hFocus)
348 return; 350 return;
349 351
350 if (hFocus) { 352 if (hFocus) {
351 uint32_t dwStyle = pData->GetItemStyles(this, hFocus); 353 uint32_t dwStyle = pData->GetItemStyles(this, hFocus);
352 dwStyle &= ~FWL_ITEMSTATE_LTB_Focused; 354 dwStyle &= ~FWL_ITEMSTATE_LTB_Focused;
353 pData->SetItemStyles(this, hFocus, dwStyle); 355 pData->SetItemStyles(this, hFocus, dwStyle);
354 } 356 }
355 if (pItem) { 357 if (pItem) {
356 uint32_t dwStyle = pData->GetItemStyles(this, pItem); 358 uint32_t dwStyle = pData->GetItemStyles(this, pItem);
357 dwStyle |= FWL_ITEMSTATE_LTB_Focused; 359 dwStyle |= FWL_ITEMSTATE_LTB_Focused;
358 pData->SetItemStyles(this, pItem, dwStyle); 360 pData->SetItemStyles(this, pItem, dwStyle);
359 } 361 }
360 } 362 }
361 363
362 CFWL_ListItem* IFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) { 364 CFWL_ListItem* IFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
363 fx -= m_rtConent.left, fy -= m_rtConent.top; 365 fx -= m_rtConent.left, fy -= m_rtConent.top;
364 FX_FLOAT fPosX = 0.0f; 366 FX_FLOAT fPosX = 0.0f;
365 if (m_pHorzScrollBar) 367 if (m_pHorzScrollBar)
366 fPosX = m_pHorzScrollBar->GetPos(); 368 fPosX = m_pHorzScrollBar->GetPos();
367 369
368 FX_FLOAT fPosY = 0.0; 370 FX_FLOAT fPosY = 0.0;
369 if (m_pVertScrollBar) 371 if (m_pVertScrollBar)
370 fPosY = m_pVertScrollBar->GetPos(); 372 fPosY = m_pVertScrollBar->GetPos();
371 373
372 IFWL_ListBoxDP* pData = 374 IFWL_ListBox::DataProvider* pData =
373 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 375 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
374 int32_t nCount = pData->CountItems(this); 376 int32_t nCount = pData->CountItems(this);
375 for (int32_t i = 0; i < nCount; i++) { 377 for (int32_t i = 0; i < nCount; i++) {
376 CFWL_ListItem* pItem = pData->GetItem(this, i); 378 CFWL_ListItem* pItem = pData->GetItem(this, i);
377 if (!pItem) 379 if (!pItem)
378 continue; 380 continue;
379 381
380 CFX_RectF rtItem; 382 CFX_RectF rtItem;
381 pData->GetItemRect(this, pItem, rtItem); 383 pData->GetItemRect(this, pItem, rtItem);
382 rtItem.Offset(-fPosX, -fPosY); 384 rtItem.Offset(-fPosX, -fPosY);
383 if (rtItem.Contains(fx, fy)) 385 if (rtItem.Contains(fx, fy))
384 return pItem; 386 return pItem;
385 } 387 }
386 return nullptr; 388 return nullptr;
387 } 389 }
388 390
389 bool IFWL_ListBox::GetItemCheckRect(CFWL_ListItem* pItem, CFX_RectF& rtCheck) { 391 bool IFWL_ListBox::GetItemCheckRect(CFWL_ListItem* pItem, CFX_RectF& rtCheck) {
390 if (!m_pProperties->m_pDataProvider) 392 if (!m_pProperties->m_pDataProvider)
391 return false; 393 return false;
392 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) 394 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
393 return false; 395 return false;
394 396
395 IFWL_ListBoxDP* pData = 397 IFWL_ListBox::DataProvider* pData =
396 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 398 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
397 pData->GetItemCheckRect(this, pItem, rtCheck); 399 pData->GetItemCheckRect(this, pItem, rtCheck);
398 return true; 400 return true;
399 } 401 }
400 402
401 bool IFWL_ListBox::GetItemChecked(CFWL_ListItem* pItem) { 403 bool IFWL_ListBox::GetItemChecked(CFWL_ListItem* pItem) {
402 if (!m_pProperties->m_pDataProvider) 404 if (!m_pProperties->m_pDataProvider)
403 return false; 405 return false;
404 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) 406 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
405 return false; 407 return false;
406 408
407 IFWL_ListBoxDP* pData = 409 IFWL_ListBox::DataProvider* pData =
408 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 410 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
409 return !!(pData->GetItemCheckState(this, pItem) & FWL_ITEMSTATE_LTB_Checked); 411 return !!(pData->GetItemCheckState(this, pItem) & FWL_ITEMSTATE_LTB_Checked);
410 } 412 }
411 413
412 bool IFWL_ListBox::SetItemChecked(CFWL_ListItem* pItem, bool bChecked) { 414 bool IFWL_ListBox::SetItemChecked(CFWL_ListItem* pItem, bool bChecked) {
413 if (!m_pProperties->m_pDataProvider) 415 if (!m_pProperties->m_pDataProvider)
414 return false; 416 return false;
415 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check)) 417 if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check))
416 return false; 418 return false;
417 419
418 IFWL_ListBoxDP* pData = 420 IFWL_ListBox::DataProvider* pData =
419 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 421 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
420 pData->SetItemCheckState(this, pItem, 422 pData->SetItemCheckState(this, pItem,
421 bChecked ? FWL_ITEMSTATE_LTB_Checked : 0); 423 bChecked ? FWL_ITEMSTATE_LTB_Checked : 0);
422 return true; 424 return true;
423 } 425 }
424 426
425 bool IFWL_ListBox::ScrollToVisible(CFWL_ListItem* pItem) { 427 bool IFWL_ListBox::ScrollToVisible(CFWL_ListItem* pItem) {
426 if (!m_pVertScrollBar) 428 if (!m_pVertScrollBar)
427 return false; 429 return false;
428 430
429 CFX_RectF rtItem; 431 CFX_RectF rtItem;
430 IFWL_ListBoxDP* pData = 432 IFWL_ListBox::DataProvider* pData =
431 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 433 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
432 pData->GetItemRect(this, pItem, rtItem); 434 pData->GetItemRect(this, pItem, rtItem);
433 435
434 bool bScroll = false; 436 bool bScroll = false;
435 FX_FLOAT fPosY = m_pVertScrollBar->GetPos(); 437 FX_FLOAT fPosY = m_pVertScrollBar->GetPos();
436 rtItem.Offset(0, -fPosY + m_rtConent.top); 438 rtItem.Offset(0, -fPosY + m_rtConent.top);
437 if (rtItem.top < m_rtConent.top) { 439 if (rtItem.top < m_rtConent.top) {
438 fPosY += rtItem.top - m_rtConent.top; 440 fPosY += rtItem.top - m_rtConent.top;
439 bScroll = true; 441 bScroll = true;
440 } else if (rtItem.bottom() > m_rtConent.bottom()) { 442 } else if (rtItem.bottom() > m_rtConent.bottom()) {
441 fPosY += rtItem.bottom() - m_rtConent.bottom(); 443 fPosY += rtItem.bottom() - m_rtConent.bottom();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 fPosY = m_pVertScrollBar->GetPos(); 487 fPosY = m_pVertScrollBar->GetPos();
486 488
487 CFX_RectF rtView(m_rtConent); 489 CFX_RectF rtView(m_rtConent);
488 if (m_pHorzScrollBar) 490 if (m_pHorzScrollBar)
489 rtView.height -= m_fScorllBarWidth; 491 rtView.height -= m_fScorllBarWidth;
490 if (m_pVertScrollBar) 492 if (m_pVertScrollBar)
491 rtView.width -= m_fScorllBarWidth; 493 rtView.width -= m_fScorllBarWidth;
492 494
493 bool bMultiCol = 495 bool bMultiCol =
494 !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn); 496 !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn);
495 IFWL_ListBoxDP* pData = 497 IFWL_ListBox::DataProvider* pData =
496 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 498 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
497 int32_t iCount = pData->CountItems(this); 499 int32_t iCount = pData->CountItems(this);
498 for (int32_t i = 0; i < iCount; i++) { 500 for (int32_t i = 0; i < iCount; i++) {
499 CFWL_ListItem* pItem = pData->GetItem(this, i); 501 CFWL_ListItem* pItem = pData->GetItem(this, i);
500 if (!pItem) 502 if (!pItem)
501 continue; 503 continue;
502 504
503 CFX_RectF rtItem; 505 CFX_RectF rtItem;
504 pData->GetItemRect(this, pItem, rtItem); 506 pData->GetItemRect(this, pItem, rtItem);
505 rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY); 507 rtItem.Offset(m_rtConent.left - fPosX, m_rtConent.top - fPosY);
506 if (rtItem.bottom() < m_rtConent.top) 508 if (rtItem.bottom() < m_rtConent.top)
507 continue; 509 continue;
508 if (rtItem.top >= m_rtConent.bottom()) 510 if (rtItem.top >= m_rtConent.bottom())
509 break; 511 break;
510 if (bMultiCol && rtItem.left > m_rtConent.right()) 512 if (bMultiCol && rtItem.left > m_rtConent.right())
511 break; 513 break;
512 514
513 if (!(GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw)) 515 if (!(GetStylesEx() & FWL_STYLEEXT_LTB_OwnerDraw))
514 DrawItem(pGraphics, pTheme, pItem, i, rtItem, pMatrix); 516 DrawItem(pGraphics, pTheme, pItem, i, rtItem, pMatrix);
515 } 517 }
516 } 518 }
517 519
518 void IFWL_ListBox::DrawItem(CFX_Graphics* pGraphics, 520 void IFWL_ListBox::DrawItem(CFX_Graphics* pGraphics,
519 IFWL_ThemeProvider* pTheme, 521 IFWL_ThemeProvider* pTheme,
520 CFWL_ListItem* pItem, 522 CFWL_ListItem* pItem,
521 int32_t Index, 523 int32_t Index,
522 const CFX_RectF& rtItem, 524 const CFX_RectF& rtItem,
523 const CFX_Matrix* pMatrix) { 525 const CFX_Matrix* pMatrix) {
524 IFWL_ListBoxDP* pData = 526 IFWL_ListBox::DataProvider* pData =
525 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 527 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
526 uint32_t dwItemStyles = pData->GetItemStyles(this, pItem); 528 uint32_t dwItemStyles = pData->GetItemStyles(this, pItem);
527 uint32_t dwPartStates = CFWL_PartState_Normal; 529 uint32_t dwPartStates = CFWL_PartState_Normal;
528 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) 530 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
529 dwPartStates = CFWL_PartState_Disabled; 531 dwPartStates = CFWL_PartState_Disabled;
530 else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected) 532 else if (dwItemStyles & FWL_ITEMSTATE_LTB_Selected)
531 dwPartStates = CFWL_PartState_Selected; 533 dwPartStates = CFWL_PartState_Selected;
532 534
533 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused && 535 if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused &&
534 dwItemStyles & FWL_ITEMSTATE_LTB_Focused) { 536 dwItemStyles & FWL_ITEMSTATE_LTB_Focused) {
535 dwPartStates |= CFWL_PartState_Focused; 537 dwPartStates |= CFWL_PartState_Focused;
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 CFX_RectF* pUIMargin = static_cast<CFX_RectF*>( 630 CFX_RectF* pUIMargin = static_cast<CFX_RectF*>(
629 GetThemeCapacity(CFWL_WidgetCapacity::UIMargin)); 631 GetThemeCapacity(CFWL_WidgetCapacity::UIMargin));
630 if (pUIMargin) { 632 if (pUIMargin) {
631 m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width, 633 m_rtConent.Deflate(pUIMargin->left, pUIMargin->top, pUIMargin->width,
632 pUIMargin->height); 634 pUIMargin->height);
633 } 635 }
634 } 636 }
635 637
636 FX_FLOAT fWidth = 0; 638 FX_FLOAT fWidth = 0;
637 if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(this)) { 639 if (m_pProperties->m_pThemeProvider->IsCustomizedLayout(this)) {
638 IFWL_ListBoxDP* pData = 640 IFWL_ListBox::DataProvider* pData =
639 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 641 static_cast<IFWL_ListBox::DataProvider*>(
642 m_pProperties->m_pDataProvider);
640 int32_t iCount = pData->CountItems(this); 643 int32_t iCount = pData->CountItems(this);
641 for (int32_t i = 0; i < iCount; i++) { 644 for (int32_t i = 0; i < iCount; i++) {
642 CFWL_ListItem* pItem = pData->GetItem(this, i); 645 CFWL_ListItem* pItem = pData->GetItem(this, i);
643 if (!bAutoSize) { 646 if (!bAutoSize) {
644 CFX_RectF rtItem; 647 CFX_RectF rtItem;
645 rtItem.Set(m_rtClient.left, m_rtClient.top + fs.y, 0, 0); 648 rtItem.Set(m_rtClient.left, m_rtClient.top + fs.y, 0, 0);
646 IFWL_ListBoxDP* pBox = 649 IFWL_ListBox::DataProvider* pBox =
647 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 650 static_cast<IFWL_ListBox::DataProvider*>(
651 m_pProperties->m_pDataProvider);
648 pBox->SetItemRect(this, pItem, rtItem); 652 pBox->SetItemRect(this, pItem, rtItem);
649 } 653 }
650 if (fs.x < 0) { 654 if (fs.x < 0) {
651 fs.x = 0; 655 fs.x = 0;
652 fWidth = 0; 656 fWidth = 0;
653 } 657 }
654 } 658 }
655 } else { 659 } else {
656 fWidth = GetMaxTextWidth(); 660 fWidth = GetMaxTextWidth();
657 fWidth += 2 * kItemTextMargin; 661 fWidth += 2 * kItemTextMargin;
658 if (!bAutoSize) { 662 if (!bAutoSize) {
659 FX_FLOAT fActualWidth = 663 FX_FLOAT fActualWidth =
660 m_rtClient.width - rtUIMargin.left - rtUIMargin.width; 664 m_rtClient.width - rtUIMargin.left - rtUIMargin.width;
661 fWidth = std::max(fWidth, fActualWidth); 665 fWidth = std::max(fWidth, fActualWidth);
662 } 666 }
663 667
664 IFWL_ListBoxDP* pData = 668 IFWL_ListBox::DataProvider* pData =
665 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 669 static_cast<IFWL_ListBox::DataProvider*>(
670 m_pProperties->m_pDataProvider);
666 m_fItemHeight = CalcItemHeight(); 671 m_fItemHeight = CalcItemHeight();
667 if ((GetStylesEx() & FWL_STYLEEXT_LTB_Icon)) 672 if ((GetStylesEx() & FWL_STYLEEXT_LTB_Icon))
668 fWidth += m_fItemHeight; 673 fWidth += m_fItemHeight;
669 674
670 int32_t iCount = pData->CountItems(this); 675 int32_t iCount = pData->CountItems(this);
671 for (int32_t i = 0; i < iCount; i++) { 676 for (int32_t i = 0; i < iCount; i++) {
672 CFWL_ListItem* htem = pData->GetItem(this, i); 677 CFWL_ListItem* htem = pData->GetItem(this, i);
673 GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize); 678 GetItemSize(fs, htem, fWidth, m_fItemHeight, bAutoSize);
674 } 679 }
675 } 680 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 CFWL_ListItem* pItem, 773 CFWL_ListItem* pItem,
769 FX_FLOAT fWidth, 774 FX_FLOAT fWidth,
770 FX_FLOAT fItemHeight, 775 FX_FLOAT fItemHeight,
771 bool bAutoSize) { 776 bool bAutoSize) {
772 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn) 777 if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiColumn)
773 return; 778 return;
774 779
775 if (!bAutoSize) { 780 if (!bAutoSize) {
776 CFX_RectF rtItem; 781 CFX_RectF rtItem;
777 rtItem.Set(0, size.y, fWidth, fItemHeight); 782 rtItem.Set(0, size.y, fWidth, fItemHeight);
778 IFWL_ListBoxDP* pData = 783 IFWL_ListBox::DataProvider* pData =
779 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 784 static_cast<IFWL_ListBox::DataProvider*>(
785 m_pProperties->m_pDataProvider);
780 pData->SetItemRect(this, pItem, rtItem); 786 pData->SetItemRect(this, pItem, rtItem);
781 } 787 }
782 size.x = fWidth; 788 size.x = fWidth;
783 size.y += fItemHeight; 789 size.y += fItemHeight;
784 } 790 }
785 791
786 FX_FLOAT IFWL_ListBox::GetMaxTextWidth() { 792 FX_FLOAT IFWL_ListBox::GetMaxTextWidth() {
787 FX_FLOAT fRet = 0.0f; 793 FX_FLOAT fRet = 0.0f;
788 IFWL_ListBoxDP* pData = 794 IFWL_ListBox::DataProvider* pData =
789 static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider); 795 static_cast<IFWL_ListBox::DataProvider*>(m_pProperties->m_pDataProvider);
790 int32_t iCount = pData->CountItems(this); 796 int32_t iCount = pData->CountItems(this);
791 for (int32_t i = 0; i < iCount; i++) { 797 for (int32_t i = 0; i < iCount; i++) {
792 CFWL_ListItem* pItem = pData->GetItem(this, i); 798 CFWL_ListItem* pItem = pData->GetItem(this, i);
793 if (!pItem) 799 if (!pItem)
794 continue; 800 continue;
795 801
796 CFX_WideString wsText; 802 CFX_WideString wsText;
797 pData->GetItemText(this, pItem, wsText); 803 pData->GetItemText(this, pItem, wsText);
798 CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider); 804 CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider);
799 fRet = std::max(fRet, sz.x); 805 fRet = std::max(fRet, sz.x);
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 case FWL_SCBCODE::EndScroll: 1078 case FWL_SCBCODE::EndScroll:
1073 return false; 1079 return false;
1074 } 1080 }
1075 if (iCurPos != fPos) { 1081 if (iCurPos != fPos) {
1076 pScrollBar->SetPos(fPos); 1082 pScrollBar->SetPos(fPos);
1077 pScrollBar->SetTrackPos(fPos); 1083 pScrollBar->SetTrackPos(fPos);
1078 Repaint(&m_rtClient); 1084 Repaint(&m_rtClient);
1079 } 1085 }
1080 return true; 1086 return true;
1081 } 1087 }
OLDNEW
« no previous file with comments | « xfa/fwl/core/ifwl_listbox.h ('k') | xfa/fwl/core/ifwl_monthcalendar.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698