#ifndef _DMBARGUAGE_H
#define _DMBARGUAGE_H
static char DmBarGuage_h_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/DmBarGuage.h,v 1.3 1997/05/07 17:19:10 oreilly Exp $";

/*
$Log: DmBarGuage.h,v $
Revision 1.3  1997/05/07 17:19:10  oreilly
Delete DmInputDetector in destructor

 * Revision 1.2  97/03/20  12:33:15  12:33:15  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.1  96/10/28  09:13:34  09:13:34  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#include "DmGuiObject.h"
#include "Alarm.h"
#include "DmInputDetector.h"
#include "LabeledBarGuage.h"

/*
DmBarGuage displays a value of a DmObject. May also have an associated
Alarm object. If associated alarm goes active, display color changes to 
corresponding alarm priority colors.
*/
class DmBarGuage : public DmGuiObject
{
  public:
  DmBarGuage(const char *name, Widget parent);
  
  DmBarGuage(const char *name, Widget parent,
	     DmObject *dmObject, 
	     int period, 
	     Alarm *alarm,           // NULL if no associated Alarm
	     float min, float max, 
	     Side labelSide,
	     Boolean addTickMarks, Side tickSide,
	     const char *valueFormat = NULL); 

  ~DmBarGuage()
  {
    if (_alarmDetector)
      delete _alarmDetector;
  }

  virtual const char *className()
  {
    return "DmBarGuage";
  }
  
  // Create GUI elements, register DmObjects, etc.
  void initialize(DmObject *dmObject, int period,
		  Alarm *alarm, float min, float max, Side labelSide,
		  Boolean addTickMarks, Side tickSide,
		  const char *valueFormat = NULL);
  

  // updateFromPeer() gets called by contained DmInputDetector object
  virtual void updateFromPeer(DmGuiObject *peer, void *clientData);

  // Return pointer to LabeledBarGuage
  LabeledBarGuage *guage()
  {
    return _guage;
  }
  
  // Multiply DM item value by multiplier before displaying
  void setMultiplier(float multiplier)
  {
    _multiplier = multiplier;
  }
  
  
  protected:
  Widget _parent;
  Alarm *_alarm;
  DmInputDetector *_alarmDetector;
  LabeledBarGuage *_guage;
  float _multiplier;
  float _prevValue;
  
  Pixel _okForeground;
  Pixel _okBackground;
  Pixel _alarmBackground;
  static XtResource _resources[];
};



class DmNat16BarGuage : public DmBarGuage
{
  public:
  
  DmNat16BarGuage(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  DmNat16BarGuage(const char *name, Widget parent, 
		  DmNat16Object *dmObject, 
		  int period, 
		  Alarm *alarm,            // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  ~DmNat16BarGuage()
  {
  }
  
  virtual const char *className()
  {
    return "DmNat16BarGuage";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmNat16Object *_dmObject;
};


class DmInt16BarGuage : public DmBarGuage
{
  public:
  
  DmInt16BarGuage(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  DmInt16BarGuage(const char *name, Widget parent, 
		  DmInt16Object *dmObject, 
		  int period, 
		  Alarm *alarm,            // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  ~DmInt16BarGuage()
  {
  }
  
  virtual const char *className()
  {
    return "DmInt16BarGuage";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmInt16Object *_dmObject;
};


class DmFlt32BarGuage : public DmBarGuage
{
  public:
  
  DmFlt32BarGuage(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  DmFlt32BarGuage(const char *name, Widget parent, 
		  DmFlt32Object *dmObject, 
		  int period, 
		  Alarm *alarm,            // NULL if no associated Alarm
		  float min, float max, 
		  Side labelSide = Top,
		  Boolean addTickMarks = False, 
		  Side tickSide = Left,
		  const char *valueFormat = NULL);

  ~DmFlt32BarGuage()
  {
  }
  
  virtual const char *className()
  {
    return "DmFlt32BarGuage";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmFlt32Object *_dmObject;
};


#endif
