//Commesso: commesso.cpp
#include <iostream.h>
#include <strstream.h>
#include <iomanip.h>
#include <stdlib.h>
#include "commesso.h"
/******************************************************/
/* Classe Commesso */
/******************************************************/
void Commesso::Scegli (CapoScelto scelto)
{
int HaTaglia = 0; // Nessuna taglia
int HaColore = 0; // Nessun colore
int i;
menu *m = 0; // Il menu' che ci serve
switch (scelto)
{
case Maglione :
HaTaglia = -1; // Maglione ha taglia
HaColore = -1; // Maglione ha colore
new AttrList (criteri,AttrList::eq,AttrList::genere,"Maglione");
break;
case Camicia :
HaTaglia = -1; // Camicia ha taglia
HaColore = -1; // Camicia ha colore
new AttrList (criteri,AttrList::eq,AttrList::genere,"Camicia");
break;
case Pantaloni :
HaTaglia = -1; // Pantaloni hanno taglia
HaColore = -1; // Pantaloni hanno colore
new AttrList (criteri,AttrList::eq,AttrList::genere,"Pantaloni");
break;
case Cintura :
HaTaglia = -1; // Cintura ha taglia
new AttrList (criteri,AttrList::eq,AttrList::genere,"Cintura");
break;
case Cravatta :
new AttrList (criteri,AttrList::eq,AttrList::genere,"Cravatta");
break;
}
// Adesso crea il menu per i dati aggiuntivi del capo (se ne voglio)
new MenuModello (m, "Modello"); // Sicuramente un modello
if (HaTaglia) // Se il capo ha la taglia, introduce i tre confronti
{
new MenuTagliaPiu (m, "Taglia maggiore o uguale a");
new MenuTagliaMeno (m, "Taglia minore o uguale a");
new MenuTaglia (m, "Taglia uguale a");
}
if (HaColore) // Se il capo ha un colore, menu per inserire il colore
new MenuColore (m, "Colore");
new MenuCerca (m, "Cerca"); // Menu' 'cerca', che avvia la ricerca
// Loop di esecuzione del menu', finche' non si sceglie 'Cerca' (voce 1)
do {
i = m->print (1);
m->doaction (i,this);
} while (i != 1);
delete m; // Elimina il menu della scelta
// Menu per la scelta tra i capi estratti dal magazzino
m = 0; // Inizializza a 0 il puntatore, per creare un altro menu
new MenuVediScelti (m, "Guarda Scelti");
new MenuVediDisponibili (m, "Guarda Disponibili");
new MenuScegli (m, "Scegli Capo");
new MenuScarta (m, "Scarta Capo");
new MenuCompra (m, "Compra");
// Loop che esegue il menu' fintantoche non si sceglie la voce 'Compra' (1)
do {
i = m->print (1);
m->doaction (i,this);
} while (i != 1);
delete m; // Elimina il menu' della scelta
}
void Commesso::Cerca ()
{
scelti = mag -> Select (criteri); // Dati i criteri, controlla il magazzino
}
void Commesso::ListaScelti ()
{
if (comprati) // Se ci sono capi in lista
comprati -> show (1); // Li mostra
else // Altrimenti
cout << "Nessun capo scelto" << endl; // Dice che non ce ne sono
cout << "Premi <a capo> per continuare"; // Pausa...
cin.ignore (10,'\n'); // Arriva fino all' 'a capo'
}
void Commesso::ListaDisponibili ()
{
if (scelti) // Se ci sono capi in lista
scelti -> show (1); // Li mostra
else // Altrimenti
cout << "Nessun capo disponibile" << endl; // Dice che non ce ne sono
cout << "Premi <a capo> per continuare"; // Pausa...
cin.ignore (10,'\n'); // Arriva fino all' 'a capo'
}
void Commesso::Compra ()
{
if (scelti) // Se ci sono capi non comprati
mag -> Add (scelti); // Li rimette in magazzino
if (comprati) // Se ci sono capi comprati
delete comprati; // Li 'depenna'
}
void Commesso::ToScelti ()
{
int i;Capo *c;
if (scelti) // Se esiste una lista di scelti
{
cout << "Scegli un capo: "; // Stampa il prompt
cin >> i; // Legge la scelta
cin.ignore (10,'\n'); // Arriva fino all' 'a capo'
c = (*scelti) [i]; // Ottiene l'elemento scelto
if (c) // Se l'ha trovato
{
c -> remove (scelti); // Lo elimena dalla lista degli scelti
*c += comprati; // Somma i comprati all'elemento
comprati = c; // E mette l'elemento come primo dei comprati
cout << "Capo spostato" << endl;
}
}
else
cout << "Nessun capo disponibile" << endl;
}
void Commesso::ToDisponibili ()
{
int i;Capo *c;
if (comprati) // Se esiste una lista di comprati
{
cout << "Capo da scartare: "; // Stampa il prompt
// scanf ("%d\n",&i);
cin >> i; // Legge la scelta
cin.ignore (10,'\n'); // Arriva fino all' 'a capo'
c = (*comprati) [i]; // Individua l'elemento
if (c) // Se l'ha individuato
{
c -> remove (comprati); // Lo rimuove dalla lista dei comprati
*c += scelti; // Aggiunge la lista degli scelti dopo l'elemento
scelti = c; // E rende l'elemento il primo degli scelti
cout << "Capo spostato" << endl;
}
}
else
cout << "Nessun capo scelto" << endl;
}
void Commesso::AddCriterio (AttrList::modo m, AttrList::tipo_t t)
{
char buf [30];
char *nome;
int len;
switch (t)
{
case AttrList::taglia : // Se deve aggiungere una 'taglia'
nome = "taglia"; // Il prompt e' 'taglia'
len=4; // Deve leggere max 4 caratteri
break;
case AttrList::colore : // Se deve leggere un 'colore'
nome = "colore"; // Il prompt e' 'colore'
len=19; // E sara' lungo 19 caratteri al massimo
break;
case AttrList::modello : // Se invece deve leggere il modello
nome = "modello"; // Il prompt sara' 'modello'
len=29; // E potra' essere lungo al massimo 29 caratteri
break;
}
cout << "Introduci " << nome << " :"; // Stampa il prompt
cin.width (len);
cin >> buf; // Legge il dato, rispettando la lunghezza
if (t == AttrList::taglia) // Se ho letto una taglia
{
int i;
istrstream istr(buf,4); // Crea un 'istrstream' con la nostra stringa
istr >> i; // Estrae dalla stringa l'inero
buf [0] = 0; // Tronca la stringa
ostrstream ostr (buf,4); // Costruisce un 'ostrstream' con la stringa, lungo 4
ostr << setw (3) << setfill ('0') << i % 999; // Formatta il numero a tre cifre con gli zeri
}
new AttrList (criteri,m,t,buf); // Creo il nuovo attributo, con il tipo ed il valore dato
}
/******************************************************/
/* Classe MenuCommesso */
/******************************************************/
void MenuCommesso::action (void *par)
{
Commesso c ((Magazzino *)par);
menu *mc = 0;
int i;
new MenuAMaglione (mc,"Maglione");
new MenuACamicia (mc,"Camicia");
new MenuAPantaloni (mc,"Pantaloni");
new MenuACintura (mc,"Cintura");
new MenuACravatta (mc,"Cravatta");
i = mc->print (1);
mc->doaction (i,&c);
delete mc; // Elimina il menu
}
/******************************************************/
/* Classe MenuCamicia */
/******************************************************/
void MenuACamicia::action (void *par)
{
((Commesso *) par) -> Scegli (Commesso::Camicia);
}
/******************************************************/
/* Classe MenuAMaglione */
/******************************************************/
void MenuAMaglione::action (void *par)
{
((Commesso *) par) -> Scegli (Commesso::Maglione);
}
/******************************************************/
/* Classe MenuAPantaloni */
/******************************************************/
void MenuAPantaloni::action (void *par)
{
((Commesso *) par) -> Scegli (Commesso::Pantaloni);
}
/******************************************************/
/* Classe MenuACintura */
/******************************************************/
void MenuACintura::action (void *par)
{
((Commesso *) par) -> Scegli (Commesso::Cintura);
}
/******************************************************/
/* Classe MenuACravatta */
/******************************************************/
void MenuACravatta::action (void *par)
{
((Commesso *) par) -> Scegli (Commesso::Cravatta);
}
/******************************************************/
/* Classe MenuScegli */
/******************************************************/
void MenuScegli::action (void *par)
{
((Commesso *) par) -> ToScelti ();
}
/******************************************************/
/* Classe MenuVediScelti */
/******************************************************/
void MenuVediScelti::action (void *par)
{
((Commesso *) par) -> ListaScelti ();
}
/******************************************************/
/* Classe MenuVediDisponibili */
/******************************************************/
void MenuVediDisponibili::action (void *par)
{
((Commesso *) par) -> ListaDisponibili ();
}
/******************************************************/
/* Classe MenuVediDisponibili */
/******************************************************/
void MenuScarta::action (void *par)
{
((Commesso *) par) -> ToDisponibili ();
}
/******************************************************/
/* Classe MenuCompra */
/******************************************************/
void MenuCompra::action (void *par)
{
((Commesso *) par) -> Compra ();
}
/******************************************************/
/* Classe MenuCerca */
/******************************************************/
void MenuCerca::action (void *par)
{
((Commesso *) par) -> Cerca ();
}
/******************************************************/
/* Classe MenuModello */
/******************************************************/
void MenuModello::action (void *par)
{
((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::modello);
}
/******************************************************/
/* Classe MenuTagliaPiu */
/******************************************************/
void MenuTagliaPiu::action (void *par)
{
((Commesso *) par) -> AddCriterio (AttrList::ge, AttrList::taglia);
}
/******************************************************/
/* Classe MenuTagliaMeno */
/******************************************************/
void MenuTagliaMeno::action (void *par)
{
((Commesso *) par) -> AddCriterio (AttrList::le, AttrList::taglia);
}
/******************************************************/
/* Classe MenuTaglia */
/******************************************************/
void MenuTaglia::action (void *par)
{
((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::taglia);
}
/******************************************************/
/* Classe MenuColore */
/******************************************************/
void MenuColore::action (void *par)
{
((Commesso *) par) -> AddCriterio (AttrList::eq, AttrList::colore);
}