Index: fpdfsdk/src/fxedit/fxet_list.cpp |
diff --git a/fpdfsdk/src/fxedit/fxet_list.cpp b/fpdfsdk/src/fxedit/fxet_list.cpp |
index 64ed694d1289ae218d6e05584861949b1d17767a..939af1b0716f04b333e37bc313c95a1bf18d0434 100644 |
--- a/fpdfsdk/src/fxedit/fxet_list.cpp |
+++ b/fpdfsdk/src/fxedit/fxet_list.cpp |
@@ -1,1012 +1,843 @@ |
// Copyright 2014 PDFium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
- |
+ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
#include "../../include/fxedit/fxet_stub.h" |
#include "../../include/fxedit/fxet_edit.h" |
#include "../../include/fxedit/fxet_list.h" |
-/* ------------------------------- CFX_ListItem ---------------------------------- */ |
+/* ------------------------------- CFX_ListItem |
+ * ---------------------------------- */ |
-CFX_ListItem::CFX_ListItem() : m_pEdit(NULL), |
- m_bSelected(FALSE), |
- m_bCaret(FALSE), |
- m_rcListItem(0.0f,0.0f,0.0f,0.0f) |
-{ |
- m_pEdit = IFX_Edit::NewEdit(); |
- ASSERT(m_pEdit != NULL); |
+CFX_ListItem::CFX_ListItem() |
+ : m_pEdit(NULL), |
+ m_bSelected(FALSE), |
+ m_bCaret(FALSE), |
+ m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { |
+ m_pEdit = IFX_Edit::NewEdit(); |
+ ASSERT(m_pEdit != NULL); |
- m_pEdit->SetAlignmentV(1); |
- m_pEdit->Initialize(); |
+ m_pEdit->SetAlignmentV(1); |
+ m_pEdit->Initialize(); |
} |
-CFX_ListItem::~CFX_ListItem() |
-{ |
- IFX_Edit::DelEdit(m_pEdit); |
+CFX_ListItem::~CFX_ListItem() { |
+ IFX_Edit::DelEdit(m_pEdit); |
} |
-void CFX_ListItem::SetFontMap(IFX_Edit_FontMap * pFontMap) |
-{ |
- if (m_pEdit) |
- m_pEdit->SetFontMap(pFontMap); |
+void CFX_ListItem::SetFontMap(IFX_Edit_FontMap* pFontMap) { |
+ if (m_pEdit) |
+ m_pEdit->SetFontMap(pFontMap); |
} |
-IFX_Edit* CFX_ListItem::GetEdit() const |
-{ |
- return m_pEdit; |
+IFX_Edit* CFX_ListItem::GetEdit() const { |
+ return m_pEdit; |
} |
-IFX_Edit_Iterator* CFX_ListItem::GetIterator() const |
-{ |
- if (m_pEdit) |
- return m_pEdit->GetIterator(); |
+IFX_Edit_Iterator* CFX_ListItem::GetIterator() const { |
+ if (m_pEdit) |
+ return m_pEdit->GetIterator(); |
- return NULL; |
+ return NULL; |
} |
-void CFX_ListItem::SetRect(const CLST_Rect & rect) |
-{ |
- m_rcListItem = rect; |
+void CFX_ListItem::SetRect(const CLST_Rect& rect) { |
+ m_rcListItem = rect; |
} |
-CLST_Rect CFX_ListItem::GetRect() const |
-{ |
- return m_rcListItem; |
+CLST_Rect CFX_ListItem::GetRect() const { |
+ return m_rcListItem; |
} |
-FX_BOOL CFX_ListItem::IsSelected() const |
-{ |
- return m_bSelected; |
+FX_BOOL CFX_ListItem::IsSelected() const { |
+ return m_bSelected; |
} |
-void CFX_ListItem::SetSelect(FX_BOOL bSelected) |
-{ |
- m_bSelected = bSelected; |
+void CFX_ListItem::SetSelect(FX_BOOL bSelected) { |
+ m_bSelected = bSelected; |
} |
-FX_BOOL CFX_ListItem::IsCaret() const |
-{ |
- return m_bCaret; |
+FX_BOOL CFX_ListItem::IsCaret() const { |
+ return m_bCaret; |
} |
-void CFX_ListItem::SetCaret(FX_BOOL bCaret) |
-{ |
- m_bCaret = bCaret; |
+void CFX_ListItem::SetCaret(FX_BOOL bCaret) { |
+ m_bCaret = bCaret; |
} |
-void CFX_ListItem::SetText(FX_LPCWSTR text) |
-{ |
- if (m_pEdit) |
- m_pEdit->SetText(text); |
+void CFX_ListItem::SetText(FX_LPCWSTR text) { |
+ if (m_pEdit) |
+ m_pEdit->SetText(text); |
} |
-void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) |
-{ |
- if (m_pEdit) |
- m_pEdit->SetFontSize(fFontSize); |
+void CFX_ListItem::SetFontSize(FX_FLOAT fFontSize) { |
+ if (m_pEdit) |
+ m_pEdit->SetFontSize(fFontSize); |
} |
-FX_FLOAT CFX_ListItem::GetItemHeight() const |
-{ |
- if (m_pEdit) |
- return m_pEdit->GetContentRect().Height(); |
+FX_FLOAT CFX_ListItem::GetItemHeight() const { |
+ if (m_pEdit) |
+ return m_pEdit->GetContentRect().Height(); |
- return 0.0f; |
+ return 0.0f; |
} |
-FX_WORD CFX_ListItem::GetFirstChar() const |
-{ |
- CPVT_Word word; |
+FX_WORD CFX_ListItem::GetFirstChar() const { |
+ CPVT_Word word; |
- if (IFX_Edit_Iterator* pIterator = GetIterator()) |
- { |
- pIterator->SetAt(1); |
- pIterator->GetWord(word); |
- } |
+ if (IFX_Edit_Iterator* pIterator = GetIterator()) { |
+ pIterator->SetAt(1); |
+ pIterator->GetWord(word); |
+ } |
- return word.Word; |
+ return word.Word; |
} |
-CFX_WideString CFX_ListItem::GetText() const |
-{ |
- if (m_pEdit) |
- return m_pEdit->GetText(); |
+CFX_WideString CFX_ListItem::GetText() const { |
+ if (m_pEdit) |
+ return m_pEdit->GetText(); |
- return L""; |
+ return L""; |
} |
-/* ------------------------------------ CFX_List --------------------------------- */ |
+/* ------------------------------------ CFX_List |
+ * --------------------------------- */ |
+ |
+CFX_List::CFX_List() : m_fFontSize(0.0f), m_pFontMap(NULL), m_bMultiple(FALSE) { |
+} |
-CFX_List::CFX_List() : m_fFontSize(0.0f), m_pFontMap(NULL), m_bMultiple(FALSE) |
-{ |
+CFX_List::~CFX_List() { |
+ Empty(); |
} |
-CFX_List::~CFX_List() |
-{ |
- Empty(); |
+void CFX_List::Empty() { |
+ for (FX_INT32 i = 0, sz = m_aListItems.GetSize(); i < sz; i++) |
+ delete m_aListItems.GetAt(i); |
+ |
+ m_aListItems.RemoveAll(); |
} |
-void CFX_List::Empty() |
-{ |
- for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++) |
- delete m_aListItems.GetAt(i); |
+void CFX_List::SetFontMap(IFX_Edit_FontMap* pFontMap) { |
+ m_pFontMap = pFontMap; |
+} |
- m_aListItems.RemoveAll(); |
+void CFX_List::SetFontSize(FX_FLOAT fFontSize) { |
+ m_fFontSize = fFontSize; |
} |
-void CFX_List::SetFontMap(IFX_Edit_FontMap * pFontMap) |
-{ |
- m_pFontMap = pFontMap; |
+void CFX_List::AddItem(FX_LPCWSTR str) { |
+ if (CFX_ListItem* pListItem = new CFX_ListItem()) { |
+ pListItem->SetFontMap(m_pFontMap); |
+ pListItem->SetFontSize(m_fFontSize); |
+ pListItem->SetText(str); |
+ m_aListItems.Add(pListItem); |
+ } |
} |
-void CFX_List::SetFontSize(FX_FLOAT fFontSize) |
-{ |
- m_fFontSize = fFontSize; |
+void CFX_List::ReArrange(FX_INT32 nItemIndex) { |
+ FX_FLOAT fPosY = 0.0f; |
+ |
+ if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) |
+ fPosY = pPrevItem->GetRect().bottom; |
+ |
+ for (FX_INT32 i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
+ FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); |
+ pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight)); |
+ fPosY += fListItemHeight; |
+ } |
+ } |
+ |
+ SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY)); |
+} |
+ |
+IFX_Edit* CFX_List::GetItemEdit(FX_INT32 nIndex) const { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
+ return pListItem->GetEdit(); |
+ } |
+ |
+ return NULL; |
} |
-void CFX_List::AddItem(FX_LPCWSTR str) |
-{ |
- if (CFX_ListItem * pListItem = new CFX_ListItem()) |
- { |
- pListItem->SetFontMap(m_pFontMap); |
- pListItem->SetFontSize(m_fFontSize); |
- pListItem->SetText(str); |
- m_aListItems.Add(pListItem); |
- } |
+FX_INT32 CFX_List::GetCount() const { |
+ return m_aListItems.GetSize(); |
} |
-void CFX_List::ReArrange(FX_INT32 nItemIndex) |
-{ |
- FX_FLOAT fPosY = 0.0f; |
+CPDF_Rect CFX_List::GetPlateRect() const { |
+ return CFX_ListContainer::GetPlateRect(); |
+} |
- if (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1)) |
- fPosY = pPrevItem->GetRect().bottom; |
- |
- for (FX_INT32 i=nItemIndex,sz=m_aListItems.GetSize(); i<sz; i++) |
- { |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) |
- { |
- FX_FLOAT fListItemHeight = pListItem->GetItemHeight(); |
- pListItem->SetRect(CLST_Rect(0.0f,fPosY,0.0f,fPosY + fListItemHeight)); |
- fPosY += fListItemHeight; |
- } |
- } |
+CPDF_Rect CFX_List::GetContentRect() const { |
+ return InnerToOuter(CFX_ListContainer::GetContentRect()); |
+} |
- SetContentRect(CLST_Rect(0.0f,0.0f,0.0f,fPosY)); |
+FX_FLOAT CFX_List::GetFontSize() const { |
+ return m_fFontSize; |
} |
-IFX_Edit * CFX_List::GetItemEdit(FX_INT32 nIndex) const |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) |
- { |
- return pListItem->GetEdit(); |
- } |
+FX_INT32 CFX_List::GetItemIndex(const CPDF_Point& point) const { |
+ CPDF_Point pt = OuterToInner(point); |
+ |
+ FX_BOOL bFirst = TRUE; |
+ FX_BOOL bLast = TRUE; |
+ |
+ for (FX_INT32 i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
+ CLST_Rect rcListItem = pListItem->GetRect(); |
+ |
+ if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) { |
+ bFirst = FALSE; |
+ } |
+ |
+ if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) { |
+ bLast = FALSE; |
+ } |
- return NULL; |
+ if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) { |
+ return i; |
+ } |
+ } |
+ } |
+ |
+ if (bFirst) |
+ return 0; |
+ if (bLast) |
+ return m_aListItems.GetSize() - 1; |
+ |
+ return -1; |
} |
-FX_INT32 CFX_List::GetCount() const |
-{ |
- return m_aListItems.GetSize(); |
+FX_FLOAT CFX_List::GetFirstHeight() const { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) { |
+ return pListItem->GetItemHeight(); |
+ } |
+ |
+ return 1.0f; |
} |
-CPDF_Rect CFX_List::GetPlateRect() const |
-{ |
- return CFX_ListContainer::GetPlateRect(); |
+FX_INT32 CFX_List::GetFirstSelected() const { |
+ for (FX_INT32 i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
+ if (pListItem->IsSelected()) |
+ return i; |
+ } |
+ } |
+ return -1; |
} |
-CPDF_Rect CFX_List::GetContentRect() const |
-{ |
- return InnerToOuter(CFX_ListContainer::GetContentRect()); |
+FX_INT32 CFX_List::GetLastSelected() const { |
+ for (FX_INT32 i = m_aListItems.GetSize() - 1; i >= 0; i--) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) { |
+ if (pListItem->IsSelected()) |
+ return i; |
+ } |
+ } |
+ return -1; |
} |
-FX_FLOAT CFX_List::GetFontSize() const |
-{ |
- return m_fFontSize; |
+FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const { |
+ if ((c >= 'a') && (c <= 'z')) |
+ c = c - ('a' - 'A'); |
+ return c; |
} |
-FX_INT32 CFX_List::GetItemIndex(const CPDF_Point & point) const |
-{ |
- CPDF_Point pt = OuterToInner(point); |
+FX_INT32 CFX_List::FindNext(FX_INT32 nIndex, FX_WCHAR nChar) const { |
+ FX_INT32 nCircleIndex = nIndex; |
- FX_BOOL bFirst = TRUE; |
- FX_BOOL bLast = TRUE; |
+ for (FX_INT32 i = 0, sz = m_aListItems.GetSize(); i < sz; i++) { |
+ nCircleIndex++; |
+ if (nCircleIndex >= sz) |
+ nCircleIndex = 0; |
- for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++) |
- { |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) |
- { |
- CLST_Rect rcListItem = pListItem->GetRect(); |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) { |
+ if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) |
+ return nCircleIndex; |
+ } |
+ } |
+ |
+ return nCircleIndex; |
+} |
- if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top)) |
- { |
- bFirst = FALSE; |
- } |
+CPDF_Rect CFX_List::GetItemRect(FX_INT32 nIndex) const { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
+ CPDF_Rect rcItem = pListItem->GetRect(); |
+ rcItem.left = 0.0f; |
+ rcItem.right = GetPlateRect().Width(); |
+ return InnerToOuter(rcItem); |
+ } |
- if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom)) |
- { |
- bLast = FALSE; |
- } |
+ return CPDF_Rect(); |
+} |
- if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) |
- { |
- return i; |
- } |
- } |
- } |
+FX_BOOL CFX_List::IsItemSelected(FX_INT32 nIndex) const { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
+ return pListItem->IsSelected(); |
+ } |
- if (bFirst) return 0; |
- if (bLast) return m_aListItems.GetSize()-1; |
+ return FALSE; |
+} |
- return -1; |
+void CFX_List::SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { |
+ pListItem->SetSelect(bSelected); |
+ } |
} |
-FX_FLOAT CFX_List::GetFirstHeight() const |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(0)) |
- { |
- return pListItem->GetItemHeight(); |
- } |
+void CFX_List::SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret) { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) { |
+ pListItem->SetCaret(bCaret); |
+ } |
+} |
- return 1.0f; |
+void CFX_List::SetMultipleSel(FX_BOOL bMultiple) { |
+ m_bMultiple = bMultiple; |
} |
-FX_INT32 CFX_List::GetFirstSelected() const |
-{ |
- for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++) |
- { |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) |
- { |
- if (pListItem->IsSelected()) |
- return i; |
- } |
- } |
- return -1; |
+FX_BOOL CFX_List::IsMultipleSel() const { |
+ return m_bMultiple; |
} |
-FX_INT32 CFX_List::GetLastSelected() const |
-{ |
- for (FX_INT32 i=m_aListItems.GetSize()-1; i>=0; i--) |
- { |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(i)) |
- { |
- if (pListItem->IsSelected()) |
- return i; |
- } |
- } |
- return -1; |
+FX_BOOL CFX_List::IsValid(FX_INT32 nItemIndex) const { |
+ return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); |
} |
-FX_WCHAR CFX_List::Toupper(FX_WCHAR c) const |
-{ |
- if ( (c >= 'a') && (c <= 'z') ) |
- c = c - ('a' - 'A'); |
- return c; |
+CFX_WideString CFX_List::GetItemText(FX_INT32 nIndex) const { |
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) { |
+ return pListItem->GetText(); |
+ } |
+ |
+ return L""; |
} |
-FX_INT32 CFX_List::FindNext(FX_INT32 nIndex,FX_WCHAR nChar) const |
-{ |
- FX_INT32 nCircleIndex = nIndex; |
+/* ------------------------------------ CPLST_Select |
+ * ---------------------------------- */ |
- for (FX_INT32 i=0,sz=m_aListItems.GetSize(); i<sz; i++) |
- { |
- nCircleIndex ++; |
- if (nCircleIndex >= sz) nCircleIndex = 0; |
+CPLST_Select::CPLST_Select() { |
+} |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nCircleIndex)) |
- { |
- if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar)) |
- return nCircleIndex; |
- } |
- } |
+CPLST_Select::~CPLST_Select() { |
+ for (FX_INT32 i = 0, sz = m_aItems.GetSize(); i < sz; i++) |
+ delete m_aItems.GetAt(i); |
- return nCircleIndex; |
+ m_aItems.RemoveAll(); |
} |
-CPDF_Rect CFX_List::GetItemRect(FX_INT32 nIndex) const |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) |
- { |
- CPDF_Rect rcItem = pListItem->GetRect(); |
- rcItem.left = 0.0f; |
- rcItem.right = GetPlateRect().Width(); |
- return InnerToOuter(rcItem); |
- } |
+void CPLST_Select::Add(FX_INT32 nItemIndex) { |
+ FX_INT32 nIndex = Find(nItemIndex); |
- return CPDF_Rect(); |
+ if (nIndex < 0) |
+ m_aItems.Add(new CPLST_Select_Item(nItemIndex, 1)); |
+ else { |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) { |
+ pItem->nState = 1; |
+ } |
+ } |
} |
-FX_BOOL CFX_List::IsItemSelected(FX_INT32 nIndex) const |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) |
- { |
- return pListItem->IsSelected(); |
- } |
+void CPLST_Select::Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex) { |
+ if (nBeginIndex > nEndIndex) { |
+ FX_INT32 nTemp = nEndIndex; |
+ nEndIndex = nBeginIndex; |
+ nBeginIndex = nTemp; |
+ } |
- return FALSE; |
+ for (FX_INT32 i = nBeginIndex; i <= nEndIndex; i++) |
+ Add(i); |
} |
-void CFX_List::SetItemSelect(FX_INT32 nItemIndex, FX_BOOL bSelected) |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex)) |
- { |
- pListItem->SetSelect(bSelected); |
- } |
+void CPLST_Select::Sub(FX_INT32 nItemIndex) { |
+ for (FX_INT32 i = m_aItems.GetSize() - 1; i >= 0; i--) { |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) |
+ if (pItem->nItemIndex == nItemIndex) |
+ pItem->nState = -1; |
+ } |
} |
-void CFX_List::SetItemCaret(FX_INT32 nItemIndex, FX_BOOL bCaret) |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex)) |
- { |
- pListItem->SetCaret(bCaret); |
- } |
+void CPLST_Select::Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex) { |
+ if (nBeginIndex > nEndIndex) { |
+ FX_INT32 nTemp = nEndIndex; |
+ nEndIndex = nBeginIndex; |
+ nBeginIndex = nTemp; |
+ } |
+ |
+ for (FX_INT32 i = nBeginIndex; i <= nEndIndex; i++) |
+ Sub(i); |
} |
-void CFX_List::SetMultipleSel(FX_BOOL bMultiple) |
-{ |
- m_bMultiple = bMultiple; |
+FX_INT32 CPLST_Select::Find(FX_INT32 nItemIndex) const { |
+ for (FX_INT32 i = 0, sz = m_aItems.GetSize(); i < sz; i++) { |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
+ if (pItem->nItemIndex == nItemIndex) |
+ return i; |
+ } |
+ } |
+ |
+ return -1; |
} |
-FX_BOOL CFX_List::IsMultipleSel() const |
-{ |
- return m_bMultiple; |
+FX_BOOL CPLST_Select::IsExist(FX_INT32 nItemIndex) const { |
+ return Find(nItemIndex) >= 0; |
} |
-FX_BOOL CFX_List::IsValid(FX_INT32 nItemIndex) const |
-{ |
- return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize(); |
+FX_INT32 CPLST_Select::GetCount() const { |
+ return m_aItems.GetSize(); |
} |
-CFX_WideString CFX_List::GetItemText(FX_INT32 nIndex) const |
-{ |
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex)) |
- { |
- return pListItem->GetText(); |
- } |
+FX_INT32 CPLST_Select::GetItemIndex(FX_INT32 nIndex) const { |
+ if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) |
+ return pItem->nItemIndex; |
- return L""; |
+ return -1; |
} |
-/* ------------------------------------ CPLST_Select ---------------------------------- */ |
+FX_INT32 CPLST_Select::GetState(FX_INT32 nIndex) const { |
+ if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(nIndex)) |
+ return pItem->nState; |
-CPLST_Select::CPLST_Select() |
-{ |
+ return 0; |
} |
-CPLST_Select::~CPLST_Select() |
-{ |
- for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++) |
- delete m_aItems.GetAt(i); |
+void CPLST_Select::DeselectAll() { |
+ for (FX_INT32 i = 0, sz = m_aItems.GetSize(); i < sz; i++) { |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
+ pItem->nState = -1; |
+ } |
+ } |
+} |
- m_aItems.RemoveAll(); |
+void CPLST_Select::Done() { |
+ for (FX_INT32 i = m_aItems.GetSize() - 1; i >= 0; i--) { |
+ if (CPLST_Select_Item* pItem = m_aItems.GetAt(i)) { |
+ if (pItem->nState == -1) { |
+ delete pItem; |
+ m_aItems.RemoveAt(i); |
+ } else { |
+ pItem->nState = 0; |
+ } |
+ } |
+ } |
} |
-void CPLST_Select::Add(FX_INT32 nItemIndex) |
-{ |
- FX_INT32 nIndex = Find(nItemIndex); |
+/* ------------------------------------ CFX_ListCtrl |
+ * --------------------------------- */ |
- if (nIndex < 0) |
- m_aItems.Add(new CPLST_Select_Item(nItemIndex,1)); |
- else |
- { |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) |
- { |
- pItem->nState = 1; |
- } |
- } |
+CFX_ListCtrl::CFX_ListCtrl() |
+ : m_pNotify(NULL), |
+ m_bNotifyFlag(FALSE), |
+ m_ptScrollPos(0.0f, 0.0f), |
+ m_nSelItem(-1), |
+ m_nFootIndex(-1), |
+ m_bCtrlSel(FALSE), |
+ m_nCaretIndex(-1) { |
} |
-void CPLST_Select::Add(FX_INT32 nBeginIndex, FX_INT32 nEndIndex) |
-{ |
- if (nBeginIndex > nEndIndex) |
- { |
- FX_INT32 nTemp = nEndIndex; |
- nEndIndex = nBeginIndex; |
- nBeginIndex = nTemp; |
- } |
+CFX_ListCtrl::~CFX_ListCtrl() { |
+} |
- for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Add(i); |
+void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) { |
+ m_pNotify = pNotify; |
} |
-void CPLST_Select::Sub(FX_INT32 nItemIndex) |
-{ |
- for (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--) |
- { |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) |
- if (pItem->nItemIndex == nItemIndex) |
- pItem->nState = -1; |
- } |
+CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point& point) const { |
+ CPDF_Rect rcPlate = GetPlateRect(); |
+ |
+ return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left), |
+ point.y - (m_ptScrollPos.y - rcPlate.top)); |
} |
-void CPLST_Select::Sub(FX_INT32 nBeginIndex, FX_INT32 nEndIndex) |
-{ |
- if (nBeginIndex > nEndIndex) |
- { |
- FX_INT32 nTemp = nEndIndex; |
- nEndIndex = nBeginIndex; |
- nBeginIndex = nTemp; |
- } |
+CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point& point) const { |
+ CPDF_Rect rcPlate = GetPlateRect(); |
- for (FX_INT32 i=nBeginIndex; i<=nEndIndex; i++) Sub(i); |
+ return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left), |
+ point.y + (m_ptScrollPos.y - rcPlate.top)); |
} |
-FX_INT32 CPLST_Select::Find(FX_INT32 nItemIndex) const |
-{ |
- for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++) |
- { |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) |
- { |
- if (pItem->nItemIndex == nItemIndex) |
- return i; |
- } |
- } |
+CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect& rect) const { |
+ CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left, rect.bottom)); |
+ CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right, rect.top)); |
- return -1; |
+ return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y); |
} |
-FX_BOOL CPLST_Select::IsExist(FX_INT32 nItemIndex) const |
-{ |
- return Find(nItemIndex) >= 0; |
+CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect& rect) const { |
+ CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left, rect.bottom)); |
+ CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right, rect.top)); |
+ |
+ return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y); |
} |
-FX_INT32 CPLST_Select::GetCount() const |
-{ |
- return m_aItems.GetSize(); |
+void CFX_ListCtrl::OnMouseDown(const CPDF_Point& point, |
+ FX_BOOL bShift, |
+ FX_BOOL bCtrl) { |
+ FX_INT32 nHitIndex = this->GetItemIndex(point); |
+ |
+ if (IsMultipleSel()) { |
+ if (bCtrl) { |
+ if (IsItemSelected(nHitIndex)) { |
+ m_aSelItems.Sub(nHitIndex); |
+ SelectItems(); |
+ m_bCtrlSel = FALSE; |
+ } else { |
+ m_aSelItems.Add(nHitIndex); |
+ SelectItems(); |
+ m_bCtrlSel = TRUE; |
+ } |
+ |
+ m_nFootIndex = nHitIndex; |
+ } else if (bShift) { |
+ m_aSelItems.DeselectAll(); |
+ m_aSelItems.Add(m_nFootIndex, nHitIndex); |
+ SelectItems(); |
+ } else { |
+ m_aSelItems.DeselectAll(); |
+ m_aSelItems.Add(nHitIndex); |
+ SelectItems(); |
+ |
+ m_nFootIndex = nHitIndex; |
+ } |
+ |
+ SetCaret(nHitIndex); |
+ } else { |
+ SetSingleSelect(nHitIndex); |
+ } |
+ |
+ if (!this->IsItemVisible(nHitIndex)) |
+ this->ScrollToListItem(nHitIndex); |
} |
-FX_INT32 CPLST_Select::GetItemIndex(FX_INT32 nIndex) const |
-{ |
- if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) |
- return pItem->nItemIndex; |
+void CFX_ListCtrl::OnMouseMove(const CPDF_Point& point, |
+ FX_BOOL bShift, |
+ FX_BOOL bCtrl) { |
+ FX_INT32 nHitIndex = this->GetItemIndex(point); |
+ |
+ if (IsMultipleSel()) { |
+ if (bCtrl) { |
+ if (m_bCtrlSel) |
+ m_aSelItems.Add(m_nFootIndex, nHitIndex); |
+ else |
+ m_aSelItems.Sub(m_nFootIndex, nHitIndex); |
- return -1; |
+ SelectItems(); |
+ } else { |
+ m_aSelItems.DeselectAll(); |
+ m_aSelItems.Add(m_nFootIndex, nHitIndex); |
+ SelectItems(); |
+ } |
+ |
+ SetCaret(nHitIndex); |
+ } else { |
+ SetSingleSelect(nHitIndex); |
+ } |
+ |
+ if (!this->IsItemVisible(nHitIndex)) |
+ this->ScrollToListItem(nHitIndex); |
} |
-FX_INT32 CPLST_Select::GetState(FX_INT32 nIndex) const |
-{ |
- if (nIndex >= 0 && nIndex < m_aItems.GetSize()) |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex)) |
- return pItem->nState; |
+void CFX_ListCtrl::OnVK(FX_INT32 nItemIndex, FX_BOOL bShift, FX_BOOL bCtrl) { |
+ if (IsMultipleSel()) { |
+ if (nItemIndex >= 0 && nItemIndex < GetCount()) { |
+ if (bCtrl) { |
+ } else if (bShift) { |
+ m_aSelItems.DeselectAll(); |
+ m_aSelItems.Add(m_nFootIndex, nItemIndex); |
+ SelectItems(); |
+ } else { |
+ m_aSelItems.DeselectAll(); |
+ m_aSelItems.Add(nItemIndex); |
+ SelectItems(); |
+ m_nFootIndex = nItemIndex; |
+ } |
+ |
+ SetCaret(nItemIndex); |
+ } |
+ } else { |
+ SetSingleSelect(nItemIndex); |
+ } |
- return 0; |
+ if (!this->IsItemVisible(nItemIndex)) |
+ this->ScrollToListItem(nItemIndex); |
} |
-void CPLST_Select::DeselectAll() |
-{ |
- for (FX_INT32 i=0,sz=m_aItems.GetSize(); i<sz; i++) |
- { |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) |
- { |
- pItem->nState = -1; |
- } |
- } |
-} |
- |
-void CPLST_Select::Done() |
-{ |
- for (FX_INT32 i=m_aItems.GetSize()-1; i>=0; i--) |
- { |
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(i)) |
- { |
- if (pItem->nState == -1) |
- { |
- delete pItem; |
- m_aItems.RemoveAt(i); |
- } |
- else |
- { |
- pItem->nState = 0; |
- } |
- } |
- } |
-} |
- |
-/* ------------------------------------ CFX_ListCtrl --------------------------------- */ |
+void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(IsMultipleSel() ? GetCaret() - 1 : GetSelect() - 1, bShift, bCtrl); |
+} |
-CFX_ListCtrl::CFX_ListCtrl() : m_pNotify(NULL), |
- m_bNotifyFlag(FALSE), |
- m_ptScrollPos(0.0f,0.0f), |
- m_nSelItem(-1), |
- m_nFootIndex(-1), |
- m_bCtrlSel(FALSE), |
- m_nCaretIndex(-1) |
-{ |
-} |
- |
-CFX_ListCtrl::~CFX_ListCtrl() |
-{ |
-} |
- |
-void CFX_ListCtrl::SetNotify(IFX_List_Notify * pNotify) |
-{ |
- m_pNotify = pNotify; |
-} |
- |
-CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point & point) const |
-{ |
- CPDF_Rect rcPlate = GetPlateRect(); |
- |
- return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left), |
- point.y - (m_ptScrollPos.y - rcPlate.top)); |
-} |
- |
-CPDF_Point CFX_ListCtrl::OutToIn(const CPDF_Point & point) const |
-{ |
- CPDF_Rect rcPlate = GetPlateRect(); |
- |
- return CPDF_Point(point.x + (m_ptScrollPos.x - rcPlate.left), |
- point.y + (m_ptScrollPos.y - rcPlate.top)); |
-} |
- |
-CPDF_Rect CFX_ListCtrl::InToOut(const CPDF_Rect & rect) const |
-{ |
- CPDF_Point ptLeftBottom = InToOut(CPDF_Point(rect.left,rect.bottom)); |
- CPDF_Point ptRightTop = InToOut(CPDF_Point(rect.right,rect.top)); |
- |
- return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y); |
-} |
- |
-CPDF_Rect CFX_ListCtrl::OutToIn(const CPDF_Rect & rect) const |
-{ |
- CPDF_Point ptLeftBottom = OutToIn(CPDF_Point(rect.left,rect.bottom)); |
- CPDF_Point ptRightTop = OutToIn(CPDF_Point(rect.right,rect.top)); |
- |
- return CPDF_Rect(ptLeftBottom.x,ptLeftBottom.y,ptRightTop.x,ptRightTop.y); |
-} |
- |
-void CFX_ListCtrl::OnMouseDown(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- FX_INT32 nHitIndex = this->GetItemIndex(point); |
- |
- if (IsMultipleSel()) |
- { |
- if (bCtrl) |
- { |
- if (IsItemSelected(nHitIndex)) |
- { |
- m_aSelItems.Sub(nHitIndex); |
- SelectItems(); |
- m_bCtrlSel = FALSE; |
- } |
- else |
- { |
- m_aSelItems.Add(nHitIndex); |
- SelectItems(); |
- m_bCtrlSel = TRUE; |
- } |
- |
- m_nFootIndex = nHitIndex; |
- } |
- else if (bShift) |
- { |
- m_aSelItems.DeselectAll(); |
- m_aSelItems.Add(m_nFootIndex,nHitIndex); |
- SelectItems(); |
- } |
- else |
- { |
- m_aSelItems.DeselectAll(); |
- m_aSelItems.Add(nHitIndex); |
- SelectItems(); |
- |
- m_nFootIndex = nHitIndex; |
- } |
- |
- SetCaret(nHitIndex); |
- } |
- else |
- { |
- SetSingleSelect(nHitIndex); |
- } |
- |
- if (!this->IsItemVisible(nHitIndex)) |
- this->ScrollToListItem(nHitIndex); |
-} |
- |
-void CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- FX_INT32 nHitIndex = this->GetItemIndex(point); |
- |
- if (IsMultipleSel()) |
- { |
- if (bCtrl) |
- { |
- if (m_bCtrlSel) |
- m_aSelItems.Add(m_nFootIndex,nHitIndex); |
- else |
- m_aSelItems.Sub(m_nFootIndex,nHitIndex); |
- |
- SelectItems(); |
- } |
- else |
- { |
- m_aSelItems.DeselectAll(); |
- m_aSelItems.Add(m_nFootIndex,nHitIndex); |
- SelectItems(); |
- } |
- |
- SetCaret(nHitIndex); |
- } |
- else |
- { |
- SetSingleSelect(nHitIndex); |
- } |
- |
- if (!this->IsItemVisible(nHitIndex)) |
- this->ScrollToListItem(nHitIndex); |
-} |
- |
-void CFX_ListCtrl::OnVK(FX_INT32 nItemIndex,FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- if (IsMultipleSel()) |
- { |
- if (nItemIndex >= 0 && nItemIndex < GetCount()) |
- { |
- if (bCtrl) |
- { |
- } |
- else if (bShift) |
- { |
- m_aSelItems.DeselectAll(); |
- m_aSelItems.Add(m_nFootIndex,nItemIndex); |
- SelectItems(); |
- } |
- else |
- { |
- m_aSelItems.DeselectAll(); |
- m_aSelItems.Add(nItemIndex); |
- SelectItems(); |
- m_nFootIndex = nItemIndex; |
- } |
- |
- SetCaret(nItemIndex); |
- } |
- } |
- else |
- { |
- SetSingleSelect(nItemIndex); |
- } |
- |
- if (!this->IsItemVisible(nItemIndex)) |
- this->ScrollToListItem(nItemIndex); |
-} |
- |
-void CFX_ListCtrl::OnVK_UP(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(IsMultipleSel() ? GetCaret()-1 : GetSelect()-1, bShift, bCtrl); |
-} |
- |
-void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(IsMultipleSel() ? GetCaret()+1 : GetSelect()+1, bShift, bCtrl); |
-} |
- |
-void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(0, bShift, bCtrl); |
-} |
- |
-void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(GetCount()-1, bShift, bCtrl); |
-} |
- |
-void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(0, bShift, bCtrl); |
-} |
- |
-void CFX_ListCtrl::OnVK_END(FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- OnVK(GetCount()-1, bShift, bCtrl); |
-} |
- |
-FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar,FX_BOOL bShift,FX_BOOL bCtrl) |
-{ |
- FX_INT32 nIndex = GetLastSelected(); |
- FX_INT32 nFindIndex = FindNext(nIndex,nChar); |
- |
- if (nFindIndex != nIndex) |
- { |
- OnVK(nFindIndex, bShift, bCtrl); |
- return TRUE; |
- } |
- return FALSE; |
+void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(IsMultipleSel() ? GetCaret() + 1 : GetSelect() + 1, bShift, bCtrl); |
+} |
+ |
+void CFX_ListCtrl::OnVK_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(0, bShift, bCtrl); |
+} |
+ |
+void CFX_ListCtrl::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(GetCount() - 1, bShift, bCtrl); |
+} |
+ |
+void CFX_ListCtrl::OnVK_HOME(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(0, bShift, bCtrl); |
+} |
+ |
+void CFX_ListCtrl::OnVK_END(FX_BOOL bShift, FX_BOOL bCtrl) { |
+ OnVK(GetCount() - 1, bShift, bCtrl); |
+} |
+ |
+FX_BOOL CFX_ListCtrl::OnChar(FX_WORD nChar, FX_BOOL bShift, FX_BOOL bCtrl) { |
+ FX_INT32 nIndex = GetLastSelected(); |
+ FX_INT32 nFindIndex = FindNext(nIndex, nChar); |
+ |
+ if (nFindIndex != nIndex) { |
+ OnVK(nFindIndex, bShift, bCtrl); |
+ return TRUE; |
+ } |
+ return FALSE; |
} |
/* -------- inner methods ------- */ |
-void CFX_ListCtrl::SetPlateRect(const CPDF_Rect & rect) |
-{ |
- CFX_ListContainer::SetPlateRect(rect); |
- m_ptScrollPos.x = rect.left; |
- SetScrollPos(CPDF_Point(rect.left,rect.top)); |
- ReArrange(0); |
- InvalidateItem(-1); |
-} |
- |
-CPDF_Rect CFX_ListCtrl::GetItemRect(FX_INT32 nIndex) const |
-{ |
- return InToOut(CFX_List::GetItemRect(nIndex)); |
-} |
- |
-void CFX_ListCtrl::AddString(FX_LPCWSTR string) |
-{ |
- AddItem(string); |
- ReArrange(GetCount() - 1); |
-} |
- |
-void CFX_ListCtrl::SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected) |
-{ |
- if (!IsValid(nItemIndex)) return; |
- |
- if (bSelected != this->IsItemSelected(nItemIndex)) |
- { |
- if (bSelected) |
- { |
- SetItemSelect(nItemIndex,TRUE); |
- InvalidateItem(nItemIndex); |
- } |
- else |
- { |
- SetItemSelect(nItemIndex,FALSE); |
- InvalidateItem(nItemIndex); |
- } |
- } |
-} |
- |
-void CFX_ListCtrl::SetSingleSelect(FX_INT32 nItemIndex) |
-{ |
- if (!IsValid(nItemIndex)) return; |
- |
- if (m_nSelItem != nItemIndex) |
- { |
- if (m_nSelItem >= 0) |
- { |
- SetItemSelect(m_nSelItem,FALSE); |
- InvalidateItem(m_nSelItem); |
- } |
- |
- SetItemSelect(nItemIndex,TRUE); |
- InvalidateItem(nItemIndex); |
- m_nSelItem = nItemIndex; |
- } |
-} |
- |
-void CFX_ListCtrl::SetCaret(FX_INT32 nItemIndex) |
-{ |
- if (!IsValid(nItemIndex)) return; |
- |
- if (this->IsMultipleSel()) |
- { |
- FX_INT32 nOldIndex = m_nCaretIndex; |
- |
- if (nOldIndex != nItemIndex) |
- { |
- m_nCaretIndex = nItemIndex; |
- |
- SetItemCaret(nOldIndex, FALSE); |
- SetItemCaret(nItemIndex,TRUE); |
- |
- InvalidateItem(nOldIndex); |
- InvalidateItem(nItemIndex); |
- } |
- } |
-} |
- |
-void CFX_ListCtrl::InvalidateItem(FX_INT32 nItemIndex) |
-{ |
- if (m_pNotify) |
- { |
- if (nItemIndex == -1) |
- { |
- if (!m_bNotifyFlag) |
- { |
- m_bNotifyFlag = TRUE; |
- CPDF_Rect rcRefresh = GetPlateRect(); |
- m_pNotify->IOnInvalidateRect(&rcRefresh); |
- m_bNotifyFlag = FALSE; |
- } |
- } |
- else |
- { |
- if (!m_bNotifyFlag) |
- { |
- m_bNotifyFlag = TRUE; |
- CPDF_Rect rcRefresh = GetItemRect(nItemIndex); |
- rcRefresh.left -= 1.0f; |
- rcRefresh.right += 1.0f; |
- rcRefresh.bottom -= 1.0f; |
- rcRefresh.top += 1.0f; |
- |
- m_pNotify->IOnInvalidateRect(&rcRefresh); |
- m_bNotifyFlag = FALSE; |
- } |
- } |
- } |
-} |
- |
-void CFX_ListCtrl::SelectItems() |
-{ |
- for (FX_INT32 i=0,sz=m_aSelItems.GetCount(); i<sz; i++) |
- { |
- FX_INT32 nItemIndex = m_aSelItems.GetItemIndex(i); |
- FX_INT32 nState = m_aSelItems.GetState(i); |
- |
- switch(nState) |
- { |
- case 1: |
- SetMultipleSelect(nItemIndex, TRUE); |
- break; |
- case -1: |
- SetMultipleSelect(nItemIndex, FALSE); |
- break; |
- } |
- } |
- |
- m_aSelItems.Done(); |
-} |
- |
-void CFX_ListCtrl::Select(FX_INT32 nItemIndex) |
-{ |
- if (!IsValid(nItemIndex)) return; |
- |
- if (this->IsMultipleSel()) |
- { |
- m_aSelItems.Add(nItemIndex); |
- SelectItems(); |
- } |
- else |
- SetSingleSelect(nItemIndex); |
-} |
- |
-FX_BOOL CFX_ListCtrl::IsItemVisible(FX_INT32 nItemIndex) const |
-{ |
- CPDF_Rect rcPlate = this->GetPlateRect(); |
- CPDF_Rect rcItem = this->GetItemRect(nItemIndex); |
- |
- return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; |
-} |
- |
-void CFX_ListCtrl::ScrollToListItem(FX_INT32 nItemIndex) |
-{ |
- if (!IsValid(nItemIndex)) return; |
- |
- CPDF_Rect rcPlate = this->GetPlateRect(); |
- CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex); |
- CPDF_Rect rcItemCtrl = GetItemRect(nItemIndex); |
- |
- if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) |
- { |
- if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) |
- { |
- SetScrollPosY(rcItem.bottom + rcPlate.Height()); |
- } |
- } |
- else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) |
- { |
- if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) |
- { |
- SetScrollPosY(rcItem.top); |
- } |
- } |
-} |
- |
-void CFX_ListCtrl::SetScrollInfo() |
-{ |
- if (m_pNotify) |
- { |
- CPDF_Rect rcPlate = GetPlateRect(); |
- CPDF_Rect rcContent = CFX_List::GetContentRect(); |
- |
- if (!m_bNotifyFlag) |
- { |
- m_bNotifyFlag = TRUE; |
- m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, rcPlate.top, |
- rcContent.bottom, rcContent.top, GetFirstHeight(), rcPlate.Height()); |
- m_bNotifyFlag = FALSE; |
- } |
- } |
-} |
- |
-void CFX_ListCtrl::SetScrollPos(const CPDF_Point & point) |
-{ |
- SetScrollPosY(point.y); |
-} |
- |
-void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) |
-{ |
- if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y,fy)) |
- { |
- CPDF_Rect rcPlate = this->GetPlateRect(); |
- CPDF_Rect rcContent = CFX_List::GetContentRect(); |
- |
- if (rcPlate.Height() > rcContent.Height()) |
- { |
- fy = rcPlate.top; |
- } |
- else |
- { |
- if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) |
- { |
- fy = rcContent.bottom + rcPlate.Height(); |
- } |
- else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) |
- { |
- fy = rcContent.top; |
- } |
- } |
- |
- m_ptScrollPos.y = fy; |
- InvalidateItem(-1); |
- |
- if (m_pNotify) |
- { |
- if (!m_bNotifyFlag) |
- { |
- m_bNotifyFlag = TRUE; |
- m_pNotify->IOnSetScrollPosY(fy); |
- m_bNotifyFlag = FALSE; |
- } |
- } |
- } |
-} |
- |
-CPDF_Rect CFX_ListCtrl::GetContentRect() const |
-{ |
- return InToOut(CFX_List::GetContentRect()); |
-} |
+void CFX_ListCtrl::SetPlateRect(const CPDF_Rect& rect) { |
+ CFX_ListContainer::SetPlateRect(rect); |
+ m_ptScrollPos.x = rect.left; |
+ SetScrollPos(CPDF_Point(rect.left, rect.top)); |
+ ReArrange(0); |
+ InvalidateItem(-1); |
+} |
+ |
+CPDF_Rect CFX_ListCtrl::GetItemRect(FX_INT32 nIndex) const { |
+ return InToOut(CFX_List::GetItemRect(nIndex)); |
+} |
+ |
+void CFX_ListCtrl::AddString(FX_LPCWSTR string) { |
+ AddItem(string); |
+ ReArrange(GetCount() - 1); |
+} |
+ |
+void CFX_ListCtrl::SetMultipleSelect(FX_INT32 nItemIndex, FX_BOOL bSelected) { |
+ if (!IsValid(nItemIndex)) |
+ return; |
+ |
+ if (bSelected != this->IsItemSelected(nItemIndex)) { |
+ if (bSelected) { |
+ SetItemSelect(nItemIndex, TRUE); |
+ InvalidateItem(nItemIndex); |
+ } else { |
+ SetItemSelect(nItemIndex, FALSE); |
+ InvalidateItem(nItemIndex); |
+ } |
+ } |
+} |
+ |
+void CFX_ListCtrl::SetSingleSelect(FX_INT32 nItemIndex) { |
+ if (!IsValid(nItemIndex)) |
+ return; |
+ |
+ if (m_nSelItem != nItemIndex) { |
+ if (m_nSelItem >= 0) { |
+ SetItemSelect(m_nSelItem, FALSE); |
+ InvalidateItem(m_nSelItem); |
+ } |
-void CFX_ListCtrl::ReArrange(FX_INT32 nItemIndex) |
-{ |
- CFX_List::ReArrange(nItemIndex); |
- SetScrollInfo(); |
-} |
- |
-void CFX_ListCtrl::SetTopItem(FX_INT32 nIndex) |
-{ |
- if (IsValid(nIndex)) |
- { |
- this->GetPlateRect(); |
- CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex); |
- SetScrollPosY(rcItem.top); |
- } |
-} |
- |
-FX_INT32 CFX_ListCtrl::GetTopItem() const |
-{ |
- FX_INT32 nItemIndex = this->GetItemIndex(this->GetBTPoint()); |
- |
- if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) |
- nItemIndex += 1; |
- |
- return nItemIndex; |
-} |
- |
-void CFX_ListCtrl::Empty() |
-{ |
- CFX_List::Empty(); |
- InvalidateItem(-1); |
+ SetItemSelect(nItemIndex, TRUE); |
+ InvalidateItem(nItemIndex); |
+ m_nSelItem = nItemIndex; |
+ } |
} |
-void CFX_ListCtrl::Cancel() |
-{ |
- m_aSelItems.DeselectAll(); |
+void CFX_ListCtrl::SetCaret(FX_INT32 nItemIndex) { |
+ if (!IsValid(nItemIndex)) |
+ return; |
+ |
+ if (this->IsMultipleSel()) { |
+ FX_INT32 nOldIndex = m_nCaretIndex; |
+ |
+ if (nOldIndex != nItemIndex) { |
+ m_nCaretIndex = nItemIndex; |
+ |
+ SetItemCaret(nOldIndex, FALSE); |
+ SetItemCaret(nItemIndex, TRUE); |
+ |
+ InvalidateItem(nOldIndex); |
+ InvalidateItem(nItemIndex); |
+ } |
+ } |
+} |
+ |
+void CFX_ListCtrl::InvalidateItem(FX_INT32 nItemIndex) { |
+ if (m_pNotify) { |
+ if (nItemIndex == -1) { |
+ if (!m_bNotifyFlag) { |
+ m_bNotifyFlag = TRUE; |
+ CPDF_Rect rcRefresh = GetPlateRect(); |
+ m_pNotify->IOnInvalidateRect(&rcRefresh); |
+ m_bNotifyFlag = FALSE; |
+ } |
+ } else { |
+ if (!m_bNotifyFlag) { |
+ m_bNotifyFlag = TRUE; |
+ CPDF_Rect rcRefresh = GetItemRect(nItemIndex); |
+ rcRefresh.left -= 1.0f; |
+ rcRefresh.right += 1.0f; |
+ rcRefresh.bottom -= 1.0f; |
+ rcRefresh.top += 1.0f; |
+ |
+ m_pNotify->IOnInvalidateRect(&rcRefresh); |
+ m_bNotifyFlag = FALSE; |
+ } |
+ } |
+ } |
+} |
+ |
+void CFX_ListCtrl::SelectItems() { |
+ for (FX_INT32 i = 0, sz = m_aSelItems.GetCount(); i < sz; i++) { |
+ FX_INT32 nItemIndex = m_aSelItems.GetItemIndex(i); |
+ FX_INT32 nState = m_aSelItems.GetState(i); |
+ |
+ switch (nState) { |
+ case 1: |
+ SetMultipleSelect(nItemIndex, TRUE); |
+ break; |
+ case -1: |
+ SetMultipleSelect(nItemIndex, FALSE); |
+ break; |
+ } |
+ } |
+ |
+ m_aSelItems.Done(); |
+} |
+ |
+void CFX_ListCtrl::Select(FX_INT32 nItemIndex) { |
+ if (!IsValid(nItemIndex)) |
+ return; |
+ |
+ if (this->IsMultipleSel()) { |
+ m_aSelItems.Add(nItemIndex); |
+ SelectItems(); |
+ } else |
+ SetSingleSelect(nItemIndex); |
+} |
+ |
+FX_BOOL CFX_ListCtrl::IsItemVisible(FX_INT32 nItemIndex) const { |
+ CPDF_Rect rcPlate = this->GetPlateRect(); |
+ CPDF_Rect rcItem = this->GetItemRect(nItemIndex); |
+ |
+ return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; |
} |
-FX_INT32 CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const |
-{ |
- return CFX_List::GetItemIndex(OutToIn(point)); |
+void CFX_ListCtrl::ScrollToListItem(FX_INT32 nItemIndex) { |
+ if (!IsValid(nItemIndex)) |
+ return; |
+ |
+ CPDF_Rect rcPlate = this->GetPlateRect(); |
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nItemIndex); |
+ CPDF_Rect rcItemCtrl = GetItemRect(nItemIndex); |
+ |
+ if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) { |
+ if (FX_EDIT_IsFloatSmaller(rcItemCtrl.top, rcPlate.top)) { |
+ SetScrollPosY(rcItem.bottom + rcPlate.Height()); |
+ } |
+ } else if (FX_EDIT_IsFloatBigger(rcItemCtrl.top, rcPlate.top)) { |
+ if (FX_EDIT_IsFloatBigger(rcItemCtrl.bottom, rcPlate.bottom)) { |
+ SetScrollPosY(rcItem.top); |
+ } |
+ } |
} |
-CFX_WideString CFX_ListCtrl::GetText() const |
-{ |
- if (this->IsMultipleSel()) |
- return this->GetItemText(this->m_nCaretIndex); |
- else |
- return this->GetItemText(this->m_nSelItem); |
+void CFX_ListCtrl::SetScrollInfo() { |
+ if (m_pNotify) { |
+ CPDF_Rect rcPlate = GetPlateRect(); |
+ CPDF_Rect rcContent = CFX_List::GetContentRect(); |
+ |
+ if (!m_bNotifyFlag) { |
+ m_bNotifyFlag = TRUE; |
+ m_pNotify->IOnSetScrollInfoY(rcPlate.bottom, |
+ rcPlate.top, |
+ rcContent.bottom, |
+ rcContent.top, |
+ GetFirstHeight(), |
+ rcPlate.Height()); |
+ m_bNotifyFlag = FALSE; |
+ } |
+ } |
} |
+void CFX_ListCtrl::SetScrollPos(const CPDF_Point& point) { |
+ SetScrollPosY(point.y); |
+} |
+ |
+void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) { |
+ if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) { |
+ CPDF_Rect rcPlate = this->GetPlateRect(); |
+ CPDF_Rect rcContent = CFX_List::GetContentRect(); |
+ |
+ if (rcPlate.Height() > rcContent.Height()) { |
+ fy = rcPlate.top; |
+ } else { |
+ if (FX_EDIT_IsFloatSmaller(fy - rcPlate.Height(), rcContent.bottom)) { |
+ fy = rcContent.bottom + rcPlate.Height(); |
+ } else if (FX_EDIT_IsFloatBigger(fy, rcContent.top)) { |
+ fy = rcContent.top; |
+ } |
+ } |
+ |
+ m_ptScrollPos.y = fy; |
+ InvalidateItem(-1); |
+ |
+ if (m_pNotify) { |
+ if (!m_bNotifyFlag) { |
+ m_bNotifyFlag = TRUE; |
+ m_pNotify->IOnSetScrollPosY(fy); |
+ m_bNotifyFlag = FALSE; |
+ } |
+ } |
+ } |
+} |
+ |
+CPDF_Rect CFX_ListCtrl::GetContentRect() const { |
+ return InToOut(CFX_List::GetContentRect()); |
+} |
+ |
+void CFX_ListCtrl::ReArrange(FX_INT32 nItemIndex) { |
+ CFX_List::ReArrange(nItemIndex); |
+ SetScrollInfo(); |
+} |
+ |
+void CFX_ListCtrl::SetTopItem(FX_INT32 nIndex) { |
+ if (IsValid(nIndex)) { |
+ this->GetPlateRect(); |
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex); |
+ SetScrollPosY(rcItem.top); |
+ } |
+} |
+ |
+FX_INT32 CFX_ListCtrl::GetTopItem() const { |
+ FX_INT32 nItemIndex = this->GetItemIndex(this->GetBTPoint()); |
+ |
+ if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1)) |
+ nItemIndex += 1; |
+ |
+ return nItemIndex; |
+} |
+ |
+void CFX_ListCtrl::Empty() { |
+ CFX_List::Empty(); |
+ InvalidateItem(-1); |
+} |
+ |
+void CFX_ListCtrl::Cancel() { |
+ m_aSelItems.DeselectAll(); |
+} |
+ |
+FX_INT32 CFX_ListCtrl::GetItemIndex(const CPDF_Point& point) const { |
+ return CFX_List::GetItemIndex(OutToIn(point)); |
+} |
+ |
+CFX_WideString CFX_ListCtrl::GetText() const { |
+ if (this->IsMultipleSel()) |
+ return this->GetItemText(this->m_nCaretIndex); |
+ else |
+ return this->GetItemText(this->m_nSelItem); |
+} |