AcePerl
view release on metacpan or search on metacpan
acelib/menu.c view on Meta::CPAN
BOOL menuAddItem (MENU menu, MENUITEM item, char *beforeLabel)
{
MENUITEM below, above = 0 ;
if (!item) return FALSE ;
if (beforeLabel)
{ for (below = menu->items ;
below && strcmp (below->label, beforeLabel) ;
above = below, below = below->down) ;
if (!below)
return FALSE ;
}
else
for (below = menu->items ; below ; above = below, below = below->down) ;
if (above)
{ above->down = item ;
item->up = above ;
}
else
{ menu->items = item ;
item->up = 0 ;
}
item->down = below ;
if (below)
below->up = item ;
return TRUE ;
}
BOOL menuDeleteItem (MENU menu, char *label)
{
MENUITEM item ;
if (!(item = menuItem (menu, label)))
return FALSE ;
if (item->up)
item->up->down = item->down ;
else
menu->items = item->down ;
if (item->down)
item->down->up = item->up ;
if (item->submenu)
menuDestroy (item->submenu) ;
messfree (item) ;
return TRUE ;
}
BOOL menuSelectItem (MENUITEM item)
{
BOOL changed = FALSE ;
if (item->flags & (MENUFLAG_DISABLED | MENUFLAG_SPACER))
return FALSE ;
if (item->func) /* call back user with old flags state */
(*item->func)(item) ;
else if (item->call)
call (item->call, item) ;
if (item->flags & MENUFLAG_TOGGLE)
{ item->flags ^= MENUFLAG_TOGGLE_STATE ;
changed = TRUE ;
}
else if (!(item->flags & MENUFLAG_RADIO_STATE))
{ MENUITEM first, last ;
for (first = item ;
first && !(first->flags & MENUFLAG_START_RADIO) ;
first = first->up) ;
for (last = item ;
last && !(last->flags & MENUFLAG_END_RADIO) ;
last = last->down) ;
if (first && last)
{ while (first != last)
{ first->flags &= ~MENUFLAG_RADIO_STATE ;
first = first->down ;
}
item->flags |= MENUFLAG_RADIO_STATE ;
changed = TRUE ;
}
}
return changed ;
}
/***************** set item properties *******************/
BOOL menuSetCall (MENUITEM item, char *callName)
{ if (!item || !callExists (callName)) return FALSE ;
item->call = callName ; return TRUE ;
}
BOOL menuSetFunc (MENUITEM item, MENUFUNCTION func)
{ if (!item) return FALSE ;
item->func = func ; return TRUE ;
}
BOOL menuSetFlags (MENUITEM item, unsigned int flags)
{ if (!item) return FALSE ;
item->flags |= flags ; return TRUE ;
}
BOOL menuUnsetFlags (MENUITEM item, unsigned int flags)
{ if (!item) return FALSE ;
item->flags &= ~flags ; return TRUE ;
}
BOOL menuSetValue (MENUITEM item, int value)
{ if (!item) return FALSE ;
item->value = value ; return TRUE ;
}
BOOL menuSetPtr (MENUITEM item, void *ptr)
{ if (!item) return FALSE ;
item->ptr = ptr ; return TRUE ;
}
BOOL menuSetMenu (MENUITEM item, MENU menu)
{ if (!item || !menu) return FALSE ;
item->submenu = menu ; return TRUE ;
}
/***************** get item properties *******************/
unsigned int menuGetFlags (MENUITEM item)
{ if (!item) return 0 ;
return item->flags ;
}
int menuGetValue (MENUITEM item)
{ if (!item) return 0 ;
return item->value ;
}
void* menuGetPtr (MENUITEM item)
{ if (!item) return 0 ;
return item->ptr ;
}
/**************** utilities *******************/
void menuSuppress (MENU menu, char *string)
{
BOOL inBlock = FALSE ;
BOOL hide = FALSE ;
MENUITEM item ;
for (item = menu->items ; item ; item = item->down)
{ if (!inBlock && !strcmp (item->label, string))
hide = TRUE ;
if (hide)
item->flags |= MENUFLAG_HIDE ;
if (item->flags & MENUFLAG_SPACER)
{ inBlock = FALSE ;
hide = FALSE ;
}
else
inBlock = TRUE ;
}
}
void menuRestore (MENU menu, char *string)
{
BOOL inBlock = FALSE ;
BOOL unHide = FALSE ;
MENUITEM item ;
for (item = menu->items ; item ; item = item->down)
{ if (!inBlock && !strcmp (item->label, string))
unHide = TRUE ;
if (unHide)
item->flags &= ~MENUFLAG_HIDE ;
if (item->flags & MENUFLAG_SPACER)
{ inBlock = FALSE ;
unHide = FALSE ;
}
else
inBlock = TRUE ;
}
}
#if !defined(MACINTOSH)
void menuSpacer (void) { return ; }
#endif
/***************** end of file ****************/
( run in 2.063 seconds using v1.01-cache-2.11-cpan-5837b0d9d2c )