//Menu : menu.cpp
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include "menu.h"

/******************************************************/
/* Classe menu                                        */
/******************************************************/

menu::menu (TPtr &base,char *n) : list<menu> (base) // Costruttore della superclasse (appende alla lista)
{
  voce = new char [strlen (n) + 1]; // Alloca lo spazio per il nome del menu
  if (voce)                         // Se e' riuscito ad allocare
    strcpy (voce,n);                // Ci copia il nome del menu'
}

/* Funzione ricorsiva che stampa tutte le voci del menu',
 * precedute dal numero, che  sara' il modo per selezionera il
 * menu' stesso.
 * Il numero della vaco va passata come parametro, quindi noi
 * la invocheremo sulla prima voce del menu', con il numero 1.
 * Dopo il menu' stampa un prompt, legge l'input dell'utente,
 * lo trasforma in numero (e' la selezione) e lo ritorna */
int menu::print (int curr)
{
  cout << curr << ")" << voce << endl;   // Stampa 'n) nome menu'
  if (Next ())                           // Se non e' l'ultimo menu'
    return Next () -> print (curr + 1);  // Richiema la prossima voce, per stamparla (aggiorna il numero)
  else
  {                                 // Ho stampato l'ultimo elemento, scelta:
  int i;                            // Numero scritto dall'utente
    cout << "Fai la tua scelta: ";  // Prompt
    cin >> i;                       // Legge la risposta dell'utente
    cin.ignore (10,'\n');           // Arriva fino all' 'a capo'
    return i;                       // Ritorna il numero introdotto
  }
}

/* Funzione che individua la voce scelta e lancia l'azione per quella voce */
void menu::doaction (int n,void *par)
{
menu *m = (list<menu>::operator[] (n)); // Individua la voce usando i metodi della superclasse 'list<menu>'
  if (m)                        // Se l'elemento selezionato esiste (non ho dato un numero troppo grande)
    m -> action (par);          // Richiamo il suo metodo 'action' (virtuale)
}

menu::~menu ()
{
  if (voce)      // Se il menu' ha il nome (e' riuscito ad allocarlo)
    delete voce; // libera lo spazio del nmome
}

/******************************************************/
/* Classe menuexit                                    */
/******************************************************/

void menuexit::action (void *par)
{
#pragma argsused (par)  // serve per eliminare il warning 'parametro non utilizzato'
	exit (0);       // Azione (guarda un po'.. ;-> ) exit
}