/*
prevedemo z:
g++ -omenu -lncurses -lmenu menu.cxx
*/

#include <iostream.h> 
#include <curses.h>
#include <menu.h>
#include <signal.h>
#define REQ_WAIT 'a'

static void finish(int sig);



static int menu_virtualize(int c)
{
  /* funkcija vraca "requeste" glede na komadde ki jih s tipkovnice prestreze
     wgetch(WINDOW*) requeste nato posilja funkciji menu_driver
     
     ta fukncija se odziva na kurzorske tipke gor in dol ter page up in page
     down. Ce pritisnemo tipko enter potrdimo izbiro. Za vse ostale pritisnjene
     tipke ne naredi nicesar */

	if (c == '\n' || c == KEY_EXIT) return(MAX_COMMAND + 1);
	else if (c == 'n' || c == KEY_DOWN) return(REQ_NEXT_ITEM);
	else if (c == 'p' || c == KEY_UP) return(REQ_PREV_ITEM);
	else if (c == 'd' || c == KEY_NPAGE) return(REQ_SCR_DPAGE);
	else if (c == 'u' || c == KEY_PPAGE) return(REQ_SCR_UPAGE);
	else if (c == 13) return (c);  // tipka enter
	else return(REQ_WAIT);  // vse ostale
}


void main(void)
{
  WINDOW *w; // kazalec na okno
  static ITEM *i[sizeof(char *)]; //polje kazalcev
  ITEM **ii=i; //kazalec na polje kazalcev
  MENU *m; //kazalec na meni

  
  
  (void) signal(SIGINT, finish);    
  
  (void) initscr();      //inicializira knjiznoco curses
  keypad(stdscr, TRUE);  //inicializira numericno tipkovnico
  (void) nonl();         //ne dela NL na zaslon 
  (void) cbreak();       //vhodne podatke sprejema enega za drugim in ne caka na \n
  (void) noecho();       //vhodnih podatkov ne prikazuje na zaslon (no echo)
  refresh();

  start_color();  //inicializira uporabo barv
  
  // Kreiramo polje kazalcev tipa ITEM (za vsako opcijo v meniju)
  *ii++=new_item("Prva","Tu pa je komentar");
  *ii++=new_item("Druga","");
  *ii++=new_item("3.","");
  *ii++=new_item("Cetrta","");
  *ii++=new_item("Konec","");
  *ii=(ITEM *)NULL; // polje kazalcev MORA vedno biti terminirano z NULL


  m=new_menu(i); // iz polja kazalcev kreira nov meni in vrne kazalec tima MENU
  w=newwin(10,30,5,5); // kreira okno dane velikosti in vrne k. tipa WINDOW
  box (w,0,0); // okoli okna (kazalec na okno je w) narise okvir
  keypad(w,TRUE); // dovoli uporabo numericne tipkovnice
  set_menu_win(m,w); // doloci okno za meni (kazalec na meni m in na okno w)
  set_menu_sub(m,derwin(w,8,28,1,1)); // 
  post_menu(m); // "poklice oz. postavi meni"
  redrawwin(w);	// ponovno izrise celo okno (popravi spremembe na zaslonu)
  


  /* glavna zanka menija v kateri izberemo zeljeno opcijo
     ponavlja se dokler menudriver ne vrne E_UNKNOWN_COMMAND
     po vsaki pritisnjeni tipki se klice redrawwin(w) ki ponovno
     izrise osnovno okno */

  while (menu_driver(m,menu_virtualize(wgetch(w)))!=E_UNKNOWN_COMMAND) {
    redrawwin(w);
    continue;
  }



  const char *izbira;
  izbira=item_name(current_item(m));  // vrne tisto opcijo, ki smo jo izbrali 
  unpost_menu(m); // "odpoklice meni"
  redrawwin(w);   // ponovno izrise okno
  finish(0);               // poklce funkcijo ko konca
  cout <<endl << "Izbral si " << izbira<<endl;
} 



static void finish(int sig)
{
  endwin(); // postavi terminal v prvotno stanje
   
}

// by _Prophet
