controls.cpp Abbassati legermente i checkbox mask.cpp Corretto controllo sulle maschere multipagina non a tutto schermo maskfld.cpp Corretto passaggio al campo successivo doppo un tasto F9 msksheet.cpp Corretta gestione del messaggio di inizializzazione in modo da cercare di andare sempre sulla prima riga progind.cpp Corretto calcolo della percentuale (arrotondato e non troncato) relapp.h Reso pubblico il metoto TRelation_application::lnflag() const git-svn-id: svn://10.65.10.50/trunk@3573 c028cbd2-c16b-5b4b-a496-9718f37d4682
264 lines
5.4 KiB
C++
Executable File
264 lines
5.4 KiB
C++
Executable File
#include <math.h>
|
|
|
|
#include <defmask.h>
|
|
#include <progind.h>
|
|
#include <controls.h>
|
|
#include <urldefid.h>
|
|
|
|
const char* const TITLE_TEXT = "Attesa";
|
|
|
|
word TIndwin::measure_text(TToken_string& s, word& maxlen) const
|
|
{
|
|
word lines = 0;
|
|
for(const char* t = s.get(0); t; t = s.get())
|
|
{
|
|
const word l = strlen(t);
|
|
if (l > maxlen) maxlen = l;
|
|
lines++;
|
|
}
|
|
return lines;
|
|
}
|
|
|
|
// Certified 70%
|
|
TIndwin::TIndwin(long max, const char* txt, bool cancel, bool bar, int div)
|
|
: _text(NULL), _cancel(NULL), _bar(0),
|
|
_status(0L), _max(max), _flags(0x0)
|
|
{
|
|
if (_max <= 0) _max = 1;
|
|
|
|
TToken_string testo(txt, '\n');
|
|
word maxlen = div;
|
|
const word lines = measure_text(testo, maxlen);
|
|
|
|
int hor = maxlen+3; if (hor > 78) hor = 78;
|
|
int ver = lines+3;
|
|
ver += bar ? 2 : 0;
|
|
ver += cancel ? 2 : 0;
|
|
|
|
set_win(create_interface(TASK_WIN, -1, -1, hor, ver, TITLE_TEXT, this, FALSE));
|
|
|
|
_text = new TMultiline_control(win(), DLG_NULL, 1, 1, hor-2, lines+1, 512, "CD", "");
|
|
|
|
testo.replace('\n', '\r');
|
|
_text->set_caption(testo);
|
|
|
|
if (bar)
|
|
{
|
|
RCT r; _text->get_rect(r);
|
|
_bar = r.bottom + CHARY;
|
|
}
|
|
|
|
if (cancel)
|
|
{
|
|
_cancel = new TPushbutton_control(win(), DLG_CANCEL, -11, -1, 10, 2, "", "Annulla", BMP_CANCEL);
|
|
}
|
|
open_modal();
|
|
do_events();
|
|
}
|
|
|
|
// @doc EXTERNAL
|
|
|
|
// @mfunc Setta il testo della finestra
|
|
void TIndwin::set_text(
|
|
const char* t) // @parm Testo della finestra
|
|
|
|
// @comm Si puo' chiamare questa funzione per cambiare il testo, ma
|
|
// le dimensioni della finestra sono calcolate sul primo testo
|
|
// passato, quindi occorre dimensionare correttamente il primo passato
|
|
// (es. inserire degli spazi) se se ne prevede uno piu' lungo.
|
|
{
|
|
_text->set_caption(t);
|
|
}
|
|
|
|
TIndwin::~TIndwin()
|
|
{
|
|
if (is_open())
|
|
close_modal();
|
|
|
|
if (_text) delete _text;
|
|
if (_cancel) delete _cancel;
|
|
}
|
|
|
|
bool TIndwin::can_be_closed() const
|
|
{
|
|
const bool ok = (_flags & IND_FINISHED) || (_flags & IND_CANCELLED);
|
|
if (!ok) error_box("Attendere la fine dell'operazione prima di chiudere l'applicazione");
|
|
return ok;
|
|
}
|
|
|
|
KEY TIndwin::check_stop()
|
|
{
|
|
KEY k = 0;
|
|
if ((_flags & IND_FINISHED) || (_flags & IND_CANCELLED))
|
|
{
|
|
k = (_flags & IND_FINISHED) ? K_ENTER : K_ESC;
|
|
stop_run(k);
|
|
}
|
|
return k;
|
|
}
|
|
|
|
void TIndwin::update_bar()
|
|
{
|
|
if (_status >= _max)
|
|
{
|
|
_status = _max;
|
|
_flags |= IND_FINISHED;
|
|
}
|
|
|
|
// Percentuale raggiunta finora
|
|
const double prc = (double)_status/_max;
|
|
|
|
WINDOW w = win();
|
|
RCT r; xvt_vobj_get_client_rect(w, &r);
|
|
|
|
// Rettangolo contenente l'intera barra
|
|
r.left = CHARX; r.right -= CHARX;
|
|
r.top = (int)_bar;
|
|
r.bottom = r.top + 2*CHARY;
|
|
|
|
RCT b = r;
|
|
// Rettangolo in rilievo
|
|
b.right = b.left + int((r.right-r.left)*prc);
|
|
xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0);
|
|
// Rettangolo scavato
|
|
b.left = b.right; b.right = r.right;
|
|
xi_draw_3d_rect(w, &b, TRUE, 2, 0, 0, 0);
|
|
|
|
char n[8]; sprintf(n, "%d%%", (int)floor(prc * 100.0 + 0.5));
|
|
xvt_dwin_draw_text(w, r.left+r.right/2-CHARX, (r.bottom+r.top+CHARY)/2-3, n, -1);
|
|
|
|
check_stop();
|
|
}
|
|
|
|
void TIndwin::update()
|
|
{
|
|
if (_bar) update_bar();
|
|
}
|
|
|
|
bool TIndwin::on_key(KEY k)
|
|
{
|
|
if (k == K_ESC && _cancel)
|
|
{
|
|
_flags |= IND_CANCELLED;
|
|
check_stop();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void TIndwin::on_button(short id)
|
|
{
|
|
if (id == DLG_CANCEL)
|
|
on_key(K_ESC);
|
|
}
|
|
|
|
|
|
// TProgind --------------------------------------------------------------
|
|
|
|
TProgind::TProgind(long max, const char* txt, bool cancel, bool bar, int div)
|
|
: TIndwin(max, txt, cancel, bar, div)
|
|
{}
|
|
|
|
// TTimerind ------------------------------------------------------------
|
|
|
|
long TTimerind::_timer_id = 0L;
|
|
|
|
void TTimerind::handler(WINDOW w, EVENT* e)
|
|
{
|
|
switch(e->type)
|
|
{
|
|
case E_CREATE:
|
|
case E_UPDATE:
|
|
if (_status == 0L)
|
|
_timer_id = xvt_timer_create(w, _interval);
|
|
break;
|
|
case E_TIMER:
|
|
if (e->v.timer.id == _timer_id)
|
|
{
|
|
_status += _interval;
|
|
force_update();
|
|
xvt_timer_create(w, _interval);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
TIndwin::handler(w,e);
|
|
}
|
|
|
|
TTimerind::TTimerind(long msec, const char* txt,
|
|
bool cancel, bool bar, int div, int i) :
|
|
TIndwin(msec, txt, cancel, bar, div)
|
|
{
|
|
_interval = i;
|
|
_timer_id = 0L;
|
|
}
|
|
|
|
TTimerind::~TTimerind()
|
|
{ xvt_timer_destroy(_timer_id); }
|
|
|
|
// C-style binding
|
|
// uses static pointer for single instance of TIndwin
|
|
|
|
static TIndwin* __indwin__p = NULL;
|
|
|
|
void progind_create(long m, char* t, bool b, bool c, int n)
|
|
{
|
|
CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator");
|
|
__indwin__p = new TProgind(m,t,b,c,n);
|
|
}
|
|
|
|
void progind_set_status(long l)
|
|
{
|
|
((TProgind*)__indwin__p)->setstatus(l);
|
|
}
|
|
|
|
void progind_cancel()
|
|
{
|
|
__indwin__p->cancel();
|
|
}
|
|
|
|
bool progind_iscancelled()
|
|
{
|
|
return __indwin__p->iscancelled();
|
|
}
|
|
|
|
bool progind_isfinished()
|
|
{
|
|
return __indwin__p->isfinished();
|
|
}
|
|
|
|
void progind_destroy()
|
|
{
|
|
delete __indwin__p;
|
|
__indwin__p = NULL;
|
|
}
|
|
|
|
void timerind_create(long l, char* title, bool bar, bool cancel,
|
|
int divisions, int interval)
|
|
{
|
|
CHECK(__indwin__p == NULL, "Cannot have more than one progress indicator");
|
|
__indwin__p = new TTimerind(l,title,bar,cancel,divisions,interval);
|
|
}
|
|
|
|
void timerind_cancel()
|
|
{
|
|
__indwin__p->cancel();
|
|
}
|
|
|
|
bool timerind_iscancelled()
|
|
{
|
|
return __indwin__p->iscancelled();
|
|
}
|
|
|
|
bool timerind_isfinished()
|
|
{
|
|
return __indwin__p->isfinished();
|
|
}
|
|
|
|
void timerind_destroy()
|
|
{
|
|
delete __indwin__p;
|
|
__indwin__p = NULL;
|
|
}
|
|
|