#include <Xm/RowColumn.h>
#include <Xm/Scale.h>
#include "DmSlider.h"
#include "DmErrno.h"

DmSlider::DmSlider(const char *name, Widget parent, DmObject *dmObject,
		   int period)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 0);
  installDestroyHandler();

  _dmObject = dmObject;
  _sliding = False;

  _scaleWidget = 
    XtVaCreateManagedWidget("scale", xmScaleWidgetClass, baseWidget(), 0);


  XtAddCallback(_scaleWidget, XmNdragCallback, 
		&DmSlider::sliderCallback,
		(XtPointer )this);

  XtAddCallback(_scaleWidget, XmNvalueChangedCallback, 
		&DmSlider::sliderCallback,
		(XtPointer )this);

  if (addDmObject(_dmObject, DmConsumeFlag | DmProvideFlag) == -1)
    return;

  setConsumePeriod(period);
}



DmSlider::~DmSlider()
{
}



void DmSlider::sliderCallback(Widget w,
			      XtPointer clientData,
			      XtPointer callData)
{
  DmSlider *obj = (DmSlider *)clientData;
  
  XmScaleCallbackStruct *cbs = (XmScaleCallbackStruct *)callData;

  if (cbs->reason == XmCR_DRAG)
    obj->_sliding = True;
  else
    obj->_sliding = False;

  obj->setDmValue(cbs->value);
}




DmInt16Slider::DmInt16Slider(const char *name, Widget parent,
			     DmInt16Object *dmObject, int period)
  : DmSlider(name, parent, dmObject, period)
{
}


DmInt16Slider::~DmInt16Slider()
{
}


void DmInt16Slider::updateGui(DM_Item dmItem)
{
  DM_Time t;
  Errno err;
  char errorBuf[errorMsgSize];
  Int16 value;
  
  // Only update GUI when user is not sliding widget
  if (!_sliding)
  {
    if ((err = ((DmInt16Object *)_dmObject)->read(&value, &t)) != SUCCESS)
    {
      sprintDmError(errno, 
		    "DmInt16Object::updateGui()", errorBuf);

      setError(errorBuf);
      return;
    }

    XtVaSetValues(_scaleWidget, XmNvalue, value, NULL);
  }
}


void DmInt16Slider::setDmValue(int position)
{
  DM_Time t;
  gettimeofday(&t, NULL);
  
  Int16 value = (Int16 )position;
  Errno errno;
  char errorBuf[errorMsgSize];
  
  if ((errno = ((DmInt16Object *)_dmObject)->write(value, &t)) != SUCCESS)
  {
    sprintDmError(errno, "SuctionSamplerPump::setSpeed()", errorBuf);
    fprintf(stderr, "%s\n", errorBuf);
  }
}

