#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include "DmBooleanIndicator.h"
#include "DmErrno.h"

XtResource DmBooleanIndicator::_resources[] = 
{
  {
    "trueMnem",
    "TrueMnem",
    XmRString,
    sizeof(char *),
    XtOffset(DmBooleanIndicator *, _trueMnem),
    XmRImmediate, 
    "True"
  },

  {
    "falseMnem",
    "FalseMnem",
    XmRString,
    sizeof(char *),
    XtOffset(DmBooleanIndicator *, _falseMnem),
    XmRImmediate, 
    "False"
  },

  {
    "trueForeground",
    "TrueForeground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBooleanIndicator *, _trueForeground),
    XmRString, 
    "black"
  },

  {
    "trueBackground",
    "TrueBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBooleanIndicator *, _trueBackground),
    XmRString,
    "yellow"
  },

  {
    "falseForeground",
    "FalseForeground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBooleanIndicator *, _falseForeground),
    XmRString,
    "white"
  },

  {
    "falseBackground",
    "FalseBackground",
    XtRPixel,
    sizeof(Pixel),
    XtOffset(DmBooleanIndicator *, _falseBackground),
    XmRString,
    "SlateBlue"
  }
};

DmBooleanIndicator::DmBooleanIndicator(const char *name, 
				       Widget parent,
				       DmBooleanObject *dmObject,
				       int period)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent, 0);

  installDestroyHandler();

  getResources(_resources, XtNumber(_resources));

  _indicator = 
    XtVaCreateManagedWidget("indicator", xmLabelWidgetClass, 
			    baseWidget(),
			    NULL);
  
  _dmObject = dmObject;

  if (addDmObject(_dmObject, DmConsumeFlag) == -1)
    return;

  setConsumePeriod(period);

  updateGui();
}


DmBooleanIndicator::~DmBooleanIndicator()
{
}


void DmBooleanIndicator::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 DmBooleanIndicator::displayValue(MBool value)
{
  char *mnemPtr;
  Pixel foreground, background;

  // Set toggle switch state
  if (value) {
    mnemPtr = _trueMnem;
    foreground = _trueForeground;
    background = _trueBackground;
  }
  else {
    mnemPtr = _falseMnem;
    foreground = _falseForeground;
    background = _falseBackground;
  }

  XmString xmstr;
  xmstr = XmStringCreateSimple(mnemPtr);
  XtVaSetValues(_indicator, XmNlabelString, xmstr,
		XmNforeground, foreground,
		XmNbackground, background,
		NULL);

  XmStringFree(xmstr);
}


