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