dddb1a668f
git-svn-id: svn://10.65.10.50/branches/R_10_00@23185 c028cbd2-c16b-5b4b-a496-9718f37d4682
428 lines
9.5 KiB
C++
Executable File
428 lines
9.5 KiB
C++
Executable File
#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;
|
||
}
|