#ifndef _ALARMEDTEXT_H
#define _ALARMEDTEXT_H
static char AlarmedText_h_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/AlarmedText.h,v 1.6 1997/08/12 14:33:31 oreilly Exp $";

/*
$Log: AlarmedText.h,v $
Revision 1.6  1997/08/12 14:33:31  oreilly
Popup menu to show alarm defintion

 * Revision 1.5  97/05/30  15:47:19  15:47:19  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.4  97/05/08  09:23:29  09:23:29  oreilly (Thomas C. O'Reilly)
 * Delete contained DmInputDetector in destructor.
 * 
 * Revision 1.3  97/04/30  19:30:46  19:30:46  oreilly (Thomas C. O'Reilly)
 * Delete contained DynamicLabel object
 * 
 * Revision 1.2  97/03/20  12:32:46  12:32:46  oreilly (Thomas C. O'Reilly)
 * *** empty log message ***
 * 
 * Revision 1.1  96/10/28  09:13:21  09:13:21  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#include <string.h>
#include <Vk/VkPopupMenu.h>
#include "DmGuiObject.h"
#include "Alarm.h"
#include "DmInputDetector.h"
#include "DynamicLabel.h"

#define Dynamic True
#define Static False

/*
AlarmedText displays a numeric value of a DmObject as text; if 
associated alarm goes active, text color changes.
*/
class AlarmedText : public DmGuiObject
{
  public:
  AlarmedText(const char *name, Widget parent, 
	      char *format,       // MUST be floating point format
	      DmObject *dmObject, 
	      int period, 
	      Alarm *alarm, 
	      Boolean dynamic, 
	      float multiplier,
	      unsigned char alignment); 

  ~AlarmedText();
  
  const char *className()
  {
    return "AlarmedText";
  }
  
  // updateFromPeer() gets called by contained DmInputDetector object
  virtual void updateFromPeer(DmGuiObject *peer, void *clientData);

  // Multiply DM item value by multiplier before displaying
  void setMultiplier(float multiplier)
  {
    _multiplier = multiplier;
  }

  static const char *const alarmUpdateCallback;

  Priority priority();
  
  protected:
  char *_format;
  Widget _valueText;
  DynamicLabel *_dynamicText;
  Alarm *_alarm;
  DmInputDetector *_alarmDetector;
  float _multiplier;
  int _nAlarmChanges;
  Priority _priority;
  
  /* Set text string. If font not yet available (and so string not yet drawn
     into pixmap), return False, else return True. */  
  Boolean setText(const char *text);

  // Post menu showing options in response to button press
  virtual void postOptions(XEvent *event);
  
};




class AlarmedNat16Text : public AlarmedText
{
  public:
  
  AlarmedNat16Text(const char *name, Widget parent, char *format,
		   DmNat16Object *dmObject, int period, Alarm *alarm,
		   Boolean dynamic = False, float multiplier = 1.,
		   unsigned char alignment = XmALIGNMENT_CENTER);
  
  ~AlarmedNat16Text()
  {
  }
  
  const char *className()
  {
    return "AlarmedNat16Text";
  }

  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmNat16Object *_dmObject;
  Nat16 _prevValue;

};


class AlarmedInt16Text : public AlarmedText
{
  public:
  
  AlarmedInt16Text(const char *name, Widget parent, char *format,
		   DmInt16Object *dmObject, int period, Alarm *alarm,
		   Boolean dynamic = False, float multiplier = 1.,
		   unsigned char alignment = XmALIGNMENT_CENTER);
  
  ~AlarmedInt16Text()
  {
  }
  
  const char *className()
  {
    return "AlarmedInt16Text";
  }

  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmInt16Object *_dmObject;
  Int16 _prevValue;
};


class AlarmedFlt32Text : public AlarmedText
{
  public:
  
  AlarmedFlt32Text(const char *name, Widget parent, char *format,
		   DmFlt32Object *dmObject, int period, Alarm *alarm,
		   Boolean dynamic = False, float multiplier = 1.,
		   unsigned char alignment = XmALIGNMENT_CENTER);
  
  ~AlarmedFlt32Text()
  {
  }
  
  const char *className()
  {
    return "AlarmedFlt32Text";
  }

  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmFlt32Object *_dmObject;
  Flt32 _prevValue;
};


#endif

