#ifndef _ALARMEDITOR_H
#define _ALARMEDITOR_H
static char AlarmEditor_h_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/AlarmEditor.h,v 1.3 1997/10/03 09:23:19 oreilly Exp $";

/*
$Log: AlarmEditor.h,v $
Revision 1.3  1997/10/03 09:23:19  oreilly
Added PsuAlarmText

 * Revision 1.2  97/08/12  14:14:34  14:14:34  oreilly (Thomas C. O'Reilly)
 * Display thresholds and monitored item for GraduatedAlarms
 * 
 * Revision 1.1  96/10/28  09:13:12  09:13:12  oreilly (Thomas C. O'Reilly)
 * Initial revision
 * 
*/

#include <Vk/VkComponent.h>
#include "SystemAlarms.h"
#include "MonitoredValue.h"
#include "LabeledText.h"
#include "DmText.h"
#include "PsuAlarmText.h"

// MaxAlarmValue is the maximum number of values associated with any
// of the Alarm classes
#define MaxAlarmValue 8



class ValueBox : public VkComponent
{
  public:

  ValueBox(const char *name, Widget parent);
  ~ValueBox();
  
  virtual const char *className()
  {
    return "ValueBox";
  }
  
  void clear();

  protected:
  void setErrorLabel(char *buf);
  DM_Item findItem(const char *itemName, DM_Type *type);

  Widget _mgr;
  Widget _errorLabel;
  DmGuiObject *_value;
  DmObject *_dmObject;
  Pixel _errorFg, _errorBg;
};


class ThresholdBox : public ValueBox
{
  public:
  ThresholdBox(const char *name, Widget parent);
  ~ThresholdBox();
  
  virtual const char *className()
  {
    return "ThresholdBox";
  }
  
  int createThreshold(IbcAlarm *alarm, int value);
};


class MonitoredValueBox : public ValueBox
{
  public:
  MonitoredValueBox(const char *name, Widget parent);
  ~MonitoredValueBox();
  
  virtual const char *className()
  {
    return "MonitoredValueBox";
  }
  
  int createValue(GraduatedAlarm *alarm);
};


class PsuValue : public VkComponent
{
  public:
  
  PsuValue(const char *name, Widget parent);
  ~PsuValue();

  const char *className()
  {
    return "PsuValue";
  }

  void clear();
  int createDescription(PsuAlarm *alarm);

  protected:
  PsuAlarmText *_alarmText;
};



/*
AlarmEditor provides GUI for setting alarm attributes
*/
class AlarmSetupPanel;

class AlarmEditor : public VkComponent
{
  friend class AlarmSetupPanel;
  
  public: 
  AlarmEditor(const char *name, Widget parent);
  ~AlarmEditor();
  
  const char *className()
  {
    return "AlarmEditor";
  }
  
  void setOkCallback(XtCallbackProc callback, XtPointer clientData)
  {
    XtAddCallback(_ok, XmNactivateCallback, callback, clientData);
  }
  
  void setCancelCallback(XtCallbackProc callback, XtPointer clientData)
  {
    XtAddCallback(_cancel, XmNactivateCallback, callback, clientData);
  }

  // Update selected Alarm object with user input values
  void updateAlarmItem();

  // Select specified alarm item in scrolled list and display attributes
  void selectItem(char *name);

  protected:
  Widget _listWidget;
  Widget _entryMgr;
  Widget _itemName;
  Widget _itemType;
  LabeledText *_mnemonic;
  Widget _defaultPriority;
  Widget _ackAllChanges;
  SystemAlarms *_alarms;
  Widget _valueHeader;
  Widget _thresholdHeader;

  Widget _valueLabel[MaxAlarmValue];
  Widget _priorityToggleBox[MaxAlarmValue];
  ThresholdBox *_thresholdBox[MaxAlarmValue];
  DmText *_threshold[MaxAlarmValue];
  
  Widget _ok;
  Widget _cancel;
  
  MonitoredValue *_monitoredValue;
  PsuValue *_psuValue;
  
  // Interface function for qsort
  static int stringCompare(const void *p1, const void *p2);
  
  void displayItem(char *name);
  
  private:
  static void listSelectCallback(Widget w, XtPointer clientData,
				 XtPointer callData);

  static void okCallback(Widget w, XtPointer clientData,
			 XtPointer callData);
  
};


#endif

