menupro

/* 
Questo programma mostra come si scrive un men—, e come possia-
te utilizzare questo esempio nei vostri programmi.
Viene chiamato in questo modo:
     menu(x_sinistra_alto,y_sinistra_alto,[lista_di_opzioni],scelta).
Inserite questo obiettivo:
     menu(4,4,[lunedi, martedi, mercoledi, giovedi, venerdi],Risp). 
*/
DOMAINS
  STRLIST=STRING*
  TASTO    = cr ; esc ; break ; tab ; btab ; del ; bdel ; ins ;
  	    end ; home ; ftast(INTEGER) ; up ; down ; left ; right ;
  	    tegn(CHAR) ; altri
PREDICATES
/* menu(sup_X,sup_Y,[scelte],scelta) */  
  menu(INTEGER,INTEGER,STRLIST,INTEGER)
  leggitasto(TASTO)
  /* Lettura tasti */
  leggitasto1(TASTO,CHAR,INTEGER)
  leggitasto2(TASTO,INTEGER)
  /* Selezione dal Men— */
  lunmax(STRLIST,INTEGER,INTEGER)
  lunlista(STRLIST,INTEGER)
  scrivilista(INTEGER,INTEGER,STRLIST)
  menu1(INTEGER,INTEGER,INTEGER,INTEGER)
  menu2(INTEGER,INTEGER,INTEGER,INTEGER,TASTO)
  regolafinestra(INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER)
CLAUSES
/* leggitasto */	
  leggitasto(TASTO):-readchar(T),char_int(T,VAL),leggitasto1(TASTO,T,VAL).
  leggitasto1(TASTO,_,0):-!,readchar(T),char_int(T,VAL),leggitasto2(TASTO,VAL).
  leggitasto1(cr,_,13):-!.
  leggitasto1(esc,_,27):-!.
  leggitasto1(break,_,3):-!.
  leggitasto1(tab,_,0):-!.
  leggitasto1(bdel,_,8):-!.
  leggitasto1(tegn(T),T,_) .
  
  leggitasto2(btab,15):-!.
  leggitasto2(del,83):-!.
  leggitasto2(ins,82):-!.
  leggitasto2(up,72):-!.
  leggitasto2(down,80):-!.
  leggitasto2(left,75):-!.
  leggitasto2(right,77):-!.
  leggitasto2(home,71):-!.
  leggitasto2(end,79):-!.
  leggitasto2(ftast(N),VAL):- VAL>58 and VAL<70 and N=VAL-58, !.
  leggitasto2(altri,_).
/* menu */
  menu(LI,KOL,LIST,SCELTA) :- 
		lunmax(LIST,0,LSTR),
		lunlista(LIST,Ustrlun), Ustrlun>0,!,
		Lunghstringa = LSTR + 2,
		HH1= Ustrlun+2, HH2=Lunghstringa + 2,
		regolafinestra(LI,KOL,HH1,HH2,ALI,AKOL),		
		makewindow(3,7,7,"",ALI,AKOL,HH1,HH2),
		HH3=Lunghstringa,
		scrivilista(0,HH3,LIST),cursor(0,0),
		menu1(0,Ustrlun,Lunghstringa,CH),
		SCELTA=1+CH,
		removewindow.
  menu(_,_,_,255).
  
  lunmax([H|T],MAX,MAX1) :-
		str_len(H,L’NGDE),
		L’NGDE>MAX,!,
		lunmax(T,L’NGDE,MAX1).
  lunmax([_|T],MAX,MAX1) :-lunmax(T,MAX,MAX1).
  lunmax([],LEN,LEN).
  lunlista([],0).
  lunlista([_|T],N):-
		lunlista(T,X),
		N=X+1.
  scrivilista(_,_,[]).
  scrivilista(LI,Lunghstringa,[H|T]):-field_str(LI,0,Lunghstringa,H),
		LI1=LI+1,scrivilista(LI1,Lunghstringa,T).
  menu1(LI,MAXLI,Lunghstringa,SCELTA):-
		field_attr(LI,0,Lunghstringa,112),
		cursor(LI,0),
		leggitasto(TASTO),
		menu2(LI,MAXLI,Lunghstringa,SCELTA,TASTO).
  menu2(_,_,_,-1,esc):-!.
  menu2(LI,_,_,LI,ftast(10)):-!.
  menu2(LI,_,_,LI,cr):-!.
  menu2(LI,MAXLI,Lunghstringa,SCELTA,up):-
		LI>0,!,
		field_attr(LI,0,Lunghstringa,7),
		LI1=LI-1,
		menu1(LI1,MAXLI,Lunghstringa,SCELTA).
  menu2(LI,MAXLI,Lunghstringa,SCELTA,down):-
		LI<MAXLI-1,!,
		field_attr(LI,0,Lunghstringa,7),
		LI1=LI+1,
		menu1(LI1,MAXLI,Lunghstringa,SCELTA).
  menu2(LI,MAXLI,Lunghstringa,SCELTA,_):-
		menu1(LI,MAXLI,Lunghstringa,SCELTA).
  regolafinestra(LI,KOL,DLI,DKOL,LI,KOL):-LI<25-DLI, KOL<80-DKOL,!.
  regolafinestra(LI,_,DLI,DKOL,LI,AKOL):-LI<25-DLI, !, AKOL=80-DKOL.
  regolafinestra(_,KOL,DLI,DKOL,ALI,KOL):-KOL<80-DKOL, !, ALI=25-DLI.
  regolafinestra(_,_,DLI,DKOL,ALI,AKOL):-ALI=25-DLI, AKOL=80-DKOL.