#include <Xm/Form.h>
#include <Xm/RowColumn.h>
#include <Xm/Label.h>
#include "DetritusSampler.h"


DetritusSamplerValves::DetritusSamplerValves(const char *name, Widget parent,
					     unsigned nValves, 
					     unsigned firstValveNo,
					     const char *dmPrefix)
{
  _baseWidget = XtVaCreateWidget(name, xmRowColumnWidgetClass, parent,
				 XmNorientation, XmHORIZONTAL,
				 NULL);
  
  installDestroyHandler();
  
  _nValves = nValves;
  
  _menu = new VkOptionMenu(_baseWidget, "menu");

  Widget mgr = 
    XtVaCreateWidget("mgr", xmFormWidgetClass, _baseWidget, NULL);
  
  if ((_valveView = (View **)malloc(_nValves * sizeof(View *))) == NULL)
  {
    fprintf(stderr, 
	    "DetritusSamplerValves constructor - "
	    "malloc() of _valveView failed");

    exit(1);
  }

  if ((valve = (ValveControl **)malloc(_nValves * sizeof(ValveControl))) 
      == NULL)
  {
    fprintf(stderr, 
	    "DetritusSamplerValves constructor - "
	    "malloc() of valve failed");

    exit(1);
  }
  
  char itemName[MaxDmNameLen];
  strcpy(itemName, dmPrefix);
  char *namePtr = itemName + strlen(itemName);
  
  Layout *layout = new Layout();

  layout->attachToEdge(Left);
  layout->attachToEdge(Top);
  layout->attachToEdge(Right);
  layout->attachToEdge(Bottom);

  for (int i = 0; i < nValves; i++)
  {
    char valveName[256];
    sprintf(valveName, "valve%d", i + firstValveNo);

    _valveView[i] = new View("view", mgr);

    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(valveName, _valveView[i]->baseWidget(), 
				 itemName, i);

    _valveView[i]->add(valve[i], layout);
    valve[i]->show();

    _valveView[i]->hide();

    _menu->addAction(valveName, &DetritusSamplerValves::callback, this);
  }

  _menu->forceWidth(100);

  XtManageChild(mgr);

  displaySelectedValve();
}


DetritusSamplerValves::~DetritusSamplerValves()
{
  for (int i = 0; i < _nValves; i++)
  {
    delete valve[i];
    delete _valveView[i];
  }
  
  free((void *)valve);
  free((void *)_valveView);
}


void DetritusSamplerValves::displaySelectedValve()
{
  int selected = _menu->getIndex();

  for (int i = 0; i < _nValves; i++)
  {
    if (i == selected)
      _valveView[i]->show();
    else
      _valveView[i]->hide();      
  }
}


void DetritusSamplerValves::callback(Widget w,
				     XtPointer clientData,
				     XtPointer callData)
{
  DetritusSamplerValves *obj = (DetritusSamplerValves *)clientData;
  obj->displaySelectedValve();
}
