summaryrefslogtreecommitdiff
path: root/fpdfsdk
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk')
-rw-r--r--fpdfsdk/fxedit/fxet_list.cpp117
-rw-r--r--fpdfsdk/fxedit/fxet_list.h27
2 files changed, 32 insertions, 112 deletions
diff --git a/fpdfsdk/fxedit/fxet_list.cpp b/fpdfsdk/fxedit/fxet_list.cpp
index b10bb6284b..c10b6a205e 100644
--- a/fpdfsdk/fxedit/fxet_list.cpp
+++ b/fpdfsdk/fxedit/fxet_list.cpp
@@ -6,6 +6,7 @@
#include "fpdfsdk/fxedit/fxet_list.h"
+#include <algorithm>
#include <utility>
#include "core/fpdfdoc/cpvt_word.h"
@@ -86,108 +87,46 @@ void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) {
CPLST_Select::CPLST_Select() {}
-CPLST_Select::~CPLST_Select() {
- for (int32_t i = 0, sz = m_aItems.GetSize(); i < sz; i++)
- delete m_aItems.GetAt(i);
-
- m_aItems.RemoveAll();
-}
+CPLST_Select::~CPLST_Select() {}
void CPLST_Select::Add(int32_t nItemIndex) {
- int32_t nIndex = Find(nItemIndex);
-
- 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;
- }
- }
+ m_Items[nItemIndex] = SELECTING;
}
void CPLST_Select::Add(int32_t nBeginIndex, int32_t nEndIndex) {
- if (nBeginIndex > nEndIndex) {
- int32_t nTemp = nEndIndex;
- nEndIndex = nBeginIndex;
- nBeginIndex = nTemp;
- }
+ if (nBeginIndex > nEndIndex)
+ std::swap(nBeginIndex, nEndIndex);
- for (int32_t i = nBeginIndex; i <= nEndIndex; i++)
+ for (int32_t i = nBeginIndex; i <= nEndIndex; ++i)
Add(i);
}
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;
- }
+ auto it = m_Items.find(nItemIndex);
+ if (it != m_Items.end())
+ it->second = DESELECTING;
}
void CPLST_Select::Sub(int32_t nBeginIndex, int32_t nEndIndex) {
- if (nBeginIndex > nEndIndex) {
- int32_t nTemp = nEndIndex;
- nEndIndex = nBeginIndex;
- nBeginIndex = nTemp;
- }
+ if (nBeginIndex > nEndIndex)
+ std::swap(nBeginIndex, nEndIndex);
- for (int32_t i = nBeginIndex; i <= nEndIndex; i++)
+ for (int32_t i = nBeginIndex; i <= nEndIndex; ++i)
Sub(i);
}
-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;
-}
-
-bool CPLST_Select::IsExist(int32_t nItemIndex) const {
- return Find(nItemIndex) >= 0;
-}
-
-int32_t CPLST_Select::GetCount() const {
- return m_aItems.GetSize();
-}
-
-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 -1;
-}
-
-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;
-
- return 0;
-}
-
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;
- }
- }
+ for (auto& item : m_Items)
+ item.second = DESELECTING;
}
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;
- }
- }
+ auto it = m_Items.begin();
+ while (it != m_Items.end()) {
+ if (it->second == DESELECTING)
+ it = m_Items.erase(it);
+ else
+ (it++)->second = NORMAL;
}
}
@@ -470,20 +409,10 @@ void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) {
}
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;
- }
+ for (const auto& item : m_aSelItems) {
+ if (item.second != CPLST_Select::NORMAL)
+ SetMultipleSelect(item.first, item.second == CPLST_Select::SELECTING);
}
-
m_aSelItems.Done();
}
diff --git a/fpdfsdk/fxedit/fxet_list.h b/fpdfsdk/fxedit/fxet_list.h
index 65426e0681..d0fef1ca4b 100644
--- a/fpdfsdk/fxedit/fxet_list.h
+++ b/fpdfsdk/fxedit/fxet_list.h
@@ -7,6 +7,7 @@
#ifndef FPDFSDK_FXEDIT_FXET_LIST_H_
#define FPDFSDK_FXEDIT_FXET_LIST_H_
+#include <map>
#include <memory>
#include <vector>
@@ -169,36 +170,26 @@ class CFX_ListContainer {
CLST_Rect m_rcContent; // positive forever!
};
-struct CPLST_Select_Item {
- CPLST_Select_Item(int32_t other_nItemIndex, int32_t other_nState) {
- nItemIndex = other_nItemIndex;
- nState = other_nState;
- }
-
- int32_t nItemIndex;
- int32_t nState; // 0:normal select -1:to deselect 1: to select
-};
-
class CPLST_Select {
public:
+ enum State { DESELECTING = -1, NORMAL = 0, SELECTING = 1 };
+ using const_iterator = std::map<int32_t, State>::const_iterator;
+
CPLST_Select();
virtual ~CPLST_Select();
- public:
void Add(int32_t nItemIndex);
void Add(int32_t nBeginIndex, int32_t nEndIndex);
void Sub(int32_t nItemIndex);
void Sub(int32_t nBeginIndex, int32_t nEndIndex);
- bool IsExist(int32_t nItemIndex) const;
- int32_t Find(int32_t nItemIndex) const;
- int32_t GetCount() const;
- int32_t GetItemIndex(int32_t nIndex) const;
- int32_t GetState(int32_t nIndex) const;
- void Done();
void DeselectAll();
+ void Done();
+
+ const_iterator begin() const { return m_Items.begin(); }
+ const_iterator end() const { return m_Items.end(); }
private:
- CFX_ArrayTemplate<CPLST_Select_Item*> m_aItems;
+ std::map<int32_t, State> m_Items;
};
class CFX_ListCtrl : protected CFX_ListContainer {