/* * Simple program that demonstrates InterViews pull-down menus and pull-right * menus. This version adds and deletes new pull-downs dynamically. */ #include #include #include #include #include #include #include "std-macros.h" static exception Exit; class MyHBox : public HBox { public: virtual void Reconfig() {HBox::Reconfig();} }; static PulldownMenu *bmenu, *smenu, *dmenu, *cmenu, *emenu, *omenu; static PullrightMenu *brmenu; static MenuBar *menubar1, *menubar2; static VBox* vb; static MyHBox* hb; static Tray* t; static World* world; static bool changeState = 0; class SingleBurgerSelection : public MenuItem { public: SingleBurgerSelection(const char* name) : MenuItem(name) {} void Do(); }; class DoubleBurgerSelection : public MenuItem { public: DoubleBurgerSelection(const char* name) : MenuItem(name) {} void Do(); }; class ChiliBurgerSelection : public MenuItem { public: ChiliBurgerSelection(const char* name) : MenuItem(name) {} void Do(); }; class FatBurgerSelection : public MenuItem { public: FatBurgerSelection(const char* name) : MenuItem(name) {} void Do(); }; class SLOBurgerSelection : public MenuItem { public: SLOBurgerSelection(const char* name) : MenuItem(name) {} void Do(); }; class FriesSelection : public MenuItem { public: FriesSelection(const char* name) : MenuItem(name) {} void Do(); }; class OnionRingsSelection : public MenuItem { public: OnionRingsSelection(const char* name) : MenuItem(name) {} void Do(); }; class SmallSideOrderSelection : public MenuItem { public: SmallSideOrderSelection(const char* name) : MenuItem(name) {} void Do(); }; class MediumSideOrderSelection : public MenuItem { public: MediumSideOrderSelection(const char* name) : MenuItem(name) {} void Do(); }; class LargeSideOrderSelection : public MenuItem { public: LargeSideOrderSelection(const char* name) : MenuItem(name) {} void Do(); }; class CokeSelection : public MenuItem { public: CokeSelection(const char* name) : MenuItem(name) {} void Do(); }; class DietCokeSelection : public MenuItem { public: DietCokeSelection(const char* name) : MenuItem(name) {} void Do(); }; class SpriteSelection : public MenuItem { public: SpriteSelection(const char* name) : MenuItem(name) {} void Do(); }; class WaterSelection : public MenuItem { public: WaterSelection(const char* name) : MenuItem(name) {} void Do(); }; class ChangeSelection : public MenuItem { public: ChangeSelection(const char* name) : MenuItem(name) {} void Do(); }; class ChangeBackSelection : public MenuItem { public: ChangeBackSelection(const char* name) : MenuItem(name) {} void Do(); }; class YesReallySelection : public MenuItem { public: YesReallySelection(const char* name) : MenuItem(name) {} void Do(); }; class NoJustKiddingSelection : public MenuItem { public: NoJustKiddingSelection(const char* name) : MenuItem(name) {} void Do(); }; void SingleBurgerSelection::Do() { printf("In RegularSingleBurgerSelection.\n"); } void DoubleBurgerSelection::Do() { printf("In RegularDoubleBurgerSelection.\n"); } void ChiliBurgerSelection::Do() { printf("In ChiliBurgerSelection.\n"); } void FatBurgerSelection::Do() { printf("In FatBurgerSelection.\n"); } void SLOBurgerSelection::Do() { printf("In SLOBurgerSelection.\n"); } void FriesSelection::Do() { printf("In FriesSelection.\n"); } void OnionRingsSelection::Do() { printf("In OnionRingsSelection.\n"); } void SmallSideOrderSelection::Do() { printf("In SmallSideOrderSelection.\n"); } void MediumSideOrderSelection::Do() { printf("In MediumSideOrderSelection.\n"); } void LargeSideOrderSelection::Do() { printf("In LargeSideOrderSelection.\n"); } void CokeSelection::Do() { printf("In CokeSelection.\n"); } void DietCokeSelection::Do() { printf("In DietCokeSelection.\n"); } void SpriteSelection::Do() { printf("In SpriteSelection.\n"); } void WaterSelection::Do() { printf("In WaterSelection.\n"); } void ChangeSelection::Do() { if (changeState == false) { menubar1->Remove(bmenu); /* hb->Remove(menubar1); hb->Insert(menubar2); hb->Reconfig(); t->Change(hb); */ changeState = true; } else world->RingBell(100); } void ChangeBackSelection::Do() { if (changeState == true) { hb->Remove(menubar2); hb->Insert(menubar1); hb->Reconfig(); t->Change(hb); changeState = false; } else world->RingBell(100); } void YesReallySelection::Do() { throw(Exit, NULL); } void NoJustKiddingSelection::Do() { } Interactor *BuildMenuBar() { menubar1 = new MenuBar; menubar2 = new MenuBar; bmenu = new PulldownMenu(" Burgers "); brmenu = new PullrightMenu("Regular ==>"); smenu = new PulldownMenu(" Sides "); dmenu = new PulldownMenu(" Drinks "); cmenu = new PulldownMenu(" Change "); emenu = new PulldownMenu(" Exit "); omenu = new PulldownMenu(" Other "); /* * Put a pull-right in the Regular selection, with double, single * selections. */ brmenu->Include(new SingleBurgerSelection("Single")); brmenu->Include(new DoubleBurgerSelection("Double")); bmenu->Include(brmenu); bmenu->Include(new ChiliBurgerSelection("Chili Burger")); bmenu->Include(new FatBurgerSelection("Fat Burger")); bmenu->Include(new SLOBurgerSelection("SLO Burger")); smenu->Include(new FriesSelection("Fries")); smenu->Include(new OnionRingsSelection("OnionRings")); dmenu->Include(new CokeSelection("Coke")); dmenu->Include(new DietCokeSelection("Diet")); dmenu->Include(new SpriteSelection("Sprite")); dmenu->Include(new WaterSelection("Water")); cmenu->Include(new ChangeSelection("Change")); cmenu->Include(new ChangeBackSelection("Change Back")); emenu->Include(new YesReallySelection("Yes Really")); emenu->Include(new NoJustKiddingSelection("No, Just Kidding")); omenu->Include(new NoJustKiddingSelection("No, Just Kidding")); menubar1->Include(bmenu); menubar1->Include(smenu); menubar1->Include(dmenu); menubar1->Include(cmenu); menubar1->Include(emenu); /* */ menubar2->Include(bmenu); menubar2->Include(smenu); menubar2->Include(cmenu); menubar2->Include(omenu); /* */ return menubar1; } static PropertyData properties[] = { { "menu*title", "Menu Test" }, { nil } }; static OptionDesc options[] = { { "-title", "menu*title", OptionValueNext }, { nil } }; int main (int argc, char* argv[]) { world = new World("menu", properties, options, argc, argv); hb = new MyHBox(); t = new Tray(); hb->Insert(BuildMenuBar()); t->Insert(hb); world->InsertApplication(t); if (! catch(Exit)) { world->Run(); } delete world; return 0; }