campo-sirio/include/progind.cpp
guy 972e56a4bd isam.cpp Migliorate conversioni dei TRecfield
printapp.cpp  Corretta formattazione dei long double
printer.cpp   Migliorato riconoscimento del fax
progind.cpp   Aggiorna la barro solo se cambia la percentuale
strings.cpp   Aggiunta funzione get_buffer


git-svn-id: svn://10.65.10.50/trunk@3952 c028cbd2-c16b-5b4b-a496-9718f37d4682
1996-12-02 11:01:06 +00:00

276 lines
5.7 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)
{}
void TProgind::setstatus(long l)
{
const long old_perc = _status * 100L / _max;
_status = l > _max ? _max : l;
const long new_perc = _status * 100L / _max;
if (new_perc > old_perc)
{
update_bar();
do_events();
}
}
// 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;
}