/*
 * choices.c -- displays several ways of presenting choices for
 * selection.
 */

#include <xview/xview.h>
#include <xview/panel.h>
#include <xview/openmenu.h>

Panel panel;

main(argc, argv)
int argc;
char *argv[];
{
    Frame   frame;
    Menu    menu;
    void    quit();
    int     numeric_text();
    int     selected(), toggle_selected();

    xv_init(XV_INIT_ARGC_PTR_ARGV, &argc, argv, NULL);

    frame = xv_create(XV_NULL, FRAME,
                      FRAME_LABEL,        argv[0],
                      XV_WIDTH,       450,
                      XV_HEIGHT,      250,
                      FRAME_SHOW_FOOTER,  TRUE,
                      NULL);
    panel = xv_create(frame, PANEL, NULL);
    xv_set(canvas_paint_window(panel), NULL);
    xv_create(panel, PANEL_BUTTON,
              PANEL_LABEL_STRING,     "Quit",
              PANEL_NOTIFY_PROC,      quit,
              PANEL_CLIENT_DATA,  frame,
              NULL);

    xv_create(panel, PANEL_CHOICE,
              PANEL_CHOICE_STRINGS,   "One", "Two", "Three", "Four", NULL,
              PANEL_NOTIFY_PROC,      selected,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_create(panel, PANEL_CHOICE,
              PANEL_DISPLAY_LEVEL,    PANEL_CURRENT,
              PANEL_LABEL_STRING,     "Choices",
              PANEL_CHOICE_STRINGS,   "One", "Two", "Three", "Four", NULL,
              PANEL_NOTIFY_PROC,      selected,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_create(panel, PANEL_CHOICE,
              PANEL_LABEL_STRING,     "Choices",
              PANEL_CHOICE_STRINGS,   "One", "Two", "Three", "Four", NULL,
              PANEL_NOTIFY_PROC,      selected,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_create(panel, PANEL_CHOICE,
              PANEL_CHOOSE_ONE,   FALSE,
              PANEL_LABEL_STRING,     "Choices",
              PANEL_VALUE,        5, /* choices 1 and 3 */
              PANEL_CHOICE_STRINGS,   "One", "Two", "Three", "Four", NULL,
              PANEL_NOTIFY_PROC,      toggle_selected,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_create(panel, PANEL_TOGGLE,
              PANEL_FEEDBACK,     PANEL_MARKED,
              PANEL_LABEL_STRING,     "Choices",
              PANEL_VALUE,        5, /* choices 1 and 3 */
              PANEL_CHOICE_STRINGS,   "One", "Two", "Three", "Four", NULL,
              PANEL_NOTIFY_PROC,      toggle_selected,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_create(panel, PANEL_NUMERIC_TEXT,
              PANEL_LABEL_STRING, "Numbers:",
              PANEL_VALUE,        5,
              PANEL_MAX_VALUE,    1000000,
              PANEL_MIN_VALUE,    -1000000,
              PANEL_NOTIFY_PROC,  numeric_text,
              PANEL_CLIENT_DATA,  frame,
              NULL);
    xv_main_loop(frame);
}

int
toggle_selected(item, value, event)
Panel_item item;
unsigned value;
Event *event;
{
    char buf[32];
    Frame frame = xv_get(item, PANEL_CLIENT_DATA);
    int i;
    buf[0] = 0;

    if(event_id(event) == MS_LEFT)
    {
        for(i = 0; value; i++, value >>= 1)
            if(value & 1)
                sprintf(buf + strlen(buf), "%s%c ",
                        xv_get(item, PANEL_CHOICE_STRING, i),
                        (value >> 1) ? ',' : ' ');

        xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
        return XV_OK;
    }

    return XV_ERROR;
}

int
selected(item, value, event)
Panel_item item;
int value;
Event *event;
{
    char buf[32];
    Frame frame = xv_get(item, PANEL_CLIENT_DATA);

    if(event_id(event) == MS_LEFT)
    {
        sprintf(buf, "\"%s\" selected",
                xv_get(item, PANEL_CHOICE_STRING, panel_get_value(item)));
        xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
        return XV_OK;
    }

    return XV_ERROR;
}

numeric_text(item, event)
Panel_item item;
Event *event;
{
    char buf[32];

    Frame frame = xv_get(item, PANEL_CLIENT_DATA);

    sprintf(buf, "\"%s\" set to %d",
            (char *)xv_get(item, PANEL_LABEL_STRING), (int)xv_get(item, PANEL_VALUE));
    xv_set(frame, FRAME_RIGHT_FOOTER, buf, NULL);
    return PANEL_NEXT;
}

void
quit(item, event)
Panel_item item;
Event *event;
{
    Frame frame = xv_get(item, PANEL_CLIENT_DATA);

    if(event_id(event) == MS_LEFT)
        xv_destroy_safe(frame);
}
