14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_scrollbar.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/stl_util.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagemouse.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_messagemousewheel.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_notedriver.h"
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_themebackground.h"
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_themepart.h"
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/cfwl_timerinfo.h"
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fwl/ifwl_themeprovider.h"
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#define FWL_SCROLLBAR_Elapse 500
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst float kMinThumbSize = 5.0f;
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFWL_ScrollBar::CFWL_ScrollBar(
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    const CFWL_App* app,
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::unique_ptr<CFWL_WidgetProperties> properties,
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_Widget* pOuter)
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : CFWL_Widget(app, std::move(properties), pOuter),
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pTimerInfo(nullptr),
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fRangeMin(0),
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fRangeMax(-1),
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fPageSize(0),
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fStepSize(0),
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fPos(0),
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fTrackPos(0),
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iMinButtonState(CFWL_PartState_Normal),
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iMaxButtonState(CFWL_PartState_Normal),
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iThumbButtonState(CFWL_PartState_Normal),
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iMinTrackState(CFWL_PartState_Normal),
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iMaxTrackState(CFWL_PartState_Normal),
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fLastTrackPos(0),
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iMouseWheel(0),
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bMouseDown(false),
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_fButtonLen(0),
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_bMinSize(false),
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_Timer(this) {
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtClient.Reset();
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtThumb.Reset();
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMinBtn.Reset();
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMaxBtn.Reset();
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMinTrack.Reset();
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMaxTrack.Reset();
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFWL_ScrollBar::~CFWL_ScrollBar() {}
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannFWL_Type CFWL_ScrollBar::GetClassID() const {
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return FWL_Type::ScrollBar;
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::Update() {
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsLocked())
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pProperties->m_pThemeProvider)
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pProperties->m_pThemeProvider = GetAvailableTheme();
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  Layout();
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::DrawWidget(CXFA_Graphics* pGraphics,
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                const CFX_Matrix& matrix) {
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pGraphics)
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pProperties->m_pThemeProvider)
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (HasBorder())
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    DrawBorder(pGraphics, CFWL_Part::Border, pTheme, matrix);
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawTrack(pGraphics, pTheme, true, &matrix);
88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawTrack(pGraphics, pTheme, false, &matrix);
89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawArrowBtn(pGraphics, pTheme, true, &matrix);
90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawArrowBtn(pGraphics, pTheme, false, &matrix);
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawThumb(pGraphics, pTheme, &matrix);
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::SetTrackPos(float fTrackPos) {
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_fTrackPos = fTrackPos;
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtThumb = CalcThumbButtonRect(m_rtThumb);
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMinTrack = CalcMinTrackRect(m_rtMinTrack);
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMaxTrack = CalcMaxTrackRect(m_rtMaxTrack);
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFWL_ScrollBar::DoScroll(CFWL_EventScroll::Code dwCode, float fPos) {
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (dwCode == CFWL_EventScroll::Code::None)
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return OnScroll(dwCode, fPos);
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::DrawTrack(CXFA_Graphics* pGraphics,
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               IFWL_ThemeProvider* pTheme,
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               bool bLower,
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_Matrix* pMatrix) {
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemeBackground param;
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pWidget = this;
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_iPart = bLower ? CFWL_Part::LowerTrack : CFWL_Part::UpperTrack;
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? CFWL_PartState_Disabled
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : (bLower ? m_iMinTrackState : m_iMaxTrackState);
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pGraphics = pGraphics;
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_matrix.Concat(*pMatrix);
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_rtPart = bLower ? m_rtMinTrack : m_rtMaxTrack;
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTheme->DrawBackground(&param);
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::DrawArrowBtn(CXFA_Graphics* pGraphics,
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  IFWL_ThemeProvider* pTheme,
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  bool bMinBtn,
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  const CFX_Matrix* pMatrix) {
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemeBackground param;
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pWidget = this;
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_iPart = bMinBtn ? CFWL_Part::ForeArrow : CFWL_Part::BackArrow;
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? CFWL_PartState_Disabled
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : (bMinBtn ? m_iMinButtonState : m_iMaxButtonState);
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pGraphics = pGraphics;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_matrix.Concat(*pMatrix);
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_rtPart = bMinBtn ? m_rtMinBtn : m_rtMaxBtn;
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (param.m_rtPart.height > 0 && param.m_rtPart.width > 0)
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pTheme->DrawBackground(&param);
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::DrawThumb(CXFA_Graphics* pGraphics,
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               IFWL_ThemeProvider* pTheme,
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_Matrix* pMatrix) {
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_ThemeBackground param;
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pWidget = this;
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_iPart = CFWL_Part::Thumb;
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_dwStates = (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         ? CFWL_PartState_Disabled
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                         : m_iThumbButtonState;
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_pGraphics = pGraphics;
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_matrix.Concat(*pMatrix);
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  param.m_rtPart = m_rtThumb;
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pTheme->DrawBackground(&param);
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::Layout() {
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtClient = GetClientRect();
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CalcButtonLen();
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMinBtn = CalcMinButtonRect();
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMaxBtn = CalcMaxButtonRect();
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtThumb = CalcThumbButtonRect(m_rtThumb);
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMinTrack = CalcMinTrackRect(m_rtMinTrack);
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rtMaxTrack = CalcMaxTrackRect(m_rtMaxTrack);
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::CalcButtonLen() {
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_fButtonLen = IsVertical() ? m_rtClient.width : m_rtClient.height;
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLength = IsVertical() ? m_rtClient.height : m_rtClient.width;
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fLength < m_fButtonLen * 2) {
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_fButtonLen = fLength / 2;
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bMinSize = true;
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_bMinSize = false;
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ScrollBar::CalcMinButtonRect() {
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical())
17933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_RectF(m_rtClient.TopLeft(), m_rtClient.width, m_fButtonLen);
18033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  return CFX_RectF(m_rtClient.TopLeft(), m_fButtonLen, m_rtClient.height);
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ScrollBar::CalcMaxButtonRect() {
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical()) {
18533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_RectF(m_rtClient.left, m_rtClient.bottom() - m_fButtonLen,
18633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                     m_rtClient.width, m_fButtonLen);
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
18833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  return CFX_RectF(m_rtClient.right() - m_fButtonLen, m_rtClient.top,
18933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                   m_fButtonLen, m_rtClient.height);
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ScrollBar::CalcThumbButtonRect(const CFX_RectF& rtThumb) {
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rect;
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsEnabled())
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bMinSize) {
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.left = rtThumb.left;
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.top = rtThumb.top;
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fRange = m_fRangeMax - m_fRangeMin;
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fRange < 0) {
20533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    if (IsVertical()) {
20633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      return CFX_RectF(m_rtClient.left, m_rtMaxBtn.bottom(), m_rtClient.width,
20733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                       0);
20833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    }
20933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_RectF(m_rtMaxBtn.right(), m_rtClient.top, 0, m_rtClient.height);
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rtClient = m_rtClient;
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLength = IsVertical() ? rtClient.height : rtClient.width;
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fSize = m_fButtonLen;
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fLength -= fSize * 2.0f;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (fLength < fSize)
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    fLength = 0.0f;
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fThumbSize = fLength * fLength / (fRange + fLength);
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fThumbSize = std::max(fThumbSize, kMinThumbSize);
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fDiff = std::max(fLength - fThumbSize, 0.0f);
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fTrackPos = pdfium::clamp(m_fTrackPos, m_fRangeMin, m_fRangeMax);
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!fRange)
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float iPos = fSize + fDiff * (fTrackPos - m_fRangeMin) / fRange;
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.left = rtClient.left;
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.top = rtClient.top;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical()) {
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.top += iPos;
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.width = rtClient.width;
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.height = fThumbSize;
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.left += iPos;
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.width = fThumbSize;
2374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.height = rtClient.height;
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rect;
2404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ScrollBar::CalcMinTrackRect(const CFX_RectF& rtMinRect) {
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFX_RectF rect;
2444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_bMinSize) {
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.left = rtMinRect.left;
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.top = rtMinRect.top;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return rect;
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.left = m_rtClient.left;
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  rect.top = m_rtClient.top;
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical()) {
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.width = m_rtClient.width;
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.height = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.width = (m_rtThumb.left + m_rtThumb.right()) / 2;
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    rect.height = m_rtClient.height;
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return rect;
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFX_RectF CFWL_ScrollBar::CalcMaxTrackRect(const CFX_RectF& rtMaxRect) {
26333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (m_bMinSize)
26433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_RectF(rtMaxRect.TopLeft(), 0, 0);
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical()) {
267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2;
26833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return CFX_RectF(m_rtClient.left, iy, m_rtClient.width,
26933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                     m_rtClient.bottom() - iy);
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
27133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float ix = (m_rtThumb.left + m_rtThumb.right()) / 2;
27333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  return CFX_RectF(ix, m_rtClient.top, m_rtClient.height - ix,
27433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                   m_rtClient.height);
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CFWL_ScrollBar::GetTrackPointPos(const CFX_PointF& point) {
27833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  CFX_PointF diff = point - m_cpTrackPoint;
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fRange = m_fRangeMax - m_fRangeMin;
280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fPos;
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsVertical()) {
28333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    fPos = fRange * diff.y /
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           (m_rtMaxBtn.top - m_rtMinBtn.bottom() - m_rtThumb.height);
2854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
28633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    fPos = fRange * diff.x /
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann           (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width);
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fPos += m_fLastTrackPos;
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pdfium::clamp(fPos, m_fRangeMin, m_fRangeMax);
2924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CFWL_ScrollBar::SendEvent() {
2954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iMinButtonState == CFWL_PartState_Pressed) {
2964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoScroll(CFWL_EventScroll::Code::StepBackward, m_fTrackPos);
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iMaxButtonState == CFWL_PartState_Pressed) {
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoScroll(CFWL_EventScroll::Code::StepForward, m_fTrackPos);
3014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iMinTrackState == CFWL_PartState_Pressed) {
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoScroll(CFWL_EventScroll::Code::PageBackward, m_fTrackPos);
30533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return m_rtThumb.Contains(m_cpTrackPoint);
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iMaxTrackState == CFWL_PartState_Pressed) {
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoScroll(CFWL_EventScroll::Code::PageForward, m_fTrackPos);
30933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    return m_rtThumb.Contains(m_cpTrackPoint);
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iMouseWheel) {
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_EventScroll::Code dwCode = m_iMouseWheel < 0
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        ? CFWL_EventScroll::Code::StepForward
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                        : CFWL_EventScroll::Code::StepBackward;
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    DoScroll(dwCode, m_fTrackPos);
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CFWL_ScrollBar::OnScroll(CFWL_EventScroll::Code dwCode, float fPos) {
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_EventScroll ev(this);
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ev.m_iScrollCode = dwCode;
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ev.m_fPos = fPos;
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DispatchEvent(&ev);
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return true;
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::OnProcessMessage(CFWL_Message* pMessage) {
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pMessage)
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CFWL_Message::Type type = pMessage->GetType();
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (type == CFWL_Message::Type::Mouse) {
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage);
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    switch (pMsg->m_dwCmd) {
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FWL_MouseCommand::LeftButtonDown:
33733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        OnLButtonDown(pMsg->m_pos);
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FWL_MouseCommand::LeftButtonUp:
34033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        OnLButtonUp(pMsg->m_pos);
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FWL_MouseCommand::Move:
34333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        OnMouseMove(pMsg->m_pos);
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      case FWL_MouseCommand::Leave:
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        OnMouseLeave();
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      default:
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        break;
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (type == CFWL_Message::Type::MouseWheel) {
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CFWL_MessageMouseWheel* pMsg =
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        static_cast<CFWL_MessageMouseWheel*>(pMessage);
35433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    OnMouseWheel(pMsg->m_delta);
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CFWL_ScrollBar::OnDrawWidget(CXFA_Graphics* pGraphics,
359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  const CFX_Matrix& matrix) {
360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  DrawWidget(pGraphics, matrix);
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
36333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CFWL_ScrollBar::OnLButtonDown(const CFX_PointF& point) {
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!IsEnabled())
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = true;
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetGrab(true);
36933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann
37033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_cpTrackPoint = point;
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_fLastTrackPos = m_fTrackPos;
37233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (m_rtMinBtn.Contains(point))
37333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    DoMouseDown(0, m_rtMinBtn, m_iMinButtonState, point);
37433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  else if (m_rtThumb.Contains(point))
37533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    DoMouseDown(1, m_rtThumb, m_iThumbButtonState, point);
37633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  else if (m_rtMaxBtn.Contains(point))
37733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    DoMouseDown(2, m_rtMaxBtn, m_iMaxButtonState, point);
37833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  else if (m_rtMinTrack.Contains(point))
37933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    DoMouseDown(3, m_rtMinTrack, m_iMinTrackState, point);
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  else
38133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    DoMouseDown(4, m_rtMaxTrack, m_iMaxTrackState, point);
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!SendEvent())
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pTimerInfo = m_Timer.StartTimer(FWL_SCROLLBAR_Elapse, true);
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
38733357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CFWL_ScrollBar::OnLButtonUp(const CFX_PointF& point) {
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pTimerInfo->StopTimer();
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_bMouseDown = false;
39033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseUp(0, m_rtMinBtn, m_iMinButtonState, point);
39133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseUp(1, m_rtThumb, m_iThumbButtonState, point);
39233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseUp(2, m_rtMaxBtn, m_iMaxButtonState, point);
39333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseUp(3, m_rtMinTrack, m_iMinTrackState, point);
39433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseUp(4, m_rtMaxTrack, m_iMaxTrackState, point);
3954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SetGrab(false);
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
39833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CFWL_ScrollBar::OnMouseMove(const CFX_PointF& point) {
39933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseMove(0, m_rtMinBtn, m_iMinButtonState, point);
40033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseMove(1, m_rtThumb, m_iThumbButtonState, point);
40133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseMove(2, m_rtMaxBtn, m_iMaxButtonState, point);
40233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseMove(3, m_rtMinTrack, m_iMinTrackState, point);
40333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  DoMouseMove(4, m_rtMaxTrack, m_iMaxTrackState, point);
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::OnMouseLeave() {
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DoMouseLeave(0, m_rtMinBtn, m_iMinButtonState);
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DoMouseLeave(1, m_rtThumb, m_iThumbButtonState);
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DoMouseLeave(2, m_rtMaxBtn, m_iMaxButtonState);
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DoMouseLeave(3, m_rtMinTrack, m_iMinTrackState);
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  DoMouseLeave(4, m_rtMaxTrack, m_iMaxTrackState);
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
41433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmannvoid CFWL_ScrollBar::OnMouseWheel(const CFX_PointF& delta) {
41533357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  m_iMouseWheel = static_cast<int32_t>(delta.x);
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SendEvent();
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_iMouseWheel = 0;
4184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::DoMouseDown(int32_t iItem,
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 const CFX_RectF& rtItem,
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 int32_t& iState,
42333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                 const CFX_PointF& point) {
42433357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann  if (!rtItem.Contains(point))
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iState == CFWL_PartState_Pressed)
4274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  iState = CFWL_PartState_Pressed;
4304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(rtItem);
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::DoMouseUp(int32_t iItem,
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               const CFX_RectF& rtItem,
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                               int32_t& iState,
43633357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                               const CFX_PointF& point) {
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iNewState =
43833357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann      rtItem.Contains(point) ? CFWL_PartState_Hovered : CFWL_PartState_Normal;
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iState == iNewState)
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  iState = iNewState;
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(rtItem);
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OnScroll(CFWL_EventScroll::Code::EndScroll, m_fTrackPos);
4454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::DoMouseMove(int32_t iItem,
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 const CFX_RectF& rtItem,
4494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                 int32_t& iState,
45033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann                                 const CFX_PointF& point) {
4514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_bMouseDown) {
45233357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    int32_t iNewState =
45333357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann        rtItem.Contains(point) ? CFWL_PartState_Hovered : CFWL_PartState_Normal;
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (iState == iNewState)
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return;
4564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    iState = iNewState;
4584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    RepaintRect(rtItem);
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if ((2 == iItem) && (m_iThumbButtonState == CFWL_PartState_Pressed)) {
46033357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    m_fTrackPos = GetTrackPointPos(point);
46133357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    OnScroll(CFWL_EventScroll::Code::TrackPos, m_fTrackPos);
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::DoMouseLeave(int32_t iItem,
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  const CFX_RectF& rtItem,
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  int32_t& iState) {
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iState == CFWL_PartState_Normal)
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  iState = CFWL_PartState_Normal;
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(rtItem);
4734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::DoMouseHover(int32_t iItem,
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  const CFX_RectF& rtItem,
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  int32_t& iState) {
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iState == CFWL_PartState_Hovered)
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  iState = CFWL_PartState_Hovered;
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  RepaintRect(rtItem);
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCFWL_ScrollBar::Timer::Timer(CFWL_ScrollBar* pToolTip) : CFWL_Timer(pToolTip) {}
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CFWL_ScrollBar::Timer::Run(CFWL_TimerInfo* pTimerInfo) {
488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFWL_ScrollBar* pButton = static_cast<CFWL_ScrollBar*>(m_pWidget.Get());
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pButton->m_pTimerInfo)
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pButton->m_pTimerInfo->StopTimer();
4914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pButton->SendEvent())
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pButton->m_pTimerInfo = StartTimer(0, true);
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
495