#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>
#include "DmEnumSwitch.h"
#include "DmErrno.h"

DmEnumSwitch::DmEnumSwitch(const char *name, Widget parent,
			   DmEnumObject *dmObject,
			   int period)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 0);

  installDestroyHandler();

  _radioBox = new VkRadioBox("radioBox", _baseWidget);
  
  _dmObject = dmObject;

  if (addDmObject(_dmObject, DmConsumeFlag | DmProvideFlag) == -1)
    return;

  setConsumePeriod(period);

  updateGui();
}



DmEnumSwitch::~DmEnumSwitch()
{
}


void DmEnumSwitch::updateGui(DM_Item dmItem)
{
  DM_Time t;
  Int32 value;
  Errno err;
  char errorBuf[100];

  if ((err = _dmObject->read(&value, &t)) != SUCCESS) {
    sprintDmError(err, "DmEnumObject::updateGui()", errorBuf);
    setError(errorBuf);
    prtErrorMsg();
    return;
  }

  displayValue(value);
}


void DmEnumSwitch::addValue(char *valueName, Int32 value)
{
  Widget w = 
    _radioBox->addItem(valueName, False, &DmEnumSwitch::toggleCallback, this);

  WidgetValue *widgetValue = new WidgetValue();
  widgetValue->widget = w;
  widgetValue->value = value;

  _widgetValues.add(&widgetValue);
}


void DmEnumSwitch::displayValue(Int32 value)
{
  for (int i = 0; i < _widgetValues.size(); i++) {
    WidgetValue *widgetValue;
    _widgetValues.get(i, &widgetValue);

    if (widgetValue->value == value)
      _radioBox->setValue(i, True);
    else
      _radioBox->setValue(i, False);
  }
}


void DmEnumSwitch::setValue(Widget widget)
{
  for (int i = 0; i < _widgetValues.size(); i++) {
    WidgetValue *widgetValue;
    _widgetValues.get(i, &widgetValue);

    if (widgetValue->widget == widget) {
      // Write value corresponding to this widget
      DM_Time t;
      gettimeofday(&t, 0);
      _dmObject->write(widgetValue->value, &t);
    }
  }
}


void DmEnumSwitch::toggleCallback(Widget w,
				  XtPointer clientData,
				  XtPointer callData)
{
  DmEnumSwitch *obj = (DmEnumSwitch *)clientData;

  XmToggleButtonCallbackStruct *cbs = 
    (XmToggleButtonCallbackStruct *)callData;

  if (!cbs->set)
    return;

  obj->setValue(w);

}

