#include #include #include #include #include #include #if XVT_OS == XVT_OS_WIN extern "C" { #include } #include #else #include #endif #include "ba0.h" /////////////////////////////////////////////////////////// // Picture Mask /////////////////////////////////////////////////////////// class TPicture_mask : public TMask { static short _id; static PICTURE _picture; protected: virtual void handler(WINDOW win, EVENT* ep); void set_picture(short id); public: TPicture_mask(const char* name, int dx, int dy, short picture_id); void reset(); }; short TPicture_mask::_id = 0; PICTURE TPicture_mask::_picture = 0L; void TPicture_mask::set_picture(short id) { if (id != _id) { _id = id; #if XVT_OS == XVT_OS_WIN if (_picture) picture_free(_picture); _picture = cpb_picture_load(id); #endif } } void TPicture_mask::reset() { #if XVT_OS == XVT_OS_WIN if (_picture) { picture_free(_picture); _picture = 0L; _id = 0; } #endif } TPicture_mask::TPicture_mask(const char* name, int dx, int dy, short pic) : TMask(name, 1, dx, dy) { set_picture(pic); } void TPicture_mask::handler(WINDOW win, EVENT* ep) { TMask::handler(win, ep); if (ep->type == E_UPDATE) { #if XVT_OS == XVT_OS_WIN if (_picture) cpb_win_picture_draw_at(win, _picture, 1, CHARY<<1); else #endif { const int max = 16; for (int i = 0; i < max; i++) { TTemp_window w(win); w.rect(i*2, i, max-i*2, max-i); } } } } /////////////////////////////////////////////////////////// // Menu application /////////////////////////////////////////////////////////// class TMenu_application : public TApplication { const char* _name; enum { MAXLEVEL = 1024 }; int _first[MAXLEVEL]; TArray _menu; // TAG|DESCRIPTION|ACTION int _level, _max; protected: void test_temp() const; void load_menu(); int do_level(); virtual bool create(); virtual bool menu(MENU_TAG m); public: TMenu_application(const char* name) : _name(name) {} }; static short last_button = 0; void TMenu_application::load_menu() { TScanner s(_name); _max = -1; while (s.line().not_empty()) { TToken_string* ts = new TToken_string(s.token()); int l = ts->get_int(); if (l < _max) { error_box("Item of level %d while %d was expected)", l, _max); l = _max; } if (l > _max) { if (l >= MAXLEVEL) { error_box("Too many menu levels: %d", l); l = _max; } _first[_max = l] = _menu.items(); } _menu.add(ts); } _first[++_max] = _menu.items(); } HIDDEN bool menu_item_handler(TMask_field&f, KEY k) { if (k == K_SPACE) { last_button = f.dlg(); f.mask().stop_run(K_AUTO_ENTER); } return TRUE; } int TMenu_application::do_level() { const int first = _first[_level]; const int last = _first[_level+1]; TToken_string& row = (TToken_string&)_menu[first]; const TString80 head(row.get(1)); const int width = 72; const int heigth = 18; const int bwidth = 20; const int x = width-bwidth-12; const short pic = BA0_PICTURE+(short)row.get_int(); TPicture_mask menu(head, width, heigth, pic); int y = 1; #if XVT_OS == XVT_OS_WIN TString16 t(format("#%d", BMP_STOPREC)); #else TString16 t; #endif for (int i = first+1; i < last; i++, y++) { TToken_string& row = (TToken_string&)_menu[i]; TString80 item(row.get(1)); if (isdigit(*row.get())) item << "..."; menu.add_static(-1, 0, item, x+4, y); menu.add_button(100+y, 0, t, x, y, 1, 1); menu.set_handler(100+y, menu_item_handler); } t = first ? "Menu precedente" : "Fine"; menu.add_button(first ? DLG_CANCEL : DLG_QUIT, 0, t, -22, -2, bwidth, 2); if (first) menu.add_button(DLG_QUIT, 0, "Fine", -12, -2, bwidth, 2); const int k = menu.run(); int m = 0; switch (k) { case K_ESC: m = -1; break; case K_QUIT: menu.reset(); m = -2; break; default: m = first+last_button-100; break; } return m; } void TMenu_application::test_temp() const { TFilename name; name.tempdir(); name << "/" << "ci*"; #if XVT_OS == XVT_OS_WIN struct _find_t f; if (_dos_findfirst(name, _A_NORMAL, &f) == 0 && yesno_box("Si desidera cancellare i file temporanei?")) { TIndwin pi(40, "Cancellazione file temporanei residui", FALSE, FALSE); TFilename dir; dir.tempdir(); do { name = dir; name << "/" << f.name; remove(name); } while (_dos_findnext(&f) == 0); } #endif } bool TMenu_application::create() { test_temp(); load_menu(); dispatch_e_menu(BAR_ITEM(1)); return TRUE; } bool TMenu_application::menu(MENU_TAG) { int refarray[256]; int i = 0; _level = 0; while (i >= 0) { const int m = do_level(); if (m >= 0) { TToken_string& row = (TToken_string&)_menu[m]; const char* option = row.get(2); if (option && *option) { const int l = atoi(option); if (l > 0) { const char* flags = row.get(); if (flags && strchr(flags, 'F') != NULL) set_firm(); refarray[i++] = _level; if (l < _max) _level = l; } else { TExternal_app a(option); a.run(); } } } else { if (m < -1) break; _level = (--i >= 0) ? refarray[i] : 0; } } return FALSE; } int main(int argc, char** argv) { const char* menu = (argc < 2) ? "prassi.mnu" : argv[1]; TMenu_application ma(menu); ma.run(argc, argv, "Menu Principale"); return TRUE; }