/********************************************************************* * * _SCROLLBAR_Callback */ static void _SCROLLBAR_Callback (WM_MESSAGE *pMsg) { SCROLLBAR_Handle hObj; SCROLLBAR_Obj* pObj; hObj = pMsg->hWin; pObj = SCROLLBAR_H2P(hObj); /* Let widget handle the standard messages */ if (WIDGET_HandleActive(hObj, pMsg) == 0) { return; } switch (pMsg->MsgId) { case WM_DELETE: SCROLLBAR__InvalidatePartner(hObj); break; case WM_PAINT: GUI_DEBUG_LOG("SCROLLBAR: _Callback(WM_PAINT)\n"); _Paint(pObj); return; case WM_TOUCH: _OnTouch(hObj, pObj, pMsg); break; case WM_KEY: _OnKey(hObj, pMsg); break; case WM_SET_SCROLL_STATE: _OnSetScrollState(hObj, pObj, (const WM_SCROLL_STATE*)pMsg->Data.p); break; case WM_GET_SCROLL_STATE: ((WM_SCROLL_STATE*)pMsg->Data.p)->NumItems = pObj->NumItems; ((WM_SCROLL_STATE*)pMsg->Data.p)->PageSize = pObj->PageSize; ((WM_SCROLL_STATE*)pMsg->Data.p)->v = pObj->v; break; } WM_DefaultProc(pMsg); }
/********************************************************************* * * SCROLLBAR_AddValue */ void SCROLLBAR_AddValue(SCROLLBAR_Handle hObj, int Add) { SCROLLBAR_Obj* pObj; if (hObj) { WM_LOCK(); pObj = SCROLLBAR_H2P(hObj); SCROLLBAR_SetValue(hObj, pObj->v + Add); WM_UNLOCK(); } }
/********************************************************************* * * SCROLLBAR_CreateEx */ SCROLLBAR_Handle SCROLLBAR_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags, int Id) { SCROLLBAR_Handle hObj; WM_LOCK(); /* Set defaults if necessary */ if ((xsize == 0) && (ysize == 0)) { GUI_RECT Rect; WM_GetInsideRectEx(hParent, &Rect); if (ExFlags & SCROLLBAR_CF_VERTICAL) { xsize = SCROLLBAR__DefaultWidth; x0 = Rect.x1 + 1 - xsize; y0 = Rect.y0; ysize = Rect.y1 - Rect.y0 + 1; } else { ysize = SCROLLBAR__DefaultWidth; y0 = Rect.y1 + 1 - ysize; x0 = Rect.x0; xsize = Rect.x1 - Rect.x0 + 1; } } /* Create the window */ hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, _SCROLLBAR_Callback, sizeof(SCROLLBAR_Obj) - sizeof(WM_Obj)); if (hObj) { SCROLLBAR_Obj* pObj = SCROLLBAR_H2P(hObj); U16 InitState; /* Handle SpecialFlags */ InitState = 0; if (ExFlags & SCROLLBAR_CF_VERTICAL) { InitState |= WIDGET_CF_VERTICAL; } if (ExFlags & SCROLLBAR_CF_FOCUSSABLE) { InitState |= WIDGET_STATE_FOCUSSABLE; } if ((Id != GUI_ID_HSCROLL) && (Id != GUI_ID_VSCROLL)) { InitState |= WIDGET_STATE_FOCUSSABLE; } /* init widget specific variables */ WIDGET__Init(&pObj->Widget, Id, InitState); /* init member variables */ SCROLLBAR_INIT_ID(pObj); pObj->aBkColor[0] = SCROLLBAR__aDefaultBkColor[0]; pObj->aBkColor[1] = SCROLLBAR__aDefaultBkColor[1]; pObj->aColor[0] = SCROLLBAR__aDefaultColor[0]; pObj->aColor[1] = SCROLLBAR__aDefaultColor[1]; pObj->NumItems = 100; pObj->PageSize = 10; pObj->v = 0; SCROLLBAR__InvalidatePartner(hObj); } else { GUI_DEBUG_ERROROUT_IF(hObj==0, "SCROLLBAR_Create failed") } WM_UNLOCK(); return hObj; }
/********************************************************************* * * SCROLLBAR_GetValue */ int SCROLLBAR_GetValue(SCROLLBAR_Handle hObj) { int r = 0; SCROLLBAR_Obj* pObj; if (hObj) { WM_LOCK(); pObj = SCROLLBAR_H2P(hObj); r = pObj->v; WM_UNLOCK(); } return r; }
/********************************************************************* * * SCROLLBAR_SetPageSize */ void SCROLLBAR_SetPageSize(SCROLLBAR_Handle hObj, int PageSize) { SCROLLBAR_Obj* pObj; if (hObj) { WM_LOCK(); pObj = SCROLLBAR_H2P(hObj); if (pObj->PageSize != PageSize) { pObj->PageSize = PageSize; WM_InvalidateWindow(hObj); } WM_UNLOCK(); } }
/********************************************************************* * * SCROLLBAR_SetNumItems */ void SCROLLBAR_SetNumItems(SCROLLBAR_Handle hObj, int NumItems) { SCROLLBAR_Obj* pObj; if (hObj) { WM_LOCK(); pObj = SCROLLBAR_H2P(hObj); if (pObj->NumItems != NumItems) { pObj->NumItems = NumItems; WM_InvalidateWindow(hObj); } WM_UNLOCK(); } }
/********************************************************************* * * SCROLLBAR_SetValue */ void SCROLLBAR_SetValue(SCROLLBAR_Handle hObj, int v) { SCROLLBAR_Obj* pObj; int Max; if (hObj) { WM_LOCK(); pObj = SCROLLBAR_H2P(hObj); Max = pObj->NumItems - pObj->PageSize; if (Max < 0) Max =0; /* Put in min/max range */ if (v < 0) { v = 0; } if (v > Max) { v = Max; } if (pObj->v != v) { pObj->v = v; WM_InvalidateWindow(hObj); WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED); } WM_UNLOCK(); } }