#include <Xm/ToggleB.h>
#include <Xm/RowColumn.h>
#include "DmBooleanSwitch.h"
#include "DmErrno.h"

DmBooleanSwitch::DmBooleanSwitch(const char *name, Widget parent,
				 DmBooleanObject *dmObject,
				 int period)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 0);

  installDestroyHandler();

  unsigned flags;

  _toggle = 
    XtVaCreateManagedWidget("toggle", xmToggleButtonWidgetClass, 
			    baseWidget(),
			    NULL);
  
  XtAddCallback(_toggle, XmNvalueChangedCallback,
		&DmBooleanSwitch::toggleCallback,
		(XtPointer )this);

  flags = DmConsumeFlag | DmProvideFlag;

  _dmObject = dmObject;

  if (addDmObject(_dmObject, flags) == -1)
    return;

  setConsumePeriod(period);

  updateGui();
}



DmBooleanSwitch::~DmBooleanSwitch()
{
}


void DmBooleanSwitch::updateGui(DM_Item dmItem)
{
  DM_Time t;
  MBool value;
  Errno err;
  char errorBuf[100];

  if ((err = _dmObject->read(&value, &t)) != SUCCESS) {
    sprintDmError(err, "DmBooleanObject::updateGui()", errorBuf);
    setError(errorBuf);
    prtErrorMsg();
    return;
  }

  displayValue(value);
}


void DmBooleanSwitch::displayValue(MBool value)
{
  // Set toggle switch state
  if (value) 
    XtVaSetValues(_toggle, XmNset, True, 0);
  else 
    XtVaSetValues(_toggle, XmNset, False, 0);
}


void DmBooleanSwitch::toggleCallback(Widget w,
				     XtPointer clientData,
				     XtPointer callData)
{
  DmBooleanSwitch *obj = (DmBooleanSwitch *)clientData;

  XmToggleButtonCallbackStruct *cbs = 
    (XmToggleButtonCallbackStruct *)callData;

  MBool set;
    
  if (cbs->set)
    set = TRUE;
  else
    set = FALSE;

  DM_Time t;
  gettimeofday(&t, 0);

  obj->_dmObject->write(set, &t);
}

