234 lines
4.8 KiB
C
234 lines
4.8 KiB
C
/*
|
|
* $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;
|
|
}
|