campo-sirio/include/applicat.cpp
alex dfa98abb64 Cambiato XVT_OS in XVT + XVT4.0
git-svn-id: svn://10.65.10.50/trunk@1176 c028cbd2-c16b-5b4b-a496-9718f37d4682
1995-03-27 14:42:52 +00:00

661 lines
14 KiB
C++
Executable File

#include <stdlib.h>
#include <xvt.h>
#if XVT_OS == XVT_OS_WIN
#include <windows.h>
#endif
#include <extcdecl.h>
#include <modaut.h>
#include <applicat.h>
#include <colors.h>
#include <config.h>
#include <mask.h>
#include <prefix.h>
#include <progind.h>
#include <relation.h>
#include <urldefid.h>
#include <utility.h>
#include <bagn002.h>
#define BITTEST(w,p) (((w) & (0x0001 << (p))) != 0)
///////////////////////////////////////////////////////////
// Metodi di accesso globali all'applicazione corrente
///////////////////////////////////////////////////////////
HIDDEN TApplication* _application = NULL;
TApplication& main_app()
{
CHECK(_application, "NULL application!");
return *_application;
}
bool xvt_running() { return _application != NULL; }
///////////////////////////////////////////////////////////
// Gestione dello sfondo della finestra principale
///////////////////////////////////////////////////////////
HIDDEN long backdrop_eh( WINDOW win, EVENT* ep)
{
xvt_dwin_clear(win, MASK_DARK_COLOR);
return 0L;
}
HIDDEN void create_backdrop( void )
{
#if XVT_OS == XVT_OS_WIN
xvt_create_statbar();
xvt_statbar_set("");
#else
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_MENU, COLOR_BLACK, COLOR_WHITE);
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_DIALOG, COLOR_BLUE, COLOR_WHITE);
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_WINDOW, COLOR_RED, COLOR_WHITE);
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_CONTROL, COLOR_BLACK, COLOR_WHITE);
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_DISABLED, COLOR_GRAY, COLOR_WHITE);
xvt_app_escape(XVT_ESC_CH_COLOR, XVT_CH_CLR_MNEMONIC, COLOR_RED, COLOR_WHITE);
RCT rct;
xvt_vobj_get_client_rect( TASK_WIN, &rct );
xvt_win_create(W_PLAIN, &rct, (char*) 0, 0, TASK_WIN,
WSF_NO_MENUBAR | WSF_CH_BACKDROP , EM_UPDATE,
backdrop_eh, 0L );
#endif
}
///////////////////////////////////////////////////////////
// Gestione del banner iniziale
///////////////////////////////////////////////////////////
class TBanner : public TWindow
{
protected:
virtual void handler(WINDOW win, EVENT* ep);
public:
TBanner();
virtual ~TBanner();
};
TBanner::TBanner()
{
create(-1, 6, 72, 6, "BANNER", WSF_NONE, W_PLAIN);
hide_brush();
open();
do_events();
}
TBanner::~TBanner()
{
if (is_open())
close();
}
void TBanner::handler(WINDOW win, EVENT* ep)
{
if (ep->type == E_UPDATE)
{
const int BIGY = 3*CHARY/2;
clear(COLOR_LTGRAY);
RCT r; xvt_vobj_get_client_rect(win, &r);
set_color(COLOR_WHITE, COLOR_LTGRAY);
set_font(XVT_FFN_TIMES, XVT_FS_BOLD | XVT_FS_ITALIC, BIGY);
char* t = (char*)(const char*)main_app().title();
int w = xvt_dwin_get_text_width(win, t, -1);
int a; xvt_dwin_get_font_metrics(win, NULL, &a, NULL);
int x = (r.right-w)>>1, y = (r.bottom+a)>>1 ;
xvt_dwin_draw_text(win, x+1, y+1, t, -1);
set_color(COLOR_BLACK, COLOR_LTGRAY);
xvt_dwin_draw_text(win, x, y, t, -1);
set_font(XVT_FFN_TIMES);
t = "PRASSI S.p.A.";
w = xvt_dwin_get_text_width(win, t, -1);
x = (r.right-r.left-w)>>1, y = BIGY;
xvt_dwin_draw_text(win, x, y, t, -1);
t = "Caricamento in corso";
w = xvt_dwin_get_text_width(win, t, -1);
x = (r.right-r.left-w)>>1, y = r.bottom - CHARY;
xvt_dwin_draw_text(win, x, y, t, -1);
r.left += 5; r.right -= 4;
r.top += 5; r.bottom -= 4;
set_pen(COLOR_WHITE); xvt_dwin_draw_rect(win, &r);
xvt_rect_offset(&r, -1, -1);
set_pen(COLOR_BLACK); xvt_dwin_draw_rect(win, &r);
xvt_dwin_draw_icon(win, CHARX<<1, CHARX<<1, ICON_RSRC);
}
else
TWindow::handler(win, ep);
}
long XVT_CALLCONV1 TApplication::task_eh(WINDOW win, EVENT *ep)
{
switch (ep->type)
{
case E_CREATE:
create_backdrop();
#if defined(DBG) && XVT_OS == XVT_OS_SCOUNIX
message_box("Attach to process %d ...", getpid());
#endif
do_events();
break;
#if XVT_OS == XVT_OS_WIN
case E_UPDATE:
backdrop_eh(win, ep);
break;
#endif
default:
break;
}
return _application->handler(win, ep);
}
long TApplication::handler(WINDOW win, EVENT* ep)
{
switch (ep->type)
{
case E_CREATE:
{
TBanner banner;
_create_ok = create();
}
if (_create_ok)
{
on_firm_change();
on_config_change();
#if XVT_OS == XVT_OS_SCOUNIX
do_events();
#endif
}
else
stop_run();
break;
case E_COMMAND:
switch(ep->v.cmd.tag)
{
case M_FILE_QUIT:
if (can_close())
stop_run();
break;
case M_FILE_PG_SETUP:
printer().set();
break;
case M_FILE_PRINT:
print();
break;
case M_FILE_NEW:
set_firm();
break;
case M_FILE_REVERT:
if (config())
on_config_change();
break;
case (M_FILE+11):
about();
break;
default:
if (ep->v.cmd.tag >= BAR_ITEM(1))
{
if(!menu(ep->v.cmd.tag))
stop_run();
}
break;
}
break;
case E_CLOSE:
if (can_close())
stop_run();
break;
case E_QUIT:
if (ep->v.query)
{
if (can_close())
xvt_app_allow_quit();
}
else
stop_run();
break;
default:
break;
}
return 0L;
}
void TApplication::stop_run()
{
if (_savefirm) prefix().set_codditta(_savefirm);
terminate();
xvt_app_destroy();
}
TApplication::TApplication() : _printer(NULL), _savefirm(0), _create_ok(FALSE)
, _bar(TASK_MENUBAR)
{}
TApplication::~TApplication()
{}
TPrinter* TApplication::set_printer(TPrinter* p)
{
TPrinter* printer = _printer;
_printer = p;
return printer;
}
TPrinter& TApplication::printer()
{
if (_printer == NULL)
_printer = new TPrinter;
return *_printer;
}
bool TApplication::create()
{
return TRUE;
}
bool TApplication::destroy()
{
return TRUE;
}
void TApplication::terminate()
{
close_all_dialogs();
if (_create_ok)
{
destroy(); // Distruzione files e maschere
#if XVT_OS == XVT_OS_WIN
const word WM_WAKEUP = RegisterWindowMessage("WAKEUP");
const HTASK ht = GetCurrentTask();
SendMessage(HWND_BROADCAST, WM_WAKEUP, ht, 0L);
if (fexist("prassi.hlp"))
{
HWND hwnd = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
WinHelp(hwnd, "prassi.hlp", HELP_QUIT, 0L);
}
#endif
if (_printer != NULL) // Distruzione dell'eventuale stampante
{
if (_printer->isopen())
_printer->close();
delete _printer;
_printer = NULL;
}
}
do_events();
if (use_files())
free_global_vars(); // Distruzione variabili globali
customize_controls(FALSE); // Rilascio eventuali DLL
}
const char* TApplication::get_module_name() const
{
TScanner scanner("prassi.aut");
bool ok = FALSE;
for (int aut = 0; scanner.line() != ""; aut++)
if (strncmp(scanner.token(), _name, 2) == 0) { ok = TRUE; break; }
const char* module = scanner.token().mid(3);
if (ok) ok = has_module(aut);
if (!ok)
{
error_box("Il modulo '%s' non e' autorizzato", module);
module = "";
}
return module;
}
void TApplication::set_perms()
{
CGetAut(1);
_dongle_aut.set(0, TRUE);
for (int i = 1 ; i < ENDAUT; i++)
{
const int af = i - 1;
const bool val = BITTEST(_int_tab0[af / 16], af % 16);
_dongle_aut.set(i, val);
}
_user_aut.set(0, TRUE);
const TString& utente = user();
if (utente.not_empty())
{
if (utente == "PRASSI")
{
for (int i = 1 ; i < ENDAUT; i++)
_user_aut.set(i);
}
else
{
TLocalisamfile users(LF_USER);
users.zero();
users.put("USERNAME", utente);
if (users.read() == NOERR)
{
const TString80 aut(users.get("AUTSTR"));
const int max = aut.len();
for (int i = 1 ; i < max; i++)
_user_aut.set(i, aut[i] == 'X');
}
}
}
}
void TApplication::check_parameters(int & argc, char* argv[])
{
if (strncmp(argv[argc-1], "-u", 2) == 0 || strncmp(argv[argc-1], "/u", 2) == 0)
user() = &argv[--argc][2];
#ifdef DBG
else user() = "PRASSI";
#endif
#if XVT_OS == XVT_OS_WIN
const long twin_style = WSF_ICONIZABLE | WSF_SIZE | WSF_CLOSE | WSF_MAXIMIZED;
xvt_vobj_set_attr(NULL_WIN,ATTR_WIN_PM_TWIN_STARTUP_STYLE, twin_style);
#endif
}
void TApplication::run(int argc, char* argv[], const char* title)
{
TFilename base(argv[0]);
base.ext(""); base.lower();
_title = title;
if (user().empty())
check_parameters(argc, argv);
__argc = argc;
__argv = (const char**)argv;
int addbar = 0;
if (argc > 1)
{
addbar = atoi(argv[1]+1);
_name = cmd2name(argv[0], argv[1]);
}
else
{
addbar = 0;
_name = cmd2name(argv[0]);
}
const int sn = get_serial_number();
if (sn < 0)
{
error_box("Perhaps you forgot to connect the dongle");
return;
}
if (use_files())
init_global_vars();
set_perms();
const TFixed_string mod(get_module_name());
if (mod.empty()) return;
TString caption; caption << "PRASSI S.p.A. - " << mod;
XVT_CONFIG cfg;
cfg.base_appl_name = (char*)base.name();
cfg.appl_name = (char*)(const char*)_title;
cfg.taskwin_title = (char*)(const char*)caption;
cfg.menu_bar_ID = TASK_MENUBAR+addbar;
cfg.about_box_ID = 0;
customize_controls(TRUE);
_application = this;
xvt_app_create(argc, argv, 0L, task_eh, &cfg);
}
// About box: risposta alla opzione Informazioni del menu File
void TApplication::about() const
{
#include <prassi.ver>
const TFilename n(__argv[0]);
message_box("PRASSI Versione %s\nProgramma %s\nLibreria del %s\nN.ro di serie %d-%s",
VERSION, (const char*)n.name(), __DATE__, SerNo, INTERNAL_VERSION);
}
// Risposta alla selezione Stampa del menu File
void TApplication::print()
{
#ifdef DBG
error_box("Non saprei bene cosa stampare!");
#endif
}
void TApplication::check_menu_item(MENU_TAG item)
{
xvt_menu_set_item_checked(TASK_WIN, item, TRUE);
xvt_menu_update(TASK_WIN);
}
void TApplication::uncheck_menu_item(MENU_TAG item)
{
xvt_menu_set_item_checked(TASK_WIN, item, FALSE);
xvt_menu_update(TASK_WIN);
}
void TApplication::enable_menu_item(MENU_TAG item, bool on)
{
xvt_menu_set_item_enabled(TASK_WIN, item, on);
xvt_menu_update(TASK_WIN);
}
void TApplication::dispatch_e_menu(MENU_TAG item)
{
#if XVT_OS == XVT_OS_WIN
HWND w = (HWND)xvt_vobj_get_attr(TASK_WIN, ATTR_NATIVE_WINDOW);
PostMessage(w, WM_COMMAND, item, 0L);
#else
::dispatch_e_menu(TASK_WIN, item);
#endif
}
bool TApplication::has_module(int module, int checktype) const
{
bool ok = TRUE;
if (checktype == CHK_ALL || checktype == CHK_DONGLE)
ok = _dongle_aut[module];
if (ok && checktype == CHK_ALL || checktype == CHK_USER)
ok = _user_aut[module];
return ok;
}
long TApplication::get_firm() const
{
return prefix().get_codditta();
}
const char* TApplication::get_firm_dir() const
{
return format("%s%s", __ptprf, prefix().name());
}
bool TApplication::set_firm(long newfirm)
{
const long oldfirm = get_firm();
if (newfirm < 1)
{
TMask mask("bagn002");
TString80 pp(__ptprf); pp.cut(pp.len()-1);
mask.set(F_PATHPREF, pp);
mask.show(-2, extended_firm());
disable_menu_item(M_FILE_NEW);
const KEY k = mask.run();
enable_menu_item(M_FILE_NEW);
if (k == K_ENTER)
{
newfirm = mask.get_long(F_CODDITTA);
const int tipodir = mask.get_int(F_TIPO);
if (tipodir == 0 && !prefix().exist(newfirm) &&
!build_firm_data(newfirm))
return FALSE;
if (tipodir > 0)
{
if (_savefirm == 0) _savefirm = oldfirm; // E' necessario ricordare la ditta ...
prefix().set(tipodir == 1 ? "com" : ""); // ... se si setta il prefix a com
return TRUE;
}
}
}
if (newfirm == oldfirm || newfirm < 1)
return newfirm > 0;
if (prefix().test(newfirm))
{
prefix().set_codditta(newfirm);
_savefirm = 0;
WINDOW w = cur_win();
if (w != NULL_WIN)
{
EVENT e;
e.type = E_COMMAND;
e.v.cmd.tag = M_FILE_NEW;
e.v.cmd.shift = e.v.cmd.control = 0;
xvt_win_dispatch_event(w, &e);
}
on_firm_change();
on_config_change();
}
return TRUE;
}
bool TApplication::config()
// gestisce le voci di configurazione
// le si passa il file in cui cercare il proprio
// paragrafo (comunque relativo alla ditta)
// se non c'e', viene creato copiando il default
// la variabile EdMask di quel paragrafo specifica
// la maschera da usare
{
TConfig cnf(CONFIG_DITTA);
bool ok = FALSE;
const TFilename maskname(cnf.get("EdMask"));
if (maskname.empty())
return warning_box("Nessun parametro da configurare");
TMask m(maskname);
// carica campi
for (int i = 0; i < m.fields(); i++)
{
TMask_field& f = m.fld(i);
const TFieldref* fref = f.field();
if (fref != NULL)
{
const char* fname = fref->name();
if (fname != NULL)
{
TString& oldvl = cnf.get(fname);
if (!oldvl.empty())
f.set(oldvl);
}
}
}
// run mask
disable_menu_item(M_FILE_REVERT);
if (m.run() == K_ENTER && m.dirty())
{
// aggiusta campi
for (i = 0; i < m.fields(); i++)
{
TMask_field& f = m.fld(i);
if (f.dirty())
{
const TFieldref* fref = f.field();
if (fref != NULL)
cnf.set(fref->name(), f.get(), NULL, TRUE);
}
}
ok = TRUE;
}
enable_menu_item(M_FILE_REVERT);
return ok;
}
void TApplication::set_cursor(bool w)
{
static int _count = 0;
WINDOW ww = cur_win();
if (ww == NULL_WIN) ww = TASK_WIN;
if (w)
{
if (_count == 0)
xvt_win_set_cursor(ww, CURSOR_WAIT);
_count++;
}
else
{
_count--;
CHECK(_count >= 0, "end_wait without matching begin_wait");
if (_count == 0)
xvt_win_set_cursor(ww, CURSOR_ARROW);
}
}
void TApplication::on_firm_change()
{}
void TApplication::on_config_change()
{}