/*      $Id: progind.h,v 1.3 1994-11-11 18:04:25 guy Exp $     */

/* @N
   progind.h
   program status and timer boxes
   fv 20/8/93
   works for both C and C++
   @END
   */

#ifdef __cplusplus
#ifndef __PROGIND_H
#define __PROGIND_H 

#ifndef __WINDOW_H
#include <window.h>
#endif

#ifndef __STRINGS_H
#include <strings.h>
#endif 

/* 
   @C
   class TIndwin : public TWindow 
   @END
   */

class TIndwin : public TWindow 
{
  /* @DPRIV */
  enum { IND_CANCELLED = 0x01, IND_FINISHED= 0x02 };

  WINDOW    _text;    // Static text
  WINDOW    _cancel;  // CANCEL button
  WINDOW    _bar;     // Moving bar and percentage  
  byte      _flags;
  /* @END */

protected:
  /* @FPROT */

  long    _max;     // maximum value to reach 
  long    _status;  // current status (set by user)
  void    draw_window();
  word    measure_text(TToken_string& t, word& len) const;

  virtual void handler(WINDOW w, EVENT* e);
  virtual void update();

  void update_bar();
  KEY check_stop();

public:
  /* @FPUB */
  bool iscancelled() const { return _flags & IND_CANCELLED; }
  bool isfinished()  const { return _flags & IND_FINISHED;  }
  long status()      const { return _status; }
  void cancel() { _flags |= IND_CANCELLED; check_stop(); }
  
  virtual bool can_be_closed() const;
  /* @END */

  /* @LONGDES
     si puo' chiamare settext() per cambiare il testo, ma 
     le dimensioni della finestra sono calcolate sul primo
     passato, quindi occorre dare spazi se se ne prevede
     uno piu' lungo
     @END */
  void set_text(const char* t);

  /* FPUB */
  TIndwin(long max, const char* txt, bool cancel = TRUE,        bool bar = TRUE, int div = 16);
  virtual ~TIndwin();
};

/*
   @C
   class TProgind : public TIndwin
   @END
   */

class TProgind : public TIndwin
{
public:
  /* @FPUB */
  void setmax(long m)    { _max = m; }
  void setstatus(long l) { _status  = l; update_bar(); do_events(); }
  void addstatus(long l) { setstatus(_status+l); }
  TProgind(long max, const char* txt = NULL, bool cancel = TRUE,
           bool bar = TRUE, int div = 10);
  virtual ~TProgind() {}
};

/*
   @C
   class TTimerind : public TIndwin
   @END
   */

class TTimerind : public TIndwin
{
  /* @DPRIV */
  int _interval;
  static long _timer_id;

protected:
  /* @FPROT   */
  virtual void handler(WINDOW w, EVENT* e);

public:
  /* @FPUB   */
  TTimerind(long msec, const char* txt = NULL, bool cancel = TRUE,
            bool bar = TRUE, int div = 10, int interval = 1000);
  virtual ~TTimerind();
};


/* @DPRIV */
/*  extern TIndwin* __indwin__p; */

/* @FPUB */
#endif

#ifdef __cplusplus
extern "C" {
#endif

  void progind_create(long, char*, bool,  bool, int);
  void progind_set_status(long);
  void progind_cancel();
  bool progind_iscancelled();
  bool progind_isfinished();
  void progind_destroy();
  void timerind_create(long, char*, bool, bool, int, int);
  void timerind_cancel();
  bool timerind_iscancelled();
  bool timerind_isfinished();
  void timerind_destroy();

#ifdef __cplusplus
}
#endif

#endif  /* __PROGIND_H */
