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 "../../include/pdfwindow/PDFWindow.h" | 7 #include "../../include/pdfwindow/PDFWindow.h" |
8 #include "../../include/pdfwindow/PWL_Wnd.h" | 8 #include "../../include/pdfwindow/PWL_Wnd.h" |
9 #include "../../include/pdfwindow/PWL_ScrollBar.h" | 9 #include "../../include/pdfwindow/PWL_ScrollBar.h" |
10 #include "../../include/pdfwindow/PWL_Utils.h" | 10 #include "../../include/pdfwindow/PWL_Utils.h" |
11 | 11 |
12 #define IsFloatZero(f) ((f) < 0.0001 &&
(f) > -0.0001) | 12 #define IsFloatZero(f) ((f) < 0.0001 && (f) > -0.0001) |
13 #define IsFloatBigger(fa,fb) ((fa) > (fb) && !IsFloat
Zero((fa) - (fb))) | 13 #define IsFloatBigger(fa, fb) ((fa) > (fb) && !IsFloatZero((fa) - (fb))) |
14 #define IsFloatSmaller(fa,fb) ((fa) < (fb) && !IsFloat
Zero((fa) - (fb))) | 14 #define IsFloatSmaller(fa, fb) ((fa) < (fb) && !IsFloatZero((fa) - (fb))) |
15 #define IsFloatEqual(fa,fb) IsFloatZero((fa)
-(fb)) | 15 #define IsFloatEqual(fa, fb) IsFloatZero((fa) - (fb)) |
16 | 16 |
17 | 17 /* ------------------------------- PWL_FLOATRANGE |
18 /* ------------------------------- PWL_FLOATRANGE ------------------------------
- */ | 18 * ------------------------------- */ |
19 | 19 |
20 PWL_FLOATRANGE::PWL_FLOATRANGE() | 20 PWL_FLOATRANGE::PWL_FLOATRANGE() { |
21 { | 21 Default(); |
22 Default(); | 22 } |
23 } | 23 |
24 | 24 PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max) { |
25 PWL_FLOATRANGE::PWL_FLOATRANGE(FX_FLOAT min,FX_FLOAT max) | 25 Set(min, max); |
26 { | 26 } |
27 Set(min,max); | 27 |
28 } | 28 void PWL_FLOATRANGE::Default() { |
29 | 29 fMin = 0; |
30 void PWL_FLOATRANGE::Default() | 30 fMax = 0; |
31 { | 31 } |
32 fMin = 0; | 32 |
33 fMax = 0; | 33 void PWL_FLOATRANGE::Set(FX_FLOAT min, FX_FLOAT max) { |
34 } | 34 if (min > max) { |
35 | 35 fMin = max; |
36 void PWL_FLOATRANGE::Set(FX_FLOAT min,FX_FLOAT max) | 36 fMax = min; |
37 { | 37 } else { |
38 if (min > max) | 38 fMin = min; |
39 { | 39 fMax = max; |
40 fMin = max; | 40 } |
41 fMax = min; | 41 } |
42 } | 42 |
43 else | 43 FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const { |
44 { | 44 return (IsFloatBigger(x, fMin) || IsFloatEqual(x, fMin)) && |
45 fMin = min; | 45 (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax)); |
46 fMax = max; | 46 } |
47 } | 47 |
48 } | 48 FX_FLOAT PWL_FLOATRANGE::GetWidth() const { |
49 | 49 return fMax - fMin; |
50 FX_BOOL PWL_FLOATRANGE::In(FX_FLOAT x) const | 50 } |
51 { | 51 |
52 return (IsFloatBigger(x,fMin) || IsFloatEqual(x, fMin)) && | 52 /* ------------------------------- PWL_SCROLL_PRIVATEDATA |
53 (IsFloatSmaller(x, fMax) || IsFloatEqual(x, fMax)); | 53 * ------------------------------- */ |
54 } | 54 |
55 | 55 PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() { |
56 FX_FLOAT PWL_FLOATRANGE::GetWidth() const | 56 Default(); |
57 { | 57 } |
58 return fMax - fMin; | 58 |
59 } | 59 void PWL_SCROLL_PRIVATEDATA::Default() { |
60 | 60 ScrollRange.Default(); |
61 /* ------------------------------- PWL_SCROLL_PRIVATEDATA ----------------------
--------- */ | 61 fScrollPos = ScrollRange.fMin; |
62 | 62 fClientWidth = 0; |
63 PWL_SCROLL_PRIVATEDATA::PWL_SCROLL_PRIVATEDATA() | 63 fBigStep = 10; |
64 { | 64 fSmallStep = 1; |
65 Default(); | 65 } |
66 } | 66 |
67 | 67 void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min, FX_FLOAT max) { |
68 void PWL_SCROLL_PRIVATEDATA::Default() | 68 ScrollRange.Set(min, max); |
69 { | 69 |
70 ScrollRange.Default(); | 70 if (IsFloatSmaller(fScrollPos, ScrollRange.fMin)) |
71 fScrollPos = ScrollRange.fMin; | 71 fScrollPos = ScrollRange.fMin; |
72 fClientWidth = 0; | 72 if (IsFloatBigger(fScrollPos, ScrollRange.fMax)) |
73 fBigStep = 10; | 73 fScrollPos = ScrollRange.fMax; |
74 fSmallStep = 1; | 74 } |
75 } | 75 |
76 | 76 void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) { |
77 void PWL_SCROLL_PRIVATEDATA::SetScrollRange(FX_FLOAT min,FX_FLOAT max) | 77 fClientWidth = width; |
78 { | 78 } |
79 ScrollRange.Set(min,max); | 79 |
80 | 80 void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) { |
81 if (IsFloatSmaller(fScrollPos, ScrollRange.fMin)) | 81 fSmallStep = step; |
82 fScrollPos = ScrollRange.fMin; | 82 } |
83 if (IsFloatBigger(fScrollPos, ScrollRange.fMax)) | 83 |
84 fScrollPos = ScrollRange.fMax; | 84 void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) { |
85 } | 85 fBigStep = step; |
86 | 86 } |
87 void PWL_SCROLL_PRIVATEDATA::SetClientWidth(FX_FLOAT width) | 87 |
88 { | 88 FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) { |
89 fClientWidth = width; | 89 if (ScrollRange.In(pos)) { |
90 } | 90 fScrollPos = pos; |
91 | 91 return TRUE; |
92 void PWL_SCROLL_PRIVATEDATA::SetSmallStep(FX_FLOAT step) | 92 } |
93 { | 93 return FALSE; |
94 fSmallStep = step; | 94 } |
95 } | 95 |
96 | 96 void PWL_SCROLL_PRIVATEDATA::AddSmall() { |
97 void PWL_SCROLL_PRIVATEDATA::SetBigStep(FX_FLOAT step) | 97 if (!SetPos(fScrollPos + fSmallStep)) |
98 { | 98 SetPos(ScrollRange.fMax); |
99 fBigStep = step; | 99 } |
100 } | 100 |
101 | 101 void PWL_SCROLL_PRIVATEDATA::SubSmall() { |
102 FX_BOOL PWL_SCROLL_PRIVATEDATA::SetPos(FX_FLOAT pos) | 102 if (!SetPos(fScrollPos - fSmallStep)) |
103 { | 103 SetPos(ScrollRange.fMin); |
104 if (ScrollRange.In(pos)) | 104 } |
105 { | 105 |
106 fScrollPos = pos; | 106 void PWL_SCROLL_PRIVATEDATA::AddBig() { |
107 return TRUE; | 107 if (!SetPos(fScrollPos + fBigStep)) |
108 } | 108 SetPos(ScrollRange.fMax); |
109 return FALSE; | 109 } |
110 } | 110 |
111 | 111 void PWL_SCROLL_PRIVATEDATA::SubBig() { |
112 void PWL_SCROLL_PRIVATEDATA::AddSmall() | 112 if (!SetPos(fScrollPos - fBigStep)) |
113 { | 113 SetPos(ScrollRange.fMin); |
114 if (!SetPos(fScrollPos + fSmallStep)) | 114 } |
115 SetPos(ScrollRange.fMax); | 115 |
116 } | 116 /* ------------------------------- CPWL_SBButton ------------------------------- |
117 | 117 */ |
118 void PWL_SCROLL_PRIVATEDATA::SubSmall() | 118 |
119 { | 119 CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType, |
120 if (!SetPos(fScrollPos - fSmallStep)) | 120 PWL_SBBUTTON_TYPE eButtonType) { |
121 SetPos(ScrollRange.fMin); | 121 m_eScrollBarType = eScrollBarType; |
122 } | 122 m_eSBButtonType = eButtonType; |
123 | 123 |
124 void PWL_SCROLL_PRIVATEDATA::AddBig() | 124 m_bMouseDown = FALSE; |
125 { | 125 } |
126 if (!SetPos(fScrollPos + fBigStep)) | 126 |
127 SetPos(ScrollRange.fMax); | 127 CPWL_SBButton::~CPWL_SBButton() { |
128 } | 128 } |
129 | 129 |
130 void PWL_SCROLL_PRIVATEDATA::SubBig() | 130 CFX_ByteString CPWL_SBButton::GetClassName() const { |
131 { | 131 return "CPWL_SBButton"; |
132 if (!SetPos(fScrollPos - fBigStep)) | 132 } |
133 SetPos(ScrollRange.fMin); | 133 |
134 } | 134 void CPWL_SBButton::OnCreate(PWL_CREATEPARAM& cp) { |
135 | 135 cp.eCursorType = FXCT_ARROW; |
136 /* ------------------------------- CPWL_SBButton -------------------------------
*/ | 136 } |
137 | 137 |
138 CPWL_SBButton::CPWL_SBButton(PWL_SCROLLBAR_TYPE eScrollBarType,PWL_SBBUTTON_TYPE
eButtonType) | 138 void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { |
139 { | 139 CPWL_Wnd::GetThisAppearanceStream(sAppStream); |
140 m_eScrollBarType = eScrollBarType; | 140 |
141 m_eSBButtonType = eButtonType; | 141 if (!IsVisible()) |
142 | 142 return; |
143 m_bMouseDown = FALSE; | 143 |
144 } | 144 CFX_ByteTextBuf sButton; |
145 | 145 |
146 CPWL_SBButton::~CPWL_SBButton() | 146 CPDF_Rect rectWnd = GetWindowRect(); |
147 { | 147 |
148 | 148 if (rectWnd.IsEmpty()) |
149 } | 149 return; |
150 | 150 |
151 CFX_ByteString CPWL_SBButton::GetClassName() const | 151 sAppStream << "q\n"; |
152 { | 152 |
153 return "CPWL_SBButton"; | 153 CPDF_Point ptCenter = this->GetCenterPoint(); |
154 } | 154 |
155 | 155 switch (this->m_eScrollBarType) { |
156 void CPWL_SBButton::OnCreate(PWL_CREATEPARAM & cp) | 156 case SBT_HSCROLL: |
157 { | 157 switch (this->m_eSBButtonType) { |
158 cp.eCursorType = FXCT_ARROW; | 158 case PSBT_MIN: { |
159 } | 159 CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); |
160 | 160 CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, |
161 void CPWL_SBButton::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) | 161 ptCenter.y + PWL_TRIANGLE_HALFLEN); |
162 { | 162 CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, |
163 CPWL_Wnd::GetThisAppearanceStream(sAppStream); | 163 ptCenter.y - PWL_TRIANGLE_HALFLEN); |
164 | 164 |
165 if (!IsVisible()) return; | 165 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
166 | 166 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
167 CFX_ByteTextBuf sButton; | 167 sButton << "0 g\n"; |
168 | 168 sButton << pt1.x << " " << pt1.y << " m\n"; |
169 CPDF_Rect rectWnd = GetWindowRect(); | 169 sButton << pt2.x << " " << pt2.y << " l\n"; |
170 | 170 sButton << pt3.x << " " << pt3.y << " l\n"; |
171 if (rectWnd.IsEmpty()) return; | 171 sButton << pt1.x << " " << pt1.y << " l f\n"; |
172 | 172 |
173 sAppStream << "q\n"; | 173 sAppStream << sButton; |
174 | 174 } |
175 CPDF_Point ptCenter = this->GetCenterPoint(); | 175 } break; |
176 | 176 case PSBT_MAX: { |
177 switch (this->m_eScrollBarType) | 177 CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); |
178 { | 178 CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, |
179 case SBT_HSCROLL: | 179 ptCenter.y + PWL_TRIANGLE_HALFLEN); |
180 switch (this->m_eSBButtonType) | 180 CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, |
181 { | 181 ptCenter.y - PWL_TRIANGLE_HALFLEN); |
182 case PSBT_MIN: | 182 |
183 { | 183 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
184 CPDF_Point pt1(ptCenter.x - PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y); | 184 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
185 CPDF_Point pt2(ptCenter.x + PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); | 185 sButton << "0 g\n"; |
186 CPDF_Point pt3(ptCenter.x + PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); | 186 sButton << pt1.x << " " << pt1.y << " m\n"; |
187 | 187 sButton << pt2.x << " " << pt2.y << " l\n"; |
188 if (rectWnd.right - rectWnd.left
> PWL_TRIANGLE_HALFLEN * 2 && | 188 sButton << pt3.x << " " << pt3.y << " l\n"; |
189 rectWnd.top - rectWnd.bo
ttom > PWL_TRIANGLE_HALFLEN ) | 189 sButton << pt1.x << " " << pt1.y << " l f\n"; |
190 { | 190 |
191 sButton << "0 g\n"; | 191 sAppStream << sButton; |
192 sButton << pt1.x << " "
<< pt1.y << " m\n"; | 192 } |
193 sButton << pt2.x << " "
<< pt2.y << " l\n"; | 193 } break; |
194 sButton << pt3.x << " "
<< pt3.y << " l\n"; | 194 default: |
195 sButton << pt1.x << " "
<< pt1.y << " l f\n"; | 195 break; |
196 | 196 } |
197 sAppStream << sButton; | 197 break; |
198 } | 198 case SBT_VSCROLL: |
199 } | 199 switch (this->m_eSBButtonType) { |
200 break; | 200 case PSBT_MIN: { |
201 case PSBT_MAX: | 201 CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, |
202 { | 202 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); |
203 CPDF_Point pt1(ptCenter.x + PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y); | 203 CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, |
204 CPDF_Point pt2(ptCenter.x - PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); | 204 ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); |
205 CPDF_Point pt3(ptCenter.x - PWL_
TRIANGLE_HALFLEN * 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); | 205 CPDF_Point pt3(ptCenter.x, ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); |
206 | 206 |
207 if (rectWnd.right - rectWnd.left
> PWL_TRIANGLE_HALFLEN * 2 && | 207 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
208 rectWnd.top - rectWnd.bo
ttom > PWL_TRIANGLE_HALFLEN ) | 208 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
209 { | 209 sButton << "0 g\n"; |
210 sButton << "0 g\n"; | 210 sButton << pt1.x << " " << pt1.y << " m\n"; |
211 sButton << pt1.x << " "
<< pt1.y << " m\n"; | 211 sButton << pt2.x << " " << pt2.y << " l\n"; |
212 sButton << pt2.x << " "
<< pt2.y << " l\n"; | 212 sButton << pt3.x << " " << pt3.y << " l\n"; |
213 sButton << pt3.x << " "
<< pt3.y << " l\n"; | 213 sButton << pt1.x << " " << pt1.y << " l f\n"; |
214 sButton << pt1.x << " "
<< pt1.y << " l f\n"; | 214 |
215 | 215 sAppStream << sButton; |
216 sAppStream << sButton; | 216 } |
217 } | 217 } break; |
218 } | 218 case PSBT_MAX: { |
219 break; | 219 CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN, |
220 default: | 220 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); |
221 break; | 221 CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN, |
222 } | 222 ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); |
223 break; | 223 CPDF_Point pt3(ptCenter.x, ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); |
224 case SBT_VSCROLL: | 224 |
225 switch(this->m_eSBButtonType) | 225 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
226 { | 226 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
227 case PSBT_MIN: | 227 sButton << "0 g\n"; |
228 { | 228 sButton << pt1.x << " " << pt1.y << " m\n"; |
229 CPDF_Point pt1(ptCenter.x - PWL_
TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); | 229 sButton << pt2.x << " " << pt2.y << " l\n"; |
230 CPDF_Point pt2(ptCenter.x + PWL_
TRIANGLE_HALFLEN,ptCenter.y - PWL_TRIANGLE_HALFLEN * 0.5f); | 230 sButton << pt3.x << " " << pt3.y << " l\n"; |
231 CPDF_Point pt3(ptCenter.x,ptCent
er.y + PWL_TRIANGLE_HALFLEN * 0.5f); | 231 sButton << pt1.x << " " << pt1.y << " l f\n"; |
232 | 232 |
233 if (rectWnd.right - rectWnd.left
> PWL_TRIANGLE_HALFLEN * 2 && | 233 sAppStream << sButton; |
234 rectWnd.top - rectWnd.bo
ttom > PWL_TRIANGLE_HALFLEN ) | 234 } |
235 { | 235 } break; |
236 sButton << "0 g\n"; | 236 default: |
237 sButton << pt1.x << " "
<< pt1.y << " m\n"; | 237 break; |
238 sButton << pt2.x << " "
<< pt2.y << " l\n"; | 238 } |
239 sButton << pt3.x << " "
<< pt3.y << " l\n"; | 239 break; |
240 sButton << pt1.x << " "
<< pt1.y << " l f\n"; | 240 default: |
241 | 241 break; |
242 sAppStream << sButton; | 242 } |
243 } | 243 |
244 } | 244 sAppStream << "Q\n"; |
245 break; | 245 } |
246 case PSBT_MAX: | 246 |
247 { | 247 void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, |
248 CPDF_Point pt1(ptCenter.x - PWL_
TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); | 248 CPDF_Matrix* pUser2Device) { |
249 CPDF_Point pt2(ptCenter.x + PWL_
TRIANGLE_HALFLEN,ptCenter.y + PWL_TRIANGLE_HALFLEN * 0.5f); | 249 if (!IsVisible()) |
250 CPDF_Point pt3(ptCenter.x,ptCent
er.y - PWL_TRIANGLE_HALFLEN * 0.5f); | 250 return; |
251 | 251 |
252 if (rectWnd.right - rectWnd.left
> PWL_TRIANGLE_HALFLEN * 2 && | 252 CPDF_Rect rectWnd = GetWindowRect(); |
253 rectWnd.top - rectWnd.bo
ttom > PWL_TRIANGLE_HALFLEN ) | 253 if (rectWnd.IsEmpty()) |
254 { | 254 return; |
255 sButton << "0 g\n"; | 255 |
256 sButton << pt1.x << " "
<< pt1.y << " m\n"; | 256 CPDF_Point ptCenter = this->GetCenterPoint(); |
257 sButton << pt2.x << " "
<< pt2.y << " l\n"; | 257 FX_INT32 nTransparancy = this->GetTransparency(); |
258 sButton << pt3.x << " "
<< pt3.y << " l\n"; | 258 |
259 sButton << pt1.x << " "
<< pt1.y << " l f\n"; | 259 switch (this->m_eScrollBarType) { |
260 | 260 case SBT_HSCROLL: |
261 sAppStream << sButton; | 261 CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device); |
262 } | 262 switch (this->m_eSBButtonType) { |
263 } | 263 case PSBT_MIN: { |
264 break; | 264 CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); |
265 default: | 265 CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, |
266 break; | 266 ptCenter.y + PWL_TRIANGLE_HALFLEN); |
267 } | 267 CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, |
268 break; | 268 ptCenter.y - PWL_TRIANGLE_HALFLEN); |
269 default: | 269 |
270 break; | 270 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
271 } | 271 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
272 | 272 CFX_PathData path; |
273 sAppStream << "Q\n"; | 273 |
274 } | 274 path.SetPointCount(4); |
275 | 275 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); |
276 void CPWL_SBButton::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix* p
User2Device) | 276 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); |
277 { | 277 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); |
278 if (!IsVisible()) return; | 278 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); |
279 | 279 |
280 CPDF_Rect rectWnd = GetWindowRect(); | 280 pDevice->DrawPath(&path, |
281 if (rectWnd.IsEmpty()) return; | 281 pUser2Device, |
282 | 282 NULL, |
283 CPDF_Point ptCenter = this->GetCenterPoint(); | 283 CPWL_Utils::PWLColorToFXColor( |
284 FX_INT32 nTransparancy = this->GetTransparency(); | 284 PWL_DEFAULT_BLACKCOLOR, nTransparancy), |
285 | 285 0, |
286 switch (this->m_eScrollBarType) | 286 FXFILL_ALTERNATE); |
287 { | 287 } |
288 case SBT_HSCROLL: | 288 } break; |
289 CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); | 289 case PSBT_MAX: { |
290 switch (this->m_eSBButtonType) | 290 CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN * 0.5f, ptCenter.y); |
291 { | 291 CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, |
292 case PSBT_MIN: | 292 ptCenter.y + PWL_TRIANGLE_HALFLEN); |
293 { | 293 CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN * 0.5f, |
294 CPDF_Point pt1(ptCenter.x - PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y); | 294 ptCenter.y - PWL_TRIANGLE_HALFLEN); |
295 CPDF_Point pt2(ptCenter.x + PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); | 295 |
296 CPDF_Point pt3(ptCenter.x + PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); | 296 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_HALFLEN * 2 && |
297 | 297 rectWnd.top - rectWnd.bottom > PWL_TRIANGLE_HALFLEN) { |
298 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_
HALFLEN * 2 && | 298 CFX_PathData path; |
299 rectWnd.top - rectWnd.bottom > PWL_TRIAN
GLE_HALFLEN ) | 299 |
300 { | 300 path.SetPointCount(4); |
301 CFX_PathData path; | 301 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVETO); |
302 | 302 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINETO); |
303 path.SetPointCount(4); | 303 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINETO); |
304 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVE
TO); | 304 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINETO); |
305 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINE
TO); | 305 |
306 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINE
TO); | 306 pDevice->DrawPath(&path, |
307 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINE
TO); | 307 pUser2Device, |
308 | 308 NULL, |
309 pDevice->DrawPath(&path, pUser2Device, N
ULL, | 309 CPWL_Utils::PWLColorToFXColor( |
310 CPWL_Utils::PWLColorToFXColor(PW
L_DEFAULT_BLACKCOLOR,nTransparancy), | 310 PWL_DEFAULT_BLACKCOLOR, nTransparancy), |
311 0, FXFILL_ALTERNATE); | 311 0, |
312 } | 312 FXFILL_ALTERNATE); |
313 } | 313 } |
314 break; | 314 } break; |
315 case PSBT_MAX: | 315 default: |
316 { | 316 break; |
317 CPDF_Point pt1(ptCenter.x + PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y); | 317 } |
318 CPDF_Point pt2(ptCenter.x - PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y + PWL_TRIANGLE_HALFLEN); | 318 break; |
319 CPDF_Point pt3(ptCenter.x - PWL_TRIANGLE_HALFLEN
* 0.5f,ptCenter.y - PWL_TRIANGLE_HALFLEN); | 319 case SBT_VSCROLL: |
320 | 320 switch (this->m_eSBButtonType) { |
321 if (rectWnd.right - rectWnd.left > PWL_TRIANGLE_
HALFLEN * 2 && | 321 case PSBT_MIN: { |
322 rectWnd.top - rectWnd.bottom > PWL_TRIAN
GLE_HALFLEN ) | 322 // draw border |
323 { | 323 CPDF_Rect rcDraw = rectWnd; |
324 CFX_PathData path; | 324 CPWL_Utils::DrawStrokeRect(pDevice, |
325 | 325 pUser2Device, |
326 path.SetPointCount(4); | 326 rcDraw, |
327 path.SetPoint(0, pt1.x, pt1.y, FXPT_MOVE
TO); | 327 ArgbEncode(nTransparancy, 100, 100, 100), |
328 path.SetPoint(1, pt2.x, pt2.y, FXPT_LINE
TO); | 328 0.0f); |
329 path.SetPoint(2, pt3.x, pt3.y, FXPT_LINE
TO); | 329 |
330 path.SetPoint(3, pt1.x, pt1.y, FXPT_LINE
TO); | 330 // draw inner border |
331 | 331 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); |
332 pDevice->DrawPath(&path, pUser2Device, N
ULL, | 332 CPWL_Utils::DrawStrokeRect(pDevice, |
333 CPWL_Utils::PWLColorToFXColor(PW
L_DEFAULT_BLACKCOLOR,nTransparancy), | 333 pUser2Device, |
334 0, FXFILL_ALTERNATE); | 334 rcDraw, |
335 } | 335 ArgbEncode(nTransparancy, 255, 255, 255), |
336 } | 336 1.0f); |
337 break; | 337 |
338 default: | 338 // draw background |
339 break; | 339 |
340 } | 340 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); |
341 break; | 341 |
342 case SBT_VSCROLL: | 342 if (this->IsEnabled()) |
343 switch(this->m_eSBButtonType) | 343 CPWL_Utils::DrawShadow(pDevice, |
344 { | 344 pUser2Device, |
345 case PSBT_MIN: | 345 TRUE, |
346 { | 346 FALSE, |
347 //draw border | 347 rcDraw, |
348 CPDF_Rect rcDraw = rectWnd; | 348 nTransparancy, |
349 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 349 80, |
350 ArgbEncode(nTransparancy,100,100,100),0.
0f); | 350 220); |
351 | 351 else |
352 //draw inner border | 352 CPWL_Utils::DrawFillRect( |
353 rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); | 353 pDevice, pUser2Device, rcDraw, ArgbEncode(255, 255, 255, 255)); |
354 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 354 |
355 ArgbEncode(nTransparancy,255,255,255),1.
0f); | 355 // draw arrow |
356 | 356 |
357 //draw background | 357 if (rectWnd.top - rectWnd.bottom > 6.0f) { |
358 | 358 FX_FLOAT fX = rectWnd.left + 1.5f; |
359 rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f); | 359 FX_FLOAT fY = rectWnd.bottom; |
360 | 360 CPDF_Point pts[7] = { CPDF_Point(fX + 2.5f, fY + 4.0f), |
361 if (this->IsEnabled()) | 361 CPDF_Point(fX + 2.5f, fY + 3.0f), |
362 CPWL_Utils::DrawShadow(pDevice, pUser2De
vice, TRUE, FALSE, rcDraw, nTransparancy, 80, 220); | 362 CPDF_Point(fX + 4.5f, fY + 5.0f), |
363 else | 363 CPDF_Point(fX + 6.5f, fY + 3.0f), |
364 CPWL_Utils::DrawFillRect(pDevice, pUser2
Device, rcDraw, ArgbEncode(255,255,255,255)); | 364 CPDF_Point(fX + 6.5f, fY + 4.0f), |
365 | 365 CPDF_Point(fX + 4.5f, fY + 6.0f), |
366 //draw arrow | 366 CPDF_Point(fX + 2.5f, fY + 4.0f) }; |
367 | 367 |
368 if (rectWnd.top - rectWnd.bottom > 6.0f ) | 368 if (this->IsEnabled()) |
369 { | 369 CPWL_Utils::DrawFillArea( |
370 FX_FLOAT fX = rectWnd.left + 1.5f; | 370 pDevice, |
371 FX_FLOAT fY = rectWnd.bottom; | 371 pUser2Device, |
372 CPDF_Point pts[7] = { | 372 pts, |
373 CPDF_Point(fX+2.
5f, fY+4.0f), | 373 7, |
374 CPDF_Point(fX+2.
5f, fY+3.0f), | 374 ArgbEncode(nTransparancy, 255, 255, 255)); |
375 CPDF_Point(fX+4.
5f, fY+5.0f), | 375 else |
376 CPDF_Point(fX+6.
5f, fY+3.0f), | 376 CPWL_Utils::DrawFillArea(pDevice, |
377 CPDF_Point(fX+6.
5f, fY+4.0f), | 377 pUser2Device, |
378 CPDF_Point(fX+4.
5f, fY+6.0f), | 378 pts, |
379 CPDF_Point(fX+2.
5f, fY+4.0f)}; | 379 7, |
380 | 380 CPWL_Utils::PWLColorToFXColor( |
381 | 381 PWL_DEFAULT_HEAVYGRAYCOLOR, 255)); |
382 if (this->IsEnabled()) | 382 } |
383 CPWL_Utils::DrawFillArea(pDevice
, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255)); | 383 } break; |
384 else | 384 case PSBT_MAX: { |
385 CPWL_Utils::DrawFillArea(pDevice
, pUser2Device, pts, 7, | 385 // draw border |
386 CPWL_Utils::PWLColorToFX
Color(PWL_DEFAULT_HEAVYGRAYCOLOR,255)); | 386 CPDF_Rect rcDraw = rectWnd; |
387 } | 387 CPWL_Utils::DrawStrokeRect(pDevice, |
388 } | 388 pUser2Device, |
389 break; | 389 rcDraw, |
390 case PSBT_MAX: | 390 ArgbEncode(nTransparancy, 100, 100, 100), |
391 { | 391 0.0f); |
392 //draw border | 392 |
393 CPDF_Rect rcDraw = rectWnd; | 393 // draw inner border |
394 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 394 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); |
395 ArgbEncode(nTransparancy,100,100,100),0.
0f); | 395 CPWL_Utils::DrawStrokeRect(pDevice, |
396 | 396 pUser2Device, |
397 //draw inner border | 397 rcDraw, |
398 rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); | 398 ArgbEncode(nTransparancy, 255, 255, 255), |
399 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 399 1.0f); |
400 ArgbEncode(nTransparancy,255,255,255),1.
0f); | 400 |
401 | 401 // draw background |
402 //draw background | 402 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 1.0f); |
403 rcDraw = CPWL_Utils::DeflateRect(rectWnd,1.0f); | 403 if (this->IsEnabled()) |
404 if (this->IsEnabled()) | 404 CPWL_Utils::DrawShadow(pDevice, |
405 CPWL_Utils::DrawShadow(pDevice, pUser2De
vice, TRUE, FALSE, rcDraw, nTransparancy, 80, 220); | 405 pUser2Device, |
406 else | 406 TRUE, |
407 CPWL_Utils::DrawFillRect(pDevice, pUser2
Device, rcDraw, ArgbEncode(255,255,255,255)); | 407 FALSE, |
408 | 408 rcDraw, |
409 //draw arrow | 409 nTransparancy, |
410 | 410 80, |
411 if (rectWnd.top - rectWnd.bottom > 6.0f ) | 411 220); |
412 { | 412 else |
413 FX_FLOAT fX = rectWnd.left + 1.5f; | 413 CPWL_Utils::DrawFillRect( |
414 FX_FLOAT fY = rectWnd.bottom; | 414 pDevice, pUser2Device, rcDraw, ArgbEncode(255, 255, 255, 255)); |
415 | 415 |
416 CPDF_Point pts[7] = { | 416 // draw arrow |
417 CPDF_Point(fX+2.
5f, fY+5.0f), | 417 |
418 CPDF_Point(fX+2.
5f, fY+6.0f), | 418 if (rectWnd.top - rectWnd.bottom > 6.0f) { |
419 CPDF_Point(fX+4.
5f, fY+4.0f), | 419 FX_FLOAT fX = rectWnd.left + 1.5f; |
420 CPDF_Point(fX+6.
5f, fY+6.0f), | 420 FX_FLOAT fY = rectWnd.bottom; |
421 CPDF_Point(fX+6.
5f, fY+5.0f), | 421 |
422 CPDF_Point(fX+4.
5f, fY+3.0f), | 422 CPDF_Point pts[7] = { CPDF_Point(fX + 2.5f, fY + 5.0f), |
423 CPDF_Point(fX+2.
5f, fY+5.0f)}; | 423 CPDF_Point(fX + 2.5f, fY + 6.0f), |
424 | 424 CPDF_Point(fX + 4.5f, fY + 4.0f), |
425 | 425 CPDF_Point(fX + 6.5f, fY + 6.0f), |
426 if (this->IsEnabled()) | 426 CPDF_Point(fX + 6.5f, fY + 5.0f), |
427 CPWL_Utils::DrawFillArea(pDevice
, pUser2Device, pts, 7, ArgbEncode(nTransparancy,255,255,255)); | 427 CPDF_Point(fX + 4.5f, fY + 3.0f), |
428 else | 428 CPDF_Point(fX + 2.5f, fY + 5.0f) }; |
429 CPWL_Utils::DrawFillArea(pDevice
, pUser2Device, pts, 7, | 429 |
430 CPWL_Utils::PWLColorToFX
Color(PWL_DEFAULT_HEAVYGRAYCOLOR,255)); | 430 if (this->IsEnabled()) |
431 } | 431 CPWL_Utils::DrawFillArea( |
432 } | 432 pDevice, |
433 break; | 433 pUser2Device, |
434 case PSBT_POS: | 434 pts, |
435 { | 435 7, |
436 //CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Dev
ice); | 436 ArgbEncode(nTransparancy, 255, 255, 255)); |
437 | 437 else |
438 //draw border | 438 CPWL_Utils::DrawFillArea(pDevice, |
439 CPDF_Rect rcDraw = rectWnd; | 439 pUser2Device, |
440 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 440 pts, |
441 ArgbEncode(nTransparancy,100,100,100),0.
0f); | 441 7, |
442 | 442 CPWL_Utils::PWLColorToFXColor( |
443 //draw inner border | 443 PWL_DEFAULT_HEAVYGRAYCOLOR, 255)); |
444 rcDraw = CPWL_Utils::DeflateRect(rectWnd,0.5f); | 444 } |
445 CPWL_Utils::DrawStrokeRect(pDevice, pUser2Device
, rcDraw, | 445 } break; |
446 ArgbEncode(nTransparancy,255,255,255),1.
0f); | 446 case PSBT_POS: { |
447 | 447 // CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); |
448 if (this->IsEnabled()) | 448 |
449 { | 449 // draw border |
450 //draw shadow effect
| 450 CPDF_Rect rcDraw = rectWnd; |
451 | 451 CPWL_Utils::DrawStrokeRect(pDevice, |
452 CPDF_Point ptTop = CPDF_Point(rectWnd.le
ft,rectWnd.top-1.0f); | 452 pUser2Device, |
453 CPDF_Point ptBottom = CPDF_Point(rectWnd
.left,rectWnd.bottom+1.0f); | 453 rcDraw, |
454 | 454 ArgbEncode(nTransparancy, 100, 100, 100), |
455 ptTop.x += 1.5f; | 455 0.0f); |
456 ptBottom.x += 1.5f; | 456 |
457 | 457 // draw inner border |
458 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 458 rcDraw = CPWL_Utils::DeflateRect(rectWnd, 0.5f); |
459 ArgbEncode(nTransparancy,210,210
,210),1.0f); | 459 CPWL_Utils::DrawStrokeRect(pDevice, |
460 | 460 pUser2Device, |
461 ptTop.x += 1.0f; | 461 rcDraw, |
462 ptBottom.x += 1.0f; | 462 ArgbEncode(nTransparancy, 255, 255, 255), |
463 | 463 1.0f); |
464 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 464 |
465 ArgbEncode(nTransparancy,220,220
,220),1.0f); | 465 if (this->IsEnabled()) { |
466 | 466 // draw shadow effect |
467 ptTop.x += 1.0f; | 467 |
468 ptBottom.x += 1.0f; | 468 CPDF_Point ptTop = CPDF_Point(rectWnd.left, rectWnd.top - 1.0f); |
469 | 469 CPDF_Point ptBottom = |
470 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 470 CPDF_Point(rectWnd.left, rectWnd.bottom + 1.0f); |
471 ArgbEncode(nTransparancy,240,240
,240),1.0f); | 471 |
472 | 472 ptTop.x += 1.5f; |
473 ptTop.x += 1.0f; | 473 ptBottom.x += 1.5f; |
474 ptBottom.x += 1.0f; | 474 |
475 | 475 CPWL_Utils::DrawStrokeLine(pDevice, |
476 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 476 pUser2Device, |
477 ArgbEncode(nTransparancy,240,240
,240),1.0f); | 477 ptTop, |
478 | 478 ptBottom, |
479 ptTop.x += 1.0f; | 479 ArgbEncode(nTransparancy, 210, 210, 210), |
480 ptBottom.x += 1.0f; | 480 1.0f); |
481 | 481 |
482 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 482 ptTop.x += 1.0f; |
483 ArgbEncode(nTransparancy,210,210
,210),1.0f); | 483 ptBottom.x += 1.0f; |
484 | 484 |
485 ptTop.x += 1.0f; | 485 CPWL_Utils::DrawStrokeLine(pDevice, |
486 ptBottom.x += 1.0f; | 486 pUser2Device, |
487 | 487 ptTop, |
488 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 488 ptBottom, |
489 ArgbEncode(nTransparancy,180,180
,180),1.0f); | 489 ArgbEncode(nTransparancy, 220, 220, 220), |
490 | 490 1.0f); |
491 ptTop.x += 1.0f; | 491 |
492 ptBottom.x += 1.0f; | 492 ptTop.x += 1.0f; |
493 | 493 ptBottom.x += 1.0f; |
494 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 494 |
495 ArgbEncode(nTransparancy,150,150
,150),1.0f); | 495 CPWL_Utils::DrawStrokeLine(pDevice, |
496 | 496 pUser2Device, |
497 ptTop.x += 1.0f; | 497 ptTop, |
498 ptBottom.x += 1.0f; | 498 ptBottom, |
499 | 499 ArgbEncode(nTransparancy, 240, 240, 240), |
500 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 500 1.0f); |
501 ArgbEncode(nTransparancy,150,150
,150),1.0f); | 501 |
502 | 502 ptTop.x += 1.0f; |
503 ptTop.x += 1.0f; | 503 ptBottom.x += 1.0f; |
504 ptBottom.x += 1.0f; | 504 |
505 | 505 CPWL_Utils::DrawStrokeLine(pDevice, |
506 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 506 pUser2Device, |
507 ArgbEncode(nTransparancy,180,180
,180),1.0f); | 507 ptTop, |
508 | 508 ptBottom, |
509 ptTop.x += 1.0f; | 509 ArgbEncode(nTransparancy, 240, 240, 240), |
510 ptBottom.x += 1.0f; | 510 1.0f); |
511 | 511 |
512 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptTop, ptBottom, | 512 ptTop.x += 1.0f; |
513 ArgbEncode(nTransparancy,210,210
,210),1.0f); | 513 ptBottom.x += 1.0f; |
514 } | 514 |
515 else | 515 CPWL_Utils::DrawStrokeLine(pDevice, |
516 { | 516 pUser2Device, |
517 CPWL_Utils::DrawFillRect(pDevice, pUser2
Device, rcDraw, ArgbEncode(255,255,255,255)); | 517 ptTop, |
518 } | 518 ptBottom, |
519 | 519 ArgbEncode(nTransparancy, 210, 210, 210), |
520 //draw friction | 520 1.0f); |
521 | 521 |
522 if (rectWnd.Height() > 8.0f) | 522 ptTop.x += 1.0f; |
523 { | 523 ptBottom.x += 1.0f; |
524 FX_COLORREF crStroke = ArgbEncode(nTrans
parancy,120,120,120); | 524 |
525 if (!this->IsEnabled()) | 525 CPWL_Utils::DrawStrokeLine(pDevice, |
526 crStroke = CPWL_Utils::PWLColorT
oFXColor(PWL_DEFAULT_HEAVYGRAYCOLOR,255); | 526 pUser2Device, |
527 | 527 ptTop, |
528 FX_FLOAT nFrictionWidth = 5.0f; | 528 ptBottom, |
529 FX_FLOAT nFrictionHeight = 5.5f; | 529 ArgbEncode(nTransparancy, 180, 180, 180), |
530 | 530 1.0f); |
531 CPDF_Point ptLeft = CPDF_Point(ptCenter.
x - nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f); | 531 |
532 CPDF_Point ptRight = CPDF_Point(ptCenter
.x + nFrictionWidth / 2.0f, ptCenter.y - nFrictionHeight / 2.0f + 0.5f); | 532 ptTop.x += 1.0f; |
533 | 533 ptBottom.x += 1.0f; |
534 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptLeft, ptRight, | 534 |
535 crStroke,1.0f); | 535 CPWL_Utils::DrawStrokeLine(pDevice, |
536 | 536 pUser2Device, |
537 ptLeft.y += 2.0f; | 537 ptTop, |
538 ptRight.y += 2.0f; | 538 ptBottom, |
539 | 539 ArgbEncode(nTransparancy, 150, 150, 150), |
540 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptLeft, ptRight, | 540 1.0f); |
541 crStroke,1.0f); | 541 |
542 | 542 ptTop.x += 1.0f; |
543 ptLeft.y += 2.0f; | 543 ptBottom.x += 1.0f; |
544 ptRight.y += 2.0f; | 544 |
545 | 545 CPWL_Utils::DrawStrokeLine(pDevice, |
546 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptLeft, ptRight, | 546 pUser2Device, |
547 crStroke,1.0f); | 547 ptTop, |
548 | 548 ptBottom, |
549 /* | 549 ArgbEncode(nTransparancy, 150, 150, 150), |
550 ptLeft.y += 1.5f; | 550 1.0f); |
551 ptRight.y += 1.5f; | 551 |
552 | 552 ptTop.x += 1.0f; |
553 CPWL_Utils::DrawStrokeLine(pDevice, pUse
r2Device, ptLeft, ptRight, | 553 ptBottom.x += 1.0f; |
554 ArgbEncode(nTransparancy,150,150
,150),1.0f); | 554 |
555 */ | 555 CPWL_Utils::DrawStrokeLine(pDevice, |
556 } | 556 pUser2Device, |
557 } | 557 ptTop, |
558 break; | 558 ptBottom, |
559 default: | 559 ArgbEncode(nTransparancy, 180, 180, 180), |
560 break; | 560 1.0f); |
561 } | 561 |
562 break; | 562 ptTop.x += 1.0f; |
563 default: | 563 ptBottom.x += 1.0f; |
564 break; | 564 |
565 } | 565 CPWL_Utils::DrawStrokeLine(pDevice, |
566 } | 566 pUser2Device, |
567 | 567 ptTop, |
568 FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) | 568 ptBottom, |
569 { | 569 ArgbEncode(nTransparancy, 210, 210, 210), |
570 CPWL_Wnd::OnLButtonDown(point,nFlag); | 570 1.0f); |
571 | 571 } else { |
572 if (CPWL_Wnd * pParent = GetParentWindow()) | 572 CPWL_Utils::DrawFillRect( |
573 pParent->OnNotify(this,PNM_LBUTTONDOWN,0,(FX_INTPTR)&point); | 573 pDevice, pUser2Device, rcDraw, ArgbEncode(255, 255, 255, 255)); |
574 | 574 } |
575 m_bMouseDown = TRUE; | 575 |
576 SetCapture(); | 576 // draw friction |
577 | 577 |
578 return TRUE; | 578 if (rectWnd.Height() > 8.0f) { |
579 } | 579 FX_COLORREF crStroke = ArgbEncode(nTransparancy, 120, 120, 120); |
580 | 580 if (!this->IsEnabled()) |
581 FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) | 581 crStroke = CPWL_Utils::PWLColorToFXColor( |
582 { | 582 PWL_DEFAULT_HEAVYGRAYCOLOR, 255); |
583 CPWL_Wnd::OnLButtonUp(point,nFlag); | 583 |
584 | 584 FX_FLOAT nFrictionWidth = 5.0f; |
585 if (CPWL_Wnd * pParent = GetParentWindow()) | 585 FX_FLOAT nFrictionHeight = 5.5f; |
586 pParent->OnNotify(this,PNM_LBUTTONUP,0,(FX_INTPTR)&point); | 586 |
587 | 587 CPDF_Point ptLeft = |
588 m_bMouseDown = FALSE; | 588 CPDF_Point(ptCenter.x - nFrictionWidth / 2.0f, |
589 ReleaseCapture(); | 589 ptCenter.y - nFrictionHeight / 2.0f + 0.5f); |
590 | 590 CPDF_Point ptRight = |
591 return TRUE; | 591 CPDF_Point(ptCenter.x + nFrictionWidth / 2.0f, |
592 } | 592 ptCenter.y - nFrictionHeight / 2.0f + 0.5f); |
593 | 593 |
594 FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point & point, FX_DWORD nFlag) | 594 CPWL_Utils::DrawStrokeLine( |
595 { | 595 pDevice, pUser2Device, ptLeft, ptRight, crStroke, 1.0f); |
596 CPWL_Wnd::OnMouseMove(point,nFlag); | 596 |
597 | 597 ptLeft.y += 2.0f; |
598 if (CPWL_Wnd * pParent = GetParentWindow()) | 598 ptRight.y += 2.0f; |
599 { | 599 |
600 pParent->OnNotify(this,PNM_MOUSEMOVE,0,(FX_INTPTR)&point); | 600 CPWL_Utils::DrawStrokeLine( |
601 | 601 pDevice, pUser2Device, ptLeft, ptRight, crStroke, 1.0f); |
602 /* | 602 |
603 if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonT
ype == PSBT_MAX)) | 603 ptLeft.y += 2.0f; |
604 { | 604 ptRight.y += 2.0f; |
605 if (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_I
NTPTR)&point)) | 605 |
606 return FALSE; | 606 CPWL_Utils::DrawStrokeLine( |
607 } | 607 pDevice, pUser2Device, ptLeft, ptRight, crStroke, 1.0f); |
608 */ | 608 |
609 } | 609 /* |
610 | 610 ptLeft.y += 1.5f; |
611 return TRUE; | 611 ptRight.y += 1.5f; |
612 } | 612 |
613 | 613 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, ptLeft, ptRight, |
614 /* ------------------------------- CPWL_ScrollBar ------------------------------
---- */ | 614 ArgbEncode(nTransparancy,150,150,150),1.0f); |
615 | 615 */ |
616 CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType): | 616 } |
617 m_sbType(sbType), | 617 } break; |
618 m_pMinButton(NULL), | 618 default: |
619 m_pMaxButton(NULL), | 619 break; |
620 m_pPosButton(NULL), | 620 } |
621 m_bMouseDown(FALSE), | 621 break; |
622 m_bMinOrMax(FALSE), | 622 default: |
623 m_bNotifyForever(TRUE) | 623 break; |
624 { | 624 } |
625 } | 625 } |
626 | 626 |
627 CPWL_ScrollBar::~CPWL_ScrollBar() | 627 FX_BOOL CPWL_SBButton::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) { |
628 { | 628 CPWL_Wnd::OnLButtonDown(point, nFlag); |
629 } | 629 |
630 | 630 if (CPWL_Wnd* pParent = GetParentWindow()) |
631 CFX_ByteString CPWL_ScrollBar::GetClassName() const | 631 pParent->OnNotify(this, PNM_LBUTTONDOWN, 0, (FX_INTPTR)&point); |
632 { | 632 |
633 return "CPWL_ScrollBar"; | 633 m_bMouseDown = TRUE; |
634 } | 634 SetCapture(); |
635 | 635 |
636 void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM & cp) | 636 return TRUE; |
637 { | 637 } |
638 cp.eCursorType = FXCT_ARROW; | 638 |
639 } | 639 FX_BOOL CPWL_SBButton::OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) { |
640 | 640 CPWL_Wnd::OnLButtonUp(point, nFlag); |
641 void CPWL_ScrollBar::RePosChildWnd() | 641 |
642 { | 642 if (CPWL_Wnd* pParent = GetParentWindow()) |
643 CPDF_Rect rcClient = this->GetClientRect(); | 643 pParent->OnNotify(this, PNM_LBUTTONUP, 0, (FX_INTPTR)&point); |
644 | 644 |
645 /* | 645 m_bMouseDown = FALSE; |
646 switch(m_sbType) | 646 ReleaseCapture(); |
647 { | 647 |
648 case SBT_HSCROLL: | 648 return TRUE; |
649 if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH
|| | 649 } |
650 rcClient.top - rcClient.bottom < PWL_SCROLLBAR_W
IDTH) | 650 |
651 { | 651 FX_BOOL CPWL_SBButton::OnMouseMove(const CPDF_Point& point, FX_DWORD nFlag) { |
652 SetVisible(FALSE); | 652 CPWL_Wnd::OnMouseMove(point, nFlag); |
653 } | 653 |
654 break; | 654 if (CPWL_Wnd* pParent = GetParentWindow()) { |
655 case SBT_VSCROLL: | 655 pParent->OnNotify(this, PNM_MOUSEMOVE, 0, (FX_INTPTR)&point); |
656 if (rcClient.right - rcClient.left < PWL_SCROLLBAR_WIDTH
|| | 656 |
657 rcClient.top - rcClient.bottom < PWL_SCROLLBAR_W
IDTH) | 657 /* |
658 { | 658 if (m_bMouseDown && (m_eSBButtonType == PSBT_MIN || m_eSBButtonType == |
659 SetVisible(FALSE); | 659 PSBT_MAX)) |
660 } | 660 { |
661 break; | 661 if |
662 } | 662 (!pParent->OnNotify(this,PNM_LBUTTONDOWN,nFlags,(FX_INTPTR)&point)) |
663 */ | 663 return FALSE; |
664 CPDF_Rect rcMinButton,rcMaxButton; | 664 } |
665 | 665 */ |
666 FX_FLOAT fBWidth = 0; | 666 } |
667 | 667 |
668 switch (m_sbType) | 668 return TRUE; |
669 { | 669 } |
670 case SBT_HSCROLL: | 670 |
671 if (rcClient.right - rcClient.left > PWL_SCROLLBAR_BUTTON_WIDTH
* 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2) | 671 /* ------------------------------- CPWL_ScrollBar |
672 { | 672 * ---------------------------------- */ |
673 rcMinButton = CPDF_Rect(rcClient.left,rcClient.bottom, | 673 |
674 rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH,rcCli
ent.top); | 674 CPWL_ScrollBar::CPWL_ScrollBar(PWL_SCROLLBAR_TYPE sbType) |
675 rcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_B
UTTON_WIDTH,rcClient.bottom, | 675 : m_sbType(sbType), |
676 rcClient.right,rcClient.top); | 676 m_pMinButton(NULL), |
677 } | 677 m_pMaxButton(NULL), |
678 else | 678 m_pPosButton(NULL), |
679 { | 679 m_bMouseDown(FALSE), |
680 fBWidth = (rcClient.right - rcClient.left - PWL_SCROLLBA
R_POSBUTTON_MINWIDTH - 2) / 2; | 680 m_bMinOrMax(FALSE), |
681 | 681 m_bNotifyForever(TRUE) { |
682 if (fBWidth > 0) | 682 } |
683 { | 683 |
684 rcMinButton = CPDF_Rect(rcClient.left,rcClient.b
ottom, | 684 CPWL_ScrollBar::~CPWL_ScrollBar() { |
685 rcClient.left + fBWidth,rcClient.top); | 685 } |
686 rcMaxButton = CPDF_Rect(rcClient.right - fBWidth
,rcClient.bottom, | 686 |
687 rcClient.right,rcClient.top); | 687 CFX_ByteString CPWL_ScrollBar::GetClassName() const { |
688 } | 688 return "CPWL_ScrollBar"; |
689 else SetVisible(FALSE); | 689 } |
690 } | 690 |
691 break; | 691 void CPWL_ScrollBar::OnCreate(PWL_CREATEPARAM& cp) { |
692 case SBT_VSCROLL: | 692 cp.eCursorType = FXCT_ARROW; |
693 if (IsFloatBigger(rcClient.top - rcClient.bottom, PWL_SCROLLBAR_
BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) | 693 } |
694 { | 694 |
695 rcMinButton = CPDF_Rect(rcClient.left,rcClient.top - PWL
_SCROLLBAR_BUTTON_WIDTH, | 695 void CPWL_ScrollBar::RePosChildWnd() { |
696 rcClient.right,rcClient.top); | 696 CPDF_Rect rcClient = this->GetClientRect(); |
697 rcMaxButton = CPDF_Rect(rcClient.left,rcClient.bottom, | 697 |
698 rcClient.right,rcClient.bottom + PWL_SCROLLBAR_B
UTTON_WIDTH); | 698 /* |
699 } | 699 switch(m_sbType) |
700 else | 700 { |
701 { | 701 case SBT_HSCROLL: |
702 fBWidth = (rcClient.top - rcClient.bottom - PWL_SCROLLBA
R_POSBUTTON_MINWIDTH - 2) / 2; | 702 if (rcClient.right - rcClient.left < |
703 | 703 PWL_SCROLLBAR_WIDTH || |
704 if (IsFloatBigger(fBWidth, 0)) | 704 rcClient.top - rcClient.bottom < |
705 { | 705 PWL_SCROLLBAR_WIDTH) |
706 rcMinButton = CPDF_Rect(rcClient.left,rcClient.t
op - fBWidth, | 706 { |
707 rcClient.right,rcClient.top); | 707 SetVisible(FALSE); |
708 rcMaxButton = CPDF_Rect(rcClient.left,rcClient.b
ottom, | 708 } |
709 rcClient.right,rcClient.bottom + fBWidth
); | 709 break; |
710 } | 710 case SBT_VSCROLL: |
711 else SetVisible(FALSE); | 711 if (rcClient.right - rcClient.left < |
712 } | 712 PWL_SCROLLBAR_WIDTH || |
713 break; | 713 rcClient.top - rcClient.bottom < |
714 } | 714 PWL_SCROLLBAR_WIDTH) |
715 | 715 { |
716 // if (IsVisible()) | 716 SetVisible(FALSE); |
717 { | 717 } |
718 if (m_pMinButton) | 718 break; |
719 m_pMinButton->Move(rcMinButton,TRUE,FALSE); | 719 } |
720 | 720 */ |
721 if (m_pMaxButton) | 721 CPDF_Rect rcMinButton, rcMaxButton; |
722 m_pMaxButton->Move(rcMaxButton,TRUE,FALSE); | 722 |
723 | 723 FX_FLOAT fBWidth = 0; |
724 MovePosButton(FALSE); | 724 |
725 } | 725 switch (m_sbType) { |
726 } | 726 case SBT_HSCROLL: |
727 | 727 if (rcClient.right - rcClient.left > |
728 void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf & sAppStream) | 728 PWL_SCROLLBAR_BUTTON_WIDTH * 2 + PWL_SCROLLBAR_POSBUTTON_MINWIDTH + |
729 { | 729 2) { |
730 CPDF_Rect rectWnd = GetWindowRect(); | 730 rcMinButton = CPDF_Rect(rcClient.left, |
731 | 731 rcClient.bottom, |
732 if (IsVisible() && !rectWnd.IsEmpty()) | 732 rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, |
733 { | 733 rcClient.top); |
734 CFX_ByteTextBuf sButton; | 734 rcMaxButton = CPDF_Rect(rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, |
735 | 735 rcClient.bottom, |
736 sButton << "q\n"; | 736 rcClient.right, |
737 sButton << "0 w\n" << CPWL_Utils::GetColorAppStream(GetBackgroun
dColor(),TRUE); | 737 rcClient.top); |
738 sButton << rectWnd.left << " " << rectWnd.bottom << " " | 738 } else { |
739 << rectWnd.right - rectWnd.left << " " << rectWn
d.top - rectWnd.bottom << " re b Q\n"; | 739 fBWidth = (rcClient.right - rcClient.left - |
740 | 740 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / |
741 sAppStream << sButton; | 741 2; |
742 } | 742 |
743 } | 743 if (fBWidth > 0) { |
744 | 744 rcMinButton = CPDF_Rect(rcClient.left, |
745 void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, CPDF_Matrix*
pUser2Device) | 745 rcClient.bottom, |
746 { | 746 rcClient.left + fBWidth, |
747 // CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); | 747 rcClient.top); |
748 CPDF_Rect rectWnd = GetWindowRect(); | 748 rcMaxButton = CPDF_Rect(rcClient.right - fBWidth, |
749 | 749 rcClient.bottom, |
750 if (IsVisible() && !rectWnd.IsEmpty()) | 750 rcClient.right, |
751 { | 751 rcClient.top); |
752 CPWL_Utils::DrawFillRect(pDevice, pUser2Device, rectWnd, this->G
etBackgroundColor(), GetTransparency()); | 752 } else |
753 | 753 SetVisible(FALSE); |
754 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, | 754 } |
755 CPDF_Point(rectWnd.left+2.0f,rectWnd.top-2.0f), CPDF_Poi
nt(rectWnd.left+2.0f,rectWnd.bottom+2.0f), | 755 break; |
756 ArgbEncode(this->GetTransparency(),100,100,100),1.0f); | 756 case SBT_VSCROLL: |
757 | 757 if (IsFloatBigger(rcClient.top - rcClient.bottom, |
758 CPWL_Utils::DrawStrokeLine(pDevice, pUser2Device, | 758 PWL_SCROLLBAR_BUTTON_WIDTH * 2 + |
759 CPDF_Point(rectWnd.right-2.0f,rectWnd.top-2.0f), CPDF_Po
int(rectWnd.right-2.0f,rectWnd.bottom+2.0f), | 759 PWL_SCROLLBAR_POSBUTTON_MINWIDTH + 2)) { |
760 ArgbEncode(this->GetTransparency(),100,100,100),1.0f); | 760 rcMinButton = CPDF_Rect(rcClient.left, |
761 } | 761 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH, |
762 } | 762 rcClient.right, |
763 | 763 rcClient.top); |
764 FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point & point, FX_DWORD nFlag) | 764 rcMaxButton = CPDF_Rect(rcClient.left, |
765 { | 765 rcClient.bottom, |
766 CPWL_Wnd::OnLButtonDown(point,nFlag); | 766 rcClient.right, |
767 | 767 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH); |
768 //SetFocus(); | 768 } else { |
769 | 769 fBWidth = (rcClient.top - rcClient.bottom - |
770 if (HasFlag(PWS_AUTOTRANSPARENT)) | 770 PWL_SCROLLBAR_POSBUTTON_MINWIDTH - 2) / |
771 { | 771 2; |
772 if (GetTransparency() != 255) | 772 |
773 { | 773 if (IsFloatBigger(fBWidth, 0)) { |
774 SetTransparency(255); | 774 rcMinButton = CPDF_Rect(rcClient.left, |
775 InvalidateRect(); | 775 rcClient.top - fBWidth, |
776 } | 776 rcClient.right, |
777 } | 777 rcClient.top); |
778 | 778 rcMaxButton = CPDF_Rect(rcClient.left, |
779 CPDF_Rect rcMinArea,rcMaxArea; | 779 rcClient.bottom, |
780 | 780 rcClient.right, |
781 if (m_pPosButton && m_pPosButton->IsVisible()) | 781 rcClient.bottom + fBWidth); |
782 { | 782 } else |
783 CPDF_Rect rcClient = this->GetClientRect(); | 783 SetVisible(FALSE); |
784 CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); | 784 } |
785 | 785 break; |
786 switch (m_sbType) | 786 } |
787 { | 787 |
788 case SBT_HSCROLL: | 788 // if (IsVisible()) |
789 rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTT
ON_WIDTH,rcClient.bottom, | 789 { |
790 rcPosButton.left,rcClien
t.top); | 790 if (m_pMinButton) |
791 rcMaxArea = CPDF_Rect(rcPosButton.right,rcClient.bottom, | 791 m_pMinButton->Move(rcMinButton, TRUE, FALSE); |
792 rcClient.right - PWL_SCR
OLLBAR_BUTTON_WIDTH,rcClient.top); | 792 |
793 | 793 if (m_pMaxButton) |
794 break; | 794 m_pMaxButton->Move(rcMaxButton, TRUE, FALSE); |
795 case SBT_VSCROLL: | 795 |
796 rcMinArea = CPDF_Rect(rcClient.left,rcPosButton.top, | 796 MovePosButton(FALSE); |
797 rcClient.right,rcClient.
top - PWL_SCROLLBAR_BUTTON_WIDTH); | 797 } |
798 rcMaxArea = CPDF_Rect(rcClient.left,rcClient.bottom + PW
L_SCROLLBAR_BUTTON_WIDTH, | 798 } |
799 rcClient.right,rcPosButt
on.bottom); | 799 |
800 break; | 800 void CPWL_ScrollBar::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) { |
801 } | 801 CPDF_Rect rectWnd = GetWindowRect(); |
802 | 802 |
803 rcMinArea.Normalize(); | 803 if (IsVisible() && !rectWnd.IsEmpty()) { |
804 rcMaxArea.Normalize(); | 804 CFX_ByteTextBuf sButton; |
805 | 805 |
806 if (rcMinArea.Contains(point.x,point.y)) | 806 sButton << "q\n"; |
807 { | 807 sButton << "0 w\n" |
808 m_sData.SubBig(); | 808 << CPWL_Utils::GetColorAppStream(GetBackgroundColor(), TRUE); |
809 MovePosButton(TRUE); | 809 sButton << rectWnd.left << " " << rectWnd.bottom << " " |
810 NotifyScrollWindow(); | 810 << rectWnd.right - rectWnd.left << " " |
811 } | 811 << rectWnd.top - rectWnd.bottom << " re b Q\n"; |
812 | 812 |
813 if (rcMaxArea.Contains(point.x,point.y)) | 813 sAppStream << sButton; |
814 { | 814 } |
815 m_sData.AddBig(); | 815 } |
816 MovePosButton(TRUE); | 816 |
817 NotifyScrollWindow(); | 817 void CPWL_ScrollBar::DrawThisAppearance(CFX_RenderDevice* pDevice, |
818 } | 818 CPDF_Matrix* pUser2Device) { |
819 } | 819 // CPWL_Wnd::DrawThisAppearance(pDevice,pUser2Device); |
820 | 820 CPDF_Rect rectWnd = GetWindowRect(); |
821 return TRUE; | 821 |
822 } | 822 if (IsVisible() && !rectWnd.IsEmpty()) { |
823 | 823 CPWL_Utils::DrawFillRect(pDevice, |
824 FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point & point, FX_DWORD nFlag) | 824 pUser2Device, |
825 { | 825 rectWnd, |
826 CPWL_Wnd::OnLButtonUp(point,nFlag); | 826 this->GetBackgroundColor(), |
827 | 827 GetTransparency()); |
828 if (HasFlag(PWS_AUTOTRANSPARENT)) | 828 |
829 { | 829 CPWL_Utils::DrawStrokeLine( |
830 if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) | 830 pDevice, |
831 { | 831 pUser2Device, |
832 SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); | 832 CPDF_Point(rectWnd.left + 2.0f, rectWnd.top - 2.0f), |
833 InvalidateRect(); | 833 CPDF_Point(rectWnd.left + 2.0f, rectWnd.bottom + 2.0f), |
834 } | 834 ArgbEncode(this->GetTransparency(), 100, 100, 100), |
835 } | 835 1.0f); |
836 | 836 |
837 EndTimer(); | 837 CPWL_Utils::DrawStrokeLine( |
838 m_bMouseDown = FALSE; | 838 pDevice, |
839 | 839 pUser2Device, |
840 return TRUE; | 840 CPDF_Point(rectWnd.right - 2.0f, rectWnd.top - 2.0f), |
841 } | 841 CPDF_Point(rectWnd.right - 2.0f, rectWnd.bottom + 2.0f), |
842 | 842 ArgbEncode(this->GetTransparency(), 100, 100, 100), |
843 void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, FX_DWORD msg, FX_INTPTR wParam, FX
_INTPTR lParam) | 843 1.0f); |
844 { | 844 } |
845 CPWL_Wnd::OnNotify(pWnd,msg,wParam,lParam); | 845 } |
846 | 846 |
847 switch (msg) | 847 FX_BOOL CPWL_ScrollBar::OnLButtonDown(const CPDF_Point& point, FX_DWORD nFlag) { |
848 { | 848 CPWL_Wnd::OnLButtonDown(point, nFlag); |
849 case PNM_LBUTTONDOWN: | 849 |
850 if (pWnd == m_pMinButton) | 850 // SetFocus(); |
851 { | 851 |
852 OnMinButtonLBDown(*(CPDF_Point*)lParam); | 852 if (HasFlag(PWS_AUTOTRANSPARENT)) { |
853 } | 853 if (GetTransparency() != 255) { |
854 | 854 SetTransparency(255); |
855 if (pWnd == m_pMaxButton) | 855 InvalidateRect(); |
856 { | 856 } |
857 OnMaxButtonLBDown(*(CPDF_Point*)lParam); | 857 } |
858 } | 858 |
859 | 859 CPDF_Rect rcMinArea, rcMaxArea; |
860 if (pWnd == m_pPosButton) | 860 |
861 { | 861 if (m_pPosButton && m_pPosButton->IsVisible()) { |
862 OnPosButtonLBDown(*(CPDF_Point*)lParam);
| 862 CPDF_Rect rcClient = this->GetClientRect(); |
863 } | 863 CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); |
864 break; | 864 |
865 case PNM_LBUTTONUP: | 865 switch (m_sbType) { |
866 if (pWnd == m_pMinButton) | 866 case SBT_HSCROLL: |
867 { | 867 rcMinArea = CPDF_Rect(rcClient.left + PWL_SCROLLBAR_BUTTON_WIDTH, |
868 OnMinButtonLBUp(*(CPDF_Point*)lParam); | 868 rcClient.bottom, |
869 } | 869 rcPosButton.left, |
870 | 870 rcClient.top); |
871 if (pWnd == m_pMaxButton) | 871 rcMaxArea = CPDF_Rect(rcPosButton.right, |
872 { | 872 rcClient.bottom, |
873 OnMaxButtonLBUp(*(CPDF_Point*)lParam);
| 873 rcClient.right - PWL_SCROLLBAR_BUTTON_WIDTH, |
874 } | 874 rcClient.top); |
875 | 875 |
876 if (pWnd == m_pPosButton) | 876 break; |
877 { | 877 case SBT_VSCROLL: |
878 OnPosButtonLBUp(*(CPDF_Point*)lParam); | 878 rcMinArea = CPDF_Rect(rcClient.left, |
879 } | 879 rcPosButton.top, |
880 break; | 880 rcClient.right, |
881 case PNM_MOUSEMOVE: | 881 rcClient.top - PWL_SCROLLBAR_BUTTON_WIDTH); |
882 if (pWnd == m_pMinButton) | 882 rcMaxArea = CPDF_Rect(rcClient.left, |
883 { | 883 rcClient.bottom + PWL_SCROLLBAR_BUTTON_WIDTH, |
884 OnMinButtonMouseMove(*(CPDF_Point*)lParam); | 884 rcClient.right, |
885 } | 885 rcPosButton.bottom); |
886 | 886 break; |
887 if (pWnd == m_pMaxButton) | 887 } |
888 { | 888 |
889 OnMaxButtonMouseMove(*(CPDF_Point*)lParam);
| 889 rcMinArea.Normalize(); |
890 } | 890 rcMaxArea.Normalize(); |
891 | 891 |
892 if (pWnd == m_pPosButton) | 892 if (rcMinArea.Contains(point.x, point.y)) { |
893 { | 893 m_sData.SubBig(); |
894 OnPosButtonMouseMove(*(CPDF_Point*)lParam);
| 894 MovePosButton(TRUE); |
895 } | 895 NotifyScrollWindow(); |
896 break; | 896 } |
897 case PNM_SETSCROLLINFO: | 897 |
898 { | 898 if (rcMaxArea.Contains(point.x, point.y)) { |
899 if (PWL_SCROLL_INFO * pInfo = (PWL_SCROLL_INFO*)lParam) | 899 m_sData.AddBig(); |
900 { | 900 MovePosButton(TRUE); |
901 if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PW
L_SCROLL_INFO)) != 0) | 901 NotifyScrollWindow(); |
902 { | 902 } |
903 m_OriginInfo = *pInfo; | 903 } |
904 FX_FLOAT fMax = pInfo->fContentMax - pIn
fo->fContentMin - pInfo->fPlateWidth; | 904 |
905 fMax = fMax > 0.0f ? fMax : 0.0f; | 905 return TRUE; |
906 this->SetScrollRange(0,fMax, pInfo->fPla
teWidth); | 906 } |
907 this->SetScrollStep(pInfo->fBigStep,pInf
o->fSmallStep); | 907 |
908 } | 908 FX_BOOL CPWL_ScrollBar::OnLButtonUp(const CPDF_Point& point, FX_DWORD nFlag) { |
909 } | 909 CPWL_Wnd::OnLButtonUp(point, nFlag); |
910 } | 910 |
911 break; | 911 if (HasFlag(PWS_AUTOTRANSPARENT)) { |
912 case PNM_SETSCROLLPOS: | 912 if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) { |
913 { | 913 SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); |
914 FX_FLOAT fPos = *(FX_FLOAT*)lParam; | 914 InvalidateRect(); |
915 switch (this->m_sbType) | 915 } |
916 { | 916 } |
917 case SBT_HSCROLL: | 917 |
918 fPos = fPos - m_OriginInfo.fContentMin; | 918 EndTimer(); |
919 break; | 919 m_bMouseDown = FALSE; |
920 case SBT_VSCROLL: | 920 |
921 fPos = m_OriginInfo.fContentMax - fPos; | 921 return TRUE; |
922 break; | 922 } |
923 } | 923 |
924 this->SetScrollPos(fPos); | 924 void CPWL_ScrollBar::OnNotify(CPWL_Wnd* pWnd, |
925 } | 925 FX_DWORD msg, |
926 break; | 926 FX_INTPTR wParam, |
927 } | 927 FX_INTPTR lParam) { |
928 } | 928 CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam); |
929 | 929 |
930 void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM & cp) | 930 switch (msg) { |
931 { | 931 case PNM_LBUTTONDOWN: |
932 PWL_CREATEPARAM scp = cp; | 932 if (pWnd == m_pMinButton) { |
933 scp.pParentWnd = this; | 933 OnMinButtonLBDown(*(CPDF_Point*)lParam); |
934 scp.dwBorderWidth = 2; | 934 } |
935 scp.nBorderStyle = PBS_BEVELED; | 935 |
936 | 936 if (pWnd == m_pMaxButton) { |
937 scp.dwFlags = PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PW
S_NOREFRESHCLIP; | 937 OnMaxButtonLBDown(*(CPDF_Point*)lParam); |
938 | 938 } |
939 if (!m_pMinButton) | 939 |
940 { | 940 if (pWnd == m_pPosButton) { |
941 m_pMinButton = new CPWL_SBButton(m_sbType,PSBT_MIN); | 941 OnPosButtonLBDown(*(CPDF_Point*)lParam); |
942 m_pMinButton->Create(scp); | 942 } |
943 } | 943 break; |
944 | 944 case PNM_LBUTTONUP: |
945 if (!m_pMaxButton) | 945 if (pWnd == m_pMinButton) { |
946 { | 946 OnMinButtonLBUp(*(CPDF_Point*)lParam); |
947 m_pMaxButton = new CPWL_SBButton(m_sbType,PSBT_MAX); | 947 } |
948 m_pMaxButton->Create(scp); | 948 |
949 } | 949 if (pWnd == m_pMaxButton) { |
950 | 950 OnMaxButtonLBUp(*(CPDF_Point*)lParam); |
951 if (!m_pPosButton) | 951 } |
952 { | 952 |
953 m_pPosButton = new CPWL_SBButton(m_sbType,PSBT_POS); | 953 if (pWnd == m_pPosButton) { |
954 m_pPosButton->SetVisible(FALSE); | 954 OnPosButtonLBUp(*(CPDF_Point*)lParam); |
955 m_pPosButton->Create(scp); | 955 } |
956 } | 956 break; |
957 } | 957 case PNM_MOUSEMOVE: |
958 | 958 if (pWnd == m_pMinButton) { |
959 FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const | 959 OnMinButtonMouseMove(*(CPDF_Point*)lParam); |
960 { | 960 } |
961 if (!IsVisible()) return 0; | 961 |
962 | 962 if (pWnd == m_pMaxButton) { |
963 return PWL_SCROLLBAR_WIDTH; | 963 OnMaxButtonMouseMove(*(CPDF_Point*)lParam); |
964 } | 964 } |
965 | 965 |
966 void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin,FX_FLOAT fMax,FX_FLOAT fClient
Width) | 966 if (pWnd == m_pPosButton) { |
967 { | 967 OnPosButtonMouseMove(*(CPDF_Point*)lParam); |
968 if (m_pPosButton) | 968 } |
969 { | 969 break; |
970 m_sData.SetScrollRange(fMin,fMax); | 970 case PNM_SETSCROLLINFO: { |
971 m_sData.SetClientWidth(fClientWidth); | 971 if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) { |
972 | 972 if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0) { |
973 if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) | 973 m_OriginInfo = *pInfo; |
974 { | 974 FX_FLOAT fMax = |
975 m_pPosButton->SetVisible(FALSE); | 975 pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth; |
976 } | 976 fMax = fMax > 0.0f ? fMax : 0.0f; |
977 else | 977 this->SetScrollRange(0, fMax, pInfo->fPlateWidth); |
978 { | 978 this->SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep); |
979 m_pPosButton->SetVisible(TRUE); | 979 } |
980 MovePosButton(TRUE); | 980 } |
981 } | 981 } break; |
982 } | 982 case PNM_SETSCROLLPOS: { |
983 } | 983 FX_FLOAT fPos = *(FX_FLOAT*)lParam; |
984 | 984 switch (this->m_sbType) { |
985 void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) | 985 case SBT_HSCROLL: |
986 { | 986 fPos = fPos - m_OriginInfo.fContentMin; |
987 FX_FLOAT fOldPos = m_sData.fScrollPos; | 987 break; |
988 | 988 case SBT_VSCROLL: |
989 m_sData.SetPos(fPos); | 989 fPos = m_OriginInfo.fContentMax - fPos; |
990 | 990 break; |
991 if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) | 991 } |
992 MovePosButton(TRUE); | 992 this->SetScrollPos(fPos); |
993 } | 993 } break; |
994 | 994 } |
995 void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep,FX_FLOAT fSmallStep) | 995 } |
996 { | 996 |
997 m_sData.SetBigStep(fBigStep); | 997 void CPWL_ScrollBar::CreateButtons(const PWL_CREATEPARAM& cp) { |
998 m_sData.SetSmallStep(fSmallStep); | 998 PWL_CREATEPARAM scp = cp; |
999 } | 999 scp.pParentWnd = this; |
1000 | 1000 scp.dwBorderWidth = 2; |
1001 void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh) | 1001 scp.nBorderStyle = PBS_BEVELED; |
1002 { | 1002 |
1003 ASSERT (m_pPosButton != NULL); | 1003 scp.dwFlags = |
1004 ASSERT (m_pMinButton != NULL); | 1004 PWS_VISIBLE | PWS_CHILD | PWS_BORDER | PWS_BACKGROUND | PWS_NOREFRESHCLIP; |
1005 ASSERT (m_pMaxButton != NULL); | 1005 |
1006 | 1006 if (!m_pMinButton) { |
1007 if (m_pPosButton->IsVisible()) | 1007 m_pMinButton = new CPWL_SBButton(m_sbType, PSBT_MIN); |
1008 { | 1008 m_pMinButton->Create(scp); |
1009 | 1009 } |
1010 | 1010 |
1011 | 1011 if (!m_pMaxButton) { |
1012 | 1012 m_pMaxButton = new CPWL_SBButton(m_sbType, PSBT_MAX); |
1013 CPDF_Rect rcClient; | 1013 m_pMaxButton->Create(scp); |
1014 CPDF_Rect rcPosArea,rcPosButton; | 1014 } |
1015 | 1015 |
1016 rcClient = this->GetClientRect(); | 1016 if (!m_pPosButton) { |
1017 rcPosArea = GetScrollArea(); | 1017 m_pPosButton = new CPWL_SBButton(m_sbType, PSBT_POS); |
1018 | 1018 m_pPosButton->SetVisible(FALSE); |
1019 FX_FLOAT fLeft,fRight,fTop,fBottom; | 1019 m_pPosButton->Create(scp); |
1020 | 1020 } |
1021 switch (m_sbType) | 1021 } |
1022 { | 1022 |
1023 case SBT_HSCROLL: | 1023 FX_FLOAT CPWL_ScrollBar::GetScrollBarWidth() const { |
1024 fLeft = TrueToFace(m_sData.fScrollPos); | 1024 if (!IsVisible()) |
1025 fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClient
Width); | 1025 return 0; |
1026 | 1026 |
1027 if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH) | 1027 return PWL_SCROLLBAR_WIDTH; |
1028 fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDT
H; | 1028 } |
1029 | 1029 |
1030 if (fRight > rcPosArea.right) | 1030 void CPWL_ScrollBar::SetScrollRange(FX_FLOAT fMin, |
1031 { | 1031 FX_FLOAT fMax, |
1032 fRight = rcPosArea.right; | 1032 FX_FLOAT fClientWidth) { |
1033 fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDT
H; | 1033 if (m_pPosButton) { |
1034 } | 1034 m_sData.SetScrollRange(fMin, fMax); |
1035 | 1035 m_sData.SetClientWidth(fClientWidth); |
1036 rcPosButton = CPDF_Rect(fLeft , | 1036 |
1037 rcPosArea.bottom
, | 1037 if (IsFloatSmaller(m_sData.ScrollRange.GetWidth(), 0.0f)) { |
1038 fRight , | 1038 m_pPosButton->SetVisible(FALSE); |
1039 rcPosArea.top); | 1039 } else { |
1040 | 1040 m_pPosButton->SetVisible(TRUE); |
1041 break; | 1041 MovePosButton(TRUE); |
1042 case SBT_VSCROLL: | 1042 } |
1043 fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClien
tWidth); | 1043 } |
1044 fTop = TrueToFace(m_sData.fScrollPos); | 1044 } |
1045 | 1045 |
1046 if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTT
ON_MINWIDTH)) | 1046 void CPWL_ScrollBar::SetScrollPos(FX_FLOAT fPos) { |
1047 fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDT
H; | 1047 FX_FLOAT fOldPos = m_sData.fScrollPos; |
1048 | 1048 |
1049 if (IsFloatSmaller(fBottom, rcPosArea.bottom)) | 1049 m_sData.SetPos(fPos); |
1050 { | 1050 |
1051 fBottom = rcPosArea.bottom; | 1051 if (!IsFloatEqual(m_sData.fScrollPos, fOldPos)) |
1052 fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDT
H; | 1052 MovePosButton(TRUE); |
1053 } | 1053 } |
1054 | 1054 |
1055 rcPosButton = CPDF_Rect(rcPosArea.left, | 1055 void CPWL_ScrollBar::SetScrollStep(FX_FLOAT fBigStep, FX_FLOAT fSmallStep) { |
1056 fBottom,
| 1056 m_sData.SetBigStep(fBigStep); |
1057 rcPosArea.right, | 1057 m_sData.SetSmallStep(fSmallStep); |
1058 fTop); | 1058 } |
1059 | 1059 |
1060 break; | 1060 void CPWL_ScrollBar::MovePosButton(FX_BOOL bRefresh) { |
1061 } | 1061 ASSERT(m_pPosButton != NULL); |
1062 | 1062 ASSERT(m_pMinButton != NULL); |
1063 m_pPosButton->Move(rcPosButton,TRUE,bRefresh); | 1063 ASSERT(m_pMaxButton != NULL); |
1064 } | 1064 |
1065 } | 1065 if (m_pPosButton->IsVisible()) { |
1066 | 1066 CPDF_Rect rcClient; |
1067 void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point & point) | 1067 CPDF_Rect rcPosArea, rcPosButton; |
1068 { | 1068 |
1069 m_sData.SubSmall(); | 1069 rcClient = this->GetClientRect(); |
1070 MovePosButton(TRUE); | 1070 rcPosArea = GetScrollArea(); |
1071 NotifyScrollWindow(); | 1071 |
1072 | 1072 FX_FLOAT fLeft, fRight, fTop, fBottom; |
1073 m_bMinOrMax = TRUE; | 1073 |
1074 | 1074 switch (m_sbType) { |
1075 EndTimer(); | 1075 case SBT_HSCROLL: |
1076 BeginTimer(100); | 1076 fLeft = TrueToFace(m_sData.fScrollPos); |
1077 } | 1077 fRight = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); |
1078 | 1078 |
1079 void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point & point) | 1079 if (fRight - fLeft < PWL_SCROLLBAR_POSBUTTON_MINWIDTH) |
1080 { | 1080 fRight = fLeft + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; |
1081 } | 1081 |
1082 | 1082 if (fRight > rcPosArea.right) { |
1083 void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point & point) | 1083 fRight = rcPosArea.right; |
1084 { | 1084 fLeft = fRight - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; |
1085 } | 1085 } |
1086 | 1086 |
1087 void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point & point) | 1087 rcPosButton = CPDF_Rect(fLeft, rcPosArea.bottom, fRight, rcPosArea.top); |
1088 { | 1088 |
1089 m_sData.AddSmall(); | 1089 break; |
1090 MovePosButton(TRUE); | 1090 case SBT_VSCROLL: |
1091 NotifyScrollWindow(); | 1091 fBottom = TrueToFace(m_sData.fScrollPos + m_sData.fClientWidth); |
1092 | 1092 fTop = TrueToFace(m_sData.fScrollPos); |
1093 m_bMinOrMax = FALSE; | 1093 |
1094 | 1094 if (IsFloatSmaller(fTop - fBottom, PWL_SCROLLBAR_POSBUTTON_MINWIDTH)) |
1095 EndTimer(); | 1095 fBottom = fTop - PWL_SCROLLBAR_POSBUTTON_MINWIDTH; |
1096 BeginTimer(100); | 1096 |
1097 } | 1097 if (IsFloatSmaller(fBottom, rcPosArea.bottom)) { |
1098 | 1098 fBottom = rcPosArea.bottom; |
1099 void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point & point) | 1099 fTop = fBottom + PWL_SCROLLBAR_POSBUTTON_MINWIDTH; |
1100 { | 1100 } |
1101 } | 1101 |
1102 | 1102 rcPosButton = CPDF_Rect(rcPosArea.left, fBottom, rcPosArea.right, fTop); |
1103 void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point & point) | 1103 |
1104 { | 1104 break; |
1105 } | 1105 } |
1106 | 1106 |
1107 void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point & point) | 1107 m_pPosButton->Move(rcPosButton, TRUE, bRefresh); |
1108 { | 1108 } |
1109 m_bMouseDown = TRUE; | 1109 } |
1110 | 1110 |
1111 if (m_pPosButton) | 1111 void CPWL_ScrollBar::OnMinButtonLBDown(const CPDF_Point& point) { |
1112 { | 1112 m_sData.SubSmall(); |
1113 CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); | 1113 MovePosButton(TRUE); |
1114 | 1114 NotifyScrollWindow(); |
1115 switch(m_sbType) | 1115 |
1116 { | 1116 m_bMinOrMax = TRUE; |
1117 case SBT_HSCROLL: | 1117 |
1118 m_nOldPos = point.x; | 1118 EndTimer(); |
1119 m_fOldPosButton = rcPosButton.left; | 1119 BeginTimer(100); |
1120 break; | 1120 } |
1121 case SBT_VSCROLL: | 1121 |
1122 m_nOldPos = point.y; | 1122 void CPWL_ScrollBar::OnMinButtonLBUp(const CPDF_Point& point) { |
1123 m_fOldPosButton = rcPosButton.top; | 1123 } |
1124 break; | 1124 |
1125 } | 1125 void CPWL_ScrollBar::OnMinButtonMouseMove(const CPDF_Point& point) { |
1126 } | 1126 } |
1127 } | 1127 |
1128 | 1128 void CPWL_ScrollBar::OnMaxButtonLBDown(const CPDF_Point& point) { |
1129 void CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point & point) | 1129 m_sData.AddSmall(); |
1130 { | 1130 MovePosButton(TRUE); |
1131 if (m_bMouseDown) | 1131 NotifyScrollWindow(); |
1132 { | 1132 |
1133 if (!m_bNotifyForever) | 1133 m_bMinOrMax = FALSE; |
1134 NotifyScrollWindow(); | 1134 |
1135 } | 1135 EndTimer(); |
1136 m_bMouseDown = FALSE; | 1136 BeginTimer(100); |
1137 } | 1137 } |
1138 | 1138 |
1139 void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point & point) | 1139 void CPWL_ScrollBar::OnMaxButtonLBUp(const CPDF_Point& point) { |
1140 { | 1140 } |
1141 FX_FLOAT fOldScrollPos = m_sData.fScrollPos; | 1141 |
1142 | 1142 void CPWL_ScrollBar::OnMaxButtonMouseMove(const CPDF_Point& point) { |
1143 FX_FLOAT fNewPos = 0; | 1143 } |
1144 | 1144 |
1145 switch (m_sbType) | 1145 void CPWL_ScrollBar::OnPosButtonLBDown(const CPDF_Point& point) { |
1146 { | 1146 m_bMouseDown = TRUE; |
1147 case SBT_HSCROLL: | 1147 |
1148 if (FXSYS_fabs(point.x - m_nOldPos) < 1) return; | 1148 if (m_pPosButton) { |
1149 fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos); | 1149 CPDF_Rect rcPosButton = m_pPosButton->GetWindowRect(); |
1150 break; | 1150 |
1151 case SBT_VSCROLL: | 1151 switch (m_sbType) { |
1152 if (FXSYS_fabs(point.y - m_nOldPos) < 1) return; | 1152 case SBT_HSCROLL: |
1153 fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos); | 1153 m_nOldPos = point.x; |
1154 break; | 1154 m_fOldPosButton = rcPosButton.left; |
1155 } | 1155 break; |
1156 | 1156 case SBT_VSCROLL: |
1157 if (m_bMouseDown) | 1157 m_nOldPos = point.y; |
1158 { | 1158 m_fOldPosButton = rcPosButton.top; |
1159 switch (m_sbType) | 1159 break; |
1160 { | 1160 } |
1161 case SBT_HSCROLL: | 1161 } |
1162 | 1162 } |
1163 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) | 1163 |
1164 { | 1164 void CPWL_ScrollBar::OnPosButtonLBUp(const CPDF_Point& point) { |
1165 fNewPos = m_sData.ScrollRange.fMin; | 1165 if (m_bMouseDown) { |
1166 } | 1166 if (!m_bNotifyForever) |
1167 | 1167 NotifyScrollWindow(); |
1168 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) | 1168 } |
1169 { | 1169 m_bMouseDown = FALSE; |
1170 fNewPos = m_sData.ScrollRange.fMax; | 1170 } |
1171 } | 1171 |
1172 | 1172 void CPWL_ScrollBar::OnPosButtonMouseMove(const CPDF_Point& point) { |
1173 m_sData.SetPos(fNewPos); | 1173 FX_FLOAT fOldScrollPos = m_sData.fScrollPos; |
1174 | 1174 |
1175 break; | 1175 FX_FLOAT fNewPos = 0; |
1176 case SBT_VSCROLL: | 1176 |
1177 | 1177 switch (m_sbType) { |
1178 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) | 1178 case SBT_HSCROLL: |
1179 { | 1179 if (FXSYS_fabs(point.x - m_nOldPos) < 1) |
1180 fNewPos = m_sData.ScrollRange.fMin; | 1180 return; |
1181 } | 1181 fNewPos = FaceToTrue(m_fOldPosButton + point.x - m_nOldPos); |
1182 | 1182 break; |
1183 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) | 1183 case SBT_VSCROLL: |
1184 { | 1184 if (FXSYS_fabs(point.y - m_nOldPos) < 1) |
1185 fNewPos = m_sData.ScrollRange.fMax; | 1185 return; |
1186 } | 1186 fNewPos = FaceToTrue(m_fOldPosButton + point.y - m_nOldPos); |
1187 | 1187 break; |
1188 m_sData.SetPos(fNewPos); | 1188 } |
1189 | 1189 |
1190 break; | 1190 if (m_bMouseDown) { |
1191 } | 1191 switch (m_sbType) { |
1192 | 1192 case SBT_HSCROLL: |
1193 if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) | 1193 |
1194 { | 1194 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { |
1195 MovePosButton(TRUE); | 1195 fNewPos = m_sData.ScrollRange.fMin; |
1196 | 1196 } |
1197 if (m_bNotifyForever) | 1197 |
1198 NotifyScrollWindow(); | 1198 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { |
1199 } | 1199 fNewPos = m_sData.ScrollRange.fMax; |
1200 } | 1200 } |
1201 } | 1201 |
1202 | 1202 m_sData.SetPos(fNewPos); |
1203 void CPWL_ScrollBar::NotifyScrollWindow() | 1203 |
1204 { | 1204 break; |
1205 if (CPWL_Wnd * pParent = this->GetParentWindow()) | 1205 case SBT_VSCROLL: |
1206 { | 1206 |
1207 FX_FLOAT fPos; | 1207 if (IsFloatSmaller(fNewPos, m_sData.ScrollRange.fMin)) { |
1208 switch (this->m_sbType) | 1208 fNewPos = m_sData.ScrollRange.fMin; |
1209 { | 1209 } |
1210 case SBT_HSCROLL: | 1210 |
1211 fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos; | 1211 if (IsFloatBigger(fNewPos, m_sData.ScrollRange.fMax)) { |
1212 break; | 1212 fNewPos = m_sData.ScrollRange.fMax; |
1213 case SBT_VSCROLL: | 1213 } |
1214 fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos; | 1214 |
1215 break; | 1215 m_sData.SetPos(fNewPos); |
1216 } | 1216 |
1217 pParent->OnNotify(this,PNM_SCROLLWINDOW,(FX_INTPTR)m_sbType,(FX_
INTPTR)&fPos); | 1217 break; |
1218 } | 1218 } |
1219 } | 1219 |
1220 | 1220 if (!IsFloatEqual(fOldScrollPos, m_sData.fScrollPos)) { |
1221 CPDF_Rect CPWL_ScrollBar::GetScrollArea() const | 1221 MovePosButton(TRUE); |
1222 { | 1222 |
1223 CPDF_Rect rcClient = GetClientRect(); | 1223 if (m_bNotifyForever) |
1224 CPDF_Rect rcArea; | 1224 NotifyScrollWindow(); |
1225 | 1225 } |
1226 if (!m_pMinButton || !m_pMaxButton)return rcClient; | 1226 } |
1227 | 1227 } |
1228 CPDF_Rect rcMin = m_pMinButton->GetWindowRect(); | 1228 |
1229 CPDF_Rect rcMax = m_pMaxButton->GetWindowRect(); | 1229 void CPWL_ScrollBar::NotifyScrollWindow() { |
1230 | 1230 if (CPWL_Wnd* pParent = this->GetParentWindow()) { |
1231 FX_FLOAT fMinWidth = rcMin.right - rcMin.left; | 1231 FX_FLOAT fPos; |
1232 FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom; | 1232 switch (this->m_sbType) { |
1233 FX_FLOAT fMaxWidth = rcMax.right - rcMax.left; | 1233 case SBT_HSCROLL: |
1234 FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom; | 1234 fPos = m_OriginInfo.fContentMin + m_sData.fScrollPos; |
1235 | 1235 break; |
1236 switch(m_sbType) | 1236 case SBT_VSCROLL: |
1237 { | 1237 fPos = m_OriginInfo.fContentMax - m_sData.fScrollPos; |
1238 case SBT_HSCROLL: | 1238 break; |
1239 if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) | 1239 } |
1240 { | 1240 pParent->OnNotify( |
1241 rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClien
t.bottom, | 1241 this, PNM_SCROLLWINDOW, (FX_INTPTR)m_sbType, (FX_INTPTR)&fPos); |
1242 rcClient.right - fMaxWidth - 1,r
cClient.top); | 1242 } |
1243 } | 1243 } |
1244 else | 1244 |
1245 { | 1245 CPDF_Rect CPWL_ScrollBar::GetScrollArea() const { |
1246 rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1,rcClien
t.bottom, | 1246 CPDF_Rect rcClient = GetClientRect(); |
1247 rcClient.left + fMinWidth + 1,rc
Client.top); | 1247 CPDF_Rect rcArea; |
1248 } | 1248 |
1249 break; | 1249 if (!m_pMinButton || !m_pMaxButton) |
1250 case SBT_VSCROLL: | 1250 return rcClient; |
1251 if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2
) | 1251 |
1252 { | 1252 CPDF_Rect rcMin = m_pMinButton->GetWindowRect(); |
1253 rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinH
eight + 1, | 1253 CPDF_Rect rcMax = m_pMaxButton->GetWindowRect(); |
1254 rcClient.right,rcClient.top - fM
axHeight - 1); | 1254 |
1255 } | 1255 FX_FLOAT fMinWidth = rcMin.right - rcMin.left; |
1256 else | 1256 FX_FLOAT fMinHeight = rcMin.top - rcMin.bottom; |
1257 { | 1257 FX_FLOAT fMaxWidth = rcMax.right - rcMax.left; |
1258 rcArea = CPDF_Rect(rcClient.left,rcClient.bottom + fMinH
eight + 1, | 1258 FX_FLOAT fMaxHeight = rcMax.top - rcMax.bottom; |
1259 rcClient.right,rcClient.bottom +
fMinHeight + 1); | 1259 |
1260 } | 1260 switch (m_sbType) { |
1261 break; | 1261 case SBT_HSCROLL: |
1262 } | 1262 if (rcClient.right - rcClient.left > fMinWidth + fMaxWidth + 2) { |
1263 | 1263 rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1, |
1264 rcArea.Normalize(); | 1264 rcClient.bottom, |
1265 | 1265 rcClient.right - fMaxWidth - 1, |
1266 return rcArea; | 1266 rcClient.top); |
1267 } | 1267 } else { |
1268 | 1268 rcArea = CPDF_Rect(rcClient.left + fMinWidth + 1, |
1269 FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) | 1269 rcClient.bottom, |
1270 { | 1270 rcClient.left + fMinWidth + 1, |
1271 CPDF_Rect rcPosArea; | 1271 rcClient.top); |
1272 rcPosArea = GetScrollArea(); | 1272 } |
1273 | 1273 break; |
1274 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWi
dth; | 1274 case SBT_VSCROLL: |
1275 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; | 1275 if (rcClient.top - rcClient.bottom > fMinHeight + fMaxHeight + 2) { |
1276 | 1276 rcArea = CPDF_Rect(rcClient.left, |
1277 FX_FLOAT fFace = 0; | 1277 rcClient.bottom + fMinHeight + 1, |
1278 | 1278 rcClient.right, |
1279 switch(m_sbType) | 1279 rcClient.top - fMaxHeight - 1); |
1280 { | 1280 } else { |
1281 case SBT_HSCROLL: | 1281 rcArea = CPDF_Rect(rcClient.left, |
1282 fFace = rcPosArea.left + fTrue * (rcPosArea.right - rcPosArea.le
ft) / fFactWidth; | 1282 rcClient.bottom + fMinHeight + 1, |
1283 break; | 1283 rcClient.right, |
1284 case SBT_VSCROLL: | 1284 rcClient.bottom + fMinHeight + 1); |
1285 fFace = rcPosArea.top - fTrue * (rcPosArea.top - rcPosArea.botto
m) / fFactWidth; | 1285 } |
1286 break; | 1286 break; |
1287 } | 1287 } |
1288 | 1288 |
1289 return fFace; | 1289 rcArea.Normalize(); |
1290 } | 1290 |
1291 | 1291 return rcArea; |
1292 FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) | 1292 } |
1293 { | 1293 |
1294 CPDF_Rect rcPosArea; | 1294 FX_FLOAT CPWL_ScrollBar::TrueToFace(FX_FLOAT fTrue) { |
1295 rcPosArea = GetScrollArea(); | 1295 CPDF_Rect rcPosArea; |
1296 | 1296 rcPosArea = GetScrollArea(); |
1297 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWi
dth; | 1297 |
1298 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; | 1298 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; |
1299 | 1299 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; |
1300 FX_FLOAT fTrue = 0; | 1300 |
1301 | 1301 FX_FLOAT fFace = 0; |
1302 switch(m_sbType) | 1302 |
1303 { | 1303 switch (m_sbType) { |
1304 case SBT_HSCROLL: | 1304 case SBT_HSCROLL: |
1305 fTrue = (fFace - rcPosArea.left) * fFactWidth / (rcPosArea.righ
t - rcPosArea.left); | 1305 fFace = rcPosArea.left + |
1306 break; | 1306 fTrue * (rcPosArea.right - rcPosArea.left) / fFactWidth; |
1307 case SBT_VSCROLL: | 1307 break; |
1308 fTrue = (rcPosArea.top - fFace) * fFactWidth / (rcPosArea.top -
rcPosArea.bottom); | 1308 case SBT_VSCROLL: |
1309 break; | 1309 fFace = rcPosArea.top - |
1310 } | 1310 fTrue * (rcPosArea.top - rcPosArea.bottom) / fFactWidth; |
1311 | 1311 break; |
1312 return fTrue; | 1312 } |
1313 } | 1313 |
1314 | 1314 return fFace; |
1315 void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM & cp) | 1315 } |
1316 { | 1316 |
1317 CreateButtons(cp); | 1317 FX_FLOAT CPWL_ScrollBar::FaceToTrue(FX_FLOAT fFace) { |
1318 } | 1318 CPDF_Rect rcPosArea; |
1319 | 1319 rcPosArea = GetScrollArea(); |
1320 void CPWL_ScrollBar::TimerProc() | 1320 |
1321 { | 1321 FX_FLOAT fFactWidth = m_sData.ScrollRange.GetWidth() + m_sData.fClientWidth; |
1322 PWL_SCROLL_PRIVATEDATA sTemp = m_sData; | 1322 fFactWidth = fFactWidth == 0 ? 1 : fFactWidth; |
1323 | 1323 |
1324 if (m_bMinOrMax)m_sData.SubSmall(); | 1324 FX_FLOAT fTrue = 0; |
1325 else m_sData.AddSmall(); | 1325 |
1326 | 1326 switch (m_sbType) { |
1327 if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) | 1327 case SBT_HSCROLL: |
1328 { | 1328 fTrue = (fFace - rcPosArea.left) * fFactWidth / |
1329 MovePosButton(TRUE); | 1329 (rcPosArea.right - rcPosArea.left); |
1330 NotifyScrollWindow(); | 1330 break; |
1331 } | 1331 case SBT_VSCROLL: |
| 1332 fTrue = (rcPosArea.top - fFace) * fFactWidth / |
| 1333 (rcPosArea.top - rcPosArea.bottom); |
| 1334 break; |
| 1335 } |
| 1336 |
| 1337 return fTrue; |
| 1338 } |
| 1339 |
| 1340 void CPWL_ScrollBar::CreateChildWnd(const PWL_CREATEPARAM& cp) { |
| 1341 CreateButtons(cp); |
| 1342 } |
| 1343 |
| 1344 void CPWL_ScrollBar::TimerProc() { |
| 1345 PWL_SCROLL_PRIVATEDATA sTemp = m_sData; |
| 1346 |
| 1347 if (m_bMinOrMax) |
| 1348 m_sData.SubSmall(); |
| 1349 else |
| 1350 m_sData.AddSmall(); |
| 1351 |
| 1352 if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) { |
| 1353 MovePosButton(TRUE); |
| 1354 NotifyScrollWindow(); |
| 1355 } |
1332 } | 1356 } |
1333 | 1357 |
1334 /* | 1358 /* |
1335 void CPWL_ScrollBar::OnSetFocus() | 1359 void CPWL_ScrollBar::OnSetFocus() |
1336 { | 1360 { |
1337 » if (GetTransparency() != 255) | 1361 if (GetTransparency() != 255) |
1338 » { | 1362 { |
1339 » » SetTransparency(255); | 1363 SetTransparency(255); |
1340 » » InvalidateRect(); | 1364 InvalidateRect(); |
1341 » } | 1365 } |
1342 } | 1366 } |
1343 | 1367 |
1344 void CPWL_ScrollBar::OnKillFocus() | 1368 void CPWL_ScrollBar::OnKillFocus() |
1345 { | 1369 { |
1346 » if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) | 1370 if (GetTransparency() != PWL_SCROLLBAR_TRANSPARANCY) |
1347 » { | 1371 { |
1348 » » SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); | 1372 SetTransparency(PWL_SCROLLBAR_TRANSPARANCY); |
1349 » » InvalidateRect(); | 1373 InvalidateRect(); |
1350 » } | 1374 } |
1351 } | 1375 } |
1352 */ | 1376 */ |
1353 | |
OLD | NEW |