#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include "ValveSelector.h"
#include "ersDcon.h"

ValveSelector::ValveSelector(const char *name, Widget parent,
			     unsigned nValves, 
			     unsigned firstValveNo,
			     const char *dmPrefix, 
			     Boolean hasEnable)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent,
				 XmNorientation, XmHORIZONTAL,
				 NULL);
  
  installDestroyHandler();
  
  _nValves = nValves;
  
  if ((_valveView = (View **)malloc(_nValves * sizeof(View *))) == NULL)
  {
    fprintf(stderr, 
	    "ValveSelector constructor - "
	    "malloc() of _valveView failed");

    exit(1);
  }

  if ((valve = (ValveControl **)malloc(_nValves * sizeof(ValveControl))) 
      == NULL)
  {
    fprintf(stderr, 
	    "ValveSelector constructor - "
	    "malloc() of valve failed");

    exit(1);
  }

  char itemName[MaxDmNameLen];
  strcpy(itemName, dmPrefix);
  char *namePtr = itemName + strlen(itemName);

  Widget valveParent;
  Widget valveMgr;

  if (hasEnable) {
    valveParent = 
      XtVaCreateWidget("valveParent", xmRowColumnWidgetClass, _baseWidget,
		       XmNorientation, XmHORIZONTAL, NULL);

    strcpy(namePtr, VALVE_PACK_ENABLE_SWITCH_DM);
    DmBooleanObject *dmEnable = new DmBooleanObject(itemName);
    _enable = new DmBooleanSwitch("enable", valveParent, dmEnable);
    _enable->show();
  }
  else
    valveParent = _baseWidget;

  _menu = new VkOptionMenu(valveParent, "menu");

  valveMgr = 
    XtVaCreateWidget("valveMgr", xmFormWidgetClass, valveParent, NULL);
    
  Layout *layout = new Layout();

  layout->attachToEdge(Left);
  layout->attachToEdge(Top);
  layout->attachToEdge(Right);
  layout->attachToEdge(Bottom);

  for (int i = 0; i < nValves; i++)
  {
    char vName[256];
    valveName(i + firstValveNo, vName);

    _valveView[i] = new View("view", valveMgr);

    XtVaSetValues(_valveView[i]->baseWidget(),
		  XmNleftAttachment, XmATTACH_FORM,
		  XmNtopAttachment, XmATTACH_FORM,
		  XmNrightAttachment, XmATTACH_FORM,
		  XmNbottomAttachment, XmATTACH_FORM,
		  NULL);
    
    sprintf(namePtr, "VALVE_%d", i + firstValveNo);
    valve[i] = new ValveControl(vName, _valveView[i]->baseWidget(), 
				 itemName, i);

    _valveView[i]->add(valve[i], layout);
    valve[i]->show();

    _valveView[i]->hide();

    _menu->addAction(vName, &ValveSelector::callback, this);
  }

  _menu->forceWidth(100);

  XtManageChild(valveMgr);

  if (valveParent != _baseWidget)
    XtManageChild(valveParent);

  displaySelectedValve();
}


ValveSelector::~ValveSelector()
{
  for (int i = 0; i < _nValves; i++)
  {
    delete valve[i];
    delete _valveView[i];
  }
  
  free((void *)valve);
  free((void *)_valveView);
}


int ValveSelector::disableValve(int valveNo)
{
  if (valveNo < 0 || valveNo >= _nValves)
    return -1;

  _menu->deactivateItem(valve[valveNo]->name());
  return 0;
}


int ValveSelector::enableValve(int valveNo)
{
  if (valveNo < 0 || valveNo >= _nValves)
    return -1;

  _menu->activateItem(valve[valveNo]->name());
  return 0;
}


void ValveSelector::displaySelectedValve()
{
  int selected = _menu->getIndex();

  for (int i = 0; i < _nValves; i++)
  {
    if (i != selected)
      _valveView[i]->hide();      
  }

  _valveView[selected]->show();
}


void ValveSelector::callback(Widget w,
			     XtPointer clientData,
			     XtPointer callData)
{
  ValveSelector *obj = (ValveSelector *)clientData;
  obj->displaySelectedValve();
}



void ValveSelector::valveName(int valveNo, char *vName)
{
  sprintf(vName, "valve%d", valveNo);
}
