static char TextDmGuiProperties_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/TextDmGuiProperties.cc,v 1.3 1997/03/20 12:31:02 oreilly Exp $";


/*
$Log: TextDmGuiProperties.cc,v $
Revision 1.3  1997/03/20 12:31:02  oreilly
..

Revision 1.2  96/07/22  10:42:14  10:42:14  oreilly (Thomas C. O'Reilly)
First external release

*/
#include <stdlib.h>
#include <Xm/Form.h>
#include <Xm/ToggleB.h>
#include "Vk/VkInfoDialog.h"
#include "TextDmGuiProperties.h"
#include "DmErrno.h"



TextDmGuiProperties::TextDmGuiProperties(
				       const char *name, 
				       Widget parent
				      ) : VkComponent(name)
{
  
  _baseWidget = XtCreateWidget(name, xmRowColumnWidgetClass,
				      parent, NULL, 0);

  installDestroyHandler();
  
  _nameLabel = XtVaCreateManagedWidget("name", xmLabelWidgetClass,
					_baseWidget, NULL);

  _type = XtVaCreateManagedWidget("type", xmLabelWidgetClass,
				  _baseWidget, NULL);

  _providerStatus = 
    XtVaCreateManagedWidget("providerStatus", xmLabelWidgetClass,
			    _baseWidget, NULL);

  _consumerStatus = 
    XtVaCreateManagedWidget("consumerStatus", xmLabelWidgetClass,
			    _baseWidget, NULL);

  Widget form = XtVaCreateWidget("form", xmFormWidgetClass, _baseWidget, 
				 NULL);

  Widget provideConsume = XtVaCreateWidget("sampleType", 
					   xmRowColumnWidgetClass, form,
					   XmNorientation, XmHORIZONTAL,
					   XmNleftAttachment, XmATTACH_FORM,
					   XmNtopAttachment, XmATTACH_FORM,
					   NULL);

  _provide = XtVaCreateManagedWidget("provide",
				     xmToggleButtonWidgetClass, 
				     provideConsume,
				     XmNset, False,
				     NULL);

  _consume = XtVaCreateManagedWidget("consume",
				     xmToggleButtonWidgetClass, 
				     provideConsume,
				     XmNset, False,
				     NULL);


  XtAddCallback(_provide, XmNvalueChangedCallback,
		&TextDmGuiProperties::provideConsumeCallback,
		(XtPointer )this);

  XtAddCallback(_consume, XmNvalueChangedCallback,
		&TextDmGuiProperties::provideConsumeCallback,
		(XtPointer )this);
  
  XtManageChild(provideConsume);
  

  _sampleForm = XtVaCreateWidget("sampleForm", xmFormWidgetClass, form, 
				 XmNorientation, XmHORIZONTAL,
				 XmNleftAttachment, XmATTACH_WIDGET,
				 XmNleftWidget, provideConsume,
				 XmNtopAttachment, XmATTACH_FORM,
				 NULL);

  Widget sampleType = XtVaCreateWidget("sampleType", 
				       xmRowColumnWidgetClass, _sampleForm,
				       XmNorientation, XmHORIZONTAL,
				       XmNradioBehavior, True,
				       XmNleftAttachment, XmATTACH_WIDGET,
				       XmNleftWidget, provideConsume,
				       XmNtopAttachment, XmATTACH_FORM,
				       NULL);
  
  _asynch = XtVaCreateManagedWidget("asynch",
				    xmToggleButtonWidgetClass, sampleType,
				    XmNset, False,
				    NULL);
  
  _synch = XtVaCreateManagedWidget("synch",
				   xmToggleButtonWidgetClass, sampleType,
				   XmNset, True,
				   NULL);

  XtAddCallback(_synch, XmNvalueChangedCallback,
		&TextDmGuiProperties::sampleTypeCallback,
		(XtPointer )this);

  XtAddCallback(_asynch, XmNvalueChangedCallback,
		&TextDmGuiProperties::sampleTypeCallback,
		(XtPointer )this);

  XtManageChild(sampleType);

  _synchRate = new LabeledText(_sampleForm, "synchRate", XmHORIZONTAL);
  XtVaSetValues(_synchRate->baseWidget(),
		XmNtopAttachment, XmATTACH_FORM,
		XmNleftAttachment, XmATTACH_WIDGET,
		XmNleftWidget, sampleType,
		NULL);
  

  XtManageChild(_sampleForm);
  XtManageChild(form);

  /* Since consume is set to "off", de-sensitize sampling widgets */
  XtSetSensitive(_sampleForm, False);

  _textDmGui = NULL;
}


TextDmGuiProperties::~TextDmGuiProperties()
{
}


void TextDmGuiProperties::provideConsumeCallback(Widget w, 
						XtPointer clientData,
						XtPointer callData)
{
  TextDmGuiProperties *obj = (TextDmGuiProperties *)clientData;
  if (w == obj->_consume)
  {
    if (((XmToggleButtonCallbackStruct *)callData)->set) 
      XtSetSensitive(obj->_sampleForm, True);
    else
      XtSetSensitive(obj->_sampleForm, False);
  }
  else if (w == obj->_provide)
  {
  }
}



