campo-sirio/ca/calib01.cpp
guy a760476caa Patch level : 2.2
Files correlati     : ca0
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@12527 c028cbd2-c16b-5b4b-a496-9718f37d4682
2004-12-01 10:56:41 +00:00

232 lines
5.8 KiB
C++
Executable File

#include "calib01.h"
///////////////////////////////////////////////////////////
// TAnal_msk
///////////////////////////////////////////////////////////
bool TAnal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return true;
}
int TAnal_msk::compute_offset() const
{
int delta = 0;
RCT rct; xvt_vobj_get_client_rect(TASK_WIN, &rct);
if (rct.right > 720)
delta = (rct.right - 720) / 2 / CHARX;
return delta;
}
TAnal_msk::TAnal_msk(const char* name)
{
const TFilename outname = "anal.msk";
TFilename inpname = name; inpname.ext("msk");
inpname.custom_path();
ofstream out(outname);
int delta = compute_offset();
TString line;
TScanner inp(inpname);
while (!inp.eof())
{
line = inp.line();
if (line.starts_with("PR "))
{
TToken_string l(line, ' ');
l.strip_d_spaces();
int x = l.get_int(1);
if (x >= 0)
{
x += delta;
l.add(x, 1);
line = l;
}
}
out << line << endl;
}
out.close();
read_mask(outname, 0, 0);
xvt_fsys_removefile(outname);
}
///////////////////////////////////////////////////////////
// TSimple_anal_msk
///////////////////////////////////////////////////////////
void TSimple_anal_msk::get_key_fields(TString& key1, TString& key2) const
{
const RecDes& des = prefix().get_recdes(get_logicnum());
const KeyDes k1 = des.Ky[0];
key1 = des.Fd[k1.FieldSeq[0] % MaxFields].Name;
const KeyDes k2 = des.Ky[1];
key2 = des.Fd[k2.FieldSeq[0] % MaxFields].Name;
}
int TSimple_anal_msk::get_key_len(int level, TConfig& cfg) const
{
int len = 0;
for (int i = 1; i <= level; i++)
{
const TString& picture = cfg.get(get_key_var(), NULL, i);
len += picture.len();
}
return len;
}
void TSimple_anal_msk::create_key_browse(TEdit_field& kfld, int level, TConfig& cfg)
{
TString16 key1, key2;
get_key_fields(key1, key2);
const TString q(get_key_len(level, cfg), '?');
TFilename tmp; tmp.temp();
ofstream out(tmp);
out << "US " << get_logicnum() << " SE " << key1 << "?=\"" << q << '"' << endl;
out << "KE 1" << endl;
int from = 1, to = 1;
for (int i = 1; i <= level; i++)
{
const TString& picture = cfg.get(get_key_var(), NULL, i);
const TString& prompt = cfg.get(get_des_var(), NULL, i);
to = from + picture.len()-1;
TString field; field.format("%s[%d,%d]", (const char*)key1, from, to);
out << "IN " << field << ' ' << get_key_id(i-1) << endl;
out << "DI \"" << prompt << '@' << (to-from+1) << "\" " << field << endl;
out << "OU " << get_key_id(i-1) << ' ' << field << endl;
from = to+1;
}
out << "DI \"Descrizione@50\" " << key2 << endl;
out << "OU " << get_des_id(level-1) << ' ' << key2 << endl;
out << "CH " << (level == 1 ? "RE" : "NO") << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
void TSimple_anal_msk::create_des_browse(TEdit_field& kfld, int level, TConfig& cfg)
{
TString16 key1, key2;
get_key_fields(key1, key2);
const TString q(get_key_len(level, cfg), '?');
TFilename tmp; tmp.temp();
ofstream out(tmp);
out << "US " << get_logicnum() << " KE 2" << " SE " << key1 << "?=\"" << q << '"' << endl;
out << "KE 2" << endl;
out << "DI \"Descrizione@50\" " << key2 << endl;
out << "IN " << key2 << ' ' << kfld.dlg() << endl;
out << "OU " << kfld.dlg() << ' ' << key2 << endl;
int from = 1, to = 1;
for (int i = 1; i <= level; i++)
{
const TString& picture = cfg.get(get_key_var(), NULL, i);
const TString& prompt = cfg.get(get_des_var(), NULL, i);
to = from + picture.len()-1;
TString field; field.format("%s[%d,%d]", (const char*)key1, from, to);
out << "DI \"" << prompt << '@' << (to-from+1) << "\" " << field << endl;
out << "OU " << get_key_id(i-1) << ' ' << field << endl;
from = to+1;
}
out << "CH NO" << endl;
out << "EN" << endl;
out.close();
TScanner scan(tmp);
while (scan.pop() != "EN")
kfld.parse_item(scan);
xvt_fsys_removefile(tmp);
}
int TSimple_anal_msk::create_key_fields()
{
TConfig cfg(CONFIG_DITTA, "ca");
const char* keyvar = get_key_var();
const char* desvar = get_des_var();
int maxkeylen = 0, maxdeslen = 0;
int level;
for (level = 1; ; level++)
{
const TString& prompt = cfg.get(desvar, NULL, level);
if (prompt.blank())
break;
const TString& picture = cfg.get(keyvar, NULL, level);
const int keylen = picture.len();
const int deslen = prompt.len();
if (keylen > maxkeylen) maxkeylen = keylen;
if (deslen > maxdeslen) maxdeslen = deslen;
}
maxdeslen++;
const int tab0 = compute_offset()+2;
const int tab1 = tab0 + maxdeslen + maxkeylen + 4;
for (int i = 1; i < level; i++)
{
const short kid = get_key_id(i-1);
CHECKD(kid > 100, "Invalid field id:", kid);
const TString& picture = cfg.get(keyvar, NULL, i);
TString80 prompt = cfg.get(desvar, NULL, i);
prompt.left_just(maxdeslen);
TEdit_field& kfld = add_string(kid, 0, prompt, tab0, i, picture.len(), "B");
create_key_browse(kfld, i, cfg);
const short did = get_des_id(i-1);
if (did > kid)
{
TEdit_field& dfld = add_string(did, 0, "", tab1, i, 50, "B", 72+tab0-tab1);
create_des_browse(dfld, i, cfg);
}
}
return level;
}
TSimple_anal_msk::TSimple_anal_msk(const char* name) : TAnal_msk(name)
{
}
///////////////////////////////////////////////////////////
// TAnal_app
///////////////////////////////////////////////////////////
TRelation* TAnal_app::create_relation() const
{
return new TRelation(_msk->get_logicnum());
}
bool TAnal_app::user_create()
{
_msk = create_mask();
_rel = create_relation();
return true;
}
bool TAnal_app::user_destroy()
{
if (_msk != NULL)
delete _msk;
if (_rel != NULL)
delete _rel;
return true;
}