// This may look like C code, but it is really -*- C++ -*-

#include "Factory.h"
#include "Widget.h"
#include "World.h"

extern WidgetFactory Factory;

World::World(char* name, char* className, AWidgetClass& wc, System& sys)
: AWidget(wc)
{
   if(&wc == 0){
      Error("Cannot create main window\n",0);
      Exit(1);
   }
   
   widget = XtAppCreateShell(name,className,
			     wc.Class(),
			     sys.dpy, NULL, 0);
}


World::World(char* name, AWidgetClass& wc, AWidget& parent)
: AWidget(wc)
{
   if(&wc == 0){
      Error("Cannot create popup shell: %s\n",name);
      Exit(1);
   }
   
   widget = XtCreatePopupShell(name, wc.Class(), parent.Widget(), NULL, 0);
}


World* System::Initialize(int argc, char** argv)
{
   XtToolkitInitialize();

   appContext = XtCreateApplicationContext();

   dpy =  XtOpenDisplay(appContext, NULL, argv[0], systemName,
			NULL,0,
			&argc, argv);

   world = new World(argv[0],systemName,
		      Factory.RetrieveClass("shell"), 
		      *this);
   return world;
}

void System::Realize()
{
   world->Realize();
}

void System::Start()
{
   while(1){
      XEvent ev;
      XtAppNextEvent(appContext,&ev);
      XtDispatchEvent(&ev);
   }
}

