1 
2 /* Terminality - a portable terminal handling library
3  * Copyright (C) 1998-2002, Emil Mikulic.
4  * This is LGPL - look at COPYING.LIB
5  */
6 
7 /* Project:     Terminality
8  * File:	demo.cpp
9  * Author:      Emil Mikulic, Michal Safranek
10  * Description: Demonstrate the Terminality GUI
11  */
12 
13 /* Define this if you want the 'theme preview' function: */
14 #define THEME_FOREVER
15 
16 #include <gui.h>
17 #include <time.h>
18 #include <stdlib.h>
19 #include "myscheme.h"
20 #include <xmem.h>
21 
22 #ifdef USE_NCURSES /* alias we're not under Windoze */
23 //#include <unistd.h>
24 #endif
25 
26 const char rcsid[] =
27 "$Id: demo.cpp,v 1.19 2002/07/26 01:39:43 darkmoon Exp $";
28 
29 
30 
doabout(void)31 void doabout(void)
32 {
33 	/* Paint the screen */
34 #ifndef __DJGPP__
35 	fillscreen(DarkGray, Black, BLOCK_1);
36 #else
37 	fillscreen(DarkGray, Black, 176);
38 #endif
39 
40 	/* Draw a 3D box */
41 	drawbox_out(12,11,CON_COLS-12,14, Green);
42 
43 	/* Write in it */
44 	setcolor(White, Green);
45 	center(12,"Terminality");
46 	center(13,"Copyright (C) 1998-2002, Emil, Volker and Michal.");
47 
48 	/* Centertext */
49 	setcolor(LightRed, Black);
50 	center(18, "Demo Program");
51 
52 	/* Press any key */
53 	setcolor(White, Black);
54 	center(20, "Press any key to continue");
55 	update();
56 	while (!keypressed()) {};
57 	readkey();
58 }
59 
60 
61 
local_kh(key k,element_type et,void * ptr)62 key local_kh(key k, element_type et, void *ptr){
63 	((textbox *) ptr)->set_buf("Great cheat! :)");
64 	((textbox *) ptr)->draw();
65 	return KEY_NOTHING;
66 }
67 
68 
69 
dodlg(void)70 void dodlg(void)
71 {
72 	button *b = NULL;
73 	form *myForm = new form(30,4,36,19);
74 
75 	myForm->addstatic(new staticLabel(32,7,"Text:"));
76 	myForm->addstatic(new staticLabel(32,8,"Numbers:"));
77 	textbox *tbx = new textbox(41,7,"<geoffwa>  It's a cow-dog.  "
78 		"It says \"moof\"!", 20, 50);
79 #ifndef _WIN32
80 	tbx->bind(KEY_F(1), &local_kh, 0);
81 #endif
82 	myForm->addobject(tbx);
83 	textbox *mybox = new textbox(41,8,"12", 20);
84 	mybox->charmap = "0123456789";
85 
86 	myForm->addobject(mybox);
87 	myForm->addobject(new checkbox(32,10,false,"I'm a CheckBox"));
88 	myForm->addstatic(new staticLabel(32,12,"Choose your gender:"));
89 
90 	radioGroup *rg = new radioGroup;
91 	myForm->addobject(new radio(rg,1,34,13,false,"Male"));
92 	myForm->addobject(new radio(rg,2,34,14,false,"Female"));
93 	myForm->addstatic(new staticLabel(32,16,"Choose your race:"));
94 
95 	radioGroup *rg2 = new radioGroup;
96 	myForm->addobject(new radio(rg2,1,34,17,false,"Human"));
97 	myForm->addobject(new radio(rg2,2,34,18,false,"Elf"));
98 	myForm->addobject(new radio(rg2,3,34,19,false,"Dwarf"));
99 	myForm->addobject(new radio(rg2,4,50,17,false,"Orc"));
100 	myForm->addobject(new radio(rg2,5,50,18,false,"Troll"));
101 	myForm->addobject(new radio(rg2,6,50,19,false,"Drakeling"));
102 
103 	myForm->addobject(b = new button(52,21,6,1,"OK",1));
104 	b->dflt = true;
105 	myForm->run();
106 
107 	/*
108 	 * Short note about gathering results: if you want to get result
109 	 * from radio buttons in a group, use their 'radioGroup' instead of
110 	 * travelling through them and checking 'selected'.
111 	 *
112 	 * for example: printw("Radio group1: %d\n",rg2->selected_id);
113 	 */
114 	delete myForm;
115 	delete rg;
116 	delete rg2;
117 }
118 
119 
120 
hshow(char * text)121 void hshow(char *text)
122 {
123 	char *buf = (char*) xmalloc(strlen(text) + 25);
124 	form *myForm = new form(20,3,40,5);
125 
126 	sprintf(buf, "You pressed the %s item", text);
127 	myForm->addstatic(new staticLabel(21+(40-strlen(buf))/2,4,buf));
128 	myForm->addobject(new button(37,6,6,1,"OK",1));
129 	myForm->run();
130 	delete myForm;
131 	xfree(buf);
132 }
133 
134 
135 
dodlg2(void)136 void dodlg2(void)
137 {
138 	clrscr();
139 	hMenu *myMenu = new hMenu(
140 		new hMenuItem("First",1,1),
141 		new hMenuItem("Second",7,92),
142 		new hMenuItem("Third",14,13),
143 		NULL);
144 	myMenu->y = 1;
145 	myMenu->visible = true;
146 	int ch,die=0;
147 
148 	do {
149 		clrscr();
150 
151 		ch = myMenu->getchoice();
152 		die = 1;
153 		switch(ch) {
154 			case 1:
155 				hshow("first");
156 				break;
157 			case 92:
158 				hshow("second");
159 				break;
160 			case 13:
161 				hshow("third");
162 				break;
163 			case -1:
164 				break;
165 			default:
166 				die = 0;
167 				break;
168 		};
169 	} while(die != 1);
170 	delete myMenu;
171 }
172 
173 
174 
my_listing_handle(key k,void * l,int num)175 key my_listing_handle(key k, void *l, int num)
176 {
177 	if(k == ' ') {
178 		gotoxy(28, 25);
179 		setcolor(White, Black);
180 		printw("listing_handle(' '): %.3d", num);
181 		update();
182 		return KEY_NOTHING;
183 	} else {
184 		return k;
185 	}
186 }
187 
188 
189 
dodlg3(void)190 void dodlg3(void)
191 {
192 	tn_list *it1 = NULL, *it2 = NULL, *it3 = NULL, *cl3 = NULL;
193 	char *tmp;
194 	color *ctmp;
195 	int i, x, y;
196 
197 	clrscr();
198 	srand(time(0));
199 
200 #define SIZE 30
201 
202 #define CREATE_DATA(x,h)	tmp = (char *)xmalloc(SIZE + 1); \
203 	sprintf(tmp,"%d",h); if (x) tn_list_add(x, tmp); else \
204 	x = tn_list_new(tmp);
205 
206 #define GENERATE_DATA(y) x = (int) (1000.0*rand()/(RAND_MAX+1.0)); \
207 	CREATE_DATA(y,x);
208 
209 #define ADD_CLR(x,y)	ctmp = (color *)xmalloc(sizeof(color)*4); \
210 	ctmp[0] = ctmp[1] = y; ctmp[2] = Default; ctmp[3] = Default; \
211 	if (x) tn_list_add(x,ctmp); else x = tn_list_new(ctmp);
212 
213 #define ADD_ODD(x)	ADD_CLR(x,LightBlue);
214 #define ADD_EVEN(x)	ADD_CLR(x,Red);
215 
216 	for (i = 0; i < 100; i++) {
217 		y = 0;
218 		GENERATE_DATA(it1);
219 		y += x;
220 		GENERATE_DATA(it2);
221 		y += x;
222 		CREATE_DATA(it3, y);
223 		if (!(y%2)) {
224 			ADD_EVEN(cl3);
225 		} else {
226 			ADD_ODD(cl3);
227 		}
228 	}
229 
230 	listing *myListing = new listing (2, 2, 78, 23,
231 		new listingSeparator(2),
232 		new listingItem(3,24,"A",it1),
233 		new listingSeparator(27),
234 		new listingItem(28,25,"B",it2),
235 		new listingSeparator(53),
236 		new listingItem(54,25,"A+B (even=red, odd=blue)",it3,cl3),
237 		new listingSeparator(79, cl3),
238 		NULL);
239 
240 	myListing->set_handle(&my_listing_handle);
241 	myListing->visible = true;
242 	myListing->run();
243 	delete myListing;
244 
245 #define KILL_LIST(x)	\
246 	for(i = 0; i < tn_list_size(x); i++) { xfree(tn_list_getdata(x,i)); } \
247 	tn_list_free(x); tn_list_kill(x);
248 
249 	KILL_LIST(it1);
250 	KILL_LIST(it2);
251 	KILL_LIST(it3);
252 	KILL_LIST(cl3);
253 
254 #undef KILL_LIST
255 #undef SIZE
256 #undef CREATE_DATA
257 #undef GENERATE_DATA
258 #undef ADD_CLR
259 #undef ADD_ODD
260 #undef ADD_EVEN
261 }
262 
263 
264 
dodlg4(void)265 void dodlg4(void)
266 {
267 	form *myForm = new form(30,4,36,19);
268 	button *b = NULL;
269 
270 	myForm->addstatic(new staticLabel(46,7,"Text:"));
271 	myForm->addobject(new textarea(37,11,20,7,"Wow! It says \"moof\"! "
272 		"That's great!"));
273 	myForm->addobject(b = new button(52,21,6,1,"OK",1));
274 	b->dflt = true;
275 	myForm->run();
276 
277 	delete myForm;
278 }
279 
280 
281 
dflt_glkh(key k,element_type et,void * ptr)282 int dflt_glkh(key k, element_type et, void *ptr)
283 {
284 	gotoxy(1, et==Hmenu?25:1);
285 	printw("dflt_glkh(): called: %d, %d, %p (accept)", k, et, ptr);
286 	update();
287 	return KEY_NOTHING;
288 }
289 
290 
291 
dflt_glkh2(key k,element_type et,void * ptr)292 int dflt_glkh2(key k, element_type et, void *ptr)
293 {
294 /* Function keys are broken on Win32 right at the moment */
295 #ifndef _WIN32
296 	if (k != KEY_F(2) && k != KEY_F(3)) {
297 		return KEY_ENTER;
298 	}
299 	if (k == KEY_F(2))
300 		default_scheme();
301 	else
302 		set_scheme(my_color_scheme);
303 #endif
304 	return KEY_NOTHING;
305 }
306 
307 
308 
doviewer(void)309 void doviewer(void)
310 {
311 	/* Paint the screen */
312 #ifndef __DJGPP__
313 	fillscreen(DarkGray, Black, BLOCK_1);
314 #else
315 	fillscreen(DarkGray, Black, 176);
316 #endif
317 
318 	setcolor(White, Blue);
319 	textviewer(30,10,20,4, "Arithmetic is being able to count up to twenty "
320 		"without taking off your shoes.\n\n    -- Mickey Mouse");
321 }
322 
323 
324 
doscheme(void)325 void doscheme(void)
326 {
327 	menu *scheme_menu = new menu(
328 		new menuItem("Original", 1),
329 		new menuItem("Blue", 2),
330 		new menuSeparator(),
331 #ifdef THEME_FOREVER
332 		new menuItem("Exit", 99),
333 #else
334 		new menuItem("Unchanged", 99),
335 #endif
336 		NULL);
337 
338 	scheme_menu->x = 30;
339 	scheme_menu->y = 10;
340 	scheme_menu->visible = true;
341 
342 #ifdef THEME_FOREVER
343 	while(1) {
344 #endif
345 		switch(scheme_menu->getchoice()) {
346 			case 1:
347 				default_scheme();
348 				break;
349 			case 2:
350 				set_scheme(my_color_scheme);
351 				break;
352 			case -1:
353 			case 99:
354 				delete scheme_menu;
355 				return;
356 			default:
357 				beep();
358 				break;
359 		}
360 #ifdef THEME_FOREVER
361 	}
362 #endif
363 }
364 
365 
366 
367 bool perc = true, alt = false;
368 progressBar *pb = NULL;
369 form *myForm = NULL;
370 
371 
372 
perc_handle(int sel)373 void perc_handle(int sel)
374 {
375 	perc = sel?true:false;
376 	pb->show_perc = perc;
377 	myForm->draw();
378 }
379 
380 
381 
alt_handle(int sel)382 void alt_handle(int sel)
383 {
384 	alt = sel?true:false;
385 	pb->alt_clr = alt;
386 	myForm->draw();
387 }
388 
389 
390 
dopbar(void)391 void dopbar(void)
392 {
393 	int die = 0;
394 	checkbox *cb = NULL;
395 	button *b = NULL;
396 
397 	myForm = new form(27, 10, 33, 10);
398 	pb = new progressBar(29, 12, 27, 1);
399 	myForm->remember_id = true;
400 	pb->show_perc = perc;
401 	pb->alt_clr = alt;
402 	myForm->addstatic(pb);
403 	myForm->addobject(new button(29, 14, 6, 1, " ->", 3));
404 	myForm->addobject(new button(52, 14, 6, 1, " |<-", 1));
405 	myForm->addobject(cb = new checkbox(29, 18, perc, "Draw percents"));
406 	cb->spc_handle = perc_handle;
407 	myForm->addobject(cb = new checkbox(29, 19, alt, "Alternate colors"));
408 	cb->spc_handle = alt_handle;
409 	myForm->addobject(b = new button(52, 18, 6, 1, " OK", 4));
410 	b->dflt = true;
411 	die = 0;
412 
413 	while (!die) {
414 		switch (myForm->run()) {
415 			case 1:/* |<- */
416 				pb->setcur(0);
417 				break;
418 			case 3:/* -> */
419 				if(!pb->advance()) beep();
420 				break;
421 			case 0:/* ESC */
422 			case 4:/* OK */
423 				die = 1;
424 				break;
425 		}
426 	}
427 	delete myForm;
428 }
429 
430 
431 
dotextview(char * av0)432 void dotextview(char *av0)
433 {
434 	winTextview *wtw = new winTextview(20, 5, 40, 15, "winTextview");
435 	if(wtw->import_file("sth.xxx")){
436 		wtw->set_content("\n\n\n\n\n\n    Can't open file: "
437 			"\033f4sth.xxx\033f! :(");
438 	}
439 	wtw->run();
440 	delete wtw;
441 }
442 
443 
444 
bottom_line_dr(void)445 void bottom_line_dr(void){
446 	center(CON_ROWS,
447 		"\033b0\033f8\x0b0\x0b1\x0b2"
448 		      "\033f7\x0b1\x0b2\x0db"
449 		"\033b7\033fFUse the arrow keys!"
450 		"\033b0\033f7\x0db\x0b2\x0b1"
451 		      "\033f8\x0b2\x0b1\x0b0");
452 }
453 
454 #define NUMPHASES 4
455 char phases[NUMPHASES] = {'|', '/', '-', '\\'};
456 int current_phase = 0;
457 
supme(key k,element_type et,void * ptr)458 key supme(key k, element_type et, void *ptr){
459 	gotoxy(CON_COLS, 1);
460 	writech(phases[current_phase++]);
461 	current_phase %= NUMPHASES;
462 	return k;
463 }
464 
465 
466 
main(int argc,char ** argv)467 int main(int argc, char **argv)
468 {
469 	if(argc>1) {
470 		xmem_want_debug = 1;
471 	}
472 
473 	// init console
474 	initcons();
475 	clrscr();
476 
477 #ifndef _WIN32
478 	register_key(KEY_F(1), dflt_glkh, 0);
479 	register_key(KEY_F(2), dflt_glkh2, 0);
480 	register_key(KEY_F(3), dflt_glkh2, 0);
481 	register_key(KEY_F(4), dflt_glkh2, 0);
482 #endif
483 	register_key(KEY_SUPERVISE, supme, 0);
484 
485 	menu *myMenu = new menu(
486 		new menuItem("About", 1),
487 		new menuItem("Test Dialog", 2),
488 		new menuItem("Test Horizontal Menu", 3),
489 		new menuItem("Test Listing", 4),
490 		new menuItem("Test TextArea", 5),
491 		new menuItem("Test Progress Bar", 6),
492 		new menuItem("Test Textviewer", 7),
493 		new menuItem("Test Textview (new)", 9),
494 		new menuItem("Theme change", 8),
495 		new menuSeparator(),
496 		new menuItem("Quit", 99),
497 		NULL);
498 	myMenu->x = 3;
499 	myMenu->y = 10;
500 	custom *bottom_line = new custom(&bottom_line_dr, NULL);
501 	bottom_line->visible = true;
502 
503 	int ch;
504 	do {
505 		setcolor(LightGray, Black);
506 		clrscr();
507 
508 		bottom_line->draw();
509 		ch = myMenu->getchoice();
510 		switch (ch) {
511 			case 1:/* About */
512 				doabout(); break;
513 
514 			case 2:/* Dialog */
515 				myMenu->visible = true;
516 				dodlg();
517 				myMenu->visible = false;
518 				break;
519 
520 			case 3:/* HMenu */
521 				bottom_line->visible = false;
522 				dodlg2();
523 				bottom_line->visible = true;
524 				break;
525 
526 			case 4:/* Listing */
527 				bottom_line->visible = false;
528 				dodlg3();
529 				bottom_line->visible = true;
530 				break;
531 
532 			case 5:/* TextArea */
533 				myMenu->visible = true;
534 				dodlg4();
535 				myMenu->visible = false;
536 				break;
537 
538 			case 6:/* pBar */
539 				myMenu->visible = true;
540 				dopbar();
541 				myMenu->visible = false;
542 				break;
543 
544 			case 7:/* Textviewer */
545 				bottom_line->visible = false;
546 				doviewer();
547 				bottom_line->visible = true;
548 				break;
549 
550 			case 8:/* Theme selector */
551 				myMenu->visible = true;
552 				doscheme();
553 				myMenu->visible = false;
554 				break;
555 			case 9:/* Textview */
556 				myMenu->visible = true;
557 				dotextview(argv[0]);
558 				myMenu->visible = false;
559 				break;
560 
561 #if 0
562 			case -1:/* ESC hit */
563 				ch = 99;
564 				break;
565 #endif
566 			default: break;
567 		};
568 	} while(ch != 99);
569 	delete myMenu;
570 	delete bottom_line;
571 
572 	// Clear screen - it looks better
573 	setcolor(LightGray, Black);
574 	set_cursor(line);
575 	clrscr();
576 	update();
577 
578 	// finish up
579 	donecons();
580 	return 0;
581 }
582 
583