#ifndef _DMBARGRAPH_H
#define _DMBARGRAPH_H

#include "DmGuiObject.h"
#include <X11/Xc/Xc.h>
#include <X11/Xc/BarGraf.h>
#include "Alarm.h"
#include "DmInputDetector.h"

class DmBarGraph : public DmGuiObject
{
  public:
  DmBarGraph(const char *name, Widget parent); 
  ~DmBarGraph();
	
  virtual const char *className()
  {
    return "DmBarGraph";
  }
  
  // Create GUI elements, register DmObjects, etc.
  void initialize(DmObject *dmObject, 
		  int period,
		  char *alarmName, 
		  float min, 
		  float max, 
		  DM_Type dataType);

  // updateFromPeer() gets called by contained DmInputDetector object
  virtual void updateFromPeer(DmGuiObject *peer, void *clientData);

  Widget barGraphWidget()
  {
    return _barGraph;
  }
  
  // Multiply DM item value by multiplier before displaying
  void setMultiplier(float multiplier)
  {
    _multiplier = multiplier;
  }

  void setDecimalPlaces(unsigned decimalPlaces);
  void setTickmarks(unsigned nTickmarks);
  void setHorizontal();
  void setVertical();

  protected:
  Widget _barGraph;
  Widget _parent;
  Alarm *_alarm;
  DmInputDetector *_alarmDetector;
  float _multiplier;
  float _prevValue;
  Pixel _okBarColor;
  static XtResource _resources[];

  // Post menu showing options in response to button press
  virtual void postOptions(XEvent *event);

  private:
//  static void showAlarmCallback(Widget w,
//				XtPointer clientData,
//				XtPointer callData);
};


class DmInt16BarGraph : public DmBarGraph
{
  public:
  
  DmInt16BarGraph(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  int min, 
		  int max); 

  ~DmInt16BarGraph();
  
  virtual const char *className()
  {
    return "DmInt16BarGraph";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmInt16Object *_dmObject;
};


class DmNat16BarGraph : public DmBarGraph
{
  public:
  
  DmNat16BarGraph(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  unsigned min, 
		  unsigned max); 

  ~DmNat16BarGraph();
  
  virtual const char *className()
  {
    return "DmNat16BarGraph";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmNat16Object *_dmObject;
};


class DmFlt32BarGraph : public DmBarGraph
{
  public:
  
  DmFlt32BarGraph(const char *name, Widget parent, 
		  char *dmObjectName,
		  int period, 
		  char *alarmName,         // NULL if no associated Alarm
		  float min, 
		  float max); 

  ~DmFlt32BarGraph();
  
  virtual const char *className()
  {
    return "DmFlt32BarGraph";
  }
  
  virtual void updateGui(DM_Item handle = 0);
  
  protected:
  DmFlt32Object *_dmObject;
};


extern "C" 
{
  // Prototype in BarGraf.h has no args!
  void XcBGUpdateValue(Widget w, XcVType *value);
};

#endif
