/* * Simple program that demonstrates InterViews pull-down menus, pull-right * menus, and pull-down menu dividers. */ #include #include #include #include #include #include #include #include #include #include "std-macros.h" static exception Exit; /* * A PullDownMenuDivider displays a horizontal line extending the full * width of the menu, dividing it into two submenus. It's implemented as * a lobotomized MenuItem with a line instead of label. */ class MenuItemDivider : public MenuItem { public: MenuItemDivider(); protected: void Redraw(Coord, Coord, Coord, Coord); }; /* * MenuItemDivider listens to no events so it will neither * highlight itself nor execute any command. */ MenuItemDivider::MenuItemDivider () : MenuItem((Interactor*) nil) { Listen(noEvents); } /* * MenuItemDivider::Redraw displays a horizontal line spanning the canvas. */ void MenuItemDivider::Redraw (Coord l, Coord b, Coord r, Coord t) { output->ClearRect(canvas, l, b, r, t); Coord hy = ymax / 2; output->Line(canvas, l, hy, r, hy); } /* * Dont really need this any more. class RegularBurgerSelection : public MenuItem { void Do(); }; */ 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 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 YesReallySelection::Do() { throw(Exit, NULL); } void NoJustKiddingSelection::Do() { } Interactor *BuildMenuBar() { PulldownMenu *bmenu, *smenu, *dmenu, *emenu; PullrightMenu *brmenu; MenuBar *menubar; menubar = new MenuBar; bmenu = new PulldownMenu(" Burgers "); brmenu = new PullrightMenu("Regular ==>"); smenu = new PulldownMenu(" Sides "); dmenu = new PulldownMenu(" Drinks "); emenu = new PulldownMenu(" Exit "); /* * 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 MenuItemDivider); 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")); emenu->Include(new YesReallySelection("Yes Really")); emenu->Include(new NoJustKiddingSelection("No, Just Kidding")); menubar->Include(bmenu); menubar->Include(smenu); menubar->Include(dmenu); menubar->Include(emenu); return menubar; } static PropertyData properties[] = { { "menu*title", "Menu Test" }, { nil } }; static OptionDesc options[] = { { "-title", "menu*title", OptionValueNext }, { nil } }; int main (int argc, char* argv[]) { World* world = new World("menu", properties, options, argc, argv); world->InsertApplication(BuildMenuBar()); if (! catch(Exit)) { world->Run(); } delete world; return 0; }