Chromium Code Reviews| 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/fxedit/include/fxet_list.h" | 7 #include "fpdfsdk/fxedit/include/fxet_list.h" |
| 8 | 8 |
| 9 #include "core/fpdfdoc/include/cpvt_word.h" | 9 #include "core/fpdfdoc/include/cpvt_word.h" |
| 10 #include "fpdfsdk/fxedit/include/fxet_edit.h" | 10 #include "fpdfsdk/fxedit/include/fxet_edit.h" |
| 11 #include "fpdfsdk/pdfwindow/PWL_ListBox.h" | |
| 11 | 12 |
| 12 CFX_ListItem::CFX_ListItem() | 13 CFX_ListItem::CFX_ListItem() |
| 13 : m_pEdit(IFX_Edit::NewEdit()), | 14 : m_pEdit(new CFX_Edit), |
| 14 m_bSelected(FALSE), | 15 m_bSelected(FALSE), |
| 15 m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { | 16 m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { |
| 16 m_pEdit->SetAlignmentV(1); | 17 m_pEdit->SetAlignmentV(1); |
| 17 m_pEdit->Initialize(); | 18 m_pEdit->Initialize(); |
| 18 } | 19 } |
| 19 | 20 |
| 20 CFX_ListItem::~CFX_ListItem() { | 21 CFX_ListItem::~CFX_ListItem() { |
| 21 IFX_Edit::DelEdit(m_pEdit); | |
| 22 } | 22 } |
| 23 | 23 |
| 24 void CFX_ListItem::SetFontMap(IPVT_FontMap* pFontMap) { | 24 void CFX_ListItem::SetFontMap(IPVT_FontMap* pFontMap) { |
| 25 m_pEdit->SetFontMap(pFontMap); | 25 m_pEdit->SetFontMap(pFontMap); |
| 26 } | 26 } |
| 27 | 27 |
| 28 IFX_Edit* CFX_ListItem::GetEdit() const { | 28 CFX_Edit* CFX_ListItem::GetEdit() const { |
| 29 return m_pEdit; | 29 return m_pEdit.get(); |
| 30 } | 30 } |
| 31 | 31 |
| 32 IFX_Edit_Iterator* CFX_ListItem::GetIterator() const { | 32 CFX_Edit_Iterator* CFX_ListItem::GetIterator() const { |
| 33 return m_pEdit->GetIterator(); | 33 return m_pEdit->GetIterator(); |
| 34 } | 34 } |
| 35 | 35 |
| 36 void CFX_ListItem::SetRect(const CLST_Rect& rect) { | 36 void CFX_ListItem::SetRect(const CLST_Rect& rect) { |
| 37 m_rcListItem = rect; | 37 m_rcListItem = rect; |
| 38 } | 38 } |
| 39 | 39 |
| 40 CLST_Rect CFX_ListItem::GetRect() const { | 40 CLST_Rect CFX_ListItem::GetRect() const { |
| 41 return m_rcListItem; | 41 return m_rcListItem; |
| 42 } | 42 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 56 void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { | 56 void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { |
| 57 m_pEdit->SetFontSize(fFontSize); | 57 m_pEdit->SetFontSize(fFontSize); |
| 58 } | 58 } |
| 59 | 59 |
| 60 FX_FLOAT CFX_ListItem::GetItemHeight() const { | 60 FX_FLOAT CFX_ListItem::GetItemHeight() const { |
| 61 return m_pEdit->GetContentRect().Height(); | 61 return m_pEdit->GetContentRect().Height(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 uint16_t CFX_ListItem::GetFirstChar() const { | 64 uint16_t CFX_ListItem::GetFirstChar() const { |
| 65 CPVT_Word word; | 65 CPVT_Word word; |
| 66 IFX_Edit_Iterator* pIterator = GetIterator(); | 66 CFX_Edit_Iterator* pIterator = GetIterator(); |
| 67 pIterator->SetAt(1); | 67 pIterator->SetAt(1); |
| 68 pIterator->GetWord(word); | 68 pIterator->GetWord(word); |
| 69 return word.Word; | 69 return word.Word; |
| 70 } | 70 } |
| 71 | 71 |
| 72 CFX_WideString CFX_ListItem::GetText() const { | 72 CFX_WideString CFX_ListItem::GetText() const { |
| 73 return m_pEdit->GetText(); | 73 return m_pEdit->GetText(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 CFX_ListContainer::CFX_ListContainer() {} | 76 CFX_ListContainer::CFX_ListContainer() {} |
| 77 | 77 |
| 78 CFX_ListContainer::~CFX_ListContainer() {} | 78 CFX_ListContainer::~CFX_ListContainer() {} |
| 79 | 79 |
| 80 void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) { | 80 void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) { |
| 81 m_rcPlate = rect; | 81 m_rcPlate = rect; |
| 82 } | 82 } |
| 83 | 83 |
| 84 CFX_List::CFX_List() | |
| 85 : m_fFontSize(0.0f), m_pFontMap(nullptr), m_bMultiple(FALSE) {} | |
| 86 | |
| 87 CFX_List::~CFX_List() { | |
| 88 Empty(); | |
| 89 } | |
| 90 | |
| 91 void CFX_List::Empty() { | |
| 92 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) | |
| 93 delete m_aListItems.GetAt(i); | |
| 94 | |
| 95 m_aListItems.RemoveAll(); | |
| 96 } | |
| 97 | |
| 98 void CFX_List::SetFontMap(IPVT_FontMap* pFontMap) { | |
| 99 m_pFontMap = pFontMap; | |
| 100 } | |
| 101 | |
| 102 void CFX_List::SetFontSize(FX_FLOAT fFontSize) { | |
| 103 m_fFontSize = fFontSize; | |
| 104 } | |
| 105 | |
| 106 void CFX_List::AddItem(const FX_WCHAR* str) { | |
| 107 CFX_ListItem* pListItem = new CFX_ListItem(); | |
| 108 pListItem->SetFontMap(m_pFontMap); | |
| 109 pListItem->SetFontSize(m_fFontSize); | |
| 110 pListItem->SetText(str); | |
| 111 m_aListItems.Add(pListItem); | |
| 112 } | |
| 113 | |
| 114 void CFX_List::ReArrange(int32_t nItemIndex) { | |
| 115 FX_FLOAT fPosY = 0.0f; | |
| 116 | |
| 117 if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) | |
| 118 fPosY = pPrevItem->GetRect().bottom; | |
| 119 | |
| 120 for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 121 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 122 FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); | |
| 123 pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); | |
| 124 fPosY += fListItemHeight; | |
| 125 } | |
| 126 } | |
| 127 | |
| 128 SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); | |
| 129 } | |
| 130 | |
| 131 IFX_Edit* CFX_List::GetItemEdit(int32_t nIndex) const { | |
| 132 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 133 return pListItem->GetEdit(); | |
| 134 } | |
| 135 | |
| 136 return nullptr; | |
| 137 } | |
| 138 | |
| 139 int32_t CFX_List::GetCount() const { | |
| 140 return m_aListItems.GetSize(); | |
| 141 } | |
| 142 | |
| 143 CFX_FloatRect CFX_List::GetPlateRect() const { | |
| 144 return CFX_ListContainer::GetPlateRect(); | |
| 145 } | |
| 146 | |
| 147 CFX_FloatRect CFX_List::GetContentRect() const { | |
| 148 return InnerToOuter(CFX_ListContainer::GetContentRect()); | |
| 149 } | |
| 150 | |
| 151 FX_FLOAT CFX_List::GetFontSize() const { | |
| 152 return m_fFontSize; | |
| 153 } | |
| 154 | |
| 155 int32_t CFX_List::GetItemIndex(const CFX_FloatPoint& point) const { | |
| 156 CFX_FloatPoint pt = OuterToInner(point); | |
| 157 | |
| 158 FX_BOOL bFirst = TRUE; | |
| 159 FX_BOOL bLast = TRUE; | |
| 160 | |
| 161 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 162 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 163 CLST_Rect rcListItem = pListItem->GetRect(); | |
| 164 | |
| 165 if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) { | |
| 166 bFirst = FALSE; | |
| 167 } | |
| 168 | |
| 169 if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) { | |
| 170 bLast = FALSE; | |
| 171 } | |
| 172 | |
| 173 if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { | |
| 174 return i; | |
| 175 } | |
| 176 } | |
| 177 } | |
| 178 | |
| 179 if (bFirst) | |
| 180 return 0; | |
| 181 if (bLast) | |
| 182 return m_aListItems.GetSize() - 1; | |
| 183 | |
| 184 return -1; | |
| 185 } | |
| 186 | |
| 187 FX_FLOAT CFX_List::GetFirstHeight() const { | |
| 188 if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { | |
| 189 return pListItem->GetItemHeight(); | |
| 190 } | |
| 191 | |
| 192 return 1.0f; | |
| 193 } | |
| 194 | |
| 195 int32_t CFX_List::GetFirstSelected() const { | |
| 196 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 197 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 198 if (pListItem->IsSelected()) | |
| 199 return i; | |
| 200 } | |
| 201 } | |
| 202 return -1; | |
| 203 } | |
| 204 | |
| 205 int32_t CFX_List::GetLastSelected() const { | |
| 206 for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) { | |
| 207 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 208 if (pListItem->IsSelected()) | |
| 209 return i; | |
| 210 } | |
| 211 } | |
| 212 return -1; | |
| 213 } | |
| 214 | |
| 215 FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const { | |
| 216 if ((c >= 'a') && (c <= 'z')) | |
| 217 c = c - ('a' - 'A'); | |
| 218 return c; | |
| 219 } | |
| 220 | |
| 221 int32_t CFX_List::FindNext(int32_t nIndex, FX_WCHAR nChar) const { | |
| 222 int32_t nCircleIndex = nIndex; | |
| 223 | |
| 224 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 225 nCircleIndex++; | |
| 226 if (nCircleIndex >= sz) | |
| 227 nCircleIndex = 0; | |
| 228 | |
| 229 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { | |
| 230 if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) | |
| 231 return nCircleIndex; | |
| 232 } | |
| 233 } | |
| 234 | |
| 235 return nCircleIndex; | |
| 236 } | |
| 237 | |
| 238 CFX_FloatRect CFX_List::GetItemRect(int32_t nIndex) const { | |
| 239 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 240 CFX_FloatRect rcItem = pListItem->GetRect(); | |
| 241 rcItem.left = 0.0f; | |
| 242 rcItem.right = GetPlateRect().Width(); | |
| 243 return InnerToOuter(CLST_Rect(rcItem)); | |
| 244 } | |
| 245 | |
| 246 return CFX_FloatRect(); | |
| 247 } | |
| 248 | |
| 249 FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const { | |
| 250 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) | |
| 251 return pListItem->IsSelected(); | |
| 252 return FALSE; | |
| 253 } | |
| 254 | |
| 255 void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) { | |
| 256 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { | |
| 257 pListItem->SetSelect(bSelected); | |
| 258 } | |
| 259 } | |
| 260 | |
| 261 void CFX_List::SetMultipleSel(FX_BOOL bMultiple) { | |
| 262 m_bMultiple = bMultiple; | |
| 263 } | |
| 264 | |
| 265 FX_BOOL CFX_List::IsMultipleSel() const { | |
| 266 return m_bMultiple; | |
| 267 } | |
| 268 | |
| 269 FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const { | |
| 270 return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); | |
| 271 } | |
| 272 | |
| 273 CFX_WideString CFX_List::GetItemText(int32_t nIndex) const { | |
| 274 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 275 return pListItem->GetText(); | |
| 276 } | |
| 277 | |
| 278 return L""; | |
| 279 } | |
| 280 | |
| 281 CPLST_Select::CPLST_Select() {} | 84 CPLST_Select::CPLST_Select() {} |
| 282 | 85 |
| 283 CPLST_Select::~CPLST_Select() { | 86 CPLST_Select::~CPLST_Select() { |
| 284 for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) | 87 for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++) |
| 285 delete m_aItems.GetAt(i); | 88 delete m_aItems.GetAt(i); |
| 286 | 89 |
| 287 m_aItems.RemoveAll(); | 90 m_aItems.RemoveAll(); |
| 288 } | 91 } |
| 289 | 92 |
| 290 void CPLST_Select::Add(int32_t nItemIndex) { | 93 void CPLST_Select::Add(int32_t nItemIndex) { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 379 delete pItem; | 182 delete pItem; |
| 380 m_aItems.RemoveAt(i); | 183 m_aItems.RemoveAt(i); |
| 381 } else { | 184 } else { |
| 382 pItem->nState = 0; | 185 pItem->nState = 0; |
| 383 } | 186 } |
| 384 } | 187 } |
| 385 } | 188 } |
| 386 } | 189 } |
| 387 | 190 |
| 388 CFX_ListCtrl::CFX_ListCtrl() | 191 CFX_ListCtrl::CFX_ListCtrl() |
| 389 : m_pNotify(nullptr), | 192 : m_bNotifyFlag(FALSE), |
| 390 m_bNotifyFlag(FALSE), | |
| 391 m_ptScrollPos(0.0f, 0.0f), | 193 m_ptScrollPos(0.0f, 0.0f), |
| 392 m_nSelItem(-1), | 194 m_nSelItem(-1), |
| 393 m_nFootIndex(-1), | 195 m_nFootIndex(-1), |
| 394 m_bCtrlSel(FALSE), | 196 m_bCtrlSel(FALSE), |
| 395 m_nCaretIndex(-1) {} | 197 m_nCaretIndex(-1), |
| 198 m_fFontSize(0.0f), | |
| 199 m_pFontMap(nullptr), | |
| 200 m_bMultiple(FALSE) {} | |
| 396 | 201 |
| 397 CFX_ListCtrl::~CFX_ListCtrl() {} | 202 CFX_ListCtrl::~CFX_ListCtrl() { |
| 203 Empty(); | |
| 204 } | |
| 398 | 205 |
| 399 void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) { | 206 void CFX_ListCtrl::SetNotify(CPWL_List_Notify* pNotify) { |
|
Lei Zhang
2016/07/12 21:36:46
Convert to unique_ptr?
dsinclair
2016/07/13 14:05:45
This is a mistake. The notify should not be owned
| |
| 400 m_pNotify = pNotify; | 207 m_pNotify.reset(pNotify); |
| 401 } | 208 } |
| 402 | 209 |
| 403 CFX_FloatPoint CFX_ListCtrl::InToOut(const CFX_FloatPoint& point) const { | 210 CFX_FloatPoint CFX_ListCtrl::InToOut(const CFX_FloatPoint& point) const { |
| 404 CFX_FloatRect rcPlate = GetPlateRect(); | 211 CFX_FloatRect rcPlate = GetPlateRect(); |
| 405 | 212 |
| 406 return CFX_FloatPoint(point.x - (m_ptScrollPos.x - rcPlate.left), | 213 return CFX_FloatPoint(point.x - (m_ptScrollPos.x - rcPlate.left), |
| 407 point.y - (m_ptScrollPos.y - rcPlate.top)); | 214 point.y - (m_ptScrollPos.y - rcPlate.top)); |
| 408 } | 215 } |
| 409 | 216 |
| 410 CFX_FloatPoint CFX_ListCtrl::OutToIn(const CFX_FloatPoint& point) const { | 217 CFX_FloatPoint CFX_ListCtrl::OutToIn(const CFX_FloatPoint& point) const { |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 | 366 |
| 560 void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) { | 367 void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) { |
| 561 CFX_ListContainer::SetPlateRect(rect); | 368 CFX_ListContainer::SetPlateRect(rect); |
| 562 m_ptScrollPos.x = rect.left; | 369 m_ptScrollPos.x = rect.left; |
| 563 SetScrollPos(CFX_FloatPoint(rect.left, rect.top)); | 370 SetScrollPos(CFX_FloatPoint(rect.left, rect.top)); |
| 564 ReArrange(0); | 371 ReArrange(0); |
| 565 InvalidateItem(-1); | 372 InvalidateItem(-1); |
| 566 } | 373 } |
| 567 | 374 |
| 568 CFX_FloatRect CFX_ListCtrl::GetItemRect(int32_t nIndex) const { | 375 CFX_FloatRect CFX_ListCtrl::GetItemRect(int32_t nIndex) const { |
| 569 return InToOut(CFX_List::GetItemRect(nIndex)); | 376 return InToOut(GetItemRectInternal(nIndex)); |
| 377 } | |
| 378 | |
| 379 CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const { | |
| 380 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 381 CFX_FloatRect rcItem = pListItem->GetRect(); | |
| 382 rcItem.left = 0.0f; | |
| 383 rcItem.right = GetPlateRect().Width(); | |
| 384 return InnerToOuter(CLST_Rect(rcItem)); | |
| 385 } | |
| 386 | |
| 387 return CFX_FloatRect(); | |
| 570 } | 388 } |
| 571 | 389 |
| 572 int32_t CFX_ListCtrl::GetCaret() const { | 390 int32_t CFX_ListCtrl::GetCaret() const { |
| 573 return m_nCaretIndex; | 391 return m_nCaretIndex; |
| 574 } | 392 } |
| 575 | 393 |
| 576 int32_t CFX_ListCtrl::GetSelect() const { | 394 int32_t CFX_ListCtrl::GetSelect() const { |
| 577 return m_nSelItem; | 395 return m_nSelItem; |
| 578 } | 396 } |
| 579 | 397 |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 688 CFX_FloatRect rcItem = GetItemRect(nItemIndex); | 506 CFX_FloatRect rcItem = GetItemRect(nItemIndex); |
| 689 | 507 |
| 690 return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; | 508 return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; |
| 691 } | 509 } |
| 692 | 510 |
| 693 void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { | 511 void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { |
| 694 if (!IsValid(nItemIndex)) | 512 if (!IsValid(nItemIndex)) |
| 695 return; | 513 return; |
| 696 | 514 |
| 697 CFX_FloatRect rcPlate = GetPlateRect(); | 515 CFX_FloatRect rcPlate = GetPlateRect(); |
| 698 CFX_FloatRect rcItem = CFX_List::GetItemRect(nItemIndex); | 516 CFX_FloatRect rcItem = GetItemRectInternal(nItemIndex); |
| 699 CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex); | 517 CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex); |
| 700 | 518 |
| 701 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { | 519 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { |
| 702 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { | 520 if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { |
| 703 SetScrollPosY(rcItem.bottom + rcPlate.Height()); | 521 SetScrollPosY(rcItem.bottom + rcPlate.Height()); |
| 704 } | 522 } |
| 705 } else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { | 523 } else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { |
| 706 if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { | 524 if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { |
| 707 SetScrollPosY(rcItem.top); | 525 SetScrollPosY(rcItem.top); |
| 708 } | 526 } |
| 709 } | 527 } |
| 710 } | 528 } |
| 711 | 529 |
| 712 void CFX_ListCtrl::SetScrollInfo() { | 530 void CFX_ListCtrl::SetScrollInfo() { |
| 713 if (m_pNotify) { | 531 if (m_pNotify) { |
| 714 CFX_FloatRect rcPlate = GetPlateRect(); | 532 CFX_FloatRect rcPlate = GetPlateRect(); |
| 715 CFX_FloatRect rcContent = CFX_List::GetContentRect(); | 533 CFX_FloatRect rcContent = GetContentRectInternal(); |
| 716 | 534 |
| 717 if (!m_bNotifyFlag) { | 535 if (!m_bNotifyFlag) { |
| 718 m_bNotifyFlag = TRUE; | 536 m_bNotifyFlag = TRUE; |
| 719 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, | 537 m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, |
| 720 rcContent.bottom, rcContent.top, | 538 rcContent.bottom, rcContent.top, |
| 721 GetFirstHeight(), rcPlate.Height()); | 539 GetFirstHeight(), rcPlate.Height()); |
| 722 m_bNotifyFlag = FALSE; | 540 m_bNotifyFlag = FALSE; |
| 723 } | 541 } |
| 724 } | 542 } |
| 725 } | 543 } |
| 726 | 544 |
| 727 void CFX_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) { | 545 void CFX_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) { |
| 728 SetScrollPosY(point.y); | 546 SetScrollPosY(point.y); |
| 729 } | 547 } |
| 730 | 548 |
| 731 void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { | 549 void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { |
| 732 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { | 550 if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { |
| 733 CFX_FloatRect rcPlate = GetPlateRect(); | 551 CFX_FloatRect rcPlate = GetPlateRect(); |
| 734 CFX_FloatRect rcContent = CFX_List::GetContentRect(); | 552 CFX_FloatRect rcContent = GetContentRectInternal(); |
| 735 | 553 |
| 736 if (rcPlate.Height() > rcContent.Height()) { | 554 if (rcPlate.Height() > rcContent.Height()) { |
| 737 fy = rcPlate.top; | 555 fy = rcPlate.top; |
| 738 } else { | 556 } else { |
| 739 if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { | 557 if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { |
| 740 fy = rcContent.bottom + rcPlate.Height(); | 558 fy = rcContent.bottom + rcPlate.Height(); |
| 741 } else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) { | 559 } else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) { |
| 742 fy = rcContent.top; | 560 fy = rcContent.top; |
| 743 } | 561 } |
| 744 } | 562 } |
| 745 | 563 |
| 746 m_ptScrollPos.y = fy; | 564 m_ptScrollPos.y = fy; |
| 747 InvalidateItem(-1); | 565 InvalidateItem(-1); |
| 748 | 566 |
| 749 if (m_pNotify) { | 567 if (m_pNotify) { |
| 750 if (!m_bNotifyFlag) { | 568 if (!m_bNotifyFlag) { |
| 751 m_bNotifyFlag = TRUE; | 569 m_bNotifyFlag = TRUE; |
| 752 m_pNotify->IOnSetScrollPosY(fy); | 570 m_pNotify->IOnSetScrollPosY(fy); |
| 753 m_bNotifyFlag = FALSE; | 571 m_bNotifyFlag = FALSE; |
| 754 } | 572 } |
| 755 } | 573 } |
| 756 } | 574 } |
| 757 } | 575 } |
| 758 | 576 |
| 577 CFX_FloatRect CFX_ListCtrl::GetContentRectInternal() const { | |
| 578 return InnerToOuter(CFX_ListContainer::GetContentRect()); | |
| 579 } | |
| 580 | |
| 759 CFX_FloatRect CFX_ListCtrl::GetContentRect() const { | 581 CFX_FloatRect CFX_ListCtrl::GetContentRect() const { |
| 760 return InToOut(CFX_List::GetContentRect()); | 582 return InToOut(GetContentRectInternal()); |
| 761 } | 583 } |
| 762 | 584 |
| 763 void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { | 585 void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { |
| 764 CFX_List::ReArrange(nItemIndex); | 586 FX_FLOAT fPosY = 0.0f; |
| 587 | |
| 588 if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) | |
| 589 fPosY = pPrevItem->GetRect().bottom; | |
| 590 | |
| 591 for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 592 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 593 FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); | |
| 594 pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); | |
| 595 fPosY += fListItemHeight; | |
| 596 } | |
| 597 } | |
| 598 | |
| 599 SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); | |
| 765 SetScrollInfo(); | 600 SetScrollInfo(); |
| 766 } | 601 } |
| 767 | 602 |
| 768 void CFX_ListCtrl::SetTopItem(int32_t nIndex) { | 603 void CFX_ListCtrl::SetTopItem(int32_t nIndex) { |
| 769 if (IsValid(nIndex)) { | 604 if (IsValid(nIndex)) { |
| 770 GetPlateRect(); | 605 GetPlateRect(); |
| 771 CFX_FloatRect rcItem = CFX_List::GetItemRect(nIndex); | 606 CFX_FloatRect rcItem = GetItemRectInternal(nIndex); |
| 772 SetScrollPosY(rcItem.top); | 607 SetScrollPosY(rcItem.top); |
| 773 } | 608 } |
| 774 } | 609 } |
| 775 | 610 |
| 776 int32_t CFX_ListCtrl::GetTopItem() const { | 611 int32_t CFX_ListCtrl::GetTopItem() const { |
| 777 int32_t nItemIndex = GetItemIndex(GetBTPoint()); | 612 int32_t nItemIndex = GetItemIndex(GetBTPoint()); |
| 778 | 613 |
| 779 if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) | 614 if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) |
| 780 nItemIndex += 1; | 615 nItemIndex += 1; |
| 781 | 616 |
| 782 return nItemIndex; | 617 return nItemIndex; |
| 783 } | 618 } |
| 784 | 619 |
| 785 void CFX_ListCtrl::Empty() { | 620 void CFX_ListCtrl::Empty() { |
|
Lei Zhang
2016/07/12 21:36:46
Can we rename these to Clear() later?
dsinclair
2016/07/13 14:05:45
Acknowledged.
| |
| 786 CFX_List::Empty(); | 621 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) |
| 622 delete m_aListItems.GetAt(i); | |
| 623 | |
| 624 m_aListItems.RemoveAll(); | |
| 625 | |
| 787 InvalidateItem(-1); | 626 InvalidateItem(-1); |
| 788 } | 627 } |
| 789 | 628 |
| 790 void CFX_ListCtrl::Cancel() { | 629 void CFX_ListCtrl::Cancel() { |
| 791 m_aSelItems.DeselectAll(); | 630 m_aSelItems.DeselectAll(); |
| 792 } | 631 } |
| 793 | 632 |
| 794 int32_t CFX_ListCtrl::GetItemIndex(const CFX_FloatPoint& point) const { | 633 int32_t CFX_ListCtrl::GetItemIndex(const CFX_FloatPoint& point) const { |
| 795 return CFX_List::GetItemIndex(OutToIn(point)); | 634 CFX_FloatPoint pt = OuterToInner(OutToIn(point)); |
| 635 | |
| 636 FX_BOOL bFirst = TRUE; | |
| 637 FX_BOOL bLast = TRUE; | |
| 638 | |
| 639 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 640 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 641 CLST_Rect rcListItem = pListItem->GetRect(); | |
| 642 | |
| 643 if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) { | |
| 644 bFirst = FALSE; | |
| 645 } | |
| 646 | |
| 647 if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) { | |
| 648 bLast = FALSE; | |
| 649 } | |
| 650 | |
| 651 if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { | |
| 652 return i; | |
| 653 } | |
| 654 } | |
| 655 } | |
| 656 | |
| 657 if (bFirst) | |
| 658 return 0; | |
| 659 if (bLast) | |
| 660 return m_aListItems.GetSize() - 1; | |
| 661 | |
| 662 return -1; | |
| 796 } | 663 } |
| 797 | 664 |
| 798 CFX_WideString CFX_ListCtrl::GetText() const { | 665 CFX_WideString CFX_ListCtrl::GetText() const { |
| 799 if (IsMultipleSel()) | 666 if (IsMultipleSel()) |
| 800 return GetItemText(m_nCaretIndex); | 667 return GetItemText(m_nCaretIndex); |
| 801 return GetItemText(m_nSelItem); | 668 return GetItemText(m_nSelItem); |
| 802 } | 669 } |
| 670 | |
| 671 void CFX_ListCtrl::SetFontMap(IPVT_FontMap* pFontMap) { | |
| 672 m_pFontMap = pFontMap; | |
| 673 } | |
| 674 | |
| 675 void CFX_ListCtrl::SetFontSize(FX_FLOAT fFontSize) { | |
| 676 m_fFontSize = fFontSize; | |
| 677 } | |
| 678 | |
| 679 void CFX_ListCtrl::AddItem(const FX_WCHAR* str) { | |
| 680 CFX_ListItem* pListItem = new CFX_ListItem(); | |
| 681 pListItem->SetFontMap(m_pFontMap); | |
| 682 pListItem->SetFontSize(m_fFontSize); | |
| 683 pListItem->SetText(str); | |
| 684 m_aListItems.Add(pListItem); | |
| 685 } | |
| 686 | |
| 687 CFX_Edit* CFX_ListCtrl::GetItemEdit(int32_t nIndex) const { | |
| 688 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 689 return pListItem->GetEdit(); | |
| 690 } | |
| 691 | |
| 692 return nullptr; | |
| 693 } | |
| 694 | |
| 695 int32_t CFX_ListCtrl::GetCount() const { | |
| 696 return m_aListItems.GetSize(); | |
| 697 } | |
| 698 | |
| 699 CFX_FloatRect CFX_ListCtrl::GetPlateRect() const { | |
| 700 return CFX_ListContainer::GetPlateRect(); | |
| 701 } | |
| 702 | |
| 703 FX_FLOAT CFX_ListCtrl::GetFontSize() const { | |
| 704 return m_fFontSize; | |
| 705 } | |
| 706 | |
| 707 FX_FLOAT CFX_ListCtrl::GetFirstHeight() const { | |
| 708 if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { | |
| 709 return pListItem->GetItemHeight(); | |
| 710 } | |
| 711 | |
| 712 return 1.0f; | |
| 713 } | |
| 714 | |
| 715 int32_t CFX_ListCtrl::GetFirstSelected() const { | |
| 716 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 717 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 718 if (pListItem->IsSelected()) | |
| 719 return i; | |
| 720 } | |
| 721 } | |
| 722 return -1; | |
| 723 } | |
| 724 | |
| 725 int32_t CFX_ListCtrl::GetLastSelected() const { | |
| 726 for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) { | |
| 727 if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { | |
| 728 if (pListItem->IsSelected()) | |
| 729 return i; | |
| 730 } | |
| 731 } | |
| 732 return -1; | |
| 733 } | |
| 734 | |
| 735 FX_WCHAR CFX_ListCtrl::Toupper(FX_WCHAR c) const { | |
| 736 if ((c >= 'a') && (c <= 'z')) | |
| 737 c = c - ('a' - 'A'); | |
| 738 return c; | |
| 739 } | |
| 740 | |
| 741 int32_t CFX_ListCtrl::FindNext(int32_t nIndex, FX_WCHAR nChar) const { | |
| 742 int32_t nCircleIndex = nIndex; | |
| 743 | |
| 744 for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { | |
| 745 nCircleIndex++; | |
| 746 if (nCircleIndex >= sz) | |
| 747 nCircleIndex = 0; | |
| 748 | |
| 749 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { | |
| 750 if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) | |
| 751 return nCircleIndex; | |
| 752 } | |
| 753 } | |
| 754 | |
| 755 return nCircleIndex; | |
| 756 } | |
| 757 | |
| 758 FX_BOOL CFX_ListCtrl::IsItemSelected(int32_t nIndex) const { | |
| 759 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) | |
| 760 return pListItem->IsSelected(); | |
| 761 return FALSE; | |
| 762 } | |
| 763 | |
| 764 void CFX_ListCtrl::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) { | |
| 765 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { | |
| 766 pListItem->SetSelect(bSelected); | |
| 767 } | |
| 768 } | |
| 769 | |
| 770 void CFX_ListCtrl::SetMultipleSel(FX_BOOL bMultiple) { | |
| 771 m_bMultiple = bMultiple; | |
| 772 } | |
| 773 | |
| 774 FX_BOOL CFX_ListCtrl::IsMultipleSel() const { | |
| 775 return m_bMultiple; | |
| 776 } | |
| 777 | |
| 778 FX_BOOL CFX_ListCtrl::IsValid(int32_t nItemIndex) const { | |
| 779 return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); | |
| 780 } | |
| 781 | |
| 782 CFX_WideString CFX_ListCtrl::GetItemText(int32_t nIndex) const { | |
| 783 if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { | |
| 784 return pListItem->GetText(); | |
| 785 } | |
| 786 | |
| 787 return L""; | |
| 788 } | |
| OLD | NEW |