summaryrefslogtreecommitdiff
path: root/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk/pdfwindow/PWL_ListCtrl.cpp')
-rw-r--r--fpdfsdk/pdfwindow/PWL_ListCtrl.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp b/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp
new file mode 100644
index 0000000000..7c2c1f4d17
--- /dev/null
+++ b/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp
@@ -0,0 +1,204 @@
+// 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 "fpdfsdk/include/pdfwindow/PWL_ListCtrl.h"
+#include "fpdfsdk/include/pdfwindow/PWL_Wnd.h"
+
+CPWL_ListCtrl::CPWL_ListCtrl()
+ : m_rcContent(0, 0, 0, 0),
+ m_ptScroll(0, 0),
+ m_fItemSpace(0.0f),
+ m_fTopSpace(0.0f),
+ m_fBottomSpace(0.0f) {}
+
+CPWL_ListCtrl::~CPWL_ListCtrl() {}
+
+void CPWL_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) {
+ m_ptScroll = point;
+
+ if (m_ptScroll.x < m_rcContent.left)
+ m_ptScroll.x = m_rcContent.left;
+
+ if (m_ptScroll.x > m_rcContent.right)
+ m_ptScroll.x = m_rcContent.right;
+
+ if (m_ptScroll.y > m_rcContent.top)
+ m_ptScroll.y = m_rcContent.top;
+
+ if (m_ptScroll.y < m_rcContent.bottom)
+ m_ptScroll.y = m_rcContent.bottom;
+}
+
+CFX_FloatPoint CPWL_ListCtrl::GetScrollPos() const {
+ return m_ptScroll;
+}
+
+CFX_FloatRect CPWL_ListCtrl::GetScrollArea() const {
+ return m_rcContent;
+}
+
+void CPWL_ListCtrl::ResetFace() {
+ ResetAll(FALSE, 0);
+}
+
+void CPWL_ListCtrl::ResetContent(int32_t nStart) {
+ if (nStart < 0)
+ nStart = 0;
+ if (nStart >= 0 && nStart < m_aChildren.GetSize())
+ ResetAll(TRUE, nStart);
+}
+
+FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth) {
+ FX_FLOAT fRet = m_fTopSpace;
+
+ FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
+
+ if (fLimitWidth > fBorderWidth * 2) {
+ for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
+ FX_FLOAT fLeft = pChild->GetItemLeftMargin();
+ FX_FLOAT fRight = pChild->GetItemRightMargin();
+
+ fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth * 2 - fLeft -
+ fRight);
+ fRet += m_fItemSpace;
+ }
+ }
+
+ fRet -= m_fItemSpace;
+ }
+
+ fRet += m_fBottomSpace;
+
+ return fRet;
+}
+
+void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, int32_t nStart) {
+ CFX_FloatRect rcClient = GetClientRect();
+
+ FX_FLOAT fWidth = rcClient.Width();
+
+ FX_FLOAT fy = 0.0f - m_fTopSpace;
+
+ if (nStart - 1 >= 0 && nStart - 1 < m_aChildren.GetSize())
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart - 1))
+ fy = pChild->GetWindowRect().bottom - m_fItemSpace;
+
+ for (int32_t i = nStart, sz = m_aChildren.GetSize(); i < sz; i++) {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
+ FX_FLOAT fLeft = pChild->GetItemLeftMargin();
+ FX_FLOAT fRight = pChild->GetItemRightMargin();
+
+ pChild->SetChildMatrix(CFX_Matrix(1, 0, 0, 1,
+ rcClient.left - m_ptScroll.x,
+ rcClient.top - m_ptScroll.y));
+
+ if (bMove) {
+ FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);
+ pChild->Move(
+ CFX_FloatRect(fLeft, fy - fItemHeight, fWidth - fRight, fy), TRUE,
+ FALSE);
+ fy -= fItemHeight;
+ fy -= m_fItemSpace;
+ }
+ }
+ }
+
+ fy += m_fItemSpace;
+
+ fy -= m_fBottomSpace;
+
+ if (bMove) {
+ m_rcContent.left = 0;
+ m_rcContent.top = 0;
+ m_rcContent.right = fWidth;
+ m_rcContent.bottom = fy;
+ }
+}
+
+void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace) {
+ m_fItemSpace = fSpace;
+}
+
+void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace) {
+ m_fTopSpace = fSpace;
+}
+
+void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace) {
+ m_fBottomSpace = fSpace;
+}
+
+void CPWL_ListCtrl::RePosChildWnd() {
+ ResetFace();
+}
+
+void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice,
+ CFX_Matrix* pUser2Device) {
+ pDevice->SaveState();
+ CFX_FloatRect rcClient = GetClientRect();
+ CFX_FloatRect rcTemp = rcClient;
+ pUser2Device->TransformRect(rcTemp);
+ pDevice->SetClip_Rect(FX_RECT((int32_t)rcTemp.left, (int32_t)rcTemp.bottom,
+ (int32_t)rcTemp.right, (int32_t)rcTemp.top));
+
+ for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
+ if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
+ CFX_FloatRect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
+ if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top)) {
+ CFX_Matrix mt = pChild->GetChildMatrix();
+ if (mt.IsIdentity()) {
+ pChild->DrawAppearance(pDevice, pUser2Device);
+ } else {
+ mt.Concat(*pUser2Device);
+ pChild->DrawAppearance(pDevice, &mt);
+ }
+ }
+ }
+ }
+
+ pDevice->RestoreState();
+}
+
+int32_t CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem) {
+ for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
+ if (pItem == m_aChildren.GetAt(i))
+ return i;
+ }
+
+ return -1;
+}
+
+CFX_FloatPoint CPWL_ListCtrl::InToOut(const CFX_FloatPoint& point) const {
+ CFX_FloatRect rcClient = GetClientRect();
+
+ return CFX_FloatPoint(point.x + rcClient.left - m_ptScroll.x,
+ point.y + rcClient.top - m_ptScroll.y);
+}
+
+CFX_FloatPoint CPWL_ListCtrl::OutToIn(const CFX_FloatPoint& point) const {
+ CFX_FloatRect rcClient = GetClientRect();
+
+ return CFX_FloatPoint(point.x - rcClient.left + m_ptScroll.x,
+ point.y - rcClient.top + m_ptScroll.y);
+}
+
+CFX_FloatRect CPWL_ListCtrl::InToOut(const CFX_FloatRect& rect) const {
+ CFX_FloatRect rcClient = GetClientRect();
+
+ return CFX_FloatRect(rect.left + rcClient.left - m_ptScroll.x,
+ rect.bottom + rcClient.top - m_ptScroll.y,
+ rect.right + rcClient.left - m_ptScroll.x,
+ rect.top + rcClient.top - m_ptScroll.y);
+}
+
+CFX_FloatRect CPWL_ListCtrl::OutToIn(const CFX_FloatRect& rect) const {
+ CFX_FloatRect rcClient = GetClientRect();
+
+ return CFX_FloatRect(rect.left - rcClient.left + m_ptScroll.x,
+ rect.bottom - rcClient.top + m_ptScroll.y,
+ rect.right - rcClient.left + m_ptScroll.x,
+ rect.top - rcClient.top + m_ptScroll.y);
+}