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 )