static char VbGui_id[] = "$Header: VbGui.cc,v 1.6 97/08/12 15:00:34 oreilly Exp $";


/*
$Log:	VbGui.cc,v $
Revision 1.6  97/08/12  15:00:34  15:00:34  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.5  97/04/30  19:48:29  19:48:29  oreilly (Thomas C. O'Reilly)
show pressure object

Revision 1.4  97/04/09  14:05:20  14:05:20  oreilly (Thomas C. O'Reilly)
Sensitize/de-sensitize controls depending on Hydraulic system state

Revision 1.3  97/03/20  12:31:17  12:31:17  oreilly (Thomas C. O'Reilly)
..

Revision 1.2  96/10/28  09:12:45  09:12:45  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  96/07/22  10:42:14  10:42:14  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <Xm/Form.h>
#include <Xm/Separator.h>
#include <Xm/Label.h>
#include <Xm/Scale.h>
#include <Vk/VkTickMarks.h>
#include "VbGui.h"
#include "HydraulicSelect.h"
#include "LabeledText.h"
#include "tiburon.h"
#include "TiburonApp.h"
#include "AlarmedText.h"
#include "DmErrno.h"
#include "VbMode.h"

#define dprintf if (debug) fprintf

#define ScaleMargin 19   // Half-thickness of Scale's slider

DM_Time VbGui::_t;
struct timezone VbGui::_tz = {0, 0};
 
VbGui::VbGui(const char *name, Widget parent, int period)
  : DmGuiObject(name, parent)
{
  MBool debug = FALSE;
  
  _baseWidget = XtCreateWidget(name, xmFormWidgetClass, parent, NULL, 0);
  installDestroyHandler();

  char errorBuf[errorMsgSize];
  char itemName[MaxDmNameLen];
  char *namePtr;
  strcpy(itemName, TIBURON_DM_PREFIX);
  namePtr = itemName + strlen(itemName);
  strcpy(namePtr, HYDRAULIC_PRESSURE_DM);
  DmNat16Object *dmPressure = new DmNat16Object(itemName);
  if (dmPressure->error())
  {
    dmPressure->errorMsg(errorBuf);
    setError(errorBuf);
    return;
  }

  strcpy(namePtr, HYDRAULIC_PRESSURE_ALARM_DM);
  Alarm *pressureAlarm;
  if ((pressureAlarm = ((TiburonApp *)theApplication)->systemAlarms->
       find(itemName)) == NULL)
  {
    sprintf(errorBuf, "Couldn't find alarm \"%s\"", itemName);
    setError(errorBuf);
    return;
  }
  
  Widget selectLabel = 
    XtVaCreateManagedWidget("hydraulicSelectLabel", xmLabelWidgetClass,
			    _baseWidget, XmNtopAttachment, XmATTACH_FORM,
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);
  
  HydraulicSelect *hydraulicSelect = 
    new HydraulicSelect("hydraulicSelect", _baseWidget);
  
  XtVaSetValues(hydraulicSelect->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, selectLabel,
		XmNleftAttachment, XmATTACH_FORM,
		NULL);
  
  hydraulicSelect->show();
  hydraulicSelect->addCallback(HydraulicSelect::statusChangeCallback, this,
			       (VkCallbackMethod )&VbGui::hydraulicCallback);

  Widget label;
  
  _mgr = XtVaCreateWidget("mgr", xmFormWidgetClass, _baseWidget, 
			  XmNtopAttachment, XmATTACH_WIDGET,
			  XmNtopWidget, hydraulicSelect->baseWidget(),
			  XmNleftAttachment, XmATTACH_FORM,
			  NULL);
  
  VbMode *mode = new VbMode("mode", _mgr);

  XtVaSetValues(mode->baseWidget(),
		XmNleftAttachment, XmATTACH_FORM,
		XmNtopAttachment, XmATTACH_FORM,
		NULL);
  
  mode->show();
  
  char dmPrefix[MaxDmNameLen];
  sprintf(dmPrefix, "%s%s", TIBURON_DM_PREFIX, ERS_DCON_DM_PREFIX);

  _valveFunctions = new ValveFunctions("valveFunctions", _mgr, dmPrefix,
				       True);

  XtVaSetValues(_valveFunctions->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, hydraulicSelect->baseWidget(),
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, mode->baseWidget(),
		NULL);

  _valveFunctions->show();

  _status = 
    XtVaCreateManagedWidget("status", xmLabelWidgetClass, _mgr,
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, mode->baseWidget(),
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);

  XtManageChild(_mgr);

  label = 
    XtVaCreateManagedWidget("pressureLabel", xmLabelWidgetClass, _baseWidget, 
			    XmNtopAttachment, XmATTACH_WIDGET,
			    XmNtopWidget, _mgr,
			    XmNleftAttachment, XmATTACH_FORM,
			    NULL);

  AlarmedNat16Text *pressure = 
    new AlarmedNat16Text("pressure", _baseWidget, "%4.0f psi", dmPressure, 
			 period, pressureAlarm);
  
  XtVaSetValues(pressure->baseWidget(),
		XmNtopAttachment, XmATTACH_WIDGET,
		XmNtopWidget, _mgr,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, label,
		NULL);

  pressure->show();


  strcpy(namePtr, VB_SYSTEM_FLOOD_DM);
  
  if (setConsumePeriod(period) == -1)
    return;

  updateGui();
}


void VbGui::updateGui(DM_Item handle)
{
  Errno errno;
  char errorBuf[errorMsgSize];
  
  Flt32 value;
  DM_Time t;
}


void VbGui::hydraulicCallback(VkCallbackObject *obj,
			      void *clientData,
			      void *callData)
{
  vbPumpMode mode = (vbPumpMode )callData;
  switch (mode)
  {
    case VB_MODE:
    // Activate VB controls
    XtSetSensitive(_mgr, True);
    break;
    
    default:
    // De-activate VB controls
    XtSetSensitive(_mgr, False);
  }
}
