#include <xt++/Intrinsic.h>
//#include <xt++/AppContext.h>
//#include <xt++/Core.h>
//#include <xt++/Composite.h>

#include <xt++/Shell.h>
#include <xt++/Xaw/Label.h>
#include <xt++/Xaw/Command.h>
#include <xt++/Xaw/Form.h>
//#include <xt++/Xaw/Dialog.h>
#include <xt++/Xaw/Clock.h>
#include "swatch.h"
//#include "debug.h"
#include <X11/StringDefs.h>
#include <libc.h>
#include <stream.h>

void QuitCB(Core* , XtPointer p, XtPointer)
{
   StopWatch* sw = (StopWatch*)p;
   sw->Stop();
   sw->Save();
   exit(0);
}

void SaveCB(Core*  , XtPointer p, XtPointer)
{
   StopWatch* sw = (StopWatch*)p;
   sw->Save();
}

void StopGoCB(Core* w , XtPointer p, XtPointer)
{
   CommandWidget* cw = (CommandWidget*)w;
   StopWatch* sw = (StopWatch*)p;

//   sw->PrintState("StopGo");

   if(sw->IsRunning() == False){
      sw->Go();
      cw->SetValues(XtNlabel,(XtArgVal)"Stop");
   }
   else{
      sw->Stop();
      cw->SetValues(XtNlabel,(XtArgVal)"Go");
   }
   XBell(w->XtDisplay(),50);
}

main(unsigned int argc, char** argv)
{
   ofstream  f("hours.save",ios::out|ios::app);

   f << "Hours\n";

   ApplicationContext appContext;

//   appContext.AddActions(actions,XtNumber(actions));

   Display *dpy =  appContext.OpenDisplay(NULL, argv[0], "Watch",
                        NULL,0,
                        &argc, argv);

   ApplicationShellWidget *aw = new ApplicationShellWidget( argv[0], "Watch", dpy);

   FormWidget    *form = new FormWidget("form", aw);
   form->Manage();

   StopWatch *sw = new StopWatch(form, f, 60);
   sw->Manage();
//   sw->Open(f);
//   sw->PrintState("main 1");

   ClockWidget *clock = new ClockWidget("clock", form);
   clock->Manage();
	
   CommandWidget *quit = new CommandWidget("quit", form);
   quit->AddCallback(XtNcallback, QuitCB, (XtPointer)sw);
   quit->Manage();

   CommandWidget *stopgo = new CommandWidget("stopgo", form);
   stopgo->AddCallback(XtNcallback, StopGoCB, (XtPointer)sw);
   stopgo->Manage();

   CommandWidget *save = new CommandWidget("save", form);
   save->AddCallback(XtNcallback, SaveCB, (XtPointer)sw);
   save->Manage();

   aw->Realize();

   sw->Stop();
//   sw->PrintState("main 2");
   appContext.MainLoop();

}

								     
