campo-sirio/ba/ba8100.cpp
guy dddb1a668f Supporto base per tema METRO
git-svn-id: svn://10.65.10.50/branches/R_10_00@23185 c028cbd2-c16b-5b4b-a496-9718f37d4682
2016-04-15 08:12:39 +00:00

428 lines
9.5 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <config.h>
#include <execp.h>
#include <relation.h>
#include <sheet.h>
#include <tabutil.h>
#include <urldefid.h>
///////////////////////////////////////////////////////////
// TSelector_sheet
///////////////////////////////////////////////////////////
class TSelector_sheet : public TCursor_sheet
{
TString _field;
private:
static TSelector_sheet* _sheet;
static bool selector_handler(TMask_field& fld, KEY k);
public:
TSelector_sheet(TCursor& cur, const char* fields, const char* caption,
const char* head, const TEdit_field& fld);
};
TSelector_sheet* TSelector_sheet::_sheet = NULL;
bool TSelector_sheet::selector_handler(TMask_field& fld, KEY k)
{
long sel = -1;
if (k == K_F2)
sel = 0;
if (k == K_TAB)
{
TCursor& cur = *_sheet->cursor();
((TEdit_field&)fld).autosave(*cur.relation());
sel = cur.read();
}
if (sel >= 0 && sel != _sheet->selected())
_sheet->post_select(sel);
return TRUE;
}
TSelector_sheet::TSelector_sheet(TCursor& cur, const char* fields, const char* caption,
const char* head, const TEdit_field& c)
: TCursor_sheet(&cur, fields, caption, head, 0x3, 1, SCREEN_WIN)
{
TToken_string cap = c.prompt();
if (cap.empty())
cap = caption;
set_tab_buttons(cap);
TString16 flags;
if (c.roman()) flags << 'M';
if (c.right_justified()) flags << 'R';
if (c.uppercase()) flags << 'U';
if (c.zerofilled()) flags << 'Z';
const int csize = c.size();
TEdit_field* e = NULL;
switch (c.class_id())
{
case CLASS_EDIT_FIELD:
e = &add_string(c.dlg(), 0, "", 1, 0, csize, flags, csize > 50 ? 50 : csize);
break;
case CLASS_REAL_FIELD:
e = &add_number(c.dlg(), 0, "", 1, 0, csize, flags);
break;
case CLASS_DATE_FIELD:
e = &add_date (c.dlg(), 0, "", 1, 0, flags);
break;
default:
e = NULL;
break;
}
if (e != NULL)
{
e->set_field(c.field()->name());
_sheet = this;
e->set_handler(selector_handler);
}
}
///////////////////////////////////////////////////////////
// TQuery_string
///////////////////////////////////////////////////////////
class TQuery_string : public TMask
{
public:
TQuery_string(const char* prm, WINDOW parent);
};
TQuery_string::TQuery_string(const char* prm, WINDOW parent)
: TMask("Richiesta", 1, 52, 6, -1, -1, parent)
{
TParagraph_string str(prm, 50);
for (int y = 0; ; y++)
{
const char* s = str.get();
if (s == NULL)
break;
add_static(DLG_NULL, 0, s, 1, y);
}
add_string(DLG_USER, 0, "", 1, 4, 50);
add_button(DLG_CANCEL, 0, "", -12, -1, 10, 2);
add_button(DLG_OK, 0, "", -22, -1, 10, 2);
}
///////////////////////////////////////////////////////////
// TSelector_app
///////////////////////////////////////////////////////////
class TSelector_app : public TSkeleton_application
{
TFilename _fileini;
TString _filetable;
int _filekey;
TAuto_token_string _fileinput;
protected:
virtual void main_loop();
bool find_relapp(TString& app) const;
bool find_mask_name(TFilename& name) const;
public:
void parse_command_line();
bool get_mask_name(TFilename& name) const;
void save_cursor(TCursor& cur, TConfig& ini);
void save_cursor_key(TCursor& cur, TConfig& ini);
void run_transaction(const char* trans);
};
bool TSelector_app::find_relapp(TString& app) const
{
bool ok = FALSE;
const int logicnum = atoi(_filetable);
if (logicnum >= LF_USER)
{
TLocalisamfile file(logicnum);
ok = file.get_relapp(app);
}
else
{
TTable t(_filetable);
ok = t.get_relapp(app);
}
if (!ok)
{
TString str;
str << "Non <20> possibile determinare l'applicazione associata al file " << _filetable << ". "
<< "E' possibile inserire qui il nome del programma (ad esempio 'ba4 -0'). "
<< "In caso di dubbio premere Annulla.";
TQuery_string m(str, SCREEN_WIN);
if (m.run())
{
TToken_string s(m.get(DLG_USER), ' ');
TFilename a = s.get(); a.ext("exe");
ok = a.exist();
if (ok)
{
app = s;
s = app.left(2); s << '0'; // default module paragraph
TConfig ini("install.ini", s);
str.format("Edit_%d", logicnum);
ini.set(str, app);
}
}
}
return ok;
}
bool TSelector_app::find_mask_name(TFilename& name) const
{
TFilename app;
bool ok = find_relapp(app);
if (ok)
{
if (isdigit(_filetable[0]))
{
name = app.left(3);
name << char(app[5]+1) << "00a.msk";
if (!name.exist())
{
name.rtrim(5);
name << ".msk";
}
}
else
{
name = app.left(2);
name << "tb";
const char* t = _filetable;
if (*t == '%') t++;
name << t << ".msk";
}
}
ok = name.exist();
name.ext("");
return ok;
}
bool TSelector_app::get_mask_name(TFilename& name) const
{
const char* t = _filetable;
if (*t == '%') t++;
TString16 key; key << "Mask_" << t;
TConfig ini(CONFIG_DITTA, "ba8");
name = ini.get(key);
bool ok = name.not_empty();
if (!ok)
{
ok = find_mask_name(name);
if (ok)
ini.set(key, name);
}
return ok;
}
void TSelector_app::parse_command_line()
{
_filetable = "20";
_filekey = 1;
_fileinput = "";
_fileini = "select.ini";
if (argc() > 2)
{
const TString str = argv(2);
if (str[0] == '/' || str[0] == '-')
{
_fileini = str.mid(2);
TConfig trans(_fileini, "Transaction");
TToken_string sel(trans.get("Action"), ' ');
_filetable = sel.get(1);
_filekey = sel.get_int();
_fileinput = sel.get();
}
else
{
_filetable = str;
_filekey = argc() > 3 ? atoi(argv(3)) : 1;
_fileinput = argc() > 4 ? argv(4) : "";
}
}
}
void TSelector_app::save_cursor(TCursor& cur, TConfig& ini)
{
const TRectype& curr = cur.curr();
TString16 para; para << curr.num();
ini.set_paragraph(para);
TString str;
const int fields = curr.items();
for (int i = 0; i < fields; i++)
{
const char* fieldname = curr.fieldname(i);
const TString& value = curr.get(fieldname);
if (!value.blank())
{
if (value[0] == ' ' || value.right(1) == " ")
{
str.cut(0) << '"' << value << '"';
ini.set(fieldname, str);
}
else
ini.set(fieldname, value);
}
}
ini.set_paragraph("Transaction");
}
void TSelector_app::save_cursor_key(TCursor& cur, TConfig& ini)
{
const TRectype& curr = cur.curr();
TString16 para; para << curr.num();
ini.set_paragraph(para);
const RecDes& rd = curr.rec_des();
const KeyDes& kd = rd.Ky[0];
for (int i = 0; i < kd.NkFields; i++)
{
const int nf = kd.FieldSeq[i] % MaxFields;
const RecFieldDes& rf = rd.Fd[nf];
ini.set(rf.Name, curr.get(rf.Name));
}
ini.set_paragraph("Transaction");
}
void TSelector_app::run_transaction(const char* trans)
{
TString cmd;
bool ok = find_relapp(cmd);
if (ok)
{
TConfig ini(_fileini, "Transaction");
ini.set("Action", trans);
}
if (ok)
{
cmd << " /i" << _fileini;
TExternal_app app(cmd);
app.run();
}
}
void TSelector_app::main_loop()
{
parse_command_line();
TFilename mask_name;
if (!get_mask_name(mask_name))
{
error_box("Impossibile determinare la maschera associata al file %s", (const char*)_filetable);
return;
}
TMask m(mask_name);
TTemp_window tw(TASK_WIN);
tw.minimize();
int f;
for (f = m.fields()-1; f >= 0; f--)
{
TMask_field& field = m.fld(f);
if (field.in_key(_filekey) && field.is_edit())
{
TEdit_field& e = (TEdit_field&)field;
if (e.browse() != NULL)
break;
}
}
if (f < 0)
{
error_box("Impossibile trovare un campo di browse sulla chiave %d nel file",
_filekey, (const char*)mask_name);
return;
}
TEdit_field& efield = (TEdit_field&)m.fld(f);
TBrowse& b = *efield.browse();
TCursor& cur = *b.cursor();
const char* caption = cur.file().description();
long sel = 0;
if (!_fileinput.empty_items())
{
TRectype& curr = cur.curr();
TToken_string ifn = b.get_input_field_names();
TString val;
const int maxin = ifn.items() - 1;
for (int i = 0; i < maxin; i++)
{
val = _fileinput.get(i);
if (val.empty())
break;
TFieldref field(ifn.get(i), 0);
field.write(val, curr);
}
cur.setregion(curr, curr);
val = _fileinput.get(maxin);
if (val.not_empty())
{
TFieldref field(ifn.get(maxin), 0);
field.write(val, curr);
}
sel = cur.read();
}
TSelector_sheet s(cur, b.items(), caption, b.head(), efield);
s.select(sel);
const KEY k = s.run();
TConfig ini(_fileini, "Transaction");
TString_array list;
ini.list_paragraphs(list);
FOR_EACH_ARRAY_ROW(list, r, row) if (*row != "Transaction")
{
ini.set_paragraph(*row);
ini.remove_all();
}
ini.set_paragraph("Transaction");
switch (k)
{
case K_ENTER:
ini.set("Record", s.selected());
ini.set("Result", "OK");
ini.set("Error", "0");
save_cursor(cur, ini);
break;
case K_ESC:
case K_QUIT:
ini.set("Result", "Cancel");
ini.set("Error", -1);
break;
case K_INS:
run_transaction("Run");
break;
default:
save_cursor_key(cur, ini);
run_transaction("Link");
break;
}
}
int ba8100(int argc, char* argv[])
{
TSelector_app app;
app.run(argc, argv, "Selector");
return 0;
}