system/lib/lcd/gui/Widget/RADIO_SetGroupId.c

182 lines
5.3 KiB
C

/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* µC/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*
----------------------------------------------------------------------
File : RADIO_SetGroupId.c
Purpose : Implementation of RADIO widget
---------------------------END-OF-HEADER------------------------------
*/
#include <stdlib.h>
#include "RADIO.h"
#include "RADIO_Private.h"
#if GUI_WINSUPPORT
/*********************************************************************
*
* static code
*
**********************************************************************
*/
/*********************************************************************
*
* _SetValue
*/
static void _SetValue(RADIO_Handle hObj, int v) {
RADIO_Obj* pObj;
pObj = RADIO_H2P(hObj);
RADIO__SetValue(hObj, pObj, v);
}
/*********************************************************************
*
* _IsInGroup
*/
static int _IsInGroup(WM_HWIN hWin, U8 GroupId) {
if (GroupId) {
WM_MESSAGE Msg;
Msg.MsgId = WM_GET_RADIOGROUP;
WM_SendMessage(hWin, &Msg);
return (Msg.Data.v == GroupId);
}
return 0;
}
/*********************************************************************
*
* _GetPrevInGroup
*/
static WM_HWIN _GetPrevInGroup(WM_HWIN hWin, U8 GroupId) {
for (hWin = WM__GetPrevSibling(hWin); hWin; hWin = WM__GetPrevSibling(hWin)) {
if (_IsInGroup(hWin, GroupId)) {
return hWin;
}
}
return 0;
}
/*********************************************************************
*
* _GetNextInGroup
*/
static WM_HWIN _GetNextInGroup(WM_HWIN hWin, U8 GroupId) {
for (; hWin; hWin = WM_GetNextSibling(hWin)) {
if (_IsInGroup(hWin, GroupId)) {
return hWin;
}
}
return 0;
}
/*********************************************************************
*
* _ClearSelection
*/
static void _ClearSelection(RADIO_Handle hObj, U8 GroupId) {
WM_HWIN hWin;
WM_Obj* pWin;
for (hWin = WM__GetFirstSibling(hObj); hWin; hWin = pWin->hNext) {
pWin = WM_H2P(hWin);
if (hWin != hObj) {
if (_IsInGroup(hWin, GroupId)) {
RADIO__SetValue(hWin, (RADIO_Obj*)pWin, -1);
}
}
}
}
/*********************************************************************
*
* _HandleSetValue
*/
static void _HandleSetValue(RADIO_Handle hObj, RADIO_Obj* pObj, int v) {
if (v < 0) {
WM_HWIN hWin = _GetPrevInGroup(hObj, pObj->GroupId);
if (hWin) {
WM_SetFocus(hWin);
_SetValue(hWin, 0x7FFF);
RADIO__SetValue(hObj, pObj, -1);
}
} else if (v >= pObj->NumItems) {
WM_HWIN hWin = _GetNextInGroup(pObj->Widget.Win.hNext, pObj->GroupId);
if (hWin) {
WM_SetFocus(hWin);
_SetValue(hWin, 0);
RADIO__SetValue(hObj, pObj, -1);
}
} else {
if (pObj->Sel != v) {
_ClearSelection(hObj, pObj->GroupId);
RADIO__SetValue(hObj, pObj, v);
}
}
}
/*********************************************************************
*
* Exported code
*
**********************************************************************
*/
/*********************************************************************
*
* RADIO_SetGroupId
*/
void RADIO_SetGroupId(RADIO_Handle hObj, U8 NewGroupId) {
if (hObj) {
RADIO_Obj* pObj;
U8 OldGroupId;
WM_LOCK();
pObj = RADIO_H2P(hObj);
OldGroupId = pObj->GroupId;
if (NewGroupId != OldGroupId) {
WM_HWIN hFirst;
hFirst = WM__GetFirstSibling(hObj);
/* Set function pointer if necessary */
if (NewGroupId && (RADIO__pfHandleSetValue == NULL)) {
RADIO__pfHandleSetValue = _HandleSetValue;
}
/* Pass our selection, if we have one, to another radio button in */
/* our old group. So the group have a valid selection when we leave it. */
if (OldGroupId && (pObj->Sel >= 0)) {
WM_HWIN hWin;
pObj->GroupId = 0; /* Leave group first, so _GetNextInGroup() could */
/* not find a handle to our own window. */
hWin = _GetNextInGroup(hFirst, OldGroupId);
if (hWin) {
_SetValue(hWin, 0);
}
}
/* Make sure we have a valid selection according to our new group */
if (_GetNextInGroup(hFirst, NewGroupId) != 0) {
/* Join an existing group with an already valid selection, so clear our own one */
RADIO__SetValue(hObj, pObj, -1);
} else if (pObj->Sel < 0) {
/* We are the first window in group, so we must have a valid selection at our own. */
RADIO__SetValue(hObj, pObj, 0);
}
/* Change the group */
pObj->GroupId = NewGroupId;
}
WM_UNLOCK();
}
}
#else /* Avoid problems with empty object modules */
void RADIO_SetGroupId_C(void);
void RADIO_SetGroupId_C(void) {}
#endif
/************************* end of file ******************************/