diff options
Diffstat (limited to 'fpdfsdk')
-rw-r--r-- | fpdfsdk/fxedit/fxet_list.cpp | 132 | ||||
-rw-r--r-- | fpdfsdk/fxedit/fxet_list.h | 139 |
2 files changed, 96 insertions, 175 deletions
diff --git a/fpdfsdk/fxedit/fxet_list.cpp b/fpdfsdk/fxedit/fxet_list.cpp index 6778122b7e..949d99217d 100644 --- a/fpdfsdk/fxedit/fxet_list.cpp +++ b/fpdfsdk/fxedit/fxet_list.cpp @@ -15,7 +15,7 @@ #include "fpdfsdk/pdfwindow/cpwl_list_box.h" #include "third_party/base/stl_util.h" -CFX_ListItem::CFX_ListItem() +CFX_ListCtrl::Item::Item() : m_pEdit(new CFX_Edit), m_bSelected(false), m_rcListItem(0.0f, 0.0f, 0.0f, 0.0f) { @@ -23,50 +23,29 @@ CFX_ListItem::CFX_ListItem() m_pEdit->Initialize(); } -CFX_ListItem::~CFX_ListItem() { -} +CFX_ListCtrl::Item::~Item() {} -void CFX_ListItem::SetFontMap(IPVT_FontMap* pFontMap) { +void CFX_ListCtrl::Item::SetFontMap(IPVT_FontMap* pFontMap) { m_pEdit->SetFontMap(pFontMap); } -CFX_Edit* CFX_ListItem::GetEdit() const { - return m_pEdit.get(); -} - -CFX_Edit_Iterator* CFX_ListItem::GetIterator() const { +CFX_Edit_Iterator* CFX_ListCtrl::Item::GetIterator() const { return m_pEdit->GetIterator(); } -void CFX_ListItem::SetRect(const CFX_FloatRect& rect) { - m_rcListItem = rect; -} - -CFX_FloatRect CFX_ListItem::GetRect() const { - return m_rcListItem; -} - -bool CFX_ListItem::IsSelected() const { - return m_bSelected; -} - -void CFX_ListItem::SetSelect(bool bSelected) { - m_bSelected = bSelected; -} - -void CFX_ListItem::SetText(const CFX_WideString& text) { +void CFX_ListCtrl::Item::SetText(const CFX_WideString& text) { m_pEdit->SetText(text); } -void CFX_ListItem::SetFontSize(float fFontSize) { +void CFX_ListCtrl::Item::SetFontSize(float fFontSize) { m_pEdit->SetFontSize(fFontSize); } -float CFX_ListItem::GetItemHeight() const { +float CFX_ListCtrl::Item::GetItemHeight() const { return m_pEdit->GetContentRect().Height(); } -uint16_t CFX_ListItem::GetFirstChar() const { +uint16_t CFX_ListCtrl::Item::GetFirstChar() const { CPVT_Word word; CFX_Edit_Iterator* pIterator = GetIterator(); pIterator->SetAt(1); @@ -74,18 +53,10 @@ uint16_t CFX_ListItem::GetFirstChar() const { return word.Word; } -CFX_WideString CFX_ListItem::GetText() const { +CFX_WideString CFX_ListCtrl::Item::GetText() const { return m_pEdit->GetText(); } -CFX_ListContainer::CFX_ListContainer() {} - -CFX_ListContainer::~CFX_ListContainer() {} - -void CFX_ListContainer::SetPlateRect(const CFX_FloatRect& rect) { - m_rcPlate = rect; -} - CPLST_Select::CPLST_Select() {} CPLST_Select::~CPLST_Select() {} @@ -146,18 +117,14 @@ CFX_ListCtrl::~CFX_ListCtrl() { Empty(); } -void CFX_ListCtrl::SetNotify(CPWL_List_Notify* pNotify) { - m_pNotify = pNotify; -} - CFX_PointF CFX_ListCtrl::InToOut(const CFX_PointF& point) const { - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; return CFX_PointF(point.x - (m_ptScrollPos.x - rcPlate.left), point.y - (m_ptScrollPos.y - rcPlate.top)); } CFX_PointF CFX_ListCtrl::OutToIn(const CFX_PointF& point) const { - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; return CFX_PointF(point.x + (m_ptScrollPos.x - rcPlate.left), point.y + (m_ptScrollPos.y - rcPlate.top)); } @@ -176,6 +143,28 @@ CFX_FloatRect CFX_ListCtrl::OutToIn(const CFX_FloatRect& rect) const { ptRightTop.y); } +CFX_PointF CFX_ListCtrl::InnerToOuter(const CFX_PointF& point) const { + return CFX_PointF(point.x + GetBTPoint().x, GetBTPoint().y - point.y); +} + +CFX_PointF CFX_ListCtrl::OuterToInner(const CFX_PointF& point) const { + return CFX_PointF(point.x - GetBTPoint().x, GetBTPoint().y - point.y); +} + +CFX_FloatRect CFX_ListCtrl::InnerToOuter(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftTop = InnerToOuter(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = InnerToOuter(CFX_PointF(rect.right, rect.bottom)); + return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, + ptLeftTop.y); +} + +CFX_FloatRect CFX_ListCtrl::OuterToInner(const CFX_FloatRect& rect) const { + CFX_PointF ptLeftTop = OuterToInner(CFX_PointF(rect.left, rect.top)); + CFX_PointF ptRightBottom = OuterToInner(CFX_PointF(rect.right, rect.bottom)); + return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, + ptLeftTop.y); +} + void CFX_ListCtrl::OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl) { @@ -304,7 +293,7 @@ bool CFX_ListCtrl::OnChar(uint16_t nChar, bool bShift, bool bCtrl) { } void CFX_ListCtrl::SetPlateRect(const CFX_FloatRect& rect) { - CFX_ListContainer::SetPlateRect(rect); + m_rcPlate = rect; m_ptScrollPos.x = rect.left; SetScrollPos(CFX_PointF(rect.left, rect.top)); ReArrange(0); @@ -321,18 +310,10 @@ CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const { CFX_FloatRect rcItem = m_ListItems[nIndex]->GetRect(); rcItem.left = 0.0f; - rcItem.right = GetPlateRect().Width(); + rcItem.right = m_rcPlate.Width(); return InnerToOuter(rcItem); } -int32_t CFX_ListCtrl::GetCaret() const { - return m_nCaretIndex; -} - -int32_t CFX_ListCtrl::GetSelect() const { - return m_nSelItem; -} - void CFX_ListCtrl::AddString(const CFX_WideString& str) { AddItem(str); ReArrange(GetCount() - 1); @@ -389,7 +370,7 @@ void CFX_ListCtrl::InvalidateItem(int32_t nItemIndex) { if (nItemIndex == -1) { if (!m_bNotifyFlag) { m_bNotifyFlag = true; - CFX_FloatRect rcRefresh = GetPlateRect(); + CFX_FloatRect rcRefresh = m_rcPlate; m_pNotify->IOnInvalidateRect(&rcRefresh); m_bNotifyFlag = false; } @@ -430,7 +411,7 @@ void CFX_ListCtrl::Select(int32_t nItemIndex) { } bool CFX_ListCtrl::IsItemVisible(int32_t nItemIndex) const { - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; CFX_FloatRect rcItem = GetItemRect(nItemIndex); return rcItem.bottom >= rcPlate.bottom && rcItem.top <= rcPlate.top; @@ -440,7 +421,7 @@ void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { if (!IsValid(nItemIndex)) return; - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; CFX_FloatRect rcItem = GetItemRectInternal(nItemIndex); CFX_FloatRect rcItemCtrl = GetItemRect(nItemIndex); @@ -457,7 +438,7 @@ void CFX_ListCtrl::ScrollToListItem(int32_t nItemIndex) { void CFX_ListCtrl::SetScrollInfo() { if (m_pNotify) { - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; CFX_FloatRect rcContent = GetContentRectInternal(); if (!m_bNotifyFlag) { @@ -476,7 +457,7 @@ void CFX_ListCtrl::SetScrollPos(const CFX_PointF& point) { void CFX_ListCtrl::SetScrollPosY(float fy) { if (!IsFloatEqual(m_ptScrollPos.y, fy)) { - CFX_FloatRect rcPlate = GetPlateRect(); + CFX_FloatRect rcPlate = m_rcPlate; CFX_FloatRect rcContent = GetContentRectInternal(); if (rcPlate.Height() > rcContent.Height()) { @@ -503,7 +484,7 @@ void CFX_ListCtrl::SetScrollPosY(float fy) { } CFX_FloatRect CFX_ListCtrl::GetContentRectInternal() const { - return InnerToOuter(CFX_ListContainer::GetContentRect()); + return InnerToOuter(m_rcContent); } CFX_FloatRect CFX_ListCtrl::GetContentRect() const { @@ -530,7 +511,6 @@ void CFX_ListCtrl::ReArrange(int32_t nItemIndex) { void CFX_ListCtrl::SetTopItem(int32_t nIndex) { if (IsValid(nIndex)) { - GetPlateRect(); CFX_FloatRect rcItem = GetItemRectInternal(nIndex); SetScrollPosY(rcItem.top); } @@ -581,16 +561,8 @@ CFX_WideString CFX_ListCtrl::GetText() const { return GetItemText(m_nSelItem); } -void CFX_ListCtrl::SetFontMap(IPVT_FontMap* pFontMap) { - m_pFontMap = pFontMap; -} - -void CFX_ListCtrl::SetFontSize(float fFontSize) { - m_fFontSize = fFontSize; -} - void CFX_ListCtrl::AddItem(const CFX_WideString& str) { - auto pListItem = pdfium::MakeUnique<CFX_ListItem>(); + auto pListItem = pdfium::MakeUnique<Item>(); pListItem->SetFontMap(m_pFontMap.Get()); pListItem->SetFontSize(m_fFontSize); pListItem->SetText(str); @@ -607,18 +579,9 @@ int32_t CFX_ListCtrl::GetCount() const { return pdfium::CollectionSize<int32_t>(m_ListItems); } -CFX_FloatRect CFX_ListCtrl::GetPlateRect() const { - return CFX_ListContainer::GetPlateRect(); -} - -float CFX_ListCtrl::GetFontSize() const { - return m_fFontSize; -} - float CFX_ListCtrl::GetFirstHeight() const { if (m_ListItems.empty() || !m_ListItems.front()) return 1.0f; - return m_ListItems.front()->GetItemHeight(); } @@ -648,7 +611,7 @@ int32_t CFX_ListCtrl::FindNext(int32_t nIndex, wchar_t nChar) const { if (nCircleIndex >= sz) nCircleIndex = 0; - if (CFX_ListItem* pListItem = m_ListItems[nCircleIndex].get()) { + if (Item* pListItem = m_ListItems[nCircleIndex].get()) { if (FXSYS_toupper(pListItem->GetFirstChar()) == FXSYS_toupper(nChar)) return nCircleIndex; } @@ -667,14 +630,6 @@ void CFX_ListCtrl::SetItemSelect(int32_t nIndex, bool bSelected) { m_ListItems[nIndex]->SetSelect(bSelected); } -void CFX_ListCtrl::SetMultipleSel(bool bMultiple) { - m_bMultiple = bMultiple; -} - -bool CFX_ListCtrl::IsMultipleSel() const { - return m_bMultiple; -} - bool CFX_ListCtrl::IsValid(int32_t nItemIndex) const { return pdfium::IndexInBounds(m_ListItems, nItemIndex); } @@ -682,6 +637,5 @@ bool CFX_ListCtrl::IsValid(int32_t nItemIndex) const { CFX_WideString CFX_ListCtrl::GetItemText(int32_t nIndex) const { if (pdfium::IndexInBounds(m_ListItems, nIndex) && m_ListItems[nIndex]) return m_ListItems[nIndex]->GetText(); - return L""; } diff --git a/fpdfsdk/fxedit/fxet_list.h b/fpdfsdk/fxedit/fxet_list.h index 6884c69391..2b353a8a46 100644 --- a/fpdfsdk/fxedit/fxet_list.h +++ b/fpdfsdk/fxedit/fxet_list.h @@ -19,77 +19,6 @@ class CFX_Edit; class CFX_Edit_Iterator; class CPWL_List_Notify; -class CFX_ListItem final { - public: - CFX_ListItem(); - ~CFX_ListItem(); - - void SetFontMap(IPVT_FontMap* pFontMap); - CFX_Edit* GetEdit() const; - - void SetRect(const CFX_FloatRect& rect); - void SetSelect(bool bSelected); - void SetText(const CFX_WideString& text); - void SetFontSize(float fFontSize); - CFX_WideString GetText() const; - - CFX_FloatRect GetRect() const; - bool IsSelected() const; - float GetItemHeight() const; - uint16_t GetFirstChar() const; - - private: - CFX_Edit_Iterator* GetIterator() const; - - std::unique_ptr<CFX_Edit> m_pEdit; - bool m_bSelected; - CFX_FloatRect m_rcListItem; -}; - -class CFX_ListContainer { - public: - CFX_ListContainer(); - virtual ~CFX_ListContainer(); - - virtual void SetPlateRect(const CFX_FloatRect& rect); - - CFX_FloatRect GetPlateRect() const { return m_rcPlate; } - void SetContentRect(const CFX_FloatRect& rect) { m_rcContent = rect; } - CFX_FloatRect GetContentRect() const { return m_rcContent; } - CFX_PointF GetBTPoint() const { - return CFX_PointF(m_rcPlate.left, m_rcPlate.top); - } - CFX_PointF GetETPoint() const { - return CFX_PointF(m_rcPlate.right, m_rcPlate.bottom); - } - - public: - CFX_PointF InnerToOuter(const CFX_PointF& point) const { - return CFX_PointF(point.x + GetBTPoint().x, GetBTPoint().y - point.y); - } - CFX_PointF OuterToInner(const CFX_PointF& point) const { - return CFX_PointF(point.x - GetBTPoint().x, GetBTPoint().y - point.y); - } - CFX_FloatRect InnerToOuter(const CFX_FloatRect& rect) const { - CFX_PointF ptLeftTop = InnerToOuter(CFX_PointF(rect.left, rect.top)); - CFX_PointF ptRightBottom = - InnerToOuter(CFX_PointF(rect.right, rect.bottom)); - return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, - ptLeftTop.y); - } - CFX_FloatRect OuterToInner(const CFX_FloatRect& rect) const { - CFX_PointF ptLeftTop = OuterToInner(CFX_PointF(rect.left, rect.top)); - CFX_PointF ptRightBottom = - OuterToInner(CFX_PointF(rect.right, rect.bottom)); - return CFX_FloatRect(ptLeftTop.x, ptRightBottom.y, ptRightBottom.x, - ptLeftTop.y); - } - - private: - CFX_FloatRect m_rcPlate; - CFX_FloatRect m_rcContent; -}; - class CPLST_Select { public: enum State { DESELECTING = -1, NORMAL = 0, SELECTING = 1 }; @@ -112,15 +41,12 @@ class CPLST_Select { std::map<int32_t, State> m_Items; }; -class CFX_ListCtrl : protected CFX_ListContainer { +class CFX_ListCtrl { public: CFX_ListCtrl(); - ~CFX_ListCtrl() override; - - // CFX_ListContainer - void SetPlateRect(const CFX_FloatRect& rect) override; + ~CFX_ListCtrl(); - void SetNotify(CPWL_List_Notify* pNotify); + void SetNotify(CPWL_List_Notify* pNotify) { m_pNotify = pNotify; } void OnMouseDown(const CFX_PointF& point, bool bShift, bool bCtrl); void OnMouseMove(const CFX_PointF& point, bool bShift, bool bCtrl); void OnVK_UP(bool bShift, bool bCtrl); @@ -135,10 +61,15 @@ class CFX_ListCtrl : protected CFX_ListContainer { void SetScrollPos(const CFX_PointF& point); void ScrollToListItem(int32_t nItemIndex); CFX_FloatRect GetItemRect(int32_t nIndex) const; - int32_t GetCaret() const; - int32_t GetSelect() const; + int32_t GetCaret() const { return m_nCaretIndex; } + int32_t GetSelect() const { return m_nSelItem; } int32_t GetTopItem() const; + void SetContentRect(const CFX_FloatRect& rect) { m_rcContent = rect; } CFX_FloatRect GetContentRect() const; + CFX_PointF GetBTPoint() const { + return CFX_PointF(m_rcPlate.left, m_rcPlate.top); + } + int32_t GetItemIndex(const CFX_PointF& point) const; void AddString(const CFX_WideString& str); void SetTopItem(int32_t nIndex); @@ -148,16 +79,18 @@ class CFX_ListCtrl : protected CFX_ListContainer { void Cancel(); CFX_WideString GetText() const; - void SetFontMap(IPVT_FontMap* pFontMap); - void SetFontSize(float fFontSize); - CFX_FloatRect GetPlateRect() const; - float GetFontSize() const; + void SetFontMap(IPVT_FontMap* pFontMap) { m_pFontMap = pFontMap; } + void SetFontSize(float fFontSize) { m_fFontSize = fFontSize; } + CFX_FloatRect GetPlateRect() const { return m_rcPlate; } + void SetPlateRect(const CFX_FloatRect& rect); + + float GetFontSize() const { return m_fFontSize; } CFX_Edit* GetItemEdit(int32_t nIndex) const; int32_t GetCount() const; bool IsItemSelected(int32_t nIndex) const; float GetFirstHeight() const; - void SetMultipleSel(bool bMultiple); - bool IsMultipleSel() const; + void SetMultipleSel(bool bMultiple) { m_bMultiple = bMultiple; } + bool IsMultipleSel() const { return m_bMultiple; } bool IsValid(int32_t nItemIndex) const; int32_t FindNext(int32_t nIndex, wchar_t nChar) const; int32_t GetFirstSelected() const; @@ -167,7 +100,39 @@ class CFX_ListCtrl : protected CFX_ListContainer { CFX_FloatRect InToOut(const CFX_FloatRect& rect) const; CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const; + CFX_PointF InnerToOuter(const CFX_PointF& point) const; + CFX_PointF OuterToInner(const CFX_PointF& point) const; + CFX_FloatRect InnerToOuter(const CFX_FloatRect& rect) const; + CFX_FloatRect OuterToInner(const CFX_FloatRect& rect) const; + private: + class Item { + public: + Item(); + ~Item(); + + void SetFontMap(IPVT_FontMap* pFontMap); + CFX_Edit* GetEdit() const { return m_pEdit.get(); } + + void SetRect(const CFX_FloatRect& rect) { m_rcListItem = rect; } + void SetSelect(bool bSelected) { m_bSelected = bSelected; } + void SetText(const CFX_WideString& text); + void SetFontSize(float fFontSize); + CFX_WideString GetText() const; + + CFX_FloatRect GetRect() const { return m_rcListItem; } + bool IsSelected() const { return m_bSelected; } + float GetItemHeight() const; + uint16_t GetFirstChar() const; + + private: + CFX_Edit_Iterator* GetIterator() const; + + std::unique_ptr<CFX_Edit> m_pEdit; + bool m_bSelected; + CFX_FloatRect m_rcListItem; + }; + void ReArrange(int32_t nItemIndex); CFX_FloatRect GetItemRectInternal(int32_t nIndex) const; CFX_FloatRect GetContentRectInternal() const; @@ -183,6 +148,8 @@ class CFX_ListCtrl : protected CFX_ListContainer { void SetItemSelect(int32_t nItemIndex, bool bSelected); int32_t GetLastSelected() const; + CFX_FloatRect m_rcPlate; + CFX_FloatRect m_rcContent; CFX_UnownedPtr<CPWL_List_Notify> m_pNotify; bool m_bNotifyFlag; CFX_PointF m_ptScrollPos; @@ -191,7 +158,7 @@ class CFX_ListCtrl : protected CFX_ListContainer { int32_t m_nFootIndex; // for multiple bool m_bCtrlSel; // for multiple int32_t m_nCaretIndex; // for multiple - std::vector<std::unique_ptr<CFX_ListItem>> m_ListItems; + std::vector<std::unique_ptr<Item>> m_ListItems; float m_fFontSize; CFX_UnownedPtr<IPVT_FontMap> m_pFontMap; bool m_bMultiple; |