summaryrefslogtreecommitdiff
path: root/fpdfsdk/fxedit/fxet_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/fxedit/fxet_list.cpp')
-rw-r--r--fpdfsdk/fxedit/fxet_list.cpp417
1 files changed, 202 insertions, 215 deletions
diff --git a/fpdfsdk/fxedit/fxet_list.cpp b/fpdfsdk/fxedit/fxet_list.cpp
index 662a64b00a..b4d5473f6c 100644
--- a/fpdfsdk/fxedit/fxet_list.cpp
+++ b/fpdfsdk/fxedit/fxet_list.cpp
@@ -8,9 +8,10 @@
#include "core/fpdfdoc/include/cpvt_word.h"
#include "fpdfsdk/fxedit/include/fxet_edit.h"
+#include "fpdfsdk/pdfwindow/PWL_ListBox.h"
CFX_ListItem::CFX_ListItem()
- : m_pEdit(IFX_Edit::NewEdit()),
+ : m_pEdit(new CFX_Edit),
m_bSelected(FALSE),
m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) {
m_pEdit->SetAlignmentV(1);
@@ -18,18 +19,17 @@ CFX_ListItem::CFX_ListItem()
}
CFX_ListItem::~CFX_ListItem() {
- IFX_Edit::DelEdit(m_pEdit);
}
void CFX_ListItem::SetFontMap(IPVT_FontMap* pFontMap) {
m_pEdit->SetFontMap(pFontMap);
}
-IFX_Edit* CFX_ListItem::GetEdit() const {
- return m_pEdit;
+CFX_Edit* CFX_ListItem::GetEdit() const {
+ return m_pEdit.get();
}
-IFX_Edit_Iterator* CFX_ListItem::GetIterator() const {
+CFX_Edit_Iterator* CFX_ListItem::GetIterator() const {
return m_pEdit->GetIterator();
}
@@ -63,7 +63,7 @@ FX_FLOAT CFX_ListItem::GetItemHeight() const {
uint16_t CFX_ListItem::GetFirstChar() const {
CPVT_Word word;
- IFX_Edit_Iterator* pIterator = GetIterator();
+ CFX_Edit_Iterator* pIterator = GetIterator();
pIterator->SetAt(1);
pIterator->GetWord(word);
return word.Word;
@@ -81,203 +81,6 @@ void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) {
m_rcPlate = rect;
}
-CFX_List::CFX_List()
- : m_fFontSize(0.0f), m_pFontMap(nullptr), m_bMultiple(FALSE) {}
-
-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::SetFontMap(IPVT_FontMap* pFontMap) {
- m_pFontMap = pFontMap;
-}
-
-void CFX_List::SetFontSize(FX_FLOAT fFontSize) {
- m_fFontSize = fFontSize;
-}
-
-void CFX_List::AddItem(const FX_WCHAR* str) {
- CFX_ListItem* pListItem = new CFX_ListItem();
- pListItem->SetFontMap(m_pFontMap);
- pListItem->SetFontSize(m_fFontSize);
- pListItem->SetText(str);
- m_aListItems.Add(pListItem);
-}
-
-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));
-}
-
-IFX_Edit* CFX_List::GetItemEdit(int32_t nIndex) const {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
- return pListItem->GetEdit();
- }
-
- return nullptr;
-}
-
-int32_t CFX_List::GetCount() const {
- return m_aListItems.GetSize();
-}
-
-CFX_FloatRect CFX_List::GetPlateRect() const {
- return CFX_ListContainer::GetPlateRect();
-}
-
-CFX_FloatRect CFX_List::GetContentRect() const {
- return InnerToOuter(CFX_ListContainer::GetContentRect());
-}
-
-FX_FLOAT CFX_List::GetFontSize() const {
- return m_fFontSize;
-}
-
-int32_t CFX_List::GetItemIndex(const CFX_FloatPoint& point) const {
- CFX_FloatPoint pt = OuterToInner(point);
-
- FX_BOOL bFirst = TRUE;
- FX_BOOL bLast = TRUE;
-
- 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;
-}
-
-FX_FLOAT CFX_List::GetFirstHeight() const {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) {
- return pListItem->GetItemHeight();
- }
-
- return 1.0f;
-}
-
-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;
-}
-
-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_WCHAR CFX_List::Toupper(FX_WCHAR c) const {
- if ((c >= 'a') && (c <= 'z'))
- c = c - ('a' - 'A');
- return c;
-}
-
-int32_t CFX_List::FindNext(int32_t nIndex, FX_WCHAR nChar) const {
- int32_t nCircleIndex = nIndex;
-
- for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
- nCircleIndex++;
- if (nCircleIndex >= sz)
- nCircleIndex = 0;
-
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) {
- if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar))
- return nCircleIndex;
- }
- }
-
- return nCircleIndex;
-}
-
-CFX_FloatRect CFX_List::GetItemRect(int32_t nIndex) const {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
- CFX_FloatRect rcItem = pListItem->GetRect();
- rcItem.left = 0.0f;
- rcItem.right = GetPlateRect().Width();
- return InnerToOuter(CLST_Rect(rcItem));
- }
-
- return CFX_FloatRect();
-}
-
-FX_BOOL CFX_List::IsItemSelected(int32_t nIndex) const {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex))
- return pListItem->IsSelected();
- return FALSE;
-}
-
-void CFX_List::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) {
- pListItem->SetSelect(bSelected);
- }
-}
-
-void CFX_List::SetMultipleSel(FX_BOOL bMultiple) {
- m_bMultiple = bMultiple;
-}
-
-FX_BOOL CFX_List::IsMultipleSel() const {
- return m_bMultiple;
-}
-
-FX_BOOL CFX_List::IsValid(int32_t nItemIndex) const {
- return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
-}
-
-CFX_WideString CFX_List::GetItemText(int32_t nIndex) const {
- if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
- return pListItem->GetText();
- }
-
- return L"";
-}
-
CPLST_Select::CPLST_Select() {}
CPLST_Select::~CPLST_Select() {
@@ -392,11 +195,16 @@ CFX_ListCtrl::CFX_ListCtrl()
m_nSelItem(-1),
m_nFootIndex(-1),
m_bCtrlSel(FALSE),
- m_nCaretIndex(-1) {}
+ m_nCaretIndex(-1),
+ m_fFontSize(0.0f),
+ m_pFontMap(nullptr),
+ m_bMultiple(FALSE) {}
-CFX_ListCtrl::~CFX_ListCtrl() {}
+CFX_ListCtrl::~CFX_ListCtrl() {
+ Empty();
+}
-void CFX_ListCtrl::SetNotify(IFX_List_Notify* pNotify) {
+void CFX_ListCtrl::SetNotify(CPWL_List_Notify* pNotify) {
m_pNotify = pNotify;
}
@@ -566,7 +374,18 @@ void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) {
}
CFX_FloatRect CFX_ListCtrl::GetItemRect(int32_t nIndex) const {
- return InToOut(CFX_List::GetItemRect(nIndex));
+ return InToOut(GetItemRectInternal(nIndex));
+}
+
+CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ CFX_FloatRect rcItem = pListItem->GetRect();
+ rcItem.left = 0.0f;
+ rcItem.right = GetPlateRect().Width();
+ return InnerToOuter(CLST_Rect(rcItem));
+ }
+
+ return CFX_FloatRect();
}
int32_t CFX_ListCtrl::GetCaret() const {
@@ -695,7 +514,7 @@ void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) {
return;
CFX_FloatRect rcPlate = GetPlateRect();
- CFX_FloatRect rcItem = CFX_List::GetItemRect(nItemIndex);
+ CFX_FloatRect rcItem = GetItemRectInternal(nItemIndex);
CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex);
if (FX_EDIT_IsFloatSmaller(rcItemCtrl.bottom, rcPlate.bottom)) {
@@ -712,7 +531,7 @@ void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) {
void CFX_ListCtrl::SetScrollInfo() {
if (m_pNotify) {
CFX_FloatRect rcPlate = GetPlateRect();
- CFX_FloatRect rcContent = CFX_List::GetContentRect();
+ CFX_FloatRect rcContent = GetContentRectInternal();
if (!m_bNotifyFlag) {
m_bNotifyFlag = TRUE;
@@ -731,7 +550,7 @@ void CFX_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) {
void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) {
if (!FX_EDIT_IsFloatEqual(m_ptScrollPos.y, fy)) {
CFX_FloatRect rcPlate = GetPlateRect();
- CFX_FloatRect rcContent = CFX_List::GetContentRect();
+ CFX_FloatRect rcContent = GetContentRectInternal();
if (rcPlate.Height() > rcContent.Height()) {
fy = rcPlate.top;
@@ -756,19 +575,36 @@ void CFX_ListCtrl::SetScrollPosY(FX_FLOAT fy) {
}
}
+CFX_FloatRect CFX_ListCtrl::GetContentRectInternal() const {
+ return InnerToOuter(CFX_ListContainer::GetContentRect());
+}
+
CFX_FloatRect CFX_ListCtrl::GetContentRect() const {
- return InToOut(CFX_List::GetContentRect());
+ return InToOut(GetContentRectInternal());
}
void CFX_ListCtrl::ReArrange(int32_t nItemIndex) {
- CFX_List::ReArrange(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));
SetScrollInfo();
}
void CFX_ListCtrl::SetTopItem(int32_t nIndex) {
if (IsValid(nIndex)) {
GetPlateRect();
- CFX_FloatRect rcItem = CFX_List::GetItemRect(nIndex);
+ CFX_FloatRect rcItem = GetItemRectInternal(nIndex);
SetScrollPosY(rcItem.top);
}
}
@@ -783,7 +619,11 @@ int32_t CFX_ListCtrl::GetTopItem() const {
}
void CFX_ListCtrl::Empty() {
- CFX_List::Empty();
+ for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++)
+ delete m_aListItems.GetAt(i);
+
+ m_aListItems.RemoveAll();
+
InvalidateItem(-1);
}
@@ -792,7 +632,35 @@ void CFX_ListCtrl::Cancel() {
}
int32_t CFX_ListCtrl::GetItemIndex(const CFX_FloatPoint& point) const {
- return CFX_List::GetItemIndex(OutToIn(point));
+ CFX_FloatPoint pt = OuterToInner(OutToIn(point));
+
+ FX_BOOL bFirst = TRUE;
+ FX_BOOL bLast = TRUE;
+
+ 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;
}
CFX_WideString CFX_ListCtrl::GetText() const {
@@ -800,3 +668,122 @@ CFX_WideString CFX_ListCtrl::GetText() const {
return GetItemText(m_nCaretIndex);
return GetItemText(m_nSelItem);
}
+
+void CFX_ListCtrl::SetFontMap(IPVT_FontMap* pFontMap) {
+ m_pFontMap = pFontMap;
+}
+
+void CFX_ListCtrl::SetFontSize(FX_FLOAT fFontSize) {
+ m_fFontSize = fFontSize;
+}
+
+void CFX_ListCtrl::AddItem(const FX_WCHAR* str) {
+ CFX_ListItem* pListItem = new CFX_ListItem();
+ pListItem->SetFontMap(m_pFontMap);
+ pListItem->SetFontSize(m_fFontSize);
+ pListItem->SetText(str);
+ m_aListItems.Add(pListItem);
+}
+
+CFX_Edit* CFX_ListCtrl::GetItemEdit(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ return pListItem->GetEdit();
+ }
+
+ return nullptr;
+}
+
+int32_t CFX_ListCtrl::GetCount() const {
+ return m_aListItems.GetSize();
+}
+
+CFX_FloatRect CFX_ListCtrl::GetPlateRect() const {
+ return CFX_ListContainer::GetPlateRect();
+}
+
+FX_FLOAT CFX_ListCtrl::GetFontSize() const {
+ return m_fFontSize;
+}
+
+FX_FLOAT CFX_ListCtrl::GetFirstHeight() const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) {
+ return pListItem->GetItemHeight();
+ }
+
+ return 1.0f;
+}
+
+int32_t CFX_ListCtrl::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;
+}
+
+int32_t CFX_ListCtrl::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_WCHAR CFX_ListCtrl::Toupper(FX_WCHAR c) const {
+ if ((c >= 'a') && (c <= 'z'))
+ c = c - ('a' - 'A');
+ return c;
+}
+
+int32_t CFX_ListCtrl::FindNext(int32_t nIndex, FX_WCHAR nChar) const {
+ int32_t nCircleIndex = nIndex;
+
+ for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
+ nCircleIndex++;
+ if (nCircleIndex >= sz)
+ nCircleIndex = 0;
+
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) {
+ if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar))
+ return nCircleIndex;
+ }
+ }
+
+ return nCircleIndex;
+}
+
+FX_BOOL CFX_ListCtrl::IsItemSelected(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex))
+ return pListItem->IsSelected();
+ return FALSE;
+}
+
+void CFX_ListCtrl::SetItemSelect(int32_t nItemIndex, FX_BOOL bSelected) {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) {
+ pListItem->SetSelect(bSelected);
+ }
+}
+
+void CFX_ListCtrl::SetMultipleSel(FX_BOOL bMultiple) {
+ m_bMultiple = bMultiple;
+}
+
+FX_BOOL CFX_ListCtrl::IsMultipleSel() const {
+ return m_bMultiple;
+}
+
+FX_BOOL CFX_ListCtrl::IsValid(int32_t nItemIndex) const {
+ return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
+}
+
+CFX_WideString CFX_ListCtrl::GetItemText(int32_t nIndex) const {
+ if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
+ return pListItem->GetText();
+ }
+
+ return L"";
+}