ba1600.cpp Nessuna differenza

ba1800.*     Corretta gestione importazioni usando i TWindowed_fields


git-svn-id: svn://10.65.10.50/trunk@6207 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1998-02-17 11:18:46 +00:00
parent e7719da42f
commit f357843c06
2 changed files with 293 additions and 231 deletions

View File

@ -1,13 +1,13 @@
#include <applicat.h>
#include <browfile.h>
#include <extcdecl.h>
#include <applicat.h>
#include <colors.h>
#include <filetext.h>
#include <msksheet.h>
#include <prefix.h>
#include <relation.h>
#include <sheet.h>
#include <utility.h>
#include <viswin.h>
#include "ba1800.h"
@ -113,19 +113,18 @@ public:
virtual ~THandled_mask() { }
};
#define build_msg() char* _msg = (char*)(const char*)_ctl_data._park;va_list argptr;va_start(argptr,fmt);vsprintf(_msg,fmt,argptr);va_end(argptr)
bool THandled_mask::error_box(const char* fmt, ...)
{
TString message(1024);
char* msg = message.get_buffer();
va_list argptr;
va_start(argptr, fmt);
vsprintf(msg, fmt, argptr);
int len = vsprintf(msg, fmt, argptr);
CHECKD(len <= message.size(), "Error message too long: ", len);
va_end(argptr);
if (is_sheetmask() && !is_running())
{
{
xvt_statbar_set(msg);
beep();
}
@ -240,32 +239,64 @@ THandled_mask::THandled_mask(const char* name, int num)
// TColumnizer_win
///////////////////////////////////////////////////////////
class TColumnizer_win : public TViswin
{
// Array delle posizioni di inizio campo
TPointer_array _column;
bool _clickable;
class TColumnizer_field;
protected: // TViswin
class TColumnizer_win : public TField_window
{
enum { RULER_HEIGHT = 2, NUM_WIDTH = 4 };
TString_array _rows; // Righe di testo da stampare
TPointer_array _column; // Array delle posizioni di inizio campo
bool _clickable; // E' possibile cliccare
protected: // TScroll_window
virtual void handler(WINDOW win, EVENT* ep);
virtual void paint_row(long r);
virtual void paint_column(long c, bool end);
virtual void update();
protected: // Internal use
int on_column(long col);
public:
void recalc_layout(int dx, int dy);
bool clickable() const { return _clickable; }
void set_clickable(bool on = TRUE) { _clickable = on; }
void destroy_rows() { _rows.destroy(); }
void add_row(const char* row) { _rows.add(row); }
void destroy_columns() { _column.destroy(); }
long add_column(long col) { return _column.add_long(col); }
long get_column(int index) const { return _column.get_long(index); }
TColumnizer_win(int x, int y, int dx, int dy, WINDOW parent, TBrowsefile_field* field);
TColumnizer_win(int x, int y, int dx, int dy, WINDOW parent, TColumnizer_field* field);
virtual ~TColumnizer_win() { }
};
class TColumnizer_field : public TWindowed_field
{
protected: // TWindowed_field
virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent)
{ return new TColumnizer_win(x, y, dx, dy, parent, this); }
protected: // Internal use
TColumnizer_win& col_win() const
{ return (TColumnizer_win&)win(); }
public:
void destroy_rows() { col_win().destroy_rows(); }
void add_row(const char* row) { col_win().add_row(row); }
void recalc_layout(int dx, int dy) const { col_win().recalc_layout(dx, dy); }
int visible_rows() const { return col_win().rows() - 1; }
void destroy_columns() { col_win().destroy_columns(); }
void add_column(long col) { col_win().add_column(col); }
long get_column(int index) const { return col_win().get_column(index); }
TColumnizer_field(THandled_mask* m) : TWindowed_field(m) { }
virtual ~TColumnizer_field() { }
};
int TColumnizer_win::on_column(long col)
{
int index = -1;
@ -287,16 +318,15 @@ int TColumnizer_win::on_column(long col)
}
}
TSheet_field& sf = browsefile_field()->mask().sfield(F_FIELDS);
TSheet_field& sf = owner().mask().sfield(F_FIELDS);
switch(action)
{
case 1:
index = _column.insert_long(col, i+1);
sf.insert(index, TRUE, FALSE);
break;
case 2:
_column.destroy(i, TRUE);
sf.destroy(i+1, TRUE);
index = i;
break;
default:
break;
@ -305,120 +335,135 @@ int TColumnizer_win::on_column(long col)
return index;
}
void TColumnizer_win::update()
{
const int x = int(origin().x);
const int maxx = x + columns() + 1;
const int y = int(origin().y);
const int maxy = y + rows() + 1;
int i;
TString80 str;
TField_window::update();
set_color(NORMAL_COLOR, NORMAL_BACK_COLOR);
for (i = y; i < maxy-RULER_HEIGHT; i++)
{
TToken_string* row = (TToken_string*)_rows.objptr(i);
if (row)
stringat(NUM_WIDTH, i+RULER_HEIGHT, _rows.row(i));
else
break;
}
set_brush(DISABLED_BACK_COLOR);
bar(x, y, maxx, y+RULER_HEIGHT);
TString points(maxx);
points.fill('.');
for (int n = x+1; n < maxx; n++)
{
if ((n % 5) == 0)
{
if ((n & 0x1) == 0)
{
int len = sprintf(str.get_buffer(), "%d", n);
points.overwrite(str, n - len);
}
else
points.overwrite(":", n-1);
}
}
stringat(NUM_WIDTH, y, points);
bar(x, y, x+NUM_WIDTH, maxy);
for (i = y; i < maxy; i++)
{
str.format("%*d", NUM_WIDTH, i+1);
stringat(x, i+RULER_HEIGHT, str);
}
set_pen(COLOR_BLACK);
int last_column = 0;
for (i = 0; i < _column.items(); i++)
{
const int j = (int)_column.get_long(i);
if (j > x)
{
_pixmap = TRUE;
line((j+NUM_WIDTH)*CHARX, (y+1)*CHARY, (j+NUM_WIDTH)*CHARX, maxy*CHARY);
_pixmap = FALSE;
}
const int available = j-last_column;
int len = sprintf(str.get_buffer(), "%d(%d)", i+1, available);
if (len > available)
{
len = str.find('(');
str.cut(len);
}
if (len <= available)
{
int cx = (j+last_column-len) / 2;
if (cx >= x)
stringat(cx+NUM_WIDTH, y+1, str);
}
last_column = j;
}
_pixmap = TRUE;
line((x+NUM_WIDTH)*CHARX, (y+1)*CHARY, maxx*CHARX, (y+1)*CHARY);
line(x*CHARX, (y+RULER_HEIGHT)*CHARY, maxx*CHARX, (y+RULER_HEIGHT)*CHARY);
line((x+NUM_WIDTH)*CHARX, y*CHARY, (x+NUM_WIDTH)*CHARX, maxy*CHARY);
_pixmap = FALSE;
}
void TColumnizer_win::handler(WINDOW win, EVENT* ep)
{
switch(ep->type)
{
case E_MOUSE_DOWN:
xvt_win_trap_pointer (win);
erase_point();
break;
case E_MOUSE_MOVE:
break;
case E_MOUSE_UP:
TViswin::handler(win, ep);
if (_clickable)
{
on_column(get_point().x);
update();
long column = (ep->v.mouse.where.h + CHARX/2) / CHARX;
column += origin().x - NUM_WIDTH;
if (on_column(column) >= 0)
force_update();
}
break;
case E_MOUSE_DBL:
break;
default:
TViswin::handler(win, ep);
TField_window::handler(win, ep);
break;
}
}
void TColumnizer_win::paint_column(long j, bool end)
{
TViswin::paint_column(j, end);
if (j > origin().x)
{
for (int i = _column.items()-1; i >= 0; i--)
{
if (_column.get_long(i) == j)
{
autoscroll(TRUE);
_pixmap = TRUE;
set_pen(COLOR_BLACK);
const int x = tabx((int)j+6);
line(x, taby(1), x, taby((int)lines()+1));
_pixmap = FALSE;
break;
}
}
}
void TColumnizer_win::recalc_layout(int dx, int dy)
{
long maxy = _rows.items() - rows()/2 + 1;
long maxx = dx;
if (maxx <= 0)
maxx = _column.get_long(_column.items()-1) + 70;
maxx -= columns()/2 + NUM_WIDTH;
if (maxx < 0) maxx = 0;
if (maxy < 0) maxy = 0;
set_scroll_max(maxx, maxy);
update_thumb(0, 0);
force_update();
}
void TColumnizer_win::paint_row(long r)
{
TViswin::paint_row(r);
autoscroll(TRUE);
_pixmap = TRUE;
set_pen(COLOR_BLACK);
for (int i = _column.items()-1; i >= 0; i--)
{
const int j = (int)_column.get_long(i);
if (j > origin().x)
{
const int x = tabx(j+6);
line(x, taby((int)r+1), x, taby((int)r+2));
}
}
_pixmap = FALSE;
}
TColumnizer_win::TColumnizer_win(int x, int y, int dx, int dy, WINDOW parent, TBrowsefile_field* field)
: TViswin("", "", FALSE, FALSE, FALSE, x, y, dy, dx, TRUE, parent, field),
TColumnizer_win::TColumnizer_win(int x, int y, int dx, int dy,
WINDOW parent, TColumnizer_field* field)
: TField_window(x, y, dx, dy, parent, field),
_clickable(field->enabled())
{
{
set_scroll_max(columns(), rows());
}
///////////////////////////////////////////////////////////
// TColumnizer_field
///////////////////////////////////////////////////////////
class TColumnizer_field : public TBrowsefile_field
{
protected: // TMask_field
virtual void create(WINDOW parent);
protected: // Internal use
TColumnizer_win& col_win() const { return *(TColumnizer_win*)vis_win(); }
public: // TMask_field
virtual void enable(bool on = TRUE);
public:
void destroy_columns() { col_win().destroy_columns(); }
void add_column(long col) { col_win().add_column(col); }
long get_column(int index) const { return col_win().get_column(index); }
TColumnizer_field(THandled_mask* m);
virtual ~TColumnizer_field() { }
};
void TColumnizer_field::enable(bool on)
{
TBrowsefile_field::enable(on);
col_win().set_clickable(on);
}
void TColumnizer_field::create(WINDOW parent)
{
TColumnizer_win* cw = new TColumnizer_win(_ctl_data._x, _ctl_data._y,
_ctl_data._width, _ctl_data._size,
parent, this);
set_vis_win(cw);
TBrowsefile_field::create(parent);
}
TColumnizer_field::TColumnizer_field(THandled_mask* m)
: TBrowsefile_field(m)
{
}
///////////////////////////////////////////////////////////
// TWizard_mask
@ -529,7 +574,7 @@ bool TFields_mask::field_handler(TOperable_field& of, TField_event fe)
if (rd)
{
const char* d = rd->get_field_description(n);
if (*d)
if (d && *d)
set(F_DESCR, d);
else
ok = error_box("Il campo %s non esiste",
@ -642,44 +687,75 @@ bool TWizard_mask::file_open(TFilename& fname) const
void TWizard_mask::load_ini(const TString& ininame)
{
const bool was_frozen = _frozen;
_frozen = TRUE;
TConfig ini(ininame, "MAIN");
const int recsize = ini.get_int("RECORDSIZE");
if (recsize > 0)
{
set(F_FIXEDLEN, "X", TRUE);
set(F_RECLEN, recsize, TRUE);
}
else
set(F_RECSEP, ini.get("RECORDSEP").left(4), TRUE);
set(F_SKIPLINES, ini.get_int("SKIPLINES"));
TWait_cursor hourglass;
if (!_frozen)
{
_frozen = TRUE;
const TString& fldsep = ini.get("FIELDSEP");
set(F_FIELDSEP, fldsep.left(1), TRUE);
ini.set_paragraph("RECORD");
if (fldsep.empty())
{
TColumnizer_field& cf = (TColumnizer_field&)field(F_COLUMNIZER);
for (int i = 0; ; i++)
{
if (i > 0)
{
const long position = ini.get_long("POSITION", NULL, i);
if (position > 0)
cf.add_column(position);
else
break;
}
else
cf.destroy_columns();
TConfig ini(ininame, "MAIN");
const int recsize = ini.get_int("RECORDSIZE");
if (recsize > 0)
{
set(F_FIXEDLEN, "X", TRUE);
set(F_RECLEN, recsize, TRUE);
}
}
else
set(F_RECSEP, ini.get("RECORDSEP").left(4), TRUE);
set(F_SKIPLINES, ini.get_int("SKIPLINES"));
const TString16 fldsep = ini.get("FIELDSEP").left(1);
set(F_FIELDSEP, fldsep, TRUE);
ini.set_paragraph("RECORD");
_frozen = was_frozen;
if (fldsep.empty())
{
TColumnizer_field& cf = (TColumnizer_field&)field(F_COLUMNIZER);
for (int i = 0; ; i++)
{
if (i > 0)
{
const long position = ini.get_long("POSITION", NULL, i);
if (position > 0)
cf.add_column(position);
else
break;
}
else
cf.destroy_columns();
}
}
TRelation_description* rd = rel_desc();
TFields_sheet& fs = (TFields_sheet&)sfield(F_FIELDS);
TFieldref fr;
for (int i = 0; ini.exist("NAME", i) || ini.exist("POSITION", i); i++)
{
const TString& campo = ini.get("FIELD", NULL, i);
TToken_string& row = fs.row(i);
if (campo.not_empty())
{
fr = campo;
row = fr.name();
if (rd == NULL)
{
int isam = fr.file();
if (isam)
{
set(F_ISAM, isam);
rd = rel_desc();
}
}
if (rd)
row.add(rd->get_field_description(fr.name()));
}
}
fs.force_update();
_frozen = FALSE;
}
}
void TWizard_mask::save_ini(const TFilename& ininame) const
@ -746,80 +822,77 @@ bool TWizard_mask::is_aga_file(const TFilename& name) const
bool TWizard_mask::load_aga(const TFilename& name)
{
TWait_cursor hourglass;
const bool was_frozen = _frozen;
_frozen = TRUE;
TSheet_field& sf = sfield(F_FIELDS);
TScanner aga(name);
TToken_string riga(1024);
TToken_string campo(15, ',');
TString isam;
bool inside_header = FALSE;
if (!_frozen)
{
_frozen = TRUE;
TSheet_field& sf = sfield(F_FIELDS);
TScanner aga(name);
TToken_string riga(1024);
TToken_string campo(15, ',');
TString isam;
bool inside_header = FALSE;
while (aga.line().not_empty())
{
riga = aga.token();
while (aga.line().not_empty())
{
riga = aga.token();
if (riga.compare("[Data]", -1, TRUE) == 0)
{
set(F_FIXEDLEN, "", TRUE);
set(F_RECLEN, "", TRUE);
set(F_RECSEP, "", TRUE);
set(F_FIELDSEP, "|", TRUE);
set(F_SKIPLINES, aga.linenum(), TRUE);
if (isam.not_empty())
set(F_ISAM, isam, TRUE);
break;
}
if (inside_header)
{
if (riga.compare("Fields", 6, TRUE) == 0)
if (riga.compare("[Data]", -1, TRUE) == 0)
{
const int uguale = riga.find('=');
if (uguale >= 0)
set(F_FIXEDLEN, "", TRUE);
set(F_RECLEN, "", TRUE);
set(F_RECSEP, "", TRUE);
set(F_FIELDSEP, "|", TRUE);
set(F_SKIPLINES, aga.linenum(), TRUE);
if (isam.not_empty())
set(F_ISAM, isam, TRUE);
break;
}
if (inside_header)
{
if (riga.compare("Fields", 6, TRUE) == 0)
{
riga.ltrim(uguale+1);
for(campo = riga.get(0); campo.not_empty(); campo = riga.get())
const int uguale = riga.find('=');
if (uguale >= 0)
{
sf.row(-1) = campo.get(0);
sf.check_row(sf.items()-1);
riga.ltrim(uguale+1);
for(campo = riga.get(0); campo.not_empty(); campo = riga.get())
{
sf.row(-1) = campo.get(0);
sf.check_row(sf.items()-1);
}
}
} else
if (riga.compare("File", 4, TRUE) == 0)
{
const int uguale = riga.find('=');
if (uguale >= 0)
{
isam = riga.mid(uguale+1);
isam.trim();
}
}
} else
if (riga.compare("File", 4, TRUE) == 0)
else
inside_header = riga[0] != '[';
}
else
{
const int uguale = riga.find('=');
if (uguale >= 0)
if (riga.compare("[Header]", -1, TRUE) == 0)
{
isam = riga.mid(uguale+1);
isam.trim();
sf.destroy();
inside_header = TRUE;
}
}
else
inside_header = riga[0] != '[';
}
else
{
if (riga.compare("[Header]", -1, TRUE) == 0)
{
sf.destroy();
inside_header = TRUE;
}
}
_frozen = FALSE;
}
sf.force_update();
_frozen = was_frozen;
return TRUE;
}
void TWizard_mask::file_preview() const
{
TWait_cursor hourglass;
const TString& fname = get(F_FILE);
if (_frozen/* || !fexist(fname) */)
if (_frozen)
return;
const int MAXLINE = 8192;
@ -829,6 +902,7 @@ void TWizard_mask::file_preview() const
const TString& recsep = get(F_RECSEP);
const TString& fieldsep = get(F_FIELDSEP);
const TString& fname = get(F_FILE);
int flags = ios::in | ios::nocreate;
if (fixedlen)
flags |= ios::binary;
@ -850,10 +924,13 @@ void TWizard_mask::file_preview() const
}
}
TString_array righe;
TColumnizer_field& cf = (TColumnizer_field&)field(F_COLUMNIZER);
int displines = get_int(F_DISPLINES);
if (displines <= 0) displines = 4;
if (displines <= 0)
displines = cf.visible_rows();
TString_array righe;
for (int l = 0; l < displines; l++)
{
righe.add(new TToken_string(MAXLINE), l);
@ -879,7 +956,6 @@ void TWizard_mask::file_preview() const
break;
}
TColumnizer_field& cf = (TColumnizer_field&)field(F_COLUMNIZER);
if (fieldsep.blank())
{
cf.enable();
@ -935,27 +1011,14 @@ void TWizard_mask::file_preview() const
}
}
}
cf.vis_win()->destroy_lines();
cf.destroy_rows();
for (l = 0; l < righe.items(); l++)
{
TToken_string& riga = righe.row(l);
riga.replace('|', '¦'); // Grossa crisi coi tubi
riga.replace('@', '#'); // Grossa crisi con le lumache
if (fixedlen)
{
riga.replace('\n', '¦'); // Grossa crisi con l'a capo
if (reclen > 256) // Grossa crisi con le righe lunghe
riga.cut(256);
}
else
{
if (riga.len() > 256) // Grossa crisi con le righe lunghe
riga.cut(256);
}
cf.add_line(riga);
cf.add_row(riga);
}
cf.goto_pos(0, 0);
cf.recalc_layout(reclen, righe.items());
}
TRelation_description* TWizard_mask::rel_desc(int logicnum)

View File

@ -47,14 +47,14 @@ BEGIN
PROMPT 45 3 "Separatore di record "
END
NUMBER F_RECLEN 6
NUMBER F_RECLEN 5
BEGIN
PROMPT 45 3 "Lunghezza "
PROMPT 45 3 "Lunghezza "
FLAGFS "U"
CHECKTYPE REQUIRED
END
NUMBER F_SKIPLINES 6
NUMBER F_SKIPLINES 4
BEGIN
PROMPT 1 4 "Righe iniziali da ignorare "
FLAGS "U"
@ -65,7 +65,7 @@ BEGIN
PROMPT 45 4 "Separatore dei campi "
END
NUMBER F_DISPLINES 6
NUMBER F_DISPLINES 4
BEGIN
PROMPT 1 5 "Righe da visualizzare "
FLAGS "U"
@ -83,15 +83,14 @@ BEGIN
PROMPT 41 6 "Azzera il file di destinazione"
END
BROWSEFILE F_COLUMNIZER 75 4
BROWSEFILE F_COLUMNIZER 75 5
BEGIN
PROMPT 1 6 ""
FLAGS "R"
END
SPREADSHEET F_FIELDS 78
BEGIN
PROMPT 1 13 ""
PROMPT 1 15 ""
ITEM "Campo@12"
ITEM "Descrizione@50"
END
@ -108,7 +107,7 @@ BEGIN
FLAGS "BU"
END
STRING F_DESCR 70
STRING F_DESCR 70 50
BEGIN
PROMPT 1 2 "Descrizione "
FLAGS "D"