void TextDmGuiProperties::sampleTypeCallback(Widget w, 
					    XtPointer clientData,
					    XtPointer callData)
{
  TextDmGuiProperties *obj = (TextDmGuiProperties *)clientData;
  if (w == obj->_synch)
  {
    if (((XmToggleButtonCallbackStruct *)callData)->set)
      XtSetSensitive(obj->_synchRate->baseWidget(), True);
    else
      XtSetSensitive(obj->_synchRate->baseWidget(), False);
  }
  else if (w == obj->_asynch)
  {
    if (((XmToggleButtonCallbackStruct *)callData)->set)
      /* Asynchronous mode selected; don't need synch rate */
      XtSetSensitive(obj->_synchRate->baseWidget(), False);
  }
}


int TextDmGuiProperties::updateGui()
{
  Errno err;
  DmItemSts itemStatus;
  char buf[512];

  DmObject *dmObject = _textDmGui->getDmObject();
  
  if ((err = dm_item_status(dmObject->getHandle(0), &itemStatus)) != SUCCESS)
  {
    sprintDmError(err, "DmPropertiesWindow::update()", buf);
    theInfoDialog->postAndWait(buf);    
    return -1;
  }
  
  XmString xmstr;
  
  sprintf(buf, "Name: %s[%d]", itemStatus.is_name, itemStatus.is_item_num);
  xmstr = XmStringCreateSimple(buf);
  XtVaSetValues(_nameLabel, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr);

  sprintf(buf, "Data type: ");
  char *ptr = buf + strlen(buf);
  DmObject::sprintDataType(itemStatus.is_type, ptr);
  ptr += strlen(ptr) + 4;
  sprintf(ptr, "size: %d bytes", itemStatus.is_size);
  xmstr = XmStringCreateSimple(buf);
  XtVaSetValues(_type, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr);

  char cpu[100];
  int pid;

  if (itemStatus.is_prvdr_cpu == CPU_LOCAL)
  {
    strcpy(cpu, "Local");
    pid = itemStatus.is_prvdr;
  }
  else 
  {
    sprintf(cpu, "%d", itemStatus.is_prvdr_cpu);
    pid = -1;
  }
  sprintf(buf, "Provider cpu: %s    Provider pid: %d    Provider period: %d", 
	  cpu, pid, itemStatus.is_prvdr_period);

  xmstr = XmStringCreateSimple(buf);
  XtVaSetValues(_providerStatus, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr);

  sprintf(buf, "Consumer rate: %d", itemStatus.is_cnsmr_period);
  xmstr = XmStringCreateSimple(buf);
  XtVaSetValues(_consumerStatus, XmNlabelString, xmstr, NULL);
  XmStringFree(xmstr) ;
 
  if (dmObject->isProvider())
    XtVaSetValues(_provide, XmNset, True, NULL);
  else
    XtVaSetValues(_provide, XmNset, False, NULL);

  if (dmObject->isConsumer())
  {
    XtVaSetValues(_consume, XmNset, True, NULL);
    XtSetSensitive(_sampleForm, True);
  }
  else
  {
    XtVaSetValues(_consume, XmNset, False, NULL);
    XtSetSensitive(_sampleForm, False);
  }

  sprintf(buf, "%d", itemStatus.is_cnsmr_period);
  sprintf(buf, "%d", _textDmGui->getConsumePeriod());
  
  _synchRate->set(buf);
  
  dm_item_status_free(&itemStatus);

  return 0;
}



int TextDmGuiProperties::updateTextDmGui()
{
  MBool debug = TRUE;
  
  if (_textDmGui == NULL)
    return -1;
  
  Boolean error = False;
  char errorMsg[512];
  Errno errno = SUCCESS;
  char errorBuf[512];
  
  if (XmToggleButtonGetState(_provide) && !_textDmGui->provideEnabled())
  {
    if (_textDmGui->startProvide(errorMsg) == -1)
    {
      sprintf(errorBuf, "_textDmGui->startProvide() failed: ");
      error = True;
    }
  }
  else if (!XmToggleButtonGetState(_provide) && _textDmGui->provideEnabled())
  {
    if (_textDmGui->stopProvide(errorMsg) == -1)
    {
      sprintf(errorBuf, "_textDmGui->stopProvide() failed: ");
      error = True;
    }
  }

  if (error)
  {
    strcat(errorBuf, errorMsg);
    theInfoDialog->postAndWait(errorBuf);
    return -1;
  }

  if (XmToggleButtonGetState(_consume))
  {
    char *ptr;
    int millisec;
    
    if (XmToggleButtonGetState(_synch))
    {
      ptr = _synchRate->get();
      millisec = atoi(ptr);
      if (atoi(ptr) <= 0)
      {
	sprintf(errorBuf,
		"\"%s\" - invalid interval; must be positive integer",
		ptr);

	theInfoDialog->postAndWait(errorBuf);
	return -1;
      }
    }
    else
      millisec = Aperiodic;

    _textDmGui->setConsumePeriod(millisec);
    if (_textDmGui->startConsume(errorMsg) == -1)
    {
      sprintf(errorBuf, "_textDmGui->startConsume() failed: ");
      error = TRUE;
    }
  }  
  else if (!XmToggleButtonGetState(_consume) && _textDmGui->consumeEnabled())
  {
    if (_textDmGui->stopConsume(errorMsg) == -1)
    {
      sprintf(errorBuf, "_textDmGui->stopConsume() failed: ");
      error = TRUE;
    }
  }

  if (error)
  {
    strcat(errorBuf, errorMsg);
    theInfoDialog->postAndWait(errorBuf);
    return -1;
  }

  return 0;
}



