git-svn-id: svn://10.65.10.50/branches/R_10_00@22915 c028cbd2-c16b-5b4b-a496-9718f37d4682
921 lines
25 KiB
C++
Executable File
921 lines
25 KiB
C++
Executable File
#include "ba0103.h"
|
|
|
|
#include <applicat.h>
|
|
#include <config.h>
|
|
#include <controls.h>
|
|
#include <defmask.h>
|
|
#include <dongle.h>
|
|
#include <execp.h>
|
|
#include <prefix.h>
|
|
#include <utility.h>
|
|
|
|
enum { DLG_TREE = 101, DLG_LOOK = 102, DLG_MAIN = 103 };
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TApp_window & TBook_window declarations
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TBook_window;
|
|
|
|
class TApp_window : public TWindow
|
|
{
|
|
TBook_window* _owner;
|
|
TString _appname;
|
|
|
|
protected:
|
|
virtual long handler(WINDOW win, EVENT* ep);
|
|
|
|
public:
|
|
const TString& app_name() const { return _appname; }
|
|
|
|
TApp_window(TBook_window* owner, const char* appname);
|
|
~TApp_window();
|
|
};
|
|
|
|
class TBook_window : public TControl_host_window
|
|
{
|
|
TImage _logo, _back;
|
|
TAssoc_array _alfano;
|
|
|
|
protected:
|
|
virtual void update();
|
|
|
|
void force_page(short page);
|
|
void erode_antipa();
|
|
|
|
public:
|
|
virtual long handler(WINDOW win, EVENT* ep); // Used by E_PROCESS
|
|
WINDOW notebook() const { return _ctrl; }
|
|
short pages() const;
|
|
short curr_page() const;
|
|
WINDOW page_win(short pg) const;
|
|
short find_page(WINDOW win) const;
|
|
short add_page(const TMenuitem& mi);
|
|
void set_page_caption(short page, const TString& caption, int icon);
|
|
bool remove_page(WINDOW page);
|
|
void set_logo(const char* logo);
|
|
void set_back(const TString& back);
|
|
void kill_processes();
|
|
|
|
TBook_window(int x, int y, int dx, int dy, WINDOW parent, TWindowed_field* owner);
|
|
~TBook_window();
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TApp_window
|
|
///////////////////////////////////////////////////////////
|
|
|
|
long TApp_window::handler(WINDOW win, EVENT* ep)
|
|
{
|
|
switch (ep->type)
|
|
{
|
|
/*
|
|
case E_TIMER:
|
|
if (xvt_vobj_is_focusable(win))
|
|
{
|
|
// Leggo il titolo della finestra corrente
|
|
TString256 title;
|
|
xvt_vobj_get_title(win, title.get_buffer(), title.size());
|
|
// Se la finestra ospita gia' un'applicazione non si chiama piu' "__CAMPO_HOST_WINDOW__"
|
|
if (title != __MAGIC_CAPTION__)
|
|
{
|
|
if (xvt_win_get_children_count(win) == 0) // Se l'applicazione e' morta ...
|
|
{
|
|
xvt_timer_destroy(ep->v.timer.id); // Ammazzo il timer ...
|
|
_owner->remove_page(win); // ... e pure la pagina ospitante
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
*/
|
|
case E_DESTROY:
|
|
xvt_sys_close_children(win);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return TWindow::handler(win, ep);
|
|
}
|
|
|
|
TApp_window::TApp_window(TBook_window* owner, const char* appname) : _owner(owner), _appname(appname)
|
|
{
|
|
WINDOW w = create(0, 0, -1, -1, __MAGIC_CAPTION__, WSF_NONE, W_PLAIN, owner->notebook());
|
|
//xvt_timer_create(w, 1000); // Ogni tanto controllo che l'applicazione sia ancora viva
|
|
}
|
|
|
|
TApp_window::~TApp_window()
|
|
{
|
|
xvt_sys_close_children(win());
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TBook_window
|
|
///////////////////////////////////////////////////////////
|
|
|
|
void TBook_window::update()
|
|
{
|
|
// Disegno lo sfondo solo se non esiste nessun notebook che occupa tutto lo spazio!
|
|
if (_ctrl == NULL_WIN)
|
|
{
|
|
clear(NORMAL_BACK_COLOR);
|
|
|
|
if (ADVANCED_GRAPHICS)
|
|
{
|
|
WINDOW w = win();
|
|
RCT rctw; xvt_vobj_get_client_rect(w, &rctw);
|
|
if (rctw.right >= 64 && rctw.bottom >= 64)
|
|
{
|
|
if (_back.ok())
|
|
_back.draw(w, rctw, 'L', 'T', '*'); // Disegna sfondo in alto
|
|
if (_logo.ok())
|
|
{
|
|
const RCT& r = _logo.draw(w, rctw, 'R', 'B', '-'); // Disegna logo in basso
|
|
/* if (_back.ok() && r.top >= 64)
|
|
{
|
|
rctw.bottom = r.top;
|
|
_back.draw(w, rctw, 'R', 'T', '*'); // Disegna sfondo in alto
|
|
}
|
|
*/
|
|
}
|
|
|
|
const PNT pnt = { 0, 0 };
|
|
draw_spider(w, 0x3, pnt);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
short TBook_window::pages() const
|
|
{
|
|
return _ctrl == NULL_WIN ? 0 : xvt_notebk_get_num_tabs(_ctrl);
|
|
}
|
|
|
|
short TBook_window::curr_page() const
|
|
{
|
|
return _ctrl == NULL_WIN ? -1 : xvt_notebk_get_front_page(_ctrl);
|
|
}
|
|
|
|
static BOOLEAN hell_riser(WINDOW child, long data)
|
|
{
|
|
if (data > 0)
|
|
xvt_vobj_raise(child);
|
|
xvt_win_enum_wins(child, hell_riser, data+1, 0);
|
|
return TRUE;
|
|
}
|
|
|
|
void TBook_window::force_page(short page)
|
|
{
|
|
if (page >= 0 && page < pages()) // Implies _ctrl != NULL_WIN too
|
|
{
|
|
xvt_notebk_set_front_page(_ctrl, page);
|
|
WINDOW w = xvt_notebk_get_page(_ctrl, page);
|
|
xvt_win_enum_wins(w, hell_riser, 0, 0);
|
|
}
|
|
}
|
|
|
|
long TBook_window::handler(WINDOW win, EVENT* ep)
|
|
{
|
|
switch (ep->type)
|
|
{
|
|
case E_MOUSE_MOVE:
|
|
if (_ctrl == NULL_WIN)
|
|
draw_spider(win, 0x3, ep->v.mouse.where);
|
|
break;
|
|
case E_CONTROL:
|
|
if (ep->v.ctl.ci.type == WC_NOTEBK && ep->v.ctl.ci.win == _ctrl)
|
|
{
|
|
if (ep->v.ctl.ci.v.notebk.page != NULL_WIN) // != NULL_WIN means page CHANGED, non changing!
|
|
force_page(ep->v.ctl.ci.v.notebk.page_new);
|
|
return 0L;
|
|
}
|
|
break;
|
|
case E_SIZE:
|
|
if (pages() > 0)
|
|
dispatch_e_menu(cur_win(), 8883); // Notifica un ridimensionamento indesiderato
|
|
break;
|
|
case E_PROCESS:
|
|
{
|
|
TString8 pid; pid << ep->v.process.pid;
|
|
switch (ep->v.process.msg_id)
|
|
{
|
|
case 0:
|
|
{
|
|
TString16 pg; pg << (long)page_win(pages()-1);
|
|
_alfano.add(pid, pg); // Memorizza la pagina che ospita il processo
|
|
}
|
|
break;
|
|
default:
|
|
{
|
|
const TString* pg = (const TString*)_alfano.objptr(pid);
|
|
if (pg != NULL)
|
|
{
|
|
WINDOW pw = atol(*pg); // Converte pg
|
|
_alfano.remove(pid); // Distrugge pg
|
|
remove_page(pw); // Elimina pagina
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return TControl_host_window::handler(win, ep);
|
|
}
|
|
|
|
WINDOW TBook_window::page_win(short pg) const
|
|
{
|
|
WINDOW win = NULL_WIN;
|
|
if (_ctrl != NULL_WIN)
|
|
{
|
|
if (pg < 0)
|
|
pg = xvt_notebk_get_front_page(_ctrl);
|
|
win = xvt_notebk_get_page(_ctrl, pg);
|
|
}
|
|
return win;
|
|
}
|
|
|
|
short TBook_window::find_page(WINDOW win) const
|
|
{
|
|
short pg = -1;
|
|
for (pg = pages()-1; pg >= 0; pg--)
|
|
if (xvt_notebk_get_page(_ctrl, pg) == win)
|
|
break;
|
|
return pg;
|
|
}
|
|
|
|
short TBook_window::add_page(const TMenuitem& mi)
|
|
{
|
|
if (_ctrl == NULL_WIN)
|
|
{
|
|
XVT_COLOR_COMPONENT xcc[4]; memset(xcc, 0, sizeof(xcc));
|
|
xcc[0].type = XVT_COLOR_BACKGROUND; xcc[0].color = MASK_BACK_COLOR;
|
|
xcc[1].type = XVT_COLOR_FOREGROUND; xcc[1].color = NORMAL_COLOR;
|
|
|
|
WIN_DEF wd; memset(&wd, 0, sizeof(wd));
|
|
wd.wtype = WC_NOTEBK;
|
|
wd.ctlcolors = xcc;
|
|
wd.v.ctl.ctrl_id = DLG_MAIN;
|
|
wd.v.ctl.font_id = xvtil_default_font();
|
|
wd.v.ctl.flags = CTL_FLAG_TAB_BOTTOM; // should be wxCHECK_VERSION(2,8,9)
|
|
wd.v.ctl.flags |= CTL_FLAG_CENTER_JUST; // old compatibility flags
|
|
|
|
xvt_vobj_get_client_rect(win(), &wd.rct);
|
|
_ctrl = xvt_ctl_create_def(&wd, win(), 0L);
|
|
// Blocca le dimensioni del pannello (Non va micca!)
|
|
xvt_pane_set_size_range(win(), wd.rct.right, wd.rct.right, wd.rct.right);
|
|
enable_options_menu(false); // Disabilita le opzioni
|
|
}
|
|
|
|
for (short pg = pages()-1; pg >= 0; pg--)
|
|
{
|
|
WINDOW awin = xvt_notebk_get_page(_ctrl, pg);
|
|
TApp_window* w = (TApp_window*)xvt_vobj_get_data(awin);
|
|
if (w != NULL && w->app_name() == mi.action())
|
|
{
|
|
force_page(pg);
|
|
return -1; // Don't perform menu!
|
|
}
|
|
}
|
|
|
|
TApp_window* w = new TApp_window(this, mi.action());
|
|
const short pg = xvt_notebk_add_page(_ctrl, w->win(), mi.caption(), NULL, -1);
|
|
if (pg >= 0)
|
|
force_page(pg);
|
|
else
|
|
delete w;
|
|
|
|
return pg;
|
|
}
|
|
|
|
void TBook_window::set_page_caption(short page, const TString& caption, int icon)
|
|
{
|
|
if (_ctrl != NULL_WIN && page >= 0)
|
|
{
|
|
xvt_notebk_set_tab_title(_ctrl, page, caption); // Titolo dell'orecchio
|
|
xvt_notebk_set_tab_icon(_ctrl, page, icon); // Icona dell'orecchio
|
|
xvt_notebk_set_page_title(_ctrl, page, caption); // Titolo della finestra
|
|
}
|
|
}
|
|
|
|
bool TBook_window::remove_page(WINDOW page)
|
|
{
|
|
bool bFound = false;
|
|
for (int p = pages()-1; p >= 0; p--)
|
|
{
|
|
WINDOW win = xvt_notebk_get_page(_ctrl, p);
|
|
if (win == page || page == NULL_WIN)
|
|
{
|
|
xvt_notebk_rem_page(_ctrl, p);
|
|
bFound = true;
|
|
if (page != NULL_WIN)
|
|
break;
|
|
}
|
|
}
|
|
if (bFound)
|
|
{
|
|
xvt_vobj_raise(TASK_WIN); // Riporta in primo piano il menu principale
|
|
if (pages() == 0)
|
|
{
|
|
erode_antipa();
|
|
force_update();
|
|
}
|
|
else
|
|
force_page(0);
|
|
}
|
|
return bFound;
|
|
}
|
|
|
|
void TBook_window::erode_antipa()
|
|
{
|
|
if (_ctrl != NULL_WIN)
|
|
{
|
|
// Ammazza anche tutti ... coloro che son sospesi
|
|
for (int p = pages()-1; p >= 0; p--)
|
|
xvt_notebk_rem_page(_ctrl, p);
|
|
xvt_vobj_destroy(_ctrl);
|
|
_ctrl = NULL_WIN;
|
|
enable_options_menu(true); // Riabilita le opzioni
|
|
|
|
// Controlla se qualche simpaticone ha cambiato ditta a nostra insaputa
|
|
const long dt = main_app().get_firm();
|
|
const long di = ini_get_int(CONFIG_INSTALL, "Main", "Firm");
|
|
if (di > 0 && dt > 0 && di != dt)
|
|
main_app().set_firm(di);
|
|
}
|
|
}
|
|
|
|
void TBook_window::set_logo(const char* logo)
|
|
{
|
|
_logo.load(logo);
|
|
|
|
if (_logo.ok())
|
|
{
|
|
if (is_power_reseller(true))
|
|
{
|
|
#ifdef DBG
|
|
const clock_t start = clock();
|
|
#endif
|
|
|
|
const short w = _logo.width();
|
|
const short h = _logo.height();
|
|
const short h2 = h/4;
|
|
|
|
XVT_IMAGE big = xvt_image_create(XVT_IMAGE_RGB, w, h+h2, MASK_BACK_COLOR);
|
|
RCT rct; xvt_rect_set(&rct, 0, 0, w, h);
|
|
xvt_image_transfer(big, _logo.xvt_image(), &rct, &rct);
|
|
|
|
XVT_IMAGE tile = get_background_texture();
|
|
if (tile != NULL)
|
|
{
|
|
short tw, th; xvt_image_get_dimensions(tile, &tw, &th);
|
|
if (tw > 0 && th > 0)
|
|
{
|
|
// Elegante ma lento
|
|
/* RCT src; xvt_rect_set(&src, 0, 0, tw, th);
|
|
for (short y = 0; y < h2; y += th)
|
|
{
|
|
for (short x = 0; x < w; x += tw)
|
|
{
|
|
RCT dst; xvt_rect_set(&dst, x, y+h, x+tw, y+th+h);
|
|
xvt_image_transfer(big, tile, &dst, &src);
|
|
}
|
|
}
|
|
*/
|
|
#ifdef DBG
|
|
// #pragma omp parallel for
|
|
#endif
|
|
// Bovino ma veloce
|
|
for (short y = 0; y < h2; y++)
|
|
{
|
|
for (short x = 0; x < w; x++)
|
|
{
|
|
const COLOR rgb = xvt_image_get_pixel(tile, x % tw, y % th);
|
|
xvt_image_set_pixel(big, x, y+h, rgb);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Copia tutti i pixel non neri/grigi/bianchi
|
|
#ifdef DBG
|
|
#pragma omp parallel for
|
|
#endif
|
|
for (short y = 0; y < h2; y++)
|
|
{
|
|
const double weight = 0.5+double(y)/double(2*h2);
|
|
const short sy = h-y*h/h2-1;
|
|
for (short x = 0; x < w; x++)
|
|
{
|
|
const short sx = x-2*y;
|
|
if (sx >= 0)
|
|
{
|
|
const COLOR src = xvt_image_get_pixel(big, sx, sy);
|
|
const unsigned char r = XVT_COLOR_GET_RED(src);
|
|
const unsigned char g = XVT_COLOR_GET_GREEN(src);
|
|
const unsigned char b = XVT_COLOR_GET_BLUE(src);
|
|
if (abs(r-g)>8 || abs(g-b)>8) // Non e' grigio, cioe' !(r==g && g==b)
|
|
{
|
|
const COLOR dst = xvt_image_get_pixel(big, x, y+h);
|
|
const COLOR col = blend_colors(dst, src, weight);
|
|
xvt_image_set_pixel(big, x, y+h, col);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#ifdef DBG
|
|
const clock_t tot = clock() - start;
|
|
#endif
|
|
|
|
_logo.set(big);
|
|
}
|
|
else
|
|
{
|
|
if (can_be_transparent(_logo))
|
|
_logo.convert_transparent_color(NORMAL_BACK_COLOR);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TBook_window::set_back(const TString& back)
|
|
{
|
|
if (ADVANCED_GRAPHICS && is_power_station())
|
|
{
|
|
TFilename str = back;
|
|
str.ext("png");
|
|
bool ok = str.custom_path();
|
|
if (!ok)
|
|
{
|
|
str.ext("jpg");
|
|
ok = str.custom_path();
|
|
}
|
|
if (!ok)
|
|
{
|
|
str.ext("gif");
|
|
ok = str.custom_path();
|
|
}
|
|
if (ok && _back.load(back))
|
|
{
|
|
TWait_cursor hourglass;
|
|
const short w = _back.width();
|
|
const short h = _back.height();
|
|
for (short y = 0; y < h; y++)
|
|
{
|
|
for (short x = 0; x < w; x++)
|
|
{
|
|
const COLOR rgb = _back.get_pixel(x, y);
|
|
if (rgb != NORMAL_BACK_COLOR)
|
|
{
|
|
const COLOR col = blend_colors(NORMAL_BACK_COLOR, rgb, 0.9);
|
|
if (col != rgb)
|
|
_back.set_pixel(x, y, col);
|
|
}
|
|
}
|
|
}
|
|
if (pages() == 0)
|
|
force_update();
|
|
}
|
|
}
|
|
}
|
|
|
|
void TBook_window::kill_processes()
|
|
{
|
|
TString_array pid;
|
|
_alfano.get_keys(pid);
|
|
for (int i = pid.last(); i >= 0; i--)
|
|
{
|
|
const long p = atol(pid.row(i));
|
|
xvt_sys_kill(p);
|
|
}
|
|
}
|
|
|
|
TBook_window::TBook_window(int x, int y, int dx, int dy,
|
|
WINDOW parent, TWindowed_field* owner)
|
|
: TControl_host_window(x, y, dx, dy, parent, owner), _logo(""), _back("")
|
|
{
|
|
set_logo(get_logo());
|
|
}
|
|
|
|
TBook_window::~TBook_window()
|
|
{ erode_antipa(); }
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TBook_field
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TBook_field : public TWindowed_field
|
|
{
|
|
protected:
|
|
virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
|
|
|
|
public:
|
|
virtual void create(short dlg, int x, int y, int dx, int dy, WINDOW parent);
|
|
|
|
short pages() const;
|
|
short add_page(const TMenuitem& mi);
|
|
void set_page_caption(short page, const TString& caption, int icon);
|
|
void set_back(const TString& image);
|
|
WINDOW page_win(short page);
|
|
void remove_all_pages();
|
|
void remove_page(short page);
|
|
|
|
void kill_processes() { ((TBook_window&)win()).kill_processes(); }
|
|
TBook_field(TMask* m) : TWindowed_field(m) {}
|
|
};
|
|
|
|
short TBook_field::pages() const
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
return bw.pages();
|
|
}
|
|
|
|
short TBook_field::add_page(const TMenuitem& mi)
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
return bw.add_page(mi);
|
|
}
|
|
|
|
void TBook_field::set_page_caption(short page, const TString& caption, int icon)
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
bw.set_page_caption(page, caption, icon);
|
|
}
|
|
|
|
void TBook_field::set_back(const TString& image)
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
bw.set_back(image);
|
|
}
|
|
|
|
WINDOW TBook_field::page_win(short page)
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
return bw.page_win(page);
|
|
}
|
|
|
|
void TBook_field::remove_all_pages()
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
bw.remove_page(NULL_WIN);
|
|
}
|
|
|
|
void TBook_field::remove_page(short page)
|
|
{
|
|
TBook_window& bw = (TBook_window&)win();
|
|
if (page >= 0)
|
|
{
|
|
WINDOW pw = bw.page_win(page);
|
|
if (pw != NULL_WIN)
|
|
bw.remove_page(pw);
|
|
}
|
|
else
|
|
bw.remove_page(NULL_WIN);
|
|
}
|
|
|
|
TField_window* TBook_field::create_window(int x, int y, int dx, int dy, WINDOW parent)
|
|
{
|
|
return new TBook_window(x, y, dx, dy, parent, this);
|
|
}
|
|
|
|
void TBook_field::create(short dlg, int x, int y, int dx, int dy, WINDOW parent)
|
|
{
|
|
_dlg = dlg;
|
|
_win = create_window(x, y, dx, dy, parent);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TOutlook_mask
|
|
///////////////////////////////////////////////////////////
|
|
|
|
void TOutlook_mask::save_perspective(int per)
|
|
{
|
|
const TTree_field& bf = tfield(DLG_TREE);
|
|
TString str(_per_def.size());
|
|
const int sz = xvt_pane_manager_save_perspective(bf.win().win(), NULL, 0);
|
|
xvt_pane_manager_save_perspective(bf.win().win(), str.get_buffer(sz), sz);
|
|
switch (per)
|
|
{
|
|
case 1:
|
|
{
|
|
TConfig ini(CONFIG_GUI, "ba0103");
|
|
ini.set("Layout", str, NULL, true, bf.dlg());
|
|
}
|
|
break;
|
|
case 2: _per_tmp = str; break;
|
|
default: _per_def = str; break;
|
|
}
|
|
}
|
|
|
|
void TOutlook_mask::load_perspective(int per)
|
|
{
|
|
const TTree_field& bf = tfield(DLG_TREE);
|
|
TString str;
|
|
switch (per)
|
|
{
|
|
case 1:
|
|
{
|
|
TConfig ini(CONFIG_GUI, "ba0103");
|
|
str = ini.get("Layout", NULL, bf.dlg());
|
|
}
|
|
break;
|
|
case 2: str = _per_tmp; break;
|
|
default: str = _per_def; break;
|
|
}
|
|
xvt_pane_manager_load_perspective(bf.win().win(), str);
|
|
}
|
|
|
|
TBook_field& TOutlook_mask::book_field() const
|
|
{ return (TBook_field&)field(DLG_MAIN); }
|
|
|
|
bool TOutlook_mask::can_be_closed() const
|
|
{
|
|
const bool yes = !is_running();
|
|
if (!yes)
|
|
{
|
|
TBook_field& bf = book_field();
|
|
if (bf.pages() > 0)
|
|
{
|
|
TMask cm(TR("Chiusura applicazioni"), 1, 50, 9);
|
|
|
|
TToken_string options;
|
|
options = TR("Non chiudere le applicazioni in esecuzione");
|
|
options.add(TR("Chiusura forzata (solo in caso d'emergenza)"));
|
|
cm.add_radio(DLG_USER, 0, TR("Azione"), 1, 0, 48, "0|1", options);
|
|
|
|
cm.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
|
|
cm.add_button(DLG_CANCEL, 0, "", -22, -1, 10, 2);
|
|
|
|
if (cm.run() == K_ENTER && cm.get_int(DLG_USER))
|
|
bf.kill_processes();
|
|
}
|
|
if (bf.pages() == 0)
|
|
((TOutlook_mask*)this)->send_key(K_FORCE_CLOSE, 0);
|
|
}
|
|
return yes;
|
|
}
|
|
|
|
short TOutlook_mask::add_page(const TMenuitem& mi)
|
|
{
|
|
TBook_field& bf = book_field();
|
|
if (bf.pages() == 0)
|
|
save_perspective(2); // Save temporary perspective
|
|
return bf.add_page(mi);
|
|
}
|
|
|
|
void TOutlook_mask::set_page_caption(short page, const TString& caption, int icon)
|
|
{
|
|
TBook_field& bf = book_field();
|
|
bf.set_page_caption(page, caption, icon);
|
|
}
|
|
|
|
long TOutlook_mask::handler(WINDOW w, EVENT* ep)
|
|
{
|
|
if (ep->type == E_COMMAND)
|
|
{
|
|
switch (ep->v.cmd.tag)
|
|
{
|
|
case 8001:
|
|
set(DLG_LOOK, "", true); // Seleziona menu completo
|
|
break;
|
|
case 8002:
|
|
load_perspective(0); // Ricarica default
|
|
break;
|
|
case 8003:
|
|
xvt_dm_post_string_prompt(TR("Testo da cercare"),
|
|
_last_search.get_buffer(), _last_search.size());
|
|
// continue to 8004
|
|
case 8004:
|
|
if (_last_search.full() && _tree.find_string(_last_search))
|
|
{
|
|
TTree_field& tf = tfield(DLG_TREE);
|
|
synchronize_tree_field(tf);
|
|
tf.select_current();
|
|
}
|
|
break;
|
|
case 8005:
|
|
dispatch_e_menu(TASK_WIN, M_FILE_ABOUT);
|
|
break;
|
|
case 8883:
|
|
if (!_locked && _per_tmp.not_empty())
|
|
{
|
|
_locked = true;
|
|
load_perspective(2); // Ripristina layout predefinito
|
|
do_events(); // Evita doppio evento E_SIZE
|
|
_locked = false;
|
|
}
|
|
break;
|
|
default : break;
|
|
}
|
|
} else
|
|
if (ep->type == E_PROCESS)
|
|
{
|
|
TBook_field& bf = book_field();
|
|
TBook_window& bw = (TBook_window&)bf.win();
|
|
bw.handler(bw.win(), ep);
|
|
}
|
|
return TSpidey_mask::handler(w, ep);
|
|
}
|
|
|
|
void TOutlook_mask::on_firm_change()
|
|
{
|
|
WINDOW pane = dlg2win(DLG_TREE);
|
|
if (pane != NULL_WIN)
|
|
xvt_pane_set_title(pane, prefix().firm().ragione_sociale());
|
|
TSpidey_mask::on_firm_change();
|
|
}
|
|
|
|
bool TOutlook_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case DLG_TREE:
|
|
if (e == fe_button)
|
|
{
|
|
const TMenuitem& mi = _tree.curr_item();
|
|
if (mi.enabled())
|
|
{
|
|
if (mi.is_submenu())
|
|
{
|
|
if (!_tree.expanded() || mi.child_submenu()->query_firm())
|
|
mi.perform();
|
|
}
|
|
else
|
|
{
|
|
TBook_field& bf = book_field();
|
|
// ba1 e ba2 sono programmi di manutenzione da eseguire in modo esclusivo
|
|
if (mi.run_modal())
|
|
{
|
|
if (bf.pages() > 0)
|
|
return warning_box(TR("Questa applicazione richiede che vengano chiuse tutte le altre!"));
|
|
|
|
mi.perform(); // Esegui in sincrono e a tutto schermo
|
|
if (installing()) // when ba1 -6
|
|
stop_run(K_FORCE_CLOSE);
|
|
} else
|
|
if (mi.run_fullscreen())
|
|
{
|
|
mi.perform(); // Esegui in asincrono a pieno schermo
|
|
}
|
|
else
|
|
{
|
|
// Crea una pagina per accogliere la nuova applicazione asincrona
|
|
const short pg = add_page(mi);
|
|
if (pg >= 0)
|
|
{
|
|
if (mi.perform()) // Esegui in asincrono in pagina nuova
|
|
{
|
|
for (int i = 0; i < 20; i++)
|
|
{
|
|
xvt_sys_sleep(500);
|
|
if (xvt_win_get_children_count(bf.page_win(pg)) != 0)
|
|
break;
|
|
}
|
|
|
|
int ico = mi.icon();
|
|
if (ico <= 0 || ico == ICON_RSRC)
|
|
{
|
|
const int area = get_int(DLG_LOOK);
|
|
if (area > 0 && area < _icon.items())
|
|
ico = _icon.get_int(area);
|
|
else
|
|
ico = ICON_RSRC;
|
|
}
|
|
set_page_caption(pg, mi.caption(), ico);
|
|
}
|
|
else
|
|
book_field().remove_page(pg); // Rimuovi pagina inm caso d'errore
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (e == fe_modify)
|
|
{
|
|
// Permette l'aggiunta ai preferiti per i non NON radice
|
|
main_app().enable_menu_item(30005, _tree.has_father());
|
|
}
|
|
break;
|
|
case DLG_LOOK:
|
|
if (e == fe_modify)
|
|
{
|
|
TTree_field& tf = tfield(DLG_TREE);
|
|
const int sel = atoi(o.get());
|
|
TToken_string id("MENU_000", '/');
|
|
_tree.change_root(id); // Torna alla radice standard
|
|
if (sel > 0)
|
|
{
|
|
for (int i = 1; i < sel; i++)
|
|
{
|
|
do
|
|
_tree.goto_rbrother(); // Sceglie l'opportuno ramo principale
|
|
while (!_tree.enabled());
|
|
}
|
|
_tree.goto_firstson();
|
|
_tree.curr_id(id);
|
|
_tree.change_root(id.get(1)); // Imposta una nuova radice
|
|
synchronize_tree_field(tf);
|
|
}
|
|
else
|
|
{
|
|
_tree.goto_root();
|
|
_tree.shrink_all();
|
|
tf.win().force_update();
|
|
tf.on_key(K_SPACE);
|
|
}
|
|
if (_picture.objptr(sel))
|
|
book_field().set_back(_picture.row(sel));
|
|
// Vieta l'aggiunta della radice ai preferiti
|
|
main_app().enable_menu_item(30005, false);
|
|
} else
|
|
if (e == fe_init)
|
|
{
|
|
TOutlook_field& of = (TOutlook_field&)o;
|
|
of.clear();
|
|
|
|
TString caption;
|
|
int ico = 10219;
|
|
of.add_item(ico, TR("Menu principale"), 0);
|
|
_icon.add_long(ico);
|
|
TToken_string id("MENU_000", '/');
|
|
_tree.change_root(id); // Torna alla radice standard
|
|
for (bool ok = _tree.goto_root(); ok; ok = _tree.goto_rbrother())
|
|
{
|
|
const TMenuitem& mi = _tree.curr_item();
|
|
if (mi.enabled())
|
|
{
|
|
_tree.get_description(caption);
|
|
const int ico = mi.icon();
|
|
of.add_item(ico, caption, 0);
|
|
_icon.add_long(ico); // Memorizza icona per orecchie
|
|
if (_picture.empty())
|
|
_picture.add(mi.submenu().picture());
|
|
_picture.add(mi.child_submenu()->picture());
|
|
}
|
|
}
|
|
if (atoi(of.get()) >= of.items()-1) // Se sono sui preferiti ...
|
|
set(o.dlg(), "", true); // ... torna al menu principale
|
|
if (_picture.objptr(0))
|
|
book_field().set_back(_picture.row(0));
|
|
}
|
|
break;
|
|
default: break;
|
|
}
|
|
|
|
if (e == fe_info)
|
|
{
|
|
MENU_ITEM* mi = xvt_res_get_menu(10004); // Menu_Ba0-3
|
|
if (mi != NULL)
|
|
{
|
|
dictionary_translate_menu(mi);
|
|
const PNT pos = { -1, -1 };
|
|
xvt_menu_popup(mi->child, o.parent(), pos, XVT_POPUP_LEFT_ALIGN, 0);
|
|
xvt_res_free_menu_tree(mi);
|
|
return false; // Non fare la gestione standard
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
TOutlook_mask::TOutlook_mask(TMenu& menu) : _tree(menu), _locked(false)
|
|
{
|
|
xvtil_statbar_destroy(); // Ammazza status bar "inutile"
|
|
RCT rct; xvt_vobj_get_client_rect(TASK_WIN, &rct);
|
|
|
|
WINDOW panel = page_win(0);
|
|
xvt_vobj_move(panel, &rct); // Resiza la maschera in modo da occupare lo spazio liberato
|
|
|
|
menu.set_mask_mode(3); // Outlook mode
|
|
|
|
const int w = 24;
|
|
const int h = rows() / 2;
|
|
|
|
TTree_field& trifola = add_tree(DLG_TREE, 0, 0, 0, w, h);
|
|
trifola.set_tree(&_tree);
|
|
|
|
TOutlook_field* of = new TOutlook_field(this);
|
|
of->create(DLG_LOOK, 0, h, w, h, panel);
|
|
add_field(of);
|
|
|
|
TBook_field* cf = new TBook_field(this);
|
|
cf->create(DLG_MAIN, w, 0, 0, 0, panel);
|
|
add_field(cf);
|
|
|
|
xvt_pane_add(panel, dlg2win(DLG_TREE), "Menu", 1, 0); // Left upper pane
|
|
xvt_pane_add(panel, dlg2win(DLG_LOOK), "Aree", 1, 0); // Left lower pane
|
|
xvt_pane_add(panel, dlg2win(DLG_MAIN), "Main", 0, 0); // Main pane
|
|
save_perspective(0); // Salva default
|
|
load_perspective(1); // Carica custom
|
|
set_handlers();
|
|
|
|
on_firm_change(); // Mostra ragione sociale nella barra del menu
|
|
}
|
|
|
|
TOutlook_mask::~TOutlook_mask()
|
|
{
|
|
save_perspective(1); // Salva custom
|
|
// Ricostruisci status bar tornata utile
|
|
xvtil_create_statbar();
|
|
}
|