1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved.
2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be
3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file.
4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h"
8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_pathdata.h"
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxge/cfx_renderdevice.h"
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Utils.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannPWL_FLOATRANGE::PWL_FLOATRANGE() {
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Default();
16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannPWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) {
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Set(min, max);
20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_FLOATRANGE::Default() {
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fMin = 0;
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fMax = 0;
25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) {
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (min > max) {
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fMin = max;
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fMax = min;
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fMin = min;
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fMax = max;
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool PWL_FLOATRANGE::In(FX_FLOAT x) const {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) &&
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann         (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax));
40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT PWL_FLOATRANGE::GetWidth() const {
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return fMax - fMin;
44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannPWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() {
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  Default();
48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::Default() {
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ScrollRange.Default();
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fScrollPos = ScrollRange.fMin;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fClientWidth = 0;
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fBigStep = 10;
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fSmallStep = 1;
56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) {
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ScrollRange.Set(min, max);
60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsFloatSmaller(fScrollPos, ScrollRange.fMin))
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fScrollPos = ScrollRange.fMin;
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsFloatBigger(fScrollPos, ScrollRange.fMax))
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fScrollPos = ScrollRange.fMax;
65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) {
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fClientWidth = width;
69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) {
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fSmallStep = step;
73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) {
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fBigStep = step;
77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) {
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ScrollRange.In(pos)) {
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    fScrollPos = pos;
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::AddSmall() {
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!SetPos(fScrollPos + fSmallStep))
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetPos(ScrollRange.fMax);
90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SubSmall() {
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!SetPos(fScrollPos - fSmallStep))
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetPos(ScrollRange.fMin);
95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::AddBig() {
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!SetPos(fScrollPos + fBigStep))
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetPos(ScrollRange.fMax);
100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid PWL_SCROLL_PRIVATEDATA::SubBig() {
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!SetPos(fScrollPos - fBigStep))
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    SetPos(ScrollRange.fMin);
105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             PWL_SBBUTTON_TYPE eButtonType) {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_eScrollBarType = eScrollBarType;
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_eSBButtonType = eButtonType;
111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = false;
113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPWL_SBButton::~CPWL_SBButton() {}
116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPWL_SBButton::GetClassName() const {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return "CPWL_SBButton";
119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) {
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cp.eCursorType = FXCT_ARROW;
123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::GetThisAppearanceStream(sAppStream);
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsVisible())
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteTextBuf sButton;
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rectWnd = GetWindowRect();
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (rectWnd.IsEmpty())
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  sAppStream << "q\n";
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_PointF ptCenter = GetCenterPoint();
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_eScrollBarType) {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (m_eSBButtonType) {
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MIN: {
1465ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
1475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
1485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN);
1495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
1505ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN);
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << "0 g\n";
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " m\n";
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt2.x << " " << pt2.y << " l\n";
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt3.x << " " << pt3.y << " l\n";
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " l f\n";
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sAppStream << sButton;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MAX: {
1645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
1655ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
1665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN);
1675ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
1685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN);
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << "0 g\n";
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " m\n";
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt2.x << " " << pt2.y << " l\n";
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt3.x << " " << pt3.y << " l\n";
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " l f\n";
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sAppStream << sButton;
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        default:
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (m_eSBButtonType) {
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MIN: {
1885ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
1895ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
1905ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
1915ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
1925ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x, ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << "0 g\n";
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " m\n";
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt2.x << " " << pt2.y << " l\n";
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt3.x << " " << pt3.y << " l\n";
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " l f\n";
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sAppStream << sButton;
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MAX: {
2065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN,
2075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
2085ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN,
2095ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f);
2105ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x, ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f);
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << "0 g\n";
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " m\n";
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt2.x << " " << pt2.y << " l\n";
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt3.x << " " << pt3.y << " l\n";
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sButton << pt1.x << " " << pt1.y << " l f\n";
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            sAppStream << sButton;
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        default:
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  sAppStream << "Q\n";
232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice,
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       CFX_Matrix* pUser2Device) {
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsVisible())
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rectWnd = GetWindowRect();
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (rectWnd.IsEmpty())
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  CFX_PointF ptCenter = GetCenterPoint();
2445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann  int32_t nTransparency = GetTransparency();
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_eScrollBarType) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (m_eSBButtonType) {
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MIN: {
2515ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
2525ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
2535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN);
2545ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f,
2555ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN);
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CFX_PathData path;
2605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false);
2615ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt2, FXPT_TYPE::LineTo, false);
2625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt3, FXPT_TYPE::LineTo, false);
2635ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt1, FXPT_TYPE::LineTo, false);
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pDevice->DrawPath(&path, pUser2Device, nullptr,
2665ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                              PWL_DEFAULT_BLACKCOLOR.ToFXColor(nTransparency),
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              0, FXFILL_ALTERNATE);
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MAX: {
2715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y);
2725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
2735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y + PWL_TRIANGLE_HALFLEN);
2745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann          CFX_PointF pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f,
2755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                         ptCenter.y - PWL_TRIANGLE_HALFLEN);
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 &&
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) {
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CFX_PathData path;
2805ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt1, FXPT_TYPE::MoveTo, false);
2815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt2, FXPT_TYPE::LineTo, false);
2825ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt3, FXPT_TYPE::LineTo, false);
2835ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            path.AppendPoint(pt1, FXPT_TYPE::LineTo, false);
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pDevice->DrawPath(&path, pUser2Device, nullptr,
2865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                              PWL_DEFAULT_BLACKCOLOR.ToFXColor(nTransparency),
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              0, FXFILL_ALTERNATE);
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        default:
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (m_eSBButtonType) {
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MIN: {
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw border
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_FloatRect rcDraw = rectWnd;
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3005ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 100, 100, 100),
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     0.0f);
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw inner border
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 255, 255, 255),
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     1.0f);
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw background
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (IsEnabled())
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw,
3155ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                   nTransparency, 80, 220);
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          else
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     ArgbEncode(255, 255, 255, 255));
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw arrow
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.top - rectWnd.bottom > 6.0f) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT fX = rectWnd.left + 1.5f;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT fY = rectWnd.bottom;
3255ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 4.0f),
3265ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 2.5f, fY + 3.0f),
3275ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 4.5f, fY + 5.0f),
3285ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 6.5f, fY + 3.0f),
3295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 6.5f, fY + 4.0f),
3305ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 4.5f, fY + 6.0f),
3315ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 2.5f, fY + 4.0f)};
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (IsEnabled())
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              CPWL_Utils::DrawFillArea(
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  pDevice, pUser2Device, pts, 7,
3365ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  ArgbEncode(nTransparency, 255, 255, 255));
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            else
3385ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann              CPWL_Utils::DrawFillArea(
3395ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  pDevice, pUser2Device, pts, 7,
3405ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255));
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_MAX: {
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw border
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_FloatRect rcDraw = rectWnd;
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3475ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 100, 100, 100),
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     0.0f);
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw inner border
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 255, 255, 255),
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     1.0f);
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw background
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f);
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (IsEnabled())
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CPWL_Utils::DrawShadow(pDevice, pUser2Device, true, false, rcDraw,
3605ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                   nTransparency, 80, 220);
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          else
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     ArgbEncode(255, 255, 255, 255));
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw arrow
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.top - rectWnd.bottom > 6.0f) {
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT fX = rectWnd.left + 1.5f;
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT fY = rectWnd.bottom;
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
3715ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF pts[7] = {CFX_PointF(fX + 2.5f, fY + 5.0f),
3725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 2.5f, fY + 6.0f),
3735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 4.5f, fY + 4.0f),
3745ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 6.5f, fY + 6.0f),
3755ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 6.5f, fY + 5.0f),
3765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 4.5f, fY + 3.0f),
3775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                 CFX_PointF(fX + 2.5f, fY + 5.0f)};
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (IsEnabled())
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              CPWL_Utils::DrawFillArea(
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  pDevice, pUser2Device, pts, 7,
3825ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  ArgbEncode(nTransparency, 255, 255, 255));
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            else
3845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann              CPWL_Utils::DrawFillArea(
3855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  pDevice, pUser2Device, pts, 7,
3865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                  PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255));
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case PSBT_POS: {
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw border
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          CFX_FloatRect rcDraw = rectWnd;
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 100, 100, 100),
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     0.0f);
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw inner border
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f);
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device, rcDraw,
3995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                     ArgbEncode(nTransparency, 255, 255, 255),
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     1.0f);
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (IsEnabled()) {
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            // draw shadow effect
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
4055ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF ptTop = CFX_PointF(rectWnd.left, rectWnd.top - 1.0f);
4065ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF ptBottom =
4075ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                CFX_PointF(rectWnd.left, rectWnd.bottom + 1.0f);
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.5f;
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.5f;
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4135ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 210, 210, 210),
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4205ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 220, 220, 220),
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4275ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 240, 240, 240),
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4345ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 240, 240, 240),
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4415ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 210, 210, 210),
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4485ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 180, 180, 180),
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4555ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 150, 150, 150),
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4625ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 150, 150, 150),
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4695ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 180, 180, 180),
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptTop.x += 1.0f;
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptBottom.x += 1.0f;
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptTop, ptBottom,
4765ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                                       ArgbEncode(nTransparency, 210, 210, 210),
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       1.0f);
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rcDraw,
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     ArgbEncode(255, 255, 255, 255));
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          // draw friction
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (rectWnd.Height() > 8.0f) {
4865ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            FX_COLORREF crStroke = ArgbEncode(nTransparency, 120, 120, 120);
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (!IsEnabled())
4885ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann              crStroke = PWL_DEFAULT_HEAVYGRAYCOLOR.ToFXColor(255);
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT nFrictionWidth = 5.0f;
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_FLOAT nFrictionHeight = 5.5f;
492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
4935ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF ptLeft =
4945ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                CFX_PointF(ptCenter.x - nFrictionWidth / 2.0f,
4955ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                           ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
4965ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann            CFX_PointF ptRight =
4975ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                CFX_PointF(ptCenter.x + nFrictionWidth / 2.0f,
4985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann                           ptCenter.y - nFrictionHeight / 2.0f + 0.5f);
499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       crStroke, 1.0f);
502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptLeft.y += 2.0f;
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptRight.y += 2.0f;
505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       crStroke, 1.0f);
508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptLeft.y += 2.0f;
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            ptRight.y += 2.0f;
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight,
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       crStroke, 1.0f);
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } break;
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        default:
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    default:
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5255ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CPWL_SBButton::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonDown(point, nFlag);
527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPWL_Wnd* pParent = GetParentWindow())
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (intptr_t)&point);
530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = true;
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  SetCapture();
533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5375ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CPWL_SBButton::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonUp(point, nFlag);
539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPWL_Wnd* pParent = GetParentWindow())
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParent->OnNotify(this, PNM_LBUTTONUP, 0, (intptr_t)&point);
542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = false;
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ReleaseCapture();
545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5495ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CPWL_SBButton::OnMouseMove(const CFX_PointF& point, uint32_t nFlag) {
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnMouseMove(point, nFlag);
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPWL_Wnd* pParent = GetParentWindow()) {
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (intptr_t)&point);
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
5564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType)
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_sbType(sbType),
5614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pMinButton(nullptr),
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pMaxButton(nullptr),
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPosButton(nullptr),
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bMouseDown(false),
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bMinOrMax(false),
5664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bNotifyForever(true) {}
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCPWL_ScrollBar::~CPWL_ScrollBar() {}
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_ByteString CPWL_ScrollBar::GetClassName() const {
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return "CPWL_ScrollBar";
572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) {
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  cp.eCursorType = FXCT_ARROW;
576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::RePosChildWnd() {
5794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcClient = GetClientRect();
5804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcMinButton, rcMaxButton;
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fBWidth = 0;
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_sbType) {
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (rcClient.right - rcClient.left >
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH +
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              2) {
5884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
5894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
5904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    rcClient.top);
5914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMaxButton =
5924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcClient.bottom, rcClient.right, rcClient.top);
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fBWidth = (rcClient.right - rcClient.left -
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  2;
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (fBWidth > 0) {
6004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          rcMinButton = CFX_FloatRect(rcClient.left, rcClient.bottom,
6014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      rcClient.left + fBWidth, rcClient.top);
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          rcMaxButton = CFX_FloatRect(rcClient.right - fBWidth, rcClient.bottom,
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      rcClient.right, rcClient.top);
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          SetVisible(false);
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (IsFloatBigger(rcClient.top - rcClient.bottom,
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                        PWL_SCROLLBAR_BUTTON_WIDTH * 2 +
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) {
6134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMinButton = CFX_FloatRect(rcClient.left,
6144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH,
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    rcClient.right, rcClient.top);
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMaxButton =
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
6184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH);
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fBWidth = (rcClient.top - rcClient.bottom -
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                   PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) /
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  2;
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatBigger(fBWidth, 0)) {
6254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          rcMinButton = CFX_FloatRect(rcClient.left, rcClient.top - fBWidth,
6264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                      rcClient.right, rcClient.top);
6274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          rcMaxButton =
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              CFX_FloatRect(rcClient.left, rcClient.bottom, rcClient.right,
6294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            rcClient.bottom + fBWidth);
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          SetVisible(false);
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pMinButton)
6384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pMinButton->Move(rcMinButton, true, false);
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pMaxButton)
6404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pMaxButton->Move(rcMaxButton, true, false);
6414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  MovePosButton(false);
642e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
643e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
6454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rectWnd = GetWindowRect();
646e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsVisible() && !rectWnd.IsEmpty()) {
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteTextBuf sButton;
649e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sButton << "q\n";
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sButton << "0 w\n"
6524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), true)
6534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                   .AsStringC();
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sButton << rectWnd.left << " " << rectWnd.bottom << " "
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            << rectWnd.right - rectWnd.left << " "
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            << rectWnd.top - rectWnd.bottom << " re b Q\n";
657e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    sAppStream << sButton;
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
660e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
661e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice,
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        CFX_Matrix* pUser2Device) {
6644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rectWnd = GetWindowRect();
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (IsVisible() && !rectWnd.IsEmpty()) {
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd,
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             GetBackgroundColor(), GetTransparency());
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPWL_Utils::DrawStrokeLine(
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDevice, pUser2Device,
6725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        CFX_PointF(rectWnd.left + 2.0f, rectWnd.top - 2.0f),
6735ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        CFX_PointF(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f),
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CPWL_Utils::DrawStrokeLine(
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        pDevice, pUser2Device,
6785ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        CFX_PointF(rectWnd.right - 2.0f, rectWnd.top - 2.0f),
6795ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        CFX_PointF(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f),
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        ArgbEncode(GetTransparency(), 100, 100, 100), 1.0f);
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
682e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
683e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
6845ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CPWL_ScrollBar::OnLButtonDown(const CFX_PointF& point, uint32_t nFlag) {
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonDown(point, nFlag);
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (HasFlag(PWS_AUTOTRANSPARENT)) {
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (GetTransparency() != 255) {
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetTransparency(255);
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      InvalidateRect();
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcMinArea, rcMaxArea;
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pPosButton && m_pPosButton->IsVisible()) {
6974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect rcClient = GetClientRect();
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (m_sbType) {
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_HSCROLL:
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMinArea =
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,
7044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcClient.bottom, rcPosButton.left, rcClient.top);
7054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMaxArea = CFX_FloatRect(rcPosButton.right, rcClient.bottom,
7064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH,
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  rcClient.top);
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_VSCROLL:
7114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMinArea =
7124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcClient.left, rcPosButton.top, rcClient.right,
7134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH);
7144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcMaxArea = CFX_FloatRect(rcClient.left,
7154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH,
7164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  rcClient.right, rcPosButton.bottom);
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rcMinArea.Normalize();
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rcMaxArea.Normalize();
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7235ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    if (rcMinArea.Contains(point)) {
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_sData.SubBig();
7254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      MovePosButton(true);
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      NotifyScrollWindow();
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7295ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    if (rcMaxArea.Contains(point)) {
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_sData.AddBig();
7314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      MovePosButton(true);
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      NotifyScrollWindow();
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
737e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
738e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7395ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannbool CPWL_ScrollBar::OnLButtonUp(const CFX_PointF& point, uint32_t nFlag) {
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnLButtonUp(point, nFlag);
741e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (HasFlag(PWS_AUTOTRANSPARENT)) {
7435ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann    if (GetTransparency() != PWL_SCROLLBAR_TRANSPARENCY) {
7445ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann      SetTransparency(PWL_SCROLLBAR_TRANSPARENCY);
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      InvalidateRect();
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
748e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EndTimer();
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = false;
751e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
753e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
754e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd,
7564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                              uint32_t msg,
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              intptr_t wParam,
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              intptr_t lParam) {
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (msg) {
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_LBUTTONDOWN:
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMinButton) {
7645ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMinButtonLBDown(*(CFX_PointF*)lParam);
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMaxButton) {
7685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMaxButtonLBDown(*(CFX_PointF*)lParam);
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pPosButton) {
7725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnPosButtonLBDown(*(CFX_PointF*)lParam);
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_LBUTTONUP:
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMinButton) {
7775ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMinButtonLBUp(*(CFX_PointF*)lParam);
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMaxButton) {
7815ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMaxButtonLBUp(*(CFX_PointF*)lParam);
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pPosButton) {
7855ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnPosButtonLBUp(*(CFX_PointF*)lParam);
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_MOUSEMOVE:
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMinButton) {
7905ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMinButtonMouseMove(*(CFX_PointF*)lParam);
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pMaxButton) {
7945ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnMaxButtonMouseMove(*(CFX_PointF*)lParam);
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pWnd == m_pPosButton) {
7985ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmann        OnPosButtonMouseMove(*(CFX_PointF*)lParam);
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SETSCROLLINFO: {
8024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      PWL_SCROLL_INFO* pInfo = reinterpret_cast<PWL_SCROLL_INFO*>(lParam);
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pInfo && *pInfo != m_OriginInfo) {
8044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_OriginInfo = *pInfo;
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        FX_FLOAT fMax =
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
8074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fMax = fMax > 0.0f ? fMax : 0.0f;
8084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        SetScrollRange(0, fMax, pInfo->fPlateWidth);
8094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep);
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case PNM_SETSCROLLPOS: {
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_FLOAT fPos = *(FX_FLOAT*)lParam;
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      switch (m_sbType) {
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case SBT_HSCROLL:
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fPos = fPos - m_OriginInfo.fContentMin;
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        case SBT_VSCROLL:
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fPos = m_OriginInfo.fContentMax - fPos;
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          break;
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      SetScrollPos(fPos);
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } break;
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
825e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
826e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) {
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PWL_CREATEPARAM scp = cp;
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  scp.pParentWnd = this;
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  scp.dwBorderWidth = 2;
8314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  scp.nBorderStyle = BorderStyle::BEVELED;
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  scp.dwFlags =
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP;
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pMinButton) {
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN);
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pMinButton->Create(scp);
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pMaxButton) {
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX);
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pMaxButton->Create(scp);
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pPosButton) {
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS);
8484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pPosButton->SetVisible(false);
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pPosButton->Create(scp);
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
851e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
852e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const {
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsVisible())
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
856e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return PWL_SCROLLBAR_WIDTH;
858e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
859e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_FLOAT fMax,
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_FLOAT fClientWidth) {
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pPosButton) {
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_sData.SetScrollRange(fMin, fMax);
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_sData.SetClientWidth(fClientWidth);
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) {
8684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPosButton->SetVisible(false);
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
8704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pPosButton->SetVisible(true);
8714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      MovePosButton(true);
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
874e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
875e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) {
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fOldPos = m_sData.fScrollPos;
878e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_sData.SetPos(fPos);
880e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!IsFloatEqual(m_sData.fScrollPos, fOldPos))
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    MovePosButton(true);
883e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
884e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) {
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_sData.SetBigStep(fBigStep);
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_sData.SetSmallStep(fSmallStep);
888e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
889e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
8904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CPWL_ScrollBar::MovePosButton(bool bRefresh) {
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(m_pMinButton);
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  ASSERT(m_pMaxButton);
893e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pPosButton->IsVisible()) {
8954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect rcClient;
8964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect rcPosArea, rcPosButton;
897e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rcClient = GetClientRect();
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    rcPosArea = GetScrollArea();
900e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_FLOAT fLeft, fRight, fTop, fBottom;
902e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (m_sbType) {
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_HSCROLL:
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fLeft = TrueToFace(m_sData.fScrollPos);
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
907e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH)
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
910e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (fRight > rcPosArea.right) {
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fRight = rcPosArea.right;
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
915e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcPosButton =
9174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top);
918e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_VSCROLL:
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth);
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fTop = TrueToFace(m_sData.fScrollPos);
923e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH))
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatSmaller(fBottom, rcPosArea.bottom)) {
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fBottom = rcPosArea.bottom;
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH;
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
931e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcPosButton =
9334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcPosArea.left, fBottom, rcPosArea.right, fTop);
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pPosButton->Move(rcPosButton, true, bRefresh);
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
940e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
941e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9425ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMinButtonLBDown(const CFX_PointF& point) {
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_sData.SubSmall();
9444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  MovePosButton(true);
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  NotifyScrollWindow();
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMinOrMax = true;
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EndTimer();
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BeginTimer(100);
951e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
952e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9535ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMinButtonLBUp(const CFX_PointF& point) {}
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9555ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMinButtonMouseMove(const CFX_PointF& point) {}
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9575ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMaxButtonLBDown(const CFX_PointF& point) {
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_sData.AddSmall();
9594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  MovePosButton(true);
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  NotifyScrollWindow();
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMinOrMax = false;
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  EndTimer();
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  BeginTimer(100);
966e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
967e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9685ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_PointF& point) {}
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9705ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnMaxButtonMouseMove(const CFX_PointF& point) {}
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9725ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnPosButtonLBDown(const CFX_PointF& point) {
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = true;
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pPosButton) {
9764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFX_FloatRect rcPosButton = m_pPosButton->GetWindowRect();
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (m_sbType) {
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_HSCROLL:
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_nOldPos = point.x;
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_fOldPosButton = rcPosButton.left;
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_VSCROLL:
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_nOldPos = point.y;
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_fOldPosButton = rcPosButton.top;
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
989e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
990e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9915ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnPosButtonLBUp(const CFX_PointF& point) {
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown) {
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_bNotifyForever)
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      NotifyScrollWindow();
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
9964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = false;
997e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
998e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
9995ae9d0c6fd838a2967cca72aa5751b51dadc2769Philip P. Moltmannvoid CPWL_ScrollBar::OnPosButtonMouseMove(const CFX_PointF& point) {
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fOldScrollPos = m_sData.fScrollPos;
1001e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fNewPos = 0;
1003e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_sbType) {
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (FXSYS_fabs(point.x - m_nOldPos) < 1)
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos);
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (FXSYS_fabs(point.y - m_nOldPos) < 1)
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos);
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1016e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMouseDown) {
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (m_sbType) {
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_HSCROLL:
1020e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fNewPos = m_sData.ScrollRange.fMin;
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fNewPos = m_sData.ScrollRange.fMax;
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_sData.SetPos(fNewPos);
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_VSCROLL:
1033e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) {
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fNewPos = m_sData.ScrollRange.fMin;
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1037e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) {
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fNewPos = m_sData.ScrollRange.fMax;
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
1041e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_sData.SetPos(fNewPos);
1043e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1046e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) {
10484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      MovePosButton(true);
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_bNotifyForever)
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        NotifyScrollWindow();
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::NotifyScrollWindow() {
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (CPWL_Wnd* pParent = GetParentWindow()) {
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_FLOAT fPos;
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    switch (m_sbType) {
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_HSCROLL:
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos;
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      case SBT_VSCROLL:
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos;
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pParent->OnNotify(this, PNM_SCROLLWINDOW, (intptr_t)m_sbType,
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                      (intptr_t)&fPos);
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1070e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1071e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
10724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_FloatRect CPWL_ScrollBar::GetScrollArea() const {
10734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcClient = GetClientRect();
10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcArea;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pMinButton || !m_pMaxButton)
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return rcClient;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
10794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcMin = m_pMinButton->GetWindowRect();
10804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcMax = m_pMaxButton->GetWindowRect();
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fMinWidth = rcMin.right - rcMin.left;
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom;
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fMaxWidth = rcMax.right - rcMax.left;
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom;
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_sbType) {
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) {
10904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
10914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               rcClient.right - fMaxWidth - 1, rcClient.top);
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
10934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcArea = CFX_FloatRect(rcClient.left + fMinWidth + 1, rcClient.bottom,
10944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               rcClient.left + fMinWidth + 1, rcClient.top);
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) {
10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcArea = CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
11004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               rcClient.right, rcClient.top - fMaxHeight - 1);
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
11024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        rcArea =
11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            CFX_FloatRect(rcClient.left, rcClient.bottom + fMinHeight + 1,
11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                          rcClient.right, rcClient.bottom + fMinHeight + 1);
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rcArea.Normalize();
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return rcArea;
1112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) {
11154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcPosArea;
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rcPosArea = GetScrollArea();
1117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFace = 0;
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_sbType) {
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fFace = rcPosArea.left +
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth;
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fFace = rcPosArea.top -
1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth;
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return fFace;
1135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) {
11384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_FloatRect rcPosArea;
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rcPosArea = GetScrollArea();
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth;
1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  fFactWidth = fFactWidth == 0 ? 1 : fFactWidth;
1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fTrue = 0;
1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (m_sbType) {
1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_HSCROLL:
1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fTrue = (fFace - rcPosArea.left) * fFactWidth /
1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              (rcPosArea.right - rcPosArea.left);
1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case SBT_VSCROLL:
1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fTrue = (rcPosArea.top - fFace) * fFactWidth /
1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              (rcPosArea.top - rcPosArea.bottom);
1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return fTrue;
1158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) {
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CreateButtons(cp);
1162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}
1163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CPWL_ScrollBar::TimerProc() {
1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bMinOrMax)
1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_sData.SubSmall();
1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  else
1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_sData.AddSmall();
1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
11714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (sTemp != m_sData) {
11724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    MovePosButton(true);
1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    NotifyScrollWindow();
1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1176