From 95f095d9297e9327c277a132a210b729745040c1 Mon Sep 17 00:00:00 2001 From: villa Date: Wed, 15 May 1996 09:03:36 +0000 Subject: [PATCH] Kagarollings git-svn-id: svn://10.65.10.50/trunk@2819 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/progind.cpp | 262 -------------------------------------------- include/viswin.cpp | 5 +- 2 files changed, 4 insertions(+), 263 deletions(-) diff --git a/include/progind.cpp b/include/progind.cpp index e9f72f677..d2d74bb5f 100755 --- a/include/progind.cpp +++ b/include/progind.cpp @@ -1,4 +1,3 @@ -<<<<<<< progind.cpp #include #include #include @@ -275,264 +274,3 @@ void timerind_destroy() __indwin__p = NULL; } -======= -#include -#include -#include -#include - -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 ver = lines+2; - - int hor = maxlen+2; if (hor > 78) hor = 78; - - if (bar) - { - _bar = ver * CHARY; - ver += 2; - } - 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, 512, "CD", ""); - - testo.replace('\n', '\r'); - _text->set_caption(testo); - - 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() -{ - 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; - } - - const double prc = (double)_status/_max; - - RCT r; xvt_vobj_get_client_rect(win(), &r); - r.left = CHARX; r.right -= CHARX; - r.top = (int)_bar; - r.bottom = r.top + 2*CHARY; - - const int width = r.right - r.left; - RCT b = r; - - WINDOW w = win(); - b.right = b.left + int(width*prc); - xi_draw_3d_rect(w, &b, FALSE, 2, 0, 0, 0); - - set_brush(COLOR_WHITE); - 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(100*prc)); - xvt_dwin_draw_text(w, r.left+width/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; -} - ->>>>>>> 1.11 diff --git a/include/viswin.cpp b/include/viswin.cpp index 1d74eca30..3eb8f8ac9 100755 --- a/include/viswin.cpp +++ b/include/viswin.cpp @@ -2609,7 +2609,10 @@ TViswin::TViswin(const char *fname, } TViswin ::~TViswin () -{} +{ + // avoid deleting child window (already deleted by mask) + if (!_toplevel) set_win(NULL_WIN); +} /////////////////////////////////////////////////////////// // Campo di visualizzazione sulle maschere