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(¶m); 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(¶m); 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(¶m); 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