/********************************* tuidemo.c ********************************/
/*
 * $Id: tuidemo.c,v 1.14 2006/03/29 19:50:14 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).
 *          The program was tested using DJGPP 1.09 ('GO32') and
 *          Turbo C (2.0), as well as on a UNIX machine (HP-UX 8.07).
 *
 * Acknowledgement: some ideas were borrowed from Mark Hessling's
 *                  version of the 'testcurs' program.
 */

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

#ifdef XCURSES
# define FNAME  "demos/tui.c"	/* change this if source at other location */
#else
# define FNAME  "demos\\tui.c"	/* change this if source at other location */
#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] = (char *) calloc(field + 1, sizeof(char));

	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(void)
{
	startmenu(MainMenu,
		"TUI - 'textual user interface' demonstration program");

	return 0;
}

/********************************* tuidemo.c ********************************/
