2#include <core/SScrollBarHandler.h>
10 , m_fadeMode(FADE_STOP)
25 SASSERT(m_fadeMode != FADE_STOP);
26 if (m_iFrame > 0 && m_iFrame < m_pSbHost->GetScrollFadeFrames())
29 m_pSbHost->OnScrollUpdatePart(m_bVert, -1);
33 m_fadeMode = FADE_STOP;
40 SASSERT(m_pSbHost->GetScrollBarSkin(m_bVert));
41 const SCROLLINFO *pSi = m_pSbHost->GetScrollBarInfo(m_bVert);
42 __int64 nTrackPos = pSi->nTrackPos;
46 if (nMax < pSi->nMin + (
int)pSi->nPage - 1)
47 nMax = pSi->nMin + pSi->nPage - 1;
50 nTrackPos = pSi->nPos;
51 CRect rcAll = m_pSbHost->GetScrollBarRect(m_bVert);
52 int nLength = (
IsVertical() ? rcAll.Height() : rcAll.Width());
56 int nArrowHei = m_pSbHost->GetScrollBarArrowSize(m_bVert);
57 int nInterHei = nLength - 2 * nArrowHei;
60 int nSlideHei = pSi->nPage * nInterHei / (nMax - pSi->nMin + 1);
61 if (nMax == (
int)(pSi->nMin + pSi->nPage - 1))
62 nSlideHei = nInterHei;
67 int nEmptyHei = nInterHei - nSlideHei;
69 nArrowHei = nLength / 2;
70 CRect rcRet(0, 0, rcAll.Width(), nArrowHei);
73 rcRet = CRect(0, 0, rcAll.Width(), nLength);
74 rcRet.DeflateRect(0, nArrowHei);
77 if (iPart == SB_LINEUP)
79 rcRet.top = rcRet.bottom;
80 if ((pSi->nMax - pSi->nMin - pSi->nPage + 1) == 0)
81 rcRet.bottom += nEmptyHei / 2;
83 rcRet.bottom += (int)(nEmptyHei * nTrackPos / (pSi->nMax - pSi->nMin - pSi->nPage + 1));
84 if (iPart == SB_PAGEUP)
86 rcRet.top = rcRet.bottom;
87 rcRet.bottom += nSlideHei;
88 if (iPart == SB_THUMBTRACK)
90 rcRet.top = rcRet.bottom;
91 rcRet.bottom = nLength - nArrowHei;
92 if (iPart == SB_PAGEDOWN)
94 rcRet.top = rcRet.bottom;
95 rcRet.bottom = nLength;
96 if (iPart == SB_LINEDOWN)
101 rcRet.left = rcRet.top;
102 rcRet.right = rcRet.bottom;
104 rcRet.bottom = rcAll.Height();
106 rcRet.OffsetRect(rcAll.TopLeft());
117 return m_pSbHost->GetScrollBarContainer();
122 return m_pSbHost->GetScrollInterpolator();
128 static const int parts[] = {
129 SB_LINEUP, SB_PAGEUP, SB_THUMBTRACK, SB_PAGEDOWN, SB_LINEDOWN,
131 for (
int i = 0; i < ARRAYSIZE(parts); i++)
144 if (iPart == kSbRail)
152 if (
id == IScrollBarHost::Timer_Wait)
154 m_pSbHost->OnScrollKillTimer(m_bVert, IScrollBarHost::Timer_Wait);
155 m_pSbHost->OnScrollSetTimer(m_bVert, IScrollBarHost::Timer_Go, IScrollBarHost::kTime_Go);
157 else if (
id == IScrollBarHost::Timer_Go)
159 SASSERT(m_iClickPart != -1);
160 SASSERT(m_iClickPart != SB_THUMBTRACK);
161 if (m_iClickPart == m_iHitPart)
163 if (m_iClickPart == SB_PAGEUP || m_iClickPart == SB_PAGEDOWN)
165 int iHitPart =
HitTest(m_ptCursor);
166 if (iHitPart == SB_THUMBTRACK)
169 m_pSbHost->OnScrollCommand(m_bVert, m_iClickPart, 0);
176 if (m_fadeMode != FADE_STOP)
178 m_fadeMode = FADE_STOP;
185 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
188 if (m_iClickPart == SB_THUMBTRACK)
191 if (m_iClickPart == -1)
193 if (m_pSbHost->GetScrollFadeFrames() > 0)
203 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iClickPart);
209 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
212 if (m_iClickPart == SB_THUMBTRACK)
215 int iOldHit = m_iHitPart;
218 if (m_iClickPart == -1)
220 if (m_pSbHost->GetScrollFadeFrames() == 0)
223 m_pSbHost->OnScrollUpdatePart(m_bVert, iOldHit);
227 m_iFrame = m_pSbHost->GetScrollFadeFrames() - 1;
228 m_fadeMode = FADEOUT;
234 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iClickPart);
240 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
245 if (m_iClickPart == -1)
247 if (iNewHit != m_iHitPart)
249 int iOldHit = m_iHitPart;
250 m_iHitPart = iNewHit;
252 m_pSbHost->OnScrollUpdatePart(m_bVert, iOldHit);
253 if (m_iHitPart != -1)
254 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iHitPart);
257 else if (m_iClickPart == SB_THUMBTRACK)
259 CRect rcWnd = m_pSbHost->GetScrollBarRect(m_bVert);
260 int nInterHei = (
IsVertical() ? rcWnd.Height() : rcWnd.Width()) - 2 * m_pSbHost->GetScrollBarArrowSize(m_bVert);
261 const SCROLLINFO *psi = m_pSbHost->GetScrollBarInfo(m_bVert);
262 int nSlideHei = psi->nPage * nInterHei / (psi->nMax - psi->nMin + 1);
267 int nEmptyHei = nInterHei - nSlideHei;
268 int nDragLen =
IsVertical() ? (pt.y - m_ptClick.y) : (pt.x - m_ptClick.x);
269 int nSlide = (int)((nEmptyHei == 0) ? 0 : (nDragLen * (__int64)(psi->nMax - psi->nMin - psi->nPage + 1) / nEmptyHei));
270 int nNewTrackPos = m_nClickPos + nSlide;
271 if (nNewTrackPos < psi->nMin)
273 nNewTrackPos = psi->nMin;
275 else if (nNewTrackPos > (
int)(psi->nMax - psi->nMin - psi->nPage + 1))
277 nNewTrackPos = psi->nMax - psi->nMin - psi->nPage + 1;
279 if (nNewTrackPos != psi->nTrackPos)
281 m_pSbHost->OnScrollUpdateThumbTrack(m_bVert, nNewTrackPos);
283 m_iHitPart = iNewHit;
285 else if (m_iHitPart != iNewHit)
287 m_iHitPart = iNewHit;
288 if (m_iHitPart == m_iClickPart)
290 m_pSbHost->OnScrollSetTimer(m_bVert, IScrollBarHost::Timer_Go, IScrollBarHost::kTime_Go);
294 m_pSbHost->OnScrollKillTimer(m_bVert, IScrollBarHost::Timer_Go);
296 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iClickPart);
302 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
305 int iClickPart = m_iClickPart;
306 SASSERT(iClickPart != -1);
309 m_pSbHost->OnScrollUpdatePart(m_bVert, iClickPart);
310 if (m_iHitPart != -1 && m_iHitPart != iClickPart)
312 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iHitPart);
314 m_pSbHost->OnScrollKillTimer(m_bVert, IScrollBarHost::Timer_Wait);
315 m_pSbHost->OnScrollKillTimer(m_bVert, IScrollBarHost::Timer_Go);
317 if (iClickPart == SB_THUMBTRACK)
319 const SCROLLINFO *psi = m_pSbHost->GetScrollBarInfo(m_bVert);
320 if (psi->nTrackPos != -1)
321 m_pSbHost->OnScrollCommand(m_bVert, SB_THUMBPOSITION, psi->nTrackPos);
324 if (iClickPart != -1 && m_iHitPart == -1)
332 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
335 if (iClickPart == -1)
337 m_iClickPart = iClickPart;
339 if (m_fadeMode != FADE_STOP)
341 m_iFrame = m_pSbHost->GetScrollFadeFrames();
342 m_pSbHost->OnScrollUpdatePart(m_bVert, -1);
346 m_pSbHost->OnScrollUpdatePart(m_bVert, m_iHitPart);
349 const SCROLLINFO *psi = m_pSbHost->GetScrollBarInfo(m_bVert);
350 if (iClickPart != SB_THUMBTRACK)
351 m_pSbHost->OnScrollCommand(m_bVert, iClickPart, 0);
353 m_nClickPos = psi->nPos;
355 switch (m_iClickPart)
361 m_pSbHost->OnScrollSetTimer(m_bVert, IScrollBarHost::Timer_Wait, IScrollBarHost::kTime_Wait);
369 if (m_pSbHost->GetScrollFadeFrames() <= 0)
371 float fProg =
GetInterpolator()->getInterpolation(m_iFrame * 1.0f / m_pSbHost->GetScrollFadeFrames());
372 if (iPart == SB_THUMBTRACK)
374 return (BYTE)(fProg * (0xFF - m_pSbHost->GetScrollThumbTrackMinAlpha()) + m_pSbHost->GetScrollThumbTrackMinAlpha());
378 return (BYTE)(fProg * 0xFF);
408 if (iPart == kSbRail)
410 if (!m_pSbHost->IsScrollBarEnable(m_bVert))
411 return SBST_INACTIVE;
413 DWORD dwState = SBST_NORMAL;
414 if (iPart == m_iClickPart && (m_iClickPart == m_iHitPart || m_iClickPart == SB_THUMBTRACK))
415 dwState = SBST_PUSHDOWN;
416 else if (iPart == m_iHitPart)
417 dwState = SBST_HOVER;
#define MAKESBSTATE(sbCode, nState1, bVertical)
Macro to create a scrollbar state code.
#define THUMB_MINSIZE
Minimum size for the scrollbar thumb.
Interface for rendering target objects.
SOUI Window Container Interface.
BOOL RegisterTimelineHandler(ITimelineHandler *pHandler) PURE
Registers an animation frame handler.
BOOL UnregisterTimelineHandler(ITimelineHandler *pHandler) PURE
Unregisters an animation frame handler.