OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fwl/core/cfwl_scrollbar.h" | 7 #include "xfa/fwl/cfwl_scrollbar.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "third_party/base/ptr_util.h" | 13 #include "third_party/base/ptr_util.h" |
14 #include "xfa/fwl/core/cfwl_msgmouse.h" | 14 #include "xfa/fwl/cfwl_messagemouse.h" |
15 #include "xfa/fwl/core/cfwl_msgmousewheel.h" | 15 #include "xfa/fwl/cfwl_messagemousewheel.h" |
16 #include "xfa/fwl/core/cfwl_notedriver.h" | 16 #include "xfa/fwl/cfwl_notedriver.h" |
17 #include "xfa/fwl/core/cfwl_themebackground.h" | 17 #include "xfa/fwl/cfwl_themebackground.h" |
18 #include "xfa/fwl/core/cfwl_themepart.h" | 18 #include "xfa/fwl/cfwl_themepart.h" |
19 #include "xfa/fwl/core/cfwl_timerinfo.h" | 19 #include "xfa/fwl/cfwl_timerinfo.h" |
20 #include "xfa/fwl/core/ifwl_themeprovider.h" | 20 #include "xfa/fwl/ifwl_themeprovider.h" |
21 | 21 |
22 #define FWL_SCROLLBAR_Elapse 500 | 22 #define FWL_SCROLLBAR_Elapse 500 |
23 #define FWL_SCROLLBAR_MinThumb 5 | 23 #define FWL_SCROLLBAR_MinThumb 5 |
24 | 24 |
25 CFWL_ScrollBar::CFWL_ScrollBar( | 25 CFWL_ScrollBar::CFWL_ScrollBar( |
26 const CFWL_App* app, | 26 const CFWL_App* app, |
27 std::unique_ptr<CFWL_WidgetProperties> properties, | 27 std::unique_ptr<CFWL_WidgetProperties> properties, |
28 CFWL_Widget* pOuter) | 28 CFWL_Widget* pOuter) |
29 : CFWL_Widget(app, std::move(properties), pOuter), | 29 : CFWL_Widget(app, std::move(properties), pOuter), |
30 m_pTimerInfo(nullptr), | 30 m_pTimerInfo(nullptr), |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 DrawThumb(pGraphics, pTheme, pMatrix); | 90 DrawThumb(pGraphics, pTheme, pMatrix); |
91 } | 91 } |
92 | 92 |
93 void CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) { | 93 void CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) { |
94 m_fTrackPos = fTrackPos; | 94 m_fTrackPos = fTrackPos; |
95 CalcThumbButtonRect(m_rtThumb); | 95 CalcThumbButtonRect(m_rtThumb); |
96 CalcMinTrackRect(m_rtMinTrack); | 96 CalcMinTrackRect(m_rtMinTrack); |
97 CalcMaxTrackRect(m_rtMaxTrack); | 97 CalcMaxTrackRect(m_rtMaxTrack); |
98 } | 98 } |
99 | 99 |
100 bool CFWL_ScrollBar::DoScroll(CFWL_EvtScroll::Code dwCode, FX_FLOAT fPos) { | 100 bool CFWL_ScrollBar::DoScroll(CFWL_EventScroll::Code dwCode, FX_FLOAT fPos) { |
101 if (dwCode == CFWL_EvtScroll::Code::None) | 101 if (dwCode == CFWL_EventScroll::Code::None) |
102 return false; | 102 return false; |
103 return OnScroll(dwCode, fPos); | 103 return OnScroll(dwCode, fPos); |
104 } | 104 } |
105 | 105 |
106 void CFWL_ScrollBar::DrawTrack(CFX_Graphics* pGraphics, | 106 void CFWL_ScrollBar::DrawTrack(CFX_Graphics* pGraphics, |
107 IFWL_ThemeProvider* pTheme, | 107 IFWL_ThemeProvider* pTheme, |
108 bool bLower, | 108 bool bLower, |
109 const CFX_Matrix* pMatrix) { | 109 const CFX_Matrix* pMatrix) { |
110 CFWL_ThemeBackground param; | 110 CFWL_ThemeBackground param; |
111 param.m_pWidget = this; | 111 param.m_pWidget = this; |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 fPos = fRange * fDiffX / | 286 fPos = fRange * fDiffX / |
287 (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width); | 287 (m_rtMaxBtn.left - m_rtMinBtn.right() - m_rtThumb.width); |
288 } | 288 } |
289 | 289 |
290 fPos += m_fLastTrackPos; | 290 fPos += m_fLastTrackPos; |
291 return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax); | 291 return std::min(std::max(fPos, m_fRangeMin), m_fRangeMax); |
292 } | 292 } |
293 | 293 |
294 bool CFWL_ScrollBar::SendEvent() { | 294 bool CFWL_ScrollBar::SendEvent() { |
295 if (m_iMinButtonState == CFWL_PartState_Pressed) { | 295 if (m_iMinButtonState == CFWL_PartState_Pressed) { |
296 DoScroll(CFWL_EvtScroll::Code::StepBackward, m_fTrackPos); | 296 DoScroll(CFWL_EventScroll::Code::StepBackward, m_fTrackPos); |
297 return false; | 297 return false; |
298 } | 298 } |
299 if (m_iMaxButtonState == CFWL_PartState_Pressed) { | 299 if (m_iMaxButtonState == CFWL_PartState_Pressed) { |
300 DoScroll(CFWL_EvtScroll::Code::StepForward, m_fTrackPos); | 300 DoScroll(CFWL_EventScroll::Code::StepForward, m_fTrackPos); |
301 return false; | 301 return false; |
302 } | 302 } |
303 if (m_iMinTrackState == CFWL_PartState_Pressed) { | 303 if (m_iMinTrackState == CFWL_PartState_Pressed) { |
304 DoScroll(CFWL_EvtScroll::Code::PageBackward, m_fTrackPos); | 304 DoScroll(CFWL_EventScroll::Code::PageBackward, m_fTrackPos); |
305 return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); | 305 return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); |
306 } | 306 } |
307 if (m_iMaxTrackState == CFWL_PartState_Pressed) { | 307 if (m_iMaxTrackState == CFWL_PartState_Pressed) { |
308 DoScroll(CFWL_EvtScroll::Code::PageForward, m_fTrackPos); | 308 DoScroll(CFWL_EventScroll::Code::PageForward, m_fTrackPos); |
309 return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); | 309 return m_rtThumb.Contains(m_cpTrackPointX, m_cpTrackPointY); |
310 } | 310 } |
311 if (m_iMouseWheel) { | 311 if (m_iMouseWheel) { |
312 CFWL_EvtScroll::Code dwCode = m_iMouseWheel < 0 | 312 CFWL_EventScroll::Code dwCode = m_iMouseWheel < 0 |
313 ? CFWL_EvtScroll::Code::StepForward | 313 ? CFWL_EventScroll::Code::StepForward |
314 : CFWL_EvtScroll::Code::StepBackward; | 314 : CFWL_EventScroll::Code::StepBackward; |
315 DoScroll(dwCode, m_fTrackPos); | 315 DoScroll(dwCode, m_fTrackPos); |
316 } | 316 } |
317 return true; | 317 return true; |
318 } | 318 } |
319 | 319 |
320 bool CFWL_ScrollBar::OnScroll(CFWL_EvtScroll::Code dwCode, FX_FLOAT fPos) { | 320 bool CFWL_ScrollBar::OnScroll(CFWL_EventScroll::Code dwCode, FX_FLOAT fPos) { |
321 CFWL_EvtScroll ev(this); | 321 CFWL_EventScroll ev(this); |
322 ev.m_iScrollCode = dwCode; | 322 ev.m_iScrollCode = dwCode; |
323 ev.m_fPos = fPos; | 323 ev.m_fPos = fPos; |
324 DispatchEvent(&ev); | 324 DispatchEvent(&ev); |
325 return true; | 325 return true; |
326 } | 326 } |
327 | 327 |
328 void CFWL_ScrollBar::OnProcessMessage(CFWL_Message* pMessage) { | 328 void CFWL_ScrollBar::OnProcessMessage(CFWL_Message* pMessage) { |
329 if (!pMessage) | 329 if (!pMessage) |
330 return; | 330 return; |
331 | 331 |
332 CFWL_Message::Type type = pMessage->GetType(); | 332 CFWL_Message::Type type = pMessage->GetType(); |
333 if (type == CFWL_Message::Type::Mouse) { | 333 if (type == CFWL_Message::Type::Mouse) { |
334 CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage); | 334 CFWL_MessageMouse* pMsg = static_cast<CFWL_MessageMouse*>(pMessage); |
335 switch (pMsg->m_dwCmd) { | 335 switch (pMsg->m_dwCmd) { |
336 case FWL_MouseCommand::LeftButtonDown: | 336 case FWL_MouseCommand::LeftButtonDown: |
337 OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); | 337 OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); |
338 break; | 338 break; |
339 case FWL_MouseCommand::LeftButtonUp: | 339 case FWL_MouseCommand::LeftButtonUp: |
340 OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); | 340 OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); |
341 break; | 341 break; |
342 case FWL_MouseCommand::Move: | 342 case FWL_MouseCommand::Move: |
343 OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); | 343 OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy); |
344 break; | 344 break; |
345 case FWL_MouseCommand::Leave: | 345 case FWL_MouseCommand::Leave: |
346 OnMouseLeave(); | 346 OnMouseLeave(); |
347 break; | 347 break; |
348 default: | 348 default: |
349 break; | 349 break; |
350 } | 350 } |
351 } else if (type == CFWL_Message::Type::MouseWheel) { | 351 } else if (type == CFWL_Message::Type::MouseWheel) { |
352 CFWL_MsgMouseWheel* pMsg = static_cast<CFWL_MsgMouseWheel*>(pMessage); | 352 CFWL_MessageMouseWheel* pMsg = |
| 353 static_cast<CFWL_MessageMouseWheel*>(pMessage); |
353 OnMouseWheel(pMsg->m_fx, pMsg->m_fy, pMsg->m_dwFlags, pMsg->m_fDeltaX, | 354 OnMouseWheel(pMsg->m_fx, pMsg->m_fy, pMsg->m_dwFlags, pMsg->m_fDeltaX, |
354 pMsg->m_fDeltaY); | 355 pMsg->m_fDeltaY); |
355 } | 356 } |
356 } | 357 } |
357 | 358 |
358 void CFWL_ScrollBar::OnDrawWidget(CFX_Graphics* pGraphics, | 359 void CFWL_ScrollBar::OnDrawWidget(CFX_Graphics* pGraphics, |
359 const CFX_Matrix* pMatrix) { | 360 const CFX_Matrix* pMatrix) { |
360 DrawWidget(pGraphics, pMatrix); | 361 DrawWidget(pGraphics, pMatrix); |
361 } | 362 } |
362 | 363 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 int32_t& iState, | 441 int32_t& iState, |
441 FX_FLOAT fx, | 442 FX_FLOAT fx, |
442 FX_FLOAT fy) { | 443 FX_FLOAT fy) { |
443 int32_t iNewState = | 444 int32_t iNewState = |
444 rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered : CFWL_PartState_Normal; | 445 rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered : CFWL_PartState_Normal; |
445 if (iState == iNewState) | 446 if (iState == iNewState) |
446 return; | 447 return; |
447 | 448 |
448 iState = iNewState; | 449 iState = iNewState; |
449 Repaint(&rtItem); | 450 Repaint(&rtItem); |
450 OnScroll(CFWL_EvtScroll::Code::EndScroll, m_fTrackPos); | 451 OnScroll(CFWL_EventScroll::Code::EndScroll, m_fTrackPos); |
451 } | 452 } |
452 | 453 |
453 void CFWL_ScrollBar::DoMouseMove(int32_t iItem, | 454 void CFWL_ScrollBar::DoMouseMove(int32_t iItem, |
454 const CFX_RectF& rtItem, | 455 const CFX_RectF& rtItem, |
455 int32_t& iState, | 456 int32_t& iState, |
456 FX_FLOAT fx, | 457 FX_FLOAT fx, |
457 FX_FLOAT fy) { | 458 FX_FLOAT fy) { |
458 if (!m_bMouseDown) { | 459 if (!m_bMouseDown) { |
459 int32_t iNewState = rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered | 460 int32_t iNewState = rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered |
460 : CFWL_PartState_Normal; | 461 : CFWL_PartState_Normal; |
461 if (iState == iNewState) | 462 if (iState == iNewState) |
462 return; | 463 return; |
463 | 464 |
464 iState = iNewState; | 465 iState = iNewState; |
465 Repaint(&rtItem); | 466 Repaint(&rtItem); |
466 } else if ((2 == iItem) && (m_iThumbButtonState == CFWL_PartState_Pressed)) { | 467 } else if ((2 == iItem) && (m_iThumbButtonState == CFWL_PartState_Pressed)) { |
467 FX_FLOAT fPos = GetTrackPointPos(fx, fy); | 468 FX_FLOAT fPos = GetTrackPointPos(fx, fy); |
468 m_fTrackPos = fPos; | 469 m_fTrackPos = fPos; |
469 OnScroll(CFWL_EvtScroll::Code::TrackPos, fPos); | 470 OnScroll(CFWL_EventScroll::Code::TrackPos, fPos); |
470 } | 471 } |
471 } | 472 } |
472 | 473 |
473 void CFWL_ScrollBar::DoMouseLeave(int32_t iItem, | 474 void CFWL_ScrollBar::DoMouseLeave(int32_t iItem, |
474 const CFX_RectF& rtItem, | 475 const CFX_RectF& rtItem, |
475 int32_t& iState) { | 476 int32_t& iState) { |
476 if (iState == CFWL_PartState_Normal) | 477 if (iState == CFWL_PartState_Normal) |
477 return; | 478 return; |
478 | 479 |
479 iState = CFWL_PartState_Normal; | 480 iState = CFWL_PartState_Normal; |
(...skipping 14 matching lines...) Expand all Loading... |
494 | 495 |
495 void CFWL_ScrollBar::Timer::Run(CFWL_TimerInfo* pTimerInfo) { | 496 void CFWL_ScrollBar::Timer::Run(CFWL_TimerInfo* pTimerInfo) { |
496 CFWL_ScrollBar* pButton = static_cast<CFWL_ScrollBar*>(m_pWidget); | 497 CFWL_ScrollBar* pButton = static_cast<CFWL_ScrollBar*>(m_pWidget); |
497 | 498 |
498 if (pButton->m_pTimerInfo) | 499 if (pButton->m_pTimerInfo) |
499 pButton->m_pTimerInfo->StopTimer(); | 500 pButton->m_pTimerInfo->StopTimer(); |
500 | 501 |
501 if (!pButton->SendEvent()) | 502 if (!pButton->SendEvent()) |
502 pButton->m_pTimerInfo = StartTimer(0, true); | 503 pButton->m_pTimerInfo = StartTimer(0, true); |
503 } | 504 } |
OLD | NEW |