blob: 2dfa6cfe6ae846e73244782a854eb6e64721f2e3 [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
dsinclair48baa5f2016-04-06 10:00:40 -07009#include "core/fxge/include/fx_ge.h"
dan sinclair89e904b2016-03-23 19:29:15 -040010#include "fpdfsdk/pdfwindow/PWL_Utils.h"
11#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012
Nico Weber9d8ec5a2015-08-04 13:00:21 -070013#define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001)
14#define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb)))
15#define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb)))
16#define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070017
Nico Weber9d8ec5a2015-08-04 13:00:21 -070018PWL_FLOATRANGE::PWL_FLOATRANGE() {
19 Default();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020}
21
Nico Weber9d8ec5a2015-08-04 13:00:21 -070022PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) {
23 Set(min, max);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070024}
25
Nico Weber9d8ec5a2015-08-04 13:00:21 -070026void PWL_FLOATRANGE::Default() {
27 fMin = 0;
28 fMax = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070029}
30
Nico Weber9d8ec5a2015-08-04 13:00:21 -070031void PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) {
32 if (min > max) {
33 fMin = max;
34 fMax = min;
35 } else {
36 fMin = min;
37 fMax = max;
38 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070039}
40
Nico Weber9d8ec5a2015-08-04 13:00:21 -070041FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const {
42 return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) &&
43 (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070044}
45
Nico Weber9d8ec5a2015-08-04 13:00:21 -070046FX_FLOAT PWL_FLOATRANGE::GetWidth() const {
47 return fMax - fMin;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070048}
49
Nico Weber9d8ec5a2015-08-04 13:00:21 -070050PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() {
51 Default();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070052}
53
Nico Weber9d8ec5a2015-08-04 13:00:21 -070054void PWL_SCROLL_PRIVATEDATA::Default() {
55 ScrollRange.Default();
56 fScrollPos = ScrollRange.fMin;
57 fClientWidth = 0;
58 fBigStep = 10;
59 fSmallStep = 1;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060}
61
Nico Weber9d8ec5a2015-08-04 13:00:21 -070062void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) {
63 ScrollRange.Set(min, max);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070064
Nico Weber9d8ec5a2015-08-04 13:00:21 -070065 if (IsFloatSmaller(fScrollPos, ScrollRange.fMin))
66 fScrollPos = ScrollRange.fMin;
67 if (IsFloatBigger(fScrollPos, ScrollRange.fMax))
68 fScrollPos = ScrollRange.fMax;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070069}
70
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) {
72 fClientWidth = width;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073}
74
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) {
76 fSmallStep = step;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070077}
78
Nico Weber9d8ec5a2015-08-04 13:00:21 -070079void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) {
80 fBigStep = step;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070081}
82
Nico Weber9d8ec5a2015-08-04 13:00:21 -070083FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) {
84 if (ScrollRange.In(pos)) {
85 fScrollPos = pos;
86 return TRUE;
87 }
88 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070089}
90
Nico Weber9d8ec5a2015-08-04 13:00:21 -070091void PWL_SCROLL_PRIVATEDATA::AddSmall() {
92 if (!SetPos(fScrollPos + fSmallStep))
93 SetPos(ScrollRange.fMax);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070094}
95
Nico Weber9d8ec5a2015-08-04 13:00:21 -070096void PWL_SCROLL_PRIVATEDATA::SubSmall() {
97 if (!SetPos(fScrollPos - fSmallStep))
98 SetPos(ScrollRange.fMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070099}
100
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700101void PWL_SCROLL_PRIVATEDATA::AddBig() {
102 if (!SetPos(fScrollPos + fBigStep))
103 SetPos(ScrollRange.fMax);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700104}
105
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700106void PWL_SCROLL_PRIVATEDATA::SubBig() {
107 if (!SetPos(fScrollPos - fBigStep))
108 SetPos(ScrollRange.fMin);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700109}
110
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700111CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,
112 PWL_SBBUTTON_TYPE eButtonType) {
113 m_eScrollBarType = eScrollBarType;
114 m_eSBButtonType = eButtonType;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700115
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 m_bMouseDown = FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700117}
118
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700119CPWL_SBButton::~CPWL_SBButton() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700120
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121CFX_ByteString CPWL_SBButton::GetClassName() const {
122 return "CPWL_SBButton";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123}
124
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125void CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) {
126 cp.eCursorType = FXCT_ARROW;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700127}
128
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700129void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
130 CPWL_Wnd::GetThisAppearanceStream(sAppStream);
131
132 if (!IsVisible())
133 return;
134
135 CFX_ByteTextBuf sButton;
136
Tom Sepez281a9ea2016-02-26 14:24:28 -0800137 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700138
139 if (rectWnd.IsEmpty())
140 return;
141
142 sAppStream << "q\n";
143
Tom Sepez281a9ea2016-02-26 14:24:28 -0800144 CFX_FloatPoint ptCenter = GetCenterPoint();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700145
146 switch (m_eScrollBarType) {
147 case SBT_HSCROLL:
148 switch (m_eSBButtonType) {
149 case PSBT_MIN: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800150 CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
151 ptCenter.y);
152 CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
153 ptCenter.y + PWL_TRIANGLE_HALFLEN);
154 CFX_FloatPoint pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
155 ptCenter.y - PWL_TRIANGLE_HALFLEN);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700156
157 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
158 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
159 sButton << "0 g\n";
160 sButton << pt1.x << " " << pt1.y << " m\n";
161 sButton << pt2.x << " " << pt2.y << " l\n";
162 sButton << pt3.x << " " << pt3.y << " l\n";
163 sButton << pt1.x << " " << pt1.y << " l f\n";
164
165 sAppStream << sButton;
166 }
167 } break;
168 case PSBT_MAX: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800169 CFX_FloatPoint pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
170 ptCenter.y);
171 CFX_FloatPoint pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
172 ptCenter.y + PWL_TRIANGLE_HALFLEN);
173 CFX_FloatPoint pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
174 ptCenter.y - PWL_TRIANGLE_HALFLEN);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700175
176 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
177 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
178 sButton << "0 g\n";
179 sButton << pt1.x << " " << pt1.y << " m\n";
180 sButton << pt2.x << " " << pt2.y << " l\n";
181 sButton << pt3.x << " " << pt3.y << " l\n";
182 sButton << pt1.x << " " << pt1.y << " l f\n";
183
184 sAppStream << sButton;
185 }
186 } break;
187 default:
188 break;
189 }
190 break;
191 case SBT_VSCROLL:
192 switch (m_eSBButtonType) {
193 case PSBT_MIN: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800194 CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
195 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
196 CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
197 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
198 CFX_FloatPoint pt3(ptCenter.x,
199 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700200
201 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
202 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
203 sButton << "0 g\n";
204 sButton << pt1.x << " " << pt1.y << " m\n";
205 sButton << pt2.x << " " << pt2.y << " l\n";
206 sButton << pt3.x << " " << pt3.y << " l\n";
207 sButton << pt1.x << " " << pt1.y << " l f\n";
208
209 sAppStream << sButton;
210 }
211 } break;
212 case PSBT_MAX: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800213 CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
214 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
215 CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
216 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
217 CFX_FloatPoint pt3(ptCenter.x,
218 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700219
220 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
221 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
222 sButton << "0 g\n";
223 sButton << pt1.x << " " << pt1.y << " m\n";
224 sButton << pt2.x << " " << pt2.y << " l\n";
225 sButton << pt3.x << " " << pt3.y << " l\n";
226 sButton << pt1.x << " " << pt1.y << " l f\n";
227
228 sAppStream << sButton;
229 }
230 } break;
231 default:
232 break;
233 }
234 break;
235 default:
236 break;
237 }
238
239 sAppStream << "Q\n";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700240}
241
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800243 CFX_Matrix* pUser2Device) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700244 if (!IsVisible())
245 return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700246
Tom Sepez281a9ea2016-02-26 14:24:28 -0800247 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700248 if (rectWnd.IsEmpty())
249 return;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700250
Tom Sepez281a9ea2016-02-26 14:24:28 -0800251 CFX_FloatPoint ptCenter = GetCenterPoint();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700252 int32_t nTransparancy = GetTransparency();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700253
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700254 switch (m_eScrollBarType) {
255 case SBT_HSCROLL:
256 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
257 switch (m_eSBButtonType) {
258 case PSBT_MIN: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800259 CFX_FloatPoint pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
260 ptCenter.y);
261 CFX_FloatPoint pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
262 ptCenter.y + PWL_TRIANGLE_HALFLEN);
263 CFX_FloatPoint pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
264 ptCenter.y - PWL_TRIANGLE_HALFLEN);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700266 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
267 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
268 CFX_PathData path;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700269
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700270 path.SetPointCount(4);
271 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
272 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
273 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
274 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700275
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700276 pDevice->DrawPath(&path, pUser2Device, NULL,
277 CPWL_Utils::PWLColorToFXColor(
278 PWL_DEFAULT_BLACKCOLOR, nTransparancy),
279 0, FXFILL_ALTERNATE);
280 }
281 } break;
282 case PSBT_MAX: {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800283 CFX_FloatPoint pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
284 ptCenter.y);
285 CFX_FloatPoint pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
286 ptCenter.y + PWL_TRIANGLE_HALFLEN);
287 CFX_FloatPoint pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
288 ptCenter.y - PWL_TRIANGLE_HALFLEN);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700289
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700290 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
291 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
292 CFX_PathData path;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700293
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700294 path.SetPointCount(4);
295 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO);
296 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO);
297 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO);
298 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700299
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700300 pDevice->DrawPath(&path, pUser2Device, NULL,
301 CPWL_Utils::PWLColorToFXColor(
302 PWL_DEFAULT_BLACKCOLOR, nTransparancy),
303 0, FXFILL_ALTERNATE);
304 }
305 } break;
306 default:
307 break;
308 }
309 break;
310 case SBT_VSCROLL:
311 switch (m_eSBButtonType) {
312 case PSBT_MIN: {
313 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800314 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700315 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
316 ArgbEncode(nTransparancy, 100, 100, 100),
317 0.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700318
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700319 // draw inner border
320 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
321 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
322 ArgbEncode(nTransparancy, 255, 255, 255),
323 1.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700324
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700325 // draw background
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700326
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700327 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700328
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700329 if (IsEnabled())
330 CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw,
331 nTransparancy, 80, 220);
332 else
333 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
334 ArgbEncode(255, 255, 255, 255));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700335
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 // draw arrow
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700337
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700338 if (rectWnd.top - rectWnd.bottom > 6.0f) {
339 FX_FLOAT fX = rectWnd.left + 1.5f;
340 FX_FLOAT fY = rectWnd.bottom;
Tom Sepez281a9ea2016-02-26 14:24:28 -0800341 CFX_FloatPoint pts[7] = {CFX_FloatPoint(fX + 2.5f, fY + 4.0f),
342 CFX_FloatPoint(fX + 2.5f, fY + 3.0f),
343 CFX_FloatPoint(fX + 4.5f, fY + 5.0f),
344 CFX_FloatPoint(fX + 6.5f, fY + 3.0f),
345 CFX_FloatPoint(fX + 6.5f, fY + 4.0f),
346 CFX_FloatPoint(fX + 4.5f, fY + 6.0f),
347 CFX_FloatPoint(fX + 2.5f, fY + 4.0f)};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349 if (IsEnabled())
350 CPWL_Utils::DrawFillArea(
351 pDevice, pUser2Device, pts, 7,
352 ArgbEncode(nTransparancy, 255, 255, 255));
353 else
354 CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
355 CPWL_Utils::PWLColorToFXColor(
356 PWL_DEFAULT_HEAVYGRAYCOLOR, 255));
357 }
358 } break;
359 case PSBT_MAX: {
360 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800361 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700362 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
363 ArgbEncode(nTransparancy, 100, 100, 100),
364 0.0f);
365
366 // draw inner border
367 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
368 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
369 ArgbEncode(nTransparancy, 255, 255, 255),
370 1.0f);
371
372 // draw background
373 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
374 if (IsEnabled())
375 CPWL_Utils::DrawShadow(pDevice, pUser2Device, TRUE, FALSE, rcDraw,
376 nTransparancy, 80, 220);
377 else
378 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
379 ArgbEncode(255, 255, 255, 255));
380
381 // draw arrow
382
383 if (rectWnd.top - rectWnd.bottom > 6.0f) {
384 FX_FLOAT fX = rectWnd.left + 1.5f;
385 FX_FLOAT fY = rectWnd.bottom;
386
Tom Sepez281a9ea2016-02-26 14:24:28 -0800387 CFX_FloatPoint pts[7] = {CFX_FloatPoint(fX + 2.5f, fY + 5.0f),
388 CFX_FloatPoint(fX + 2.5f, fY + 6.0f),
389 CFX_FloatPoint(fX + 4.5f, fY + 4.0f),
390 CFX_FloatPoint(fX + 6.5f, fY + 6.0f),
391 CFX_FloatPoint(fX + 6.5f, fY + 5.0f),
392 CFX_FloatPoint(fX + 4.5f, fY + 3.0f),
393 CFX_FloatPoint(fX + 2.5f, fY + 5.0f)};
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700394
395 if (IsEnabled())
396 CPWL_Utils::DrawFillArea(
397 pDevice, pUser2Device, pts, 7,
398 ArgbEncode(nTransparancy, 255, 255, 255));
399 else
400 CPWL_Utils::DrawFillArea(pDevice, pUser2Device, pts, 7,
401 CPWL_Utils::PWLColorToFXColor(
402 PWL_DEFAULT_HEAVYGRAYCOLOR, 255));
403 }
404 } break;
405 case PSBT_POS: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700406 // draw border
Tom Sepez281a9ea2016-02-26 14:24:28 -0800407 CFX_FloatRect rcDraw = rectWnd;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700408 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
409 ArgbEncode(nTransparancy, 100, 100, 100),
410 0.0f);
411
412 // draw inner border
413 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
414 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
415 ArgbEncode(nTransparancy, 255, 255, 255),
416 1.0f);
417
418 if (IsEnabled()) {
419 // draw shadow effect
420
Tom Sepez281a9ea2016-02-26 14:24:28 -0800421 CFX_FloatPoint ptTop =
422 CFX_FloatPoint(rectWnd.left, rectWnd.top - 1.0f);
423 CFX_FloatPoint ptBottom =
424 CFX_FloatPoint(rectWnd.left, rectWnd.bottom + 1.0f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700425
426 ptTop.x += 1.5f;
427 ptBottom.x += 1.5f;
428
429 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
430 ArgbEncode(nTransparancy, 210, 210, 210),
431 1.0f);
432
433 ptTop.x += 1.0f;
434 ptBottom.x += 1.0f;
435
436 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
437 ArgbEncode(nTransparancy, 220, 220, 220),
438 1.0f);
439
440 ptTop.x += 1.0f;
441 ptBottom.x += 1.0f;
442
443 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
444 ArgbEncode(nTransparancy, 240, 240, 240),
445 1.0f);
446
447 ptTop.x += 1.0f;
448 ptBottom.x += 1.0f;
449
450 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
451 ArgbEncode(nTransparancy, 240, 240, 240),
452 1.0f);
453
454 ptTop.x += 1.0f;
455 ptBottom.x += 1.0f;
456
457 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
458 ArgbEncode(nTransparancy, 210, 210, 210),
459 1.0f);
460
461 ptTop.x += 1.0f;
462 ptBottom.x += 1.0f;
463
464 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
465 ArgbEncode(nTransparancy, 180, 180, 180),
466 1.0f);
467
468 ptTop.x += 1.0f;
469 ptBottom.x += 1.0f;
470
471 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
472 ArgbEncode(nTransparancy, 150, 150, 150),
473 1.0f);
474
475 ptTop.x += 1.0f;
476 ptBottom.x += 1.0f;
477
478 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
479 ArgbEncode(nTransparancy, 150, 150, 150),
480 1.0f);
481
482 ptTop.x += 1.0f;
483 ptBottom.x += 1.0f;
484
485 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
486 ArgbEncode(nTransparancy, 180, 180, 180),
487 1.0f);
488
489 ptTop.x += 1.0f;
490 ptBottom.x += 1.0f;
491
492 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
493 ArgbEncode(nTransparancy, 210, 210, 210),
494 1.0f);
495 } else {
496 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
497 ArgbEncode(255, 255, 255, 255));
498 }
499
500 // draw friction
501
502 if (rectWnd.Height() > 8.0f) {
503 FX_COLORREF crStroke = ArgbEncode(nTransparancy, 120, 120, 120);
504 if (!IsEnabled())
505 crStroke = CPWL_Utils::PWLColorToFXColor(
506 PWL_DEFAULT_HEAVYGRAYCOLOR, 255);
507
508 FX_FLOAT nFrictionWidth = 5.0f;
509 FX_FLOAT nFrictionHeight = 5.5f;
510
Tom Sepez281a9ea2016-02-26 14:24:28 -0800511 CFX_FloatPoint ptLeft =
512 CFX_FloatPoint(ptCenter.x - nFrictionWidth / 2.0f,
513 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
514 CFX_FloatPoint ptRight =
515 CFX_FloatPoint(ptCenter.x + nFrictionWidth / 2.0f,
516 ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517
518 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
519 crStroke, 1.0f);
520
521 ptLeft.y += 2.0f;
522 ptRight.y += 2.0f;
523
524 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
525 crStroke, 1.0f);
526
527 ptLeft.y += 2.0f;
528 ptRight.y += 2.0f;
529
530 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
531 crStroke, 1.0f);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700532 }
533 } break;
534 default:
535 break;
536 }
537 break;
538 default:
539 break;
540 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700541}
542
Tom Sepez281a9ea2016-02-26 14:24:28 -0800543FX_BOOL CPWL_SBButton::OnLButtonDown(const CFX_FloatPoint& point,
tsepezc3255f52016-03-25 14:52:27 -0700544 uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700545 CPWL_Wnd::OnLButtonDown(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700546
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547 if (CPWL_Wnd* pParent = GetParentWindow())
548 pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (intptr_t)&point);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700549
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700550 m_bMouseDown = TRUE;
551 SetCapture();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700552
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700553 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700554}
555
Tom Sepez281a9ea2016-02-26 14:24:28 -0800556FX_BOOL CPWL_SBButton::OnLButtonUp(const CFX_FloatPoint& point,
tsepezc3255f52016-03-25 14:52:27 -0700557 uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700558 CPWL_Wnd::OnLButtonUp(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700559
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700560 if (CPWL_Wnd* pParent = GetParentWindow())
561 pParent->OnNotify(this, PNM_LBUTTONUP, 0, (intptr_t)&point);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700562
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700563 m_bMouseDown = FALSE;
564 ReleaseCapture();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700565
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700566 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700567}
568
Tom Sepez281a9ea2016-02-26 14:24:28 -0800569FX_BOOL CPWL_SBButton::OnMouseMove(const CFX_FloatPoint& point,
tsepezc3255f52016-03-25 14:52:27 -0700570 uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700571 CPWL_Wnd::OnMouseMove(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700572
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700573 if (CPWL_Wnd* pParent = GetParentWindow()) {
574 pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (intptr_t)&point);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700575 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700576
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700577 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700578}
579
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700580CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType)
581 : m_sbType(sbType),
582 m_pMinButton(NULL),
583 m_pMaxButton(NULL),
584 m_pPosButton(NULL),
585 m_bMouseDown(FALSE),
586 m_bMinOrMax(FALSE),
587 m_bNotifyForever(TRUE) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700588
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700589CPWL_ScrollBar::~CPWL_ScrollBar() {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700590
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700591CFX_ByteString CPWL_ScrollBar::GetClassName() const {
592 return "CPWL_ScrollBar";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700593}
594
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700595void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) {
596 cp.eCursorType = FXCT_ARROW;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700597}
598
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700599void CPWL_ScrollBar::RePosChildWnd() {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800600 CFX_FloatRect rcClient = GetClientRect();
601 CFX_FloatRect rcMinButton, rcMaxButton;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700602 FX_FLOAT fBWidth = 0;
603
604 switch (m_sbType) {
605 case SBT_HSCROLL:
606 if (rcClient.right - rcClient.left >
607 PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH +
608 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800609 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
610 rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
611 rcClient.top);
612 rcMaxButton =
613 CFX_FloatRect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
614 rcClient.bottom, rcClient.right, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700615 } else {
616 fBWidth = (rcClient.right - rcClient.left -
617 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
618 2;
619
620 if (fBWidth > 0) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800621 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
622 rcClient.left + fBWidth, rcClient.top);
623 rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom,
624 rcClient.right, rcClient.top);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800625 } else {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 SetVisible(FALSE);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800627 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700628 }
629 break;
630 case SBT_VSCROLL:
631 if (IsFloatBigger(rcClient.top - rcClient.bottom,
632 PWL_SCROLLBAR_BUTTON_WIDTH * 2 +
633 PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800634 rcMinButton = CFX_FloatRect(rcClient.left,
635 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
636 rcClient.right, rcClient.top);
637 rcMaxButton =
638 CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
639 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700640 } else {
641 fBWidth = (rcClient.top - rcClient.bottom -
642 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
643 2;
644
645 if (IsFloatBigger(fBWidth, 0)) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800646 rcMinButton = CFX_FloatRect(rcClient.left, rcClient.top - fBWidth,
647 rcClient.right, rcClient.top);
648 rcMaxButton =
649 CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
650 rcClient.bottom + fBWidth);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800651 } else {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700652 SetVisible(FALSE);
Lei Zhangc2fb35f2016-01-05 16:46:58 -0800653 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700654 }
655 break;
656 }
657
658 if (m_pMinButton)
659 m_pMinButton->Move(rcMinButton, TRUE, FALSE);
660 if (m_pMaxButton)
661 m_pMaxButton->Move(rcMaxButton, TRUE, FALSE);
662 MovePosButton(FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700663}
664
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700665void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800666 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700667
668 if (IsVisible() && !rectWnd.IsEmpty()) {
669 CFX_ByteTextBuf sButton;
670
671 sButton << "q\n";
672 sButton << "0 w\n"
tsepez28f97ff2016-04-04 16:41:35 -0700673 << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), TRUE)
674 .AsByteStringC();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700675 sButton << rectWnd.left << " " << rectWnd.bottom << " "
676 << rectWnd.right - rectWnd.left << " "
677 << rectWnd.top - rectWnd.bottom << " re b Q\n";
678
679 sAppStream << sButton;
680 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700681}
682
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700683void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice,
Tom Sepez60d909e2015-12-10 15:34:55 -0800684 CFX_Matrix* pUser2Device) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800685 CFX_FloatRect rectWnd = GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700686
687 if (IsVisible() && !rectWnd.IsEmpty()) {
688 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd,
689 GetBackgroundColor(), GetTransparency());
690
691 CPWL_Utils::DrawStrokeLine(
692 pDevice, pUser2Device,
Tom Sepez281a9ea2016-02-26 14:24:28 -0800693 CFX_FloatPoint(rectWnd.left + 2.0f, rectWnd.top - 2.0f),
694 CFX_FloatPoint(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700695 ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
696
697 CPWL_Utils::DrawStrokeLine(
698 pDevice, pUser2Device,
Tom Sepez281a9ea2016-02-26 14:24:28 -0800699 CFX_FloatPoint(rectWnd.right - 2.0f, rectWnd.top - 2.0f),
700 CFX_FloatPoint(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f),
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700701 ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
702 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700703}
704
Tom Sepez281a9ea2016-02-26 14:24:28 -0800705FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CFX_FloatPoint& point,
tsepezc3255f52016-03-25 14:52:27 -0700706 uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700707 CPWL_Wnd::OnLButtonDown(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700708
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700709 if (HasFlag(PWS_AUTOTRANSPARENT)) {
710 if (GetTransparency() != 255) {
711 SetTransparency(255);
712 InvalidateRect();
713 }
714 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700715
Tom Sepez281a9ea2016-02-26 14:24:28 -0800716 CFX_FloatRect rcMinArea, rcMaxArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700717
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700718 if (m_pPosButton && m_pPosButton->IsVisible()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800719 CFX_FloatRect rcClient = GetClientRect();
720 CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
Lei Zhang60f507b2015-06-13 00:41:00 -0700721
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700722 switch (m_sbType) {
723 case SBT_HSCROLL:
Tom Sepez281a9ea2016-02-26 14:24:28 -0800724 rcMinArea =
725 CFX_FloatRect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
726 rcClient.bottom, rcPosButton.left, rcClient.top);
727 rcMaxArea = CFX_FloatRect(rcPosButton.right, rcClient.bottom,
728 rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
729 rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700730
731 break;
732 case SBT_VSCROLL:
Tom Sepez281a9ea2016-02-26 14:24:28 -0800733 rcMinArea =
734 CFX_FloatRect(rcClient.left, rcPosButton.top, rcClient.right,
735 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
736 rcMaxArea = CFX_FloatRect(rcClient.left,
737 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,
738 rcClient.right, rcPosButton.bottom);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700739 break;
740 }
741
742 rcMinArea.Normalize();
743 rcMaxArea.Normalize();
744
745 if (rcMinArea.Contains(point.x, point.y)) {
746 m_sData.SubBig();
747 MovePosButton(TRUE);
748 NotifyScrollWindow();
749 }
750
751 if (rcMaxArea.Contains(point.x, point.y)) {
752 m_sData.AddBig();
753 MovePosButton(TRUE);
754 NotifyScrollWindow();
755 }
756 }
757
758 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700759}
760
Tom Sepez281a9ea2016-02-26 14:24:28 -0800761FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CFX_FloatPoint& point,
tsepezc3255f52016-03-25 14:52:27 -0700762 uint32_t nFlag) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700763 CPWL_Wnd::OnLButtonUp(point, nFlag);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700764
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700765 if (HasFlag(PWS_AUTOTRANSPARENT)) {
766 if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) {
767 SetTransparency(PWL_SCROLLBAR_TRANSPARANCY);
768 InvalidateRect();
769 }
770 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700771
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700772 EndTimer();
773 m_bMouseDown = FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700774
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700775 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700776}
777
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700778void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd,
tsepezc3255f52016-03-25 14:52:27 -0700779 uint32_t msg,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700780 intptr_t wParam,
781 intptr_t lParam) {
782 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700783
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700784 switch (msg) {
785 case PNM_LBUTTONDOWN:
786 if (pWnd == m_pMinButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800787 OnMinButtonLBDown(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700788 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700789
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790 if (pWnd == m_pMaxButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800791 OnMaxButtonLBDown(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700792 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700793
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700794 if (pWnd == m_pPosButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800795 OnPosButtonLBDown(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700796 }
797 break;
798 case PNM_LBUTTONUP:
799 if (pWnd == m_pMinButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800800 OnMinButtonLBUp(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700801 }
802
803 if (pWnd == m_pMaxButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800804 OnMaxButtonLBUp(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700805 }
806
807 if (pWnd == m_pPosButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800808 OnPosButtonLBUp(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700809 }
810 break;
811 case PNM_MOUSEMOVE:
812 if (pWnd == m_pMinButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800813 OnMinButtonMouseMove(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700814 }
815
816 if (pWnd == m_pMaxButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800817 OnMaxButtonMouseMove(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700818 }
819
820 if (pWnd == m_pPosButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800821 OnPosButtonMouseMove(*(CFX_FloatPoint*)lParam);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700822 }
823 break;
824 case PNM_SETSCROLLINFO: {
825 if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) {
826 if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0) {
827 m_OriginInfo = *pInfo;
828 FX_FLOAT fMax =
829 pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
830 fMax = fMax > 0.0f ? fMax : 0.0f;
831 SetScrollRange(0, fMax, pInfo->fPlateWidth);
832 SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep);
833 }
834 }
835 } break;
836 case PNM_SETSCROLLPOS: {
837 FX_FLOAT fPos = *(FX_FLOAT*)lParam;
838 switch (m_sbType) {
839 case SBT_HSCROLL:
840 fPos = fPos - m_OriginInfo.fContentMin;
841 break;
842 case SBT_VSCROLL:
843 fPos = m_OriginInfo.fContentMax - fPos;
844 break;
845 }
846 SetScrollPos(fPos);
847 } break;
848 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700849}
850
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700851void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) {
852 PWL_CREATEPARAM scp = cp;
853 scp.pParentWnd = this;
854 scp.dwBorderWidth = 2;
855 scp.nBorderStyle = PBS_BEVELED;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700856
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700857 scp.dwFlags =
858 PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700859
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700860 if (!m_pMinButton) {
861 m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN);
862 m_pMinButton->Create(scp);
863 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700864
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700865 if (!m_pMaxButton) {
866 m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX);
867 m_pMaxButton->Create(scp);
868 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700869
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700870 if (!m_pPosButton) {
871 m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS);
872 m_pPosButton->SetVisible(FALSE);
873 m_pPosButton->Create(scp);
874 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700875}
876
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700877FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const {
878 if (!IsVisible())
879 return 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700880
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700881 return PWL_SCROLLBAR_WIDTH;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700882}
883
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700884void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,
885 FX_FLOAT fMax,
886 FX_FLOAT fClientWidth) {
887 if (m_pPosButton) {
888 m_sData.SetScrollRange(fMin, fMax);
889 m_sData.SetClientWidth(fClientWidth);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700890
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700891 if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) {
892 m_pPosButton->SetVisible(FALSE);
893 } else {
894 m_pPosButton->SetVisible(TRUE);
895 MovePosButton(TRUE);
896 }
897 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700898}
899
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700900void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) {
901 FX_FLOAT fOldPos = m_sData.fScrollPos;
Lei Zhang60f507b2015-06-13 00:41:00 -0700902
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700903 m_sData.SetPos(fPos);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700904
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700905 if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
906 MovePosButton(TRUE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700907}
908
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) {
910 m_sData.SetBigStep(fBigStep);
911 m_sData.SetSmallStep(fSmallStep);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700912}
913
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700914void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh) {
Lei Zhang96660d62015-12-14 18:27:25 -0800915 ASSERT(m_pMinButton);
916 ASSERT(m_pMaxButton);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700917
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700918 if (m_pPosButton->IsVisible()) {
Tom Sepez281a9ea2016-02-26 14:24:28 -0800919 CFX_FloatRect rcClient;
920 CFX_FloatRect rcPosArea, rcPosButton;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700921
922 rcClient = GetClientRect();
923 rcPosArea = GetScrollArea();
924
925 FX_FLOAT fLeft, fRight, fTop, fBottom;
926
927 switch (m_sbType) {
928 case SBT_HSCROLL:
929 fLeft = TrueToFace(m_sData.fScrollPos);
930 fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
931
932 if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)
933 fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
934
935 if (fRight > rcPosArea.right) {
936 fRight = rcPosArea.right;
937 fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
938 }
939
Tom Sepez281a9ea2016-02-26 14:24:28 -0800940 rcPosButton =
941 CFX_FloatRect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700942
943 break;
944 case SBT_VSCROLL:
945 fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
946 fTop = TrueToFace(m_sData.fScrollPos);
947
948 if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))
949 fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
950
951 if (IsFloatSmaller(fBottom, rcPosArea.bottom)) {
952 fBottom = rcPosArea.bottom;
953 fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
954 }
955
Tom Sepez281a9ea2016-02-26 14:24:28 -0800956 rcPosButton =
957 CFX_FloatRect(rcPosArea.left, fBottom, rcPosArea.right, fTop);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700958
959 break;
960 }
961
962 m_pPosButton->Move(rcPosButton, TRUE, bRefresh);
963 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700964}
965
Tom Sepez281a9ea2016-02-26 14:24:28 -0800966void CPWL_ScrollBar::OnMinButtonLBDown(const CFX_FloatPoint& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700967 m_sData.SubSmall();
968 MovePosButton(TRUE);
969 NotifyScrollWindow();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700970
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700971 m_bMinOrMax = TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700972
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700973 EndTimer();
974 BeginTimer(100);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700975}
976
Tom Sepez281a9ea2016-02-26 14:24:28 -0800977void CPWL_ScrollBar::OnMinButtonLBUp(const CFX_FloatPoint& point) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978
Tom Sepez281a9ea2016-02-26 14:24:28 -0800979void CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_FloatPoint& point) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700980
Tom Sepez281a9ea2016-02-26 14:24:28 -0800981void CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_FloatPoint& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700982 m_sData.AddSmall();
983 MovePosButton(TRUE);
984 NotifyScrollWindow();
985
986 m_bMinOrMax = FALSE;
987
988 EndTimer();
989 BeginTimer(100);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700990}
991
Tom Sepez281a9ea2016-02-26 14:24:28 -0800992void CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_FloatPoint& point) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700993
Tom Sepez281a9ea2016-02-26 14:24:28 -0800994void CPWL_ScrollBar::OnMaxButtonMouseMove(const CFX_FloatPoint& point) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700995
Tom Sepez281a9ea2016-02-26 14:24:28 -0800996void CPWL_ScrollBar::OnPosButtonLBDown(const CFX_FloatPoint& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700997 m_bMouseDown = TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700998
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700999 if (m_pPosButton) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001000 CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001001
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001002 switch (m_sbType) {
1003 case SBT_HSCROLL:
1004 m_nOldPos = point.x;
1005 m_fOldPosButton = rcPosButton.left;
1006 break;
1007 case SBT_VSCROLL:
1008 m_nOldPos = point.y;
1009 m_fOldPosButton = rcPosButton.top;
1010 break;
1011 }
1012 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001013}
1014
Tom Sepez281a9ea2016-02-26 14:24:28 -08001015void CPWL_ScrollBar::OnPosButtonLBUp(const CFX_FloatPoint& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001016 if (m_bMouseDown) {
1017 if (!m_bNotifyForever)
1018 NotifyScrollWindow();
1019 }
1020 m_bMouseDown = FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001021}
1022
Tom Sepez281a9ea2016-02-26 14:24:28 -08001023void CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_FloatPoint& point) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001024 FX_FLOAT fOldScrollPos = m_sData.fScrollPos;
1025
1026 FX_FLOAT fNewPos = 0;
1027
1028 switch (m_sbType) {
1029 case SBT_HSCROLL:
1030 if (FXSYS_fabs(point.x - m_nOldPos) < 1)
1031 return;
1032 fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);
1033 break;
1034 case SBT_VSCROLL:
1035 if (FXSYS_fabs(point.y - m_nOldPos) < 1)
1036 return;
1037 fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);
1038 break;
1039 }
1040
1041 if (m_bMouseDown) {
1042 switch (m_sbType) {
1043 case SBT_HSCROLL:
1044
1045 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1046 fNewPos = m_sData.ScrollRange.fMin;
1047 }
1048
1049 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1050 fNewPos = m_sData.ScrollRange.fMax;
1051 }
1052
1053 m_sData.SetPos(fNewPos);
1054
1055 break;
1056 case SBT_VSCROLL:
1057
1058 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1059 fNewPos = m_sData.ScrollRange.fMin;
1060 }
1061
1062 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1063 fNewPos = m_sData.ScrollRange.fMax;
1064 }
1065
1066 m_sData.SetPos(fNewPos);
1067
1068 break;
1069 }
1070
1071 if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) {
1072 MovePosButton(TRUE);
1073
1074 if (m_bNotifyForever)
1075 NotifyScrollWindow();
1076 }
1077 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001078}
1079
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001080void CPWL_ScrollBar::NotifyScrollWindow() {
1081 if (CPWL_Wnd* pParent = GetParentWindow()) {
1082 FX_FLOAT fPos;
1083 switch (m_sbType) {
1084 case SBT_HSCROLL:
1085 fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;
1086 break;
1087 case SBT_VSCROLL:
1088 fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;
1089 break;
1090 }
1091 pParent->OnNotify(this, PNM_SCROLLWINDOW, (intptr_t)m_sbType,
1092 (intptr_t)&fPos);
1093 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001094}
1095
Tom Sepez281a9ea2016-02-26 14:24:28 -08001096CFX_FloatRect CPWL_ScrollBar::GetScrollArea() const {
1097 CFX_FloatRect rcClient = GetClientRect();
1098 CFX_FloatRect rcArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001099
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001100 if (!m_pMinButton || !m_pMaxButton)
1101 return rcClient;
Lei Zhang60f507b2015-06-13 00:41:00 -07001102
Tom Sepez281a9ea2016-02-26 14:24:28 -08001103 CFX_FloatRect rcMin = m_pMinButton->GetWindowRect();
1104 CFX_FloatRect rcMax = m_pMaxButton->GetWindowRect();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001105
1106 FX_FLOAT fMinWidth = rcMin.right - rcMin.left;
1107 FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;
1108 FX_FLOAT fMaxWidth = rcMax.right - rcMax.left;
1109 FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;
1110
1111 switch (m_sbType) {
1112 case SBT_HSCROLL:
1113 if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001114 rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
1115 rcClient.right - fMaxWidth - 1, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001116 } else {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001117 rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
1118 rcClient.left + fMinWidth + 1, rcClient.top);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001119 }
1120 break;
1121 case SBT_VSCROLL:
1122 if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001123 rcArea = CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
1124 rcClient.right, rcClient.top - fMaxHeight - 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001125 } else {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001126 rcArea =
1127 CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
1128 rcClient.right, rcClient.bottom + fMinHeight + 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001129 }
1130 break;
1131 }
1132
1133 rcArea.Normalize();
1134
1135 return rcArea;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001136}
1137
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001138FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001139 CFX_FloatRect rcPosArea;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001140 rcPosArea = GetScrollArea();
1141
1142 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1143 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1144
1145 FX_FLOAT fFace = 0;
1146
1147 switch (m_sbType) {
1148 case SBT_HSCROLL:
1149 fFace = rcPosArea.left +
1150 fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;
1151 break;
1152 case SBT_VSCROLL:
1153 fFace = rcPosArea.top -
1154 fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;
1155 break;
1156 }
1157
1158 return fFace;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001159}
1160
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001161FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) {
Tom Sepez281a9ea2016-02-26 14:24:28 -08001162 CFX_FloatRect rcPosArea;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001163 rcPosArea = GetScrollArea();
1164
1165 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1166 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1167
1168 FX_FLOAT fTrue = 0;
1169
1170 switch (m_sbType) {
1171 case SBT_HSCROLL:
1172 fTrue = (fFace - rcPosArea.left) * fFactWidth /
1173 (rcPosArea.right - rcPosArea.left);
1174 break;
1175 case SBT_VSCROLL:
1176 fTrue = (rcPosArea.top - fFace) * fFactWidth /
1177 (rcPosArea.top - rcPosArea.bottom);
1178 break;
1179 }
1180
1181 return fTrue;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001182}
1183
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001184void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) {
1185 CreateButtons(cp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001186}
1187
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001188void CPWL_ScrollBar::TimerProc() {
1189 PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001190
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001191 if (m_bMinOrMax)
1192 m_sData.SubSmall();
1193 else
1194 m_sData.AddSmall();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001195
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001196 if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) {
1197 MovePosButton(TRUE);
1198 NotifyScrollWindow();
1199 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001200}