Add type cast definitions for CPDF_Boolean.
[pdfium.git] / fpdfsdk / src / pdfwindow / PWL_ListCtrl.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/pdfwindow/PDFWindow.h"
8 #include "../../include/pdfwindow/PWL_Wnd.h"
9 #include "../../include/pdfwindow/PWL_ListCtrl.h"
10
11 /* ---------------------------- CPWL_ListCtrl ---------------------------- */
12
13 CPWL_ListCtrl::CPWL_ListCtrl()
14     : m_rcContent(0, 0, 0, 0),
15       m_ptScroll(0, 0),
16       m_fItemSpace(0.0f),
17       m_fTopSpace(0.0f),
18       m_fBottomSpace(0.0f) {}
19
20 CPWL_ListCtrl::~CPWL_ListCtrl() {}
21
22 void CPWL_ListCtrl::SetScrollPos(const CPDF_Point& point) {
23   m_ptScroll = point;
24
25   if (m_ptScroll.x < m_rcContent.left)
26     m_ptScroll.x = m_rcContent.left;
27
28   if (m_ptScroll.x > m_rcContent.right)
29     m_ptScroll.x = m_rcContent.right;
30
31   if (m_ptScroll.y > m_rcContent.top)
32     m_ptScroll.y = m_rcContent.top;
33
34   if (m_ptScroll.y < m_rcContent.bottom)
35     m_ptScroll.y = m_rcContent.bottom;
36 }
37
38 CPDF_Point CPWL_ListCtrl::GetScrollPos() const {
39   return m_ptScroll;
40 }
41
42 CPDF_Rect CPWL_ListCtrl::GetScrollArea() const {
43   return m_rcContent;
44 }
45
46 void CPWL_ListCtrl::ResetFace() {
47   ResetAll(FALSE, 0);
48 }
49
50 void CPWL_ListCtrl::ResetContent(int32_t nStart) {
51   if (nStart < 0)
52     nStart = 0;
53   if (nStart >= 0 && nStart < m_aChildren.GetSize())
54     ResetAll(TRUE, nStart);
55 }
56
57 FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth) {
58   FX_FLOAT fRet = m_fTopSpace;
59
60   FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
61
62   if (fLimitWidth > fBorderWidth * 2) {
63     for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
64       if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
65         FX_FLOAT fLeft = pChild->GetItemLeftMargin();
66         FX_FLOAT fRight = pChild->GetItemRightMargin();
67
68         fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth * 2 - fLeft -
69                                       fRight);
70         fRet += m_fItemSpace;
71       }
72     }
73
74     fRet -= m_fItemSpace;
75   }
76
77   fRet += m_fBottomSpace;
78
79   return fRet;
80 }
81
82 void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, int32_t nStart) {
83   CPDF_Rect rcClient = GetClientRect();
84
85   FX_FLOAT fWidth = rcClient.Width();
86
87   FX_FLOAT fy = 0.0f - m_fTopSpace;
88
89   if (nStart - 1 >= 0 && nStart - 1 < m_aChildren.GetSize())
90     if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart - 1))
91       fy = pChild->GetWindowRect().bottom - m_fItemSpace;
92
93   for (int32_t i = nStart, sz = m_aChildren.GetSize(); i < sz; i++) {
94     if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
95       FX_FLOAT fLeft = pChild->GetItemLeftMargin();
96       FX_FLOAT fRight = pChild->GetItemRightMargin();
97
98       pChild->SetChildMatrix(CPDF_Matrix(1, 0, 0, 1,
99                                          rcClient.left - m_ptScroll.x,
100                                          rcClient.top - m_ptScroll.y));
101
102       if (bMove) {
103         FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);
104         pChild->Move(CPDF_Rect(fLeft, fy - fItemHeight, fWidth - fRight, fy),
105                      TRUE, FALSE);
106         fy -= fItemHeight;
107         fy -= m_fItemSpace;
108       }
109     }
110   }
111
112   fy += m_fItemSpace;
113
114   fy -= m_fBottomSpace;
115
116   if (bMove) {
117     m_rcContent.left = 0;
118     m_rcContent.top = 0;
119     m_rcContent.right = fWidth;
120     m_rcContent.bottom = fy;
121   }
122 }
123
124 void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace) {
125   m_fItemSpace = fSpace;
126 }
127
128 void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace) {
129   m_fTopSpace = fSpace;
130 }
131
132 void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace) {
133   m_fBottomSpace = fSpace;
134 }
135
136 void CPWL_ListCtrl::RePosChildWnd() {
137   ResetFace();
138 }
139
140 void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice,
141                                         CPDF_Matrix* pUser2Device) {
142   pDevice->SaveState();
143   CPDF_Rect rcClient = GetClientRect();
144   CPDF_Rect rcTemp = rcClient;
145   pUser2Device->TransformRect(rcTemp);
146   FX_RECT rcClip((int32_t)rcTemp.left, (int32_t)rcTemp.bottom,
147                  (int32_t)rcTemp.right, (int32_t)rcTemp.top);
148
149   pDevice->SetClip_Rect(&rcClip);
150
151   for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
152     if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
153       CPDF_Rect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
154       if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top)) {
155         CPDF_Matrix mt = pChild->GetChildMatrix();
156         if (mt.IsIdentity()) {
157           pChild->DrawAppearance(pDevice, pUser2Device);
158         } else {
159           mt.Concat(*pUser2Device);
160           pChild->DrawAppearance(pDevice, &mt);
161         }
162       }
163     }
164   }
165
166   pDevice->RestoreState();
167 }
168
169 int32_t CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem) {
170   for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
171     if (pItem == m_aChildren.GetAt(i))
172       return i;
173   }
174
175   return -1;
176 }
177
178 CPDF_Point CPWL_ListCtrl::InToOut(const CPDF_Point& point) const {
179   CPDF_Rect rcClient = GetClientRect();
180
181   return CPDF_Point(point.x + rcClient.left - m_ptScroll.x,
182                     point.y + rcClient.top - m_ptScroll.y);
183 }
184
185 CPDF_Point CPWL_ListCtrl::OutToIn(const CPDF_Point& point) const {
186   CPDF_Rect rcClient = GetClientRect();
187
188   return CPDF_Point(point.x - rcClient.left + m_ptScroll.x,
189                     point.y - rcClient.top + m_ptScroll.y);
190 }
191
192 CPDF_Rect CPWL_ListCtrl::InToOut(const CPDF_Rect& rect) const {
193   CPDF_Rect rcClient = GetClientRect();
194
195   return CPDF_Rect(rect.left + rcClient.left - m_ptScroll.x,
196                    rect.bottom + rcClient.top - m_ptScroll.y,
197                    rect.right + rcClient.left - m_ptScroll.x,
198                    rect.top + rcClient.top - m_ptScroll.y);
199 }
200
201 CPDF_Rect CPWL_ListCtrl::OutToIn(const CPDF_Rect& rect) const {
202   CPDF_Rect rcClient = GetClientRect();
203
204   return CPDF_Rect(rect.left - rcClient.left + m_ptScroll.x,
205                    rect.bottom - rcClient.top + m_ptScroll.y,
206                    rect.right - rcClient.left + m_ptScroll.x,
207                    rect.top - rcClient.top + m_ptScroll.y);
208 }