/*
 * $Id: tuidemo.c,v 1.22 2008/07/14 12:35:23 wmcbrine Exp $
 *
 * Author : P.J. Kunst <kunst@prl.philips.nl>
 * Date   : 25-02-93
 *
 * Purpose: This program demonstrates the use of the 'curses' library
 *          for the creation of (simple) menu-operated programs.
 *          In the PDCurses version, use is made of colors for the
 *          highlighting of subwindows (title bar, status bar etc).
 *
 * Acknowledgement: some ideas were borrowed from Mark Hessling's
 *                  version of the 'testcurs' program.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include "tui.h"

/* change this if source at other location */

#ifdef XCURSES
# define FNAME  "../demos/tui.c"
#else
# define FNAME  "..\\demos\\tui.c"
#endif

/**************************** strings entry box ***************************/

void address(void)
{
    char *fieldname[6] =
    {
        "Name", "Street", "City", "State", "Country", (char *)0
    };

    char *fieldbuf[5];
    WINDOW *wbody = bodywin();
    int i, field = 50;

    for (i = 0; i < 5; i++)
        fieldbuf[i] = calloc(1, field + 1);

    if (getstrings(fieldname, fieldbuf, field) != KEY_ESC)
    {
        for (i = 0; fieldname[i]; i++)
            wprintw(wbody, "%10s : %s\n",
                fieldname[i], fieldbuf[i]);

        wrefresh(wbody);
    }

    for (i = 0; i < 5; i++)
        free(fieldbuf[i]);
}

/**************************** string entry box ****************************/

char *getfname(char *desc, char *fname, int field)
{
    char *fieldname[2];
    char *fieldbuf[1];

    fieldname[0] = desc;
    fieldname[1] = 0;
    fieldbuf[0] = fname;

    return (getstrings(fieldname, fieldbuf, field) == KEY_ESC) ? NULL : fname;
}

/**************************** a very simple file browser ******************/

void showfile(char *fname)
{
    int i, bh = bodylen();
    FILE *fp;
    char buf[MAXSTRLEN];
    bool ateof = FALSE;

    statusmsg("FileBrowser: Hit key to continue, Q to quit");

    if ((fp = fopen(fname, "r")) != NULL)   /* file available? */
    {
        while (!ateof)
        {
            clsbody();

            for (i = 0; i < bh - 1 && !ateof; i++)
            {
                buf[0] = '\0';
                fgets(buf, MAXSTRLEN, fp);

                if (strlen(buf))
                    bodymsg(buf);
                else
                    ateof = TRUE;
            }

            switch (waitforkey())
            {
            case 'Q':
            case 'q':
            case 0x1b:
                ateof = TRUE;
            }
        }

        fclose(fp);
    }
    else
    {
        sprintf(buf, "ERROR: file '%s' not found", fname);
        errormsg(buf);
    }
}

/***************************** forward declarations ***********************/

void sub0(void), sub1(void), sub2(void), sub3(void);
void func1(void), func2(void);
void subfunc1(void), subfunc2(void);
void subsub(void);

/***************************** menus initialization ***********************/

menu MainMenu[] =
{
    { "Asub", sub0, "Go inside first submenu" },
    { "Bsub", sub1, "Go inside second submenu" },
    { "Csub", sub2, "Go inside third submenu" },
    { "Dsub", sub3, "Go inside fourth submenu" },
    { "", (FUNC)0, "" }   /* always add this as the last item! */
};

menu SubMenu0[] =
{
    { "Exit", DoExit, "Terminate program" },
    { "", (FUNC)0, "" }
};

menu SubMenu1[] =
{
    { "OneBeep", func1, "Sound one beep" },
    { "TwoBeeps", func2, "Sound two beeps" },
    { "", (FUNC)0, "" }
};

menu SubMenu2[] =
{
    { "Browse", subfunc1, "Source file lister" },
    { "Input", subfunc2, "Interactive file lister" },
    { "Address", address, "Get address data" },
    { "", (FUNC)0, "" }
};

menu SubMenu3[] =
{
    { "SubSub", subsub, "Go inside sub-submenu" },
    { "", (FUNC)0, "" }
};

/***************************** main menu functions ************************/

void sub0(void)
{
    domenu(SubMenu0);
}

void sub1(void)
{
    domenu(SubMenu1);
}

void sub2(void)
{
    domenu(SubMenu2);
}

void sub3(void)
{
    domenu(SubMenu3);
}

/***************************** submenu1 functions *************************/

void func1(void)
{
    beep();
    bodymsg("One beep! ");
}

void func2(void)
{
    beep();
    bodymsg("Two beeps! ");
    beep();
}

/***************************** submenu2 functions *************************/

void subfunc1(void)
{
    showfile(FNAME);
}

void subfunc2(void)
{
    char fname[MAXSTRLEN];

    strcpy(fname, FNAME);
    if (getfname ("File to browse:", fname, 50))
        showfile(fname);
}

/***************************** submenu3 functions *************************/

void subsub(void)
{
    domenu(SubMenu2);
}

/***************************** start main menu  ***************************/

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");

    startmenu(MainMenu, "TUI - 'textual user interface' demonstration program");

    return 0;
}
