static char VbModeSelect_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/VbModeSelect.cc,v 1.2 1997/03/20 12:31:23 oreilly Exp $";


/*
$Log: VbModeSelect.cc,v $
Revision 1.2  1997/03/20 12:31:23  oreilly
..

Revision 1.1  96/07/22  10:42:17  10:42:17  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/ToggleB.h>
#include <Xm/ToggleBG.h>
#include <Xm/Label.h>
#include <Vk/VkInfoDialog.h>
#include "VbModeSelect.h"
// #include "vbSystem.h"
#include "tiburon.h"

VbModeSelect::VbModeSelect(const char *name, Widget parent)
  : DmGuiObject(name, parent)
{
  _baseWidget = XtCreateWidget(name, xmFormWidgetClass, parent, NULL, 0);
  installDestroyHandler();

  Widget toggleBox = 
    XtVaCreateWidget("toggleBox", xmRowColumnWidgetClass, _baseWidget,
		     XmNisHomogeneous, True,
		     XmNentryClass, xmToggleButtonGadgetClass,
		     XmNradioBehavior, True,
		     XmNtopAttachment, XmATTACH_FORM,
		     XmNorientation, XmHORIZONTAL,
		     NULL);
  
  _selectVb = XtVaCreateManagedWidget("selectVb", 
				      xmToggleButtonWidgetClass,
				      toggleBox, NULL);

  XtAddCallback(_selectVb, XmNvalueChangedCallback, 
		&VbModeSelect::selectCallback, this);
  
  _selectSled = XtVaCreateManagedWidget("selectSled", 
					xmToggleButtonWidgetClass,
					toggleBox, NULL);  

  XtAddCallback(_selectSled, XmNvalueChangedCallback, 
		&VbModeSelect::selectCallback, this);

  _selectArm = XtVaCreateManagedWidget("selectArm", 
					 xmToggleButtonWidgetClass,
					 toggleBox, NULL);

  XtAddCallback(_selectArm, XmNvalueChangedCallback, 
		&VbModeSelect::selectCallback, this);


  _status = XtVaCreateManagedWidget("selectStatus", xmLabelWidgetClass,
				    _baseWidget,
				    XmNtopAttachment, XmATTACH_WIDGET,
				    XmNtopWidget, toggleBox,
				    XmNleftAttachment, XmATTACH_FORM,
				    XmNbottomAttachment, XmATTACH_FORM,
				    NULL);

  
  XtManageChild(toggleBox);
  XtManageChild(_baseWidget);

  char itemName[MaxDmNameLen];
  char *namePtr;
  char errorBuf[errorMsgSize];
  
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  
  strcpy(namePtr, VB_SYSTEM_PUMP_MODE_SELECT_DM);
  _dmModeSelect = new DmEnumObject(itemName);
  if (_dmModeSelect->error())
  {
    _dmModeSelect->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }
  if (addDmObject(_dmModeSelect, DmProvideFlag) == -1)
    return;
  
  strcpy(namePtr, VB_SYSTEM_PUMP_MODE_STATUS_DM);
  _dmModeStatus = new DmEnumObject(itemName);
  if (_dmModeStatus->error())
  {
    _dmModeStatus->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }  
  if (addDmObject(_dmModeStatus, DmConsumeFlag) == -1)
    return;
  
  if (setConsumePeriod(Aperiodic) == -1)
    return;
  
  updateGui();
}


void VbModeSelect::updateGui(DM_Item handle)
{
  DM_Time t;
  Nat32 choice;
  Errno errno;
  if ((errno = _dmModeStatus->read(&choice, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    _dmModeStatus->errorMsg(errorBuf);
    setError(errorBuf);
  }

  Widget w;
  
  switch (choice)
  {
    case VB_MODE:
    w = _selectVb;
    break;
    
    case ARM_HYDRAULICS:
    w = _selectArm;
    break;
    
    case TOOLSLED_HYDRAULICS:
    w = _selectSled;
    break;
  }
  
  XtVaSetValues(w, XmNset, True, NULL);
  XmString xmstr = XmStringCreateSimple("");
  XtVaSetValues(_status, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr);
  
}



void VbModeSelect::select(Widget w)
{
  char *ptr;
  Nat32 choice;
  
  if (w == _selectSled)
  {
    ptr = "Selecting sled...";
    choice = TOOLSLED_HYDRAULICS;
  }
  else if (w == _selectVb)
  {
    ptr = "Selecting VB...";
    choice = VB_MODE;
  }
  else if (w == _selectArm)
  {
    ptr = "Selecting arm...";
    choice = ARM_HYDRAULICS;
  }

  DM_Time t;
  t.tv_sec = time(NULL);
  t.tv_usec = 0;
  Errno errno;
  
  if ((errno = _dmModeSelect->write(choice, &t)) != SUCCESS)
  {
    char errorBuf[errorMsgSize];
    _dmModeSelect->errorMsg(errorBuf);
    setError(errorBuf);
    theInfoDialog->postAndWait(errorBuf);
  }
  
  XmString xmstr = XmStringCreateSimple(ptr);
  XtVaSetValues(_status, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr);
}


void VbModeSelect::selectCallback(Widget w, XtPointer clientData,
				     XtPointer callData)
{
  VbModeSelect *obj = (VbModeSelect *)clientData;
  obj->select(w);
}
