#include <sys/cdefs.h>
__RCSID("$NetBSD: item.c,v 1.12 2012/03/21 05:33:27 matt Exp $");
#include <menu.h>
#include <stdlib.h>
#include <string.h>
#include "internals.h"
extern MENU _menui_default_menu;
ITEM _menui_default_item = {
{NULL, 0},
{NULL, 0},
NULL,
0,
0,
0,
0,
O_SELECTABLE,
NULL,
-1,
NULL,
NULL,
NULL,
NULL
};
int
item_visible(ITEM *item)
{
if (item == NULL)
return E_BAD_ARGUMENT;
if (item->parent == NULL)
return E_NOT_CONNECTED;
return item->visible;
}
char *
item_name(ITEM *item)
{
if (item == NULL)
return NULL;
return item->name.string;
}
char *
item_description(ITEM *item)
{
if (item == NULL)
return NULL;
return item->description.string;
}
int
set_item_init(MENU *menu, Menu_Hook func)
{
if (menu == NULL)
_menui_default_menu.item_init = func;
else
menu->item_init = func;
return E_OK;
}
Menu_Hook
item_init(MENU *menu)
{
if (menu == NULL)
return _menui_default_menu.item_init;
else
return menu->item_init;
}
int
set_item_term(MENU *menu, Menu_Hook func)
{
if (menu == NULL)
_menui_default_menu.item_term = func;
else
menu->item_term = func;
return E_OK;
}
Menu_Hook
item_term(MENU *menu)
{
if (menu == NULL)
return _menui_default_menu.item_term;
else
return menu->item_term;
}
int
item_selected(MENU *menu, int **sel)
{
int i, j;
if (menu == NULL)
return E_BAD_ARGUMENT;
for (i = 0, j = 0; i < menu->item_count; i++)
if (menu->items[i]->selected)
j++;
if (j == 0) {
*sel = NULL;
return 0;
}
if ( (*sel = malloc(sizeof(int) * j)) == NULL)
return E_SYSTEM_ERROR;
for (i = 0, j = 0; i < menu->item_count; i++)
if (menu->items[i]->selected)
(*sel)[j++] = i;
return j;
}
int
set_item_opts(ITEM *item, OPTIONS opts)
{
if (opts != O_SELECTABLE)
return E_SYSTEM_ERROR;
if (item == NULL)
_menui_default_item.opts = opts;
else
item->opts = opts;
return E_OK;
}
int
item_opts_on(ITEM *item, OPTIONS opts)
{
if (opts != O_SELECTABLE)
return E_SYSTEM_ERROR;
if (item == NULL)
_menui_default_item.opts |= opts;
else
item->opts |= opts;
return E_OK;
}
int
item_opts_off(ITEM *item, OPTIONS opts)
{
if (opts != O_SELECTABLE)
return E_SYSTEM_ERROR;
if (item == NULL)
_menui_default_item.opts &= ~(opts);
else
item->opts &= ~(opts);
return E_OK;
}
OPTIONS
item_opts(ITEM *item)
{
if (item == NULL)
return _menui_default_item.opts;
else
return item->opts;
}
int
set_item_value(ITEM *param_item, int flag)
{
ITEM *item = (param_item != NULL) ? param_item : &_menui_default_item;
if (item->parent == NULL)
return E_NOT_CONNECTED;
if ((item->parent->opts & O_ONEVALUE) == O_ONEVALUE)
return E_REQUEST_DENIED;
item->selected = flag;
_menui_draw_item(item->parent, item->index);
return E_OK;
}
int
item_value(ITEM *item)
{
if (item == NULL)
return _menui_default_item.selected;
else
return item->selected;
}
ITEM *
new_item(char *name, char *description)
{
ITEM *new_one;
if (name == NULL)
return NULL;
if ((new_one = (ITEM *)malloc(sizeof(ITEM))) == NULL)
return NULL;
(void)memcpy(new_one, &_menui_default_item, sizeof(ITEM));
new_one->name.length = strlen(name);
if ((new_one->name.string = (char *)
malloc(sizeof(char) * new_one->name.length + 1)) == NULL) {
free(new_one);
return NULL;
}
strcpy(new_one->name.string, name);
if (description == NULL)
new_one->description.length = 0;
else {
new_one->description.length = strlen(description);
if ((new_one->description.string =
(char *) malloc(sizeof(char) *
new_one->description.length + 1)) == NULL) {
free(new_one->name.string);
free(new_one);
return NULL;
}
strcpy(new_one->description.string, description);
}
return new_one;
}
int
free_item(ITEM *item)
{
if (item == NULL)
return E_BAD_ARGUMENT;
if (item->parent != NULL)
return E_CONNECTED;
free(item->name.string);
if (item->description.length)
free(item->description.string);
free(item);
return E_OK;
}
int
set_current_item(MENU *param_menu, ITEM *item)
{
MENU *menu = (param_menu != NULL) ? param_menu : &_menui_default_menu;
int i = 0;
if (menu->in_init == 1)
return E_BAD_STATE;
if (menu->items == NULL)
return E_NOT_CONNECTED;
if ((i = item_index(item)) < 0)
return E_BAD_ARGUMENT;
menu->cur_item = i;
return E_OK;
}
ITEM *
current_item(MENU *menu)
{
if (menu == NULL)
return NULL;
if (menu->items == NULL)
return NULL;
return menu->items[menu->cur_item];
}
int
item_index(ITEM *item)
{
if (item == NULL)
return _menui_default_item.index;
else
return item->index;
}