Here's my original Menu class just to give you an idea ..
Code:
// Class menu
#ifndef MENU_H
#define MENU_H
#include <string>
#include <vector>
class GroupManager;
class Rental;
class Menu
{
private:
typedef void (Menu::*Func)();
struct Item
{
std::string descr;
char choice;
Func func;
};
typedef std::vector<Item> ItemVector;
ItemVector mainMenu, fleetMenu;
public:
Menu(GroupManager&, Rental&);
~Menu();
void choose();
void CreateMainMenu();
void CreateFleetMenu();
void toFleetMenu(bool);
void Menu::printItem(const Item& item) const;
void addItem(const std::string& s, char c, Func f);
std::string Menu::whiteSpace(const Item& item, int slenght, char space) const;
// Menu functions
void Exit();
void Quit();
void Pause();
void Clrscr();
void ManageFleet();
void StartScreen();
void AddGroupOption();
void ViewGroupOption();
void ViewFleetOption();
void ReadFleetOption();
void SaveGroupOption();
void EditGroupOption();
void TitleDescription();
void ViewContractOption();
void EditContractOption();
void AddNewContractOption();
void DeleteContractOption();
bool isFleetMenu() { return fleetmenu; }
bool done() { return finished; }
private:
GroupManager& grpMngr;
Rental& rental;
typedef ItemVector::iterator itemIterator;
bool finished;
bool fleetmenu;
};
#endif
.cpp
Code:
// Menu class : function definitions
#include "Menu.h"
#include "GroupManager.h"
#include "Rental.h"
#include "basic_input.h"
#include <iostream>
#include <conio.h>
using namespace std;
Menu::Menu(GroupManager& f, Rental& r) :
mainMenu(), fleetMenu(),
grpMngr(f),
rental(r),
finished(0),
fleetmenu(0)
{}
Menu::~Menu() {}
// Create a fleet Menu Items
void Menu::CreateFleetMenu()
{
toFleetMenu(true);
addItem("Description of Program", '1', &Menu::TitleDescription);
addItem("Read fleet from file", '2', &Menu::ReadFleetOption);
addItem("View a group List", '3', &Menu::ViewGroupOption);
addItem("View all existing goups", '4', &Menu::ViewFleetOption);
addItem("Add new group", '5', &Menu::AddGroupOption);
addItem("Edit group details", '6', &Menu::EditGroupOption);
addItem("Save group changes", '7', &Menu::SaveGroupOption);
addItem("Exit", '8', &Menu::Exit);
}
// Create a Menu Items
void Menu::CreateMainMenu()
{
toFleetMenu(false);
addItem("View contract details", '1', &Menu::ViewContractOption);
addItem("Add new contract", '2', &Menu::AddNewContractOption);
addItem("Edit customer contract", '3', &Menu::EditContractOption);
addItem("Delete existing contract", '4', &Menu::DeleteContractOption);
addItem("Manage Fleet", '5', &Menu::ManageFleet);
addItem("Quit Program", '6', &Menu::Quit);
}
// Add Menu Item to the list
void Menu::addItem(const std::string& s, char c, Func f)
{
Item item;
item.descr = s;
item.choice = c;
item.func = f;
if(!isFleetMenu()) {
mainMenu.push_back(item);
}
else
fleetMenu.push_back(item);
}
// Display Menu item on screen
void Menu::printItem(const Item& item) const
{
const int max_descr_width = 28;
string menuStr = whiteSpace(item, (int)(max_descr_width - item.descr.length() ), ' ');
cout << " \t\t\tº" << item.choice << ". " << menuStr << "º\n";
cout << " \t\t\tº º\n";
}
// Find and append the remaining white spaces after description
string Menu::whiteSpace(const Item& item,int slenght, char space) const
{
string resultStr = item.descr;
for ( int count=0; count < slenght; count++ ) {
resultStr+=space;
}
return resultStr;
}
// Allow user to make a Menu selection
void Menu::choose()
{
ItemVector menuItem;
Clrscr();
if(!isFleetMenu())
{
cout << "\n \t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << " \t\t\tº SHB CAR RENTALS º\n";
cout << " \t\t\t\314ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\271\n";
menuItem = mainMenu;
}
else
{
cout << "\n \t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << " \t\t\tº FLEET DETAILS º\n";
cout << " \t\t\t\314ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\271\n";
menuItem = fleetMenu;
}
for (itemIterator iter=menuItem.begin(); iter != menuItem.end(); ++iter) {
printItem(*iter);
}
cout << " \t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n\n";
char c;
// Go through Menu until correct choice
do
{
cout << "\n\n\t\tPlease choose above: ";
c=getch();
itemIterator iter=menuItem.begin();
// Find the matching Menu choice
for (; iter != menuItem.end(); ++iter)
{
if (iter->choice == c)
{
Func f = iter->func;
(this->*f)();
return;
}
}
} while(1);
};
// *******************************************************************
// Define static MENU functions
void Menu::StartScreen()
{
Clrscr();
puts("\t\t");
puts(" ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ");
puts(" ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛ ");
puts(" ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛ ÛÛÛ ÛÛÛÛÛÛ ");
puts(" °°°° °°°° °°°°°°°°°°° °°°° °°° °°°°°° ");
puts(" °°°° °°°° °°°°°°°°°°° °°°° °°°° °°°°°° ");
puts(" °°°° °°°° °°°°°°°°°°° °°°° °°°°° °°°°°° ");
puts(" °°°° °°°°° °°°° °°°° °°°°°° °°°°°° ");
puts(" °°°° °°°°° °°°°°°°°°°° °°°° °°°°°°° °°°°°° ");
puts(" °°°° °°°° °°°°°°°°°°° °°°° °°°°°°°° °°°°°° ");
puts(" °°°°°°°°°°°°°° °°°°°°°°°°° °°°°°°°° °°°° °°°°°° ");
puts(" °°°°°°°°°°°°°°° °°°° °°°°°°° °°°° °°°°°° ");
puts(" °°°° °°°° °°°°°°°°°°° °°°°°° °°°° °°°°°° ");
puts(" °°°°°°°°°°°°°°° °°°°°°°°°°° °°°°° °°°° °°°°°°°°°°°°°°°° ");
puts(" °°°°°°°°°°°°°° °°°°°°°°°°° °°°° °°°° °°°°°°°°°°°°°°°° ");
cout << "\n\n Press any key to continue . . .";
_getch();
//cin.ignore();
}
void Menu::TitleDescription( )
{
void ProgramLimits();
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº SHB RENT-A-CAR º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
cout << "\n\n\t\tThis program manages a fleet in a rental shop."
"\n\t\t The fleet data is read from group files. "
"\n\n\t A user is required to view from existing fleet files, "
"\n\t\t update existing group, or enter a new group."
"\n\n ** The user may also edit, delete and save to an existing group file **\n\n";
Pause();
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº PROGRAM LIMITATIONS º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
cout << "\n\nINPUTS:\n\n";
cout << "FileName: [groupname].txt\n";
cout << "Engine Capacity: (i.e.) 1.8L must be 1800\n";
cout << "Dates: day, month, year, minute, second\n";
cout << "Tank Capacity [unknown=0, empty=1, half=2, full=3]\n\n";
Pause();
}
void Menu::Clrscr()
{
system("cls");
}
void Menu::Pause()
{
puts("\n\n");
system("Pause");
}
void Menu::Exit()
{
toFleetMenu(false);
return;
}
void Menu::Quit()
{
finished = true;
Clrscr();
return;
}
// Manage selection between Menus
void Menu::ManageFleet()
{
toFleetMenu(true);
choose();
}
// Execute the required Menu
void Menu::toFleetMenu(bool mStatus)
{
fleetmenu=mStatus;
}
// Display Customer Contract
void Menu::ViewContractOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº CONTRACT DETAILS º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
rental.ViewContract();
getch();
}
// Create new contract
void Menu::AddNewContractOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº ADD NEW CONRACT º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
rental.CreateNewContract();
getch();
}
// Delete existing contract
void Menu::DeleteContractOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº DELETE CONTRACT º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
rental.DeleteContract();
getch();
}
// Menu Function : Edit the contract details
void Menu::EditContractOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº EDIT CONTRACT º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
rental.EditContract();
getch();
}
// Menu Function : To list available groups
void Menu::ViewFleetOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº FLEET DETAILS º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
grpMngr.ViewAllGroups();
Pause();
}
// Menu Function : To list available cars in a group
void Menu::ViewGroupOption( )
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº GROUP DETAILS º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
grpMngr.ViewAGroup();
Pause();
}
// Menu Function : To update the goup details
void Menu::EditGroupOption( )
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº ADD/DELETE CAR º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
grpMngr.EditGroup();
Pause();
}
// Menu Function : To read in fleet from file
void Menu::ReadFleetOption( )
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº READ FILES º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
grpMngr.ReadGroups();
Pause();
}
// Menu Function : To add new car to fleet list
void Menu::AddGroupOption( )
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº NEW GROUP º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
// Add new group to the databalse
grpMngr.AddNewGroup();
Pause();
}
// Menu Function : To save changes made to a group
void Menu::SaveGroupOption()
{
Clrscr();
cout << "\t\t\t\tÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»\n";
cout << "\t\t\t\tº UPDATE GROUP º\n";
cout << "\t\t\t\tÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n";
grpMngr.SaveGroupToFile();
Pause();
}