/********************************************************************* * * WIDGET_OrState */ void WIDGET_OrState(WM_HWIN hObj, int State) { WIDGET* pWidget = WIDGET_H2P(hObj); if (State != (pWidget->State & State)) { pWidget->State |= State; WM_Invalidate(hObj); } }
/********************************************************************* * * WIDGET_SetState */ void WIDGET_SetState(WM_HWIN hObj, int State) { WIDGET* pWidget = WIDGET_H2P(hObj); if (State != pWidget->State) { pWidget->State = State; WM_Invalidate(hObj); } }
/******************************************************************* * * WIDGET__GetWindowSizeX Return width (or height in case of rotation) of window in pixels */ int WIDGET__GetWindowSizeX(WM_HWIN hWin) { WIDGET* pWidget = WIDGET_H2P(hWin); if (pWidget->State & WIDGET_STATE_VERTICAL) { return WM_GetWindowSizeY(hWin); } else { return WM_GetWindowSizeX(hWin); } }
/********************************************************************* * * WIDGET_AndState Purpose: Clear flags in the State element of the widget. The bits to be cleared are set. Example: ...(..., 3); // Clears bit 0, 1 int the state member */ void WIDGET_AndState(WM_HWIN hObj, int Mask) { U16 StateNew; WIDGET* pWidget = WIDGET_H2P(hObj); StateNew = pWidget->State & (~Mask); if (pWidget->State != StateNew) { pWidget->State = StateNew; WM_Invalidate(hObj); } }
/********************************************************************* * * WIDGET_GetState */ int WIDGET_GetState(WM_HWIN hObj) { int Ret = 0; WIDGET * pWidget; if (hObj) { WM_LOCK(); pWidget = WIDGET_H2P(hObj); Ret = pWidget->State; WM_UNLOCK(); } return Ret; }
/********************************************************************* * * WIDGET_Enable */ void WIDGET_Enable(WM_HWIN hObj) { WIDGET* pWidget; if (hObj) { WM_LOCK(); pWidget = WIDGET_H2P(hObj); if ((pWidget->State & WIDGET_STATE_ENABLED) == 0) { pWidget->State |= WIDGET_STATE_ENABLED; WM_Invalidate(hObj); } WM_UNLOCK(); } }
/********************************************************************* * * WIDGET_SetWidth * * Function: * Set width of the given widget. Width can be X-Size or Y-Size, * depending on if the widget is rotated. */ int WIDGET_SetWidth(WM_HWIN hObj, int Width) { WIDGET* pWidget; int r = 0; if (hObj) { WM_LOCK(); pWidget = WIDGET_H2P(hObj); if (pWidget->State & WIDGET_STATE_VERTICAL) { r = WM_SetXSize(hObj, Width); } else { r = WM_SetYSize(hObj, Width); } WM_UNLOCK(); } return r; }
/********************************************************************* * * WIDGET_HandleActive */ int WIDGET_HandleActive(WM_HWIN hObj, WM_MESSAGE* pMsg) { WM_MESSAGE Msg; WIDGET* pWidget = WIDGET_H2P(hObj); switch (pMsg->MsgId) { case WM_GET_ID: pMsg->Data.v = pWidget->Id; return 0; /* Message handled -> Return */ case WM_SET_FOCUS: if (pMsg->Data.v == 1) { WIDGET_SetState(hObj, pWidget->State | WIDGET_STATE_FOCUS); } else { WIDGET_SetState(hObj, pWidget->State & ~WIDGET_STATE_FOCUS); } Msg.MsgId = WM_NOTIFY_CHILD_HAS_FOCUS; Msg.Data.v = pMsg->Data.v; WM_SendToParent(hObj, &Msg); return 0; case WM_GET_HAS_FOCUS: pMsg->Data.v = pWidget->State & WIDGET_STATE_FOCUS; return 0; /* Message handled */ case WM_SET_ENABLE: if (pMsg->Data.v) { WIDGET_OrState(hObj, WIDGET_STATE_ENABLED); } else { WIDGET_AndState(hObj, WIDGET_STATE_ENABLED); } case WM_GET_ACCEPT_FOCUS: pMsg->Data.v = (pWidget->State & WIDGET_STATE_FOCUSSABLE) ? 1 : 0; /* Can handle focus */ return 0; /* Message handled */ case WM_GET_INSIDE_RECT: WIDGET__GetInsideRect(pWidget, (GUI_RECT*)pMsg->Data.p); return 0; /* Message handled */ } return 1; /* Message NOT handled */ }
/********************************************************************* * * WIDGET_HandleActive */ int WIDGET_HandleActive(WM_HWIN hObj, WM_MESSAGE* pMsg) { int Diff, Notification; WIDGET* pWidget = WIDGET_H2P(hObj); switch (pMsg->MsgId) { case WM_WIDGET_SET_EFFECT: Diff = pWidget->pEffect->EffectSize; pWidget->pEffect = (const WIDGET_EFFECT*)pMsg->Data.p; Diff -= pWidget->pEffect->EffectSize; _UpdateChildPostions(hObj, Diff); WM_InvalidateWindow(hObj); return 0; /* Message handled -> Return */ case WM_GET_ID: pMsg->Data.v = pWidget->Id; return 0; /* Message handled -> Return */ case WM_PID_STATE_CHANGED: if (pWidget->State & WIDGET_STATE_FOCUSSABLE) { const WM_PID_STATE_CHANGED_INFO * pInfo = (const WM_PID_STATE_CHANGED_INFO*)pMsg->Data.p; if (pInfo->State) { WM_SetFocus(hObj); } } break; case WM_TOUCH_CHILD: /* A descendent (child) has been touched or released. If it has been touched, we need to get to top. */ { const WM_MESSAGE * pMsgOrg; const GUI_PID_STATE * pState; pMsgOrg = (const WM_MESSAGE*)pMsg->Data.p; /* The original touch message */ pState = (const GUI_PID_STATE*)pMsgOrg->Data.p; if (pState) { /* Message may not have a valid pointer (moved out) ! */ if (pState->Pressed) { WM_BringToTop(hObj); return 0; /* Message handled -> Return */ } } } break; case WM_SET_ID: pWidget->Id = pMsg->Data.v; return 0; /* Message handled -> Return */ case WM_SET_FOCUS: if (pMsg->Data.v == 1) { WIDGET_SetState(hObj, pWidget->State | WIDGET_STATE_FOCUS); Notification = WM_NOTIFICATION_GOT_FOCUS; } else { WIDGET_SetState(hObj, pWidget->State & ~WIDGET_STATE_FOCUS); Notification = WM_NOTIFICATION_LOST_FOCUS; } WM_NotifyParent(hObj, Notification); pMsg->Data.v = 0; /* Focus change accepted */ return 0; case WM_GET_ACCEPT_FOCUS: pMsg->Data.v = (pWidget->State & WIDGET_STATE_FOCUSSABLE) ? 1 : 0; /* Can handle focus */ return 0; /* Message handled */ case WM_GET_INSIDE_RECT: WIDGET__GetInsideRect(pWidget, (GUI_RECT*)pMsg->Data.p); return 0; /* Message handled */ } return 1; /* Message NOT handled */ }