blob: 23bd7537610eedc7ec3a6e6e1e64d0e5de908467 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhang60f507b2015-06-13 00:41:00 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
dan sinclair89e904b2016-03-23 19:29:15 -04007#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h"
Dan Sinclairaa403d32016-03-15 14:57:22 -04008
dsinclair74a34fc2016-09-29 16:41:42 -07009#include "core/fxge/cfx_pathdata.h"
10#include "core/fxge/cfx_renderdevice.h"
dan sinclair89e904b2016-03-23 19:29:15 -040011#include "fpdfsdk/pdfwindow/PWL_Utils.h"
12#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070013
Nico Weber9d8ec5a2015-08-04 13:00:21 -070014PWL_FLOATRANGE::PWL_FLOATRANGE() {
15 Default();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070016}
17
Nico Weber9d8ec5a2015-08-04 13:00:21 -070018PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) {
19 Set(min, max);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020}
21
Nico Weber9d8ec5a2015-08-04 13:00:21 -070022void PWL_FLOATRANGE::Default() {
23 fMin = 0;
24 fMax = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070025}
26
Nico Weber9d8ec5a2015-08-04 13:00:21 -070027void PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) {
28 if (min > max) {
29 fMin = max;
30 fMax = min;
31 } else {
32 fMin = min;
33 fMax = max;
34 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070035}
36
tsepez4cf55152016-11-02 14:37:54 -070037bool PWL_FLOATRANGE::In(FX_FLOAT x) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070038 return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) &&
39 (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070040}
41
Nico Weber9d8ec5a2015-08-04 13:00:21 -070042FX_FLOAT PWL_FLOATRANGE::GetWidth() const {
43 return fMax - fMin;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044}
45
Nico Weber9d8ec5a2015-08-04 13:00:21 -070046PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() {
47 Default();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070048}
49
Nico Weber9d8ec5a2015-08-04 13:00:21 -070050void PWL_SCROLL_PRIVATEDATA::Default() {
51 ScrollRange.Default();
52 fScrollPos = ScrollRange.fMin;
53 fClientWidth = 0;
54 fBigStep = 10;
55 fSmallStep = 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070056}
57
Nico Weber9d8ec5a2015-08-04 13:00:21 -070058void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) {
59 ScrollRange.Set(min, max);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060
Nico Weber9d8ec5a2015-08-04 13:00:21 -070061 if (IsFloatSmaller(fScrollPos, ScrollRange.fMin))
62 fScrollPos = ScrollRange.fMin;
63 if (IsFloatBigger(fScrollPos, ScrollRange.fMax))
64 fScrollPos = ScrollRange.fMax;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065}
66
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) {
68 fClientWidth = width;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070069}
70
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) {
72 fSmallStep = step;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073}
74
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) {
76 fBigStep = step;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070077}
78
tsepez4cf55152016-11-02 14:37:54 -070079bool PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070080 if (ScrollRange.In(pos)) {
81 fScrollPos = pos;
tsepez4cf55152016-11-02 14:37:54 -070082 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070083 }
tsepez4cf55152016-11-02 14:37:54 -070084 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070085}
86
Nico Weber9d8ec5a2015-08-04 13:00:21 -070087void PWL_SCROLL_PRIVATEDATA::AddSmall() {
88 if (!SetPos(fScrollPos + fSmallStep))
89 SetPos(ScrollRange.fMax);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070090}
91
Nico Weber9d8ec5a2015-08-04 13:00:21 -070092void PWL_SCROLL_PRIVATEDATA::SubSmall() {
93 if (!SetPos(fScrollPos - fSmallStep))
94 SetPos(ScrollRange.fMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070095}
96
Nico Weber9d8ec5a2015-08-04 13:00:21 -070097void PWL_SCROLL_PRIVATEDATA::AddBig() {
98 if (!SetPos(fScrollPos + fBigStep))
99 SetPos(ScrollRange.fMax);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700100}
101
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700102void PWL_SCROLL_PRIVATEDATA::SubBig() {
103 if (!SetPos(fScrollPos - fBigStep))
104 SetPos(ScrollRange.fMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700105}
106
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,
108 PWL_SBBUTTON_TYPE eButtonType) {
109 m_eScrollBarType = eScrollBarType;
110 m_eSBButtonType = eButtonType;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700111
tsepez4cf55152016-11-02 14:37:54 -0700112 m_bMouseDown = false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700113}
114
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115CPWL_SBButton::~CPWL_SBButton() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700116
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700117CFX_ByteString CPWL_SBButton::GetClassName() const {
118 return "CPWL_SBButton";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700119}
120
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121void CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) {
122 cp.eCursorType = FXCT_ARROW;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123}
124
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
126 CPWL_Wnd::GetThisAppearanceStream(sAppStream);
127
128 if (!IsVisible())
129 return;
130
131 CFX_ByteTextBuf sButton;
132
Tom Sepez281a9ea2016-02-26 14:24:28 -0800133 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134
135 if (rectWnd.IsEmpty())
136 return;
137
138 sAppStream << "q\n";
139
Dan Sinclairf528eee2017-02-14 11:52:07 -0500140 CFX_PointF ptCenter = GetCenterPoint();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700141
142 switch (m_eScrollBarType) {
143 case SBT_HSCROLL:
144 switch (m_eSBButtonType) {
145 case PSBT_MIN: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500146 CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
147 CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
148 ptCenter.y + PWL_TRIANGLE_HALFLEN);
149 CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
150 ptCenter.y - PWL_TRIANGLE_HALFLEN);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700151
152 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
153 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
154 sButton << "0 g\n";
155 sButton << pt1.x << " " << pt1.y << " m\n";
156 sButton << pt2.x << " " << pt2.y << " l\n";
157 sButton << pt3.x << " " << pt3.y << " l\n";
158 sButton << pt1.x << " " << pt1.y << " l f\n";
159
160 sAppStream << sButton;
161 }
162 } break;
163 case PSBT_MAX: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500164 CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
165 CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
166 ptCenter.y + PWL_TRIANGLE_HALFLEN);
167 CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
168 ptCenter.y - PWL_TRIANGLE_HALFLEN);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700169
170 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
171 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
172 sButton << "0 g\n";
173 sButton << pt1.x << " " << pt1.y << " m\n";
174 sButton << pt2.x << " " << pt2.y << " l\n";
175 sButton << pt3.x << " " << pt3.y << " l\n";
176 sButton << pt1.x << " " << pt1.y << " l f\n";
177
178 sAppStream << sButton;
179 }
180 } break;
181 default:
182 break;
183 }
184 break;
185 case SBT_VSCROLL:
186 switch (m_eSBButtonType) {
187 case PSBT_MIN: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500188 CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
189 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
190 CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
191 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
192 CFX_PointF pt3(ptCenter.x, ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700193
194 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
195 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
196 sButton << "0 g\n";
197 sButton << pt1.x << " " << pt1.y << " m\n";
198 sButton << pt2.x << " " << pt2.y << " l\n";
199 sButton << pt3.x << " " << pt3.y << " l\n";
200 sButton << pt1.x << " " << pt1.y << " l f\n";
201
202 sAppStream << sButton;
203 }
204 } break;
205 case PSBT_MAX: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500206 CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
207 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
208 CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
209 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
210 CFX_PointF pt3(ptCenter.x, ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700211
212 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
213 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
214 sButton << "0 g\n";
215 sButton << pt1.x << " " << pt1.y << " m\n";
216 sButton << pt2.x << " " << pt2.y << " l\n";
217 sButton << pt3.x << " " << pt3.y << " l\n";
218 sButton << pt1.x << " " << pt1.y << " l f\n";
219
220 sAppStream << sButton;
221 }
222 } break;
223 default:
224 break;
225 }
226 break;
227 default:
228 break;
229 }
230
231 sAppStream << "Q\n";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700232}
233
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800235 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236 if (!IsVisible())
237 return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700238
Tom Sepez281a9ea2016-02-26 14:24:28 -0800239 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700240 if (rectWnd.IsEmpty())
241 return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700242
Dan Sinclairf528eee2017-02-14 11:52:07 -0500243 CFX_PointF ptCenter = GetCenterPoint();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700244 int32_t nTransparancy = GetTransparency();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700245
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700246 switch (m_eScrollBarType) {
247 case SBT_HSCROLL:
248 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
249 switch (m_eSBButtonType) {
250 case PSBT_MIN: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500251 CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
252 CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
253 ptCenter.y + PWL_TRIANGLE_HALFLEN);
254 CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
255 ptCenter.y - PWL_TRIANGLE_HALFLEN);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700256
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
258 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
259 CFX_PathData path;
dan sinclairb147e072017-02-22 19:56:15 -0500260 path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false);
261 path.AppendPoint(pt2, FXPT_TYPE::LineTo, false);
262 path.AppendPoint(pt3, FXPT_TYPE::LineTo, false);
263 path.AppendPoint(pt1, FXPT_TYPE::LineTo, false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700264
thestig1cd352e2016-06-07 17:53:06 -0700265 pDevice->DrawPath(&path, pUser2Device, nullptr,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700266 CPWL_Utils::PWLColorToFXColor(
267 PWL_DEFAULT_BLACKCOLOR, nTransparancy),
268 0, FXFILL_ALTERNATE);
269 }
270 } break;
271 case PSBT_MAX: {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500272 CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
273 CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
274 ptCenter.y + PWL_TRIANGLE_HALFLEN);
275 CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
276 ptCenter.y - PWL_TRIANGLE_HALFLEN);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700277
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700278 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
279 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
280 CFX_PathData path;
dan sinclairb147e072017-02-22 19:56:15 -0500281 path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false);
282 path.AppendPoint(pt2, FXPT_TYPE::LineTo, false);
283 path.AppendPoint(pt3, FXPT_TYPE::LineTo, false);
284 path.AppendPoint(pt1, FXPT_TYPE::LineTo, false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700285
thestig1cd352e2016-06-07 17:53:06 -0700286 pDevice->DrawPath(&path, pUser2Device, nullptr,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700287 CPWL_Utils::PWLColorToFXColor(
288 PWL_DEFAULT_BLACKCOLOR, nTransparancy),
289 0, FXFILL_ALTERNATE);
290 }
291 } break;
292 default:
293 break;
294 }
295 break;
296 case SBT_VSCROLL:
297 switch (m_eSBButtonType) {
298 case PSBT_MIN: {
299 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800300 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700301 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
302 ArgbEncode(nTransparancy, 100, 100, 100),
303 0.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700304
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700305 // draw inner border
306 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
307 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
308 ArgbEncode(nTransparancy, 255, 255, 255),
309 1.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700310
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700311 // draw background
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700312
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700313 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700314
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700315 if (IsEnabled())
tsepez4cf55152016-11-02 14:37:54 -0700316 CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700317 nTransparancy, 80, 220);
318 else
319 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
320 ArgbEncode(255, 255, 255, 255));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700321
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700322 // draw arrow
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700323
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700324 if (rectWnd.top - rectWnd.bottom > 6.0f) {
325 FX_FLOAT fX = rectWnd.left + 1.5f;
326 FX_FLOAT fY = rectWnd.bottom;
Dan Sinclairf528eee2017-02-14 11:52:07 -0500327 CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 4.0f),
328 CFX_PointF(fX + 2.5f, fY + 3.0f),
329 CFX_PointF(fX + 4.5f, fY + 5.0f),
330 CFX_PointF(fX + 6.5f, fY + 3.0f),
331 CFX_PointF(fX + 6.5f, fY + 4.0f),
332 CFX_PointF(fX + 4.5f, fY + 6.0f),
333 CFX_PointF(fX + 2.5f, fY + 4.0f)};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700334
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700335 if (IsEnabled())
336 CPWL_Utils::DrawFillArea(
337 pDevice, pUser2Device, pts, 7,
338 ArgbEncode(nTransparancy, 255, 255, 255));
339 else
340 CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
341 CPWL_Utils::PWLColorToFXColor(
342 PWL_DEFAULT_HEAVYGRAYCOLOR, 255));
343 }
344 } break;
345 case PSBT_MAX: {
346 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800347 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700348 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
349 ArgbEncode(nTransparancy, 100, 100, 100),
350 0.0f);
351
352 // draw inner border
353 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
354 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
355 ArgbEncode(nTransparancy, 255, 255, 255),
356 1.0f);
357
358 // draw background
359 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
360 if (IsEnabled())
tsepez4cf55152016-11-02 14:37:54 -0700361 CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700362 nTransparancy, 80, 220);
363 else
364 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
365 ArgbEncode(255, 255, 255, 255));
366
367 // draw arrow
368
369 if (rectWnd.top - rectWnd.bottom > 6.0f) {
370 FX_FLOAT fX = rectWnd.left + 1.5f;
371 FX_FLOAT fY = rectWnd.bottom;
372
Dan Sinclairf528eee2017-02-14 11:52:07 -0500373 CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 5.0f),
374 CFX_PointF(fX + 2.5f, fY + 6.0f),
375 CFX_PointF(fX + 4.5f, fY + 4.0f),
376 CFX_PointF(fX + 6.5f, fY + 6.0f),
377 CFX_PointF(fX + 6.5f, fY + 5.0f),
378 CFX_PointF(fX + 4.5f, fY + 3.0f),
379 CFX_PointF(fX + 2.5f, fY + 5.0f)};
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700380
381 if (IsEnabled())
382 CPWL_Utils::DrawFillArea(
383 pDevice, pUser2Device, pts, 7,
384 ArgbEncode(nTransparancy, 255, 255, 255));
385 else
386 CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
387 CPWL_Utils::PWLColorToFXColor(
388 PWL_DEFAULT_HEAVYGRAYCOLOR, 255));
389 }
390 } break;
391 case PSBT_POS: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700392 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800393 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700394 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
395 ArgbEncode(nTransparancy, 100, 100, 100),
396 0.0f);
397
398 // draw inner border
399 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
400 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
401 ArgbEncode(nTransparancy, 255, 255, 255),
402 1.0f);
403
404 if (IsEnabled()) {
405 // draw shadow effect
406
Dan Sinclairf528eee2017-02-14 11:52:07 -0500407 CFX_PointF ptTop = CFX_PointF(rectWnd.left, rectWnd.top - 1.0f);
408 CFX_PointF ptBottom =
409 CFX_PointF(rectWnd.left, rectWnd.bottom + 1.0f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410
411 ptTop.x += 1.5f;
412 ptBottom.x += 1.5f;
413
414 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
415 ArgbEncode(nTransparancy, 210, 210, 210),
416 1.0f);
417
418 ptTop.x += 1.0f;
419 ptBottom.x += 1.0f;
420
421 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
422 ArgbEncode(nTransparancy, 220, 220, 220),
423 1.0f);
424
425 ptTop.x += 1.0f;
426 ptBottom.x += 1.0f;
427
428 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
429 ArgbEncode(nTransparancy, 240, 240, 240),
430 1.0f);
431
432 ptTop.x += 1.0f;
433 ptBottom.x += 1.0f;
434
435 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
436 ArgbEncode(nTransparancy, 240, 240, 240),
437 1.0f);
438
439 ptTop.x += 1.0f;
440 ptBottom.x += 1.0f;
441
442 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
443 ArgbEncode(nTransparancy, 210, 210, 210),
444 1.0f);
445
446 ptTop.x += 1.0f;
447 ptBottom.x += 1.0f;
448
449 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
450 ArgbEncode(nTransparancy, 180, 180, 180),
451 1.0f);
452
453 ptTop.x += 1.0f;
454 ptBottom.x += 1.0f;
455
456 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
457 ArgbEncode(nTransparancy, 150, 150, 150),
458 1.0f);
459
460 ptTop.x += 1.0f;
461 ptBottom.x += 1.0f;
462
463 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
464 ArgbEncode(nTransparancy, 150, 150, 150),
465 1.0f);
466
467 ptTop.x += 1.0f;
468 ptBottom.x += 1.0f;
469
470 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
471 ArgbEncode(nTransparancy, 180, 180, 180),
472 1.0f);
473
474 ptTop.x += 1.0f;
475 ptBottom.x += 1.0f;
476
477 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
478 ArgbEncode(nTransparancy, 210, 210, 210),
479 1.0f);
480 } else {
481 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
482 ArgbEncode(255, 255, 255, 255));
483 }
484
485 // draw friction
486
487 if (rectWnd.Height() > 8.0f) {
488 FX_COLORREF crStroke = ArgbEncode(nTransparancy, 120, 120, 120);
489 if (!IsEnabled())
490 crStroke = CPWL_Utils::PWLColorToFXColor(
491 PWL_DEFAULT_HEAVYGRAYCOLOR, 255);
492
493 FX_FLOAT nFrictionWidth = 5.0f;
494 FX_FLOAT nFrictionHeight = 5.5f;
495
Dan Sinclairf528eee2017-02-14 11:52:07 -0500496 CFX_PointF ptLeft =
497 CFX_PointF(ptCenter.x - nFrictionWidth / 2.0f,
498 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
499 CFX_PointF ptRight =
500 CFX_PointF(ptCenter.x + nFrictionWidth / 2.0f,
501 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700502
503 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
504 crStroke, 1.0f);
505
506 ptLeft.y += 2.0f;
507 ptRight.y += 2.0f;
508
509 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
510 crStroke, 1.0f);
511
512 ptLeft.y += 2.0f;
513 ptRight.y += 2.0f;
514
515 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
516 crStroke, 1.0f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517 }
518 } break;
519 default:
520 break;
521 }
522 break;
523 default:
524 break;
525 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700526}
527
Dan Sinclairf528eee2017-02-14 11:52:07 -0500528bool CPWL_SBButton::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700529 CPWL_Wnd::OnLButtonDown(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700530
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700531 if (CPWL_Wnd* pParent = GetParentWindow())
532 pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (intptr_t)&point);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700533
tsepez4cf55152016-11-02 14:37:54 -0700534 m_bMouseDown = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700535 SetCapture();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700536
tsepez4cf55152016-11-02 14:37:54 -0700537 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700538}
539
Dan Sinclairf528eee2017-02-14 11:52:07 -0500540bool CPWL_SBButton::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700541 CPWL_Wnd::OnLButtonUp(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700542
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700543 if (CPWL_Wnd* pParent = GetParentWindow())
544 pParent->OnNotify(this, PNM_LBUTTONUP, 0, (intptr_t)&point);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700545
tsepez4cf55152016-11-02 14:37:54 -0700546 m_bMouseDown = false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547 ReleaseCapture();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700548
tsepez4cf55152016-11-02 14:37:54 -0700549 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700550}
551
Dan Sinclairf528eee2017-02-14 11:52:07 -0500552bool CPWL_SBButton::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700553 CPWL_Wnd::OnMouseMove(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700554
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700555 if (CPWL_Wnd* pParent = GetParentWindow()) {
556 pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (intptr_t)&point);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700557 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700558
tsepez4cf55152016-11-02 14:37:54 -0700559 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700560}
561
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700562CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType)
563 : m_sbType(sbType),
thestig1cd352e2016-06-07 17:53:06 -0700564 m_pMinButton(nullptr),
565 m_pMaxButton(nullptr),
566 m_pPosButton(nullptr),
tsepez4cf55152016-11-02 14:37:54 -0700567 m_bMouseDown(false),
568 m_bMinOrMax(false),
569 m_bNotifyForever(true) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700570
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700571CPWL_ScrollBar::~CPWL_ScrollBar() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700572
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700573CFX_ByteString CPWL_ScrollBar::GetClassName() const {
574 return "CPWL_ScrollBar";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700575}
576
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700577void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) {
578 cp.eCursorType = FXCT_ARROW;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700579}
580
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700581void CPWL_ScrollBar::RePosChildWnd() {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800582 CFX_FloatRect rcClient = GetClientRect();
583 CFX_FloatRect rcMinButton, rcMaxButton;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700584 FX_FLOAT fBWidth = 0;
585
586 switch (m_sbType) {
587 case SBT_HSCROLL:
588 if (rcClient.right - rcClient.left >
589 PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH +
590 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800591 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
592 rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
593 rcClient.top);
594 rcMaxButton =
595 CFX_FloatRect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
596 rcClient.bottom, rcClient.right, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700597 } else {
598 fBWidth = (rcClient.right - rcClient.left -
599 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
600 2;
601
602 if (fBWidth > 0) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800603 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
604 rcClient.left + fBWidth, rcClient.top);
605 rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom,
606 rcClient.right, rcClient.top);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800607 } else {
tsepez4cf55152016-11-02 14:37:54 -0700608 SetVisible(false);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800609 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700610 }
611 break;
612 case SBT_VSCROLL:
613 if (IsFloatBigger(rcClient.top - rcClient.bottom,
614 PWL_SCROLLBAR_BUTTON_WIDTH * 2 +
615 PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800616 rcMinButton = CFX_FloatRect(rcClient.left,
617 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
618 rcClient.right, rcClient.top);
619 rcMaxButton =
620 CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
621 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700622 } else {
623 fBWidth = (rcClient.top - rcClient.bottom -
624 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
625 2;
626
627 if (IsFloatBigger(fBWidth, 0)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800628 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.top - fBWidth,
629 rcClient.right, rcClient.top);
630 rcMaxButton =
631 CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
632 rcClient.bottom + fBWidth);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800633 } else {
tsepez4cf55152016-11-02 14:37:54 -0700634 SetVisible(false);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800635 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700636 }
637 break;
638 }
639
640 if (m_pMinButton)
tsepez4cf55152016-11-02 14:37:54 -0700641 m_pMinButton->Move(rcMinButton, true, false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700642 if (m_pMaxButton)
tsepez4cf55152016-11-02 14:37:54 -0700643 m_pMaxButton->Move(rcMaxButton, true, false);
644 MovePosButton(false);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700645}
646
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700647void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800648 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700649
650 if (IsVisible() && !rectWnd.IsEmpty()) {
651 CFX_ByteTextBuf sButton;
652
653 sButton << "q\n";
654 sButton << "0 w\n"
tsepez4cf55152016-11-02 14:37:54 -0700655 << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), true)
tsepez4c3debb2016-04-08 12:20:38 -0700656 .AsStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700657 sButton << rectWnd.left << " " << rectWnd.bottom << " "
658 << rectWnd.right - rectWnd.left << " "
659 << rectWnd.top - rectWnd.bottom << " re b Q\n";
660
661 sAppStream << sButton;
662 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700663}
664
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700665void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800666 CFX_Matrix* pUser2Device) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800667 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700668
669 if (IsVisible() && !rectWnd.IsEmpty()) {
670 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd,
671 GetBackgroundColor(), GetTransparency());
672
673 CPWL_Utils::DrawStrokeLine(
674 pDevice, pUser2Device,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500675 CFX_PointF(rectWnd.left + 2.0f, rectWnd.top - 2.0f),
676 CFX_PointF(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700677 ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
678
679 CPWL_Utils::DrawStrokeLine(
680 pDevice, pUser2Device,
Dan Sinclairf528eee2017-02-14 11:52:07 -0500681 CFX_PointF(rectWnd.right - 2.0f, rectWnd.top - 2.0f),
682 CFX_PointF(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700683 ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
684 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700685}
686
Dan Sinclairf528eee2017-02-14 11:52:07 -0500687bool CPWL_ScrollBar::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700688 CPWL_Wnd::OnLButtonDown(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700689
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700690 if (HasFlag(PWS_AUTOTRANSPARENT)) {
691 if (GetTransparency() != 255) {
692 SetTransparency(255);
693 InvalidateRect();
694 }
695 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700696
Tom Sepez281a9ea2016-02-26 14:24:28 -0800697 CFX_FloatRect rcMinArea, rcMaxArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700698
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700699 if (m_pPosButton && m_pPosButton->IsVisible()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800700 CFX_FloatRect rcClient = GetClientRect();
701 CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
Lei Zhang60f507b2015-06-13 00:41:00 -0700702
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700703 switch (m_sbType) {
704 case SBT_HSCROLL:
Tom Sepez281a9ea2016-02-26 14:24:28 -0800705 rcMinArea =
706 CFX_FloatRect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
707 rcClient.bottom, rcPosButton.left, rcClient.top);
708 rcMaxArea = CFX_FloatRect(rcPosButton.right, rcClient.bottom,
709 rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
710 rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700711
712 break;
713 case SBT_VSCROLL:
Tom Sepez281a9ea2016-02-26 14:24:28 -0800714 rcMinArea =
715 CFX_FloatRect(rcClient.left, rcPosButton.top, rcClient.right,
716 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
717 rcMaxArea = CFX_FloatRect(rcClient.left,
718 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,
719 rcClient.right, rcPosButton.bottom);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700720 break;
721 }
722
723 rcMinArea.Normalize();
724 rcMaxArea.Normalize();
725
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500726 if (rcMinArea.Contains(point)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700727 m_sData.SubBig();
tsepez4cf55152016-11-02 14:37:54 -0700728 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700729 NotifyScrollWindow();
730 }
731
Dan Sinclairb45ea1f2017-02-21 14:27:59 -0500732 if (rcMaxArea.Contains(point)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700733 m_sData.AddBig();
tsepez4cf55152016-11-02 14:37:54 -0700734 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700735 NotifyScrollWindow();
736 }
737 }
738
tsepez4cf55152016-11-02 14:37:54 -0700739 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700740}
741
Dan Sinclairf528eee2017-02-14 11:52:07 -0500742bool CPWL_ScrollBar::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700743 CPWL_Wnd::OnLButtonUp(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700744
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700745 if (HasFlag(PWS_AUTOTRANSPARENT)) {
746 if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) {
747 SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
748 InvalidateRect();
749 }
750 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700751
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700752 EndTimer();
tsepez4cf55152016-11-02 14:37:54 -0700753 m_bMouseDown = false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700754
tsepez4cf55152016-11-02 14:37:54 -0700755 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700756}
757
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700758void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd,
tsepezc3255f52016-03-25 14:52:27 -0700759 uint32_t msg,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700760 intptr_t wParam,
761 intptr_t lParam) {
762 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700763
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700764 switch (msg) {
765 case PNM_LBUTTONDOWN:
766 if (pWnd == m_pMinButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500767 OnMinButtonLBDown(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700768 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700769
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700770 if (pWnd == m_pMaxButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500771 OnMaxButtonLBDown(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700772 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700773
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700774 if (pWnd == m_pPosButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500775 OnPosButtonLBDown(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700776 }
777 break;
778 case PNM_LBUTTONUP:
779 if (pWnd == m_pMinButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500780 OnMinButtonLBUp(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700781 }
782
783 if (pWnd == m_pMaxButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500784 OnMaxButtonLBUp(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700785 }
786
787 if (pWnd == m_pPosButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500788 OnPosButtonLBUp(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700789 }
790 break;
791 case PNM_MOUSEMOVE:
792 if (pWnd == m_pMinButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500793 OnMinButtonMouseMove(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700794 }
795
796 if (pWnd == m_pMaxButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500797 OnMaxButtonMouseMove(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700798 }
799
800 if (pWnd == m_pPosButton) {
Dan Sinclairf528eee2017-02-14 11:52:07 -0500801 OnPosButtonMouseMove(*(CFX_PointF*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700802 }
803 break;
804 case PNM_SETSCROLLINFO: {
tsepezf86ca382016-09-13 12:23:30 -0700805 PWL_SCROLL_INFO* pInfo = reinterpret_cast<PWL_SCROLL_INFO*>(lParam);
806 if (pInfo && *pInfo != m_OriginInfo) {
807 m_OriginInfo = *pInfo;
808 FX_FLOAT fMax =
809 pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
810 fMax = fMax > 0.0f ? fMax : 0.0f;
811 SetScrollRange(0, fMax, pInfo->fPlateWidth);
812 SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700813 }
814 } break;
815 case PNM_SETSCROLLPOS: {
816 FX_FLOAT fPos = *(FX_FLOAT*)lParam;
817 switch (m_sbType) {
818 case SBT_HSCROLL:
819 fPos = fPos - m_OriginInfo.fContentMin;
820 break;
821 case SBT_VSCROLL:
822 fPos = m_OriginInfo.fContentMax - fPos;
823 break;
824 }
825 SetScrollPos(fPos);
826 } break;
827 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700828}
829
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700830void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) {
831 PWL_CREATEPARAM scp = cp;
832 scp.pParentWnd = this;
833 scp.dwBorderWidth = 2;
dsinclair92cb5e52016-05-16 11:38:28 -0700834 scp.nBorderStyle = BorderStyle::BEVELED;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700835
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700836 scp.dwFlags =
837 PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700838
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700839 if (!m_pMinButton) {
840 m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN);
841 m_pMinButton->Create(scp);
842 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700843
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700844 if (!m_pMaxButton) {
845 m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX);
846 m_pMaxButton->Create(scp);
847 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700848
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700849 if (!m_pPosButton) {
850 m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS);
tsepez4cf55152016-11-02 14:37:54 -0700851 m_pPosButton->SetVisible(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700852 m_pPosButton->Create(scp);
853 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700854}
855
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700856FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const {
857 if (!IsVisible())
858 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700859
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700860 return PWL_SCROLLBAR_WIDTH;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700861}
862
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700863void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,
864 FX_FLOAT fMax,
865 FX_FLOAT fClientWidth) {
866 if (m_pPosButton) {
867 m_sData.SetScrollRange(fMin, fMax);
868 m_sData.SetClientWidth(fClientWidth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700869
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) {
tsepez4cf55152016-11-02 14:37:54 -0700871 m_pPosButton->SetVisible(false);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700872 } else {
tsepez4cf55152016-11-02 14:37:54 -0700873 m_pPosButton->SetVisible(true);
874 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700875 }
876 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700877}
878
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700879void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) {
880 FX_FLOAT fOldPos = m_sData.fScrollPos;
Lei Zhang60f507b2015-06-13 00:41:00 -0700881
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700882 m_sData.SetPos(fPos);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700883
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700884 if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
tsepez4cf55152016-11-02 14:37:54 -0700885 MovePosButton(true);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700886}
887
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700888void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) {
889 m_sData.SetBigStep(fBigStep);
890 m_sData.SetSmallStep(fSmallStep);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700891}
892
tsepez4cf55152016-11-02 14:37:54 -0700893void CPWL_ScrollBar::MovePosButton(bool bRefresh) {
Lei Zhang96660d62015-12-14 18:27:25 -0800894 ASSERT(m_pMinButton);
895 ASSERT(m_pMaxButton);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700896
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700897 if (m_pPosButton->IsVisible()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800898 CFX_FloatRect rcClient;
899 CFX_FloatRect rcPosArea, rcPosButton;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700900
901 rcClient = GetClientRect();
902 rcPosArea = GetScrollArea();
903
904 FX_FLOAT fLeft, fRight, fTop, fBottom;
905
906 switch (m_sbType) {
907 case SBT_HSCROLL:
908 fLeft = TrueToFace(m_sData.fScrollPos);
909 fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
910
911 if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)
912 fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
913
914 if (fRight > rcPosArea.right) {
915 fRight = rcPosArea.right;
916 fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
917 }
918
Tom Sepez281a9ea2016-02-26 14:24:28 -0800919 rcPosButton =
920 CFX_FloatRect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700921
922 break;
923 case SBT_VSCROLL:
924 fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
925 fTop = TrueToFace(m_sData.fScrollPos);
926
927 if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))
928 fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
929
930 if (IsFloatSmaller(fBottom, rcPosArea.bottom)) {
931 fBottom = rcPosArea.bottom;
932 fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
933 }
934
Tom Sepez281a9ea2016-02-26 14:24:28 -0800935 rcPosButton =
936 CFX_FloatRect(rcPosArea.left, fBottom, rcPosArea.right, fTop);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700937
938 break;
939 }
940
tsepez4cf55152016-11-02 14:37:54 -0700941 m_pPosButton->Move(rcPosButton, true, bRefresh);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700942 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700943}
944
Dan Sinclairf528eee2017-02-14 11:52:07 -0500945void CPWL_ScrollBar::OnMinButtonLBDown(const CFX_PointF& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700946 m_sData.SubSmall();
tsepez4cf55152016-11-02 14:37:54 -0700947 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700948 NotifyScrollWindow();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700949
tsepez4cf55152016-11-02 14:37:54 -0700950 m_bMinOrMax = true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700951
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700952 EndTimer();
953 BeginTimer(100);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700954}
955
Dan Sinclairf528eee2017-02-14 11:52:07 -0500956void CPWL_ScrollBar::OnMinButtonLBUp(const CFX_PointF& point) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700957
Dan Sinclairf528eee2017-02-14 11:52:07 -0500958void CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_PointF& point) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700959
Dan Sinclairf528eee2017-02-14 11:52:07 -0500960void CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_PointF& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700961 m_sData.AddSmall();
tsepez4cf55152016-11-02 14:37:54 -0700962 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700963 NotifyScrollWindow();
964
tsepez4cf55152016-11-02 14:37:54 -0700965 m_bMinOrMax = false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700966
967 EndTimer();
968 BeginTimer(100);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700969}
970
Dan Sinclairf528eee2017-02-14 11:52:07 -0500971void CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_PointF& point) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700972
Dan Sinclairf528eee2017-02-14 11:52:07 -0500973void CPWL_ScrollBar::OnMaxButtonMouseMove(const CFX_PointF& point) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700974
Dan Sinclairf528eee2017-02-14 11:52:07 -0500975void CPWL_ScrollBar::OnPosButtonLBDown(const CFX_PointF& point) {
tsepez4cf55152016-11-02 14:37:54 -0700976 m_bMouseDown = true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700977
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978 if (m_pPosButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800979 CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700980
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981 switch (m_sbType) {
982 case SBT_HSCROLL:
983 m_nOldPos = point.x;
984 m_fOldPosButton = rcPosButton.left;
985 break;
986 case SBT_VSCROLL:
987 m_nOldPos = point.y;
988 m_fOldPosButton = rcPosButton.top;
989 break;
990 }
991 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700992}
993
Dan Sinclairf528eee2017-02-14 11:52:07 -0500994void CPWL_ScrollBar::OnPosButtonLBUp(const CFX_PointF& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700995 if (m_bMouseDown) {
996 if (!m_bNotifyForever)
997 NotifyScrollWindow();
998 }
tsepez4cf55152016-11-02 14:37:54 -0700999 m_bMouseDown = false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001000}
1001
Dan Sinclairf528eee2017-02-14 11:52:07 -05001002void CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_PointF& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001003 FX_FLOAT fOldScrollPos = m_sData.fScrollPos;
1004
1005 FX_FLOAT fNewPos = 0;
1006
1007 switch (m_sbType) {
1008 case SBT_HSCROLL:
1009 if (FXSYS_fabs(point.x - m_nOldPos) < 1)
1010 return;
1011 fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);
1012 break;
1013 case SBT_VSCROLL:
1014 if (FXSYS_fabs(point.y - m_nOldPos) < 1)
1015 return;
1016 fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);
1017 break;
1018 }
1019
1020 if (m_bMouseDown) {
1021 switch (m_sbType) {
1022 case SBT_HSCROLL:
1023
1024 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1025 fNewPos = m_sData.ScrollRange.fMin;
1026 }
1027
1028 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1029 fNewPos = m_sData.ScrollRange.fMax;
1030 }
1031
1032 m_sData.SetPos(fNewPos);
1033
1034 break;
1035 case SBT_VSCROLL:
1036
1037 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1038 fNewPos = m_sData.ScrollRange.fMin;
1039 }
1040
1041 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1042 fNewPos = m_sData.ScrollRange.fMax;
1043 }
1044
1045 m_sData.SetPos(fNewPos);
1046
1047 break;
1048 }
1049
1050 if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) {
tsepez4cf55152016-11-02 14:37:54 -07001051 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001052
1053 if (m_bNotifyForever)
1054 NotifyScrollWindow();
1055 }
1056 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001057}
1058
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001059void CPWL_ScrollBar::NotifyScrollWindow() {
1060 if (CPWL_Wnd* pParent = GetParentWindow()) {
1061 FX_FLOAT fPos;
1062 switch (m_sbType) {
1063 case SBT_HSCROLL:
1064 fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;
1065 break;
1066 case SBT_VSCROLL:
1067 fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;
1068 break;
1069 }
1070 pParent->OnNotify(this, PNM_SCROLLWINDOW, (intptr_t)m_sbType,
1071 (intptr_t)&fPos);
1072 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001073}
1074
Tom Sepez281a9ea2016-02-26 14:24:28 -08001075CFX_FloatRect CPWL_ScrollBar::GetScrollArea() const {
1076 CFX_FloatRect rcClient = GetClientRect();
1077 CFX_FloatRect rcArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001078
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001079 if (!m_pMinButton || !m_pMaxButton)
1080 return rcClient;
Lei Zhang60f507b2015-06-13 00:41:00 -07001081
Tom Sepez281a9ea2016-02-26 14:24:28 -08001082 CFX_FloatRect rcMin = m_pMinButton->GetWindowRect();
1083 CFX_FloatRect rcMax = m_pMaxButton->GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001084
1085 FX_FLOAT fMinWidth = rcMin.right - rcMin.left;
1086 FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;
1087 FX_FLOAT fMaxWidth = rcMax.right - rcMax.left;
1088 FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;
1089
1090 switch (m_sbType) {
1091 case SBT_HSCROLL:
1092 if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001093 rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
1094 rcClient.right - fMaxWidth - 1, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001095 } else {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001096 rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
1097 rcClient.left + fMinWidth + 1, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001098 }
1099 break;
1100 case SBT_VSCROLL:
1101 if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001102 rcArea = CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
1103 rcClient.right, rcClient.top - fMaxHeight - 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001104 } else {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001105 rcArea =
1106 CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
1107 rcClient.right, rcClient.bottom + fMinHeight + 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001108 }
1109 break;
1110 }
1111
1112 rcArea.Normalize();
1113
1114 return rcArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001115}
1116
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001117FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001118 CFX_FloatRect rcPosArea;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001119 rcPosArea = GetScrollArea();
1120
1121 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1122 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1123
1124 FX_FLOAT fFace = 0;
1125
1126 switch (m_sbType) {
1127 case SBT_HSCROLL:
1128 fFace = rcPosArea.left +
1129 fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;
1130 break;
1131 case SBT_VSCROLL:
1132 fFace = rcPosArea.top -
1133 fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;
1134 break;
1135 }
1136
1137 return fFace;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001138}
1139
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001140FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001141 CFX_FloatRect rcPosArea;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001142 rcPosArea = GetScrollArea();
1143
1144 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1145 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1146
1147 FX_FLOAT fTrue = 0;
1148
1149 switch (m_sbType) {
1150 case SBT_HSCROLL:
1151 fTrue = (fFace - rcPosArea.left) * fFactWidth /
1152 (rcPosArea.right - rcPosArea.left);
1153 break;
1154 case SBT_VSCROLL:
1155 fTrue = (rcPosArea.top - fFace) * fFactWidth /
1156 (rcPosArea.top - rcPosArea.bottom);
1157 break;
1158 }
1159
1160 return fTrue;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001161}
1162
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001163void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) {
1164 CreateButtons(cp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001165}
1166
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001167void CPWL_ScrollBar::TimerProc() {
1168 PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001169 if (m_bMinOrMax)
1170 m_sData.SubSmall();
1171 else
1172 m_sData.AddSmall();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001173
tsepezf86ca382016-09-13 12:23:30 -07001174 if (sTemp != m_sData) {
tsepez4cf55152016-11-02 14:37:54 -07001175 MovePosButton(true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001176 NotifyScrollWindow();
1177 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001178}