summaryrefslogtreecommitdiff
path: root/xfa/fwl/basewidget/fwl_scrollbarimp.h
blob: 2e378a677ccc6dc83c7301287f0fe90008286e56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_
#define XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_

#include "xfa/fwl/core/fwl_widgetimp.h"
#include "xfa/include/fwl/core/fwl_timer.h"

class CFWL_WidgetImpProperties;
class IFWL_Widget;
class CFWL_ScrollBarImpDelegate;

class CFWL_ScrollBarImp : public CFWL_WidgetImp, public IFWL_Timer {
 public:
  CFWL_ScrollBarImp(const CFWL_WidgetImpProperties& properties,
                    IFWL_Widget* pOuter);
  ~CFWL_ScrollBarImp();
  virtual FWL_ERR GetClassName(CFX_WideString& wsClass) const;
  virtual FX_DWORD GetClassID() const;
  virtual FWL_ERR Initialize();
  virtual FWL_ERR Finalize();
  virtual FWL_ERR GetWidgetRect(CFX_RectF& rect, FX_BOOL bAutoSize = FALSE);
  virtual FWL_ERR Update();
  virtual FWL_ERR DrawWidget(CFX_Graphics* pGraphics,
                             const CFX_Matrix* pMatrix = NULL);
  virtual FX_BOOL IsVertical();
  virtual FWL_ERR GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
  virtual FWL_ERR SetRange(FX_FLOAT fMin, FX_FLOAT fMax);
  virtual FX_FLOAT GetPageSize();
  virtual FWL_ERR SetPageSize(FX_FLOAT fPageSize);
  virtual FX_FLOAT GetStepSize();
  virtual FWL_ERR SetStepSize(FX_FLOAT fStepSize);
  virtual FX_FLOAT GetPos();
  virtual FWL_ERR SetPos(FX_FLOAT fPos);
  virtual FX_FLOAT GetTrackPos();
  virtual FWL_ERR SetTrackPos(FX_FLOAT fTrackPos);
  virtual FX_BOOL DoScroll(FX_DWORD dwCode, FX_FLOAT fPos = 0.0f);
  virtual FWL_ERR SetOuter(IFWL_Widget* pOuter);
  virtual int32_t Run(FWL_HTIMER hTimer);

 protected:
  void DrawTrack(CFX_Graphics* pGraphics,
                 IFWL_ThemeProvider* pTheme,
                 FX_BOOL bLower = TRUE,
                 const CFX_Matrix* pMatrix = NULL);
  void DrawArrowBtn(CFX_Graphics* pGraphics,
                    IFWL_ThemeProvider* pTheme,
                    FX_BOOL bMinBtn = TRUE,
                    const CFX_Matrix* pMatrix = NULL);
  void DrawThumb(CFX_Graphics* pGraphics,
                 IFWL_ThemeProvider* pTheme,
                 const CFX_Matrix* pMatrix = NULL);
  void Layout();
  void CalcButtonLen();
  void CalcMinButtonRect(CFX_RectF& rect);
  void CalcMaxButtonRect(CFX_RectF& rect);
  void CalcThumbButtonRect(CFX_RectF& rect);
  void CalcMinTrackRect(CFX_RectF& rect);
  void CalcMaxTrackRect(CFX_RectF& rect);
  FX_FLOAT GetTrackPointPos(FX_FLOAT fx, FX_FLOAT fy);
  void GetTrackRect(CFX_RectF& rect, FX_BOOL bLower = TRUE);
  FX_BOOL SendEvent();
  FX_BOOL OnScroll(FX_DWORD dwCode, FX_FLOAT fPos);

  FWL_HTIMER m_hTimer;
  FX_FLOAT m_fRangeMin;
  FX_FLOAT m_fRangeMax;
  FX_FLOAT m_fPageSize;
  FX_FLOAT m_fStepSize;
  FX_FLOAT m_fPos;
  FX_FLOAT m_fTrackPos;
  int32_t m_iMinButtonState;
  int32_t m_iMaxButtonState;
  int32_t m_iThumbButtonState;
  int32_t m_iMinTrackState;
  int32_t m_iMaxTrackState;
  FX_FLOAT m_fLastTrackPos;
  FX_FLOAT m_cpTrackPointX;
  FX_FLOAT m_cpTrackPointY;
  int32_t m_iMouseWheel;
  FX_BOOL m_bTrackMouseLeave;
  FX_BOOL m_bMouseHover;
  FX_BOOL m_bMouseDown;
  FX_BOOL m_bRepaintThumb;
  FX_FLOAT m_fButtonLen;
  FX_BOOL m_bMinSize;
  CFX_RectF m_rtClient;
  CFX_RectF m_rtThumb;
  CFX_RectF m_rtMinBtn;
  CFX_RectF m_rtMaxBtn;
  CFX_RectF m_rtMinTrack;
  CFX_RectF m_rtMaxTrack;
  FX_BOOL m_bCustomLayout;
  FX_FLOAT m_fMinThumb;
  friend class CFWL_ScrollBarImpDelegate;
};
class CFWL_ScrollBarImpDelegate : public CFWL_WidgetImpDelegate {
 public:
  CFWL_ScrollBarImpDelegate(CFWL_ScrollBarImp* pOwner);
  int32_t OnProcessMessage(CFWL_Message* pMessage) override;
  FWL_ERR OnDrawWidget(CFX_Graphics* pGraphics,
                       const CFX_Matrix* pMatrix = NULL) override;

 protected:
  void OnLButtonDown(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
  void OnLButtonUp(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
  void OnMouseMove(FX_DWORD dwFlags, FX_FLOAT fx, FX_FLOAT fy);
  void OnMouseLeave();
  void OnMouseWheel(FX_FLOAT fx,
                    FX_FLOAT fy,
                    FX_DWORD dwFlags,
                    FX_FLOAT fDeltaX,
                    FX_FLOAT fDeltaY);
  void DoMouseDown(int32_t iItem,
                   const CFX_RectF& rtItem,
                   int32_t& iState,
                   FX_FLOAT fx,
                   FX_FLOAT fy);
  void DoMouseUp(int32_t iItem,
                 const CFX_RectF& rtItem,
                 int32_t& iState,
                 FX_FLOAT fx,
                 FX_FLOAT fy);
  void DoMouseMove(int32_t iItem,
                   const CFX_RectF& rtItem,
                   int32_t& iState,
                   FX_FLOAT fx,
                   FX_FLOAT fy);
  void DoMouseLeave(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
  void DoMouseHover(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);

  CFWL_ScrollBarImp* m_pOwner;
};

#endif  // XFA_FWL_BASEWIDGET_FWL_SCROLLBARIMP_H_