summaryrefslogtreecommitdiff
path: root/fpdfsdk/src/fxedit/fxet_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/src/fxedit/fxet_list.cpp')
-rw-r--r--fpdfsdk/src/fxedit/fxet_list.cpp1511
1 files changed, 668 insertions, 843 deletions
diff --git a/fpdfsdk/src/fxedit/fxet_list.cpp b/fpdfsdk/src/fxedit/fxet_list.cpp
index d94cc16c86..70dc8d5262 100644
--- a/fpdfsdk/src/fxedit/fxet_list.cpp
+++ b/fpdfsdk/src/fxedit/fxet_list.cpp
@@ -8,1004 +8,829 @@
#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(const FX_WCHAR* text)
-{
- if (m_pEdit)
- m_pEdit->SetText(text);
+void CFX_ListItem::SetText(const FX_WCHAR* 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 (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++)
+ delete m_aListItems.GetAt(i);
+
+ m_aListItems.RemoveAll();
}
-void CFX_List::Empty()
-{
- for (int32_t 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(const FX_WCHAR* 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(int32_t nItemIndex) {
+ FX_FLOAT fPosY = 0.0f;
+
+ if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1))
+ fPosY = pPrevItem->GetRect().bottom;
+
+ for (int32_t 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));
}
-void CFX_List::AddItem(const FX_WCHAR* str)
-{
- if (CFX_ListItem * pListItem = new CFX_ListItem())
- {
- pListItem->SetFontMap(m_pFontMap);
- pListItem->SetFontSize(m_fFontSize);
- pListItem->SetText(str);
- m_aListItems.Add(pListItem);
- }
+IFX_Edit* CFX_List::GetItemEdit(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ return pListItem->GetEdit();
+ }
+
+ return NULL;
}
-void CFX_List::ReArrange(int32_t nItemIndex)
-{
- FX_FLOAT fPosY = 0.0f;
+int32_t CFX_List::GetCount() const {
+ return m_aListItems.GetSize();
+}
- if (CFX_ListItem * pPrevItem = m_aListItems.GetAt(nItemIndex - 1))
- fPosY = pPrevItem->GetRect().bottom;
+CPDF_Rect CFX_List::GetPlateRect() const {
+ return CFX_ListContainer::GetPlateRect();
+}
- for (int32_t 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(int32_t nIndex) const
-{
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
- {
- return pListItem->GetEdit();
- }
+int32_t CFX_List::GetItemIndex(const CPDF_Point& point) const {
+ CPDF_Point pt = OuterToInner(point);
+
+ FX_BOOL bFirst = TRUE;
+ FX_BOOL bLast = TRUE;
- return NULL;
+ for (int32_t 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;
+ }
+
+ if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) {
+ return i;
+ }
+ }
+ }
+
+ if (bFirst)
+ return 0;
+ if (bLast)
+ return m_aListItems.GetSize() - 1;
+
+ return -1;
}
-int32_t 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();
+int32_t CFX_List::GetFirstSelected() const {
+ for (int32_t 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());
+int32_t CFX_List::GetLastSelected() const {
+ for (int32_t 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;
}
-int32_t CFX_List::GetItemIndex(const CPDF_Point & point) const
-{
- CPDF_Point pt = OuterToInner(point);
+int32_t CFX_List::FindNext(int32_t nIndex, FX_WCHAR nChar) const {
+ int32_t nCircleIndex = nIndex;
- FX_BOOL bFirst = TRUE;
- FX_BOOL bLast = TRUE;
+ for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
+ nCircleIndex++;
+ if (nCircleIndex >= sz)
+ nCircleIndex = 0;
- for (int32_t 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;
+ }
+ }
- if (FX_EDIT_IsFloatBigger(pt.y, rcListItem.top))
- {
- bFirst = FALSE;
- }
+ return nCircleIndex;
+}
- if (FX_EDIT_IsFloatSmaller(pt.y, rcListItem.bottom))
- {
- bLast = FALSE;
- }
+CPDF_Rect CFX_List::GetItemRect(int32_t 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 (pt.y >= rcListItem.top && pt.y < rcListItem.bottom)
- {
- return i;
- }
- }
- }
+ return CPDF_Rect();
+}
- if (bFirst) return 0;
- if (bLast) return m_aListItems.GetSize()-1;
+FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ return pListItem->IsSelected();
+ }
+
+ return FALSE;
+}
- return -1;
+void CFX_List::SetItemSelect(int32_t 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(int32_t 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;
}
-int32_t CFX_List::GetFirstSelected() const
-{
- for (int32_t 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;
}
-int32_t CFX_List::GetLastSelected() const
-{
- for (int32_t 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(int32_t 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(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ return pListItem->GetText();
+ }
+
+ return L"";
}
-int32_t CFX_List::FindNext(int32_t nIndex,FX_WCHAR nChar) const
-{
- int32_t nCircleIndex = nIndex;
+/* ------------------------------------ CPLST_Select
+ * ---------------------------------- */
- for (int32_t 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 (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++)
+ delete m_aItems.GetAt(i);
- return nCircleIndex;
+ m_aItems.RemoveAll();
}
-CPDF_Rect CFX_List::GetItemRect(int32_t 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(int32_t nItemIndex) {
+ int32_t 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(int32_t nIndex) const
-{
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
- {
- return pListItem->IsSelected();
- }
+void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) {
+ if (nBeginIndex > nEndIndex) {
+ int32_t nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
- return FALSE;
+ for (int32_t i = nBeginIndex; i <= nEndIndex; i++)
+ Add(i);
}
-void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected)
-{
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))
- {
- pListItem->SetSelect(bSelected);
- }
+void CPLST_Select::Sub(int32_t nItemIndex) {
+ for (int32_t 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(int32_t nItemIndex, FX_BOOL bCaret)
-{
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nItemIndex))
- {
- pListItem->SetCaret(bCaret);
- }
+void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) {
+ if (nBeginIndex > nEndIndex) {
+ int32_t nTemp = nEndIndex;
+ nEndIndex = nBeginIndex;
+ nBeginIndex = nTemp;
+ }
+
+ for (int32_t i = nBeginIndex; i <= nEndIndex; i++)
+ Sub(i);
}
-void CFX_List::SetMultipleSel(FX_BOOL bMultiple)
-{
- m_bMultiple = bMultiple;
+int32_t CPLST_Select::Find(int32_t nItemIndex) const {
+ for (int32_t 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(int32_t nItemIndex) const {
+ return Find(nItemIndex) >= 0;
}
-FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const
-{
- return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
+int32_t CPLST_Select::GetCount() const {
+ return m_aItems.GetSize();
}
-CFX_WideString CFX_List::GetItemText(int32_t nIndex) const
-{
- if (CFX_ListItem * pListItem = m_aListItems.GetAt(nIndex))
- {
- return pListItem->GetText();
- }
+int32_t CPLST_Select::GetItemIndex(int32_t 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 ---------------------------------- */
+int32_t CPLST_Select::GetState(int32_t 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 (int32_t i=0,sz=m_aItems.GetSize(); i<sz; i++)
- delete m_aItems.GetAt(i);
+void CPLST_Select::DeselectAll() {
+ for (int32_t 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 (int32_t 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(int32_t nItemIndex)
-{
- int32_t nIndex = Find(nItemIndex);
+/* ------------------------------------ CFX_ListCtrl
+ * --------------------------------- */
+
+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) {}
- 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() {}
+
+void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) {
+ m_pNotify = pNotify;
}
-void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex)
-{
- if (nBeginIndex > nEndIndex)
- {
- int32_t nTemp = nEndIndex;
- nEndIndex = nBeginIndex;
- nBeginIndex = nTemp;
- }
+CPDF_Point CFX_ListCtrl::InToOut(const CPDF_Point& point) const {
+ CPDF_Rect rcPlate = GetPlateRect();
- for (int32_t i=nBeginIndex; i<=nEndIndex; i++) Add(i);
+ return CPDF_Point(point.x - (m_ptScrollPos.x - rcPlate.left),
+ point.y - (m_ptScrollPos.y - rcPlate.top));
}
-void CPLST_Select::Sub(int32_t nItemIndex)
-{
- for (int32_t 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::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));
}
-void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex)
-{
- if (nBeginIndex > nEndIndex)
- {
- int32_t nTemp = nEndIndex;
- nEndIndex = nBeginIndex;
- nBeginIndex = nTemp;
- }
+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));
- for (int32_t i=nBeginIndex; i<=nEndIndex; i++) Sub(i);
+ return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y);
}
-int32_t CPLST_Select::Find(int32_t nItemIndex) const
-{
- for (int32_t 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::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 -1;
+ return CPDF_Rect(ptLeftBottom.x, ptLeftBottom.y, ptRightTop.x, ptRightTop.y);
}
-FX_BOOL CPLST_Select::IsExist(int32_t nItemIndex) const
-{
- return Find(nItemIndex) >= 0;
+void CFX_ListCtrl::OnMouseDown(const CPDF_Point& point,
+ FX_BOOL bShift,
+ FX_BOOL bCtrl) {
+ int32_t nHitIndex = 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 (!IsItemVisible(nHitIndex))
+ ScrollToListItem(nHitIndex);
}
-int32_t CPLST_Select::GetCount() const
-{
- return m_aItems.GetSize();
+void CFX_ListCtrl::OnMouseMove(const CPDF_Point& point,
+ FX_BOOL bShift,
+ FX_BOOL bCtrl) {
+ int32_t nHitIndex = 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 (!IsItemVisible(nHitIndex))
+ ScrollToListItem(nHitIndex);
}
-int32_t CPLST_Select::GetItemIndex(int32_t nIndex) const
-{
- if (nIndex >= 0 && nIndex < m_aItems.GetSize())
- if (CPLST_Select_Item * pItem = m_aItems.GetAt(nIndex))
- return pItem->nItemIndex;
+void CFX_ListCtrl::OnVK(int32_t 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 -1;
+ if (!IsItemVisible(nItemIndex))
+ ScrollToListItem(nItemIndex);
}
-int32_t CPLST_Select::GetState(int32_t 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_UP(FX_BOOL bShift, FX_BOOL bCtrl) {
+ OnVK(IsMultipleSel() ? GetCaret() - 1 : GetSelect() - 1, bShift, bCtrl);
+}
- return 0;
+void CFX_ListCtrl::OnVK_DOWN(FX_BOOL bShift, FX_BOOL bCtrl) {
+ OnVK(IsMultipleSel() ? GetCaret() + 1 : GetSelect() + 1, bShift, bCtrl);
}
-void CPLST_Select::DeselectAll()
-{
- for (int32_t 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 (int32_t 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_LEFT(FX_BOOL bShift, FX_BOOL bCtrl) {
+ OnVK(0, 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::OnVK_RIGHT(FX_BOOL bShift, FX_BOOL bCtrl) {
+ OnVK(GetCount() - 1, bShift, bCtrl);
}
-
-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)
-{
- int32_t nHitIndex = 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 (!IsItemVisible(nHitIndex))
- ScrollToListItem(nHitIndex);
-}
-
-void CFX_ListCtrl::OnMouseMove(const CPDF_Point & point,FX_BOOL bShift,FX_BOOL bCtrl)
-{
- int32_t nHitIndex = 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 (!IsItemVisible(nHitIndex))
- ScrollToListItem(nHitIndex);
-}
-
-void CFX_ListCtrl::OnVK(int32_t 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 (!IsItemVisible(nItemIndex))
- 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)
-{
- int32_t nIndex = GetLastSelected();
- int32_t nFindIndex = FindNext(nIndex,nChar);
-
- if (nFindIndex != nIndex)
- {
- OnVK(nFindIndex, bShift, bCtrl);
- return TRUE;
- }
- return FALSE;
+
+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) {
+ int32_t nIndex = GetLastSelected();
+ int32_t 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(int32_t nIndex) const
-{
- return InToOut(CFX_List::GetItemRect(nIndex));
-}
-
-void CFX_ListCtrl::AddString(const FX_WCHAR* string)
-{
- AddItem(string);
- ReArrange(GetCount() - 1);
-}
-
-void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected)
-{
- if (!IsValid(nItemIndex)) return;
-
- if (bSelected != IsItemSelected(nItemIndex))
- {
- if (bSelected)
- {
- SetItemSelect(nItemIndex,TRUE);
- InvalidateItem(nItemIndex);
- }
- else
- {
- SetItemSelect(nItemIndex,FALSE);
- InvalidateItem(nItemIndex);
- }
- }
-}
-
-void CFX_ListCtrl::SetSingleSelect(int32_t 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(int32_t nItemIndex)
-{
- if (!IsValid(nItemIndex)) return;
-
- if (IsMultipleSel())
- {
- int32_t nOldIndex = m_nCaretIndex;
-
- if (nOldIndex != nItemIndex)
- {
- m_nCaretIndex = nItemIndex;
-
- SetItemCaret(nOldIndex, FALSE);
- SetItemCaret(nItemIndex,TRUE);
-
- InvalidateItem(nOldIndex);
- InvalidateItem(nItemIndex);
- }
- }
-}
-
-void CFX_ListCtrl::InvalidateItem(int32_t 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 (int32_t i=0,sz=m_aSelItems.GetCount(); i<sz; i++)
- {
- int32_t nItemIndex = m_aSelItems.GetItemIndex(i);
- int32_t 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(int32_t nItemIndex)
-{
- if (!IsValid(nItemIndex)) return;
-
- if (IsMultipleSel())
- {
- m_aSelItems.Add(nItemIndex);
- SelectItems();
- }
- else
- SetSingleSelect(nItemIndex);
-}
-
-FX_BOOL CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const
-{
- CPDF_Rect rcPlate = GetPlateRect();
- CPDF_Rect rcItem = GetItemRect(nItemIndex);
-
- return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top;
-}
-
-void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex)
-{
- if (!IsValid(nItemIndex)) return;
-
- CPDF_Rect rcPlate = 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 = 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);
+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(int32_t nIndex) const {
+ return InToOut(CFX_List::GetItemRect(nIndex));
+}
+
+void CFX_ListCtrl::AddString(const FX_WCHAR* string) {
+ AddItem(string);
+ ReArrange(GetCount() - 1);
+}
+
+void CFX_ListCtrl::SetMultipleSelect(int32_t nItemIndex, FX_BOOL bSelected) {
+ if (!IsValid(nItemIndex))
+ return;
- 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());
+ if (bSelected != IsItemSelected(nItemIndex)) {
+ if (bSelected) {
+ SetItemSelect(nItemIndex, TRUE);
+ InvalidateItem(nItemIndex);
+ } else {
+ SetItemSelect(nItemIndex, FALSE);
+ InvalidateItem(nItemIndex);
+ }
+ }
}
-void CFX_ListCtrl::ReArrange(int32_t nItemIndex)
-{
- CFX_List::ReArrange(nItemIndex);
- SetScrollInfo();
-}
-
-void CFX_ListCtrl::SetTopItem(int32_t nIndex)
-{
- if (IsValid(nIndex))
- {
- GetPlateRect();
- CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex);
- SetScrollPosY(rcItem.top);
- }
-}
-
-int32_t CFX_ListCtrl::GetTopItem() const
-{
- int32_t nItemIndex = GetItemIndex(GetBTPoint());
-
- if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1))
- nItemIndex += 1;
-
- return nItemIndex;
-}
-
-void CFX_ListCtrl::Empty()
-{
- CFX_List::Empty();
- InvalidateItem(-1);
+void CFX_ListCtrl::SetSingleSelect(int32_t 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::Cancel()
-{
- m_aSelItems.DeselectAll();
+void CFX_ListCtrl::SetCaret(int32_t nItemIndex) {
+ if (!IsValid(nItemIndex))
+ return;
+
+ if (IsMultipleSel()) {
+ int32_t nOldIndex = m_nCaretIndex;
+
+ if (nOldIndex != nItemIndex) {
+ m_nCaretIndex = nItemIndex;
+
+ SetItemCaret(nOldIndex, FALSE);
+ SetItemCaret(nItemIndex, TRUE);
+
+ InvalidateItem(nOldIndex);
+ InvalidateItem(nItemIndex);
+ }
+ }
}
-int32_t CFX_ListCtrl::GetItemIndex(const CPDF_Point & point) const
-{
- return CFX_List::GetItemIndex(OutToIn(point));
+void CFX_ListCtrl::InvalidateItem(int32_t 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 (int32_t i = 0, sz = m_aSelItems.GetCount(); i < sz; i++) {
+ int32_t nItemIndex = m_aSelItems.GetItemIndex(i);
+ int32_t 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(int32_t nItemIndex) {
+ if (!IsValid(nItemIndex))
+ return;
+
+ if (IsMultipleSel()) {
+ m_aSelItems.Add(nItemIndex);
+ SelectItems();
+ } else
+ SetSingleSelect(nItemIndex);
}
-CFX_WideString CFX_ListCtrl::GetText() const
-{
- if (IsMultipleSel())
- return GetItemText(m_nCaretIndex);
- return GetItemText(m_nSelItem);
+FX_BOOL CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const {
+ CPDF_Rect rcPlate = GetPlateRect();
+ CPDF_Rect rcItem = GetItemRect(nItemIndex);
+
+ return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top;
}
+void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) {
+ if (!IsValid(nItemIndex))
+ return;
+
+ CPDF_Rect rcPlate = 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 = 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(int32_t nItemIndex) {
+ CFX_List::ReArrange(nItemIndex);
+ SetScrollInfo();
+}
+
+void CFX_ListCtrl::SetTopItem(int32_t nIndex) {
+ if (IsValid(nIndex)) {
+ GetPlateRect();
+ CPDF_Rect rcItem = CFX_List::GetItemRect(nIndex);
+ SetScrollPosY(rcItem.top);
+ }
+}
+
+int32_t CFX_ListCtrl::GetTopItem() const {
+ int32_t nItemIndex = GetItemIndex(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();
+}
+
+int32_t CFX_ListCtrl::GetItemIndex(const CPDF_Point& point) const {
+ return CFX_List::GetItemIndex(OutToIn(point));
+}
+
+CFX_WideString CFX_ListCtrl::GetText() const {
+ if (IsMultipleSel())
+ return GetItemText(m_nCaretIndex);
+ return GetItemText(m_nSelItem);
+}