167 lines
4.0 KiB
C
167 lines
4.0 KiB
C
|
#ifndef __BA0101_H
|
||
|
#define __BA0101_H
|
||
|
|
||
|
#ifndef __ASSOC_H
|
||
|
#include <assoc.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __COLORS_H
|
||
|
#include <colors.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __IMAGE_H
|
||
|
#include <image.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __SCANNER_H
|
||
|
#include <scanner.h>
|
||
|
#endif
|
||
|
|
||
|
#ifndef __STACK_H
|
||
|
#include <stack.h>
|
||
|
#endif
|
||
|
|
||
|
|
||
|
class TSubmenu;
|
||
|
class TMenu;
|
||
|
|
||
|
class TMenuitem : public TObject
|
||
|
{
|
||
|
TSubmenu* _submenu;
|
||
|
TString _caption, _action;
|
||
|
int _icon;
|
||
|
char _type;
|
||
|
COLOR _color;
|
||
|
int _exist : 2;
|
||
|
bool _enabled : 2;
|
||
|
bool _firm : 2;
|
||
|
bool _password : 2;
|
||
|
bool _reloadmenu : 2;
|
||
|
|
||
|
protected:
|
||
|
bool perform_submenu() const;
|
||
|
bool perform_program() const;
|
||
|
|
||
|
public:
|
||
|
virtual bool ok() { return _caption.not_empty(); }
|
||
|
|
||
|
const TString& caption() const { return _caption; }
|
||
|
int icon() const;
|
||
|
const TString& action() const { return _action; }
|
||
|
bool enabled() const;
|
||
|
bool disabled() const { return !enabled(); }
|
||
|
|
||
|
COLOR color() const { return enabled() ? _color : DISABLED_COLOR; }
|
||
|
|
||
|
bool is_submenu() const { return _type == '[' && _action.not_empty(); }
|
||
|
bool is_program() const { return _type != '[' && _action.not_empty(); }
|
||
|
bool perform() const;
|
||
|
|
||
|
TSubmenu& submenu() const { return *_submenu; }
|
||
|
TMenu& menu() const;
|
||
|
|
||
|
void create(const char* t);
|
||
|
|
||
|
TMenuitem(TSubmenu* sm);
|
||
|
virtual ~TMenuitem() { }
|
||
|
};
|
||
|
|
||
|
class TSubmenu : public TObject
|
||
|
{
|
||
|
TMenu* _menu;
|
||
|
TString _name;
|
||
|
TString _caption;
|
||
|
TFilename _picture;
|
||
|
TArray _items;
|
||
|
bool _enabled : 2;
|
||
|
bool _firm : 2;
|
||
|
|
||
|
public:
|
||
|
void read(TScanner& scanner);
|
||
|
|
||
|
TMenu& menu() const { return *_menu; }
|
||
|
int find_string(const TString& str) const;
|
||
|
|
||
|
TMenuitem& item(int i) { return (TMenuitem&)_items[i]; }
|
||
|
const TMenuitem& item(int i) const { return (const TMenuitem&)_items[i]; }
|
||
|
const TMenuitem& operator[](int i) const { return item(i); }
|
||
|
|
||
|
const TString& name() const { return _name; }
|
||
|
const TString& caption() const { return _caption; }
|
||
|
const TString& picture() const { return _picture; }
|
||
|
int items() const { return _items.items(); }
|
||
|
|
||
|
TImage& image() const;
|
||
|
|
||
|
bool query_firm() const { return _firm; }
|
||
|
bool enabled() const { return _enabled; }
|
||
|
bool disabled() const { return !enabled(); }
|
||
|
|
||
|
bool perform(int i);
|
||
|
|
||
|
TSubmenu(TMenu* menu, const char* name);
|
||
|
virtual ~TSubmenu() { }
|
||
|
};
|
||
|
|
||
|
class TMenu : public TAssoc_array
|
||
|
{
|
||
|
TSubmenu* _current;
|
||
|
int _item;
|
||
|
TStack _stack;
|
||
|
|
||
|
TFilename _default_bmp;
|
||
|
TString _default_menu;
|
||
|
|
||
|
TAssoc_array _images;
|
||
|
TAssoc_array _modules;
|
||
|
|
||
|
TToken_string _dangerous;
|
||
|
|
||
|
TString _last_search;
|
||
|
TAssoc_array _ignore_list;
|
||
|
|
||
|
protected:
|
||
|
bool can_be_transparent(const TImage& i) const;
|
||
|
|
||
|
public: // TObject
|
||
|
virtual bool ok() const { return _current != NULL; }
|
||
|
|
||
|
public:
|
||
|
bool read(const char* name); // First call
|
||
|
bool read(const char* name, TString& root);
|
||
|
|
||
|
TSubmenu& current() const { return *_current; }
|
||
|
TSubmenu* find(const char* name) const { return (TSubmenu*)objptr(name); }
|
||
|
bool jumpto(TSubmenu *next);
|
||
|
bool jumpto_root();
|
||
|
|
||
|
TSubmenu& pop();
|
||
|
bool at_top() const { return _stack.count() == 0; }
|
||
|
|
||
|
void select(int i) { _item = i; }
|
||
|
int selected() const { return _item; }
|
||
|
TMenuitem& curr_item() { return _current->item(_item); }
|
||
|
TSubmenu* find_parent(const TSubmenu& sub);
|
||
|
|
||
|
bool perform();
|
||
|
TSubmenu* find_string(const TString& str);
|
||
|
TString& last_search_string() { return _last_search; }
|
||
|
TAssoc_array& search_ignore_list() { return _ignore_list; }
|
||
|
|
||
|
TImage& image(const char* name);
|
||
|
void reload_images();
|
||
|
|
||
|
bool has_module(const char* mod);
|
||
|
bool is_dangerous(const char* mod);
|
||
|
|
||
|
void set_dangerous_modules(const TToken_string& mod)
|
||
|
{ _dangerous = mod; }
|
||
|
|
||
|
TMenu() : _current(NULL), _item(0) { }
|
||
|
TMenu(const char* name) { read(name); }
|
||
|
virtual ~TMenu() { }
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|