#include <Xm/RowColumn.h>
#include "DmInfo.h"
#include "DmErrno.h"

DmInfo::DmInfo(const char *name, Widget parent, const char *itemName, 
	       int period)
  : DmGuiObject(name, parent)
{
  _label = 0;
  _dmObject = 0;
  
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent,
				 XmNorientation, XmVERTICAL,
				 NULL);
  
  installDestroyHandler();
  
  _label = new DynamicLabel("label", _baseWidget);
  _label->show();
  
  DM_Item handle = dm_lookup((char *)itemName, 0);

  if (handle)
    _dmObject = new DmObject(&handle, 1);
  else
  {
    char errorBuf[errorMsgSize];
    sprintf(errorBuf, "Item \"%s\" not found\n", itemName);
    setError(errorBuf);
    return;
  }

  addDmObject(_dmObject, DmConsumeFlag);
  setConsumePeriod(period);
  
  updateGui();
}


DmInfo::~DmInfo()
{
  delete _label;
  delete _dmObject;
}


void DmInfo::updateGui(DM_Item handle)
{
  DmItemSts status;
  char buf[1024];
  Errno errno;
  
  if ((errno = dm_item_status(_dmObject->getHandle(), &status)) != SUCCESS)
  {
    sprintDmError(errno, "dm_item_status()", buf);
    setError(buf);
    _label->setText(buf);
  }

  char typeMnem[30];  
  DmObject::sprintDataType(status.is_type, typeMnem);

  sprintf(buf,
	  "%s\n"
	  "Handle: %#x  Type: %s\n"
	  "Size: %d  Seq: %d\n",
	  
	  _dmObject->getName(),
	  _dmObject->getHandle(),
	  typeMnem,
	  status.is_size,
	  status.is_seq);
  
  _label->setText(buf);
  
  dm_item_status_free(&status);
}
