
static char ConfigurationDisplay_id[] = "$Header: /usr/tiburon/unix/gui/tmacs/RCS/ConfigurationDisplay.cc,v 1.3 1997/10/03 09:28:42 oreilly Exp $";

/*
$Log: ConfigurationDisplay.cc,v $
Revision 1.3  1997/10/03 09:28:42  oreilly
*** empty log message ***

Revision 1.2  97/09/10  08:46:50  08:46:50  oreilly (Thomas C. O'Reilly)
*** empty log message ***

Revision 1.1  96/10/28  09:11:53  09:11:53  oreilly (Thomas C. O'Reilly)
Initial revision

*/
#include "ConfigurationDisplay.h"
#include "TiburonApp.h"

VkMenuDesc ConfigurationDisplay::_menuPane[] = 
{
  { ACTION, "Quit", &ConfigurationDisplay::quitCallback },
  { END }
};   
    
  
ConfigurationDisplay::ConfigurationDisplay(const char *name) :
  VkWindow(name)
{
  VehicleConfiguration *config = 
    ((TiburonApp *)theApplication)->vehicleConfig;

  _graph = new VkGraph("graph", mainWindowWidget());
  
  // Create nodes and add to graph
  createNodes(config->vehicleBase, NULL, 0);

  _graph->displayAll();
  _graph->doLayout();

  addView(_graph);

  addMenuPane("Cmds", _menuPane);
}


ConfigurationDisplay::~ConfigurationDisplay()
{
  VkNode *node;
  for (int i = 0; i < _nodes.size(); i++)
  {
    _nodes.get(i, &node);
    delete node;
  }
}


void ConfigurationDisplay::quitCallback(Widget w, 
					XtPointer clientData,
					XtPointer callData)
{
  delete (ConfigurationDisplay *)clientData;
}


void ConfigurationDisplay::createNodes(VehicleComponent *component, 
				       VkNode *parentNode, int index)
{
  char nodeName[50];
  char nodeLabel[50];
  if (!parentNode)
  {
    sprintf(nodeName, "node%04d", ++index);
    sprintf(nodeLabel, "%s\n%s", 
	    component->className(), component->name());

    parentNode = new VkNode(nodeName, nodeLabel);
    _graph->add(parentNode);
  }
  
  VehicleComponent **child;

  SListIter <VehicleComponent *> children(component->childList);
  
  children.reset();
  while (child = children.next())
  {
    sprintf(nodeName, "node%04d", ++index);
    sprintf(nodeLabel, "%s\n%s", 
	    (*child)->className(), (*child)->name());
    
    VkNode *childNode = new VkNode(nodeName, nodeLabel);
    _nodes.add(&childNode);

    _graph->add(parentNode, childNode);

    createNodes(*child, childNode, ++index); 
  }
}



