static char LockIndicator_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/LockIndicator.cc,v 1.1 1996/07/22 10:42:05 oreilly Exp $";


/*
$Log: LockIndicator.cc,v $
Revision 1.1  1996/07/22 10:42:05  oreilly
First external release

*/
#include <unistd.h>
#include <Xm/RowColumn.h>
#include <X11/Xc/Xc.h>
#include <X11/Xc/Control.h>
#include <X11/Xc/Led.h>
#include "LockIndicator.h"
#include "dm_internal.h"
#include "DmErrno.h"

extern "C" 
{
  /* Xc/Led.h has bad prototype for XcLedSetState */
  void XcLedSetState(Widget w, char *colorName, char *str);
};


LockIndicator::LockIndicator(const char *name, Widget parent) 
  : VkComponent(name)
{
  _baseWidget = XtCreateWidget(_name, xmRowColumnWidgetClass, parent, NULL, 0);
  installDestroyHandler();

  Widget mgr = _baseWidget;
  
  _indicatorWidget = 
    XtVaCreateWidget("indicator",
		     xcLedButtonWidgetClass,
		     mgr,
		     XcNledVisible, True,
		     XcNstateVisible, True,
		     NULL);

  // Set initial state
  set(True);   

  XtManageChild(_indicatorWidget);
  XtManageChild(_baseWidget);

}


Boolean LockIndicator::locked(DmObject *dmObject)
{
  Errno err;
  DmItemSts itemStatus;
  char buf[512];
  char errorBuf[512];
  
  for (int i = 0; i < dmObject->arraySize(); i++)
  {
    if ((err = dm_item_status(dmObject->getHandle(i), &itemStatus)) != SUCCESS)
    {
      sprintf(buf, "LockIndicator::locked() - %s[%d]", 
	      dmObject->getName(), i);
      
      sprintDmError(err, buf, errorBuf);
      fprintf(stderr, "%s\n", errorBuf);
    }
    else if (itemStatus.is_prvdr != NO_PID)
    {
      if (itemStatus.is_prvdr_cpu != CPU_LOCAL ||
	  itemStatus.is_prvdr != getpid())
      {
        /* Has a provider, which is not this process */
	dm_item_status_free(&itemStatus);
	return True;  
      }
    }

    dm_item_status_free(&itemStatus);
  }

  return False;
}


Boolean LockIndicator::set(Boolean locked)
{
  if (locked)
  {
    XcLedSetState(_indicatorWidget, lockedColor, lockedString);
  }
  else
  {
    XcLedSetState(_indicatorWidget, unlockedColor, unlockedString);
  }
  return locked;
}
