campo-sirio/ba/ba0103.cpp
guy f487cab57c Patch level : 10.0 356
Files correlati     : ba8200b.msk
Ricompilazione Demo : [ ]
Commento            :
0001379: Query e report
Il file clifogiac non lo posso selezionare nella gestione delle query, mi da Prima un "CLIFOGI" poi un "CLIFOGIA" ma il clifogiac non c'è modo di prenderlo.
Se poi scrivo la query a mano funziona, ma se la salvo e la vado a riprendere no.


git-svn-id: svn://10.65.10.50/trunk@19068 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-06-23 09:19:39 +00:00

651 lines
17 KiB
C++
Executable File

#include "ba0103.h"
#include <applicat.h>
#include <config.h>
#include <controls.h>
#include <defmask.h>
#include <diction.h>
#include <dongle.h>
#include <execp.h>
#include <prefix.h>
#include <utility.h>
#include <xvtility.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 void 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;
protected:
virtual void update();
virtual void handler(WINDOW win, EVENT* ep);
void force_page(short page);
void erode_antipa();
public:
WINDOW notebook() const { return _ctrl; }
short pages() const;
WINDOW page_win(short pg);
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);
TBook_window(int x, int y, int dx, int dy, WINDOW parent, TWindowed_field* owner);
~TBook_window();
};
///////////////////////////////////////////////////////////
// TApp_window
///////////////////////////////////////////////////////////
void 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;
}
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, 1500); // Ogni tanto controllo se l'applicazione e' 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);
RCT rctw; xvt_vobj_get_client_rect(win(), &rctw);
if (rctw.right >= 64 && rctw.bottom >= 64)
{
if (_logo.ok())
_logo.draw(win(), rctw, 'C', 'B', '-'); // Disegna logo riducendolo al centro in basso
const PNT pnt = { 0, 0 };
draw_spider(win(), 0x3, pnt);
}
}
}
short TBook_window::pages() const
{
return _ctrl == NULL_WIN ? 0 : xvt_notebk_get_num_tabs(_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)
{
xvt_notebk_set_front_page(_ctrl, page);
WINDOW w = xvt_notebk_get_page(_ctrl, page);
xvt_win_enum_wins(w, hell_riser, 0, 0);
}
void 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.win == _ctrl)
{
force_page(ep->v.ctl.ci.v.notebk.tab_no);
return;
}
break;
case E_SIZE:
if (pages() > 0)
dispatch_e_menu(cur_win(), 8883); // Notifica un ridimensionamento indesiderato
break;
default:
break;
}
TControl_host_window::handler(win, ep);
}
WINDOW TBook_window::page_win(short pg)
{
WINDOW win = NULL_WIN;
if (_ctrl != NULL_WIN)
win = xvt_notebk_get_page(_ctrl, pg);
return win;
}
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
// Anti TASSAN
if (caption.find("avand") > 0 && is_tassan())
set_logo("lv00");
}
}
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
}
}
void TBook_window::set_logo(const char* logo)
{
_logo.load(logo);
if (_logo.ok() && can_be_transparent(_logo))
_logo.convert_transparent_color(NORMAL_BACK_COLOR);
}
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("")
{
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);
WINDOW page_win(short page);
void remove_all_pages();
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);
}
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);
}
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);
}
bool TOutlook_mask::can_be_closed() const
{
const bool yes = !is_running();
if (!yes)
{
TBook_field& bf = (TBook_field&)field(DLG_MAIN);
if (bf.pages() == 0)
((TOutlook_mask*)this)->send_key(K_FORCE_CLOSE, 0);
else
warning_box(TR("E' necessario chiudere tutte le applicazioni attive"));
}
return yes;
}
short TOutlook_mask::add_page(const TMenuitem& mi)
{
TBook_field& bf = (TBook_field&)field(DLG_MAIN);
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 = (TBook_field&)field(DLG_MAIN);
bf.set_page_caption(page, caption, icon);
}
void 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;
}
}
TSpidey_mask::handler(w, ep);
}
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.perform();
}
else
{
TBook_field& bf = (TBook_field&)field(DLG_MAIN);
// ba1 e ba2 sono programmi di manutenzione da eseguire in modo esclusivo
if (mi.run_modal())
{
if (bf.pages() > 0)
{
if (yesno_box(TR("E' necessario chiudere tutte le altre appicazioni:\n Si desidera procedere?")))
bf.remove_all_pages(); // Chiude tutti i programmi in corso
else
return false;
}
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)
{
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 < 16)
ico = _icon[area];
else
ico = ICON_RSRC;
}
set_page_caption(pg, mi.caption(), ico);
}
}
}
}
}
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);
}
main_app().enable_menu_item(30005, id.find("MENU_PREFERITI") < 0);
} else
if (e == fe_init)
{
TOutlook_field& of = (TOutlook_field&)o;
of.clear();
TString caption;
int i = 0;
int ico = 10219;
of.add_item(ico, TR("Menu principale"), 0);
_icon[i++] = 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[i++] = ico; // Memorizza icona per orecchie
}
}
if (atoi(of.get()) >= of.items()-1) // Se sono sui preferiti ...
set(o.dlg(), "", true); // ... torna al menu principale
}
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();
}
TOutlook_mask::~TOutlook_mask()
{
save_perspective(1); // Salva custom
// Ricostruisci status bar tornata utile
xvtil_create_statbar();
// Ammazza eventuali processi dormienti in background
xvt_sys_close_siblings(TASK_WIN);
}