/************************************************************************/
/* Copyright 1998 MBARI							*/
/************************************************************************/
#ifndef _ALARMEDBARGUAGE_H
#define _ALARMEDBARGUAGE_H
static char AlarmedBarGuage_h_id[] = "$Header: /u/oreilly/rov/tmacs/RCS/AlarmedBarGuage.h,v 1.3 1998/12/18 21:07:21 oreilly Exp $";

/*
$Log: AlarmedBarGuage.h,v $
Revision 1.3  1998/12/18 21:07:21  oreilly
Added documentation

Revision 1.2  1997/05/07 17:02:21  oreilly
Delete contained _alarmDetector in destructor

 * Revision 1.1  96/10/28  09:13:19  09:13:19  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#include "DmGuiObject.h"
#include "Alarm.h"
#include "DmInputDetector.h"
#include "LabeledBarGuage.h"

/*
CLASS 
AlarmedBarGuage

DESCRIPTION
Display value of a DmObject as a bar graph. If associated Alarm
object is active, color GUI according to priority.

AUTHOR
Tom O'Reilly
*/
class AlarmedBarGuage : public DmGuiObject
{
  public:
  AlarmedBarGuage(const char *name, Widget parent);
  
  AlarmedBarGuage(const char *name, Widget parent,
		  DmObject *dmObject, 
		  int period, Alarm *alarm,
		  float min, float max, Side labelSide,
		  Boolean addTickMarks, Side tickSide); 

  ~AlarmedBarGuage();

  virtual const char *className()
  {
    return "AlarmedBarGuage";
  }
  
  // Create GUI elements, register DmObjects, etc.
  void initialize(DmObject *dmObject, int period,
		  Alarm *alarm, float min, float max, Side labelSide,
		  Boolean addTickMarks, Side tickSide);
  

  // 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;

  ///////////////////////////////////////////////////////////////////
  // Associated Alarm object
  Alarm *_alarm;

  ///////////////////////////////////////////////////////////////////
  // Detect changes in value of associated Alarm
  DmInputDetector *_alarmDetector;

  LabeledBarGuage *_guage;

  Pixel _okForeground;
  Pixel _okBackground;
  Pixel _alarmBackground;
  static XtResource _resources[];
  float _multiplier;
};



/*
CLASS 
AlarmedNat16BarGuage

DESCRIPTION
AlarmedNat16BarGuage displays a value of a DmNat16Object.
If associated Alarm object is active, color GUI according to priority.

AUTHOR
Tom O'Reilly
*/
class AlarmedNat16BarGuage : public AlarmedBarGuage
{
  public:
  
  AlarmedNat16BarGuage(const char *name, Widget parent, 
		       char *dmObjectName,
		       int period, char *alarmName,
		       float min, float max, Side labelSide,
		       Boolean addTickMarks = False, Side tickSide = Left);

  AlarmedNat16BarGuage(const char *name, Widget parent, 
		       DmNat16Object *dmObject, 
		       int period, Alarm *alarm,
		       float min, float max, Side labelSide,
		       Boolean addTickMarks = False, Side tickSide = Left);

  ~AlarmedNat16BarGuage()
  {
  }
  
  virtual const char *className()
  {
    return "AlarmedNat16BarGuage";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmNat16Object *_dmObject;
  
  
};


/*
CLASS 
AlarmedFlt32BarGuage

DESCRIPTION
AlarmedFlt32BarGuage displays a value of a DmFlt32Object.
Display value of a DmObject as a bar graph. If associated Alarm
object is active, color GUI according to priority.

AUTHOR
Tom O'Reilly
*/
class AlarmedFlt32BarGuage : public AlarmedBarGuage
{
  public:
  
  AlarmedFlt32BarGuage(const char *name, Widget parent, 
		       char *dmObjectName,
		       int period, char *alarmName,
		       float min, float max, Side labelSide,
		       Boolean addTickMarks = False, Side tickSide = Left);

  AlarmedFlt32BarGuage(const char *name, Widget parent, 
		       DmFlt32Object *dmObject, 
		       int period, Alarm *alarm,
		       float min, float max, Side labelSide,
		       Boolean addTickMarks = False, Side tickSide = Left);

  ~AlarmedFlt32BarGuage()
  {
  }
  
  virtual const char *className()
  {
    return "AlarmedFlt32BarGuage";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmFlt32Object *_dmObject;
  
};

#endif
