#include #include #pragma interface class Menu; // rudimentary invisible menu with just an EXIT fkey class bmsApp: virtual public Karet { bmsApp(const bmsApp &); bmsApp&operator=(const bmsApp &); Background b; protected: Menu *menu; public: enum { EXIT }; bmsApp(); bmsApp(int bfsiz); // enable time delay void key(int); void cmd(int); ~bmsApp(); }; struct MenuItem { enum State { ENABLE, DISABLE, GRAY }; private: const char *title; CHTYPE attr; short pfkey; // shortcut key //short keypos; // position of key letter in title State st; public: MenuItem(const char *t = 0); void operator=(const char *t) { title = t; } const char *getTitle() const { return title; } bool match(int ky); State state() const { return st; } void state(State); short shortcut() const { return pfkey; } void shortcut(short k) { pfkey = k; } void select(); void deselect(); virtual void doit(Karet *); virtual Menu *remove() { return 0; } virtual Menu *subMenu() const { return 0; } virtual int id() const { return -1; } virtual Rect dim() const; // size of display area virtual void draw(Window *,const Rect &); virtual ~MenuItem() {} }; class CmdMenuItem: public MenuItem { int cmd; public: CmdMenuItem(const char *t,int i): cmd(i), MenuItem(t) { } void doit(Karet *); int id() const { return cmd; } }; class SubMenu: public MenuItem { Menu *submenu; Point origin; // where to pop up public: SubMenu(const char *t,Menu &p); Menu *remove(); void doit(Karet *); //Submenu(SubMenu &m) { submenu = m.remove(); } Menu *subMenu() const { return submenu; } void draw(Window *,const Rect &); ~SubMenu(); }; class Menu: virtual public Karet, virtual public Window { Menu(const Menu &); // no copying Menu& operator=(const Menu &); static MenuItem def; int cursel; // current selection Array m; Karet *app; public: virtual Rect dim() const = 0; // compute display size void getfocus(); void losefocus(); void key(int); void cmd(int); int popupAt(Point,Karet * = 0); Menu(); int count() const { return m.size(); } // return number of items //MenuItem *&operator[](int pos); MenuItem *operator[](int pos) const; Menu &operator+(MenuItem *p); Menu &insert(int pos,MenuItem *); int pos(int cmd) const; // find position of command code void del(int pos); MenuItem *remove(int pos); // delete menu item */ virtual ~Menu(); }; struct PopupMenu: Menu, FrameWin { PopupMenu(const char *title = 0); PopupMenu(const PopupMenu &); PopupMenu& operator=(const PopupMenu &); Rect dim() const; // compute display size void draw(const Rect &); void key(int); private: int titlelen; }; struct BarMenu: Menu { BarMenu() {} virtual Rect dim() const; // compute display size void draw(const Rect &); void key(int); private: BarMenu(const BarMenu &); BarMenu& operator=(const BarMenu &); };